Merge pull request #244 from midoks/dev

#218
pull/253/head
Mr Chen 3 years ago committed by GitHub
commit d4fb0be60b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      README.md
  2. 148
      plugins/mariadb/index.py
  3. 289
      plugins/mariadb/js/mariadb.js
  4. 23
      plugins/mariadb/scripts/backup.py
  5. 2
      plugins/mariadb/versions/10.6/install.sh
  6. 2
      plugins/mariadb/versions/10.7/install.sh
  7. 2
      plugins/mariadb/versions/10.8/install.sh
  8. 2
      plugins/mariadb/versions/10.9/install.sh
  9. 42
      plugins/mysql/index.py
  10. 80
      plugins/mysql/js/mysql.js
  11. 2
      plugins/mysql/versions/5.5/install.sh
  12. 2
      plugins/mysql/versions/5.6/install.sh
  13. 2
      plugins/mysql/versions/5.7/install.sh
  14. 3
      plugins/mysql/versions/8.0/install.sh
  15. 2
      plugins/php/versions/53/install.sh
  16. 2
      plugins/php/versions/54/install.sh
  17. 2
      plugins/php/versions/55/install.sh
  18. 2
      plugins/php/versions/56/install.sh
  19. 2
      plugins/php/versions/70/install.sh
  20. 2
      plugins/php/versions/71/install.sh
  21. 2
      plugins/php/versions/72/install.sh
  22. 2
      plugins/php/versions/73/install.sh
  23. 2
      plugins/php/versions/74/install.sh
  24. 2
      plugins/php/versions/80/install.sh
  25. 2
      plugins/php/versions/81/install.sh
  26. 2
      plugins/php/versions/82/install.sh
  27. 59
      scripts/install/debian.sh
  28. 60
      scripts/install/ubuntu.sh
  29. 63
      scripts/lib.sh

@ -33,7 +33,7 @@
### 主要插件介绍 ### 主要插件介绍
* OpenResty - 轻量级,占有内存少,并发能力强。 * OpenResty - 轻量级,占有内存少,并发能力强。
* PHP[52-81] - PHP是世界上最好的编程语言。 * PHP[53-82] - PHP是世界上最好的编程语言。
* MySQL - 一种关系数据库管理系统。 * MySQL - 一种关系数据库管理系统。
* MariaDB - 是MySQL的一个重要分支。 * MariaDB - 是MySQL的一个重要分支。
* MongoDB - 一种非关系NOSQL数据库管理系统。 * MongoDB - 一种非关系NOSQL数据库管理系统。

@ -541,13 +541,17 @@ def setMyPort():
return mw.returnJson(True, '编辑成功!') return mw.returnJson(True, '编辑成功!')
def runInfo(): def runInfo(version):
if status(version) == 'stop': if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动', []) return mw.returnJson(False, 'MySQL未启动', [])
db = pMysqlDb() db = pMysqlDb()
data = db.query('show global status') data = db.query('show global status')
isError = isSqlError(data)
if isError != None:
return isError
gets = ['Max_used_connections', 'Com_commit', 'Com_rollback', 'Questions', 'Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests', 'Key_reads', 'Key_read_requests', 'Key_writes', gets = ['Max_used_connections', 'Com_commit', 'Com_rollback', 'Questions', 'Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests', 'Key_reads', 'Key_read_requests', 'Key_writes',
'Key_write_requests', 'Qcache_hits', 'Qcache_inserts', 'Bytes_received', 'Bytes_sent', 'Aborted_clients', 'Aborted_connects', 'Key_write_requests', 'Qcache_hits', 'Qcache_inserts', 'Bytes_received', 'Bytes_sent', 'Aborted_clients', 'Aborted_connects',
'Created_tmp_disk_tables', 'Created_tmp_tables', 'Innodb_buffer_pool_pages_dirty', 'Opened_files', 'Open_tables', 'Opened_tables', 'Select_full_join', 'Created_tmp_disk_tables', 'Created_tmp_tables', 'Innodb_buffer_pool_pages_dirty', 'Opened_files', 'Open_tables', 'Opened_tables', 'Select_full_join',
@ -628,7 +632,7 @@ def isSqlError(mysqlMsg):
if "2003," in mysqlMsg: if "2003," in mysqlMsg:
return mw.returnJson(False, "Can't connect to MySQL server on '127.0.0.1' (61)") return mw.returnJson(False, "Can't connect to MySQL server on '127.0.0.1' (61)")
if "using password:" in mysqlMsg: if "using password:" in mysqlMsg:
return mw.returnJson(False, '数据库管理密码错误!') return mw.returnJson(False, '数据库密码错误,在管理列表-点击【修复】!')
if "1045" in mysqlMsg: if "1045" in mysqlMsg:
return mw.returnJson(False, '连接错误!') return mw.returnJson(False, '连接错误!')
if "SQL syntax" in mysqlMsg: if "SQL syntax" in mysqlMsg:
@ -712,15 +716,82 @@ def importDbBackup():
return mw.returnJson(True, 'ok') return mw.returnJson(True, 'ok')
def importDbExternal():
args = getArgs()
data = checkArgs(args, ['file', 'name'])
if not data[0]:
return data[1]
file = args['file']
name = args['name']
import_dir = mw.getRootDir() + '/backup/import/'
file_path = import_dir + file
if not os.path.exists(file_path):
return mw.returnJson(False, '文件突然消失?')
exts = ['sql', 'gz', 'zip']
tmp = file.split('.')
ext = tmp[len(tmp) - 1]
if ext not in exts:
return mw.returnJson(False, '导入数据库格式不对!')
tmp = file.split('/')
tmpFile = tmp[len(tmp) - 1]
tmpFile = tmpFile.replace('.sql.' + ext, '.sql')
tmpFile = tmpFile.replace('.' + ext, '.sql')
tmpFile = tmpFile.replace('tar.', '')
# print(tmpFile)
import_sql = ""
if file.find("sql.gz") > -1:
cmd = 'cd ' + import_dir + ' && gzip -dc ' + \
file + " > " + import_dir + tmpFile
info = mw.execShell(cmd)
if info[1] == "":
import_sql = import_dir + tmpFile
if file.find(".zip") > -1:
cmd = 'cd ' + import_dir + ' && unzip -o ' + file
mw.execShell(cmd)
import_sql = import_dir + tmpFile
if file.find("tar.gz") > -1:
cmd = 'cd ' + import_dir + ' && tar -zxvf ' + file
mw.execShell(cmd)
import_sql = import_dir + tmpFile
if import_sql == "":
return mw.returnJson(False, '未找SQL文件')
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
sock = getSocketFile()
os.environ["MYSQL_PWD"] = pwd
mysql_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + \
pwd + ' ' + name + ' < ' + import_sql
# print(mysql_cmd)
os.system(mysql_cmd)
os.remove(import_sql)
return mw.returnJson(True, 'ok')
def deleteDbBackup(): def deleteDbBackup():
args = getArgs() args = getArgs()
data = checkArgs(args, ['filename']) data = checkArgs(args, ['filename', 'path'])
if not data[0]: if not data[0]:
return data[1] return data[1]
path = args['path']
full_file = ""
bkDir = mw.getRootDir() + '/backup/database' bkDir = mw.getRootDir() + '/backup/database'
full_file = bkDir + '/' + args['filename']
os.remove(bkDir + '/' + args['filename']) if path != "":
full_file = path + "/" + args['filename']
os.remove(full_file)
return mw.returnJson(True, 'ok') return mw.returnJson(True, 'ok')
@ -752,6 +823,39 @@ def getDbBackupList():
return mw.returnJson(True, 'ok', rr) return mw.returnJson(True, 'ok', rr)
def getDbBackupImportList():
bkImportDir = mw.getRootDir() + '/backup/import'
if not os.path.exists(bkImportDir):
os.mkdir(bkImportDir)
blist = os.listdir(bkImportDir)
rr = []
for x in range(0, len(blist)):
name = blist[x]
p = bkImportDir + '/' + name
data = {}
data['name'] = name
rsize = os.path.getsize(p)
data['size'] = mw.toSize(rsize)
t = os.path.getctime(p)
t = time.localtime(t)
data['time'] = time.strftime('%Y-%m-%d %H:%M:%S', t)
rr.append(data)
data['file'] = p
rdata = {
"list": rr,
"upload_dir": bkImportDir,
}
return mw.returnJson(True, 'ok', rdata)
def getDbList(): def getDbList():
args = getArgs() args = getArgs()
page = 1 page = 1
@ -1083,6 +1187,10 @@ def getDbAccess():
users = pdb.query("select Host from user where User='" + users = pdb.query("select Host from user where User='" +
username + "' AND Host!='localhost'") username + "' AND Host!='localhost'")
isError = isSqlError(users)
if isError != None:
return isError
if len(users) < 1: if len(users) < 1:
return mw.returnJson(True, "127.0.0.1") return mw.returnJson(True, "127.0.0.1")
accs = [] accs = []
@ -1122,6 +1230,22 @@ def setDbAccess():
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def fixDbAccess(version):
try:
pdb = pMysqlDb()
psdb = pSqliteDb('databases')
data = pdb.query('show databases')
isError = isSqlError(data)
if isError != None:
appCMD(version, 'stop')
mw.execShell("rm -rf " + getServerDir() + "/data")
appCMD(version, 'start')
return mw.returnJson(True, '修复成功!')
return mw.returnJson(True, '正常无需修复!')
except Exception as e:
return mw.returnJson(False, '修复失败请重试!')
def setDbRw(version=''): def setDbRw(version=''):
args = getArgs() args = getArgs()
data = checkArgs(args, ['username', 'id', 'rw']) data = checkArgs(args, ['username', 'id', 'rw'])
@ -1532,7 +1656,7 @@ def setDbSlave(version):
def getMasterStatus(version=''): def getMasterStatus(version=''):
try:
if status(version) == 'stop': if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动,或正在启动中...!', []) return mw.returnJson(False, 'MySQL未启动,或正在启动中...!', [])
@ -1556,6 +1680,8 @@ def getMasterStatus(version=''):
data['slave_status'] = True data['slave_status'] = True
return mw.returnJson(master_status, '设置成功', data) return mw.returnJson(master_status, '设置成功', data)
except Exception as e:
return mw.returnJson(False, "数据库密码错误,在管理列表-点击【修复】!")
def setMasterStatus(version=''): def setMasterStatus(version=''):
@ -2200,7 +2326,7 @@ def uninstallPreInspection(version):
if __name__ == "__main__": if __name__ == "__main__":
func = sys.argv[1] func = sys.argv[1]
version = "5.6" version = "10.6"
version_pl = getServerDir() + "/version.pl" version_pl = getServerDir() + "/version.pl"
if os.path.exists(version_pl): if os.path.exists(version_pl):
version = mw.readFile(version_pl).strip() version = mw.readFile(version_pl).strip()
@ -2226,7 +2352,7 @@ if __name__ == "__main__":
elif func == 'uninstall_pre_inspection': elif func == 'uninstall_pre_inspection':
print(uninstallPreInspection(version)) print(uninstallPreInspection(version))
elif func == 'run_info': elif func == 'run_info':
print(runInfo()) print(runInfo(version))
elif func == 'db_status': elif func == 'db_status':
print(myDbStatus()) print(myDbStatus())
elif func == 'set_db_status': elif func == 'set_db_status':
@ -2257,10 +2383,14 @@ if __name__ == "__main__":
print(setDbBackup()) print(setDbBackup())
elif func == 'import_db_backup': elif func == 'import_db_backup':
print(importDbBackup()) print(importDbBackup())
elif func == 'import_db_external':
print(importDbExternal())
elif func == 'delete_db_backup': elif func == 'delete_db_backup':
print(deleteDbBackup()) print(deleteDbBackup())
elif func == 'get_db_backup_list': elif func == 'get_db_backup_list':
print(getDbBackupList()) print(getDbBackupList())
elif func == 'get_db_backup_import_list':
print(getDbBackupImportList())
elif func == 'add_db': elif func == 'add_db':
print(addDb()) print(addDb())
elif func == 'del_db': elif func == 'del_db':
@ -2277,6 +2407,8 @@ if __name__ == "__main__":
print(getDbAccess()) print(getDbAccess())
elif func == 'set_db_access': elif func == 'set_db_access':
print(setDbAccess()) print(setDbAccess())
elif func == 'fix_db_access':
print(fixDbAccess(version))
elif func == 'get_db_rw': elif func == 'get_db_rw':
print(setDbRw(version)) print(setDbRw(version))
elif func == 'set_db_ps': elif func == 'set_db_ps':

@ -1,18 +1,8 @@
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){ function myPost(method,args,callback, title){
var _args = null; var _args = null;
if (typeof(args) == 'string'){ if (typeof(args) == 'string'){
_args = JSON.stringify(str2Obj(args)); _args = JSON.stringify(toArrayObject(args));
} else { } else {
_args = JSON.stringify(args); _args = JSON.stringify(args);
} }
@ -40,7 +30,7 @@ function myPostN(method,args,callback, title){
var _args = null; var _args = null;
if (typeof(args) == 'string'){ if (typeof(args) == 'string'){
_args = JSON.stringify(str2Obj(args)); _args = JSON.stringify(toArrayObject(args));
} else { } else {
_args = JSON.stringify(args); _args = JSON.stringify(args);
} }
@ -59,7 +49,7 @@ function myPostN(method,args,callback, title){
function myAsyncPost(method,args){ function myAsyncPost(method,args){
var _args = null; var _args = null;
if (typeof(args) == 'string'){ if (typeof(args) == 'string'){
_args = JSON.stringify(str2Obj(args)); _args = JSON.stringify(toArrayObject(args));
} else { } else {
_args = JSON.stringify(args); _args = JSON.stringify(args);
} }
@ -184,6 +174,11 @@ function myPerfOpt() {
//获取MySQL配置 //获取MySQL配置
myPost('db_status','',function(data){ myPost('db_status','',function(data){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
if ( typeof(rdata.status) != 'undefined' && !rdata.status){
layer.msg(rdata.msg, {icon:2});
return;
}
// console.log(rdata); // console.log(rdata);
var key_buffer_size = toSizeM(rdata.mem.key_buffer_size); var key_buffer_size = toSizeM(rdata.mem.key_buffer_size);
var query_cache_size = toSizeM(rdata.mem.query_cache_size); var query_cache_size = toSizeM(rdata.mem.query_cache_size);
@ -586,7 +581,7 @@ function setDbAccess(username){
yes:function(index){ yes:function(index){
var data = $("#set_db_access").serialize(); var data = $("#set_db_access").serialize();
data = decodeURIComponent(data); data = decodeURIComponent(data);
var dataObj = str2Obj(data); var dataObj = toArrayObject(data);
if(!dataObj['access']){ if(!dataObj['access']){
dataObj['access'] = dataObj['dataAccess']; dataObj['access'] = dataObj['dataAccess'];
if ( dataObj['dataAccess'] == 'ip'){ if ( dataObj['dataAccess'] == 'ip'){
@ -611,6 +606,15 @@ function setDbAccess(username){
}); });
} }
function fixDbAccess(username){
myPost('fix_db_access', '', function(rdata){
var rdata = $.parseJSON(rdata.data);
showMsg(rdata.msg,function(){
dbList();
},{icon: rdata.status ? 1 : 2});
});
}
function setDbPass(id, username, password){ function setDbPass(id, username, password){
var index = layer.open({ var index = layer.open({
@ -651,33 +655,15 @@ function setDbPass(id, username, password){
} }
function addDatabase(type){ function addDatabase(type){
if (type==1){ layer.open({
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({
type: 1, type: 1,
skin: 'demo-class',
area: '500px', area: '500px',
title: '添加数据库', title: '添加数据库',
closeBtn: 1, closeBtn: 1,
shift: 5, shift: 5,
shadeClose: true, shadeClose: true,
content: "<form class='bt-form pd20 pb70' id='add_db'>\ btn:["提交","关闭"],
content: "<form class='bt-form pd20' id='add_db'>\
<div class='line'>\ <div class='line'>\
<span class='tname'>数据库名</span>\ <span class='tname'>数据库名</span>\
<div class='info-r'><input name='name' class='bt-input-text mr5' placeholder='新的数据库名称' type='text' style='width:65%' value=''>\ <div class='info-r'><input name='name' class='bt-input-text mr5' placeholder='新的数据库名称' type='text' style='width:65%' value=''>\
@ -705,22 +691,14 @@ function addDatabase(type){
</div>\ </div>\
</div>\ </div>\
<input type='hidden' name='ps' value='' />\ <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' onclick=\"addDatabase(1)\" >提交</button>\
</div>\
</form>", </form>",
}); success:function(){
$("input[name='name']").keyup(function(){ $("input[name='name']").keyup(function(){
var v = $(this).val(); var v = $(this).val();
$("input[name='db_user']").val(v); $("input[name='db_user']").val(v);
$("input[name='ps']").val(v); $("input[name='ps']").val(v);
}); });
$('#my_mod_close').click(function(){
$('.layui-layer-close1').click();
});
$('select[name="dataAccess"]').change(function(){ $('select[name="dataAccess"]').change(function(){
var v = $(this).val(); var v = $(this).val();
if (v == 'ip'){ if (v == 'ip'){
@ -729,6 +707,25 @@ function addDatabase(type){
$('#dataAccess_subid').remove(); $('#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);
});
}
});
} }
function delDb(id, name){ function delDb(id, name){
@ -738,7 +735,6 @@ function delDb(id, name){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){ showMsg(rdata.msg,function(){
dbList(); dbList();
$('.layui-layer-close1').click();
},{icon: rdata.status ? 1 : 2}, 600); },{icon: rdata.status ? 1 : 2}, 600);
}); });
}); });
@ -860,12 +856,14 @@ function openPhpmyadmin(name,username,password){
} }
} }
function delBackup(filename,name){ function delBackup(filename, name, path){
myPost('delete_db_backup',{filename:filename},function(){ if(typeof(path) == "undefined"){
path = "";
}
myPost('delete_db_backup',{filename:filename,path:path},function(){
layer.msg('执行成功!'); layer.msg('执行成功!');
setTimeout(function(){ setTimeout(function(){
$('.layui-layer-close2').click(); setBackupReq(name);
setBackup(name);
},2000); },2000);
}); });
} }
@ -881,35 +879,100 @@ 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:'<div class="fileUploadDiv">\
<input type="hidden" id="input-val" value="'+upload_dir+'" />\
<input type="file" id="file_input" multiple="true" autocomplete="off" />\
<button type="button" id="opt" autocomplete="off">添加文件</button>\
<button type="button" id="up" autocomplete="off" >开始上传</button>\
<span id="totalProgress" style="position: absolute;top: 7px;right: 147px;"></span>\
<span style="float:right;margin-top: 9px;">\
<font>文件编码:</font>\
<select id="fileCodeing" >\
<option value="byte">二进制</option>\
<option value="utf-8">UTF-8</option>\
<option value="gb18030">GB2312</option>\
</select>\
</span>\
<button type="button" id="filesClose" autocomplete="off">关闭</button>\
<ul id="up_box"></ul>\
</div>',
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 rdata = $.parseJSON(data.data);
var file_list = rdata.data.list;
var upload_dir = rdata.data.upload_dir;
var tbody = ''; var tbody = '';
for (var i = 0; i < rdata.data.length; i++) { for (var i = 0; i < file_list.length; i++) {
tbody += '<tr>\ tbody += '<tr>\
<td><span> ' + rdata.data[i]['name'] + '</span></td>\ <td><span> ' + file_list[i]['name'] + '</span></td>\
<td><span> ' + rdata.data[i]['size'] + '</span></td>\ <td><span> ' + file_list[i]['size'] + '</span></td>\
<td><span> ' + rdata.data[i]['time'] + '</span></td>\ <td><span> ' + file_list[i]['time'] + '</span></td>\
<td style="text-align: right;">\ <td style="text-align: right;">\
<a class="btlink" onclick="importBackup(\'' + rdata.data[i]['name'] + '\',\'' +db_name+ '\')">导入</a> | \ <a class="btlink" onclick="importDbExternal(\'' + file_list[i]['name'] + '\',\'' +db_name+ '\')">导入</a> | \
<a class="btlink" onclick="downloadBackup(\'' + rdata.data[i]['file'] + '\')">下载</a> | \ <a class="btlink del" index="'+i+'">删除</a>\
<a class="btlink" onclick="delBackup(\'' + rdata.data[i]['name'] + '\',\'' +db_name+ '\')">删除</a>\
</td>\ </td>\
</tr>'; </tr>';
} }
var s = layer.open({ $('#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, type: 1,
title: "数据库备份详情", title: "从文件导入数据",
area: ['600px', '280px'], area: ['600px', '380px'],
closeBtn: 2, closeBtn: 1,
shadeClose: false, shadeClose: false,
content: '<div class="pd15">\ content: '<div class="pd15">\
<div class="db_list">\ <div class="db_list">\
<button id="btn_backup" class="btn btn-success btn-sm" type="button">备份</button>\ <button id="btn_file_upload" class="btn btn-success btn-sm" type="button">从本地上传</button>\
</div >\ </div >\
<div class="divtable">\ <div class="divtable">\
<input type="hidden" name="upload_dir" value=""> \
<div id="database_fix" style="height:150px;overflow:auto;border:#ddd 1px solid">\ <div id="database_fix" style="height:150px;overflow:auto;border:#ddd 1px solid">\
<table class="table table-hover "style="border:none">\ <table class="table table-hover "style="border:none">\
<thead>\ <thead>\
@ -920,23 +983,91 @@ function setBackup(db_name,obj){
<th style="text-align: right;">操作</th>\ <th style="text-align: right;">操作</th>\
</tr>\ </tr>\
</thead>\ </thead>\
<tbody class="gztr">' + tbody + '</tbody>\ <tbody id="import_db_file_list" class="gztr"></tbody>\
</table>\ </table>\
</div>\ </div>\
<ul class="help-info-text c7">\
<li>仅支持sqlzipsql.gz(tar.gz|gz|tgz)</li>\
<li>ziptar.gz压缩包结构test.zip或test.tar.gz压缩包内必需包含test.sql</li>\
<li>若文件过大您还可以使用SFTP工具将数据库文件上传到/www/backup/import</li>\
</ul>\
</div>\ </div>\
</div>' </div>',
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: '<div class="pd15">\
<div class="db_list">\
<button id="btn_backup" class="btn btn-success btn-sm" type="button">备份</button>\
<button id="btn_local_import" class="btn btn-success btn-sm" type="button">外部导入</button>\
</div >\
<div class="divtable">\
<div id="database_fix" style="height:150px;overflow:auto;border:#ddd 1px solid">\
<table id="database_table" class="table table-hover "style="border:none">\
<thead>\
<tr>\
<th>文件名称</th>\
<th>文件大小</th>\
<th>备份时间</th>\
<th style="text-align: right;">操作</th>\
</tr>\
</thead>\
<tbody class="list"></tbody>\
</table>\
</div>\
</div>\
</div>',
success:function(index){
$('#btn_backup').click(function(){ $('#btn_backup').click(function(){
myPost('set_db_backup',{name:db_name}, function(data){ myPost('set_db_backup',{name:db_name}, function(data){
layer.msg('执行成功!'); showMsg('执行成功!', function(){
setBackupReq(db_name);
}, {icon:1}, 2000);
});
});
setTimeout(function(){ $('#btn_local_import').click(function(){
layer.close(s); setLocalImport(db_name);
setBackup(db_name,obj);
},2000);
}); });
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++) {
tbody += '<tr>\
<td><span> ' + rdata.data[i]['name'] + '</span></td>\
<td><span> ' + rdata.data[i]['size'] + '</span></td>\
<td><span> ' + rdata.data[i]['time'] + '</span></td>\
<td style="text-align: right;">\
<a class="btlink" onclick="importBackup(\'' + rdata.data[i]['name'] + '\',\'' +db_name+ '\')">导入</a> | \
<a class="btlink" onclick="downloadBackup(\'' + rdata.data[i]['file'] + '\')">下载</a> | \
<a class="btlink" onclick="delBackup(\'' + rdata.data[i]['name'] + '\',\'' +db_name+ '\')">删除</a>\
</td>\
</tr> ';
}
$('#database_table tbody').html(tbody);
}); });
} }
@ -970,7 +1101,7 @@ function dbList(page, search){
list += '<td><span class="c9 input-edit" onclick="setDbPs(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',this)" style="display: inline-block;">'+rdata.data[i]['ps']+'</span></td>'; list += '<td><span class="c9 input-edit" onclick="setDbPs(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',this)" style="display: inline-block;">'+rdata.data[i]['ps']+'</span></td>';
list += '<td style="text-align:right">'; list += '<td style="text-align:right">';
list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\',this)" title="数据库备份">'+(rdata.data[i]['is_backup']?'备份':'未备份') +'</a> | '; list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\')" title="数据库备份">'+(rdata.data[i]['is_backup']?'备份':'未备份') +'</a> | ';
var rw = ''; var rw = '';
var rw_change = 'all'; var rw_change = 'all';
@ -1006,6 +1137,7 @@ function dbList(page, search){
<button onclick="setRootPwd(0,\''+rdata.info['root_pwd']+'\')" title="设置MySQL管理员密码" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">root密码</button>\ <button onclick="setRootPwd(0,\''+rdata.info['root_pwd']+'\')" title="设置MySQL管理员密码" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">root密码</button>\
<button onclick="openPhpmyadmin(\'\',\'root\',\''+rdata.info['root_pwd']+'\')" title="打开phpMyadmin" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">phpMyAdmin</button>\ <button onclick="openPhpmyadmin(\'\',\'root\',\''+rdata.info['root_pwd']+'\')" title="打开phpMyadmin" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">phpMyAdmin</button>\
<button onclick="setDbAccess(\'root\')" title="ROOT权限" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">ROOT权限</button>\ <button onclick="setDbAccess(\'root\')" title="ROOT权限" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">ROOT权限</button>\
<button onclick="fixDbAccess(\'root\')" title="修复" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">修复</button>\
<span style="float:right"> \ <span style="float:right"> \
<button batch="true" style="float: right;display: none;margin-left:10px;" onclick="delDbBatch();" title="删除选中项" class="btn btn-default btn-sm">删除选中</button>\ <button batch="true" style="float: right;display: none;margin-left:10px;" onclick="delDbBatch();" title="删除选中项" class="btn btn-default btn-sm">删除选中</button>\
</span>\ </span>\
@ -1311,7 +1443,7 @@ function addMasterRepSlaveUser(){
yes:function(index){ yes:function(index){
var data = $("#add_master").serialize(); var data = $("#add_master").serialize();
data = decodeURIComponent(data); data = decodeURIComponent(data);
var dataObj = str2Obj(data); var dataObj = toArrayObject(data);
if(!dataObj['address']){ if(!dataObj['address']){
dataObj['address'] = dataObj['dataAccess']; dataObj['address'] = dataObj['dataAccess'];
} }
@ -1356,7 +1488,7 @@ function updateMasterRepSlaveUser(username){
$('#submit_update_master').click(function(){ $('#submit_update_master').click(function(){
var data = $("#update_master").serialize(); var data = $("#update_master").serialize();
data = decodeURIComponent(data); data = decodeURIComponent(data);
var dataObj = str2Obj(data); var dataObj = toArrayObject(data);
myPost('update_master_rep_slave_user', data, function(data){ myPost('update_master_rep_slave_user', data, function(data){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){ showMsg(rdata.msg,function(){
@ -1467,7 +1599,7 @@ function setDbMasterAccess(username){
yes:function(index){ yes:function(index){
var data = $("#set_db_access").serialize(); var data = $("#set_db_access").serialize();
data = decodeURIComponent(data); data = decodeURIComponent(data);
var dataObj = str2Obj(data); var dataObj = toArrayObject(data);
if(!dataObj['access']){ if(!dataObj['access']){
dataObj['access'] = dataObj['dataAccess']; dataObj['access'] = dataObj['dataAccess'];
if ( dataObj['dataAccess'] == 'ip'){ if ( dataObj['dataAccess'] == 'ip'){
@ -1940,9 +2072,14 @@ function masterOrSlaveConf(version=''){
function getMasterStatus(){ function getMasterStatus(){
myPost('get_master_status', '', function(data){ myPost('get_master_status', '', function(rdata){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(rdata.data);
// console.log('mode:',rdata.data); // console.log('mode:',rdata.data);
if (!rdata.status){
layer.msg(rdata.msg, {icon:2});
return;
}
var rdata = rdata.data; var rdata = rdata.data;
var limitCon = '\ var limitCon = '\
<p class="conf_p">\ <p class="conf_p">\

@ -5,6 +5,8 @@
import sys import sys
import os import os
import re
import time
if sys.platform != 'darwin': if sys.platform != 'darwin':
os.chdir('/www/server/mdserver-web') os.chdir('/www/server/mdserver-web')
@ -19,13 +21,13 @@ sys.path.append(chdir + '/class/core')
import mw import mw
import db import db
import time
class backupTools: class backupTools:
def backupDatabase(self, name, count): def backupDatabase(self, name, count):
db_path = mw.getServerDir() + '/mariadb' db_path = mw.getServerDir() + '/mariadb'
db_sock = mw.getServerDir() + '/mariadb/'
db_name = 'mysql' db_name = 'mysql'
name = mw.M('databases').dbPos(db_path, 'mysql').where( name = mw.M('databases').dbPos(db_path, 'mysql').where(
'name=?', (name,)).getField('name') 'name=?', (name,)).getField('name')
@ -45,26 +47,27 @@ class backupTools:
filename = backup_path + "/db_" + name + "_" + \ filename = backup_path + "/db_" + name + "_" + \
time.strftime('%Y%m%d_%H%M%S', time.localtime()) + ".sql.gz" time.strftime('%Y%m%d_%H%M%S', time.localtime()) + ".sql.gz"
import re
mysql_root = mw.M('config').dbPos(db_path, db_name).where( mysql_root = mw.M('config').dbPos(db_path, db_name).where(
"id=?", (1,)).getField('mysql_root') "id=?", (1,)).getField('mysql_root')
mycnf = mw.readFile(db_path + '/etc/my.cnf') my_conf_path = db_path + '/etc/my.cnf'
content = mw.readFile(my_conf_path)
rep = "\[mysqldump\]\nuser=root" rep = "\[mysqldump\]\nuser=root"
sea = "[mysqldump]\n" sea = "[mysqldump]\n"
subStr = sea + "user=root\npassword=" + mysql_root + "\n" subStr = sea + "user=root\npassword=" + mysql_root + "\n"
mycnf = mycnf.replace(sea, subStr) content = content.replace(sea, subStr)
if len(mycnf) > 100: if len(content) > 100:
mw.writeFile(db_path + '/etc/my.cnf', mycnf) mw.writeFile(my_conf_path, content)
# mw.execShell(db_path + "/bin/mysqldump --opt --default-character-set=utf8 " + # mw.execShell(db_path + "/bin/mysqldump --defaults-file=" + my_conf_path + " --opt --default-character-set=utf8 " +
# name + " | gzip > " + filename) # name + " | gzip > " + filename)
# mw.execShell(db_path + "/bin/mysqldump --skip-lock-tables --default-character-set=utf8 " + # mw.execShell(db_path + "/bin/mysqldump --defaults-file=" + my_conf_path + " --skip-lock-tables --default-character-set=utf8 " +
# name + " | gzip > " + filename) # name + " | gzip > " + filename)
mw.execShell(db_path + "/bin/mysqldump --single-transaction --quick --default-character-set=utf8 " + cmd = db_path + "/bin/mysqldump --defaults-file=" + my_conf_path + " --single-transaction --quick --default-character-set=utf8 " + \
name + " | gzip > " + filename) name + " | gzip > " + filename
mw.execShell(cmd)
if not os.path.exists(filename): if not os.path.exists(filename):
endDate = time.strftime('%Y/%m/%d %X', time.localtime()) endDate = time.strftime('%Y/%m/%d %X', time.localtime())

@ -53,7 +53,7 @@ Install_app()
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -53,7 +53,7 @@ Install_app()
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -53,7 +53,7 @@ Install_app()
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -53,7 +53,7 @@ Install_app()
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -682,11 +682,16 @@ def setMyPort():
def runInfo(version): def runInfo(version):
if status(version) == 'stop': if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动', []) return mw.returnJson(False, 'MySQL未启动', [])
db = pMysqlDb() db = pMysqlDb()
data = db.query('show global status') data = db.query('show global status')
isError = isSqlError(data)
if isError != None:
return isError
gets = ['Max_used_connections', 'Com_commit', 'Com_select', 'Com_rollback', 'Questions', 'Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests', 'Key_reads', 'Key_read_requests', 'Key_writes', gets = ['Max_used_connections', 'Com_commit', 'Com_select', 'Com_rollback', 'Questions', 'Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests', 'Key_reads', 'Key_read_requests', 'Key_writes',
'Key_write_requests', 'Qcache_hits', 'Qcache_inserts', 'Bytes_received', 'Bytes_sent', 'Aborted_clients', 'Aborted_connects', 'Key_write_requests', 'Qcache_hits', 'Qcache_inserts', 'Bytes_received', 'Bytes_sent', 'Aborted_clients', 'Aborted_connects',
'Created_tmp_disk_tables', 'Created_tmp_tables', 'Innodb_buffer_pool_pages_dirty', 'Opened_files', 'Open_tables', 'Opened_tables', 'Select_full_join', 'Created_tmp_disk_tables', 'Created_tmp_tables', 'Innodb_buffer_pool_pages_dirty', 'Opened_files', 'Open_tables', 'Opened_tables', 'Select_full_join',
@ -778,7 +783,7 @@ def isSqlError(mysqlMsg):
if "2003," in mysqlMsg: if "2003," in mysqlMsg:
return mw.returnJson(False, "Can't connect to MySQL server on '127.0.0.1' (61)") return mw.returnJson(False, "Can't connect to MySQL server on '127.0.0.1' (61)")
if "using password:" in mysqlMsg: if "using password:" in mysqlMsg:
return mw.returnJson(False, '数据库管理密码错误!') return mw.returnJson(False, '数据库密码错误,在管理列表-点击【修复】!')
if "1045" in mysqlMsg: if "1045" in mysqlMsg:
return mw.returnJson(False, '连接错误!') return mw.returnJson(False, '连接错误!')
if "SQL syntax" in mysqlMsg: if "SQL syntax" in mysqlMsg:
@ -1304,11 +1309,11 @@ def delDb():
if not data[0]: if not data[0]:
return data[1] return data[1]
try: try:
id = args['id'] sid = args['id']
name = args['name'] name = args['name']
psdb = pSqliteDb('databases') psdb = pSqliteDb('databases')
pdb = pMysqlDb() pdb = pMysqlDb()
find = psdb.where("id=?", (id,)).field( find = psdb.where("id=?", (sid,)).field(
'id,pid,name,username,password,accept,ps,addtime').find() 'id,pid,name,username,password,accept,ps,addtime').find()
accept = find['accept'] accept = find['accept']
username = find['username'] username = find['username']
@ -1324,7 +1329,7 @@ def delDb():
pdb.execute("flush privileges") pdb.execute("flush privileges")
# 删除SQLITE # 删除SQLITE
psdb.where("id=?", (id,)).delete() psdb.where("id=?", (sid,)).delete()
return mw.returnJson(True, '删除成功!') return mw.returnJson(True, '删除成功!')
except Exception as ex: except Exception as ex:
return mw.returnJson(False, '删除失败!' + str(ex)) return mw.returnJson(False, '删除失败!' + str(ex))
@ -1341,6 +1346,10 @@ def getDbAccess():
users = pdb.query("select Host from mysql.user where User='" + users = pdb.query("select Host from mysql.user where User='" +
username + "' AND Host!='localhost'") username + "' AND Host!='localhost'")
isError = isSqlError(users)
if isError != None:
return isError
if len(users) < 1: if len(users) < 1:
return mw.returnJson(True, "127.0.0.1") return mw.returnJson(True, "127.0.0.1")
accs = [] accs = []
@ -1380,6 +1389,22 @@ def setDbAccess():
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def fixDbAccess(version):
try:
pdb = pMysqlDb()
psdb = pSqliteDb('databases')
data = pdb.query('show databases')
isError = isSqlError(data)
if isError != None:
appCMD(version, 'stop')
mw.execShell("rm -rf " + getServerDir() + "/data")
appCMD(version, 'start')
return mw.returnJson(True, '修复成功!')
return mw.returnJson(True, '正常无需修复!')
except Exception as e:
return mw.returnJson(False, '修复失败请重试!')
def setDbRw(version=''): def setDbRw(version=''):
args = getArgs() args = getArgs()
data = checkArgs(args, ['username', 'id', 'rw']) data = checkArgs(args, ['username', 'id', 'rw'])
@ -1677,6 +1702,7 @@ def setDbMasterAccess():
def getMasterDbList(version=''): def getMasterDbList(version=''):
try:
args = getArgs() args = getArgs()
page = 1 page = 1
page_size = 10 page_size = 10
@ -1724,8 +1750,9 @@ def getMasterDbList(version=''):
_page['tojs'] = 'dbList' _page['tojs'] = 'dbList'
data['page'] = mw.getPage(_page) data['page'] = mw.getPage(_page)
data['data'] = clist data['data'] = clist
return mw.getJson(data) return mw.getJson(data)
except Exception as e:
return mw.returnJson(False, "数据库密码错误,在管理列表-点击【修复】!")
def setDbMaster(version): def setDbMaster(version):
@ -1791,6 +1818,7 @@ def setDbSlave(version):
def getMasterStatus(version=''): def getMasterStatus(version=''):
try:
if status(version) == 'stop': if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动,或正在启动中...!', []) return mw.returnJson(False, 'MySQL未启动,或正在启动中...!', [])
@ -1814,6 +1842,8 @@ def getMasterStatus(version=''):
data['slave_status'] = True data['slave_status'] = True
return mw.returnJson(master_status, '设置成功', data) return mw.returnJson(master_status, '设置成功', data)
except Exception as e:
return mw.returnJson(False, "数据库密码错误,在管理列表-点击【修复】!")
def setMasterStatus(version=''): def setMasterStatus(version=''):
@ -2561,6 +2591,8 @@ if __name__ == "__main__":
print(getDbAccess()) print(getDbAccess())
elif func == 'set_db_access': elif func == 'set_db_access':
print(setDbAccess()) print(setDbAccess())
elif func == 'fix_db_access':
print(fixDbAccess(version))
elif func == 'set_db_rw': elif func == 'set_db_rw':
print(setDbRw(version)) print(setDbRw(version))
elif func == 'set_db_ps': elif func == 'set_db_ps':

@ -196,6 +196,12 @@ function myPerfOpt() {
//获取MySQL配置 //获取MySQL配置
myPost('db_status','',function(data){ myPost('db_status','',function(data){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
if ( typeof(rdata.status) != 'undefined' && !rdata.status){
layer.msg(rdata.msg, {icon:2});
return;
}
// console.log(rdata); // console.log(rdata);
var key_buffer_size = toSizeM(rdata.mem.key_buffer_size); var key_buffer_size = toSizeM(rdata.mem.key_buffer_size);
var query_cache_size = toSizeM(rdata.mem.query_cache_size); var query_cache_size = toSizeM(rdata.mem.query_cache_size);
@ -623,9 +629,17 @@ function setDbAccess(username){
}); });
} }
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, type: 1,
area: '500px', area: '500px',
title: '修改数据库密码', title: '修改数据库密码',
@ -872,8 +886,7 @@ function delBackup(filename,name,path){
myPost('delete_db_backup',{filename:filename,path:path},function(){ myPost('delete_db_backup',{filename:filename,path:path},function(){
layer.msg('执行成功!'); layer.msg('执行成功!');
setTimeout(function(){ setTimeout(function(){
$('.layui-layer-close2').click(); setBackupReq(name);
setBackup(name);
},2000); },2000);
}); });
} }
@ -932,6 +945,7 @@ function setLocalImport(db_name){
}); });
uploadStart(function(){ uploadStart(function(){
getList(); getList();
layer.close(up_db);
}); });
} }
@ -1015,23 +1029,7 @@ function setLocalImport(db_name){
} }
function setBackup(db_name,obj){ function setBackup(db_name){
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++) {
tbody += '<tr>\
<td><span> ' + rdata.data[i]['name'] + '</span></td>\
<td><span> ' + rdata.data[i]['size'] + '</span></td>\
<td><span> ' + rdata.data[i]['time'] + '</span></td>\
<td style="text-align: right;">\
<a class="btlink" onclick="importBackup(\'' + rdata.data[i]['name'] + '\',\'' +db_name+ '\')">导入</a> | \
<a class="btlink" onclick="delBackup(\'' + rdata.data[i]['name'] + '\',\'' +db_name+ '\')">删除</a>\
</td>\
</tr> ';
}
var layerIndex = layer.open({ var layerIndex = layer.open({
type: 1, type: 1,
title: "数据库备份详情", title: "数据库备份详情",
@ -1045,7 +1043,7 @@ function setBackup(db_name,obj){
</div >\ </div >\
<div class="divtable">\ <div class="divtable">\
<div id="database_fix" style="height:150px;overflow:auto;border:#ddd 1px solid">\ <div id="database_fix" style="height:150px;overflow:auto;border:#ddd 1px solid">\
<table class="table table-hover "style="border:none">\ <table id="database_table" class="table table-hover "style="border:none">\
<thead>\ <thead>\
<tr>\ <tr>\
<th>文件名称</th>\ <th>文件名称</th>\
@ -1054,7 +1052,7 @@ function setBackup(db_name,obj){
<th style="text-align: right;">操作</th>\ <th style="text-align: right;">操作</th>\
</tr>\ </tr>\
</thead>\ </thead>\
<tbody class="gztr">' + tbody + '</tbody>\ <tbody class="list"></tbody>\
</table>\ </table>\
</div>\ </div>\
</div>\ </div>\
@ -1063,8 +1061,7 @@ function setBackup(db_name,obj){
$('#btn_backup').click(function(){ $('#btn_backup').click(function(){
myPost('set_db_backup',{name:db_name}, function(data){ myPost('set_db_backup',{name:db_name}, function(data){
showMsg('执行成功!', function(){ showMsg('执行成功!', function(){
layer.close(layerIndex); setBackupReq(db_name);
setBackup(db_name,obj);
}, {icon:1}, 2000); }, {icon:1}, 2000);
}); });
}); });
@ -1072,12 +1069,33 @@ function setBackup(db_name,obj){
$('#btn_local_import').click(function(){ $('#btn_local_import').click(function(){
setLocalImport(db_name); 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++) {
tbody += '<tr>\
<td><span> ' + rdata.data[i]['name'] + '</span></td>\
<td><span> ' + rdata.data[i]['size'] + '</span></td>\
<td><span> ' + rdata.data[i]['time'] + '</span></td>\
<td style="text-align: right;">\
<a class="btlink" onclick="importBackup(\'' + rdata.data[i]['name'] + '\',\'' +db_name+ '\')">导入</a> | \
<a class="btlink" onclick="downloadBackup(\'' + rdata.data[i]['file'] + '\')">下载</a> | \
<a class="btlink" onclick="delBackup(\'' + rdata.data[i]['name'] + '\',\'' +db_name+ '\')">删除</a>\
</td>\
</tr> ';
}
$('#database_table tbody').html(tbody);
});
}
function dbList(page, search){ function dbList(page, search){
var _data = {}; var _data = {};
if (typeof(page) =='undefined'){ if (typeof(page) =='undefined'){
@ -1143,6 +1161,7 @@ function dbList(page, search){
<button onclick="setRootPwd(0,\''+rdata.info['root_pwd']+'\')" title="设置MySQL管理员密码" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">root密码</button>\ <button onclick="setRootPwd(0,\''+rdata.info['root_pwd']+'\')" title="设置MySQL管理员密码" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">root密码</button>\
<button onclick="openPhpmyadmin(\'\',\'root\',\''+rdata.info['root_pwd']+'\')" title="打开phpMyadmin" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">phpMyAdmin</button>\ <button onclick="openPhpmyadmin(\'\',\'root\',\''+rdata.info['root_pwd']+'\')" title="打开phpMyadmin" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">phpMyAdmin</button>\
<button onclick="setDbAccess(\'root\')" title="ROOT权限" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">ROOT权限</button>\ <button onclick="setDbAccess(\'root\')" title="ROOT权限" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">ROOT权限</button>\
<button onclick="fixDbAccess(\'root\')" title="修复" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">修复</button>\
<span style="float:right"> \ <span style="float:right"> \
<button batch="true" style="float: right;display: none;margin-left:10px;" onclick="delDbBatch();" title="删除选中项" class="btn btn-default btn-sm">删除选中</button>\ <button batch="true" style="float: right;display: none;margin-left:10px;" onclick="delDbBatch();" title="删除选中项" class="btn btn-default btn-sm">删除选中</button>\
</span>\ </span>\
@ -2077,9 +2096,14 @@ function masterOrSlaveConf(version=''){
function getMasterStatus(){ function getMasterStatus(){
myPost('get_master_status', '', function(data){ myPost('get_master_status', '', function(rdata){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(rdata.data);
// console.log('mode:',rdata.data); // console.log('mode:',rdata.data);
if (!rdata.status){
layer.msg(rdata.msg, {icon:2});
return;
}
var rdata = rdata.data; var rdata = rdata.data;
var limitCon = '\ var limitCon = '\
<p class="conf_p">\ <p class="conf_p">\

@ -52,7 +52,7 @@ Install_mysql()
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -55,7 +55,7 @@ Install_mysql()
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -57,7 +57,7 @@ Install_mysql()
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -91,8 +91,9 @@ Install_mysql()
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------
cd ${rootPath}/plugins/mysql/lib && /bin/bash rpcgen.sh cd ${rootPath}/plugins/mysql/lib && /bin/bash rpcgen.sh

@ -75,7 +75,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -67,7 +67,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -66,7 +66,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -66,7 +66,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -66,7 +66,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -63,7 +63,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -65,7 +65,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -79,7 +79,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -95,7 +95,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -86,7 +86,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -80,7 +80,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -74,7 +74,7 @@ else
fi fi
if [ "$cpuCore" -gt "1" ];then if [ "$cpuCore" -gt "1" ];then
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'` cpuCore=`echo "$cpuCore" | awk '{printf("%.2f",($1)*0.8)}' | awk -F '.' '{print $1}'`
fi fi
# ----- cpu end ------ # ----- cpu end ------

@ -135,7 +135,64 @@ if [ "$VERSION_ID" == "9" ];then
# pip3 install -r /www/server/mdserver-web/requirements.txt # pip3 install -r /www/server/mdserver-web/requirements.txt
fi fi
cd /www/server/mdserver-web/scripts && bash lib.sh apt install -y devscripts
apt install -y net-tools
apt install -y python3-dev
apt install -y autoconf
apt install -y gcc
apt install -y libffi-dev
apt install -y cmake automake make
apt install -y webp scons
apt install -y libwebp-dev
apt install -y lzma lzma-dev
apt install -y libunwind-dev
apt install -y libpcre3 libpcre3-dev
apt install -y openssl
apt install -y libssl-dev
apt install -y libmemcached-dev
apt install -y libsasl2-dev
apt install -y imagemagick
apt install -y libmagickwand-dev
apt install -y libxml2 libxml2-dev libbz2-dev libmcrypt-dev libpspell-dev librecode-dev
apt install -y libgmp-dev libgmp3-dev libreadline-dev libxpm-dev
apt install -y dia pkg-config
apt install -y zlib1g-dev
apt install -y libjpeg-dev libpng-dev
apt install -y libfreetype6
apt install -y libjpeg62-turbo-dev
apt install -y libfreetype6-dev
apt install -y libevent-dev libncurses5-dev libldap2-dev
apt install -y libzip-dev
apt install -y libicu-dev
apt install -y build-essential
apt install -y libcurl4-openssl-dev
apt install -y curl libcurl4-gnutls-dev
#https://blog.csdn.net/qq_36228377/article/details/123154344
# ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
if [ ! -d /usr/include/curl ];then
ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
fi
apt install -y graphviz bison re2c flex
apt install -y libsqlite3-dev
apt install -y libonig-dev
apt install -y perl g++ libtool
apt install -y libxslt1-dev
apt install -y libmariadb-dev
#apt install -y libmysqlclient-dev
apt install -y libmariadb-dev-compat
#apt install -y libmariadbclient-dev
chmod 755 /www/server/mdserver-web/data chmod 755 /www/server/mdserver-web/data
cd /www/server/mdserver-web && ./cli.sh start cd /www/server/mdserver-web && ./cli.sh start

@ -70,7 +70,65 @@ fi
systemctl stop firewalld systemctl stop firewalld
cd /www/server/mdserver-web/scripts && bash lib.sh apt install -y devscripts
apt install -y net-tools
apt install -y python3-dev
apt install -y autoconf
apt install -y gcc
apt install -y libffi-dev
apt install -y cmake automake make
apt install -y webp scons
apt install -y libwebp-dev
apt install -y lzma lzma-dev
apt install -y libunwind-dev
apt install -y libpcre3 libpcre3-dev
apt install -y openssl
apt install -y libssl-dev
apt install -y libmemcached-dev
apt install -y libsasl2-dev
apt install -y imagemagick
apt install -y libmagickwand-dev
apt install -y libxml2 libxml2-dev libbz2-dev libmcrypt-dev libpspell-dev librecode-dev
apt install -y libgmp-dev libgmp3-dev libreadline-dev libxpm-dev
apt install -y dia pkg-config
apt install -y zlib1g-dev
apt install -y libjpeg-dev libpng-dev
apt install -y libfreetype6
apt install -y libjpeg62-turbo-dev
apt install -y libfreetype6-dev
apt install -y libevent-dev libncurses5-dev libldap2-dev
apt install -y libzip-dev
apt install -y libicu-dev
apt install -y build-essential
apt install -y libcurl4-openssl-dev
apt install -y curl libcurl4-gnutls-dev
#https://blog.csdn.net/qq_36228377/article/details/123154344
# ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
if [ ! -d /usr/include/curl ];then
ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
fi
apt install -y graphviz bison re2c flex
apt install -y libsqlite3-dev
apt install -y libonig-dev
apt install -y perl g++ libtool
apt install -y libxslt1-dev
apt install -y libmariadb-dev
#apt install -y libmysqlclient-dev
apt install -y libmariadb-dev-compat
#apt install -y libmariadbclient-dev
chmod 755 /www/server/mdserver-web/data chmod 755 /www/server/mdserver-web/data

@ -37,65 +37,10 @@ elif [ "$OSNAME" == "fedora" ];then
echo "fedora lib" echo "fedora lib"
elif [ "$OSNAME" == "alma" ];then elif [ "$OSNAME" == "alma" ];then
echo "alma lib" echo "alma lib"
elif [ "$OSNAME" == "ubuntu" ] || [ "$OSNAME" == "debian" ]; then elif [ "$OSNAME" == "ubuntu" ];then
echo "ubuntu lib"
apt install -y devscripts elif [ "$OSNAME" == "debian" ]; then
apt install -y net-tools echo "debian lib"
apt install -y python3-dev
apt install -y autoconf
apt install -y gcc
apt install -y libffi-dev
apt install -y cmake automake make
apt install -y webp scons
apt install -y libwebp-dev
apt install -y lzma lzma-dev
apt install -y libunwind-dev
apt install -y libpcre3 libpcre3-dev
apt install -y openssl
apt install -y libssl-dev
apt install -y libmemcached-dev
apt install -y libsasl2-dev
apt install -y imagemagick
apt install -y libmagickwand-dev
apt install -y libxml2 libxml2-dev libbz2-dev libmcrypt-dev libpspell-dev librecode-dev
apt install -y libgmp-dev libgmp3-dev libreadline-dev libxpm-dev
apt install -y dia pkg-config
apt install -y zlib1g-dev
apt install -y libjpeg-dev libpng-dev
apt install -y libfreetype6
apt install -y libjpeg62-turbo-dev
apt install -y libfreetype6-dev
apt install -y libevent-dev libncurses5-dev libldap2-dev
apt install -y libzip-dev
apt install -y libicu-dev
apt install -y build-essential
apt install -y libcurl4-openssl-dev
apt install -y curl libcurl4-gnutls-dev
#https://blog.csdn.net/qq_36228377/article/details/123154344
# ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
if [ ! -d /usr/include/curl ];then
ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
fi
apt install -y graphviz bison re2c flex
apt install -y libsqlite3-dev
apt install -y libonig-dev
apt install -y perl g++ libtool
apt install -y libxslt1-dev
apt install -y libmariadb-dev
#apt install -y libmysqlclient-dev
apt install -y libmariadb-dev-compat
#apt install -y libmariadbclient-dev
else else
echo "OK" echo "OK"
fi fi

Loading…
Cancel
Save