From afb3e920f8492f2b4a936b63a4af27379385fc10 Mon Sep 17 00:00:00 2001 From: midoks Date: Mon, 7 Aug 2023 15:10:38 +0800 Subject: [PATCH] =?UTF-8?q?mariadb=E5=A4=9A=E4=BD=8F=E4=B8=80=E4=BB=8E?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/mariadb/index.html | 7 +- plugins/mariadb/index.py | 312 +++++++++++++++++++--------------- plugins/mariadb/js/mariadb.js | 228 +++++++++++++++++-------- plugins/memcached/index.py | 4 + 4 files changed, 338 insertions(+), 213 deletions(-) diff --git a/plugins/mariadb/index.html b/plugins/mariadb/index.html index 24065d6e0..1ff31dc0b 100755 --- a/plugins/mariadb/index.html +++ b/plugins/mariadb/index.html @@ -2,7 +2,7 @@
- +

服务

自启动

配置文件

@@ -19,10 +19,8 @@
- - \ No newline at end of file diff --git a/plugins/mariadb/index.py b/plugins/mariadb/index.py index 1681eaba6..a657b3892 100755 --- a/plugins/mariadb/index.py +++ b/plugins/mariadb/index.py @@ -107,6 +107,14 @@ def getDbPort(): return tmp.groups()[0].strip() +def getDbServerId(): + file = getConf() + content = mw.readFile(file) + rep = 'server-id\s*=\s*(.*)' + tmp = re.search(rep, content) + return tmp.groups()[0].strip() + + def getSocketFile(): file = getConf() content = mw.readFile(file) @@ -1706,12 +1714,14 @@ def getMasterStatus(version=''): data['mode'] = recognizeDbMode() data['status'] = master_status - db = pMysqlDb() - dlist = db.query('show slave status') + pdb = pMysqlDb('mysql') + dlist = pdb.query('show slave status') + if len(dlist) < 1: + dlist = pdb.query("show all slaves status") - # print(dlist[0]) - if len(dlist) > 0 and (dlist[0]["Slave_IO_Running"] == 'Yes' or dlist[0]["Slave_SQL_Running"] == 'Yes'): - data['slave_status'] = True + for v in dlist: + if v["Slave_IO_Running"] == 'Yes' or v["Slave_SQL_Running"] == 'Yes': + data['slave_status'] = True return mw.returnJson(master_status, '设置成功', data) except Exception as e: @@ -1868,8 +1878,13 @@ def getMasterRepSlaveUserCmd(version): # 查找同步点 # SELECT BINLOG_GTID_POS('master1-bin.000002', 561866201); + sid = getDbServerId() + connection_name = "" + if sid != '': + connection_name = "'r{}' ".format(sid) + if mode == "gtid": - sql = "CHANGE MASTER TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \ + sql = "CHANGE MASTER " + connection_name + "TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \ clist[0]['username'] + "', MASTER_PASSWORD='" + \ clist[0]['password'] + "', " + "MASTER_LOG_FILE='" + mstatus[0]["File"] + \ "',MASTER_LOG_POS=" + \ @@ -2151,40 +2166,13 @@ def updateSlaveSSH(version=''): def getSlaveList(version=''): - db = pMysqlDb() dlist = db.query('show slave status') - ret = [] - for x in range(0, len(dlist)): - tmp = {} - tmp['Master_User'] = dlist[x]["Master_User"] - tmp['Master_Host'] = dlist[x]["Master_Host"] - tmp['Master_Port'] = dlist[x]["Master_Port"] - tmp['Master_Log_File'] = dlist[x]["Master_Log_File"] - tmp['Slave_IO_Running'] = dlist[x]["Slave_IO_Running"] - tmp['Slave_SQL_Running'] = dlist[x]["Slave_SQL_Running"] - tmp['Last_Error'] = dlist[x]["Last_Error"] - tmp['Last_IO_Error'] = dlist[x]["Last_IO_Error"] - tmp['Last_SQL_Error'] = dlist[x]["Last_SQL_Error"] - tmp['Slave_SQL_Running_State'] = dlist[x]["Slave_SQL_Running_State"] + if len(dlist) == 0: + dlist = db.query('show all slaves status') - tmp['Error'] = '' - if tmp['Last_Error'] != '': - tmp['Error'] = tmp['Last_Error'] - - if tmp['Last_IO_Error'] != '': - tmp['Error'] = tmp['Last_IO_Error'] - - if tmp['Last_SQL_Error'] != '': - tmp['Error'] = tmp['Last_SQL_Error'] - - if tmp['Error'] == '': - tmp['Error'] = tmp['Slave_SQL_Running_State'] - - ret.append(tmp) data = {} - data['data'] = ret - + data['data'] = dlist return mw.getJson(data) @@ -2208,33 +2196,82 @@ def initSlaveStatus(version=''): return initSlaveStatusSyncUser(version) +def parseSlaveSyncCmd(cmd): + a = {} + vlist = cmd.split(',') + + has_connection_name = vlist[0] + + pattern_c = r"CHANGE MASTER \'(.*)\' TO MASTER_HOST" + match_val = re.match(pattern_c, has_connection_name, re.I) + if match_val: + m_groups = match_val.groups() + a['Connection_name'] = m_groups[0] + + for i in vlist: + tmp = i.strip() + tmp_a = tmp.split(" ") + real_tmp = tmp_a[len(tmp_a) - 1] + kv = real_tmp.split("=") + a[kv[0]] = kv[1].replace("'", '').replace("'", '').replace(";", '') + return a + + def initSlaveStatusSyncUser(version=''): conn = pSqliteDb('slave_sync_user') - data = conn.field('ip,port,user,pass,mode,cmd').find() - if len(data) < 1: + + slave_data = conn.field('id,ip,port,user,pass,mode,cmd').select() + if len(slave_data) < 1: return mw.returnJson(False, '需要先添加同步用户配置!') - # print(data) - db = pMysqlDb() - dlist = db.query('show slave status') - if len(dlist) > 0: - return mw.returnJson(False, '已经初始化好了zz...') + pdb = pMysqlDb() + if len(slave_data) == 1: + dlist = pdb.query('show slave status') + if len(dlist) > 0: + return mw.returnJson(False, '已经初始化好了zz...') - u = data - - mode_name = 'classic' - if u['mode'] == '1': - mode_name = 'gtid' + msg = '' local_mode = recognizeDbMode() - if local_mode != mode_name: - return mw.returnJson(False, '同步模式不一致!') + for x in range(len(slave_data)): + slave_t = slave_data[x] + base_t = 'IP:' + slave_t['ip'] + ",PORT:" + \ + slave_t['port'] + ",USER:" + slave_t['user'] - # print(u['cmd']) - t = db.query(u['cmd']) - # print(t) - db.query("start slave") - return mw.returnJson(True, '初始化成功!') + mode_name = 'classic' + if slave_data[x]['mode'] == '1': + mode_name = 'gtid' + + if local_mode != mode_name: + msg += base_t + '->同步模式不一致' + continue + + cmd_sql = slave_t['cmd'] + if cmd_sql == '': + msg += base_t + '->同步命令不能为空' + continue + + try: + pinfo = parseSlaveSyncCmd(cmd_sql) + except Exception as e: + return mw.returnJson(False, base_t + '->CMD同步命令不合规范!') + + pdb.query(cmd_sql) + if 'Connection_name' in pinfo: + # pdb.query("stop slave '{}'".format(pinfo['Connection_name'])) + pdb.query("start slave '{}'".format(pinfo['Connection_name'])) + else: + pdb.query("start slave") + + # # if len(t) > 0: + # # msg += "Error:" + t[1] + # t = pdb.query("start slave") + # if len(t) > 0: + # msg += "Error:" + t[1] + + if msg == '': + msg = '初始化成功!' + return mw.returnJson(True, msg) def initSlaveStatusSSH(version=''): @@ -2312,61 +2349,39 @@ def setSlaveStatus(version=''): if not os.path.exists(mode_file): return mw.returnJson(False, '需要先设置同步配置') - mode = mw.readFile(mode_file) - if mode == 'ssh': - return setSlaveStatusSSH(version) - if mode == 'sync-user': - return setSlaveStatusSyncUser(version) + pdb = pMysqlDb() + dlist = pdb.query('show slave status') + if len(dlist) == 0: + dlist = pdb.query('show all slaves status') - -def setSlaveStatusSyncUser(version=''): - db = pMysqlDb() - dlist = db.query('show slave status') if len(dlist) == 0: return mw.returnJson(False, '需要手动添加同步账户或者执行初始化!') - if len(dlist) > 0 and (dlist[0]["Slave_IO_Running"] == 'Yes' or dlist[0]["Slave_SQL_Running"] == 'Yes'): - db.query('stop slave') - else: - ip = dlist[0]['Master_Host'] - conn = pSqliteDb('slave_sync_user') - data = conn.field('ip,port,user,pass,mode,cmd').find() - if len(data) == 0: - return mw.returnJson(False, '没有数据无法重启!') - user = data['user'] - apass = data['pass'] + for v in dlist: + connection_name = '' + cmd = "slave" + if 'Connection_name' in v: + connection_name = v['Connection_name'] + cmd = "slave '{}'".format(connection_name) - db.query("start slave") - # db.query("start slave user='{}' password='{}';".format(user, apass)) - - return mw.returnJson(True, '设置成功!') - - -def setSlaveStatusSSH(version=''): - - db = pMysqlDb() - dlist = db.query('show slave status') - if len(dlist) == 0: - return mw.returnJson(False, '需要手动添加主服务命令或者执行[初始化]!') - - # print(dlist) - if len(dlist) > 0 and (dlist[0]["Slave_IO_Running"] == 'Yes' or dlist[0]["Slave_SQL_Running"] == 'Yes'): - db.query('stop slave') - else: - ip = dlist[0]['Master_Host'] - conn = pSqliteDb('slave_id_rsa') - data = conn.field('ip,ps').where("ip=?", (ip,)).find() - if len(data) == 0: - return mw.returnJson(False, '没有数据无法重启!') - db.query("start slave") + if (v["Slave_IO_Running"] == 'Yes' or v["Slave_SQL_Running"] == 'Yes'): + pdb.query("stop {}".format(cmd)) + else: + pdb.query("start {}".format(cmd)) return mw.returnJson(True, '设置成功!') def deleteSlave(version=''): + args = getArgs() db = pMysqlDb() - dlist = db.query('stop slave') - dlist = db.query('reset slave all') + if 'sign' in args: + sign = args['sign'] + db.query("stop slave '{}'".format(sign)) + db.query("reset slave '{}' all".format(sign)) + else: + db.query('stop slave') + db.query('reset slave all') return mw.returnJson(True, '删除成功!') @@ -2402,14 +2417,53 @@ def dumpMysqlData(version=''): ############### --- 重要 同步---- ########### -def writeDbSyncStatus(data): + +def asyncTmpfile(): path = '/tmp/db_async_status.txt' + return path + + +def writeDbSyncStatus(data): + path = asyncTmpfile() # status_data['code'] = 1 # status_data['msg'] = '主服务器备份完成...' # status_data['progress'] = 30 mw.writeFile(path, json.dumps(data)) +def fullSync(version=''): + args = getArgs() + data = checkArgs(args, ['db', 'sign', 'begin']) + if not data[0]: + return data[1] + + status_file = asyncTmpfile() + if args['begin'] == '1': + cmd = 'cd ' + mw.getRunDir() + ' && python3 ' + \ + getPluginDir() + \ + '/index.py do_full_sync {"db":"' + \ + args['db'] + '","sign":"' + args['sign'] + '"} &' + print(cmd) + mw.execShell(cmd) + return json.dumps({'code': 0, 'msg': '同步数据中!', 'progress': 0}) + + if os.path.exists(status_file): + c = mw.readFile(status_file) + tmp = json.loads(c) + if tmp['code'] == 1: + sys_dump_sql = "/tmp/dump.sql" + if os.path.exists(sys_dump_sql): + dump_size = os.path.getsize(sys_dump_sql) + tmp['msg'] = tmp['msg'] + ":" + "同步文件:" + mw.toSize(dump_size) + c = json.dumps(tmp) + + # if tmp['code'] == 6: + # os.remove(status_file) + return c + + return json.dumps({'code': 0, 'msg': '点击开始,开始同步!', 'progress': 0}) + + def doFullSync(version=''): mode_file = getSyncModeFile() if not os.path.exists(mode_file): @@ -2424,16 +2478,23 @@ def doFullSync(version=''): def doFullSyncUser(version=''): args = getArgs() - data = checkArgs(args, ['db']) + data = checkArgs(args, ['db', 'sign']) if not data[0]: return data[1] sync_db = args['db'] + sync_sign = args['sign'] + # print(sync_sign, sync_db) db = pMysqlDb() conn = pSqliteDb('slave_sync_user') - data = conn.field('ip,port,user,pass,mode,cmd').find() + if sync_sign != '': + data = conn.field('ip,port,user,pass,mode,cmd').where( + 'ip=?', (sync_sign,)).find() + else: + data = conn.field('ip,port,user,pass,mode,cmd').find() + user = data['user'] apass = data['pass'] port = data['port'] @@ -2442,12 +2503,12 @@ def doFullSyncUser(version=''): bak_file = '/tmp/tmp.sql' writeDbSyncStatus({'code': 0, 'msg': '开始同步...', 'progress': 0}) - - writeDbSyncStatus({'code': 1, 'msg': '远程导出数据...', 'progress': 20}) + writeDbSyncStatus({'code': 1, 'msg': '远程导出数据...', 'progress': 10}) if not os.path.exists(bak_file): dump_sql_data = getServerDir() + "/bin/mysqldump --force --opt --default-character-set=utf8 --single-transaction -h" + ip + " -P" + \ port + " -u" + user + " -p" + apass + " " + sync_db + " > " + bak_file + print(dump_sql_data) mw.execShell(dump_sql_data) writeDbSyncStatus({'code': 2, 'msg': '本地导入数据...', 'progress': 40}) @@ -2458,10 +2519,17 @@ def doFullSyncUser(version=''): ' ' + sync_db + ' < ' + bak_file mw.execShell(my_import_cmd) - db.query("start slave") + pinfo = parseSlaveSyncCmd(data['cmd']) + # print(pinfo) + if 'Connection_name' in pinfo: + db.query("start slave '{}'".format(pinfo['Connection_name'])) + else: + db.query("start slave") writeDbSyncStatus({'code': 6, 'msg': '从库重启完成...', 'progress': 100}) - os.system("rm -rf " + bak_file) + + if os.path.exists(bak_file): + os.system("rm -rf " + bak_file) return True @@ -2585,38 +2653,6 @@ def doFullSyncSSH(version=''): 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() + ' && python3 ' + \ - getPluginDir() + \ - '/index.py do_full_sync {"db":"' + args['db'] + '"} &' - print(cmd) - mw.execShell(cmd) - return json.dumps({'code': 0, 'msg': '同步数据中!', 'progress': 0}) - - if os.path.exists(status_file): - c = mw.readFile(status_file) - tmp = json.loads(c) - if tmp['code'] == 1: - sys_dump_sql = "/tmp/dump.sql" - if os.path.exists(sys_dump_sql): - dump_size = os.path.getsize(sys_dump_sql) - tmp['msg'] = tmp['msg'] + ":" + "同步文件:" + mw.toSize(dump_size) - c = json.dumps(tmp) - - # if tmp['code'] == 6: - # os.remove(status_file) - return c - - return json.dumps({'code': 0, 'msg': '点击开始,开始同步!', 'progress': 0}) - - def installPreInspection(version): swap_path = mw.getServerDir() + "/swap" if not os.path.exists(swap_path): diff --git a/plugins/mariadb/js/mariadb.js b/plugins/mariadb/js/mariadb.js index 2787eacfc..df58ce937 100755 --- a/plugins/mariadb/js/mariadb.js +++ b/plugins/mariadb/js/mariadb.js @@ -431,7 +431,6 @@ function syncToDatabase(type){ var postData = 'type='+type+'&ids='+JSON.stringify(data); myPost('sync_to_databases', postData, function(data){ var rdata = $.parseJSON(data.data); - // console.log(rdata); showMsg(rdata.msg,function(){ dbList(); },{ icon: rdata.status ? 1 : 2 }); @@ -490,7 +489,6 @@ function showHidePass(obj){ function checkSelect(){ setTimeout(function () { var num = $('input[type="checkbox"].check:checked').length; - // console.log(num); if (num == 1) { $('button[batch="true"]').hide(); $('button[batch="false"]').show(); @@ -861,7 +859,6 @@ function downloadBackup(file){ function importBackup(file,name){ myPost('import_db_backup',{file:file,name:name}, function(data){ - // console.log(data); layer.msg('执行成功!'); }); } @@ -1619,7 +1616,6 @@ function getMasterRepSlaveList(){ _data['page'] = page; _data['page_size'] = 10; myPost('get_master_rep_slave_list', _data, function(data){ - // console.log(data); var rdata = []; try { rdata = $.parseJSON(data.data); @@ -1672,8 +1668,8 @@ function getMasterRepSlaveListPage(){ } -function deleteSlave(){ - myPost('delete_slave', {}, function(data){ +function deleteSlave(sign = ''){ + myPost('delete_slave', {sign:sign}, function(data){ var rdata = $.parseJSON(data.data); showMsg(rdata['msg'], function(){ masterOrSlaveConf(); @@ -1685,28 +1681,65 @@ function deleteSlave(){ function getFullSyncStatus(db){ var timeId = null; - var btn = '
开始
'; - var loadOpen = layer.open({ - type: 1, - title: '全量同步['+db+']', - area: '500px', - content:"
\ -
\ - \ -
\ -
0%
\ -
\ -
\ - "+btn+"\ -
", - cancel: function(){ - clearInterval(timeId); + myPost('get_slave_list', {page:1,page_size:100}, function(data){ + var rdata = $.parseJSON(data.data); + var rsource = rdata.data; + // console.log(rdata); + + var dataSource = ''; + if (rsource.length>1){ + var sourceList = ''; + for (var i = 0; i < rsource.length; i++) { + if ('Connection_name' in rsource[i]){ + sourceList += ''; + } + } + + dataSource = "

\ + 同步数据源:\ + \ +

"; } + + var loadOpen = layer.open({ + type: 1, + title: '全量同步['+db+']', + area: '500px', + content:"
\ +
\ + "+dataSource+"\ + \ +
\ +
0%
\ +
\ +
\ +
\ + 开始\ +
\ +
", + cancel: function(){ + clearInterval(timeId); + }, + success:function(){ + $('#begin_full_sync').click(function(){ + var val = $(this).data('status'); + var sign = $('select[name="data_source"]').val(); + if (val == 'init'){ + fullSync(db, sign, 1); + timeId = setInterval(function(){ + fullSync(db,sign,0); + }, 1000); + $(this).data('status','starting'); + } else { + layer.msg("正在同步中..",{icon:0}); + } + }); + } + }); }); - function fullSync(db,begin){ - - myPostN('full_sync', {db:db,begin:begin}, function(data){ + function fullSync(db, sign, begin){ + myPostN('full_sync', {db:db,sign:sign,begin:begin}, function(data){ var rdata = $.parseJSON(data.data); $('#full_msg').text(rdata['msg']); $('.progress-bar').css('width',rdata['progress']+'%'); @@ -1715,23 +1748,11 @@ function getFullSyncStatus(db){ if (rdata['code']==6 ||rdata['code']<0){ layer.msg(rdata['msg']); clearInterval(timeId); - $("#begin_full_sync").attr('data-status','init'); + $("#begin_full_sync").data('status','init'); } }); } - - $('#begin_full_sync').click(function(){ - var val = $(this).attr('data-status'); - if (val == 'init'){ - fullSync(db,1); - timeId = setInterval(function(){ - fullSync(db,0); - }, 1000); - $(this).attr('data-status','starting'); - } else { - layer.msg("正在同步中.."); - } - }); + } function addSlaveSSH(ip=''){ @@ -2142,11 +2163,15 @@ function handlerRun(){ function initSlaveStatus(){ myPost('init_slave_status', '', function(data){ var rdata = $.parseJSON(data.data); + if (!rdata.status ){ + layer.msg(rdata.msg,{icon:2,time:10000}); + return; + } showMsg(rdata.msg,function(){ if (rdata.status){ masterOrSlaveConf(); } - },{icon:rdata.status?1:2},2000); + },{icon:1},2000); }); } @@ -2204,33 +2229,48 @@ function masterOrSlaveConf(version=''){ } _data['page'] = page; - _data['page_size'] = 10; + _data['page_size'] = 100; myPost('get_slave_list', _data, function(data){ var rdata = $.parseJSON(data.data); var list = ''; + + var isHasSign = false; for(i in rdata.data){ var v = rdata.data[i]; - var status = "异常"; + if ('Connection_name' in v){ + isHasSign = true; + } + + var status = "异常"; if (v['Slave_SQL_Running'] == 'Yes' && v['Slave_IO_Running'] == 'Yes'){ status = "正常"; } list += ''; - list += '' + rdata.data[i]['Master_Host'] +''; - list += '' + rdata.data[i]['Master_Port'] +''; - list += '' + rdata.data[i]['Master_User'] +''; - list += '' + rdata.data[i]['Master_Log_File'] +''; - list += '' + rdata.data[i]['Slave_IO_Running'] +''; - list += '' + rdata.data[i]['Slave_SQL_Running'] +''; + list += '' + v['Master_Host'] +''; + list += '' + v['Master_Port'] +''; + list += '' + v['Master_User'] +''; + list += '' + v['Master_Log_File'] +''; + list += '' + v['Slave_IO_Running'] +''; + list += '' + v['Slave_SQL_Running'] +''; + if (isHasSign){ + list += '' + v['Connection_name'] +''; + } + list += '' + status +''; - list += '' + - '删除' + - ''; + list += '\ + 删除\ + '; list += ''; } + var signThead_th = ''; + if (isHasSign){ + var signThead_th = '标识'; + } + var con = '
\
\ \ @@ -2241,6 +2281,7 @@ function masterOrSlaveConf(version=''){ \ \ \ + '+signThead_th+'\ \ \ \ @@ -2255,22 +2296,76 @@ function masterOrSlaveConf(version=''){ // $(".table_slave_status_list").html(con); + + $(".btn_delete_slave").click(function(){ + var id = $(this).data('id'); + var v = rdata.data[id]; + if ('Connection_name' in v){ + deleteSlave(v['Connection_name']); + } else{ + deleteSlave(); + } + }); + $('.db_error').click(function(){ + var id = $(this).data('id'); + var info = rdata.data[id]; + console.log(info); + + var err_line = ""; + err_line +="\ + \ + \ + "; + err_line +="\ + \ + \ + "; + + err_line +="\ + \ + \ + "; + layer.open({ type: 1, title: '同步异常信息', - area: '500px', - content:"\ -
"+v['Error']+"
\ -
\ - \ + area: ['600px','300px'], + btn:['复制错误',"取消"], + content:"\ +
\ +
\ +
日志IOSQL状态操作
IO错误"+ (info['Last_IO_Error'] == '' ? '无':info['Last_IO_Error'])+"
SQL错误"+(info['Last_SQL_Error'] == '' ? '无':info['Last_SQL_Error'])+"
状态"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"
\ + \ + \ + \ + \ + "+ err_line +"\ +
类型内容
\ +
\
\ - ", + ", success:function(){ - copyText(v['Error']); - $('.class-copy-db-err').click(function(){ - copyText(v['Error']); - }); + // copyText(v['Error']); + // $('.class-copy-db-err').click(function(){ + // copyText(v['Error']); + // }); + }, + yes:function(){ + if (info['Last_IO_Error'] != ''){ + copyText(info['Last_IO_Error']); + return; + } + + if (info['Last_SQL_Error'] != ''){ + copyText(info['Last_SQL_Error']); + return; + } + + if (info['Slave_SQL_Running_State'] != ''){ + copyText(info['Slave_SQL_Running_State']); + return; + } } }); }); @@ -2320,14 +2415,12 @@ function masterOrSlaveConf(version=''){ }); } - - function getMasterStatus(){ myPost('get_master_status', '', function(rdata){ var rdata = $.parseJSON(rdata.data); // console.log('mode:',rdata.data); if ( typeof(rdata.status) != 'undefined' && !rdata.status && rdata.data == 'pwd'){ - layer.msg(rdata.msg, {icon:2}); + layer.msg(rdata.msg, {icon:2,time:2000}); return; } @@ -2409,7 +2502,6 @@ function masterOrSlaveConf(version=''){ return false; }, change:function(index,mode,reload){ - console.log(index,mode,reload); myPost('set_dbrun_mode',{'mode':mode,'reload':reload},function(data){ layer.close(index); var rdata = $.parseJSON(data.data); @@ -2425,10 +2517,8 @@ function masterOrSlaveConf(version=''){ getMasterDbList(); } - // if (rdata.slave_status){ - getAsyncMasterDbList(); - getAsyncDataList() - // } + getAsyncMasterDbList(); + getAsyncDataList() }); } getMasterStatus(); diff --git a/plugins/memcached/index.py b/plugins/memcached/index.py index fe7620775..a3d379fad 100755 --- a/plugins/memcached/index.py +++ b/plugins/memcached/index.py @@ -14,6 +14,10 @@ if mw.isAppleSystem(): app_debug = True +import warnings +warnings.filterwarnings('ignore', category=DeprecationWarning) + + def getPluginName(): return 'memcached'