Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- import datetime
- import glob
- import logging
- import os
- import shutil
- import sys
- def datefrompath(path):
- name = os.path.basename(path)
- year = int(name[0:4])
- month = int(name[4:6])
- day = int(name[6:8])
- hour = int(name[9:11])
- minute = int(name[11:13])
- second = int(name[13:15])
- return datetime.datetime(year, month, day, hour, minute, second)
- def keep(folder):
- logging.info('keep %s', folder)
- def pruneerror(function, path, excinfo):
- logging.error('unable to prune %s', path)
- def prune(folder):
- logging.info('prune %s', folder)
- shutil.rmtree(folder, False, pruneerror)
- # keep oldest backup per interval from now through period back in time
- def prunefolders(folders, now, interval, period):
- then = now - period;
- maybeprune = []
- while now > then:
- now -= interval
- while folders:
- folder = folders.pop()
- folderdate = datefrompath(folder)
- if folderdate > now:
- maybeprune.append(folder)
- else:
- folders.append(folder)
- break;
- if maybeprune:
- keep(maybeprune.pop())
- while maybeprune:
- prune(maybeprune.pop())
- repository = os.path.abspath(sys.argv[1])
- logging.basicConfig(
- filename = os.path.join(repository, 'prune.log'),
- format = '%(asctime)s:%(levelname)s: %(message)s',
- level = logging.INFO
- )
- logging.info('pruning %s', repository)
- folders = glob.glob(os.path.join(repository, '20*'))
- folders.sort()
- oneday = datetime.timedelta(days = 1)
- oneweek = datetime.timedelta(weeks = 1)
- onemonth = datetime.timedelta(weeks = 4)
- oneyear = datetime.timedelta(weeks = 52)
- now = datetime.datetime.now()
- then = now - oneday
- # keep all backups for last 24 hours
- logging.info('hourly')
- while folders:
- folder = folders.pop()
- folderdate = datefrompath(folder)
- if folderdate > then:
- keep(folder)
- else:
- folders.append(folder)
- break
- midnight = datetime.datetime(now.year, now.month, now.day)
- # keep oldest backup daily for one month
- logging.info('daily')
- prunefolders(folders, midnight, oneday, onemonth)
- # keep oldest backup weekly for one year
- logging.info('weekly')
- prunefolders(folders, midnight, oneweek, oneyear)
- # discard all backups older than one year
- logging.info('yearly')
- while folders:
- prune(folders.pop())
- logging.shutdown()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement