Skip to main content

Grandfather-father-son backup rotation calculator

Project description

GrandFatherSon is a backup rotation calculator that implements the grandfather-father-son rotation scheme.

This is usually done by keeping a certain number of daily, weekly, and monthly backups. Older backups should be removed to reduce the amount of space used.

Usage

This module expects either datetime.date or datetime.datetime objects as inputs. As an example, let’s assume you have daily backups for the all of year 1999 that need rotating:

>>> 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 xrange((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)]

Let’s say that full backups are taken every Saturday, with incremental backups done daily. A week, or 7 days, of incremental backups should be kept. A months, or 4 weeks, of full backups are kept. In addition, for three months, the first full backup is kept for each month, with the others discarded.

It’s the last day of the year and you want to figure out which backups need to be pruned:

>>> now = datetime.date(1999, 12, 31)

To see which files will be preserved, use the dates_to_keep function:

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

If you leave off the now argument, it will default to using datetime.datetime.now().

To see which files should be deleted, use the dates_to_delete function:

>>> from grandfatherson import dates_to_keep, 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)]

Finally, if you need to rotate backups that have timestamps in datetime format, you can use the corresponding to_keep and to_delete functions:

>>> 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 xrange((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)]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

GrandFatherSon-1.0.tar.gz (7.9 kB view details)

Uploaded Source

File details

Details for the file GrandFatherSon-1.0.tar.gz.

File metadata

File hashes

Hashes for GrandFatherSon-1.0.tar.gz
Algorithm Hash digest
SHA256 2d8ebd58bb507f23e0e82ddc9379fc1cbc1cac330d6088b3dd793b8135f353b5
MD5 a8d2ab83bc11caf8ea64c908e05c3883
BLAKE2b-256 b365930fb5bfe82b990131913ffd6063842db671565830104c7b96fee605d5a3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page