diff --git a/plugins/mariadb/index.py b/plugins/mariadb/index.py index 937a89ed1..eafc9ef7a 100755 --- a/plugins/mariadb/index.py +++ b/plugins/mariadb/index.py @@ -628,7 +628,7 @@ def isSqlError(mysqlMsg): if "2003," in mysqlMsg: return mw.returnJson(False, "Can't connect to MySQL server on '127.0.0.1' (61)") if "using password:" in mysqlMsg: - return mw.returnJson(False, '数据库管理密码错误!') + return mw.returnJson(False, '数据库密码错误,在管理列表-点击【修复】!') if "1045" in mysqlMsg: return mw.returnJson(False, '连接错误!') if "SQL syntax" in mysqlMsg: @@ -712,15 +712,82 @@ def importDbBackup(): 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(): args = getArgs() - data = checkArgs(args, ['filename']) + data = checkArgs(args, ['filename', 'path']) if not data[0]: return data[1] + path = args['path'] + full_file = "" bkDir = mw.getRootDir() + '/backup/database' - - os.remove(bkDir + '/' + args['filename']) + full_file = bkDir + '/' + args['filename'] + if path != "": + full_file = path + "/" + args['filename'] + os.remove(full_file) return mw.returnJson(True, 'ok') @@ -752,6 +819,39 @@ def getDbBackupList(): 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(): args = getArgs() page = 1 @@ -1122,6 +1222,22 @@ def setDbAccess(): 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=''): args = getArgs() data = checkArgs(args, ['username', 'id', 'rw']) @@ -2200,7 +2316,7 @@ def uninstallPreInspection(version): if __name__ == "__main__": func = sys.argv[1] - version = "5.6" + version = "10.6" version_pl = getServerDir() + "/version.pl" if os.path.exists(version_pl): version = mw.readFile(version_pl).strip() @@ -2257,10 +2373,14 @@ if __name__ == "__main__": print(setDbBackup()) elif func == 'import_db_backup': print(importDbBackup()) + elif func == 'import_db_external': + print(importDbExternal()) elif func == 'delete_db_backup': print(deleteDbBackup()) elif func == 'get_db_backup_list': print(getDbBackupList()) + elif func == 'get_db_backup_import_list': + print(getDbBackupImportList()) elif func == 'add_db': print(addDb()) elif func == 'del_db': @@ -2277,6 +2397,8 @@ if __name__ == "__main__": print(getDbAccess()) elif func == 'set_db_access': print(setDbAccess()) + elif func == 'fix_db_access': + print(fixDbAccess(version)) elif func == 'get_db_rw': print(setDbRw(version)) elif func == 'set_db_ps': diff --git a/plugins/mariadb/js/mariadb.js b/plugins/mariadb/js/mariadb.js index ebf4c2c02..abdba02a8 100755 --- a/plugins/mariadb/js/mariadb.js +++ b/plugins/mariadb/js/mariadb.js @@ -601,6 +601,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){ var index = layer.open({ @@ -661,7 +670,6 @@ function addDatabase(type){ } var index = layer.open({ type: 1, - skin: 'demo-class', area: '500px', title: '添加数据库', closeBtn: 1, @@ -850,12 +858,14 @@ function openPhpmyadmin(name,username,password){ } } -function delBackup(filename,name){ - myPost('delete_db_backup',{filename:filename},function(){ +function delBackup(filename, name, path){ + if(typeof(path) == "undefined"){ + path = ""; + } + myPost('delete_db_backup',{filename:filename,path:path},function(){ layer.msg('执行成功!'); setTimeout(function(){ - $('.layui-layer-close2').click(); - setBackup(name); + setBackupReq(name); },2000); }); } @@ -871,9 +881,180 @@ function importBackup(file,name){ }); } -function setBackup(db_name,obj){ - myPost('get_db_backup_list', {name:db_name}, function(data){ +function importDbExternal(file,name){ + myPost('import_db_external',{file:file,name:name}, function(data){ + layer.msg('执行成功!'); + }); +} + +function setLocalImport(db_name){ + + //上传文件 + function uploadDbFiles(upload_dir){ + var up_db = layer.open({ + type:1, + closeBtn: 1, + title:"上传导入文件["+upload_dir+']', + area: ['500px','300px'], + shadeClose:false, + content:'
\ + \ + \ + \ + \ + \ + \ + 文件编码:\ + \ + \ + \ + \ +
', + success:function(){ + $('#filesClose').click(function(){ + layer.close(up_db); + }); + } + + }); + uploadStart(function(){ + getList(); + layer.close(up_db); + }); + } + + function getList(){ + myPost('get_db_backup_import_list',{}, function(data){ + var rdata = $.parseJSON(data.data); + + var file_list = rdata.data.list; + var upload_dir = rdata.data.upload_dir; + + var tbody = ''; + for (var i = 0; i < file_list.length; i++) { + tbody += '\ + ' + file_list[i]['name'] + '\ + ' + file_list[i]['size'] + '\ + ' + file_list[i]['time'] + '\ + \ + 导入 | \ + 删除\ + \ + '; + } + + $('#import_db_file_list').html(tbody); + $('input[name="upload_dir"]').val(upload_dir); + + $("#import_db_file_list .del").on('click',function(){ + var index = $(this).attr('index'); + var filename = file_list[index]["name"]; + myPost('delete_db_backup',{filename:filename,path:upload_dir},function(){ + showMsg('执行成功!', function(){ + getList(); + },{icon:1},2000); + }); + }); + }); + } + + var layerIndex = layer.open({ + type: 1, + title: "从文件导入数据", + area: ['600px', '380px'], + closeBtn: 1, + shadeClose: false, + content: '
\ +
\ + \ +
\ +
\ + \ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
文件名称文件大小备份时间操作
\ +
\ + \ +
\ +
', + success:function(index){ + $('#btn_file_upload').click(function(){ + var upload_dir = $('input[name="upload_dir"]').val(); + uploadDbFiles(upload_dir); + }); + getList(); + }, + }); +} + + +function setBackup(db_name){ + var layerIndex = layer.open({ + type: 1, + title: "数据库备份详情", + area: ['600px', '280px'], + closeBtn: 1, + shadeClose: false, + content: '
\ +
\ + \ + \ +
\ +
\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
文件名称文件大小备份时间操作
\ +
\ +
\ +
', + success:function(index){ + $('#btn_backup').click(function(){ + myPost('set_db_backup',{name:db_name}, function(data){ + showMsg('执行成功!', function(){ + setBackupReq(db_name); + }, {icon:1}, 2000); + }); + }); + + $('#btn_local_import').click(function(){ + setLocalImport(db_name); + }); + + setBackupReq(db_name); + }, + }); +} + + +function setBackupReq(db_name, obj){ + myPost('get_db_backup_list', {name:db_name}, function(data){ var rdata = $.parseJSON(data.data); var tbody = ''; for (var i = 0; i < rdata.data.length; i++) { @@ -888,45 +1069,7 @@ function setBackup(db_name,obj){ \ '; } - - var s = layer.open({ - type: 1, - title: "数据库备份详情", - area: ['600px', '280px'], - closeBtn: 2, - shadeClose: false, - content: '
\ -
\ - \ -
\ -
\ -
\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - ' + tbody + '\ -
文件名称文件大小备份时间操作
\ -
\ -
\ -
' - }); - - $('#btn_backup').click(function(){ - myPost('set_db_backup',{name:db_name}, function(data){ - layer.msg('执行成功!'); - - setTimeout(function(){ - layer.close(s); - setBackup(db_name,obj); - },2000); - }); - }); + $('#database_table tbody').html(tbody); }); } @@ -960,7 +1103,7 @@ function dbList(page, search){ list += ''+rdata.data[i]['ps']+''; list += ''; - list += ''+(rdata.data[i]['is_backup']?'备份':'未备份') +' | '; + list += ''+(rdata.data[i]['is_backup']?'备份':'未备份') +' | '; var rw = ''; var rw_change = 'all'; @@ -996,6 +1139,7 @@ function dbList(page, search){ \ \ \ + \ \ \ \ diff --git a/plugins/mariadb/scripts/backup.py b/plugins/mariadb/scripts/backup.py index 21ef91d10..bbd4d84dc 100755 --- a/plugins/mariadb/scripts/backup.py +++ b/plugins/mariadb/scripts/backup.py @@ -26,6 +26,7 @@ class backupTools: def backupDatabase(self, name, count): db_path = mw.getServerDir() + '/mariadb' + db_sock = mw.getServerDir() + '/mariadb/' db_name = 'mysql' name = mw.M('databases').dbPos(db_path, 'mysql').where( 'name=?', (name,)).getField('name') @@ -63,8 +64,11 @@ class backupTools: # mw.execShell(db_path + "/bin/mysqldump --skip-lock-tables --default-character-set=utf8 " + # name + " | gzip > " + filename) - mw.execShell(db_path + "/bin/mysqldump --single-transaction --quick --default-character-set=utf8 " + - name + " | gzip > " + filename) + cmd = db_path + "/bin/mysqldump --single-transaction --quick --default-character-set=utf8 " + \ + name + " | gzip > " + filename + + # print(cmd) + mw.execShell(cmd) if not os.path.exists(filename): endDate = time.strftime('%Y/%m/%d %X', time.localtime()) diff --git a/plugins/mysql/js/mysql.js b/plugins/mysql/js/mysql.js index 9cb5d9380..544b8bdea 100755 --- a/plugins/mysql/js/mysql.js +++ b/plugins/mysql/js/mysql.js @@ -879,15 +879,14 @@ function openPhpmyadmin(name,username,password){ } } -function delBackup(filename,name,path){ +function delBackup(filename, name, path){ if(typeof(path) == "undefined"){ path = ""; } myPost('delete_db_backup',{filename:filename,path:path},function(){ layer.msg('执行成功!'); setTimeout(function(){ - $('.layui-layer-close2').click(); - setBackup(name); + setBackupReq(name); },2000); }); } @@ -946,6 +945,7 @@ function setLocalImport(db_name){ }); uploadStart(function(){ getList(); + layer.close(up_db); }); } @@ -1029,9 +1029,55 @@ function setLocalImport(db_name){ } -function setBackup(db_name,obj){ - myPost('get_db_backup_list', {name:db_name}, function(data){ +function setBackup(db_name){ + var layerIndex = layer.open({ + type: 1, + title: "数据库备份详情", + area: ['600px', '280px'], + closeBtn: 1, + shadeClose: false, + content: '
\ +
\ + \ + \ +
\ +
\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
文件名称文件大小备份时间操作
\ +
\ +
\ +
', + success:function(index){ + $('#btn_backup').click(function(){ + myPost('set_db_backup',{name:db_name}, function(data){ + showMsg('执行成功!', function(){ + setBackupReq(db_name); + }, {icon:1}, 2000); + }); + }); + + $('#btn_local_import').click(function(){ + setLocalImport(db_name); + }); + + setBackupReq(db_name); + }, + }); +} + +function setBackupReq(db_name, obj){ + myPost('get_db_backup_list', {name:db_name}, function(data){ var rdata = $.parseJSON(data.data); var tbody = ''; for (var i = 0; i < rdata.data.length; i++) { @@ -1041,57 +1087,15 @@ function setBackup(db_name,obj){ ' + rdata.data[i]['time'] + '\ \ 导入 | \ + 下载 | \ 删除\ \ '; } - - var layerIndex = layer.open({ - type: 1, - title: "数据库备份详情", - area: ['600px', '280px'], - closeBtn: 1, - shadeClose: false, - content: '
\ -
\ - \ - \ -
\ -
\ -
\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - ' + tbody + '\ -
文件名称文件大小备份时间操作
\ -
\ -
\ -
', - success:function(index){ - $('#btn_backup').click(function(){ - myPost('set_db_backup',{name:db_name}, function(data){ - showMsg('执行成功!', function(){ - layer.close(layerIndex); - setBackup(db_name,obj); - }, {icon:1}, 2000); - }); - }); - - $('#btn_local_import').click(function(){ - setLocalImport(db_name); - }); - }, - }); + $('#database_table tbody').html(tbody); }); } - function dbList(page, search){ var _data = {}; if (typeof(page) =='undefined'){