# -*- coding: utf-8 -*- from zipfile import ZipFile, ZIP_DEFLATED from datetime import datetime from os import walk, unlink from os.path import join as osjoin from os.path import isfile from glob import glob # Backup plan for Docker volumes # :::::::::::::::::::::::::::::: # # Keep : # # - all saves the last week # - one save per week the last month # - one save per month the last year # Volumes Backup # ============== dt = datetime.now() zipname = '{0}.zip'.format(dt.strftime('%Y-%m-%d_%Hh%Mm%Ss')) zippath = '${DEST}' + zipname # Zip files def zipdir(path, ziph): # ziph is zipfile handle for root, dirs, files in walk(path): for file in files: pfile = osjoin(root, file) if isfile(pfile): ziph.write(pfile) f = ZipFile(zippath, 'w', ZIP_DEFLATED, allowZip64=True) zipdir('${SOURCE}', f) f.close() # Filter all obsolete save files # ============================== def notkeep(fname): fname = fname.split('/')[-1] ds = fname.split('_') if len(ds) <= 1: return False ds = ds[0] d = datetime.strptime(ds, '%Y-%m-%d') delta = dt - d if delta.days > 365: return True elif delta.days > 31: # if (delta.days %% 30) != 0: if (d.day != 1): return True elif delta.days > 7: # if (delta.days %% 7) != 0: if (d.weekday() != 0) and (d.day != 1): return True else: return False # Filters zip files and keeps only legitimate ones # ================================================ files = glob('${DEST}/*.zip') backups_to_remove = filter(notkeep, files) if len(backups_to_remove) > 0: print('Save files outdated, will be deleted : \n\n* ' + '\n* '.join(backups_to_remove)) for b in backups_to_remove: unlink(b)