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: '\
+
\
+ \
+
\
+
\
+
\
+
\
+
\
+ \
+ \
+ 文件名称 | \
+ 文件大小 | \
+ 备份时间 | \
+ 操作 | \
+
\
+ \
+ \
+
\
+
\
+
\
+ - 仅支持sql、zip、sql.gz、(tar.gz|gz|tgz)
\
+ - zip、tar.gz压缩包结构:test.zip或test.tar.gz压缩包内,必需包含test.sql
\
+ - 若文件过大,您还可以使用SFTP工具,将数据库文件上传到/www/backup/import
\
+
\
+
\
+
',
+ 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'){