Files
zfs-smart-snapshot/zfs_smart_snapshot/main.py
2021-09-29 00:09:57 +02:00

66 lines
1.9 KiB
Python

from datetime import datetime
from dateutil.relativedelta import relativedelta
def keep_date(now, snapshots, date_convert, delta, count):
keep = set()
if count < 1:
return keep
start_date = date_convert(now) - delta*(count-1)
for snapshot in snapshots:
if snapshot.date() >= start_date:
keep.add(snapshot)
start_date = date_convert(snapshot) + delta
if start_date > now.date():
break
return keep
def keep_year(now, snapshots, count):
return keep_date(now, snapshots, lambda d: d.date().replace(day=1, month=1), relativedelta(years=1), count)
def keep_month(now, snapshots, count):
return keep_date(now, snapshots, lambda d: d.date().replace(day=1), relativedelta(months=1), count)
def keep_day(now, snapshots, count):
return keep_date(now, snapshots, lambda d: d.date(), relativedelta(days=1), count)
def keep_time(now, snapshots, convert, delta, count):
keep = set()
if count < 1:
return keep
start = convert(now) - delta*(count-1)
for snapshot in snapshots:
if snapshot >= start:
keep.add(snapshot)
start = convert(snapshot) + delta
if start > now:
break
return keep
def keep_hour(now, snapshots, count):
return keep_time(now, snapshots, lambda d: d.replace(minute=0, second=0, microsecond=0), relativedelta(hours=1),
count)
def keep_frequent(now, snapshots, count):
return keep_time(now, snapshots, lambda d: d.replace(minute=d.minute//15*15, second=0, microsecond=0),
relativedelta(minutes=15), count)
def snapshots_to_keep(now, snapshots, yearly=0, monthly=0, weekly=0, daily=0, hourly=0, frequently=0):
snapshots.sort()
keep = set()
keep.union(keep_year(now, snapshots, yearly))
keep.union(keep_month(now, snapshots, monthly))
keep.union(keep_day(now, snapshots, daily))
return keep
def main():
print("Hello, world!")