From 8108ca7ee6c9fdee586b85d009b5d19124cf737f Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Sun, 5 May 2024 12:12:23 +0800 Subject: [PATCH] Update backup.py --- plugins/mongodb/scripts/backup.py | 206 ++++++------------------------ 1 file changed, 36 insertions(+), 170 deletions(-) diff --git a/plugins/mongodb/scripts/backup.py b/plugins/mongodb/scripts/backup.py index f68a220be..f4d9813a1 100644 --- a/plugins/mongodb/scripts/backup.py +++ b/plugins/mongodb/scripts/backup.py @@ -24,90 +24,24 @@ import time class backupTools: - 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 = "网站[" + name + "]不存在!" - print("★[" + endDate + "] " + log) - print( - "----------------------------------------------------------------------------") - return - - backup_path = mw.getBackupDir() + '/site' - if not os.path.exists(backup_path): - mw.execShell("mkdir -p " + backup_path) - - filename = backup_path + "/web_" + name + "_" + \ - time.strftime('%Y%m%d_%H%M%S', time.localtime()) + '.tar.gz' - - cmd = "cd " + os.path.dirname(path) + " && tar zcvf '" + \ - filename + "' '" + os.path.basename(path) + "' > /dev/null" - - # print(cmd) - mw.execShell(cmd) - - endDate = time.strftime('%Y/%m/%d %X', time.localtime()) - print(filename) - if not os.path.exists(filename): - log = "网站[" + name + "]备份失败!" - print("★[" + endDate + "] " + log) - print( - "----------------------------------------------------------------------------") - 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 = "网站[" + name + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒" - mw.writeLog('计划任务', log) - print("★[" + endDate + "] " + log) - print("|---保留最新的[" + count + "]份备份") - print("|---文件名:" + filename) - - # 清理多余备份 - backups = sql.table('backup').where( - 'type=? and pid=?', ('0', pid)).field('id,filename').select() - - num = len(backups) - int(count) - if num > 0: - for backup in backups: - mw.execShell("rm -f " + backup['filename']) - sql.table('backup').where('id=?', (backup['id'],)).delete() - num -= 1 - print("|---已清理过期备份文件:" + backup['filename']) - if num < 1: - break - - def getConf(self, mtype='mysql'): - path = mw.getServerDir() + '/' + mtype + '/etc/my.cnf' - return path - - # 数据库密码处理 - def mypass(self, act, root): - conf_file = self.getConf('mysql') - mw.execShell("sed -i '/user=root/d' {}".format(conf_file)) - mw.execShell("sed -i '/password=/d' {}".format(conf_file)) - if act: - mycnf = mw.readFile(conf_file) - src_dump = "[mysqldump]\n" - sub_dump = src_dump + "user=root\npassword=\"{}\"\n".format(root) - if not mycnf: - return False - mycnf = mycnf.replace(src_dump, sub_dump) - if len(mycnf) > 100: - mw.writeFile(conf_file, mycnf) - return True - return True + def getDbBackupList(self,dbname=''): + bkDir = mw.getRootDir() + '/backup/database' + blist = os.listdir(bkDir) + r = [] + + bname = 'mongodb_' + dbname + blen = len(bname) + for x in blist: + fbstr = x[0:blen] + if fbstr == bname: + r.append(x) + return r def backupDatabase(self, name, count): - db_path = mw.getServerDir() + '/mysql' - db_name = 'mysql' - name = mw.M('databases').dbPos(db_path, 'mysql').where( - 'name=?', (name,)).getField('name') + db_path = mw.getServerDir() + '/mongodb' + db_name = 'mongodb' + name = mw.M('databases').dbPos(db_path, db_name).where('name=?', (name,)).getField('name') + startTime = time.time() if not name: endDate = time.strftime('%Y/%m/%d %X', time.localtime()) @@ -121,78 +55,54 @@ class backupTools: if not os.path.exists(backup_path): mw.execShell("mkdir -p " + backup_path) - filename = backup_path + "/db_" + name + "_" + \ - time.strftime('%Y%m%d_%H%M%S', time.localtime()) + ".sql.gz" - - mysql_root = mw.M('config').dbPos(db_path, db_name).where( - "id=?", (1,)).getField('mysql_root') - - my_cnf = self.getConf('mysql') - self.mypass(True, mysql_root) + time_now = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + backup_name = "mongodb_" + name + "_" + time_now + ".tar.gz" + filename = backup_path + "/"+backup_name - # mw.execShell(db_path + "/bin/mysqldump --opt --default-character-set=utf8 " + - # name + " | gzip > " + filename) - - # mw.execShell(db_path + "/bin/mysqldump --skip-lock-tables --default-character-set=utf8 " + - # name + " | gzip > " + filename) - - # mw.execShell(db_path + "/bin/mysqldump --single-transaction --quick --default-character-set=utf8 " + - # name + " | gzip > " + filename) - - cmd = db_path + "/bin/mysqldump --defaults-file=" + my_cnf + " --force --opt --default-character-set=utf8 " + \ - name + " | gzip > " + filename - # print(cmd) + + cmd = db_path + "/bin/mongodump --port 27017 -d test -o "+backup_path mw.execShell(cmd) - + cmd_gz = "cd "+backup_path+"/"+name+" && tar -zcvf "+filename + " ./" + mw.execShell(cmd_gz) + mw.execShell("rm -rf "+ backup_path+"/"+name) + if not os.path.exists(filename): endDate = time.strftime('%Y/%m/%d %X', time.localtime()) log = "数据库[" + name + "]备份失败!" print("★[" + endDate + "] " + log) - print( - "----------------------------------------------------------------------------") + print("----------------------------------------------------------------------------") return - self.mypass(False, mysql_root) endDate = time.strftime('%Y/%m/%d %X', time.localtime()) outTime = time.time() - startTime - pid = mw.M('databases').dbPos(db_path, db_name).where( - 'name=?', (name,)).getField('id') - mw.M('backup').add('type,name,pid,filename,addtime,size', (1, os.path.basename( - filename), pid, filename, endDate, os.path.getsize(filename))) - log = "数据库[" + name + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒" + # print(outTime) + log = "数据库MongoDB[" + name + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒" mw.writeLog('计划任务', log) print("★[" + endDate + "] " + log) print("|---保留最新的[" + count + "]份备份") print("|---文件名:" + filename) - # 清理多余备份 - backups = mw.M('backup').where( - 'type=? and pid=?', ('1', pid)).field('id,filename').select() + backups = self.getDbBackupList(name) + # 清理多余备份 num = len(backups) - int(count) if num > 0: for backup in backups: - mw.execShell("rm -f " + backup['filename']) - mw.M('backup').where('id=?', (backup['id'],)).delete() + mw.execShell("rm -f " + backup_path + "/"+backup) num -= 1 - print("|---已清理过期备份文件:" + backup['filename']) + print("|---已清理过期备份文件:" + backup) if num < 1: break - def backupSiteAll(self, save): - sites = mw.M('sites').field('name').select() - for site in sites: - self.backupSite(site['name'], save) - def backupDatabaseAll(self, save): - db_path = mw.getServerDir() + '/mogodb' - db_name = 'mysql' + db_path = mw.getServerDir() + '/mongodb' + db_name = 'mongodb' databases = mw.M('databases').dbPos( db_path, db_name).field('name').select() - for database in databases: - self.backupDatabase(database['name'], save) + for db in databases: + self.backupDatabase(db['name'], save) def findPathName(self, path, filename): f = os.scandir(path) @@ -202,50 +112,6 @@ class backupTools: l.append(ff.name) return l - def backupPath(self, path, count): - - mw.echoStart('备份') - - backup_path = mw.getBackupDir() + '/path' - if not os.path.exists(backup_path): - mw.execShell("mkdir -p " + backup_path) - - dirname = os.path.basename(path) - fname = 'path_{}_{}.tar.gz'.format( - dirname, mw.formatDate("%Y%m%d_%H%M%S")) - dfile = os.path.join(backup_path, fname) - - p_size = mw.getPathSize(path) - stime = time.time() - - cmd = "cd " + os.path.dirname(path) + " && tar zcvf '" + dfile + "' '" + dirname + "' 2>{err_log} 1> /dev/null".format( - err_log='/tmp/backup_err.log') - mw.execShell(cmd) - - tar_size = os.path.getsize(dfile) - - mw.echoInfo('备份目录:' + path) - mw.echoInfo('目录已备份到:' + dfile) - mw.echoInfo("目录大小:{}".format(mw.toSize(p_size))) - mw.echoInfo("开始压缩文件:{}".format(mw.formatDate(times=stime))) - mw.echoInfo("文件压缩完成,耗时{:.2f}秒,压缩包大小:{}".format( - time.time() - stime, mw.toSize(tar_size))) - mw.echoInfo('保留最新的备份数:' + count + '份') - - backups = self.findPathName(backup_path, 'path_{}'.format(dirname)) - num = len(backups) - int(count) - backups.sort() - if num > 0: - for backup in backups: - abspath_bk = backup_path + "/" + backup - mw.execShell("rm -f " + abspath_bk) - mw.echoInfo("|---已清理过期备份文件:" + abspath_bk) - num -= 1 - if num < 1: - break - - mw.echoEnd('备份') - if __name__ == "__main__": backup = backupTools() stype = sys.argv[1]