# coding: utf-8 #----------------------------- # 网站备份工具 #----------------------------- import sys import os import re if sys.platform != 'darwin': os.chdir('/www/server/mdserver-web') chdir = os.getcwd() sys.path.append(chdir + '/class/core') # reload(sys) # sys.setdefaultencoding('utf-8') import mw import db import time import yaml def getPluginName(): return 'mongodb' def getPluginDir(): return mw.getPluginDir() + '/' + getPluginName() def getServerDir(): return mw.getServerDir() + '/' + getPluginName() def getConf(): path = getServerDir() + "/mongodb.conf" return path def getConfigData(): cfg = getConf() config_data = mw.readFile(cfg) try: config = yaml.safe_load(config_data) except: config = { "systemLog": { "destination": "file", "logAppend": True, "path": mw.getServerDir()+"/mongodb/log/mongodb.log" }, "storage": { "dbPath": mw.getServerDir()+"/mongodb/data", "directoryPerDB": True, "journal": { "enabled": True } }, "processManagement": { "fork": True, "pidFilePath": mw.getServerDir()+"/mongodb/log/mongodb.pid" }, "net": { "port": 27017, "bindIp": "0.0.0.0" }, "security": { "authorization": "enabled", "javascriptEnabled": False } } return config def getConfIp(): data = getConfigData() return data['net']['bindIp'] def getConfPort(): data = getConfigData() return data['net']['port'] def getConfAuth(): data = getConfigData() return data['security']['authorization'] def pSqliteDb(dbname='users'): file = getServerDir() + '/mongodb.db' name = 'mongodb' sql_file = getPluginDir() + '/config/mongodb.sql' import_sql = mw.readFile(sql_file) # print(sql_file,import_sql) md5_sql = mw.md5(import_sql) import_sign = False save_md5_file = getServerDir() + '/import_mongodb.md5' if os.path.exists(save_md5_file): save_md5_sql = mw.readFile(save_md5_file) if save_md5_sql != md5_sql: import_sign = True mw.writeFile(save_md5_file, md5_sql) else: mw.writeFile(save_md5_file, md5_sql) if not os.path.exists(file) or import_sql: conn = mw.M(dbname).dbPos(getServerDir(), name) csql_list = import_sql.split(';') for index in range(len(csql_list)): conn.execute(csql_list[index], ()) conn = mw.M(dbname).dbPos(getServerDir(), name) return conn def mongdbClient(): import pymongo port = getConfPort() auth = getConfAuth() ip = getConfIp() mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root') # print(ip,port,auth,mg_root) if auth == 'disabled': client = pymongo.MongoClient(host=ip, port=int(port), directConnection=True) else: # uri = "mongodb://root:"+mg_root+"@127.0.0.1:"+str(port) # client = pymongo.MongoClient(uri) client = pymongo.MongoClient(host=ip, port=int(port), directConnection=True, username='root',password=mg_root) return client class backupTools: 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() + '/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()) log = "数据库[" + name + "]不存在!" print("★[" + endDate + "] " + log) print( "----------------------------------------------------------------------------") return backup_path = mw.getBackupDir() + '/database' if not os.path.exists(backup_path): mw.execShell("mkdir -p " + backup_path) 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 port = getConfPort() auth = getConfAuth() mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root') uoption = '' if auth != 'disabled': uoption =' --authenticationDatabase admin -u root -p '+mg_root cmd = db_path + "/bin/mongodump "+uoption+" --port "+str(port)+" -d "+name+" -o "+backup_path # print(cmd) 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("----------------------------------------------------------------------------") return endDate = time.strftime('%Y/%m/%d %X', time.localtime()) outTime = time.time() - startTime # print(outTime) log = "数据库MongoDB[" + name + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒" mw.writeLog('计划任务', log) print("★[" + endDate + "] " + log) print("|---保留最新的[" + count + "]份备份") print("|---文件名:" + filename) backups = self.getDbBackupList(name) # 清理多余备份 num = len(backups) - int(count) if num > 0: for backup in backups: mw.execShell("rm -f " + backup_path + "/"+backup) num -= 1 print("|---已清理过期备份文件:" + backup) if num < 1: break def backupDatabaseAll(self, save): db_path = mw.getServerDir() + '/mongodb' db_name = 'mongodb' databases = mw.M('databases').dbPos( db_path, db_name).field('name').select() for db in databases: self.backupDatabase(db['name'], save) def findPathName(self, path, filename): f = os.scandir(path) l = [] for ff in f: if ff.name.find(filename) > -1: l.append(ff.name) return l if __name__ == "__main__": backup = backupTools() stype = sys.argv[1] if stype == 'all': backup.backupDatabaseAll(sys.argv[2]) if stype == 'database': backup.backupDatabase(sys.argv[2], sys.argv[3])