initial commit
This commit is contained in:
1
zfs_smart_snapshot/__init__.py
Normal file
1
zfs_smart_snapshot/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
65
zfs_smart_snapshot/main.py
Normal file
65
zfs_smart_snapshot/main.py
Normal file
@@ -0,0 +1,65 @@
|
||||
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!")
|
||||
Reference in New Issue
Block a user