#!/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)