diff --git a/class/core/config_api.py b/class/core/config_api.py index c08e129e9..1002d8840 100755 --- a/class/core/config_api.py +++ b/class/core/config_api.py @@ -27,7 +27,7 @@ from flask import request class config_api: - __version = '0.16.2' + __version = '0.16.2.2' __api_addr = 'data/api.json' def __init__(self): diff --git a/class/core/system_api.py b/class/core/system_api.py index f6a395a13..939b7634b 100755 --- a/class/core/system_api.py +++ b/class/core/system_api.py @@ -299,7 +299,8 @@ class system_api: data_list = data.strip().split("\n") mac_version = '' for x in data_list: - mac_version += x.split("\t")[1] + ' ' + xlist = x.split("\t") + mac_version += xlist[len(xlist)-1] + ' ' arch_ver = mw.execShell("arch") return mac_version + " (" + arch_ver[0].strip() + ")" @@ -366,15 +367,15 @@ class system_api: mem = psutil.virtual_memory() if mw.getOs() == 'darwin': memInfo = { - 'memTotal': mem.total / 1024 / 1024 + 'memTotal': mem.total, } memInfo['memRealUsed'] = memInfo['memTotal'] * (mem.percent / 100) else: memInfo = { - 'memTotal': mem.total / 1024 / 1024, - 'memFree': mem.free / 1024 / 1024, - 'memBuffers': mem.buffers / 1024 / 1024, - 'memCached': mem.cached / 1024 / 1024 + 'memTotal': mem.total, + 'memFree': mem.free, + 'memBuffers': mem.buffers, + 'memCached': mem.cached } memInfo['memRealUsed'] = memInfo['memTotal'] - \ @@ -558,9 +559,9 @@ class system_api: networkInfo['upTotal'] = networkIo[0] networkInfo['downTotal'] = networkIo[1] networkInfo['up'] = round(float( - networkIo[0] - session['up']) / 1024 / (ntime - session['otime']), 2) + networkIo[0] - session['up']) / (ntime - session['otime']), 2) networkInfo['down'] = round( - float(networkIo[1] - session['down']) / 1024 / (ntime - session['otime']), 2) + float(networkIo[1] - session['down']) / (ntime - session['otime']), 2) networkInfo['downPackets'] = networkIo[3] networkInfo['upPackets'] = networkIo[2] diff --git a/plugins/mariadb/index.html b/plugins/mariadb/index.html index 167114618..17aeace3f 100755 --- a/plugins/mariadb/index.html +++ b/plugins/mariadb/index.html @@ -12,6 +12,7 @@
性能优化
日志
慢日志
+BINLOG
管理列表
主从配置
diff --git a/plugins/mariadb/index.py b/plugins/mariadb/index.py index dd5988e50..c8d3996fc 100755 --- a/plugins/mariadb/index.py +++ b/plugins/mariadb/index.py @@ -90,6 +90,12 @@ def getDataDir(): tmp = re.search(rep, content) return tmp.groups()[0].strip() +def getLogBinName(): + file = getConf() + content = mw.readFile(file) + rep = 'log-bin\s*=\s*(.*)' + tmp = re.search(rep, content) + return tmp.groups()[0].strip() def getPidFile(): file = getConf() @@ -294,6 +300,53 @@ def binLog(): mw.writeFile(conf, con) return mw.returnJson(True, '设置成功!') +def binLogList(): + args = getArgs() + data = checkArgs(args, ['page', 'page_size', 'tojs']) + if not data[0]: + return data[1] + + page = int(args['page']) + page_size = int(args['page_size']) + + data_dir = getDataDir() + log_bin_name = getLogBinName() + + alist = os.listdir(data_dir) + log_bin_l = [] + for x in range(len(alist)): + f = alist[x] + t = {} + if f.startswith(log_bin_name) and not f.endswith('.index'): + abspath = data_dir + '/' + f + t['name'] = f + t['size'] = os.path.getsize(abspath) + t['time'] = mw.getDataFromInt(os.path.getctime(abspath)) + log_bin_l.append(t) + + log_bin_l = sorted(log_bin_l, key=lambda x: x['time'], reverse=True) + + # print(log_bin_l) + # print(data_dir, log_bin_name) + + count = len(log_bin_l) + + page_start = (page - 1) * page_size + page_end = page_start + page_size + if page_end > count: + page_end = count + + data = {} + page_args = {} + page_args['count'] = count + page_args['p'] = page + page_args['row'] = page_size + page_args['tojs'] = args['tojs'] + data['page'] = mw.getPage(page_args) + data['data'] = log_bin_l[page_start:page_end] + + return mw.getJson(data) + def cleanBinLog(): db = pMysqlDb() @@ -302,21 +355,6 @@ def cleanBinLog(): return mw.returnJson(True, '清理BINLOG成功!') -def setSkipGrantTables(v): - ''' - 设置是否密码验证 - ''' - conf = getConf() - con = mw.readFile(conf) - if v: - if con.find('#skip-grant-tables') != -1: - con = con.replace('#skip-grant-tables', 'skip-grant-tables') - else: - con = con.replace('skip-grant-tables', '#skip-grant-tables') - mw.writeFile(conf, con) - return True - - def getErrorLog(): args = getArgs() path = getDataDir() @@ -579,7 +617,7 @@ def setMyPort(): restart() return mw.returnJson(True, '编辑成功!') - +# python3 plugins/mariadb/index.py run_info {} def runInfo(version): if status(version) == 'stop': @@ -760,6 +798,8 @@ def rootPwd(): 'id=?', (1,)).getField('mysql_root') +# python3 plugins/mariadb/index.py import_db_external {"file":"xx.sql","name":"demo1"} +# python3 plugins/mariadb/index.py import_db_external {"file":"db_demo1_20231221_203614 2.sql","name":"demo1"} def importDbExternal(): args = getArgs() data = checkArgs(args, ['file', 'name']) @@ -806,6 +846,9 @@ def importDbExternal(): 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文件') @@ -813,12 +856,14 @@ def importDbExternal(): sock = getSocketFile() os.environ["MYSQL_PWD"] = pwd - mysql_cmd = getServerDir() + '/bin/mariadb -S ' + sock + ' -uroot -p' + \ - pwd + ' ' + name + ' < ' + import_sql + mysql_cmd = getServerDir() + '/bin/mariadb -S ' + sock + ' -uroot -p"' + \ + pwd + '" ' + name + ' < "' + import_sql+'"' # print(mysql_cmd) os.system(mysql_cmd) - os.remove(import_sql) + + if ext != 'sql': + os.remove(import_sql) return mw.returnJson(True, 'ok') @@ -982,7 +1027,7 @@ def syncGetDatabases(): host = user["Host"] break - ps = mw.getMsg('INPUT_PS') + ps = vdb_name if vdb_name == 'test': ps = mw.getMsg('DATABASE_TEST') addTime = time.strftime('%Y-%m-%d %X', time.localtime()) @@ -1054,12 +1099,21 @@ def setRootPwd(version=''): if not data[0]: return data[1] + #强制修改 + force = 0 + if 'force' in args and args['force'] == '1': + force = 1 + + password = args['password'] try: pdb = pMysqlDb('mysql') result = pdb.query("show databases") isError = isSqlError(result) if isError != None: + if force == 1: + pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,)) + return mw.returnJson(True, '【强制修改】数据库root密码修改成功(不意为成功连接数据)!') return isError cmd = "ALTER USER 'root'@'localhost' IDENTIFIED BY '" + password + "';" @@ -1069,7 +1123,12 @@ def setRootPwd(version=''): pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,)) orm = pMysqlDb() orm.execute("flush privileges") - return mw.returnJson(True, '数据库root密码修改成功!') + + msg = '' + if force == 1: + msg = ',无须强制!' + + return mw.returnJson(True, '数据库root密码修改成功!' + msg) except Exception as ex: return mw.returnJson(False, '修改错误:' + str(ex)) @@ -1276,16 +1335,58 @@ def setDbAccess(): psdb.where('username=?', (name,)).save('accept,rw', (access, 'rw',)) 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,)) + + db_option = "-S " + serverdir + "/mysql.sock" + cmd_pass = serverdir + '/bin/mariadb ' + db_option + ' -uroot -e' + cmd_pass = cmd_pass + \ + "\"flush privileges;use mysql;grant all privileges on *.* to 'root'@'localhost' identified by '" + pwd + "';" + cmd_pass = cmd_pass + "flush privileges;\"" + + data = mw.execShell(cmd_pass) + # print(data) + return True def fixDbAccess(version): + + pdb = pMysqlDb() + mdb_ddir = getDataDir() + if not os.path.exists(mdb_ddir): + return mw.returnJson(False, '数据目录不存在,尝试重启重建!') + 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") + openSkipGrantTables() + appCMD(version, 'start') + time.sleep(3) + resetDbRootPwd(version) + + appCMD(version, 'stop') + closeSkipGrantTables() appCMD(version, 'start') return mw.returnJson(True, '修复成功!') return mw.returnJson(True, '正常无需修复!') @@ -1588,6 +1689,13 @@ def setDbMasterAccess(): psdb.where('username=?', (username,)).save('accept', (access,)) return mw.returnJson(True, '设置成功!') +def resetMaster(version=''): + pdb = pMysqlDb() + r = pdb.execute('reset master') + isError = isSqlError(r) + if isError != None: + return isError + return mw.returnJson(True, '重置成功!') def getMasterDbList(version=''): args = getArgs() @@ -1899,8 +2007,7 @@ def getMasterRepSlaveUserCmd(version): if mode == "gtid": sql = "CHANGE MASTER " + connection_name + "TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \ clist[0]['username'] + "', MASTER_PASSWORD='" + \ - clist[0]['password'] + "', " + "MASTER_LOG_FILE='" + mstatus[0]["File"] + \ - "',MASTER_USE_GTID=no,MASTER_CONNECT_RETRY=10;" + clist[0]['password'] + "',MASTER_USE_GTID=no,MASTER_CONNECT_RETRY=10;" else: sql = "CHANGE MASTER " + connection_name + "TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \ clist[0]['username'] + "', MASTER_PASSWORD='" + \ @@ -2186,6 +2293,58 @@ def getSlaveList(version=''): data['data'] = dlist return mw.getJson(data) +def trySlaveSyncBugfix(version=''): + if status(version) == 'stop': + return mw.returnJson(False, 'MySQL未启动', []) + + mode_file = getSyncModeFile() + if not os.path.exists(mode_file): + return mw.returnJson(False, '需要先设置同步配置') + + mode = mw.readFile(mode_file) + if mode != 'sync-user': + return mw.returnJson(False, '仅支持【同步账户】模式') + + conn = pSqliteDb('slave_sync_user') + slave_sync_data = conn.field('ip,port,user,pass,mode,cmd').select() + if len(slave_sync_data) < 1: + return mw.returnJson(False, '需要先添加【同步用户】配置!') + + # print(slave_sync_data) + # 本地从库 + sdb = pMysqlDb() + + gtid_purged = '' + + for i in range(len(slave_sync_data)): + port = slave_sync_data[i]['port'] + password = slave_sync_data[i]['pass'] + host = slave_sync_data[i]['ip'] + user = slave_sync_data[i]['user'] + + # print(port, password, host) + + mdb = mw.getMyORM() + mdb.setHost(host) + mdb.setPort(port) + mdb.setUser(user) + mdb.setPwd(password) + mdb.setSocket('') + + # var_gtid = mdb.query('show VARIABLES like "%gtid_purged%"') + var_gtid = mdb.query('select @@global.gtid_current_pos as Value') + #print(var_gtid) + if len(var_gtid) > 0: + gtid_purged += var_gtid[0]['Value'] + ',' + + gtid_purged = gtid_purged.strip(',') + sql = "set @@global.gtid_slave_pos='" + gtid_purged + "'" + + sdb.query('stop all slaves') + # print(sql) + sdb.query(sql) + sdb.query('start all slaves') + return mw.returnJson(True, '修复成功!') def getSlaveSyncCmd(version=''): root = mw.getRunDir() @@ -2226,7 +2385,7 @@ def parseSlaveSyncCmd(cmd): a[kv[0]] = kv[1].replace("'", '').replace("'", '').replace(";", '') return a - +# python3 plugins/mariadb/index.py init_slave_status {} def initSlaveStatusSyncUser(version=''): conn = pSqliteDb('slave_sync_user') @@ -2267,7 +2426,7 @@ def initSlaveStatusSyncUser(version=''): try: pinfo = parseSlaveSyncCmd(cmd_sql) except Exception as e: - return mw.returnJson(False, base_t + '->CMD同步命令不合规范!') + return mw.returnJson(False, base_t + '->CMD同步命令不合规范:'+str(e)) pdb.query(cmd_sql) @@ -2452,8 +2611,7 @@ def fullSync(version=''): if args['begin'] == '1': cmd = 'cd ' + mw.getRunDir() + ' && python3 ' + \ getPluginDir() + \ - '/index.py do_full_sync {"db":"' + \ - args['db'] + '","sign":"' + sign + '"} &' + '/index.py do_full_sync {"db":"' + args['db'] + '","sign":"' + sign + '"} &' # print(cmd) mw.execShell(cmd) return json.dumps({'code': 0, 'msg': '同步数据中!', 'progress': 0}) @@ -2475,6 +2633,7 @@ def fullSync(version=''): return json.dumps({'code': 0, 'msg': '点击开始,开始同步!', 'progress': 0}) +# python3 plugins/mariadb/index.py do_full_sync {"db":"demo1","sign":"","beigin":"1"} def doFullSync(version=''): mode_file = getSyncModeFile() if not os.path.exists(mode_file): @@ -2512,13 +2671,16 @@ def doFullSyncUser(version=''): ip = data['ip'] bak_file = '/tmp/tmp.sql' + if os.path.exists(bak_file): + os.system("rm -rf " + bak_file) writeDbSyncStatus({'code': 0, 'msg': '开始同步...', 'progress': 0}) writeDbSyncStatus({'code': 1, 'msg': '远程导出数据...', 'progress': 10}) if not os.path.exists(bak_file): - dump_sql_data = getServerDir() + "/bin/mysqldump --force --opt --default-character-set=utf8 --single-transaction -h" + ip + " -P" + \ - port + " -u" + user + " -p" + apass + " " + sync_db + " > " + bak_file + # https://mariadb.com/kb/zh-cn/mariadb-dump/ + dump_sql_data = getServerDir() + "/bin/mariadb-dump -f --opt --default-character-set=utf8 --single-transaction -h" + ip + " -P" + \ + port + " -u" + user + " -p'" + apass + "' " + sync_db + ">" + bak_file print(dump_sql_data) mw.execShell(dump_sql_data) @@ -2526,8 +2688,9 @@ def doFullSyncUser(version=''): if os.path.exists(bak_file): pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') sock = getSocketFile() - my_import_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \ - ' ' + sync_db + ' < ' + bak_file + my_import_cmd = getServerDir() + '/bin/mariadb -S ' + sock + " -uroot -p'" + pwd + \ + "' " + sync_db + '<' + bak_file + print(my_import_cmd) mw.execShell(my_import_cmd) pinfo = parseSlaveSyncCmd(data['cmd']) @@ -2729,6 +2892,8 @@ if __name__ == "__main__": print(getConf()) elif func == 'bin_log': print(binLog()) + elif func == 'binlog_list': + print(binLogList()) elif func == 'clean_bin_log': print(cleanBinLog()) elif func == 'error_log': @@ -2797,6 +2962,8 @@ if __name__ == "__main__": print(getDbrunMode(version)) elif func == 'set_dbrun_mode': print(setDbrunMode(version)) + elif func == 'reset_master': + print(resetMaster(version)) elif func == 'get_masterdb_list': print(getMasterDbList(version)) elif func == 'get_master_status': @@ -2821,6 +2988,8 @@ if __name__ == "__main__": print(getMasterRepSlaveUserCmd(version)) elif func == 'get_slave_list': print(getSlaveList(version)) + elif func == 'try_slave_sync_bugfix': + print(trySlaveSyncBugfix(version)) elif func == 'get_slave_sync_cmd': print(getSlaveSyncCmd(version)) elif func == 'get_slave_ssh_list': diff --git a/plugins/mariadb/index_mariadb.py b/plugins/mariadb/index_mariadb.py new file mode 100644 index 000000000..2eed99a8e --- /dev/null +++ b/plugins/mariadb/index_mariadb.py @@ -0,0 +1,186 @@ +# coding:utf-8 + +import sys +import io +import os +import time +import subprocess +import re +import json + +sys.path.append(os.getcwd() + "/class/core") +import mw + + +if mw.isAppleSystem(): + cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\'' + info = mw.execShell(cmd) + p = "/usr/local/lib/" + info[0].strip() + "/site-packages" + sys.path.append(p) + + +app_debug = False +if mw.isAppleSystem(): + app_debug = True + + +def getPluginName(): + return 'mariadb' + + +def getPluginDir(): + return mw.getPluginDir() + '/' + getPluginName() + + +def getSPluginDir(): + return '/www/server/mdserver-web/plugins/' + getPluginName() + + +def getServerDir(): + return mw.getServerDir() + '/' + getPluginName() + + +def getConf(): + path = getServerDir() + '/etc/my.cnf' + return path + + +def getDataDir(): + file = getConf() + content = mw.readFile(file) + rep = 'datadir\s*=\s*(.*)' + tmp = re.search(rep, content) + return tmp.groups()[0].strip() + + +def getRelayLogName(): + file = getConf() + content = mw.readFile(file) + rep = 'relay-log\s*=\s*(.*)' + tmp = re.search(rep, content) + return tmp.groups()[0].strip() + + +def getLogBinName(): + file = getConf() + content = mw.readFile(file) + rep = 'log-bin\s*=\s*(.*)' + tmp = re.search(rep, content) + return tmp.groups()[0].strip() + + +def binLogListLook(args): + + file = args['file'] + line = args['line'] + + data_dir = getDataDir() + my_bin = getServerDir() + '/bin' + my_binlog_cmd = my_bin + '/mysqlbinlog' + + cmd = my_binlog_cmd + ' --no-defaults ' + \ + data_dir + '/' + file + '|tail -' + str(line) + + data = mw.execShell(cmd) + + rdata = {} + rdata['cmd'] = cmd + rdata['data'] = data[0] + + return rdata + + +def binLogListLookDecode(args): + + file = args['file'] + line = args['line'] + + data_dir = getDataDir() + my_bin = getServerDir() + '/bin' + my_binlog_cmd = my_bin + '/mysqlbinlog' + + cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \ + data_dir + '/' + file + '|tail -' + str(line) + + data = mw.execShell(cmd) + + rdata = {} + rdata['cmd'] = cmd + rdata['data'] = data[0] + + return rdata + + +def binLogListTraceRelay(args): + rdata = {} + file = args['file'] + line = args['line'] + + relay_name = getRelayLogName() + data_dir = getDataDir() + alist = os.listdir(data_dir) + relay_list = [] + for x in range(len(alist)): + f = alist[x] + t = {} + if f.startswith(relay_name) and not f.endswith('.index'): + relay_list.append(f) + + relay_list = sorted(relay_list, reverse=True) + if len(relay_list) == 0: + rdata['cmd'] = '' + rdata['data'] = '无Relay日志' + return rdata + + file = relay_list[0] + + my_bin = getServerDir() + '/bin' + my_binlog_cmd = my_bin + '/mysqlbinlog' + + cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \ + data_dir + '/' + file + '|tail -' + str(line) + + data = mw.execShell(cmd) + + rdata['cmd'] = cmd + rdata['data'] = data[0] + + return rdata + + +def binLogListTraceBinLog(args): + rdata = {} + file = args['file'] + line = args['line'] + + data_dir = getDataDir() + log_bin_name = getLogBinName() + + alist = os.listdir(data_dir) + log_bin_l = [] + for x in range(len(alist)): + f = alist[x] + t = {} + if f.startswith(log_bin_name) and not f.endswith('.index'): + log_bin_l.append(f) + + if len(log_bin_l) == 0: + rdata['cmd'] = '' + rdata['data'] = '无BINLOG' + return rdata + + log_bin_l = sorted(log_bin_l, reverse=True) + file = log_bin_l[0] + + my_bin = getServerDir() + '/bin' + my_binlog_cmd = my_bin + '/mysqlbinlog' + + cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \ + data_dir + '/' + file + '|tail -' + str(line) + + data = mw.execShell(cmd) + + rdata['cmd'] = cmd + rdata['data'] = data[0] + + return rdata diff --git a/plugins/mariadb/js/mariadb.js b/plugins/mariadb/js/mariadb.js index ca786a3c1..a5fa5b685 100755 --- a/plugins/mariadb/js/mariadb.js +++ b/plugins/mariadb/js/mariadb.js @@ -58,6 +58,62 @@ function myAsyncPost(method,args){ return syncPost('/plugins/run', {name:'mysql', 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'] = 'mariadb'; + req_data['func'] = method; + req_data['script']='index_mariadb'; + 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'] = 'mariadb'; + req_data['func'] = method; + req_data['script']='index_mariadb'; + 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 runInfo(){ myPost('run_info','',function(data){ @@ -83,7 +139,7 @@ function runInfo(){cmd | \ +\ + |
文件名称 | \ +大小 | \ +时间 | \ +操作 | \ +
---|
\ Master[主]配置\ \ - \ + \
\当前可用物理内存小于64M,这可能导致MySQL自动停止,站点502等错误,请尝试释放内存!
') + } } function getInfo() { $.get("/system/system_total", function(info) { - setCookie("memRealUsed", parseInt(info.memRealUsed)); - $("#memory").html(parseInt(info.memRealUsed) + '/' + parseInt(info.memTotal) + ' (MB)'); - setCookie("mem-before", $("#memory").text()); - if (!getCookie('memSize')) setCookie('memSize', parseInt(info.memTotal)); - var memPre = Math.floor(info.memRealUsed / (info.memTotal / 100)); - $("#left").html(memPre); - setcolor(memPre, "#left", 75, 90, 95); + + setMemImg(info); + $("#info").html(info.system); $("#running").html(info.time); var _system = info.system; @@ -240,13 +248,8 @@ function getInfo() { } $("#core").html(info.cpuNum + ' 核心'); $("#state").html(info.cpuRealUsed); - setcolor(memPre, "#state", 30, 70, 90); - var memFree = info.memTotal - info.memRealUsed; - - if (memFree < 64) { - $("#messageError").show(); - $("#messageError").append('' + lan.index.mem_warning + '
') - } + setcolor(info.cpuRealUsed, "#state", 30, 70, 90); + // if (info.isuser > 0) { // $("#messageError").show(); @@ -280,9 +283,10 @@ function setcolor(pre, s, s1, s2, s3) { function getNet() { var up, down; $.get("/system/network", function(net) { + $("#InterfaceSpeed").html(lan.index.interfacespeed + ": 1.0Gbps"); - $("#upSpeed").html(net.up + ' KB'); - $("#downSpeed").html(net.down + ' KB'); + $("#upSpeed").html(toSize(net.up)); + $("#downSpeed").html(toSize(net.down)); $("#downAll").html(toSize(net.downTotal)); $("#downAll").attr('title', lan.index.package + ':' + net.downPackets) $("#upAll").html(toSize(net.upTotal)); @@ -292,18 +296,23 @@ function getNet() { setcolor(net.cpu[0], "#state", 30, 70, 90); setCookie("upNet", net.up); setCookie("downNet", net.down); + + //负载 getLoad(net.load); - - // setMemImg(net.mem); - setImg(); + //内存 + setMemImg(net.mem); + + //绑定hover事件 + setImg(); showCpuTips(net); + },'json'); } //网络Io function netImg() { - var myChartNetwork = echarts.init(document.getElementById('netImg')); + var echartsNetImg = echarts.init(document.getElementById('netImg')); var xData = []; var yData = []; var zData = []; @@ -333,10 +342,27 @@ function netImg() { return ts(h) + ':' + ts(mm) + ':' + ts(s); } + var default_unit = 'KB/s'; function addData(shift) { xData.push(getTime()); - yData.push(getCookie("upNet")); - zData.push(getCookie("downNet")); + + if (getCookie("upNet") > getCookie("downNet") ){ + tmp = getCookie("upNet"); + } else { + tmp = getCookie("downNet"); + } + var tmpSize = toSize(tmp); + default_unit = tmpSize.split(' ')[1] + '/s'; + + + var upNetTmp = toSize(getCookie("upNet")); + var downNetTmp = toSize(getCookie("downNet")); + + var upNetTmpSize = upNetTmp.split(' ')[0]; + var downNetTmp = downNetTmp.split(' ')[0] + + yData.push(upNetTmpSize); + zData.push(downNetTmp); if (shift) { xData.shift(); yData.shift(); @@ -379,20 +405,16 @@ function netImg() { } }, yAxis: { - name: lan.index.unit + 'KB/s', + name: '单位 '+ default_unit, splitLine: { - lineStyle: { - color: "#eee" - } + lineStyle: { color: "#eee" } }, axisLine: { - lineStyle: { - color: "#666" - } + lineStyle: { color: "#666" } } }, series: [{ - name: lan.index.net_up, + name: '上行', type: 'line', data: yData, smooth: true, @@ -420,8 +442,9 @@ function netImg() { width: 1 } } - }, { - name: lan.index.net_down, + }, + { + name: '下行', type: 'line', data: zData, smooth: true, @@ -432,21 +455,21 @@ function netImg() { normal: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, - color: 'rgba(30, 144, 255,0.5)' + color: 'rgba(30, 144, 255,0.5)', }, { offset: 1, - color: 'rgba(30, 144, 255,0.8)' + color: 'rgba(30, 144, 255,0.8)', }], false) } }, itemStyle: { normal: { - color: '#52a9ff' + color: '#52a9ff', } }, lineStyle: { normal: { - width: 1 + width: 1, } } }] @@ -454,7 +477,12 @@ function netImg() { setInterval(function() { getNet(); addData(true); - myChartNetwork.setOption({ + echartsNetImg.setOption({ + yAxis: { + name: '单位 '+ default_unit, + splitLine: { lineStyle: { color: "#eee" } }, + axisLine: { lineStyle: { color: "#666" } } + }, xAxis: { data: xData }, @@ -467,10 +495,11 @@ function netImg() { }] }); }, 3000); + // 使用刚指定的配置项和数据显示图表。 - myChartNetwork.setOption(option); + echartsNetImg.setOption(option); window.addEventListener("resize", function() { - myChartNetwork.resize(); + echartsNetImg.resize(); }); } @@ -612,7 +641,6 @@ function reBoot() { content: '' }); - $('.rebt-con a').click(function () { var type = $(this).attr('data-id'); switch (type) { @@ -737,6 +765,7 @@ function setSafeHide() { setCookie('safeMsg', '1'); $("#safeMsg").remove(); } + //查看报告 function showDanger(num, port) { var atxt = "因未使用安全隔离登录,所有IP都可以尝试连接,存在较高风险,请立即处理。"; @@ -750,15 +779,15 @@ function showDanger(num, port) { closeBtn: 1, shift: 5, content: '风险类型: | 暴力破解 说明 |
累计遭遇攻击总数: | ' + num + ' 详细(数据直接来源本服务器日志) |
风险等级: | 较高风险 |
风险描述: | ' + atxt + ' |
可参考解决方案: | 方案一:修改SSH默认端口,修改SSH验证方式为数字证书,清除近期登陆日志。 方案二:购买宝塔企业运维版,一键部署安全隔离服务,高效且方便。 |
风险类型: | 暴力破解 说明 |
累计遭遇攻击总数: | ' + num + ' 详细(数据直接来源本服务器日志) |
风险等级: | 较高风险 |
风险描述: | ' + atxt + ' |
可参考解决方案: | 方案一:修改SSH默认端口,修改SSH验证方式为数字证书,清除近期登陆日志。 方案二:购买宝塔企业运维版,一键部署安全隔离服务,高效且方便。 |