78 lines
1.8 KiB
Python
78 lines
1.8 KiB
Python
# -*- 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('${DEST}/volumes', 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)
|