编写backup.py脚本,实现以下目标:
1、需要支持完全和增量备份 2、周一执行完全备份 3、其他时间执行增量备份 4、备份文件需要打包为tar文件并使用gzip格式压缩
import os import tarfile import hashlib import pickle from time import strftime
def check_md5(fname): m = hashlib.md5() with open(fname, ‘rb’) as fobj: while 1: data = fobj.read(4096) if not data: break m.update(data) return m.hexdigest()
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包 tar = tarfile.open(fname, 'w:gz') tar.add(src) tar.close() # 计算每个文件的md5值 md5dict = {} for path, folders, files in os.walk(src): for file in files: key = os.path.join(path, file) md5dict[key] = check_md5(key) # 保存md5字典到文件 with open(md5file, 'wb') as fobj: pickle.dump(md5dict, fobj)def incr_backup(src, dst, md5file): “增量备份” # 拼接出备份文件名 fname = ‘%s_incr_%s.tar.gz’ % (os.path.basename(src), strftime(’%Y%m%d’)) fname = os.path.join(dst, fname)
# 计算每个文件的md5值 md5dict = {} for path, folders, files in os.walk(src): for file in files: key = os.path.join(path, file) md5dict[key] = check_md5(key) # 取出前一天的md5值 with open(md5file, 'rb') as fobj: old_md5 = pickle.load(fobj) # 找出新增文件和改动的文件,备份 tar = tarfile.open(fname, 'w:gz') for key in md5dict: # if key not in old_md5 or md5dict[key] != old_md5[key]: if old_md5.get(key) != md5dict[key]: tar.add(key) tar.close() # 更新md5文件 with open(md5file, 'wb') as fobj: pickle.dump(md5dict, fobj)if name == ‘main’: src = ‘/tmp/demo/security’ dst = ‘/tmp/demo/backup’ md5file = ‘/tmp/demo/backup/md5.data’ if strftime(’%a’) == ‘Mon’: full_backup(src, dst, md5file) else: incr_backup(src, dst, md5file)