|
|
|
@ -526,6 +526,17 @@ function checkSelect(){ |
|
|
|
|
},5) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function setDbRw(id,username,val){ |
|
|
|
|
myPost('get_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 +551,9 @@ function setDbAccess(username){ |
|
|
|
|
title: '设置数据库权限', |
|
|
|
|
closeBtn: 1, |
|
|
|
|
shift: 5, |
|
|
|
|
btn:["提交","取消"], |
|
|
|
|
shadeClose: true, |
|
|
|
|
content: "<form class='bt-form pd20 pb70' id='set_db_access'>\ |
|
|
|
|
content: "<form class='bt-form pd20' id='set_db_access'>\ |
|
|
|
|
<div class='line'>\ |
|
|
|
|
<span class='tname'>访问权限</span>\ |
|
|
|
|
<div class='info-r '>\ |
|
|
|
@ -552,65 +564,54 @@ function setDbAccess(username){ |
|
|
|
|
</select>\ |
|
|
|
|
</div>\ |
|
|
|
|
</div>\ |
|
|
|
|
<div class='bt-form-submit-btn'>\ |
|
|
|
|
<button id='my_mod_close' type='button' class='btn btn-danger btn-sm btn-title'>关闭</button>\ |
|
|
|
|
<button id='my_mod_save' type='button' class='btn btn-success btn-sm btn-title'>提交</button>\ |
|
|
|
|
</div>\ |
|
|
|
|
</form>", |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
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("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} else { |
|
|
|
|
$('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); |
|
|
|
|
$('select[name="dataAccess"]').after("<input value='"+rdata.msg+"' id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
$('#my_mod_close').click(function(){ |
|
|
|
|
$('.layui-layer-close1').click(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$('select[name="dataAccess"]').change(function(){ |
|
|
|
|
var v = $(this).val(); |
|
|
|
|
if (v == 'ip'){ |
|
|
|
|
$(this).after("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} 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("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} else { |
|
|
|
|
$('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); |
|
|
|
|
$('select[name="dataAccess"]').after("<input value='"+rdata.msg+"' id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$('#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("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} else { |
|
|
|
|
$('#dataAccess_subid').remove(); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
}, |
|
|
|
|
yes:function(index){ |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
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});
|
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -618,13 +619,13 @@ function setDbPass(id, username, password){ |
|
|
|
|
|
|
|
|
|
var index = layer.open({ |
|
|
|
|
type: 1, |
|
|
|
|
skin: 'demo-class', |
|
|
|
|
area: '500px', |
|
|
|
|
title: '修改数据库密码', |
|
|
|
|
closeBtn: 1, |
|
|
|
|
shift: 5, |
|
|
|
|
shadeClose: true, |
|
|
|
|
content: "<form class='bt-form pd20 pb70' id='mod_pwd'>\ |
|
|
|
|
btn:["提交","关闭"], |
|
|
|
|
content: "<form class='bt-form pd20' id='mod_pwd'>\ |
|
|
|
|
<div class='line'>\ |
|
|
|
|
<span class='tname'>用户名</span>\ |
|
|
|
|
<div class='info-r'><input readonly='readonly' name=\"name\" class='bt-input-text mr5' type='text' style='width:330px;outline:none;' value='"+username+"' /></div>\ |
|
|
|
@ -634,26 +635,17 @@ function setDbPass(id, username, password){ |
|
|
|
|
<div class='info-r'><input class='bt-input-text mr5' type='text' name='password' id='MyPassword' style='width:330px' value='"+password+"' /><span title='随机密码' class='glyphicon glyphicon-repeat cursor' onclick='repeatPwd(16)'></span></div>\ |
|
|
|
|
</div>\ |
|
|
|
|
<input type='hidden' name='id' value='"+id+"'>\ |
|
|
|
|
<div class='bt-form-submit-btn'>\ |
|
|
|
|
<button id='my_mod_close' type='button' class='btn btn-danger btn-sm btn-title'>关闭</button>\ |
|
|
|
|
<button id='my_mod_save' type='button' class='btn btn-success btn-sm btn-title'>提交</button>\ |
|
|
|
|
</div>\ |
|
|
|
|
</form>", |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
$('#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(); |
|
|
|
|
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});
|
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -968,9 +960,28 @@ function dbList(page, search){ |
|
|
|
|
|
|
|
|
|
list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\',this)" title="数据库备份">'+(rdata.data[i]['is_backup']?'备份':'未备份') +'</a> | '; |
|
|
|
|
|
|
|
|
|
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 = '<a href="javascript:;" class="btlink" onclick="setDbRw(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',\''+rw_change+'\')" title="设置读写">'+rw_val+'</a> | '; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
list += '<a href="javascript:;" class="btlink" onclick="openPhpmyadmin(\''+rdata.data[i]['name']+'\',\''+rdata.data[i]['username']+'\',\''+rdata.data[i]['password']+'\')" title="数据库管理">管理</a> | ' + |
|
|
|
|
'<a href="javascript:;" class="btlink" onclick="repTools(\''+rdata.data[i]['name']+'\')" title="MySQL优化修复工具">工具</a> | ' + |
|
|
|
|
'<a href="javascript:;" class="btlink" onclick="setDbAccess(\''+rdata.data[i]['username']+'\')" title="设置数据库权限">权限</a> | ' + |
|
|
|
|
rw + |
|
|
|
|
'<a href="javascript:;" class="btlink" onclick="setDbPass('+rdata.data[i]['id']+',\''+ rdata.data[i]['username'] +'\',\'' + rdata.data[i]['password'] + '\')">改密</a> | ' + |
|
|
|
|
'<a href="javascript:;" class="btlink" onclick="delDb(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\')" title="删除数据库">删除</a>' + |
|
|
|
|
'</td>'; |
|
|
|
@ -1034,9 +1045,9 @@ function myLogs(){ |
|
|
|
|
var line_status = "" |
|
|
|
|
if (rdata.status){ |
|
|
|
|
line_status = '<button class="btn btn-success btn-xs btn-bin va0">关闭</button>\ |
|
|
|
|
<button class="btn btn-success btn-xs clean-btn-bin va0">清理BINLOG日志</button>' |
|
|
|
|
<button class="btn btn-success btn-xs clean-btn-bin va0">清理BINLOG日志</button>'; |
|
|
|
|
} else { |
|
|
|
|
line_status = '<button class="btn btn-success btn-xs btn-bin va0">开启</button>' |
|
|
|
|
line_status = '<button class="btn btn-success btn-xs btn-bin va0">开启</button>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var limitCon = '<p class="conf_p">\ |
|
|
|
@ -1044,7 +1055,7 @@ function myLogs(){ |
|
|
|
|
'+line_status+'\ |
|
|
|
|
<p class="f14 c6 mtb10" style="border-top:#ddd 1px solid; padding:10px 0">错误日志<button class="btn btn-default btn-clear btn-xs" style="float:right;" >清理日志</button></p>\ |
|
|
|
|
<textarea readonly style="margin: 0px;width: 100%;height: 440px;background-color: #333;color:#fff; padding:0 5px" id="error_log"></textarea>\ |
|
|
|
|
</p>' |
|
|
|
|
</p>'; |
|
|
|
|
$(".soft-man-con").html(limitCon); |
|
|
|
|
|
|
|
|
|
//设置二进制日志
|
|
|
|
@ -1081,7 +1092,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; |
|
|
|
|
}); |
|
|
|
@ -1253,78 +1264,57 @@ 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: "<form class='bt-form pd20 pb70' id='add_master'>\ |
|
|
|
|
btn:["提交","取消"], |
|
|
|
|
content: "<form class='bt-form pd20' id='add_master'>\ |
|
|
|
|
<div class='line'><span class='tname'>用户名</span><div class='info-r'><input name='username' class='bt-input-text mr5' placeholder='用户名' type='text' style='width:330px;' value='"+(randomStrPwd(6))+"'></div></div>\ |
|
|
|
|
<div class='line'>\ |
|
|
|
|
<span class='tname'>密码</span>\ |
|
|
|
|
<div class='info-r'><input class='bt-input-text mr5' type='text' name='password' id='MyPassword' style='width:330px' value='"+(randomStrPwd(16))+"' /><span title='随机密码' class='glyphicon glyphicon-repeat cursor' onclick='repeatPwd(16)'></span></div>\ |
|
|
|
|
</div>\ |
|
|
|
|
<input type='hidden' name='ps' value='' />\ |
|
|
|
|
<div class='bt-form-submit-btn'>\ |
|
|
|
|
<button id='my_mod_close' type='button' class='btn btn-danger btn-sm btn-title'>关闭</button>\ |
|
|
|
|
<button type='button' class='btn btn-success btn-sm btn-title' id='submit_add_master' >提交</button>\ |
|
|
|
|
</div>\ |
|
|
|
|
</form>", |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// <div class='line'>\
|
|
|
|
|
// <span class='tname'>访问权限</span>\
|
|
|
|
|
// <div class='info-r '>\
|
|
|
|
|
// <select class='bt-input-text mr5' name='dataAccess' style='width:100px'>\
|
|
|
|
|
// <option value='127.0.0.1'>本地服务器</option>\
|
|
|
|
|
// <option value=\"%\">所有人</option>\
|
|
|
|
|
// <option value='ip'>指定IP</option>\
|
|
|
|
|
// </select>\
|
|
|
|
|
// </div>\
|
|
|
|
|
// </div>\
|
|
|
|
|
success:function(){ |
|
|
|
|
$("input[name='name']").keyup(function(){ |
|
|
|
|
var v = $(this).val(); |
|
|
|
|
$("input[name='db_user']").val(v); |
|
|
|
|
$("input[name='ps']").val(v); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
$("input[name='name']").keyup(function(){ |
|
|
|
|
var v = $(this).val(); |
|
|
|
|
$("input[name='db_user']").val(v); |
|
|
|
|
$("input[name='ps']").val(v); |
|
|
|
|
}); |
|
|
|
|
$('select[name="dataAccess"]').change(function(){ |
|
|
|
|
var v = $(this).val(); |
|
|
|
|
if (v == 'ip'){ |
|
|
|
|
$(this).after("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} else { |
|
|
|
|
$('#dataAccess_subid').remove(); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
}, |
|
|
|
|
yes:function(index){ |
|
|
|
|
var data = $("#add_master").serialize(); |
|
|
|
|
data = decodeURIComponent(data); |
|
|
|
|
var dataObj = str2Obj(data); |
|
|
|
|
if(!dataObj['address']){ |
|
|
|
|
dataObj['address'] = dataObj['dataAccess']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$('#my_mod_close').click(function(){ |
|
|
|
|
$('.layui-layer-close1').click(); |
|
|
|
|
}); |
|
|
|
|
$('select[name="dataAccess"]').change(function(){ |
|
|
|
|
var v = $(this).val(); |
|
|
|
|
if (v == 'ip'){ |
|
|
|
|
$(this).after("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} else { |
|
|
|
|
$('#dataAccess_subid').remove(); |
|
|
|
|
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); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
$('#submit_add_master').click(function(){ |
|
|
|
|
|
|
|
|
|
var data = $("#add_master").serialize(); |
|
|
|
|
data = decodeURIComponent(data); |
|
|
|
|
var dataObj = str2Obj(data); |
|
|
|
|
if(!dataObj['address']){ |
|
|
|
|
dataObj['address'] = dataObj['dataAccess']; |
|
|
|
|
} |
|
|
|
|
// 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); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1376,22 +1366,24 @@ function getMasterRepSlaveUserCmd(username, db=''){ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var cmd = rdata.data['cmd']; |
|
|
|
|
|
|
|
|
|
var loadOpen = layer.open({ |
|
|
|
|
type: 1, |
|
|
|
|
title: '同步命令', |
|
|
|
|
area: '500px', |
|
|
|
|
content:"<form class='bt-form pd20 pb70' id='add_master'>\ |
|
|
|
|
<div class='line'>"+rdata.data+"</div>\ |
|
|
|
|
<div class='line'>"+cmd+"</div>\ |
|
|
|
|
<div class='bt-form-submit-btn'>\ |
|
|
|
|
<button type='button' class='btn btn-success btn-sm btn-title class-copy-cmd'>复制</button>\ |
|
|
|
|
</div>\ |
|
|
|
|
</form>", |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
copyPass(rdata.data); |
|
|
|
|
|
|
|
|
|
copyPass(cmd); |
|
|
|
|
$('.class-copy-cmd').click(function(){ |
|
|
|
|
copyPass(rdata.data); |
|
|
|
|
copyPass(cmd); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
@ -1409,6 +1401,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: "<form class='bt-form pd20' id='set_db_access'>\ |
|
|
|
|
<div class='line'>\ |
|
|
|
|
<span class='tname'>访问权限</span>\ |
|
|
|
|
<div class='info-r '>\ |
|
|
|
|
<select class='bt-input-text mr5' name='dataAccess' style='width:100px'>\ |
|
|
|
|
<option value='127.0.0.1'>本地服务器</option>\ |
|
|
|
|
<option value=\"%\">所有人</option>\ |
|
|
|
|
<option value='ip'>指定IP</option>\ |
|
|
|
|
</select>\ |
|
|
|
|
</div>\ |
|
|
|
|
</div>\ |
|
|
|
|
</form>", |
|
|
|
|
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("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} else { |
|
|
|
|
$('select[name="dataAccess"]').find('option[value="ip"]').attr("selected",true); |
|
|
|
|
$('select[name="dataAccess"]').after("<input value='"+rdata.msg+"' id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$('select[name="dataAccess"]').change(function(){ |
|
|
|
|
var v = $(this).val(); |
|
|
|
|
if (v == 'ip'){ |
|
|
|
|
$(this).after("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>"); |
|
|
|
|
} else { |
|
|
|
|
$('#dataAccess_subid').remove(); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
}, |
|
|
|
|
yes:function(index){ |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
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'){ |
|
|
|
@ -1436,30 +1506,37 @@ function getMasterRepSlaveList(){ |
|
|
|
|
<td>\ |
|
|
|
|
<a class="btlink" onclick="updateMasterRepSlaveUser(\''+name+'\');">修改</a> | \ |
|
|
|
|
<a class="btlink" onclick="delMasterRepSlaveUser(\''+name+'\');">删除</a> | \ |
|
|
|
|
<a class="btlink" onclick="setDbMasterAccess(\''+name+'\');">权限</a> | \ |
|
|
|
|
<a class="btlink" onclick="getMasterRepSlaveUserCmd(\''+name+'\');">从库同步命令</a>\ |
|
|
|
|
</td>\ |
|
|
|
|
</tr>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var page = '<div class="dataTables_paginate_4 dataTables_paginate paging_bootstrap page" style="margin-top:0px;"></div>'; |
|
|
|
|
page += '<div class="table_toolbar" style="left:0px;"><span class="sync btn btn-default btn-sm" onclick="addMasterRepSlaveUser()" title="">添加同步账户</span></div>'; |
|
|
|
|
$('#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:"<div class='bt-form pd20 c6'>\ |
|
|
|
|
<div class='divtable mtb10'>\ |
|
|
|
|
<div><table class='table table-hover'>\ |
|
|
|
|
<thead><tr><th>用户名</th><th>密码</th><th>操作</th></tr></thead>\ |
|
|
|
|
<tbody>" + list + "</tbody>\ |
|
|
|
|
</table></div>\ |
|
|
|
|
"+page +"\ |
|
|
|
|
</div>\ |
|
|
|
|
</div>" |
|
|
|
|
}); |
|
|
|
|
function getMasterRepSlaveListPage(){ |
|
|
|
|
var page = '<div class="dataTables_paginate_4 dataTables_paginate paging_bootstrap page" style="margin-top:0px;"></div>'; |
|
|
|
|
page += '<div class="table_toolbar" style="left:0px;"><span class="sync btn btn-default btn-sm" onclick="addMasterRepSlaveUser()" title="">添加同步账户</span></div>'; |
|
|
|
|
|
|
|
|
|
$('.dataTables_paginate_4').html(rdata['page']); |
|
|
|
|
var loadOpen = layer.open({ |
|
|
|
|
type: 1, |
|
|
|
|
title: '同步账户列表', |
|
|
|
|
area: '500px', |
|
|
|
|
content:"<div class='bt-form pd20 c6'>\ |
|
|
|
|
<div class='divtable mtb10' id='get_master_rep_slave_list_page'>\ |
|
|
|
|
<div><table class='table table-hover'>\ |
|
|
|
|
<thead><tr><th>用户名</th><th>密码</th><th>操作</th></tr></thead>\ |
|
|
|
|
<tbody></tbody>\ |
|
|
|
|
</table></div>\ |
|
|
|
|
"+page +"\ |
|
|
|
|
</div>\ |
|
|
|
|
</div>", |
|
|
|
|
success:function(){ |
|
|
|
|
getMasterRepSlaveList(); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1467,11 +1544,9 @@ 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); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1537,16 +1612,18 @@ function addSlaveSSH(ip=''){ |
|
|
|
|
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']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var index = layer.open({ |
|
|
|
|
type: 1, |
|
|
|
|
area: ['500px','400px'], |
|
|
|
|
area: ['500px','480px'], |
|
|
|
|
title: '添加SSH', |
|
|
|
|
closeBtn: 1, |
|
|
|
|
shift: 5, |
|
|
|
@ -1554,19 +1631,24 @@ function addSlaveSSH(ip=''){ |
|
|
|
|
btn:["确认","取消"], |
|
|
|
|
content: "<form class='bt-form pd20'>\ |
|
|
|
|
<div class='line'><span class='tname'>IP</span><div class='info-r'><input name='ip' class='bt-input-text mr5' type='text' style='width:330px;' value='"+ip+"'></div></div>\ |
|
|
|
|
<div class='line'><span class='tname'>端口</span><div class='info-r'><input name='port' class='bt-input-text mr5' type='text' style='width:330px;' value='"+port+"'></div></div>\ |
|
|
|
|
<div class='line'><span class='tname'>端口</span><div class='info-r'><input name='port' class='bt-input-text mr5' type='number' style='width:330px;' value='"+port+"'></div></div>\ |
|
|
|
|
<div class='line'><span class='tname'>同步账户[DB]</span><div class='info-r'><input name='db_user' placeholder='为空则取第一个!' class='bt-input-text mr5' type='text' style='width:330px;' value='"+db_user+"'></div></div>\ |
|
|
|
|
<div class='line'>\ |
|
|
|
|
<span class='tname'>ID_RSA</span>\ |
|
|
|
|
<div class='info-r'><textarea class='bt-input-text mr5' row='20' cols='50' name='id_rsa' style='width:330px;height:200px;'>"+id_rsa+"</textarea></div>\ |
|
|
|
|
<div class='info-r'><textarea class='bt-input-text mr5' row='20' cols='50' name='id_rsa' style='width:330px;height:200px;'></textarea></div>\ |
|
|
|
|
</div>\ |
|
|
|
|
<input type='hidden' name='ps' value='' />\ |
|
|
|
|
</form>", |
|
|
|
|
success:function(){}, |
|
|
|
|
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}; |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
@ -1608,9 +1690,21 @@ function getSlaveSSHPage(page=1){ |
|
|
|
|
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 += '<tr><td>'+ip+'</td>\ |
|
|
|
|
<td>'+port+'</td>\ |
|
|
|
|
<td>OK</td>\ |
|
|
|
|
<td>'+db_user+'</td>\ |
|
|
|
|
<td>'+id_rsa+'</td>\ |
|
|
|
|
<td>\ |
|
|
|
|
<a class="btlink" onclick="addSlaveSSH(\''+ip+'\');">修改</a> | \ |
|
|
|
|
<a class="btlink" onclick="delSlaveSSH(\''+ip+'\');">删除</a>\ |
|
|
|
@ -1636,23 +1730,22 @@ function getSlaveSSHList(page=1){ |
|
|
|
|
content:"<div class='bt-form pd20 c6'>\ |
|
|
|
|
<div class='divtable mtb10'>\ |
|
|
|
|
<div><table class='table table-hover get-slave-ssh-list'>\ |
|
|
|
|
<thead><tr><th>IP</th><th>PORT</th><th>SSH</th><th>操作</th></tr></thead>\ |
|
|
|
|
<thead><tr><th>IP</th><th>PORT</th><th>同步账户</th><th>SSH</th><th>操作</th></tr></thead>\ |
|
|
|
|
<tbody></tbody>\ |
|
|
|
|
</table></div>\ |
|
|
|
|
"+page +"\ |
|
|
|
|
</div>\ |
|
|
|
|
</div>", |
|
|
|
|
success:function(){ |
|
|
|
|
getSlaveSSHPage(1); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
getSlaveSSHPage(1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function handlerRun(){ |
|
|
|
|
myPostN('get_slave_sync_cmd', {}, function(data){ |
|
|
|
|
var rdata = $.parseJSON(data.data); |
|
|
|
|
var cmd = rdata.data; |
|
|
|
|
var cmd = rdata['data']; |
|
|
|
|
var loadOpen = layer.open({ |
|
|
|
|
type: 1, |
|
|
|
|
title: '手动执行', |
|
|
|
@ -1671,6 +1764,17 @@ function handlerRun(){ |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function masterOrSlaveConf(version=''){ |
|
|
|
|
|
|
|
|
|
function getMasterDbList(){ |
|
|
|
@ -1709,7 +1813,7 @@ function masterOrSlaveConf(version=''){ |
|
|
|
|
</div>\ |
|
|
|
|
<div id="databasePage" class="dataTables_paginate paging_bootstrap page"></div>\ |
|
|
|
|
<div class="table_toolbar" style="left:0px;">\ |
|
|
|
|
<span class="sync btn btn-default btn-sm" onclick="getMasterRepSlaveList()" title="">同步账户列表</span>\ |
|
|
|
|
<span class="sync btn btn-default btn-sm" onclick="getMasterRepSlaveListPage()" title="">同步账户列表</span>\ |
|
|
|
|
</div>\ |
|
|
|
|
</div>'; |
|
|
|
|
|
|
|
|
@ -1813,7 +1917,6 @@ function masterOrSlaveConf(version=''){ |
|
|
|
|
<div class="table_toolbar" style="left:0px;">\ |
|
|
|
|
<span class="sync btn btn-default btn-sm" onclick="handlerRun()" title="免登录设置后,需要手动执行一下!">手动命令</span>\ |
|
|
|
|
<span class="sync btn btn-default btn-sm" onclick="getFullSyncStatus(\'ALL\')" title="全量同步">全量同步</span>\ |
|
|
|
|
<span class="sync btn btn-default btn-sm" onclick="getSlaveSSHList()" title="[主]SSH配置">[主]SSH配置</span>\ |
|
|
|
|
</div>\ |
|
|
|
|
</div>'; |
|
|
|
|
|
|
|
|
@ -1822,20 +1925,36 @@ function masterOrSlaveConf(version=''){ |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function getMasterStatus(){ |
|
|
|
|
myPost('get_master_status', '', function(data){ |
|
|
|
|
var rdata = $.parseJSON(data.data); |
|
|
|
|
var limitCon = '<p class="conf_p">\ |
|
|
|
|
// console.log('mode:',rdata.data);
|
|
|
|
|
var rdata = rdata.data; |
|
|
|
|
var limitCon = '\ |
|
|
|
|
<p class="conf_p">\ |
|
|
|
|
<span class="f14 c6 mr20">主从同步模式</span><span class="f14 c6 mr20"></span>\ |
|
|
|
|
<button class="btn '+(!(rdata.mode == "classic") ? 'btn-danger' : 'btn-success')+' btn-xs db-mode btn-classic">经典</button>\ |
|
|
|
|
<button class="btn '+(!(rdata.mode == "gtid") ? 'btn-danger' : 'btn-success')+' btn-xs db-mode btn-gtid">GTID</button>\ |
|
|
|
|
</p>\ |
|
|
|
|
<hr/>\ |
|
|
|
|
<p class="conf_p">\ |
|
|
|
|
<span class="f14 c6 mr20">Master[主]配置</span><span class="f14 c6 mr20"></span>\ |
|
|
|
|
<button class="btn '+(!rdata.status ? 'btn-danger' : 'btn-success')+' btn-xs btn-master va0">'+(!rdata.status ? '未开启' : '已开启') +'</button><hr/>\ |
|
|
|
|
<button class="btn '+(!rdata.status ? 'btn-danger' : 'btn-success')+' btn-xs btn-master">'+(!rdata.status ? '未开启' : '已开启') +'</button>\ |
|
|
|
|
</p>\ |
|
|
|
|
<hr/>\ |
|
|
|
|
<!-- master list -->\ |
|
|
|
|
<div class="safe bgw table_master_list"></div>\ |
|
|
|
|
<hr/>\ |
|
|
|
|
<!-- class="conf_p" -->\ |
|
|
|
|
<p class="conf_p">\ |
|
|
|
|
<span class="f14 c6 mr20">Slave[从]配置</span><span class="f14 c6 mr20"></span>\ |
|
|
|
|
<button class="btn '+(!rdata.data.slave_status ? 'btn-danger' : 'btn-success')+' btn-xs btn-slave va0">'+(!rdata.data.slave_status ? '未启动' : '已启动') +'</button><hr/>\ |
|
|
|
|
<button class="btn '+(!rdata.slave_status ? 'btn-danger' : 'btn-success')+' btn-xs btn-slave">'+(!rdata.slave_status ? '未启动' : '已启动') +'</button>\ |
|
|
|
|
<button class="btn btn-success btn-xs" onclick="getSlaveSSHList()" >[主]SSH配置</button>\ |
|
|
|
|
<button class="btn btn-success btn-xs" onclick="initSlaveStatus()" >初始化</button>\ |
|
|
|
|
</p>\ |
|
|
|
|
<hr/>\ |
|
|
|
|
<!-- slave status list -->\ |
|
|
|
|
<div class="safe bgw table_slave_status_list"></div>\ |
|
|
|
|
<!-- slave list -->\ |
|
|
|
@ -1864,11 +1983,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() |
|
|
|
|
} |
|
|
|
|