From 28d0fbe106feb2e90acc41965a7377b46eebf405 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Wed, 8 May 2024 17:01:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=AF=BC=E5=85=A5=E5=A4=A7?= =?UTF-8?q?=E6=96=87=E4=BB=B6sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/mysql/index.py | 130 ++++++++++++++++++++++++++++++++++++++ plugins/mysql/js/mysql.js | 56 +++++++++++++++- 2 files changed, 184 insertions(+), 2 deletions(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index 959876786..93396c8d7 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -1070,6 +1070,81 @@ def importDbExternal(): return mw.returnJson(True, 'ok') +def importDbExternalProgress(): + args = getArgs() + data = checkArgs(args, ['file', 'name']) + if not data[0]: + return data[1] + + file = args['file'] + name = args['name'] + + cmd = 'cd '+mw.getServerDir()+'/mdserver-web && source bin/activate && ' + cmd += 'python3 '+mw.getServerDir()+'/mdserver-web/plugins/mysql/index.py import_db_external_progress_bar {"file":"'+file+'","name":"'+name+'"}' + return mw.returnJson(True, 'ok',cmd) + +def importDbExternalProgressBar(): + 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'] + ext = mw.getFileSuffix(file) + 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 file.find(".sql") > -1 and file.find(".sql.gz") == -1: + import_sql = import_dir + file + + if import_sql == "": + return mw.returnJson(False, '未找SQL文件') + + pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') + sock = getSocketFile() + + my_cnf = getConf() + mysql_cmd = getServerDir() + '/bin/mysql --defaults-file=' + my_cnf + \ + ' -uroot -p"' + pwd + '" -f ' + name + mysql_cmd_progress_bar = "pv -t -p " + import_sql + '|'+ mysql_cmd + print(mysql_cmd_progress_bar) + rdata = os.system(mysql_cmd_progress_bar) + return "" + def importDbBackup(): args = getArgs() @@ -1107,6 +1182,53 @@ def importDbBackup(): return mw.returnJson(True, 'ok') +def importDbBackupProgress(): + args = getArgs() + data = checkArgs(args, ['file', 'name']) + if not data[0]: + return data[1] + + file = args['file'] + name = args['name'] + + cmd = 'cd '+mw.getServerDir()+'/mdserver-web && source bin/activate && ' + cmd += 'python3 '+mw.getServerDir()+'/mdserver-web/plugins/mysql/index.py import_db_backup_progress_bar {"file":"'+file+'","name":"'+name+'"}' + return mw.returnJson(True, 'ok',cmd) + + return mw.returnJson(True, 'ok') + +def importDbBackupProgressBar(): + args = getArgs() + data = checkArgs(args, ['file', 'name']) + if not data[0]: + return data[1] + + file = args['file'] + name = args['name'] + + file_path = mw.getRootDir() + '/backup/database/' + file + file_path_sql = mw.getRootDir() + '/backup/database/' + file.replace('.gz', '') + + if not os.path.exists(file_path_sql): + cmd = 'cd ' + mw.getRootDir() + '/backup/database && gzip -d ' + file + mw.execShell(cmd) + + local_mode = recognizeDbMode() + if local_mode == 'gtid': + pdb = pMysqlDb() + pdb.execute('reset master') + + pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') + sock = getSocketFile() + + mysql_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p"' + pwd + \ + '" ' + name + mysql_cmd_progress_bar = "pv -t -p " + file_path_sql + '|'+ mysql_cmd + print(mysql_cmd_progress_bar) + rdata = os.system(mysql_cmd_progress_bar) + return '' + + def deleteDbBackup(): args = getArgs() data = checkArgs(args, ['filename', 'path']) @@ -3258,8 +3380,16 @@ if __name__ == "__main__": print(setDbBackup()) elif func == 'import_db_backup': print(importDbBackup()) + elif func == 'import_db_backup_progress': + print(importDbBackupProgress()) + elif func == 'import_db_backup_progress_bar': + print(importDbBackupProgressBar()) elif func == 'import_db_external': print(importDbExternal()) + elif func == 'import_db_external_progress': + print(importDbExternalProgress()) + elif func == 'import_db_external_progress_bar': + print(importDbExternalProgressBar()) elif func == 'delete_db_backup': print(deleteDbBackup()) elif func == 'get_db_backup_list': diff --git a/plugins/mysql/js/mysql.js b/plugins/mysql/js/mysql.js index 6402d440d..1ccb51c8a 100755 --- a/plugins/mysql/js/mysql.js +++ b/plugins/mysql/js/mysql.js @@ -929,6 +929,31 @@ function importBackup(file,name){ }); } +function importBackupProgress(file,name){ + myPost('import_db_backup_progress',{file:file,name:name}, function(data){ + var rdata = $.parseJSON(data.data); + layer.open({ + title: "手动导入命令CMD【显示进度】", + area: ['600px', '180px'], + type:1, + closeBtn: 1, + shadeClose: false, + btn:["复制","取消"], + content: '
\ +
\ +
'+rdata.data+'
\ +
\ +
', + success:function(){ + copyText(rdata.data); + }, + yes:function(){ + copyText(rdata.data); + } + }); + }); +} + function importDbExternal(file,name){ myPost('import_db_external',{file:file,name:name}, function(data){ @@ -936,6 +961,31 @@ function importDbExternal(file,name){ }); } +function importDbExternalProgress(file,name){ + myPost('import_db_external_progress',{file:file,name:name}, function(data){ + var rdata = $.parseJSON(data.data); + layer.open({ + title: "手动导入命令CMD【显示进度】", + area: ['600px', '180px'], + type:1, + closeBtn: 1, + shadeClose: false, + btn:["复制","取消"], + content: '
\ +
\ +
'+rdata.data+'
\ +
\ +
', + success:function(){ + copyText(rdata.data); + }, + yes:function(){ + copyText(rdata.data); + } + }); + }); +} + function setLocalImport(db_name){ //上传文件 @@ -991,6 +1041,7 @@ function setLocalImport(db_name){ ' + file_list[i]['time'] + '\ \ 导入 | \ + 导入进度 | \ 删除\ \ '; @@ -1014,7 +1065,7 @@ function setLocalImport(db_name){ var layerIndex = layer.open({ type: 1, title: "从文件导入数据", - area: ['600px', '380px'], + area: ['700px', '380px'], closeBtn: 1, shadeClose: false, content: '
\ @@ -1060,7 +1111,7 @@ function setBackup(db_name){ var layerIndex = layer.open({ type: 1, title: "数据库备份详情", - area: ['600px', '280px'], + area: ['700px', '280px'], closeBtn: 1, shadeClose: false, content: '
\ @@ -1114,6 +1165,7 @@ function setBackupReq(db_name, obj){ ' + rdata.data[i]['time'] + '\ \ 导入 | \ + 导入进度 | \ 下载 | \ 删除\ \