72 lines
1.8 KiB
Python
Executable File
72 lines
1.8 KiB
Python
Executable File
#!/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)
|