祖父父子后备轮换计算器
GrandFatherSon的Python项目详细描述
grandfatherson是一个备用的旋转计算器,它实现了 grandfather-father-son rotation scheme。
这通常是通过每天、每周和 每月备份。应删除较旧的备份以减少 占用的空间。
用法
此模块需要datetime.date或datetime.datetime 对象作为输入。例如,假设您有每日备份 1999年全年需要轮换:
>>> import datetime >>> start_date = datetime.date(1999, 1, 1) >>> end_date = datetime.date(1999, 12, 31) >>> backups = [start_date + datetime.timedelta(days=i) ... for i in range((end_date - start_date).days + 1)] >>> backups [datetime.date(1999, 1, 1), datetime.date(1999, 1, 2), datetime.date(1999, 1, 3), ... datetime.date(1999, 12, 30), datetime.date(1999, 12, 31)]
假设每周六进行完整备份,增量备份 每天备份。一周或7天的增量备份应该 被保留。保留一个月或4周的完整备份。此外, 在三个月内,每个月都会保留第一次完整备份, 其他的被丢弃了。
这是一年中的最后一天,你想知道哪些备份 需要修剪:
>>> now = datetime.date(1999, 12, 31)
要查看将保留哪些文件,请使用dates_to_keep 功能:
>>> from grandfatherson import dates_to_keep, SATURDAY >>> sorted(dates_to_keep(backups, days=7, weeks=4, months=3, ... firstweekday=SATURDAY, now=now)) [datetime.date(1999, 10, 1), datetime.date(1999, 11, 1), datetime.date(1999, 12, 1), datetime.date(1999, 12, 4), datetime.date(1999, 12, 11), datetime.date(1999, 12, 18), datetime.date(1999, 12, 25), datetime.date(1999, 12, 26), datetime.date(1999, 12, 27), datetime.date(1999, 12, 28), datetime.date(1999, 12, 29), datetime.date(1999, 12, 30), datetime.date(1999, 12, 31)]
如果不使用now参数,则默认使用 datetime.datetime.now()。
要查看应删除哪些文件,请使用dates_to_delete 功能:
>>> from grandfatherson import dates_to_delete, SATURDAY >>> sorted(dates_to_delete(backups, days=7, weeks=4, months=3, ... firstweekday=SATURDAY, now=now)) [datetime.date(1999, 1, 1), ... datetime.date(1999, 9, 30), datetime.date(1999, 10, 2), ... datetime.date(1999, 10, 31), datetime.date(1999, 11, 2), ... datetime.date(1999, 11, 30), datetime.date(1999, 12, 2), datetime.date(1999, 12, 3), datetime.date(1999, 12, 5), ... datetime.date(1999, 12, 10), datetime.date(1999, 12, 12), ... datetime.date(1999, 12, 17), datetime.date(1999, 12, 19), ... datetime.date(1999, 12, 24)]
最后,如果需要旋转时间戳在 datetime格式,您可以使用相应的to_keep和 to_delete函数:
>>> now = datetime.datetime(1999, 12, 31, 23, 59, 59) >>> start_datetime = datetime.datetime(1999, 12, 31, 0, 0, 0) >>> end_datetime = datetime.datetime(1999, 12, 31, 23, 59, 59) >>> backups = [start_datetime + datetime.timedelta(seconds=i) ... for i ... in range((end_datetime - start_datetime).seconds + 1)] >>> backups [datetime.datetime(1999, 12, 31, 0, 0), datetime.datetime(1999, 12, 31, 0, 0, 1), datetime.datetime(1999, 12, 31, 0, 0, 2), ... datetime.datetime(1999, 12, 31, 23, 59, 58), datetime.datetime(1999, 12, 31, 23, 59, 59)] >>> from grandfatherson import to_keep >>> sorted(to_keep(backups, hours=2, minutes=10, seconds=10, now=now)) [datetime.datetime(1999, 12, 31, 22, 0), datetime.datetime(1999, 12, 31, 23, 0), datetime.datetime(1999, 12, 31, 23, 50), ... datetime.datetime(1999, 12, 31, 23, 59), datetime.datetime(1999, 12, 31, 23, 59, 50), ... datetime.datetime(1999, 12, 31, 23, 59, 59)] >>> from grandfatherson import to_delete >>> sorted(to_delete(backups, hours=2, minutes=10, seconds=10, now=now)) [datetime.datetime(1999, 12, 31, 0, 0), ... datetime.datetime(1999, 12, 31, 21, 59, 59), datetime.datetime(1999, 12, 31, 22, 0, 1), ... datetime.datetime(1999, 12, 31, 22, 59, 59), datetime.datetime(1999, 12, 31, 23, 0, 1), ... datetime.datetime(1999, 12, 31, 23, 49, 59), datetime.datetime(1999, 12, 31, 23, 50, 1), ... datetime.datetime(1999, 12, 31, 23, 58, 59), datetime.datetime(1999, 12, 31, 23, 59, 1), ... datetime.datetime(1999, 12, 31, 23, 59, 49)]