diff --git a/zfs-cleanup b/zfs-cleanup new file mode 100755 index 0000000..3e320e7 --- /dev/null +++ b/zfs-cleanup @@ -0,0 +1,71 @@ +#!/usr/bin/python + +import os +from datetime import timedelta,datetime +import dateutil.parser as dparser + +class Filter: + def __init__(self, in_str, delta): + self.in_str = in_str + self.delta = delta + + def filter(self, snapshots): + return filter(self._filter, snapshots) + + def _filter(self, s): + if self.in_str in s: + ds = dparser.parse(s.replace("mx01","mxXX").replace("G0","go"), fuzzy=True) + return (datetime.now()+self.delta) > ds + return True + +def filter_order(snapshots, word_list = ["hourly", "daily", "weekly", "monthly"]): + ds = "" + ds_pos = 0 + snapshots_ret = [] + snapshots.reverse() + for a in snapshots: + ds_a = a.split("@")[0] + if ds != ds_a: + ds = ds_a + ds_pos = 0 + for idx,item in enumerate(word_list): + if item in a: + if ds_pos <= idx: + ds_pos = idx + else: + snapshots_ret.append(a) + break; + snapshots_ret.reverse() + return snapshots_ret + +def zfs_destroy(name): + cmd = f"zfs destroy {name}" + print(cmd) + stream = os.popen(cmd) + print(stream.read()) + +snapshots = [] + +try: + with open("zfs-snaphosts.txt", "r") as f: + snapshots = [l.strip() for l in f.readlines()] +except IOError: + print("read live") + stream = os.popen('zfs list -r -t snapshot -o name') + snapshots = stream.read().split()[1:] + +for a in filter_order(snapshots): + zfs_destroy(a) + +f = Filter("hourly", timedelta(hours=-25)) +snapshots = list(f.filter(snapshots)) + +f = Filter("daily", timedelta(days=-8)) +snapshots = list(f.filter(snapshots)) + +f = Filter("weekly", timedelta(weeks=-5)) +snapshots = list(f.filter(snapshots)) + + +for a in filter(lambda s: "znap" in s and not "monthly" in s, snapshots): + zfs_destroy(a)