mirror of
https://github.com/aaPanel/aaPanel.git
synced 2026-08-17 21:25:47 +02:00
207 lines
9.2 KiB
Python
207 lines
9.2 KiB
Python
#!/usr/bin/python
|
|
#coding: utf-8
|
|
#-----------------------------
|
|
# 宝塔Linux面板网站备份工具
|
|
#-----------------------------
|
|
|
|
import sys,os
|
|
os.chdir('/www/server/panel');
|
|
sys.path.append("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 = public.GetMsg("SITE_NOT_EXIST1",(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 + "' '" + os.path.basename(path) + "'"+self.__exclude +" > /dev/null")
|
|
|
|
|
|
endDate = time.strftime('%Y/%m/%d %X',time.localtime())
|
|
|
|
if not os.path.exists(filename):
|
|
log = public.GetMsg("SITE_BACK_FILE",(name,))
|
|
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 = public.GetMsg("SITE_BACKFTP_SUCCESS",(name,str(round(outTime,2))))
|
|
public.WriteLog('TYPE_CRON',log)
|
|
print(u"★["+endDate+"] " + log)
|
|
print(public.GetMsg("KEEP_PART",(count,)))
|
|
print(public.GetMsg("FTP_FILE_NAME")+filename)
|
|
if self.__exclude: print(u"|---Exclusion rules: " + 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(public.GetMsg("FTP_CLEAN_BACK_FILE") + 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 = public.GetMsg("FTP_DB_NOT_EXIST",(name,))
|
|
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 = public.GetMsg("FTP_DB_BACK",(name,))
|
|
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 = public.GetMsg("FTP_DB_BACK_SUCCESS",(name,str(round(outTime,2))))
|
|
public.WriteLog('TYPE_CRON',log)
|
|
print("★["+endDate+"] " + log)
|
|
print(public.GetMsg("KEEP_PART",(count,)))
|
|
print(public.GetMsg("FTP_FILE_NAME")+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(public.GetMsg("FTP_CLEAN_BACK_FILE") + 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 + "' '" + os.path.basename(path) + "'" + self.__exclude + " > /dev/null")
|
|
|
|
endDate = time.strftime('%Y/%m/%d %X',time.localtime())
|
|
if not os.path.exists(filename):
|
|
log = public.GetMsg("FTP_DIR_BACK_FAIL",(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 = public.GetMsg("FTP_DIR_BACK_SUCCESS",(path,str(round(outTime,2))))
|
|
public.WriteLog('TYPE_CRON',log)
|
|
print(u"★["+endDate+"] " + log)
|
|
print(public.GetMsg("KEEP_PART",(count,)))
|
|
print(public.GetMsg("FTP_FILE_NAME")+filename)
|
|
if self.__exclude: print(u"|---Exclusion rules: " + 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(public.GetMsg("FTP_CLEAN_BACK_FILE") + 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])
|
|
|