python 简单实现日志文件打包并推送至七牛存储

目标: 
1.实现将目标文件拷贝备份到其他目录并重新命名为日期+.back格式
2.清空源文件的内容
2.并对n天前的备份.back文件进行打包为tgz包
3.删除备份的.back文件,
4.推送tgz压缩文件到七牛存储。
5.删除本地tgz包

测试


推送文件至七牛

备份脚本
[root@iZm5e9x1jjza2nspm04niyZ tmp]# cat back_file.py 
[root@iZm5e9x1jjza2nspm04niyZ scripts]# cat back_file.py 
# -*- coding: utf-8 -*-
import shutil
from datetime import datetime as dt
import datetime
import sys
import argparse
import os


class f_backup:
    def __init__(self,sdir,bdir,sfile,rday,bday):
        self.sdir = sdir
        self.bdir = bdir
        self.sfile = sfile
        self.bday = bday
        self.rday = rday
    @staticmethod
    def mkdirpdir(sdir,bdir):
        if not os.path.isdir(bdir):
            os.makedirs(bdir)
        if not os.path.isdir(sdir):
            print('备份文件目录不存在请重新指定')
            sys.exit(1)
    def cpbackfile(self):
        for i in self.sfile:
            checkdir=self.mkdirpdir(self.sdir,self.bdir)
            self.localfile = self.sdir + i
            self.backfile = self.bdir + i +'.'+self.rday+'.back'
            shutil.copyfile(self.localfile,self.backfile)
            if os.path.isfile(self.backfile):
                print('copyfile-成功')
                #清空文件
                clearfile = open(self.localfile,'w').close()
                print('目标文件已清空')
            else:
                print('copyfile-失败')
                sys.exit(1)
    def tarfile(self):
        os.chdir(self.bdir)
        for i in [ h for h in os.listdir('./') if h.endswith('.back')]:
            aday=i.split('.')[2]#获取文件日期
            #如果是三天前的文件那么就打包.
            if dt.strptime(aday,"%Y-%m-%d") < dt.strptime(self.bday,"%Y-%m-%d"):
                tarf = i + '.tgz'
                cmd = 'tar -czvf %s %s'%(tarf,i)
                if os.system(cmd) == 0:
                    print('%s打包成功'%(i))
                    os.remove(i)
                else:
                   print('%s打包失败'%(i))
                   sys.exit(1)
def main():
    #python file_tar_back.py -SF ./ -BD ./test/ -BF 1.txt 2.txt 3.txt -TD 3
    print('|-----------------------------------------------------------------------------------------------')
    print('|Usage:python back_file.py -SF ./aaa/ -BD ./bbb/ -BF wyl-1.txt wyl-2.txt  -TD 10')
    parser = argparse.ArgumentParser()
    parser.add_argument('-SF','--sdir',type=str,default='NULL',help='目标目录')
    parser.add_argument('-BD','--bdir',type=str,default='NULL',help='备份目录')
    parser.add_argument('-BF','--plugins',type=str,nargs='+',help='目标文件',default=['access.log'])
    parser.add_argument('-TD','--ntday',type=str,help='对ntday天前的备份文件进行打包',default='3')
    args=parser.parse_args()
    print('|Target_dir:[%s],backupdir:[%s],backupfile:%s,days[%s]'%(args.sdir,args.bdir,args.plugins,args.ntday))
    print('|-----------------------------------------------------------------------------------------------')
    ##########################################################################
    # 获取想要的日期的时间,即前1天和3天时间
    today = datetime.datetime.now()
    # 计算偏移量,前1天和三天前
    offset = datetime.timedelta(days=-1)
    offsets = datetime.timedelta(days=-int(args.ntday))
    # 获取想要的日期的时间,即前1天和3天时间
    re_date = (today + offset)
    re_datas = (today + offsets)
    #当前时间前1天3天
    tday=today.strftime('%Y-%m-%d')#当天
    rday=re_date.strftime('%Y-%m-%d')#1天前
    bday = re_datas.strftime('%Y-%m-%d')#三天前
    #######################################################################
    A = f_backup(args.sdir,args.bdir,args.plugins,rday,bday)
    A.cpbackfile()
    A.tarfile()

if __name__ == "__main__":
    main()

推送脚本 push_file.py 

[root@iZm5e9x1jjza2nspm04niyZ scripts]# cat push_file.py 
# -*- coding: utf-8 -*-
# flake8: noqa
#使用前先:
#pip uninstall urllib3
#pip uninstall chardet
#pip install requests
#pip install qiniu
#pip install requests

from qiniu import Auth, put_file, etag
import qiniu.config
import os
import argparse

class update_file:
    def __init__(self,bucket_name,localfile,key):
        #需要填写你的 Access Key 和 Secret Key
        self.access_key = 'xxxxxxxx'
        self.secret_key = 'yyyyyyyy'
        #要上传的空间
        self.bucket_name = bucket_name
        #上传后保存的文件名key
        self.key = key
        #要上传文件的本地路径localfile
        self.localfile = localfile
    def upfile(self):#构建鉴权对象
        q = Auth(self.access_key, self.secret_key)
        #生成上传 Token,可以指定过期时间等,policy指定上传策略
        token = q.upload_token(self.bucket_name, self.key,7200)
        ret, info = put_file(token, self.key, self.localfile)
        #print('ret',ret)
        #print('info',info)
        assert ret['key'] == self.key
        assert ret['hash'] == etag(self.localfile)
        info = str(str(info).split(',')[2]).split(':')[1]
        return info
def main():
    #python push_file.py -B mint-jizhiyunwei -L 网安.rar -K test/网安.rar
    print('|--------------------------------------------------------------------------------------------')
    print('|usage1:推送单文件:python push_file.py -B mint-jizhiyunwei -L 网安.rar -K test/网安.rar')
    print('|usage2:推送目录:python push_file.py -B mint-jizhiyunwei -L /server/scripts/ -K test/ -E .txt')
    parser = argparse.ArgumentParser()
    parser.add_argument('-B','--bucket_name',type=str,default='NULL',help='存储桶名称')
    parser.add_argument('-L','--localfile',type=str,default='NULL',help='本地文件路径名称')
    parser.add_argument('-K','--key',type=str,default='NULL',help='上传后保存的文件路径名称')
    parser.add_argument('-E','--endswith',type=str,default='NULL',help='以什么结尾')
    args = parser.parse_args()

    if 'NULL' in (args.bucket_name,args.localfile,args.key,):
        print('缺少必要参数请查看帮助:python file.py --help')
    else:
        if os.path.isdir(args.localfile):
            print('|您选用的存储桶:%s,准备上传的文件路径为:%s,上传后的文件路径为:%s,上传文件的后缀为:%s'%(args.bucket_name,args.localfile,args.key,args.endswith))
            print('|--------------------------------------------------------------------------------------------')
            if 'NULL' != args.endswith:
                listlocalfile = [ i for i in os.listdir(args.localfile) if i.endswith(args.endswith)]
                listkey = [ args.key + i for i in listlocalfile ]
                dictpush = dict(zip(listlocalfile,listkey))
                for lfile in dictpush:

                    LBG = update_file(args.bucket_name,args.localfile+lfile,dictpush[lfile])
                    LDG = LBG.upfile()
                    print(LDG)
                    os.remove(args.localfile+lfile)
            else:
                print('当上传资源为路径时,-E(--endswith)不能为空!')
                return ""
        elif os.path.isfile(args.localfile):
            print('您选用的存储桶:%s,准备上传的文件:%s,上传后的文件名:%s'%(args.bucket_name,args.localfile,args.key))
            try:
                BG = update_file(args.bucket_name,args.localfile,args.key)
                DG = BG.upfile()
                os.remove()
            except BaseException as f:
                print('上传失败\n%s'%(f))
                return ""
        else:
            print('上传文件不存在')
            return ""
if __name__ == "__main__":
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章