mirror of
https://github.com/midoks/mdserver-web.git
synced 2026-10-20 08:25:50 +08:00
update
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
<p onclick="myPerfOpt();">性能优化</p>
|
||||
<p onclick="myLogs();">日志</p>
|
||||
<p onclick="pluginLogs('mysql-apt',$('.plugin_version').attr('version'),'show_log');">慢日志</p>
|
||||
<p onclick="myBinLogs();">BINLOG</p>
|
||||
<p onclick="dbList()">管理列表</p>
|
||||
<p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p>
|
||||
</div>
|
||||
|
||||
@@ -1302,21 +1302,87 @@ def setDbAccess():
|
||||
return mw.returnJson(True, '设置成功!')
|
||||
|
||||
|
||||
|
||||
def openSkipGrantTables():
|
||||
mycnf = getConf()
|
||||
content = mw.readFile(mycnf)
|
||||
content = content.replace('#skip-grant-tables','skip-grant-tables')
|
||||
mw.writeFile(mycnf, content)
|
||||
return True
|
||||
|
||||
def closeSkipGrantTables():
|
||||
mycnf = getConf()
|
||||
content = mw.readFile(mycnf)
|
||||
content = content.replace('skip-grant-tables','#skip-grant-tables')
|
||||
mw.writeFile(mycnf, content)
|
||||
return True
|
||||
|
||||
|
||||
def resetDbRootPwd(version):
|
||||
serverdir = getServerDir()
|
||||
myconf = serverdir + "/etc/my.cnf"
|
||||
pwd = mw.getRandomString(16)
|
||||
|
||||
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
|
||||
|
||||
if float(version) < 5.7:
|
||||
cmd_pass = serverdir + '/bin/usr/bin/mysql --defaults-file=' + myconf + ' -uroot -e'
|
||||
cmd_pass = cmd_pass + '"UPDATE mysql.user SET password=PASSWORD(\'' + pwd + "') WHERE user='root';"
|
||||
cmd_pass = cmd_pass + 'flush privileges;"'
|
||||
data = mw.execShell(cmd_pass)
|
||||
# print(data)
|
||||
else:
|
||||
auth_policy = getAuthPolicy()
|
||||
|
||||
reset_pwd = 'flush privileges;'
|
||||
reset_pwd = reset_pwd + \
|
||||
"UPDATE mysql.user SET authentication_string='' WHERE user='root';"
|
||||
reset_pwd = reset_pwd + "flush privileges;"
|
||||
reset_pwd = reset_pwd + \
|
||||
"alter user 'root'@'localhost' IDENTIFIED by '" + pwd + "';"
|
||||
reset_pwd = reset_pwd + \
|
||||
"alter user 'root'@'localhost' IDENTIFIED WITH "+auth_policy+" by '" + pwd + "';"
|
||||
reset_pwd = reset_pwd + "flush privileges;"
|
||||
|
||||
tmp_file = "/tmp/mysql_init_tmp.log"
|
||||
mw.writeFile(tmp_file, reset_pwd)
|
||||
cmd_pass = serverdir + '/bin/usr/bin/mysql --defaults-file=' + myconf + ' -uroot -proot < ' + tmp_file
|
||||
|
||||
data = mw.execShell(cmd_pass)
|
||||
# print(data)
|
||||
os.remove(tmp_file)
|
||||
return True
|
||||
|
||||
def fixDbAccess(version):
|
||||
try:
|
||||
|
||||
pdb = pMysqlDb()
|
||||
mdb_ddir = getDataDir()
|
||||
if not os.path.exists(mdb_ddir):
|
||||
return mw.returnJson(False, '数据目录不存在,尝试重启重建!')
|
||||
|
||||
try:
|
||||
data = pdb.query('show databases')
|
||||
isError = isSqlError(data)
|
||||
if isError != None:
|
||||
|
||||
# 重置密码
|
||||
appCMD(version, 'stop')
|
||||
mw.execShell("rm -rf " + getServerDir() + "/data")
|
||||
openSkipGrantTables()
|
||||
appCMD(version, 'start')
|
||||
|
||||
resetDbRootPwd(version)
|
||||
|
||||
appCMD(version, 'stop')
|
||||
closeSkipGrantTables()
|
||||
appCMD(version, 'start')
|
||||
|
||||
return mw.returnJson(True, '修复成功!')
|
||||
return mw.returnJson(True, '正常无需修复!')
|
||||
except Exception as e:
|
||||
return mw.returnJson(False, '修复失败请重试!')
|
||||
|
||||
|
||||
|
||||
def setDbRw(version=''):
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['username', 'id', 'rw'])
|
||||
|
||||
@@ -59,6 +59,62 @@ function myAsyncPost(method,args){
|
||||
return syncPost('/plugins/run', {name:'mysql-apt', func:method, args:_args});
|
||||
}
|
||||
|
||||
function myPostCallbak(method, version, args,callback){
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
|
||||
var req_data = {};
|
||||
req_data['name'] = 'mysql';
|
||||
req_data['func'] = method;
|
||||
req_data['script']='index_mysql_apt';
|
||||
args['version'] = version;
|
||||
|
||||
|
||||
if (typeof(args) == 'string' && args == ''){
|
||||
req_data['args'] = JSON.stringify(toArrayObject(args));
|
||||
} else {
|
||||
req_data['args'] = JSON.stringify(args);
|
||||
}
|
||||
|
||||
$.post('/plugins/callback', req_data, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function myPostCallbakN(method, version, args,callback){
|
||||
|
||||
var req_data = {};
|
||||
req_data['name'] = 'mysql';
|
||||
req_data['func'] = method;
|
||||
req_data['script']='index_mysql_apt';
|
||||
args['version'] = version;
|
||||
|
||||
|
||||
if (typeof(args) == 'string' && args == ''){
|
||||
req_data['args'] = JSON.stringify(toArrayObject(args));
|
||||
} else {
|
||||
req_data['args'] = JSON.stringify(args);
|
||||
}
|
||||
|
||||
$.post('/plugins/callback', req_data, function(data) {
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function vaildPhpmyadmin(url,username,password){
|
||||
// console.log("Authorization: Basic " + btoa(username + ":" + password));
|
||||
$.ajax({
|
||||
@@ -1189,6 +1245,146 @@ function dbList(page, search){
|
||||
});
|
||||
}
|
||||
|
||||
function myBinRollingLogs(_name, func, _args, line){
|
||||
|
||||
var file_line = 100;
|
||||
if ( typeof(line) != 'undefined' ){
|
||||
file_line = line;
|
||||
}
|
||||
|
||||
var reqTimer = null;
|
||||
|
||||
function requestLogs(func,file,line){
|
||||
myPostCallbakN(func,'',{'file':file,"line":line}, function(rdata){
|
||||
var data = rdata.data.data;
|
||||
var cmd = rdata.data.cmd;
|
||||
if(data == '') {
|
||||
data = '当前没有日志!';
|
||||
}
|
||||
|
||||
$('#my_rolling_cmd').html(cmd);
|
||||
|
||||
$('#my_rolling_copy').click(function(){
|
||||
copyText(cmd);
|
||||
});
|
||||
|
||||
var ebody = '<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log">'+data+'</textarea>';
|
||||
$("#my_rolling_logs").html(ebody);
|
||||
var ob = document.getElementById('roll_info_log');
|
||||
ob.scrollTop = ob.scrollHeight;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: _name + '日志',
|
||||
area: ['800px','700px'],
|
||||
end: function(){
|
||||
if (reqTimer){
|
||||
clearInterval(reqTimer);
|
||||
}
|
||||
},
|
||||
content:'<div class="change-default" style="padding:0px 20px 0px;">\
|
||||
<div class="divtable mtb10">\
|
||||
<table class="table table-hover"><tr>\
|
||||
<td id="my_rolling_cmd">cmd</td>\
|
||||
<td id="my_rolling_copy" style="width:35px;"><span class="ico-copy cursor btcopy" title="复制密码"></span></td>\
|
||||
<tr>\
|
||||
</table>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="change-default" style="padding:0px 20px 0px;" id="my_rolling_logs">\
|
||||
<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log"></textarea>\
|
||||
</div>',
|
||||
success:function(){
|
||||
var fileName = _args['file'];
|
||||
requestLogs(func,fileName,file_line);
|
||||
reqTimer = setInterval(function(){
|
||||
requestLogs(func,fileName,file_line);
|
||||
},1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function myBinLogsRender(page){
|
||||
var _data = {};
|
||||
if (typeof(page) =='undefined'){
|
||||
var page = 1;
|
||||
}
|
||||
|
||||
_data['page'] = page;
|
||||
_data['page_size'] = 10;
|
||||
_data['tojs'] = 'myBinLogsRender';
|
||||
myPost('binlog_list', _data, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
// console.log(rdata);
|
||||
var list = '';
|
||||
for(i in rdata.data){
|
||||
list += '<tr>';
|
||||
|
||||
list += '<td>' + rdata.data[i]['name'] +'</td>';
|
||||
list += '<td>' + toSize(rdata.data[i]['size'])+'</td>';
|
||||
list += '<td>' + rdata.data[i]['time'] +'</td>';
|
||||
|
||||
|
||||
list += '<td style="text-align:right">';
|
||||
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look" class="btlink">查看</a> | ';
|
||||
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look_decode" class="btlink">解码查看</a>';
|
||||
list += '</td></tr>';
|
||||
}
|
||||
|
||||
if (rdata.data.length ==0){
|
||||
list = '<tr><td colspan="4">无数据</td</tr>';
|
||||
}
|
||||
|
||||
$("#binlog_list tbody").html(list);
|
||||
$('#binlog_page').html(rdata.page);
|
||||
|
||||
|
||||
$('#binlog_list .look').click(function(){
|
||||
var i = $(this).data('index');
|
||||
var file = rdata.data[i]['name'];
|
||||
myBinRollingLogs('查看BINLOG','binLogListLook',{'file':file },100);
|
||||
});
|
||||
|
||||
$('#binlog_list .look_decode').click(function(){
|
||||
var i = $(this).data('index');
|
||||
var file = rdata.data[i]['name'];
|
||||
myBinRollingLogs('查看解码BINLOG','binLogListLookDecode',{'file':file },100);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function myBinLogs(){
|
||||
var con = '<div class="safe bgw">\
|
||||
<button class="btn btn-success btn-sm relay_trace" type="button" style="margin-right: 5px;">中继日志跟踪</button>\
|
||||
<button class="btn btn-default btn-sm binlog_trace" type="button" style="margin-right: 5px;">最新BINLOG日志跟踪</button>\
|
||||
<div id="binlog_list" class="divtable mtb10">\
|
||||
<div class="tablescroll">\
|
||||
<table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
|
||||
<thead><tr>\
|
||||
<th>文件名称</th>\
|
||||
<th>大小</th>\
|
||||
<th>时间</th>\
|
||||
<th style="text-align:right;">操作</th>\
|
||||
</tr></thead>\
|
||||
<tbody></tbody></table>\
|
||||
</div>\
|
||||
<div id="binlog_page" class="dataTables_paginate paging_bootstrap page"></div>\
|
||||
</div>\
|
||||
</div>';
|
||||
$(".soft-man-con").html(con);
|
||||
myBinLogsRender(1);
|
||||
|
||||
$('.soft-man-con .relay_trace').click(function(){
|
||||
myBinRollingLogs('中继日志跟踪','binLogListTraceRelay',{'file':''},100);
|
||||
});
|
||||
|
||||
$('.soft-man-con .binlog_trace').click(function(){
|
||||
myBinRollingLogs('最新BINLOG日志跟踪','binLogListTraceBinLog',{'file':''},100);
|
||||
});
|
||||
}
|
||||
|
||||
function myLogs(){
|
||||
|
||||
|
||||
Reference in New Issue
Block a user