diff --git a/plugins/mysql-yum/js/mysql-yum.js b/plugins/mysql-yum/js/mysql-yum.js index f1d5c44de..c06faa24a 100755 --- a/plugins/mysql-yum/js/mysql-yum.js +++ b/plugins/mysql-yum/js/mysql-yum.js @@ -1,18 +1,9 @@ -function str2Obj(str){ - var data = {}; - kv = str.split('&'); - for(i in kv){ - v = kv[i].split('='); - data[v[0]] = v[1]; - } - return data; -} function myPost(method,args,callback, title){ var _args = null; if (typeof(args) == 'string'){ - _args = JSON.stringify(str2Obj(args)); + _args = JSON.stringify(toArrayObject(args)); } else { _args = JSON.stringify(args); } @@ -40,7 +31,7 @@ function myPostN(method,args,callback, title){ var _args = null; if (typeof(args) == 'string'){ - _args = JSON.stringify(str2Obj(args)); + _args = JSON.stringify(toArrayObject(args)); } else { _args = JSON.stringify(args); } @@ -59,7 +50,7 @@ function myPostN(method,args,callback, title){ function myAsyncPost(method,args){ var _args = null; if (typeof(args) == 'string'){ - _args = JSON.stringify(str2Obj(args)); + _args = JSON.stringify(toArrayObject(args)); } else { _args = JSON.stringify(args); } @@ -68,6 +59,25 @@ function myAsyncPost(method,args){ return syncPost('/plugins/run', {name:'mysql-yum', func:method, args:_args}); } +function vaildPhpmyadmin(url,username,password){ + // console.log("Authorization: Basic " + btoa(username + ":" + password)); + $.ajax({ + type: "GET", + url: url, + dataType: 'json', + async: false, + username:username, + password:password, + headers: { + "Authorization": "Basic " + btoa(username + ":" + password) + }, + data: 'vaild', + success: function (){ + alert('Thanks for your comment!'); + } + }); +} + function runInfo(){ myPost('run_info','',function(data){ @@ -77,6 +87,7 @@ function runInfo(){ return; } + // Com_select , Qcache_inserts var cache_size = ((parseInt(rdata.Qcache_hits) / (parseInt(rdata.Qcache_hits) + parseInt(rdata.Qcache_inserts))) * 100).toFixed(2) + '%'; if (cache_size == 'NaN%') cache_size = 'OFF'; var Con = '
\ @@ -184,6 +195,12 @@ function myPerfOpt() { //获取MySQL配置 myPost('db_status','',function(data){ var rdata = $.parseJSON(data.data); + if ( typeof(rdata.status) != 'undefined' && !rdata.status){ + layer.msg(rdata.msg, {icon:2}); + return; + } + + // console.log(rdata); var key_buffer_size = toSizeM(rdata.mem.key_buffer_size); var query_cache_size = toSizeM(rdata.mem.query_cache_size); @@ -248,7 +265,7 @@ function myPerfOpt() { } function reBootMySqld(){ - pluginOpService('mysql','restart',''); + pluginOpService('mysql-apt','restart',''); } @@ -445,10 +462,9 @@ function syncToDatabase(type){ function setRootPwd(type, pwd){ if (type==1){ - var data = $("#mod_pwd").serialize(); - myPost('set_root_pwd', data, function(data){ + var password = $("#MyPassword").val(); + myPost('set_root_pwd', {password:password}, function(data){ var rdata = $.parseJSON(data.data); - // console.log(rdata); showMsg(rdata.msg,function(){ dbList(); $('.layui-layer-close1').click(); @@ -459,26 +475,23 @@ function setRootPwd(type, pwd){ var index = layer.open({ type: 1, - skin: 'demo-class', area: '500px', title: '修改数据库密码', closeBtn: 1, shift: 5, + btn:["提交","关闭"], shadeClose: true, - content: "\ + content: "\
\ - root密码\ -
\ -
\ -
\ - \ - \ + root密码\ +
\ + \ +
\
\ ", - }); - - $('#my_mod_close').click(function(){ - $('.layui-layer-close1').click(); + yes:function(){ + setRootPwd(1); + } }); } @@ -526,6 +539,17 @@ function checkSelect(){ },5) } +function setDbRw(id,username,val){ + myPost('set_db_rw',{id:id,username:username,rw:val}, function(data){ + var rdata = $.parseJSON(data.data); + // layer.msg(rdata.msg,{icon:rdata.status ? 1 : 5,shade: [0.3, '#000']}); + showMsg(rdata.msg, function(){ + dbList(); + },{icon:rdata.status ? 1 : 5,shade: [0.3, '#000']}, 2000); + + }); +} + function setDbAccess(username){ myPost('get_db_access','username='+username, function(data){ var rdata = $.parseJSON(data.data); @@ -540,8 +564,9 @@ function setDbAccess(username){ title: '设置数据库权限', closeBtn: 1, shift: 5, + btn:["提交","取消"], shadeClose: true, - content: "\ + content: "\
\ 访问权限\
\ @@ -552,139 +577,115 @@ function setDbAccess(username){ \
\
\ -
\ - \ - \ -
\ ", - }); - - layer.ready(function(){ - if (rdata.msg == '127.0.0.1'){ - $('select[name="dataAccess"]').find("option[value='127.0.0.1']").attr("selected",true); - } else if (rdata.msg == '%'){ - $('select[name="dataAccess"]').find('option[value="%"]').attr("selected",true); - } else if ( rdata.msg == 'ip' ){ - $('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); - $('select[name="dataAccess"]').after(""); - } else { - $('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); - $('select[name="dataAccess"]').after(""); - } - }); - - $('#my_mod_close').click(function(){ - $('.layui-layer-close1').click(); - }); - - - $('select[name="dataAccess"]').change(function(){ - var v = $(this).val(); - if (v == 'ip'){ - $(this).after(""); - } else { - $('#dataAccess_subid').remove(); - } - }); + success:function(){ + if (rdata.msg == '127.0.0.1'){ + $('select[name="dataAccess"]').find("option[value='127.0.0.1']").attr("selected",true); + } else if (rdata.msg == '%'){ + $('select[name="dataAccess"]').find('option[value="%"]').attr("selected",true); + } else if ( rdata.msg == 'ip' ){ + $('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); + $('select[name="dataAccess"]').after(""); + } else { + $('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); + $('select[name="dataAccess"]').after(""); + } - $('#my_mod_save').click(function(){ - var data = $("#set_db_access").serialize(); - data = decodeURIComponent(data); - var dataObj = str2Obj(data); - if(!dataObj['access']){ - dataObj['access'] = dataObj['dataAccess']; - if ( dataObj['dataAccess'] == 'ip'){ - if (dataObj['address']==''){ - layer.msg('IP地址不能空!',{icon:2,shade: [0.3, '#000']}); - return; + $('select[name="dataAccess"]').change(function(){ + var v = $(this).val(); + if (v == 'ip'){ + $(this).after(""); + } else { + $('#dataAccess_subid').remove(); + } + }); + }, + yes:function(index){ + var data = $("#set_db_access").serialize(); + data = decodeURIComponent(data); + var dataObj = toArrayObject(data); + if(!dataObj['access']){ + dataObj['access'] = dataObj['dataAccess']; + if ( dataObj['dataAccess'] == 'ip'){ + if (dataObj['address']==''){ + layer.msg('IP地址不能空!',{icon:2,shade: [0.3, '#000']}); + return; + } + dataObj['access'] = dataObj['address']; } - dataObj['access'] = dataObj['address']; } + dataObj['username'] = username; + myPost('set_db_access', dataObj, function(data){ + var rdata = $.parseJSON(data.data); + showMsg(rdata.msg,function(){ + layer.close(index); + dbList(); + },{icon: rdata.status ? 1 : 2}); + }); } - dataObj['username'] = username; - // console.log(data,dataObj); - myPost('set_db_access', dataObj, function(data){ - var rdata = $.parseJSON(data.data); - showMsg(rdata.msg,function(){ - dbList(); - $('.layui-layer-close1').click(); - },{icon: rdata.status ? 1 : 2}); - }); }); + }); } -function setDbPass(id, username, password){ +function fixDbAccess(username){ + myPost('fix_db_access', '', function(rdata){ + var rdata = $.parseJSON(rdata.data); + showMsg(rdata.msg,function(){ + dbList(); + },{icon: rdata.status ? 1 : 2}); + }); +} - var index = layer.open({ +function setDbPass(id, username, password){ + layer.open({ type: 1, - skin: 'demo-class', area: '500px', title: '修改数据库密码', closeBtn: 1, shift: 5, shadeClose: true, - content: "\ + btn:["提交","关闭"], + content: "\
\ 用户名\
\
\
\ 密码\ -
\ +
\ + \ +
\
\ \ -
\ - \ - \ -
\ ", - }); - - $('#my_mod_close').click(function(){ - $('.layui-layer-close1').click(); - }); - - $('#my_mod_save').click(function(){ - var data = $("#mod_pwd").serialize(); - myPost('set_user_pwd', data, function(data){ - var rdata = $.parseJSON(data.data); - showMsg(rdata.msg,function(){ - dbList(); - $('.layui-layer-close1').click(); - },{icon: rdata.status ? 1 : 2}); - }); + yes:function(index){ + // var data = $("#mod_pwd").serialize(); + var data = {}; + data['name'] = $('input[name=name]').val(); + data['password'] = $('#MyPassword').val(); + data['id'] = $('input[name=id]').val(); + myPost('set_user_pwd', data, function(data){ + var rdata = $.parseJSON(data.data); + showMsg(rdata.msg,function(){ + layer.close(index); + dbList(); + },{icon: rdata.status ? 1 : 2}); + }); + } }); } function addDatabase(type){ - if (type==1){ - var data = $("#add_db").serialize(); - data = decodeURIComponent(data); - var dataObj = str2Obj(data); - if(!dataObj['address']){ - dataObj['address'] = dataObj['dataAccess']; - } - myPost('add_db', dataObj, function(data){ - var rdata = $.parseJSON(data.data); - showMsg(rdata.msg,function(){ - if (rdata.status){ - dbList(); - } - $('.layui-layer-close1').click(); - },{icon: rdata.status ? 1 : 2},600); - }); - return; - } - var index = layer.open({ + layer.open({ type: 1, - skin: 'demo-class', area: '500px', title: '添加数据库', closeBtn: 1, shift: 5, shadeClose: true, - content: "\ + btn:["提交","关闭"], + content: "\
\ 数据库名\
\ @@ -712,28 +713,39 @@ function addDatabase(type){
\
\ \ -
\ - \ - \ -
\ ", - }); - - $("input[name='name']").keyup(function(){ - var v = $(this).val(); - $("input[name='db_user']").val(v); - $("input[name='ps']").val(v); - }); + success:function(){ + $("input[name='name']").keyup(function(){ + var v = $(this).val(); + $("input[name='db_user']").val(v); + $("input[name='ps']").val(v); + }); - $('#my_mod_close').click(function(){ - $('.layui-layer-close1').click(); - }); - $('select[name="dataAccess"]').change(function(){ - var v = $(this).val(); - if (v == 'ip'){ - $(this).after(""); - } else { - $('#dataAccess_subid').remove(); + $('select[name="dataAccess"]').change(function(){ + var v = $(this).val(); + if (v == 'ip'){ + $(this).after(""); + } else { + $('#dataAccess_subid').remove(); + } + }); + }, + yes:function(index) { + var data = $("#add_db").serialize(); + data = decodeURIComponent(data); + var dataObj = toArrayObject(data); + if(!dataObj['address']){ + dataObj['address'] = dataObj['dataAccess']; + } + myPost('add_db', dataObj, function(data){ + var rdata = $.parseJSON(data.data); + showMsg(rdata.msg,function(){ + if (rdata.status){ + layer.close(index); + dbList(); + } + },{icon: rdata.status ? 1 : 2},600); + }); } }); } @@ -745,7 +757,6 @@ function delDb(id, name){ var rdata = $.parseJSON(data.data); showMsg(rdata.msg,function(){ dbList(); - $('.layui-layer-close1').click(); },{icon: rdata.status ? 1 : 2}, 600); }); }); @@ -817,15 +828,26 @@ function openPhpmyadmin(name,username,password){ layer.msg('phpMyAdmin未启动',{icon:2,shade: [0.3, '#000']}); return; } - // console.log(data); + + data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_cfg'}); + var rdata = $.parseJSON(data.data); + if (rdata.choose != 'mysql-apt'){ + layer.msg('当前为['+rdata.choose+']模式,若要使用请切换模式.',{icon:2,shade: [0.3, '#000']}); + return; + } + + var phpmyadmin_cfg = rdata; data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_home_page'}); var rdata = $.parseJSON(data.data); if (!rdata.status){ layer.msg(rdata.msg,{icon:2,shade: [0.3, '#000']}); return; } - $("#toPHPMyAdmin").attr('action',rdata.data); + var home_page = rdata.data; + + home_page = home_page.replace("http://","http://"+phpmyadmin_cfg['username']+":"+phpmyadmin_cfg['password']+"@") + $("#toPHPMyAdmin").attr('action',home_page); if($("#toPHPMyAdmin").attr('action').indexOf('phpmyadmin') == -1){ layer.msg('请先安装phpMyAdmin',{icon:2,shade: [0.3, '#000']}); setTimeout(function(){ window.location.href = '/soft'; },3000); @@ -834,8 +856,8 @@ function openPhpmyadmin(name,username,password){ //检查版本 data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'version'}); - bigVer = data.data.split('.')[0] - if (bigVer>=5){ + bigVer = data.data.split('.')[0]; + if (bigVer>=4.5){ setTimeout(function(){ $("#toPHPMyAdmin").submit(); @@ -856,12 +878,14 @@ function openPhpmyadmin(name,username,password){ } } -function delBackup(filename,name){ - myPost('delete_db_backup',{filename:filename},function(){ +function delBackup(filename, name, path){ + if(typeof(path) == "undefined"){ + path = ""; + } + myPost('delete_db_backup',{filename:filename,path:path},function(){ layer.msg('执行成功!'); setTimeout(function(){ - $('.layui-layer-close2').click(); - setBackup(name); + setBackupReq(name); },2000); }); } @@ -877,9 +901,182 @@ function importBackup(file,name){ }); } -function setBackup(db_name,obj){ - myPost('get_db_backup_list', {name:db_name}, function(data){ +function importDbExternal(file,name){ + myPost('import_db_external',{file:file,name:name}, function(data){ + layer.msg('执行成功!'); + }); +} + +function setLocalImport(db_name){ + + //上传文件 + function uploadDbFiles(upload_dir){ + var up_db = layer.open({ + type:1, + closeBtn: 1, + title:"上传导入文件["+upload_dir+']', + area: ['500px','300px'], + shadeClose:false, + content:'
\ + \ + \ + \ + \ + \ + \ + 文件编码:\ + \ + \ + \ + \ +
', + success:function(){ + $('#filesClose').click(function(){ + layer.close(up_db); + }); + } + + }); + uploadStart(function(){ + getList(); + layer.close(up_db); + }); + } + + function getList(){ + myPost('get_db_backup_import_list',{}, function(data){ + var rdata = $.parseJSON(data.data); + + var file_list = rdata.data.list; + var upload_dir = rdata.data.upload_dir; + + var tbody = ''; + for (var i = 0; i < file_list.length; i++) { + tbody += '\ + \ + \ + \ + \ + '; + } + + $('#import_db_file_list').html(tbody); + $('input[name="upload_dir"]').val(upload_dir); + + $("#import_db_file_list .del").on('click',function(){ + var index = $(this).attr('index'); + var filename = file_list[index]["name"]; + myPost('delete_db_backup',{filename:filename,path:upload_dir},function(){ + showMsg('执行成功!', function(){ + getList(); + },{icon:1},2000); + }); + }); + }); + } + + var layerIndex = layer.open({ + type: 1, + title: "从文件导入数据", + area: ['600px', '380px'], + closeBtn: 1, + shadeClose: false, + content: '
\ +
\ + \ +
\ +
\ + \ +
\ +
' + file_list[i]['name'] + ' ' + file_list[i]['size'] + ' ' + file_list[i]['time'] + '\ + 导入 | \ + 删除\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
文件名称文件大小备份时间操作
\ +
\ + \ + \ + ', + success:function(index){ + $('#btn_file_upload').click(function(){ + var upload_dir = $('input[name="upload_dir"]').val(); + uploadDbFiles(upload_dir); + }); + + getList(); + }, + }); + + +} + +function setBackup(db_name){ + var layerIndex = layer.open({ + type: 1, + title: "数据库备份详情", + area: ['600px', '280px'], + closeBtn: 1, + shadeClose: false, + content: '
\ +
\ + \ + \ +
\ +
\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
文件名称文件大小备份时间操作
\ +
\ +
\ +
', + success:function(index){ + $('#btn_backup').click(function(){ + myPost('set_db_backup',{name:db_name}, function(data){ + showMsg('执行成功!', function(){ + setBackupReq(db_name); + }, {icon:1}, 2000); + }); + }); + + $('#btn_local_import').click(function(){ + setLocalImport(db_name); + }); + + setBackupReq(db_name); + }, + }); +} + + +function setBackupReq(db_name, obj){ + myPost('get_db_backup_list', {name:db_name}, function(data){ var rdata = $.parseJSON(data.data); var tbody = ''; for (var i = 0; i < rdata.data.length; i++) { @@ -894,49 +1091,10 @@ function setBackup(db_name,obj){ \ '; } - - var s = layer.open({ - type: 1, - title: "数据库备份详情", - area: ['600px', '280px'], - closeBtn: 2, - shadeClose: false, - content: '
\ -
\ - \ -
\ -
\ -
\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - ' + tbody + '\ -
文件名称文件大小备份时间操作
\ -
\ -
\ -
' - }); - - $('#btn_backup').click(function(){ - myPost('set_db_backup',{name:db_name}, function(data){ - layer.msg('执行成功!'); - - setTimeout(function(){ - layer.close(s); - setBackup(db_name,obj); - },2000); - }); - }); + $('#database_table tbody').html(tbody); }); } - function dbList(page, search){ var _data = {}; if (typeof(page) =='undefined'){ @@ -968,9 +1126,28 @@ function dbList(page, search){ list += ''+(rdata.data[i]['is_backup']?'备份':'未备份') +' | '; + var rw = ''; + var rw_change = 'all'; + if (typeof(rdata.data[i]['rw'])!='undefined'){ + var rw_val = '读写'; + if (rdata.data[i]['rw'] == 'all'){ + rw_val = "所有"; + rw_change = 'rw'; + } else if (rdata.data[i]['rw'] == 'rw'){ + rw_val = "读写"; + rw_change = 'r'; + } else if (rdata.data[i]['rw'] == 'r'){ + rw_val = "只读"; + rw_change = 'all'; + } + rw = ''+rw_val+' | '; + } + + list += '管理 | ' + '工具 | ' + '权限 | ' + + rw + '改密 | ' + '删除' + ''; @@ -983,6 +1160,7 @@ function dbList(page, search){ \ \ \ + \ \ \ \ @@ -1001,8 +1179,8 @@ function dbList(page, search){ '+ list +'\ \ \ -
\ -
\ +
\ +
\ 同步选中\ 同步所有\ 从服务器获取\ @@ -1031,12 +1209,20 @@ function myLogs(){ myPost('bin_log', {status:1}, function(data){ var rdata = $.parseJSON(data.data); + var line_status = "" + if (rdata.status){ + line_status = '\ + '; + } else { + line_status = ''; + } + var limitCon = '

\ 二进制日志 ' + toSize(rdata.msg) + '\ - \ -

错误日志

\ + '+line_status+'\ +

错误日志

\ \ -

' +

'; $(".soft-man-con").html(limitCon); //设置二进制日志 @@ -1044,10 +1230,15 @@ function myLogs(){ myPost('bin_log', 'close=change', function(data){ var rdata = $.parseJSON(data.data); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 }); - - setTimeout(function(){ - myLogs(); - }, 2000); + setTimeout(function(){myLogs();}, 2000); + }); + }); + + $(".clean-btn-bin").click(function () { + myPost('clean_bin_log', '', function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 }); + setTimeout(function(){myLogs();}, 2000); }); }); @@ -1056,10 +1247,7 @@ function myLogs(){ myPost('error_log', 'close=1', function(data){ var rdata = $.parseJSON(data.data); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 }); - - setTimeout(function(){ - myLogs(); - }, 2000); + setTimeout(function(){myLogs();}, 2000); }); }) @@ -1071,7 +1259,7 @@ function myLogs(){ } else { error_body = rdata.msg; } - $("#error_log").text(error_body); + $("#error_log").html(error_body); var ob = document.getElementById('error_log'); ob.scrollTop = ob.scrollHeight; }); @@ -1183,7 +1371,7 @@ function repTools(db_name, res){ type: 1, title: "MySQL工具箱【" + db_name + "】", area: ['780px', '580px'], - closeBtn: 2, + closeBtn: 1, shadeClose: false, content: '
\
\ @@ -1243,88 +1431,65 @@ function setDbSlave(name){ function addMasterRepSlaveUser(){ - - - var index = layer.open({ + layer.open({ type: 1, - skin: 'demo-class', area: '500px', title: '添加同步账户', closeBtn: 1, shift: 5, shadeClose: true, - content: "
\ + btn:["提交","取消"], + content: "\
用户名
\
\ 密码\
\
\ \ -
\ - \ - \ -
\
", - }); - - //
\ - // 访问权限\ - //
\ - // \ - //
\ - //
\ - - $("input[name='name']").keyup(function(){ - var v = $(this).val(); - $("input[name='db_user']").val(v); - $("input[name='ps']").val(v); - }); - - $('#my_mod_close').click(function(){ - $('.layui-layer-close1').click(); - }); - $('select[name="dataAccess"]').change(function(){ - var v = $(this).val(); - if (v == 'ip'){ - $(this).after(""); - } else { - $('#dataAccess_subid').remove(); - } - }); + success:function(){ + $("input[name='name']").keyup(function(){ + var v = $(this).val(); + $("input[name='db_user']").val(v); + $("input[name='ps']").val(v); + }); - $('#submit_add_master').click(function(){ + $('select[name="dataAccess"]').change(function(){ + var v = $(this).val(); + if (v == 'ip'){ + $(this).after(""); + } else { + $('#dataAccess_subid').remove(); + } + }); + }, + yes:function(index){ + var data = $("#add_master").serialize(); + data = decodeURIComponent(data); + var dataObj = toArrayObject(data); + if(!dataObj['address']){ + dataObj['address'] = dataObj['dataAccess']; + } - var data = $("#add_master").serialize(); - data = decodeURIComponent(data); - var dataObj = str2Obj(data); - if(!dataObj['address']){ - dataObj['address'] = dataObj['dataAccess']; + myPost('add_master_rep_slave_user', dataObj, function(data){ + var rdata = $.parseJSON(data.data); + showMsg(rdata.msg,function(){ + layer.close(index); + if (rdata.status){ + getMasterRepSlaveList(); + } + },{icon: rdata.status ? 1 : 2},600); + }); } - // console.log(dataObj); - myPost('add_master_rep_slave_user', dataObj, function(data){ - var rdata = $.parseJSON(data.data); - showMsg(rdata.msg,function(){ - if (rdata.status){ - getMasterRepSlaveList(); - } - $('.layui-layer-close1').click(); - },{icon: rdata.status ? 1 : 2},600); - }); }); } function updateMasterRepSlaveUser(username){ - - + var index = layer.open({ type: 1, - skin: 'demo-class', area: '500px', title: '更新账户', closeBtn: 1, @@ -1346,8 +1511,7 @@ function updateMasterRepSlaveUser(username){ $('#submit_update_master').click(function(){ var data = $("#update_master").serialize(); data = decodeURIComponent(data); - var dataObj = str2Obj(data); - // console.log(dataObj); + var dataObj = toArrayObject(data); myPost('update_master_rep_slave_user', data, function(data){ var rdata = $.parseJSON(data.data); showMsg(rdata.msg,function(){ @@ -1369,22 +1533,24 @@ function getMasterRepSlaveUserCmd(username, db=''){ return; } - + var cmd = rdata.data['cmd']; + var loadOpen = layer.open({ type: 1, title: '同步命令', area: '500px', content:"
\ -
"+rdata.data+"
\ +
"+cmd+"
\
\ \
\
", }); - copyPass(rdata.data); + + copyPass(cmd); $('.class-copy-cmd').click(function(){ - copyPass(rdata.data); + copyPass(cmd); }); }); } @@ -1402,6 +1568,84 @@ function delMasterRepSlaveUser(username){ }); } + +function setDbMasterAccess(username){ + myPost('get_db_access','username='+username, function(data){ + var rdata = $.parseJSON(data.data); + if (!rdata.status){ + layer.msg(rdata.msg,{icon:2,shade: [0.3, '#000']}); + return; + } + + var index = layer.open({ + type: 1, + area: '500px', + title: '设置数据库权限', + closeBtn: 1, + shift: 5, + btn:["提交","取消"], + shadeClose: true, + content: "
\ +
\ + 访问权限\ +
\ + \ +
\ +
\ +
", + success:function(){ + if (rdata.msg == '127.0.0.1'){ + $('select[name="dataAccess"]').find("option[value='127.0.0.1']").attr("selected",true); + } else if (rdata.msg == '%'){ + $('select[name="dataAccess"]').find('option[value="%"]').attr("selected",true); + } else if ( rdata.msg == 'ip' ){ + $('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); + $('select[name="dataAccess"]').after(""); + } else { + $('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); + $('select[name="dataAccess"]').after(""); + } + + $('select[name="dataAccess"]').change(function(){ + var v = $(this).val(); + if (v == 'ip'){ + $(this).after(""); + } else { + $('#dataAccess_subid').remove(); + } + }); + }, + yes:function(index){ + var data = $("#set_db_access").serialize(); + data = decodeURIComponent(data); + var dataObj = toArrayObject(data); + if(!dataObj['access']){ + dataObj['access'] = dataObj['dataAccess']; + if ( dataObj['dataAccess'] == 'ip'){ + if (dataObj['address']==''){ + layer.msg('IP地址不能空!',{icon:2,shade: [0.3, '#000']}); + return; + } + dataObj['access'] = dataObj['address']; + } + } + dataObj['username'] = username; + myPost('set_dbmaster_access', dataObj, function(data){ + var rdata = $.parseJSON(data.data); + showMsg(rdata.msg,function(){ + layer.close(index); + },{icon: rdata.status ? 1 : 2}); + }); + } + }); + + }); +} + function getMasterRepSlaveList(){ var _data = {}; if (typeof(page) =='undefined'){ @@ -1429,30 +1673,37 @@ function getMasterRepSlaveList(){ \ 修改 | \ 删除 | \ + 权限 | \ 从库同步命令\ \ '; } - var page = '
'; - page += '
添加同步账户
'; + $('#get_master_rep_slave_list_page tbody').html(list); + $('.dataTables_paginate_4').html(rdata['page']); + }); +} - var loadOpen = layer.open({ - type: 1, - title: '同步账户列表', - area: '500px', - content:"
\ -
\ -
\ - \ - " + list + "\ -
用户民密码操作
\ - "+page +"\ -
\ -
" - }); +function getMasterRepSlaveListPage(){ + var page = '
'; + page += '
添加同步账户
'; - $('.dataTables_paginate_4').html(rdata['page']); + var loadOpen = layer.open({ + type: 1, + title: '同步账户列表', + area: '500px', + content:"
\ +
\ +
\ + \ + \ +
用户名密码操作
\ + "+page +"\ +
\ +
", + success:function(){ + getMasterRepSlaveList(); + } }); } @@ -1460,18 +1711,17 @@ function getMasterRepSlaveList(){ function deleteSlave(){ myPost('delete_slave', {}, function(data){ var rdata = $.parseJSON(data.data); - layer.msg(rdata['msg']); - setTimeout(function(){ + showMsg(rdata['msg'], function(){ masterOrSlaveConf(); - }, 3000); - + },{},3000); }); } function getFullSyncStatus(db){ + var timeId = null; - var btn = '
开始
'; + var btn = '
开始
'; var loadOpen = layer.open({ type: 1, title: '全量同步['+db+']', @@ -1484,13 +1734,12 @@ function getFullSyncStatus(db){
\
\ "+btn+"\ -
" +
", + cancel: function(){ + clearInterval(timeId); + } }); - var timeId = setInterval(function(){ - fullSync(db,0); - }, 1000); - function fullSync(db,begin){ myPostN('full_sync', {db:db,begin:begin}, function(data){ @@ -1502,40 +1751,194 @@ function getFullSyncStatus(db){ if (rdata['code']==6 ||rdata['code']<0){ layer.msg(rdata['msg']); clearInterval(timeId); + $("#begin_full_sync").attr('data-status','init'); } }); } - fullSync(db,0); $('#begin_full_sync').click(function(){ - fullSync(db,1); + 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=''){ + + myPost('get_slave_ssh_by_ip', {ip:ip}, function(rdata){ + + var rdata = $.parseJSON(rdata.data); + + var ip = '127.0.0.1'; + var port = "22"; + var id_rsa = ''; + var db_user =''; + + if (rdata.data.length>0){ + ip = rdata.data[0]['ip']; + port = rdata.data[0]['port']; + id_rsa = rdata.data[0]['id_rsa']; + db_user = rdata.data[0]['db_user']; + } - timeId= setTimeout(function(){ - fullSync(db,0); - }, 1000); + var index = layer.open({ + type: 1, + area: ['500px','480px'], + title: '添加SSH', + closeBtn: 1, + shift: 5, + shadeClose: true, + btn:["确认","取消"], + content: "
\ +
IP
\ +
端口
\ +
同步账户[DB]
\ +
\ + ID_RSA\ +
\ +
\ + \ +
", + success:function(){ + $('textarea[name="id_rsa"]').html(id_rsa); + }, + yes:function(index){ + var ip = $('input[name="ip"]').val(); + var port = $('input[name="port"]').val(); + var db_user = $('input[name="db_user"]').val(); + var id_rsa = $('textarea[name="id_rsa"]').val(); + + var data = {ip:ip,port:port,id_rsa:id_rsa,db_user:db_user}; + myPost('add_slave_ssh', data, function(data){ + layer.close(index); + var rdata = $.parseJSON(data.data); + showMsg(rdata.msg,function(){ + if (rdata.status){ + getSlaveSSHPage(); + } + },{icon: rdata.status ? 1 : 2},600); + }); + } + }); }); +} + - $('.layui-layer-close1').click(function(){ - clearInterval(timeId); +function delSlaveSSH(ip){ + myPost('del_slave_ssh', {ip:ip}, function(rdata){ + var rdata = $.parseJSON(rdata.data); + layer.msg(rdata.msg, {icon: rdata.status ? 1 : 2}); + getSlaveSSHPage(); }); } -function handlerRun(){ - cmd = 'cd /www/server/mdserver-web && python /www/server/mdserver-web/plugins/mysql/index.py do_full_sync {"db":"all"}'; - var loadOpen = layer.open({ +function getSlaveSSHPage(page=1){ + var _data = {}; + _data['page'] = page; + _data['page_size'] = 5; + _data['tojs'] ='getSlaveSSHPage'; + myPost('get_slave_ssh_list', _data, function(data){ + var layerId = null; + var rdata = []; + try { + rdata = $.parseJSON(data.data); + } catch(e) { + console.log(e); + } + var list = ''; + var ssh_list = rdata['data']; + for (i in ssh_list) { + var ip = ssh_list[i]['ip']; + var port = ssh_list[i]['port']; + + var id_rsa = '未设置'; + if ( ssh_list[i]['port'] != ''){ + id_rsa = '已设置'; + } + + var db_user = '未设置'; + if ( ssh_list[i]['db_user'] != ''){ + db_user = ssh_list[i]['db_user']; + } + + list += ''+ip+'\ + '+port+'\ + '+db_user+'\ + '+id_rsa+'\ + \ + 修改 | \ + 删除\ + \ + '; + } + + $('.get-slave-ssh-list tbody').html(list); + $('.dataTables_paginate_4').html(rdata['page']); + }); +} + + +function getSlaveSSHList(page=1){ + + var page = '
'; + page += '
添加SSH
'; + + layerId = layer.open({ type: 1, - title: '手动执行', + title: 'SSH列表', area: '500px', - content:"
\ -
"+cmd+"
\ -
\ - \ -
\ -
", + content:"
\ +
\ +
\ + \ + \ +
IPPORT同步账户SSH操作
\ + "+page +"\ +
\ +
", + success:function(){ + getSlaveSSHPage(1); + } }); - copyPass(cmd); - $('.class-copy-cmd').click(function(){ +} + +function handlerRun(){ + myPostN('get_slave_sync_cmd', {}, function(data){ + var rdata = $.parseJSON(data.data); + var cmd = rdata['data']; + var loadOpen = layer.open({ + type: 1, + title: '手动执行', + area: '500px', + content:"
\ +
"+cmd+"
\ +
\ + \ +
\ +
", + }); copyPass(cmd); + $('.class-copy-cmd').click(function(){ + copyPass(cmd); + }); + }); +} + +function initSlaveStatus(){ + myPost('init_slave_status', '', function(data){ + var rdata = $.parseJSON(data.data); + showMsg(rdata.msg,function(){ + if (rdata.status){ + masterOrSlaveConf(); + } + },{icon:rdata.status?1:2},2000); }); } @@ -1576,8 +1979,8 @@ function masterOrSlaveConf(version=''){ \ \
\ -
\ - 同步账户列表\ +
\ + 同步账户列表\
\
'; @@ -1599,6 +2002,13 @@ function masterOrSlaveConf(version=''){ var rdata = $.parseJSON(data.data); var list = ''; for(i in rdata.data){ + + var v = rdata.data[i]; + 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'] +''; @@ -1606,6 +2016,7 @@ function masterOrSlaveConf(version=''){ list += '' + rdata.data[i]['Master_Log_File'] +''; list += '' + rdata.data[i]['Slave_IO_Running'] +''; list += '' + rdata.data[i]['Slave_SQL_Running'] +''; + list += '' + status +''; list += '' + '删除' + ''; @@ -1622,6 +2033,7 @@ function masterOrSlaveConf(version=''){ 日志\ IO\ SQL\ + 状态\ 操作\ \ '+ list +'\ @@ -1653,7 +2065,7 @@ function masterOrSlaveConf(version=''){ list += '' + rdata.data[i]['name'] +''; list += '' + ''+(rdata.data[i]['slave']?'退出':'加入')+' | ' + - '修复' + + '同步' + ''; list += ''; } @@ -1669,7 +2081,7 @@ function masterOrSlaveConf(version=''){ \ \
\ -
\ +
\ 手动命令\ 全量同步\
\ @@ -1680,20 +2092,41 @@ function masterOrSlaveConf(version=''){ }); } + + function getMasterStatus(){ - myPost('get_master_status', '', function(data){ - var rdata = $.parseJSON(data.data); - var limitCon = '

\ + 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}); + return; + } + + var rdata = rdata.data; + var limitCon = '\ +

\ + 主从同步模式\ + \ + \ +

\ +
\ +

\ Master[主]配置\ -


\ + \

\ +
\ \
\
\ + \

\ Slave[从]配置\ -


\ + \ + \ + \

\ +
\ \
\ \ @@ -1722,11 +2155,49 @@ function masterOrSlaveConf(version=''){ }); }); + $('.db-mode').click(function(){ + if ($(this).hasClass('btn-success')){ + //no action + return; + } + + var mode = 'classic'; + if ($(this).hasClass('btn-gtid')){ + mode = 'gtid'; + } + + layer.open({ + type:1, + title:"MySQL主从模式切换", + shadeClose:false, + btnAlign: 'c', + btn: ['切换并重启', '切换不重启'], + yes: function(index, layero){ + this.change(index,mode,"yes"); + + }, + btn2: function(index, layero){ + this.change(index,mode,"no"); + 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); + showMsg(rdata.msg ,function(){ + getMasterStatus(); + },{ icon: rdata.status ? 1 : 5 }); + }); + } + }); + }); + if (rdata.status){ getMasterDbList(); } - if (rdata.data.slave_status){ + if (rdata.slave_status){ getAsyncMasterDbList(); getAsyncDataList() }