snippets/zfs-cleanup

72 lines
1.8 KiB
Plaintext
Raw Normal View History

2020-09-28 16:15:43 +02:00
#!/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)