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)
 |