宝塔Linux面板网站备份工具---核心备份代码分享

#!/usr/bin/python
#coding: utf-8
#-----------------------------

宝塔Linux面板网站备份工具

#-----------------------------

import sys,os
os.chdir(‘/www/server/panel’)
sys.path.insert(0,“class/”)
if sys.version_info[0] == 2:
reload(sys)
sys.setdefaultencoding(‘utf-8’)
import public,db,time

class backupTools:
__exclude = “”

def __init__(self):
    self.get_exclode()

def backupSite(self,name,count):
    sql = db.Sql()
    path = sql.table('sites').where('name=?',(name,)).getField('path')
    startTime = time.time()
    if not path:
        endDate = time.strftime('%Y/%m/%d %X',time.localtime())
        log = u"网站["+name+"]不存在!"
        print(u"★["+endDate+"] "+log)
        print("----------------------------------------------------------------------------")
        return

    backup_path = sql.table('config').where("id=?",(1,)).getField('backup_path') + '/site'
    if not os.path.exists(backup_path): public.ExecShell("mkdir -p " + backup_path)
    filename= backup_path + "/Web_" + name + "_" + time.strftime('%Y%m%d_%H%M%S',time.localtime()) + '.tar.gz'
    public.ExecShell("cd " + os.path.dirname(path) + " && tar zcvf '" + filename + "' "+self.__exclude +" '" + os.path.basename(path) + "' > /dev/null")


    endDate = time.strftime('%Y/%m/%d %X',time.localtime())

    if not os.path.exists(filename):
        log = u"网站["+name+u"]备份失败!"
        print(u"★["+endDate+"] "+log)
        print(u"----------------------------------------------------------------------------")
        return

    outTime = time.time() - startTime
    pid = sql.table('sites').where('name=?',(name,)).getField('id')
    sql.table('backup').add('type,name,pid,filename,addtime,size',('0',os.path.basename(filename),pid,filename,endDate,os.path.getsize(filename)))
    log = u"网站["+name+u"]备份成功,用时["+str(round(outTime,2))+u"]秒"
    public.WriteLog(u'计划任务',log)
    print(u"★["+endDate+"] " + log)
    print(u"|---保留最新的["+count+u"]份备份")
    print(u"|---文件名:"+filename)
    if self.__exclude: print(u"|---排除规则: " + self.__exclude)

    #清理多余备份
    backups = sql.table('backup').where('type=? and pid=? and filename!=? and filename!=? and filename!=? and filename!=? and filename!=?',('0',pid,'alioss','txcos','upyun','qiniu','ftp')).field('id,filename').select()

    num = len(backups) - int(count)
    if  num > 0:
        for backup in backups:
            public.ExecShell("rm -f " + backup['filename'])
            sql.table('backup').where('id=?',(backup['id'],)).delete()
            num -= 1
            print(u"|---已清理过期备份文件:" + backup['filename'])
            if num < 1: break

def backupDatabase(self,name,count):
    sql = db.Sql()
    path = sql.table('databases').where('name=?',(name,)).getField('id')
    startTime = time.time()
    if not path:
        endDate = time.strftime('%Y/%m/%d %X',time.localtime())
        log = u"数据库["+name+u"]不存在!"
        print(u"★["+endDate+"] "+log)
        print(u"----------------------------------------------------------------------------")
        return

    backup_path = sql.table('config').where("id=?",(1,)).getField('backup_path') + '/database'
    if not os.path.exists(backup_path): public.ExecShell("mkdir -p " + backup_path)

    filename = backup_path + "/Db_" + name + "_" + time.strftime('%Y%m%d_%H%M%S',time.localtime())+".sql.gz"

    import re
    mysql_root = sql.table('config').where("id=?",(1,)).getField('mysql_root')

    mycnf = public.readFile('/etc/my.cnf')
    rep = "\[mysqldump\]\nuser=root"
    sea = "[mysqldump]\n"
    subStr = sea + "user=root\npassword=" + mysql_root+"\n"
    mycnf = mycnf.replace(sea,subStr)
    if len(mycnf) > 100:
        public.writeFile('/etc/my.cnf',mycnf)

    public.ExecShell("/www/server/mysql/bin/mysqldump --default-character-set="+ public.get_database_character(name) +" --force --opt " + name + " | gzip > " + filename)

    if not os.path.exists(filename):
        endDate = time.strftime('%Y/%m/%d %X',time.localtime())
        log = u"数据库["+name+u"]备份失败!"
        print(u"★["+endDate+"] "+log)
        print(u"----------------------------------------------------------------------------")
        return

    mycnf = public.readFile('/etc/my.cnf')
    mycnf = mycnf.replace(subStr,sea)
    if len(mycnf) > 100:
        public.writeFile('/etc/my.cnf',mycnf)

    endDate = time.strftime('%Y/%m/%d %X',time.localtime())
    outTime = time.time() - startTime
    pid = sql.table('databases').where('name=?',(name,)).getField('id')

    sql.table('backup').add('type,name,pid,filename,addtime,size',(1,os.path.basename(filename),pid,filename,endDate,os.path.getsize(filename)))
    log = u"数据库["+name+u"]备份成功,用时["+str(round(outTime,2))+u"]秒"
    public.WriteLog(u'计划任务',log)
    print("★["+endDate+"] " + log)
    print(u"|---保留最新的["+count+u"]份备份")
    print(u"|---文件名:"+filename)

    #清理多余备份
    backups = sql.table('backup').where('type=? and pid=? and filename!=? and filename!=? and filename!=? and filename!=? and filename!=?',('1',pid,'alioss','txcos','upyun','qiniu','ftp')).field('id,filename').select()

    num = len(backups) - int(count)
    if  num > 0:
        for backup in backups:
            public.ExecShell("rm -f " + backup['filename'])
            sql.table('backup').where('id=?',(backup['id'],)).delete()
            num -= 1
            print(u"|---已清理过期备份文件:" + backup['filename'])
            if num < 1: break

#备份指定目录
def backupPath(self,path,count):
    sql = db.Sql()
    startTime = time.time()
    if path[-1:] == '/': path = path[:-1]
    name = os.path.basename(path)
    backup_path = sql.table('config').where("id=?",(1,)).getField('backup_path') + '/path'
    if not os.path.exists(backup_path): os.makedirs(backup_path)
    filename= backup_path + "/Path_" + name + "_" + time.strftime('%Y%m%d_%H%M%S',time.localtime()) + '.tar.gz'
    os.system("cd " + os.path.dirname(path) + " && tar zcvf '" + filename + "' " + self.__exclude + " '" + os.path.basename(path) + "' > /dev/null")

    endDate = time.strftime('%Y/%m/%d %X',time.localtime())
    if not os.path.exists(filename):
        log = u"目录["+path+"]备份失败"
        print(u"★["+endDate+"] "+log)
        print(u"----------------------------------------------------------------------------")
        return

    outTime = time.time() - startTime
    sql.table('backup').add('type,name,pid,filename,addtime,size',('2',path,'0',filename,endDate,os.path.getsize(filename)))
    log = u"目录["+path+"]备份成功,用时["+str(round(outTime,2))+"]秒"
    public.WriteLog(u'计划任务',log)
    print(u"★["+endDate+"] " + log)
    print(u"|---保留最新的["+count+u"]份备份")
    print(u"|---文件名:"+filename)
    if self.__exclude: print(u"|---排除规则: " + self.__exclude)

    #清理多余备份
    backups = sql.table('backup').where('type=? and pid=? and name=?',('2',0,path)).field('id,filename').select()
    num = len(backups) - int(count)
    if  num > 0:
        for backup in backups:
            public.ExecShell("rm -f " + backup['filename'])
            sql.table('backup').where('id=?',(backup['id'],)).delete()
            num -= 1
            print(u"|---已清理过期备份文件:" + backup['filename'])
            if num < 1: break


def backupSiteAll(self,save):
    sites = public.M('sites').field('name').select()
    for site in sites:
        self.backupSite(site['name'],save)


def backupDatabaseAll(self,save):
    databases = public.M('databases').field('name').select()
    for database in databases:
        self.backupDatabase(database['name'],save)

def get_exclode(self):
    tmp_exclude = os.getenv('BT_EXCLUDE')
    if not tmp_exclude: return ""
    for ex in tmp_exclude.split(','):
        self.__exclude += " --exclude=\"" + ex + "\""
    self.__exclude += " "
    return self.__exclude

if name == “main”:
backup = backupTools()
type = sys.argv[1]
if type == ‘site’:
if sys.argv[2] == ‘ALL’:
backup.backupSiteAll( sys.argv[3])
else:
backup.backupSite(sys.argv[2], sys.argv[3])
elif type == ‘path’:
backup.backupPath(sys.argv[2],sys.argv[3])
elif type == ‘database’:
if sys.argv[2] == ‘ALL’:
backup.backupDatabaseAll(sys.argv[3])
else:
backup.backupDatabase(sys.argv[2], sys.argv[3])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值