diff --git a/plugins/mariadb/index.py b/plugins/mariadb/index.py index 40cf93958..825eecb3f 100755 --- a/plugins/mariadb/index.py +++ b/plugins/mariadb/index.py @@ -1209,389 +1209,6 @@ def getTotalStatistics(): return mw.returnJson(False, 'fail', data) -def findBinlogDoDb(): - conf = getConf() - con = mw.readFile(conf) - rep = r"binlog-do-db\s*?=\s*?(.*)" - dodb = re.findall(rep, con, re.M) - return dodb - - -def findBinlogSlaveDoDb(): - conf = getConf() - con = mw.readFile(conf) - rep = r"replicate-do-db\s*?=\s*?(.*)" - dodb = re.findall(rep, con, re.M) - return dodb - - -def getMasterDbList(version=''): - args = getArgs() - page = 1 - page_size = 10 - search = '' - data = {} - if 'page' in args: - page = int(args['page']) - - if 'page_size' in args: - page_size = int(args['page_size']) - - if 'search' in args: - search = args['search'] - - conn = pSqliteDb('databases') - limit = str((page - 1) * page_size) + ',' + str(page_size) - condition = '' - dodb = findBinlogDoDb() - data['dodb'] = dodb - - slave_dodb = findBinlogSlaveDoDb() - - if not search == '': - condition = "name like '%" + search + "%'" - field = 'id,pid,name,username,password,accept,ps,addtime' - clist = conn.where(condition, ()).field( - field).limit(limit).order('id desc').select() - count = conn.where(condition, ()).count() - - for x in range(0, len(clist)): - if clist[x]['name'] in dodb: - clist[x]['master'] = 1 - else: - clist[x]['master'] = 0 - - if clist[x]['name'] in slave_dodb: - clist[x]['slave'] = 1 - else: - clist[x]['slave'] = 0 - - _page = {} - _page['count'] = count - _page['p'] = page - _page['row'] = page_size - _page['tojs'] = 'dbList' - data['page'] = mw.getPage(_page) - data['data'] = clist - - return mw.getJson(data) - - -def setDbMaster(version): - args = getArgs() - data = checkArgs(args, ['name']) - if not data[0]: - return data[1] - - conf = getConf() - con = mw.readFile(conf) - rep = r"(binlog-do-db\s*?=\s*?(.*))" - dodb = re.findall(rep, con, re.M) - - isHas = False - for x in range(0, len(dodb)): - - if dodb[x][1] == args['name']: - isHas = True - - con = con.replace(dodb[x][0] + "\n", '') - mw.writeFile(conf, con) - - if not isHas: - prefix = '#binlog-do-db' - con = con.replace( - prefix, prefix + "\nbinlog-do-db=" + args['name']) - mw.writeFile(conf, con) - - restart(version) - time.sleep(4) - return mw.returnJson(True, '设置成功', [args, dodb]) - - -def setDbSlave(version): - args = getArgs() - data = checkArgs(args, ['name']) - if not data[0]: - return data[1] - - conf = getConf() - con = mw.readFile(conf) - rep = r"(replicate-do-db\s*?=\s*?(.*))" - dodb = re.findall(rep, con, re.M) - - isHas = False - for x in range(0, len(dodb)): - if dodb[x][1] == args['name']: - isHas = True - - con = con.replace(dodb[x][0] + "\n", '') - mw.writeFile(conf, con) - - if not isHas: - prefix = '#replicate-do-db' - con = con.replace( - prefix, prefix + "\nreplicate-do-db=" + args['name']) - mw.writeFile(conf, con) - - restart(version) - time.sleep(4) - return mw.returnJson(True, '设置成功', [args, dodb]) - - -def getMasterStatus(version=''): - - if status(version) == 'stop': - return mw.returnJson(False, 'MySQL未启动,或正在启动中...!', []) - - conf = getConf() - con = mw.readFile(conf) - master_status = False - if con.find('#log-bin') == -1 and con.find('log-bin') > 1: - dodb = findBinlogDoDb() - if len(dodb) > 0: - master_status = True - data = {} - data['status'] = master_status - - db = pMysqlDb() - dlist = db.query('show slave status') - # print(dlist, len(dlist)) - if len(dlist) > 0 and (dlist[0][10] == 'Yes' or dlist[0][11] == 'Yes'): - data['slave_status'] = True - - return mw.returnJson(master_status, '设置成功', data) - - -def setMasterStatus(version=''): - - conf = getConf() - con = mw.readFile(conf) - - if con.find('#log-bin') != -1: - return mw.returnJson(False, '必须开启二进制日志') - - sign = 'mdserver_ms_open' - - dodb = findBinlogDoDb() - if not sign in dodb: - prefix = '#binlog-do-db' - con = con.replace(prefix, prefix + "\nbinlog-do-db=" + sign) - mw.writeFile(conf, con) - else: - con = con.replace("binlog-do-db=" + sign + "\n", '') - rep = r"(binlog-do-db\s*?=\s*?(.*))" - dodb = re.findall(rep, con, re.M) - for x in range(0, len(dodb)): - con = con.replace(dodb[x][0] + "\n", '') - mw.writeFile(conf, con) - - restart(version) - return mw.returnJson(True, '设置成功') - - -def getMasterRepSlaveList(version=''): - args = getArgs() - page = 1 - page_size = 10 - search = '' - data = {} - if 'page' in args: - page = int(args['page']) - - if 'page_size' in args: - page_size = int(args['page_size']) - - if 'search' in args: - search = args['search'] - - conn = pSqliteDb('master_replication_user') - limit = str((page - 1) * page_size) + ',' + str(page_size) - condition = '' - - if not search == '': - condition = "name like '%" + search + "%'" - field = 'id,username,password,accept,ps,addtime' - clist = conn.where(condition, ()).field( - field).limit(limit).order('id desc').select() - count = conn.where(condition, ()).count() - - _page = {} - _page['count'] = count - _page['p'] = page - _page['row'] = page_size - _page['tojs'] = 'getMasterRepSlaveList' - data['page'] = mw.getPage(_page) - data['data'] = clist - - return mw.getJson(data) - - -def addMasterRepSlaveUser(version=''): - args = getArgs() - data = checkArgs(args, - ['username', 'password']) - if not data[0]: - return data[1] - - if not 'address' in args: - address = '' - else: - address = args['address'].strip() - - username = args['username'].strip() - password = args['password'].strip() - # ps = args['ps'].strip() - # address = args['address'].strip() - # dataAccess = args['dataAccess'].strip() - - reg = "^[\w\.-]+$" - if not re.match(reg, username): - return mw.returnJson(False, '用户名不能带有特殊符号!') - checks = ['root', 'mysql', 'test', 'sys', 'panel_logs'] - if username in checks or len(username) < 1: - return mw.returnJson(False, '用户名不合法!') - if password in checks or len(password) < 1: - return mw.returnJson(False, '密码不合法!') - - if len(password) < 1: - password = mw.md5(time.time())[0:8] - - pdb = pMysqlDb() - psdb = pSqliteDb('master_replication_user') - - if psdb.where("username=?", (username)).count(): - return mw.returnJson(False, '用户已存在!') - - result = pdb.execute("GRANT REPLICATION SLAVE ON *.* TO '" + - username + "'@'%' identified by '" + password + "';FLUSH PRIVILEGES;") - # print result - isError = isSqlError(result) - if isError != None: - return isError - - addTime = time.strftime('%Y-%m-%d %X', time.localtime()) - psdb.add('username,password,accept,ps,addtime', - (username, password, '%', '', addTime)) - return mw.returnJson(True, '添加成功!') - - -def getMasterRepSlaveUserCmd(version): - args = getArgs() - data = checkArgs(args, ['username', 'db']) - if not data[0]: - return data[1] - - psdb = pSqliteDb('master_replication_user') - f = 'username,password' - if args['username'] == '': - - count = psdb.count() - - if count == 0: - return mw.returnJson(False, '请添加同步账户!') - - clist = psdb.field(f).limit('1').order('id desc').select() - else: - clist = psdb.field(f).where("username=?", (args['username'],)).limit( - '1').order('id desc').select() - - ip = mw.getLocalIp() - port = getMyPort() - - db = pMysqlDb() - tmp = db.query('show master status') - - if len(tmp) == 0: - return mw.returnJson(False, '未开启!') - - sql = "CHANGE MASTER TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \ - clist[0]['username'] + "', MASTER_PASSWORD='" + \ - clist[0]['password'] + \ - "', MASTER_LOG_FILE='" + tmp[0][0] + \ - "',MASTER_LOG_POS=" + str(tmp[0][1]) + "" - - # if args['db'] != '': - # replicate-do-table - - return mw.returnJson(True, 'OK!', sql) - - -def delMasterRepSlaveUser(version=''): - args = getArgs() - data = checkArgs(args, ['username']) - if not data[0]: - return data[1] - - pdb = pMysqlDb() - psdb = pSqliteDb('master_replication_user') - pdb.execute("drop user '" + args['username'] + "'@'%'") - psdb.where("username=?", (args['username'],)).delete() - - return mw.returnJson(True, '删除成功!') - - -def updateMasterRepSlaveUser(version=''): - args = getArgs() - data = checkArgs(args, ['username', 'password']) - if not data[0]: - return data[1] - - pdb = pMysqlDb() - psdb = pSqliteDb('master_replication_user') - pdb.execute("drop user '" + args['username'] + "'@'%'") - - pdb.execute("GRANT REPLICATION SLAVE ON *.* TO '" + - args['username'] + "'@'%' identified by '" + args['password'] + "'") - - psdb.where("username=?", (args['username'],)).save( - 'password', args['password']) - - return mw.returnJson(True, '更新成功!') - - -def getSlaveList(version=''): - - db = pMysqlDb() - dlist = db.query('show slave status') - - # print(dlist) - ret = [] - for x in range(0, len(dlist)): - tmp = {} - tmp['Master_User'] = dlist[x][2] - tmp['Master_Host'] = dlist[x][1] - tmp['Master_Port'] = dlist[x][3] - tmp['Master_Log_File'] = dlist[x][5] - tmp['Slave_IO_Running'] = dlist[x][10] - tmp['Slave_SQL_Running'] = dlist[x][11] - ret.append(tmp) - data = {} - data['data'] = ret - - return mw.getJson(data) - - -def setSlaveStatus(version=''): - db = pMysqlDb() - dlist = db.query('show slave status') - - if len(dlist) == 0: - return mw.returnJson(False, '需要手动添加主服务同步命令!') - - if len(dlist) > 0 and (dlist[0][10] == 'Yes' or dlist[0][11] == 'Yes'): - db.query('stop slave') - else: - db.query('start slave') - - return mw.returnJson(True, '设置成功!') - - -def deleteSlave(version=''): - db = pMysqlDb() - dlist = db.query('stop slave;reset slave all') - return mw.returnJson(True, '删除成功!') - - def dumpMysqlData(version): args = getArgs() @@ -1616,151 +1233,6 @@ def dumpMysqlData(version): return 'fail' -from threading import Thread -from time import sleep - - -def mw_async(f): - def wrapper(*args, **kwargs): - thr = Thread(target=f, args=args, kwargs=kwargs) - thr.start() - return wrapper - - -def doFullSync(): - - args = getArgs() - data = checkArgs(args, ['db']) - if not data[0]: - return data[1] - - status_data = {} - status_data['progress'] = 5 - - db = pMysqlDb() - - dlist = db.query('show slave status') - if len(dlist) == 0: - status_data['code'] = -1 - status_data['msg'] = '没有启动...' - - ip = dlist[0][1] - print(ip) - - status_file = '/tmp/db_async_status.txt' - - status_data['code'] = 0 - status_data['msg'] = '运行中...' - mw.writeFile(status_file, json.dumps(status_data)) - - import paramiko - paramiko.util.log_to_file('paramiko.log') - ssh = paramiko.SSHClient() - - SSH_PRIVATE_KEY = '/root/.ssh/id_rsa' - - if mw.getOs() == 'darwin': - user = mw.execShell( - "who | sed -n '2, 1p' |awk '{print $1}'")[0].strip() - SSH_PRIVATE_KEY = '/Users/' + user + '/.ssh/id_rsa' - - print(SSH_PRIVATE_KEY) - if not os.path.exists(SSH_PRIVATE_KEY): - status_data['code'] = 0 - status_data['msg'] = '需要配置免登录...' - mw.writeFile(status_file, json.dumps(status_data)) - return - - try: - key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY) - # ssh.load_system_host_keys() - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - ssh.connect(hostname=ip, port=22, username='root', pkey=key) - except Exception as e: - status_data['code'] = 0 - status_data['msg'] = '需要配置免登录....' - mw.writeFile(status_file, json.dumps(status_data)) - return - - cmd = "cd /www/server/mdserver-web && python /www/server/mdserver-web/plugins/mysql/index.py dump_mysql_data {\"db\":'" + args[ - 'db'] + "'}" - stdin, stdout, stderr = ssh.exec_command(cmd) - result = stdout.read() - result_err = stderr.read() - - if result == 'ok': - status_data['code'] = 1 - status_data['msg'] = '主服务器备份完成...' - status_data['progress'] = 30 - mw.writeFile(status_file, json.dumps(status_data)) - - r = mw.execShell('scp root@' + ip + ':/tmp/dump.sql /tmp') - if r[0] == '': - status_data['code'] = 2 - status_data['msg'] = '数据同步本地完成...' - status_data['progress'] = 40 - mw.writeFile(status_file, json.dumps(status_data)) - - cmd = 'cd /www/server/mdserver-web && python /www/server/mdserver-web/plugins/mysql/index.py get_master_rep_slave_user_cmd {"username":"","db":""}' - stdin, stdout, stderr = ssh.exec_command(cmd) - result = stdout.read() - result_err = stderr.read() - cmd_data = json.loads(result) - - db.query('stop slave') - status_data['code'] = 3 - status_data['msg'] = '停止从库完成...' - status_data['progress'] = 45 - mw.writeFile(status_file, json.dumps(status_data)) - - dlist = db.query(cmd_data['data']) - status_data['code'] = 4 - status_data['msg'] = '刷新库信息完成...' - status_data['progress'] = 50 - mw.writeFile(status_file, json.dumps(status_data)) - - pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') - cmd = getServerDir() + "/bin/mysql -uroot -p" + pwd + " < /tmp/dump.sql" - print(mw.execShell(cmd)) - status_data['code'] = 5 - status_data['msg'] = '同步数据完成...' - status_data['progress'] = 90 - mw.writeFile(status_file, json.dumps(status_data)) - - db.query('start slave') - status_data['code'] = 6 - status_data['msg'] = '从库重启完成...' - status_data['progress'] = 100 - mw.writeFile(status_file, json.dumps(status_data)) - - return True - - -def fullSync(version=''): - args = getArgs() - data = checkArgs(args, ['db', 'begin']) - if not data[0]: - return data[1] - - status_file = '/tmp/db_async_status.txt' - if args['begin'] == '1': - cmd = 'cd ' + mw.getRunDir() + ' && python ' + \ - getPluginDir() + \ - '/index.py do_full_sync {"db":"' + args['db'] + '"} &' - mw.execShell(cmd) - return json.dumps({'code': 0, 'msg': '同步数据中!', 'progress': 0}) - - if os.path.exists(status_file): - c = mw.readFile(status_file) - d = json.loads(c) - - if d['code'] == 6: - os.remove(status_file) - return c - - return json.dumps({'code': 0, 'msg': '点击开始,开始同步!', 'progress': 0}) - - def uninstallPreInspection(version): # return "请手动删除MySQL[{}]".format(version) return 'ok'