需要支持完全和增量备份 周一执行完全备份 其他时间执行增量备份 备份文件需要打包为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)