- 需要支持完全和增量备份
- 周一执行完全备份
- 其他时间执行增量备份
- 备份文件需要打包为tar文件并使用gzip格式压缩
from time import strftime
import os,tarfile,hashlib,pickle
def file_md5(path):
if not path:
return ''
m = hashlib.md5()
with open(path, 'rb') as fobj:
while True:
data = fobj.read(4096)
if len(data) == 0:
break
m.update(data)
hexStr = m.hexdigest()
return hexStr
def full_backup(src,dst,md5file):
fname = '%s_full_%s.tar.gz' %(os.path.basename(src),strftime('%y%m%d'))
fname = os.path.join(dst,fname)
tar = tarfile.open(fname,'w:gz')
tar.add(src)
tar.close()
md5_dict = {}
for path,folders,files in os.walk(src):
for file in files:
file_name = os.path.join(path,file)
file_md5_str = file_md5(file_name)
md5_dict[file_name] = file_md5_str
with open(md5file,'wb') as fobj:
pickle.dump(md5_dict,fobj)
def incr_backup(src,dst,md5file):
fname = '%s_scr_%s.tar.gz' %(os.path.basename(src),strftime('%y%m%d'))
fname = os.path.join(dst, fname)
md5_dict = {}
original_dict = {}
with open(md5file,'rb') as fobj:
original_dict = dict(pickle.load(fobj))
change_files = []
for path,folders,files in os.walk(src):
for file in files:
file_name = os.path.join(path,file)
file_md5_str = file_md5(file_name)
if original_dict.get(file_name) != file_md5_str:
original_dict[file_name] = file_md5_str
change_files.append(file_name)
if change_files:
with open(md5file,'wb') as mobj:
pickle.dump(original_dict,mobj)
tar = tarfile.open(fname, 'w:gz')
for i in change_files:
tar.add(i)
tar.close()
if __name__ == '__main__':
src = '/my/tarDemo/security'
dst = '/my/backup'
md5file = '/my/backup/md5.data'
if strftime('%a') == 'Mon':
full_backup(src,dst,md5file)
else:
incr_backup(src,dst,md5file)