From 32e09911648a1518f90de63d14122072d4dd7a67 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Tue, 18 Apr 2017 18:56:45 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9A=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BA=86=E7=AB=AF=E5=8F=A3=E5=8F=B7=E5=90=8E=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E6=AD=A3=E5=B8=B8=E5=B7=A5=E4=BD=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/share/etc/core.ini.in | 2 +- server/tp_core/core/ts_env.cpp | 17 +++++++++++++++++ server/tp_core/core/ts_env.h | 3 +++ server/tp_core/core/ts_http_rpc.cpp | 6 +++++- server/tp_core/core/ts_web_rpc.cpp | 27 +++++++++++++++++---------- 5 files changed, 43 insertions(+), 12 deletions(-) diff --git a/server/share/etc/core.ini.in b/server/share/etc/core.ini.in index 38b1169..64b4b4a 100644 --- a/server/share/etc/core.ini.in +++ b/server/share/etc/core.ini.in @@ -17,7 +17,7 @@ debug=0 ; 'replay-path' define the replay file location. if not set, default location ; to $INSTDIR%/data/replay/ -;replay-path=/var/lib/teleport/data/replay +;replay-path=/var/lib/teleport/replay web-server-rpc=http://127.0.0.1:7190/rpc diff --git a/server/tp_core/core/ts_env.cpp b/server/tp_core/core/ts_env.cpp index 51b976c..0cf9698 100644 --- a/server/tp_core/core/ts_env.cpp +++ b/server/tp_core/core/ts_env.cpp @@ -117,6 +117,16 @@ bool TsEnv::init(bool load_config) EXLOG_DEBUG(true); ex_wstr tmp; + + if (!ps->GetStr(L"web-server-rpc", tmp)) + { + web_server_rpc = "http://127.0.0.1:7190/rpc"; + } + else + { + ex_wstr2astr(tmp, web_server_rpc); + } + ps = m_ini.GetSection(L"rpc"); if (!ps->GetStr(L"bind-ip", tmp)) { @@ -125,11 +135,18 @@ bool TsEnv::init(bool load_config) else { ex_wstr2astr(tmp, rpc_bind_ip); + if (rpc_bind_ip == "localhost") + rpc_bind_ip = "127.0.0.1"; } + if (!ps->GetInt(L"bind-port", rpc_bind_port)) { rpc_bind_port = TS_HTTP_RPC_PORT; } + char port_str[20] = { 0 }; + ex_strformat(port_str, 20, "%d", rpc_bind_port); + core_server_rpc = "http://" + rpc_bind_ip + ":" + port_str + "/rpc"; + return true; } diff --git a/server/tp_core/core/ts_env.h b/server/tp_core/core/ts_env.h index 840de68..44775b9 100644 --- a/server/tp_core/core/ts_env.h +++ b/server/tp_core/core/ts_env.h @@ -22,6 +22,9 @@ public: ex_astr rpc_bind_ip; int rpc_bind_port; + ex_astr web_server_rpc; + ex_astr core_server_rpc; + private: ExIniFile m_ini; }; diff --git a/server/tp_core/core/ts_http_rpc.cpp b/server/tp_core/core/ts_http_rpc.cpp index 2a6800e..448dc4c 100644 --- a/server/tp_core/core/ts_http_rpc.cpp +++ b/server/tp_core/core/ts_http_rpc.cpp @@ -77,7 +77,11 @@ bool TsHttpRpc::init(void) m_host_port = g_env.rpc_bind_port; char addr[128] = { 0 }; - if (0 == strcmp(m_host_ip.c_str(), "127.0.0.1") || 0 == strcmp(m_host_ip.c_str(), "localhost")) +// if (0 == strcmp(m_host_ip.c_str(), "127.0.0.1") || 0 == strcmp(m_host_ip.c_str(), "localhost")) +// ex_strformat(addr, 128, ":%d", m_host_port); +// else +// ex_strformat(addr, 128, "%s:%d", m_host_ip.c_str(), m_host_port); + if (0 == strcmp(m_host_ip.c_str(), "0.0.0.0")) ex_strformat(addr, 128, ":%d", m_host_port); else ex_strformat(addr, 128, "%s:%d", m_host_ip.c_str(), m_host_port); diff --git a/server/tp_core/core/ts_web_rpc.cpp b/server/tp_core/core/ts_web_rpc.cpp index 6abf582..7799baf 100644 --- a/server/tp_core/core/ts_web_rpc.cpp +++ b/server/tp_core/core/ts_web_rpc.cpp @@ -13,7 +13,8 @@ bool ts_web_rpc_register_core() jreq["method"] = "register_core"; //jreq["param"]["ip"] = g_env.rpc_bind_ip.c_str(); //jreq["param"]["port"] = g_env.rpc_bind_port; - jreq["param"]["rpc"] = "http://127.0.0.1:52080/rpc"; + //jreq["param"]["rpc"] = "http://127.0.0.1:52080/rpc"; + jreq["param"]["rpc"] = g_env.core_server_rpc; // ExIniFile& ini = g_env.get_ini(); // ExIniSection* sec = ini.GetSection(L"common"); @@ -33,7 +34,9 @@ bool ts_web_rpc_register_core() ex_astr param; ts_url_encode(json_param.c_str(), param); - ex_astr url = "http://127.0.0.1:7190/rpc?"; + //ex_astr url = "http://127.0.0.1:7190/rpc?"; + ex_astr url = g_env.web_server_rpc; + url += "?"; url += param; ex_astr body; @@ -52,7 +55,10 @@ bool ts_web_rpc_get_auth_info(int auth_id, Json::Value& jret) ex_astr param; ts_url_encode(json_param.c_str(), param); - ex_astr url = "http://127.0.0.1:7190/rpc?"; + + //ex_astr url = "http://127.0.0.1:7190/rpc?"; + ex_astr url = g_env.web_server_rpc; + url += "?"; url += param; ex_astr body; @@ -114,7 +120,10 @@ bool ts_web_rpc_session_begin(TS_SESSION_INFO& info, int& record_id) ex_astr param; ts_url_encode(json_param.c_str(), param); - ex_astr url = "http://127.0.0.1:7190/rpc?"; + + //ex_astr url = "http://127.0.0.1:7190/rpc?"; + ex_astr url = g_env.web_server_rpc; + url += "?"; url += param; ex_astr body; @@ -157,13 +166,11 @@ bool ts_web_rpc_session_end(int record_id, int ret_code) ex_astr param; ts_url_encode(json_param.c_str(), param); - ex_astr url = "http://127.0.0.1:7190/rpc?"; - url += param; -// ex_astr param; -// ts_url_encode("{\"method\":\"session_end\",\"param\":[]}", param); -// ex_astr url = "http://127.0.0.1:7190/rpc?"; -// url += param; + //ex_astr url = "http://127.0.0.1:7190/rpc?"; + ex_astr url = g_env.web_server_rpc; + url += "?"; + url += param; ex_astr body; return ts_http_get(url, body); From 94aebc3277a79f5ed770d171b25e9bed1d36b919 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Wed, 19 Apr 2017 18:44:07 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=AF=86=E7=A0=81=E4=BC=9A=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teleport/app/eom_app/controller/auth.py | 9 +- server/www/teleport/static/js/ui/pwd.js | 88 +++++++++---------- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/server/www/teleport/app/eom_app/controller/auth.py b/server/www/teleport/app/eom_app/controller/auth.py index f88c4a9..75896c5 100644 --- a/server/www/teleport/app/eom_app/controller/auth.py +++ b/server/www/teleport/app/eom_app/controller/auth.py @@ -142,18 +142,19 @@ class ModifyPwd(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-1) + self.write_json(-11) return _old_pwd = args['o_pwd'] _new_pwd = args['n_pwd'] if _old_pwd is None or _new_pwd is None: - self.write_json(-1) + self.write_json(-12) return user_info = self.get_current_user() try: ret = user.modify_pwd(_old_pwd, _new_pwd, user_info['id']) - self.write_json(0, ret) + self.write_json(ret) except: - self.write_json(-1) + log.e('modify password failed.') + self.write_json(-13) diff --git a/server/www/teleport/static/js/ui/pwd.js b/server/www/teleport/static/js/ui/pwd.js index c529679..9da6f19 100644 --- a/server/www/teleport/static/js/ui/pwd.js +++ b/server/www/teleport/static/js/ui/pwd.js @@ -1,45 +1,45 @@ -/** - * Created by mi on 2016/7/4. - */ - -ywl.clear_input = function() { - $("#current-pwd").val(''); - $("#new-pwd-1").val(''); - $("#new-pwd-2").val(''); -}; - -ywl.on_init = function (cb_stack, cb_args) { - $("#btn-modify-pwd").click(function () { - var old_pwd = $("#current-pwd").val(); - var new_pwd_1 = $("#new-pwd-1").val(); - var new_pwd_2 = $("#new-pwd-2").val(); - if(old_pwd.length == 0) { - ywl.notify_error('请输入当前密码!'); - return; - } - if(new_pwd_1.length == 0) { - ywl.notify_error('请设置新密码!'); - return; - } - if (new_pwd_1 != new_pwd_2) { - ywl.notify_error('两次密码输入不一致!'); - return; - } - ywl.ajax_post_json('/auth/modify-pwd', {o_pwd: old_pwd, n_pwd: new_pwd_1, callback: 1}, - function (ret) { - if (ret.data.code == 0) { - ywl.notify_success('密码修改成功!'); - ywl.clear_input(); - } else if (ret.data.code == -2) { - ywl.notify_error('密码错误!'); - } else { - ywl.notify_error('密码修改失败!'); - } - - }, - function () { - ywl.notify_error('密码修改失败!'); - } - ); - }); +/** + * Created by mi on 2016/7/4. + */ + +ywl.clear_input = function() { + $("#current-pwd").val(''); + $("#new-pwd-1").val(''); + $("#new-pwd-2").val(''); +}; + +ywl.on_init = function (cb_stack, cb_args) { + $("#btn-modify-pwd").click(function () { + var old_pwd = $("#current-pwd").val(); + var new_pwd_1 = $("#new-pwd-1").val(); + var new_pwd_2 = $("#new-pwd-2").val(); + if(old_pwd.length == 0) { + ywl.notify_error('请输入当前密码!'); + return; + } + if(new_pwd_1.length == 0) { + ywl.notify_error('请设置新密码!'); + return; + } + if (new_pwd_1 != new_pwd_2) { + ywl.notify_error('两次密码输入不一致!'); + return; + } + ywl.ajax_post_json('/auth/modify-pwd', {o_pwd: old_pwd, n_pwd: new_pwd_1, callback: 1}, + function (ret) { + if (ret.code == 0) { + ywl.notify_success('密码修改成功!'); + ywl.clear_input(); + } else if (ret.code == -2) { + ywl.notify_error('密码错误!'); + } else { + ywl.notify_error('密码修改失败!errcode:'+ret.code); + } + + }, + function () { + ywl.notify_error('密码修改失败!'); + } + ); + }); }; \ No newline at end of file From 3c3703d9a98acae4186e8f5a740a61701d0fa3d9 Mon Sep 17 00:00:00 2001 From: apexliu Date: Sun, 23 Apr 2017 18:02:38 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=89=80=E6=9C=89=E7=9A=84json=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E5=9D=87=E8=BF=94=E5=9B=9E=E9=94=99=E8=AF=AF=E5=80=BC?= =?UTF-8?q?=E5=92=8C=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=EF=BC=8C=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E5=AE=9A=E4=BD=8D=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teleport/app/eom_app/controller/auth.py | 44 +-- .../teleport/app/eom_app/controller/host.py | 359 ++++++++---------- .../app/eom_app/controller/maintenance.py | 7 +- .../teleport/app/eom_app/controller/record.py | 30 +- .../teleport/app/eom_app/controller/rpc.py | 46 +-- .../teleport/app/eom_app/controller/user.py | 125 +++--- .../www/teleport/app/eom_app/module/host.py | 2 - .../teleport/app/eom_common/eomcore/logger.py | 20 +- .../www/teleport/static/js/ui/admin_host.js | 18 +- 9 files changed, 287 insertions(+), 364 deletions(-) diff --git a/server/www/teleport/app/eom_app/controller/auth.py b/server/www/teleport/app/eom_app/controller/auth.py index 75896c5..0abc876 100644 --- a/server/www/teleport/app/eom_app/controller/auth.py +++ b/server/www/teleport/app/eom_app/controller/auth.py @@ -9,8 +9,6 @@ from eom_common.eomcore.logger import * from .base import TPBaseHandler, TPBaseUserAuthHandler, TPBaseJsonHandler, TPBaseUserAuthJsonHandler from eom_app.app.util import gen_captcha -cfg = app_cfg() - class LoginHandler(TPBaseHandler): def get(self): @@ -37,8 +35,7 @@ class VerifyUser(TPBaseJsonHandler): def post(self): code = self.get_session('captcha') if code is None: - self.write_json(-1, '验证码已失效') - return + return self.write_json(-1, '验证码已失效') self.del_session('captcha') @@ -50,23 +47,20 @@ class VerifyUser(TPBaseJsonHandler): userpwd = args['userpwd'] remember = args['remember'] else: - self.write_json(-1, '系统内部错误') - return + return self.write_json(-1, '参数错误') if code.lower() != captcha.lower(): - self.write_json(-1, '验证码错误') - return + return self.write_json(-1, '验证码错误') try: user_id, account_type, nickname, locked = user.verify_user(username, userpwd) if locked == 1: return self.write_json(-1, '账号被锁定,请联系管理员!') if user_id == 0: - if cfg.app_mode == APP_MODE_MAINTENANCE: - self.write_json(-2, '系统维护中,请稍候再试!') + if app_cfg().app_mode == APP_MODE_MAINTENANCE: + return self.write_json(-2, '系统维护中,请稍候再试!') else: - self.write_json(-1, '用户名/密码错误!') - return + return self.write_json(-1, '用户名/密码错误!') _user = self.get_session('user') if _user is None: @@ -94,7 +88,7 @@ class VerifyUser(TPBaseJsonHandler): except: log.e('can not set session.') - self.write_json(-1, '无法记录用户登录状态!') + return self.write_json(-1, '发生异常,无法登录!') class LogoutHandler(TPBaseUserAuthHandler): @@ -118,22 +112,19 @@ class VerifyCaptchaHandler(TPBaseJsonHandler): def post(self): code = self.get_session('captcha') if code is None: - self.write_json(-1) - return + return self.write_json(-1, '验证码已失效') args = self.get_argument('args', None) if args is not None: args = json.loads(args) captcha = args['captcha'] else: - self.write_json(-1) - return + return self.write_json(-1, '参数错误') if code.lower() != captcha.lower(): - self.write_json(-1) - return + return self.write_json(-1, '验证码错误') - self.write_json(0) + return self.write_json(0) class ModifyPwd(TPBaseUserAuthJsonHandler): @@ -142,19 +133,20 @@ class ModifyPwd(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-11) - return + return self.write_json(-11, '参数错误') _old_pwd = args['o_pwd'] _new_pwd = args['n_pwd'] if _old_pwd is None or _new_pwd is None: - self.write_json(-12) - return + return self.write_json(-12, '参数错误') user_info = self.get_current_user() try: ret = user.modify_pwd(_old_pwd, _new_pwd, user_info['id']) - self.write_json(ret) + if 0 == ret: + return self.write_json(0) + else: + return self.write_json(-14, '数据库操作错误,errcode:{}'.format(ret)) except: log.e('modify password failed.') - self.write_json(-13) + return self.write_json(-13, '发生异常') diff --git a/server/www/teleport/app/eom_app/controller/host.py b/server/www/teleport/app/eom_app/controller/host.py index cb33257..e567f48 100644 --- a/server/www/teleport/app/eom_app/controller/host.py +++ b/server/www/teleport/app/eom_app/controller/host.py @@ -45,7 +45,7 @@ class IndexHandler(TPBaseUserAuthHandler): self.render('host/common_index.mako', page_param=json.dumps(param)) -class UploadAndImportHandler(TPBaseAdminAuthJsonHandler): +class UploadAndImportHandler(TPBaseAdminAuthHandler): # TODO: 导入操作可能会比较耗时,应该分离导入和获取导入状态两个过程,在页面上可以呈现导入进度,并列出导出成功/失败的项 @tornado.gen.coroutine @@ -62,11 +62,12 @@ class UploadAndImportHandler(TPBaseAdminAuthJsonHandler): """ ret = dict() ret['code'] = 0 - ret['msg'] = list() # 记录跳过的行(格式不正确,或者数据重复等) + ret['message'] = '' + ret['data'] = {} + ret['data']['msg'] = list() # 记录跳过的行(格式不正确,或者数据重复等) csv_filename = '' try: - # upload_path = os.path.join(os.path.dirname(__file__), 'csv-files') # 文件的暂存路径 upload_path = os.path.join(cfg.data_path, 'tmp') # 文件的暂存路径 if not os.path.exists(upload_path): os.mkdir(upload_path) @@ -75,34 +76,35 @@ class UploadAndImportHandler(TPBaseAdminAuthJsonHandler): now = time.localtime(time.time()) tmp_name = 'upload-{:04d}{:02d}{:02d}{:02d}{:02d}{:02d}.csv'.format(now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec) csv_filename = os.path.join(upload_path, tmp_name) - with open(csv_filename, 'wb') as up: - up.write(meta['body']) + with open(csv_filename, 'wb') as f: + f.write(meta['body']) # file encode maybe utf8 or gbk... check it out. file_encode = None - with open(csv_filename, encoding='gbk') as up: + with open(csv_filename, encoding='gbk') as f: try: - up.readlines() + f.readlines() file_encode = 'gbk' except: - log.e('open file:{} -1\n'.format(csv_filename)) + pass if file_encode is None: - with open(csv_filename, encoding='utf8') as up: + with open(csv_filename, encoding='utf8') as f: try: - up.readlines() + f.readlines() file_encode = 'utf8' except: - log.e('open file:{} -2\n'.format(csv_filename)) + pass if file_encode is None: os.remove(csv_filename) - self.write_json(-2) - log.e('file {} unknown encode.\n'.format(csv_filename)) - return + log.e('file `{}` unknown encode, neither GBK nor UTF8.\n'.format(csv_filename)) + ret['code'] = -2 + ret['message'] = 'upload csv file is neither gbk nor utf8 encode.' + return self.write(json.dumps(ret).encode('utf8')) - with open(csv_filename, encoding=file_encode) as up: - csv_reader = csv.reader(up) + with open(csv_filename, encoding=file_encode) as f: + csv_reader = csv.reader(f) is_first_line = True for csv_recorder in csv_reader: # 跳过第一行,那是格式说明 @@ -119,9 +121,6 @@ class UploadAndImportHandler(TPBaseAdminAuthJsonHandler): ret['msg'].append({'reason': '格式错误', 'line': ', '.join(csv_recorder)}) continue - # pro_type = int(line[6]) - # host_port = int(line[3]) - host_args = dict() user_args = dict() # 分组ID, 操作系统, IP地址, 端口, 协议, 状态, 描述, 系统用户, 系统密码, 是否加密,附加参数, 密钥ID, 认证类型 @@ -142,26 +141,28 @@ class UploadAndImportHandler(TPBaseAdminAuthJsonHandler): user_args['host_id'] = host_id user_args['user_name'] = csv_recorder[7] user_pswd = csv_recorder[8] - is_encrpty = int(csv_recorder[9]) + is_encrypt = int(csv_recorder[9]) user_args['user_param'] = csv_recorder[10].replace('\\n', '\n') user_args['cert_id'] = int(csv_recorder[11]) auth_mode = int(csv_recorder[12]) user_args['auth_mode'] = auth_mode user_args['user_pswd'] = '' - ret_code = 0 if auth_mode == 0: pass elif auth_mode == 1: try: - if is_encrpty == 0: - # ret_code, tmp_pswd = get_enc_data(user_pswd) + if is_encrypt == 0: _yr = async_enc(user_pswd) return_data = yield _yr if return_data is None: - return self.write_json(-1) + ret['code'] = -3 + ret['message'] = 'can not encrypt by core server.' + return self.write(json.dumps(ret).encode('utf8')) if 'code' not in return_data or return_data['code'] != 0: - return self.write_json(-1) + ret['code'] = -4 + ret['message'] = 'invalid result from encrypt by core server.' + return self.write(json.dumps(ret).encode('utf8')) tmp_pswd = return_data['data'] @@ -170,38 +171,33 @@ class UploadAndImportHandler(TPBaseAdminAuthJsonHandler): user_args['user_pswd'] = tmp_pswd - except Exception: - ret_code = -1 - log.e('get_enc_data() failed.\n') - - if 0 != ret_code: - ret['msg'].append({'reason': '加密用户密码失败,可能原因:Teleport核心服务未启动', 'line': ', '.join(csv_recorder)}) - log.e('get_enc_data() failed, error={}\n'.format(ret_code)) - continue + except: + log.e('can not encrypt user password.\n') + ret['code'] = -5 + ret['message'] = '发生异常' + return self.write(json.dumps(ret).encode('utf8')) elif auth_mode == 2: pass - # user_args['cert_id'] = int(csv_recorder[7]) else: - ret['msg'].append({'reason': '未知的认证模式', 'line': ', '.join(csv_recorder)}) + ret['data']['msg'].append({'reason': '未知的认证模式', 'line': ', '.join(csv_recorder)}) log.e('auth_mode unknown\n') continue uid = host.sys_user_add(user_args) if uid < 0: if uid == -100: - ret['msg'].append({'reason': '添加登录账号失败,账号已存在', 'line': ', '.join(csv_recorder)}) + ret['data']['msg'].append({'reason': '添加登录账号失败,账号已存在', 'line': ', '.join(csv_recorder)}) else: - ret['msg'].append({'reason': '添加登录账号失败,操作数据库失败', 'line': ', '.join(csv_recorder)}) - # log.e('sys_user_add() failed.\n') + ret['data']['msg'].append({'reason': '添加登录账号失败,操作数据库失败', 'line': ', '.join(csv_recorder)}) - ret = json.dumps(ret).encode('utf8') - self.write(ret) + ret['code'] = 0 + return self.write(json.dumps(ret).encode('utf8')) except: log.e('error\n') - ret['code'] = -1 - ret = json.dumps(ret).encode('utf8') - self.write(ret) + ret['code'] = -6 + ret['message'] = '发生异常.' + return self.write(json.dumps(ret).encode('utf8')) finally: if os.path.exists(csv_filename): @@ -210,15 +206,11 @@ class UploadAndImportHandler(TPBaseAdminAuthJsonHandler): class GetListHandler(TPBaseUserAuthJsonHandler): def post(self): - _user = self.get_session('user') + _user = self.get_current_user() if _user is None: - return self.write(-1) - - _type = _user['type'] - _uname = _user['name'] + return self.write_json(-1, '尚未登录') filter = dict() - user = self.get_current_user() order = dict() order['name'] = 'host_id' order['asc'] = True @@ -264,19 +256,17 @@ class GetListHandler(TPBaseUserAuthJsonHandler): if _order is not None: order['name'] = _order['k'] order['asc'] = _order['v'] - if _type == 100: + if _user['type'] == 100: _total, _hosts = host.get_all_host_info_list(filter, order, limit) else: - filter['account_name'] = _uname + filter['account_name'] = _user['name'] _total, _hosts = host.get_host_info_list_by_user(filter, order, limit) - # print(_hosts) ret = dict() ret['page_index'] = limit['page_index'] ret['total'] = _total ret['data'] = _hosts self.write_json(0, data=ret) - # self.write(json_encode(data)) class GetGrouplist(TPBaseUserAuthJsonHandler): @@ -290,25 +280,18 @@ class UpdateHandler(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') if 'host_id' not in args or 'kv' not in args: - # ret = {'code':-2} - self.write_json(-2) - return - - # _host_id = args['host_id'] + self.write_json(-2, '缺少必要参数') _ret = host.update(args['host_id'], args['kv']) if _ret: self.write_json(0) else: - self.write_json(-1) + self.write_json(-3, '数据库操作失败') class AddHost(TPBaseUserAuthJsonHandler): @@ -316,22 +299,18 @@ class AddHost(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') try: ret = host.add_host(args) if ret > 0: - self.write_json(0) + return self.write_json(0) else: - self.write_json(ret) - return + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) except: - self.write_json(-1) - return + log.e('add host failed.\n') + return self.write_json(-3, '发生异常') class LockHost(TPBaseUserAuthJsonHandler): @@ -339,24 +318,20 @@ class LockHost(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') host_id = args['host_id'] lock = args['lock'] try: ret = host.lock_host(host_id, lock) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) - return + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) except: - self.write_json(-1) - return + log.e('lock host failed.\n') + return self.write_json(-3, '发生异常') class DeleteHost(TPBaseUserAuthJsonHandler): @@ -364,22 +339,19 @@ class DeleteHost(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') + host_list = args['host_list'] try: ret = host.delete_host(host_list) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) - return + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) except: - self.write_json(-1) - return + log.e('delete host failed.\n') + return self.write_json(-3, '发生异常') class ExportHostHandler(TPBaseAdminAuthHandler): @@ -455,11 +427,9 @@ class GetCertList(TPBaseUserAuthJsonHandler): def post(self): _certs = host.get_cert_list() if _certs is None or len(_certs) == 0: - self.write_json(-1) - return + return self.write_json(-1, '参数错误') else: - self.write_json(0, data=_certs) - return + return self.write_json(0, data=_certs) class AddCert(TPBaseUserAuthJsonHandler): @@ -469,24 +439,22 @@ class AddCert(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-1) - return + return self.write_json(-1, '参数错误') cert_pub = args['cert_pub'] cert_pri = args['cert_pri'] cert_name = args['cert_name'] if len(cert_pri) == 0: - self.write_json(-1) - return + return self.write_json(-2, '参数错误,数据不完整') _yr = async_enc(cert_pri) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-3, '调用核心服务加密失败') if 'code' not in return_data or return_data['code'] != 0: - return self.write_json(-1) + return self.write_json(-4, '核心服务加密返回错误') cert_pri = return_data['data'] @@ -495,9 +463,10 @@ class AddCert(TPBaseUserAuthJsonHandler): if ret: return self.write_json(0) else: - return self.write_json(-1) + return self.write_json(-5, '数据库操作失败,errcode:{}'.format(ret)) except: - return self.write_json(-1) + log.e('add cert failed.\n') + return self.write_json(-6, '发生异常') class DeleteCert(TPBaseUserAuthJsonHandler): @@ -506,7 +475,7 @@ class DeleteCert(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - return self.write_json(-1) + return self.write_json(-1, '参数错误') cert_id = args['cert_id'] @@ -515,9 +484,10 @@ class DeleteCert(TPBaseUserAuthJsonHandler): if ret: return self.write_json(0) else: - return self.write_json(-2) + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) except: - return self.write_json(-3) + log.e('add cert failed.\n') + return self.write_json(-3, '发生异常') class UpdateCert(TPBaseUserAuthJsonHandler): @@ -526,11 +496,9 @@ class UpdateCert(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') + cert_id = args['cert_id'] cert_pub = args['cert_pub'] cert_pri = args['cert_pri'] @@ -540,23 +508,23 @@ class UpdateCert(TPBaseUserAuthJsonHandler): _yr = async_enc(cert_pri) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-2, '调用核心服务加密失败') if 'code' not in return_data or return_data['code'] != 0: - return self.write_json(-1) + return self.write_json(-3, '核心服务加密返回错误') cert_pri = return_data['data'] try: ret = host.update_cert(cert_id, cert_pub, cert_pri, cert_name) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) + return self.write_json(-4, '数据库操作失败,errcode:{}'.format(ret)) return except: - self.write_json(-1) - return + log.e('update cert failed.\n') + return self.write_json(-5, '发生异常') class AddGroup(TPBaseUserAuthJsonHandler): @@ -564,22 +532,19 @@ class AddGroup(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') + group_name = args['group_name'] try: ret = host.add_group(group_name) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) - return + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) except: - self.write_json(-1) - return + log.e('add group failed.\n') + return self.write_json(-3, '发生异常') class UpdateGroup(TPBaseUserAuthJsonHandler): @@ -587,23 +552,20 @@ class UpdateGroup(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') + group_id = args['group_id'] group_name = args['group_name'] try: ret = host.update_group(group_id, group_name) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) - return + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) except: - self.write_json(-1) - return + log.e('update group failed.\n') + return self.write_json(-3, '发生异常') class DeleteGroup(TPBaseUserAuthJsonHandler): @@ -611,22 +573,19 @@ class DeleteGroup(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') + group_id = args['group_id'] try: ret = host.delete_group(group_id) if ret == 0: - self.write_json(0) + return self.write_json(0) else: - self.write_json(ret) - return + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) except: - self.write_json(-1) - return + log.e('delete group failed.\n') + return self.write_json(-3, '发生异常') class AddHostToGroup(TPBaseUserAuthJsonHandler): @@ -634,11 +593,9 @@ class AddHostToGroup(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') + host_list = args['host_list'] group_id = args['group_id'] try: @@ -646,11 +603,11 @@ class AddHostToGroup(TPBaseUserAuthJsonHandler): if ret: self.write_json(0) else: - self.write_json(-1) + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) return except: - self.write_json(-1) - return + log.e('add host to group failed.\n') + return self.write_json(-3, '发生异常') class GetSessionId(TPBaseUserAuthJsonHandler): @@ -659,33 +616,31 @@ class GetSessionId(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') + if 'auth_id' not in args: - self.write_json(-1) - return + return self.write_json(-1, '参数缺失') + auth_id = args['auth_id'] req = {'method': 'request_session', 'param': {'authid': auth_id}} _yr = async_post_http(req) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-2, '调用核心服务获取会话ID失败') if 'code' not in return_data: - return self.write_json(-1) + return self.write_json(-3, '核心服务获取会话ID时返回错误数据') _code = return_data['code'] if _code != 0: - return self.write_json(_code) + return self.write_json(-4, '核心服务获取会话ID时返回错误 {}'.format(_code)) try: session_id = return_data['data']['sid'] except IndexError: - return self.write_json(-1) + return self.write_json(-5, '核心服务获取会话ID时返回错误数据') data = dict() data['session_id'] = session_id @@ -700,12 +655,10 @@ class AdminGetSessionId(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-1) - return + return self.write_json(-1, '参数错误') if 'host_auth_id' not in args: - self.write_json(-1) - return + return self.write_json(-1, '参数缺失') _host_auth_id = int(args['host_auth_id']) @@ -716,8 +669,7 @@ class AdminGetSessionId(TPBaseUserAuthJsonHandler): tmp_auth_info = host.get_host_auth_info(_host_auth_id) if tmp_auth_info is None: - self.write_json(-1) - return + return self.write_json(-2, '指定数据不存在') tmp_auth_info['account_lock'] = 0 tmp_auth_info['account_name'] = user['name'] @@ -734,19 +686,19 @@ class AdminGetSessionId(TPBaseUserAuthJsonHandler): _yr = async_post_http(req) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-3, '调用核心服务获取会话ID失败') if 'code' not in return_data: - return self.write_json(-1) + return self.write_json(-4, '核心服务获取会话ID时返回错误数据') _code = return_data['code'] if _code != 0: - return self.write_json(_code) + return self.write_json(-5, '核心服务获取会话ID时返回错误 {}'.format(_code)) try: session_id = return_data['data']['sid'] except IndexError: - return self.write_json(-1) + return self.write_json(-5, '核心服务获取会话ID时返回错误数据') data = dict() data['session_id'] = session_id @@ -761,8 +713,7 @@ class AdminFastGetSessionId(TPBaseAdminAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-1) - return + return self.write_json(-1, '参数错误') user = self.get_current_user() @@ -784,8 +735,7 @@ class AdminFastGetSessionId(TPBaseAdminAuthJsonHandler): tmp_auth_info['account_lock'] = 0 tmp_auth_info['account_name'] = user['name'] except IndexError: - self.write_json(-2) - return + return self.write_json(-2, '参数缺失') if tmp_auth_info['auth_mode'] == 1: if len(_user_pswd) == 0: # 修改登录用户信息时可能不会修改密码,因此页面上可能不会传来密码,需要从数据库中直接读取 @@ -796,21 +746,21 @@ class AdminFastGetSessionId(TPBaseAdminAuthJsonHandler): _yr = async_post_http(req) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-3, '调用核心服务加密失败') if 'code' not in return_data or return_data['code'] != 0: - return self.write_json(-1) + return self.write_json(-3, '核心服务加密返回错误') tmp_auth_info['user_auth'] = return_data['data']['c'] elif tmp_auth_info['auth_mode'] == 2: tmp_auth_info['user_auth'] = host.get_cert_info(_cert_id) if tmp_auth_info['user_auth'] is None: - self.write_json(-100) + self.write_json(-100, '指定私钥不存在') return elif tmp_auth_info['auth_mode'] == 0: tmp_auth_info['user_auth'] = '' else: - self.write_json(-101) + self.write_json(-101, '认证类型未知') return with tmp_auth_id_lock: @@ -824,19 +774,19 @@ class AdminFastGetSessionId(TPBaseAdminAuthJsonHandler): _yr = async_post_http(req) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-3, '调用核心服务获取会话ID失败') if 'code' not in return_data: - return self.write_json(-1) + return self.write_json(-4, '核心服务获取会话ID时返回错误数据') _code = return_data['code'] if _code != 0: - return self.write_json(_code) + return self.write_json(-5, '核心服务获取会话ID时返回错误 {}'.format(_code)) try: session_id = return_data['data']['sid'] except IndexError: - return self.write_json(-1) + return self.write_json(-5, '核心服务获取会话ID时返回错误数据') data = dict() data['session_id'] = session_id @@ -850,13 +800,12 @@ class SysUserList(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-1) - return + return self.write_json(-1, '参数错误') + try: host_id = args['host_id'] - except Exception as e: - self.write_json(-2) - return + except: + return self.write_json(-1, '参数缺失') data = host.sys_user_list(host_id) return self.write_json(0, data=data) @@ -869,26 +818,26 @@ class SysUserAdd(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - return self.write_json(-1) + return self.write_json(-1, '参数错误') try: auth_mode = args['auth_mode'] user_pswd = args['user_pswd'] cert_id = args['cert_id'] - except IndexError: - return self.write_json(-2) + except: + return self.write_json(-1, '参数缺失') if auth_mode == 1: if 0 == len(args['user_pswd']): - return self.write_json(-1) + return self.write_json(-2, '参数缺失') _yr = async_enc(user_pswd) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-3, '调用核心服务加密失败') if 'code' not in return_data or return_data['code'] != 0: - return self.write_json(-1) + return self.write_json(-3, '核心服务加密返回错误') args['user_pswd'] = return_data['data'] @@ -909,19 +858,14 @@ class SysUserUpdate(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, '参数错误') if 'host_auth_id' not in args or 'kv' not in args: - # ret = {'code':-2} - self.write_json(-2) - return + return self.write_json(-2, '参数缺失') kv = args['kv'] if 'auth_mode' not in kv or 'user_pswd' not in kv or 'cert_id' not in kv: - self.write_json(-3) - return + return self.write_json(-3, '参数缺失') auth_mode = kv['auth_mode'] if 'user_pswd' in kv: @@ -937,17 +881,17 @@ class SysUserUpdate(TPBaseUserAuthJsonHandler): _yr = async_enc(user_pswd) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-4, '调用核心服务加密失败') if 'code' not in return_data or return_data['code'] != 0: - return self.write_json(-1) + return self.write_json(-5, '核心服务加密返回错误') args['kv']['user_pswd'] = return_data['data'] if host.sys_user_update(args['host_auth_id'], args['kv']): return self.write_json(0) - return self.write_json(-1) + return self.write_json(-6, '数据库操作失败') class SysUserDelete(TPBaseUserAuthJsonHandler): @@ -956,15 +900,14 @@ class SysUserDelete(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-2) - return + return self.write_json(-1, '参数错误') + try: host_auth_id = args['host_auth_id'] except IndexError: - self.write_json(-2) - return + return self.write_json(-2, '参数缺失') if host.sys_user_delete(host_auth_id): return self.write_json(0) - return self.write_json(-1) + return self.write_json(-3, '数据库操作失败') diff --git a/server/www/teleport/app/eom_app/controller/maintenance.py b/server/www/teleport/app/eom_app/controller/maintenance.py index dce00dd..ec37940 100644 --- a/server/www/teleport/app/eom_app/controller/maintenance.py +++ b/server/www/teleport/app/eom_app/controller/maintenance.py @@ -155,19 +155,18 @@ class RpcHandler(TPBaseAdminAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-1) - return + return self.write_json(-1, '参数错误') cmd = args['cmd'] if cmd == 'create_db': if not get_db().need_create: - return self.write_json(-1) + return self.write_json(-1, '无需创建') task_id = thread_mgr.create_db() return self.write_json(0, data={"task_id": task_id}) if cmd == 'upgrade_db': if not get_db().need_upgrade: - return self.write_json(-1) + return self.write_json(-1, '无需升级') task_id = thread_mgr.upgrade_db() return self.write_json(0, data={"task_id": task_id}) diff --git a/server/www/teleport/app/eom_app/controller/record.py b/server/www/teleport/app/eom_app/controller/record.py index a8f8573..361fdd6 100644 --- a/server/www/teleport/app/eom_app/controller/record.py +++ b/server/www/teleport/app/eom_app/controller/record.py @@ -99,14 +99,18 @@ class RecordGetHeader(TPBaseAdminAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) + else: + return self.write_json(-1, '参数错误') + record_id = args['id'] + header = record.read_record_head(record_id) if header is None: - return self.write_json(-1) + return self.write_json(-3, '操作失败') ret = dict() ret['header'] = header - self.write_json(0, data=ret) + return self.write_json(0, data=ret) class RecordGetInfo(TPBaseAdminAuthJsonHandler): @@ -114,12 +118,17 @@ class RecordGetInfo(TPBaseAdminAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) + else: + return self.write_json(-1, '参数错误') + record_id = args['id'] file_id = args['file_id'] + data = record.read_record_info(record_id, file_id) if data is None: - return self.write_json(-1) - self.write_json(0, data=data) + return self.write_json(-3, '操作失败') + + return self.write_json(0, data=data) class DeleteLog(TPBaseAdminAuthJsonHandler): @@ -128,10 +137,15 @@ class DeleteLog(TPBaseAdminAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - log_list = args['log_list'] + else: + return self.write_json(-1, '参数错误') + + log_list = args['log_list'] + if not record.delete_log(log_list): - return self.write_json(-1) - self.write_json(0) + return self.write_json(-3, '操作失败') + + return self.write_json(0) class LogList(TPBaseAdminAuthJsonHandler): @@ -189,4 +203,4 @@ class LogList(TPBaseAdminAuthJsonHandler): ret['total'] = total ret['data'] = log_list - self.write_json(0, data=ret) + return self.write_json(0, data=ret) diff --git a/server/www/teleport/app/eom_app/controller/rpc.py b/server/www/teleport/app/eom_app/controller/rpc.py index caf64b1..3b25186 100644 --- a/server/www/teleport/app/eom_app/controller/rpc.py +++ b/server/www/teleport/app/eom_app/controller/rpc.py @@ -17,8 +17,7 @@ class RpcHandler(TPBaseJsonHandler): def get(self): _uri = self.request.uri.split('?', 1) if len(_uri) != 2: - self.write_json(-1, message='need request param.') - return + return self.write_json(-1, message='need request param.') yield self._dispatch(urllib.parse.unquote(_uri[1])) @@ -26,8 +25,7 @@ class RpcHandler(TPBaseJsonHandler): def post(self): req = self.request.body.decode('utf-8') if req == '': - self.write_json(-1, message='need request param.') - return + return self.write_json(-1, message='need request param.') yield self._dispatch(req) @@ -37,11 +35,9 @@ class RpcHandler(TPBaseJsonHandler): _req = json.loads(req) if 'method' not in _req or 'param' not in _req: - self.write_json(-1, message='invalid request format.') - return + return self.write_json(-1, message='invalid request format.') except: - self.write_json(-1, message='invalid json format.') - return + return self.write_json(-1, message='invalid json format.') if 'get_auth_info' == _req['method']: return self._get_auth_info(_req['param']) @@ -56,26 +52,25 @@ class RpcHandler(TPBaseJsonHandler): else: log.e('WEB-JSON-RPC got unknown method: `{}`.\n'.format(_req['method'])) - self.write_json(-1, message='invalid method.') + return self.write_json(-1, message='invalid method.') def _get_auth_info(self, param): # 如果是页面上进行连接测试(增加或修改主机和用户时),信息并不写入数据库,而是在内存中存在,传递给core服务的 # 应该是负数形式的authid。本接口支持区分这两种认证ID。 if 'authid' not in param: - self.write_json(-1, message='invalid request.') - return + return self.write_json(-1, message='invalid request.') authid = param['authid'] if authid > 0: # 根据authid从数据库中查询对应的数据,然后返回给调用者 x = host.get_auth_info(param['authid']) - self.write_json(0, data=x) + return self.write_json(0, data=x) elif authid < 0: x = web_session().taken('tmp-auth-info-{}'.format(authid), None) - self.write_json(0, data=x) + return self.write_json(0, data=x) else: - self.write_json(-1, message='invalid auth id.') + return self.write_json(-1, message='invalid auth id.') def _session_begin(self, param): if 'sid' not in param: @@ -95,26 +90,25 @@ class RpcHandler(TPBaseJsonHandler): record_id = record.session_begin(_sid, _acc_name, _host_ip, _sys_type, _host_port, _auth_mode, _user_name, _protocol) if record_id <= 0: - self.write_json(-1, message='can not write database.') + return self.write_json(-1, message='can not write database.') else: - self.write_json(0, data={'rid': record_id}) + return self.write_json(0, data={'rid': record_id}) def _session_end(self, param): if 'rid' not in param or 'code' not in param: - self.write_json(-1, message='invalid request.') - return + return self.write_json(-1, message='invalid request.') if not record.session_end(param['rid'], param['code']): - self.write_json(-1) + return self.write_json(-1, 'can not write database.') else: - self.write_json(0) + return self.write_json(0) def _register_core(self, param): # 因为core服务启动了(之前可能非正常终止了),做一下数据库中会话状态的修复操作 record.session_fix() if 'rpc' not in param: - return self.write_json(-1) + return self.write_json(-1, 'invalid param.') app_cfg().core_server_rpc = param['rpc'] @@ -123,16 +117,16 @@ class RpcHandler(TPBaseJsonHandler): _yr = async_post_http(req) return_data = yield _yr if return_data is None: - return self.write_json(-1) + return self.write_json(-1, 'get config from core service failed.') if 'code' not in return_data: - return self.write_json(-2) + return self.write_json(-2, 'get config from core service return invalid data.') if return_data['code'] != 0: - return self.write_json(return_data['code']) + return self.write_json(-3, 'get config from core service return code: {}'.format(return_data['code'])) app_cfg().update_core(return_data['data']) - self.write_json(0) + return self.write_json(0) def _exit(self): # set exit flag. - self.write_json(0) + return self.write_json(0) diff --git a/server/www/teleport/app/eom_app/controller/user.py b/server/www/teleport/app/eom_app/controller/user.py index 2b7e59d..c5ed5d9 100644 --- a/server/www/teleport/app/eom_app/controller/user.py +++ b/server/www/teleport/app/eom_app/controller/user.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- + import json from eom_app.app.configs import app_cfg from eom_app.module import host from eom_app.module import user +from eom_common.eomcore.logger import * from .base import TPBaseUserAuthJsonHandler, TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler cfg = app_cfg() @@ -38,22 +40,19 @@ class DeleteUser(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, 'invalid param') + user_id = args['user_id'] try: ret = user.delete_user(user_id) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) - return + return self.write_json(-2, 'database op failed.') except: - self.write_json(-1) - return + log.e('delete user failed.\n') + return self.write_json(-3, 'got exception.') class ModifyUser(TPBaseUserAuthJsonHandler): @@ -61,11 +60,8 @@ class ModifyUser(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, 'invalid param.') user_id = args['user_id'] user_desc = args['user_desc'] @@ -75,11 +71,11 @@ class ModifyUser(TPBaseUserAuthJsonHandler): if ret: self.write_json(0) else: - self.write_json(-1) + self.write_json(-2, 'database op failed.') return except: - self.write_json(-1) - return + log.e('modify user failed.\n') + self.write_json(-3, 'got exception.') class AddUser(TPBaseUserAuthJsonHandler): @@ -87,11 +83,9 @@ class AddUser(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, 'invalid param.') + user_name = args['user_name'] user_pwd = '123456' user_desc = args['user_desc'] @@ -99,11 +93,13 @@ class AddUser(TPBaseUserAuthJsonHandler): user_desc = '' try: ret = user.add_user(user_name, user_pwd, user_desc) - self.write_json(ret) - return + if 0 == ret: + return self.write_json(0) + else: + return self.write_json(-2, 'database op failed. errcode={}'.format(ret)) except: - self.write_json(-1) - return + log.e('add user failed.\n') + return self.write_json(-3, 'got exception.') class LockUser(TPBaseUserAuthJsonHandler): @@ -111,24 +107,21 @@ class LockUser(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, 'invalid param.') + user_id = args['user_id'] lock_status = args['lock_status'] try: ret = user.lock_user(user_id, lock_status) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) - return + return self.write_json(-2, 'database op failed.') except: - self.write_json(-1) - return + log.e('lock user failed.\m') + return self.write_json(-3, 'got exception.') class ResetUser(TPBaseUserAuthJsonHandler): @@ -136,30 +129,26 @@ class ResetUser(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, 'invalid param.') + user_id = args['user_id'] # lock_status = args['lock_status'] try: ret = user.reset_user(user_id) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) - return + return self.write_json(-2, 'database op failed.') except: - self.write_json(-1) - return + log.e('reset user failed.\n') + return self.write_json(-3, 'got exception.') class HostList(TPBaseUserAuthJsonHandler): def post(self): filter = dict() - # user = self.get_current_user() order = dict() order['name'] = 'host_id' order['asc'] = True @@ -170,7 +159,6 @@ class HostList(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) tmp = list() _filter = args['filter'] @@ -191,7 +179,6 @@ class HostList(TPBaseUserAuthJsonHandler): del _filter[i] filter.update(_filter) - # print('filter', filter) _limit = args['limit'] if _limit['page_index'] < 0: @@ -207,7 +194,7 @@ class HostList(TPBaseUserAuthJsonHandler): if _order is not None: order['name'] = _order['k'] order['asc'] = _order['v'] - # filter['account_name'] = user['name'] + _total, _hosts = host.get_host_info_list_by_user(filter, order, limit) ret = dict() @@ -222,21 +209,20 @@ class AllocHost(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, 'invalid param.') + user_name = args['user_name'] host_list = args['host_list'] try: ret = user.alloc_host(user_name, host_list) if ret: - self.write_json(0) + return self.write_json(0) else: - self.write_json(-1) + return self.write_json(-2, 'database op failed.') except: - self.write_json(-2) + log.e('alloc host failed.') + self.write_json(-3, 'got exception.') class AllocHostUser(TPBaseUserAuthJsonHandler): @@ -244,11 +230,9 @@ class AllocHostUser(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, 'invalid param.') + user_name = args['user_name'] host_auth_id_list = args['host_list'] try: @@ -256,9 +240,10 @@ class AllocHostUser(TPBaseUserAuthJsonHandler): if ret: self.write_json(0) else: - self.write_json(-1) + self.write_json(-2, 'database op failed.') except: - self.write_json(-2) + log.e('alloc host for user failed.\n') + self.write_json(-3, 'got exception.') class DeleteHost(TPBaseUserAuthJsonHandler): @@ -266,21 +251,21 @@ class DeleteHost(TPBaseUserAuthJsonHandler): args = self.get_argument('args', None) if args is not None: args = json.loads(args) - # print('args', args) else: - # ret = {'code':-1} - self.write_json(-1) - return + return self.write_json(-1, 'invalid param.') + user_name = args['user_name'] host_list = args['host_list'] + try: ret = user.delete_host(user_name, host_list) if ret: self.write_json(0) else: - self.write_json(-1) + self.write_json(-2, 'database op failed.') except: - self.write_json(-2) + log.e('delete host failed.\n') + self.write_json(-3, 'got exception.') class DeleteHostUser(TPBaseUserAuthJsonHandler): @@ -289,15 +274,17 @@ class DeleteHostUser(TPBaseUserAuthJsonHandler): if args is not None: args = json.loads(args) else: - self.write_json(-1) - return + self.write_json(-1, 'invalid param.') + user_name = args['user_name'] auth_id_list = args['auth_id_list'] + try: ret = user.delete_host_user(user_name, auth_id_list) if ret: self.write_json(0) else: - self.write_json(-1) + self.write_json(-2, 'database op failed.') except: - self.write_json(-2) + log.e('delete host for user failed.\n') + self.write_json(-3, 'got exception.') diff --git a/server/www/teleport/app/eom_app/module/host.py b/server/www/teleport/app/eom_app/module/host.py index 2046971..f4b9595 100644 --- a/server/www/teleport/app/eom_app/module/host.py +++ b/server/www/teleport/app/eom_app/module/host.py @@ -43,8 +43,6 @@ def get_all_host_info_list(_filter, order, limit, with_pwd=False): field_a = ['host_id', 'host_lock', 'host_ip', 'host_port', 'protocol', 'host_desc', 'group_id', 'host_sys_type'] field_b = ['group_name'] - # field_c = ['id', 'auth_mode', 'user_name'] - sql = 'SELECT COUNT(*) ' \ 'FROM `{}host_info` AS a ' \ 'LEFT JOIN `{}group` AS b ON `a`.`group_id`=`b`.`group_id` ' \ diff --git a/server/www/teleport/app/eom_common/eomcore/logger.py b/server/www/teleport/app/eom_common/eomcore/logger.py index 38cd273..7787c4e 100644 --- a/server/www/teleport/app/eom_common/eomcore/logger.py +++ b/server/www/teleport/app/eom_common/eomcore/logger.py @@ -256,17 +256,15 @@ class EomLogger: self._console_set_color(CR_ERROR) self._do_log(LOG_ERROR, *args, **kwargs) - if self._trace_error == self.TRACE_ERROR_NONE: - return - - s = traceback.extract_stack() - c = len(s) - for i in range(c - 1): - if i >= self._trace_error: - break - if s[c - 2 - i][0].startswith('= self._trace_error: + break + if s[c - 2 - i][0].startswith(' 0) { - console.log(obj.msg); + if (ret.data.msg.length > 0) { var html = []; html.push('
    '); - for (var i = 0, cnt = obj.msg.length; i < cnt; ++i) { + for (var i = 0, cnt = ret.data.msg.length; i < cnt; ++i) { html.push('
  • '); - html.push('' + obj.msg[i].reason + '
    '); - html.push(obj.msg[i].line); + html.push('' + ret.data.msg[i].reason + '
    '); + html.push(ret.data.msg[i].line); html.push('
  • '); } html.push('
'); @@ -49,10 +47,10 @@ ywl.do_upload_file = function () { $('#dialog_batch_add_host').modal({backdrop: 'static'}); } } else { - ywl.notify_error('批量导入主机失败! 错误号:' + obj.code); + ywl.notify_error('批量导入主机失败! 错误号:' + ret.code); } }, - error: function (data, status, e) { // 相当于java中catch语句块的用法 + error: function () { $('#upload-file').remove(); ywl.notify_error('网络故障,批量导入主机失败!'); } From 1b9cf00c4d576c93d7290cdf6bd48ad567e5f92f Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Sat, 29 Apr 2017 21:32:53 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=87=BA=E9=94=99?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E9=A1=B5=E9=9D=A2=E6=98=BE=E7=A4=BA=E6=9B=B4?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E7=9A=84=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=AE=9A=E4=BD=8D=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teleport/app/eom_app/controller/auth.py | 304 +- .../teleport/app/eom_app/controller/host.py | 20 +- .../teleport/app/eom_app/controller/user.py | 2 +- .../www/teleport/app/eom_app/module/user.py | 656 ++-- .../www/teleport/static/js/ui/admin_host.js | 121 +- server/www/teleport/static/js/ui/auth.js | 1495 ++++---- server/www/teleport/static/js/ui/cert.js | 550 ++- server/www/teleport/static/js/ui/common.js | 833 ++-- server/www/teleport/static/js/ui/controls.js | 3344 ++++++++--------- server/www/teleport/static/js/ui/group.js | 340 +- server/www/teleport/static/js/ui/log.js | 755 ++-- server/www/teleport/static/js/ui/pwd.js | 6 +- server/www/teleport/static/js/ui/user.js | 524 +-- server/www/teleport/static/js/ywl_const.js | 333 +- .../teleport/view/maintenance/install.mako | 372 +- 15 files changed, 4823 insertions(+), 4832 deletions(-) diff --git a/server/www/teleport/app/eom_app/controller/auth.py b/server/www/teleport/app/eom_app/controller/auth.py index 0abc876..86e5df5 100644 --- a/server/www/teleport/app/eom_app/controller/auth.py +++ b/server/www/teleport/app/eom_app/controller/auth.py @@ -1,152 +1,152 @@ -# -*- coding: utf-8 -*- - -import json - -from eom_app.app.const import * -from eom_app.app.configs import app_cfg -from eom_app.module import user -from eom_common.eomcore.logger import * -from .base import TPBaseHandler, TPBaseUserAuthHandler, TPBaseJsonHandler, TPBaseUserAuthJsonHandler -from eom_app.app.util import gen_captcha - - -class LoginHandler(TPBaseHandler): - def get(self): - _user = self.get_current_user() - _ref = self.get_argument('ref', '/') - - if _user['is_login']: - self.redirect(_ref) - return - - if _user['id'] == 0: - user_name = '' - else: - user_name = _user['name'] - - param = { - 'ref': _ref, - 'user_name': user_name - } - self.render('auth/login.mako', page_param=json.dumps(param)) - - -class VerifyUser(TPBaseJsonHandler): - def post(self): - code = self.get_session('captcha') - if code is None: - return self.write_json(-1, '验证码已失效') - - self.del_session('captcha') - - args = self.get_argument('args', None) - if args is not None: - args = json.loads(args) - captcha = args['captcha'] - username = args['username'] - userpwd = args['userpwd'] - remember = args['remember'] - else: - return self.write_json(-1, '参数错误') - - if code.lower() != captcha.lower(): - return self.write_json(-1, '验证码错误') - - try: - user_id, account_type, nickname, locked = user.verify_user(username, userpwd) - if locked == 1: - return self.write_json(-1, '账号被锁定,请联系管理员!') - if user_id == 0: - if app_cfg().app_mode == APP_MODE_MAINTENANCE: - return self.write_json(-2, '系统维护中,请稍候再试!') - else: - return self.write_json(-1, '用户名/密码错误!') - - _user = self.get_session('user') - if _user is None: - _user = dict() - _user['id'] = 0 - _user['name'] = 'guest' - _user['nick_name'] = '访客' - _user['status'] = 0 - _user['phone_num'] = '110' - _user['type'] = 0 - _user['permission'] = 0 - _user['is_login'] = False - - _user['id'] = user_id - _user['is_login'] = True - _user['name'] = username - _user['nick_name'] = nickname - _user['type'] = account_type - - if remember: - self.set_session('user', _user, 12*60*60) - else: - self.set_session('user', _user) - return self.write_json(0) - - except: - log.e('can not set session.') - return self.write_json(-1, '发生异常,无法登录!') - - -class LogoutHandler(TPBaseUserAuthHandler): - def get(self): - _user = self.get_current_user() - _user['is_login'] = False - self.set_session('user', _user) - - self.redirect('/auth/login') - - -class GetCaptchaHandler(TPBaseHandler): - def get(self): - code, img_data = gen_captcha() - self.set_session('captcha', code) - self.set_header('Content-Type', 'image/jpeg') - self.write(img_data) - - -class VerifyCaptchaHandler(TPBaseJsonHandler): - def post(self): - code = self.get_session('captcha') - if code is None: - return self.write_json(-1, '验证码已失效') - - args = self.get_argument('args', None) - if args is not None: - args = json.loads(args) - captcha = args['captcha'] - else: - return self.write_json(-1, '参数错误') - - if code.lower() != captcha.lower(): - return self.write_json(-1, '验证码错误') - - return self.write_json(0) - - -class ModifyPwd(TPBaseUserAuthJsonHandler): - def post(self): - args = self.get_argument('args', None) - if args is not None: - args = json.loads(args) - else: - return self.write_json(-11, '参数错误') - _old_pwd = args['o_pwd'] - _new_pwd = args['n_pwd'] - - if _old_pwd is None or _new_pwd is None: - return self.write_json(-12, '参数错误') - - user_info = self.get_current_user() - try: - ret = user.modify_pwd(_old_pwd, _new_pwd, user_info['id']) - if 0 == ret: - return self.write_json(0) - else: - return self.write_json(-14, '数据库操作错误,errcode:{}'.format(ret)) - except: - log.e('modify password failed.') - return self.write_json(-13, '发生异常') +# -*- coding: utf-8 -*- + +import json + +from eom_app.app.const import * +from eom_app.app.configs import app_cfg +from eom_app.module import user +from eom_common.eomcore.logger import * +from .base import TPBaseHandler, TPBaseUserAuthHandler, TPBaseJsonHandler, TPBaseUserAuthJsonHandler +from eom_app.app.util import gen_captcha + + +class LoginHandler(TPBaseHandler): + def get(self): + _user = self.get_current_user() + _ref = self.get_argument('ref', '/') + + if _user['is_login']: + self.redirect(_ref) + return + + if _user['id'] == 0: + user_name = '' + else: + user_name = _user['name'] + + param = { + 'ref': _ref, + 'user_name': user_name + } + self.render('auth/login.mako', page_param=json.dumps(param)) + + +class VerifyUser(TPBaseJsonHandler): + def post(self): + code = self.get_session('captcha') + if code is None: + return self.write_json(-1, '验证码已失效') + + self.del_session('captcha') + + args = self.get_argument('args', None) + if args is not None: + args = json.loads(args) + captcha = args['captcha'] + username = args['username'] + userpwd = args['userpwd'] + remember = args['remember'] + else: + return self.write_json(-1, '参数错误') + + if code.lower() != captcha.lower(): + return self.write_json(-1, '验证码错误') + + try: + user_id, account_type, nickname, locked = user.verify_user(username, userpwd) + if locked == 1: + return self.write_json(-1, '账号被锁定,请联系管理员!') + if user_id == 0: + if app_cfg().app_mode == APP_MODE_MAINTENANCE: + return self.write_json(-2, '系统维护中,请稍候再试!') + else: + return self.write_json(-1, '用户名/密码错误!') + + _user = self.get_session('user') + if _user is None: + _user = dict() + _user['id'] = 0 + _user['name'] = 'guest' + _user['nick_name'] = '访客' + _user['status'] = 0 + _user['phone_num'] = '110' + _user['type'] = 0 + _user['permission'] = 0 + _user['is_login'] = False + + _user['id'] = user_id + _user['is_login'] = True + _user['name'] = username + _user['nick_name'] = nickname + _user['type'] = account_type + + if remember: + self.set_session('user', _user, 12*60*60) + else: + self.set_session('user', _user) + return self.write_json(0) + + except: + log.e('can not set session.') + return self.write_json(-1, '发生异常,无法登录!') + + +class LogoutHandler(TPBaseUserAuthHandler): + def get(self): + _user = self.get_current_user() + _user['is_login'] = False + self.set_session('user', _user) + + self.redirect('/auth/login') + + +class GetCaptchaHandler(TPBaseHandler): + def get(self): + code, img_data = gen_captcha() + self.set_session('captcha', code) + self.set_header('Content-Type', 'image/jpeg') + self.write(img_data) + + +class VerifyCaptchaHandler(TPBaseJsonHandler): + def post(self): + code = self.get_session('captcha') + if code is None: + return self.write_json(-1, '验证码已失效') + + args = self.get_argument('args', None) + if args is not None: + args = json.loads(args) + captcha = args['captcha'] + else: + return self.write_json(-1, '参数错误') + + if code.lower() != captcha.lower(): + return self.write_json(-1, '验证码错误') + + return self.write_json(0) + + +class ModifyPwd(TPBaseUserAuthJsonHandler): + def post(self): + args = self.get_argument('args', None) + if args is not None: + args = json.loads(args) + else: + return self.write_json(-1, '参数错误') + _old_pwd = args['o_pwd'] + _new_pwd = args['n_pwd'] + + if _old_pwd is None or _new_pwd is None: + return self.write_json(-2, '参数错误') + + user_info = self.get_current_user() + try: + ret = user.modify_pwd(_old_pwd, _new_pwd, user_info['id']) + if 0 == ret: + return self.write_json(0) + else: + return self.write_json(ret) + except: + log.e('modify password failed.') + return self.write_json(-4, '发生异常') diff --git a/server/www/teleport/app/eom_app/controller/host.py b/server/www/teleport/app/eom_app/controller/host.py index e567f48..681713a 100644 --- a/server/www/teleport/app/eom_app/controller/host.py +++ b/server/www/teleport/app/eom_app/controller/host.py @@ -307,7 +307,10 @@ class AddHost(TPBaseUserAuthJsonHandler): if ret > 0: return self.write_json(0) else: - return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) + if ret == -100: + return self.write_json(-100, '') + else: + return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) except: log.e('add host failed.\n') return self.write_json(-3, '发生异常') @@ -484,10 +487,13 @@ class DeleteCert(TPBaseUserAuthJsonHandler): if ret: return self.write_json(0) else: - return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) + if ret == -2: + return self.write_json(-2, '') + else: + return self.write_json(-3, '数据库操作失败,errcode:{}'.format(ret)) except: log.e('add cert failed.\n') - return self.write_json(-3, '发生异常') + return self.write_json(-4, '发生异常') class UpdateCert(TPBaseUserAuthJsonHandler): @@ -521,7 +527,6 @@ class UpdateCert(TPBaseUserAuthJsonHandler): return self.write_json(0) else: return self.write_json(-4, '数据库操作失败,errcode:{}'.format(ret)) - return except: log.e('update cert failed.\n') return self.write_json(-5, '发生异常') @@ -582,10 +587,13 @@ class DeleteGroup(TPBaseUserAuthJsonHandler): if ret == 0: return self.write_json(0) else: - return self.write_json(-2, '数据库操作失败,errcode:{}'.format(ret)) + if ret == -2: + return self.write_json(-2, '') + else: + return self.write_json(-3, '数据库操作失败,errcode:{}'.format(ret)) except: log.e('delete group failed.\n') - return self.write_json(-3, '发生异常') + return self.write_json(-4, '发生异常') class AddHostToGroup(TPBaseUserAuthJsonHandler): diff --git a/server/www/teleport/app/eom_app/controller/user.py b/server/www/teleport/app/eom_app/controller/user.py index c5ed5d9..a50bec1 100644 --- a/server/www/teleport/app/eom_app/controller/user.py +++ b/server/www/teleport/app/eom_app/controller/user.py @@ -96,7 +96,7 @@ class AddUser(TPBaseUserAuthJsonHandler): if 0 == ret: return self.write_json(0) else: - return self.write_json(-2, 'database op failed. errcode={}'.format(ret)) + return self.write_json(ret, 'database op failed. errcode={}'.format(ret)) except: log.e('add user failed.\n') return self.write_json(-3, 'got exception.') diff --git a/server/www/teleport/app/eom_app/module/user.py b/server/www/teleport/app/eom_app/module/user.py index 7508e85..337a23f 100644 --- a/server/www/teleport/app/eom_app/module/user.py +++ b/server/www/teleport/app/eom_app/module/user.py @@ -1,328 +1,328 @@ -# -*- coding: utf-8 -*- - -import hashlib - -from eom_app.app.configs import app_cfg -from eom_app.app.const import * -from eom_app.app.db import get_db, DbItem -from eom_app.app.util import sec_generate_password, sec_verify_password - - -def verify_user(name, password): - cfg = app_cfg() - db = get_db() - - sql = 'SELECT `account_id`, `account_type`, `account_name`, `account_pwd`, `account_lock` FROM `{}account` WHERE `account_name`="{}";'.format(db.table_prefix, name) - db_ret = db.query(sql) - if db_ret is None: - # 特别地,如果无法取得数据库连接,有可能是新安装的系统,尚未建立数据库,此时应该处于维护模式 - # 因此可以特别地处理用户验证:用户名admin,密码admin可以登录为管理员 - if cfg.app_mode == APP_MODE_MAINTENANCE: - if name == 'admin' and password == 'admin': - return 1, 100, 'admin', 0 - return 0, 0, '', 0 - - if len(db_ret) != 1: - return 0, 0, '', 0 - - user_id = db_ret[0][0] - account_type = db_ret[0][1] - name = db_ret[0][2] - locked = db_ret[0][4] - if locked == 1: - return 0, 0, '', locked - - if not sec_verify_password(password, db_ret[0][3]): - # 按新方法验证密码失败,可能是旧版本的密码散列格式,再尝试一下 - if db_ret[0][3] != hashlib.sha256(password.encode()).hexdigest(): - return 0, 0, '', locked - else: - # 发现此用户的密码散列格式还是旧的,更新成新的吧! - _new_sec_password = sec_generate_password(password) - sql = 'UPDATE `{}account` SET `account_pwd`="{}" WHERE `account_id`={}'.format(db.table_prefix, _new_sec_password, int(user_id)) - db.exec(sql) - - return user_id, account_type, name, locked - - -def modify_pwd(old_pwd, new_pwd, user_id): - db = get_db() - sql = 'SELECT `account_pwd` FROM `{}account` WHERE `account_id`={};'.format(db.table_prefix, int(user_id)) - db_ret = db.query(sql) - if db_ret is None or len(db_ret) != 1: - return -2 - - if not sec_verify_password(old_pwd, db_ret[0][0]): - # 按新方法验证密码失败,可能是旧版本的密码散列格式,再尝试一下 - if db_ret[0][0] != hashlib.sha256(old_pwd.encode()).hexdigest(): - return -2 - - _new_sec_password = sec_generate_password(new_pwd) - sql = 'UPDATE `{}account` SET `account_pwd`="{}" WHERE `account_id`={}'.format(db.table_prefix, _new_sec_password, int(user_id)) - db_ret = db.exec(sql) - if db_ret: - return 0 - else: - return -3 - - -def get_user_list(with_admin=False): - db = get_db() - ret = list() - - field_a = ['account_id', 'account_type', 'account_name', 'account_status', 'account_lock', 'account_desc'] - - if with_admin: - where = '' - else: - where = 'WHERE `a`.`account_type`<100' - - sql = 'SELECT {} FROM `{}account` as a {} ORDER BY `account_name`;'.format(','.join(['`a`.`{}`'.format(i) for i in field_a]), db.table_prefix, where) - db_ret = db.query(sql) - if db_ret is None: - return ret - - for item in db_ret: - x = DbItem() - x.load(item, ['a_{}'.format(i) for i in field_a]) - h = dict() - h['user_id'] = x.a_account_id - h['user_type'] = x.a_account_type - h['user_name'] = x.a_account_name - h['user_status'] = x.a_account_status - h['user_lock'] = x.a_account_lock - h['user_desc'] = x.a_account_desc - ret.append(h) - return ret - - -def delete_user(user_id): - db = get_db() - sql = 'DELETE FROM `{}account` WHERE `account_id`={};'.format(db.table_prefix, int(user_id)) - return db.exec(sql) - - -def lock_user(user_id, lock_status): - db = get_db() - sql = 'UPDATE `{}account` SET `account_lock`={} WHERE `account_id`={};'.format(db.table_prefix, lock_status, int(user_id)) - return db.exec(sql) - - -def reset_user(user_id): - db = get_db() - _new_sec_password = sec_generate_password('123456') - sql = 'UPDATE `{}account` SET `account_pwd`="{}" WHERE `account_id`={};'.format(db.table_prefix, _new_sec_password, int(user_id)) - return db.exec(sql) - - -def modify_user(user_id, user_desc): - db = get_db() - sql = 'UPDATE `{}account` SET `account_desc`="{}" WHERE `account_id`={};'.format(db.table_prefix, user_desc, int(user_id)) - return db.exec(sql) - - -def add_user(user_name, user_pwd, user_desc): - db = get_db() - sql = 'SELECT `account_id` FROM `{}account` WHERE `account_name`="{}";'.format(db.table_prefix, user_name) - db_ret = db.query(sql) - if db_ret is None or len(db_ret) != 0: - return -2 - - sec_password = sec_generate_password(user_pwd) - sql = 'INSERT INTO `{}account` (`account_type`, `account_name`, `account_pwd`, `account_status`,' \ - '`account_lock`,`account_desc`) VALUES (1,"{}","{}",0,0,"{}")'.format(db.table_prefix, user_name, sec_password, user_desc) - ret = db.exec(sql) - if ret: - return 0 - return -3 - - -def alloc_host(user_name, host_list): - db = get_db() - field_a = ['host_id'] - sql = 'SELECT {} FROM `{}auth` AS a WHERE `account_name`="{}";'.format(','.join(['`a`.`{}`'.format(i) for i in field_a]), db.table_prefix, user_name) - db_ret = db.query(sql) - ret = dict() - for item in db_ret: - x = DbItem() - x.load(item, ['a_{}'.format(i) for i in field_a]) - host_id = int(x.a_host_id) - ret[host_id] = host_id - - a_list = list() - for item in host_list: - if item in ret: - pass - else: - a_list.append(item) - try: - for item in a_list: - host_id = int(item) - sql = 'INSERT INTO `{}auth` (`account_name`, `host_id`) VALUES ("{}", {});'.format(db.table_prefix, user_name, host_id) - ret = db.exec(sql) - if not ret: - return False - return True - except: - return False - - -def alloc_host_user(user_name, host_auth_dict): - db = get_db() - field_a = ['host_id', 'host_auth_id'] - sql = 'SELECT {} FROM `{}auth` AS a WHERE `account_name`="{}";'.format(','.join(['`a`.`{}`'.format(i) for i in field_a]), db.table_prefix, user_name) - db_ret = db.query(sql) - ret = dict() - for item in db_ret: - x = DbItem() - x.load(item, ['a_{}'.format(i) for i in field_a]) - host_id = int(x.a_host_id) - host_auth_id = int(x.a_host_auth_id) - if host_id not in ret: - ret[host_id] = dict() - - temp = ret[host_id] - temp[host_auth_id] = host_id - ret[host_id] = temp - - add_dict = dict() - for k, v in host_auth_dict.items(): - host_id = int(k) - auth_id_list = v - for item in auth_id_list: - host_auth_id = int(item) - if host_id not in ret: - add_dict[host_auth_id] = host_id - continue - temp = ret[host_id] - if host_auth_id not in temp: - add_dict[host_auth_id] = host_id - continue - - try: - for k, v in add_dict.items(): - host_auth_id = int(k) - host_id = int(v) - sql = 'INSERT INTO `{}auth` (`account_name`, `host_id`, `host_auth_id`) VALUES ("{}", {}, {});'.format(db.table_prefix, user_name, host_id, host_auth_id) - ret = db.exec(sql) - if not ret: - return False - return True - except: - return False - - -def delete_host(user_name, host_list): - db = get_db() - try: - for item in host_list: - host_id = int(item) - sql = 'DELETE FROM `{}auth` WHERE `account_name`="{}" AND `host_id`={};'.format(db.table_prefix, user_name, host_id) - ret = db.exec(sql) - if not ret: - return False - return True - except: - return False - - -def delete_host_user(user_name, auth_id_list): - db = get_db() - try: - for item in auth_id_list: - auth_id = int(item) - sql = 'DELETE FROM `{}auth` WHERE `account_name`="{}" AND `auth_id`={};'.format(db.table_prefix, user_name, auth_id) - ret = db.exec(sql) - if not ret: - return False - return True - except: - return False - - -def get_log_list(_filter, limit): - db = get_db() - - _where = '' - - if len(_filter) > 0: - _where = 'WHERE ( ' - - need_and = False - for k in _filter: - if k == 'account_name': - if need_and: - _where += ' AND' - _where += ' `a`.`account_name`="{}"'.format(_filter[k]) - need_and = True - - if k == 'user_name': - if need_and: - _where += ' AND' - _where += ' `a`.`account_name`="{}"'.format(_filter[k]) - need_and = True - - elif k == 'search': - # 查找,限于主机ID和IP地址,前者是数字,只能精确查找,后者可以模糊匹配 - # 因此,先判断搜索项能否转换为数字。 - - if need_and: - _where += ' AND ' - - _where += '(' - _where += '`a`.`host_ip` LIKE "%{}%" )'.format(_filter[k]) - need_and = True - _where += ')' - - # http://www.jb51.net/article/46015.htm - field_a = ['id', 'session_id', 'account_name', 'host_ip', 'host_port', 'auth_type', 'sys_type', 'user_name', 'ret_code', - 'begin_time', 'end_time', 'log_time', 'protocol'] - - sql = 'SELECT COUNT(*) FROM `{}log` AS a {};'.format(db.table_prefix, _where) - - db_ret = db.query(sql) - total_count = db_ret[0][0] - # 修正分页数据 - _limit = '' - if len(limit) > 0: - _page_index = limit['page_index'] - _per_page = limit['per_page'] - _limit = 'LIMIT {},{}'.format(_page_index * _per_page, (_page_index + 1) * _per_page) - - if _page_index * _per_page >= total_count: - _page_index = int(total_count / _per_page) - _limit = 'LIMIT {},{}'.format(_page_index * _per_page, (_page_index + 1) * _per_page) - - sql = 'SELECT {} FROM `{}log` AS a {} ORDER BY `begin_time` DESC {};'.format(','.join(['a.{}'.format(i) for i in field_a]), db.table_prefix, _where, _limit) - db_ret = db.query(sql) - - ret = list() - for item in db_ret: - x = DbItem() - x.load(item, ['a_{}'.format(i) for i in field_a]) - h = dict() - h['id'] = x.a_id - h['session_id'] = x.a_session_id - h['account_name'] = x.a_account_name - h['host_ip'] = x.a_host_ip - h['host_port'] = x.a_host_port - h['auth_type'] = x.a_auth_type - h['sys_type'] = x.a_sys_type - h['user_name'] = x.a_user_name - h['ret_code'] = x.a_ret_code - cost_time = (x.a_end_time - x.a_begin_time) - if cost_time < 0: - cost_time = 0 - h['cost_time'] = cost_time - h['begin_time'] = x.a_begin_time - if x.a_protocol is not None: - h['protocol'] = x.a_protocol - else: - if x.a_sys_type == 1: - h['protocol'] = 1 - else: - h['protocol'] = 2 - - ret.append(h) - - return total_count, ret +# -*- coding: utf-8 -*- + +import hashlib + +from eom_app.app.configs import app_cfg +from eom_app.app.const import * +from eom_app.app.db import get_db, DbItem +from eom_app.app.util import sec_generate_password, sec_verify_password + + +def verify_user(name, password): + cfg = app_cfg() + db = get_db() + + sql = 'SELECT `account_id`, `account_type`, `account_name`, `account_pwd`, `account_lock` FROM `{}account` WHERE `account_name`="{}";'.format(db.table_prefix, name) + db_ret = db.query(sql) + if db_ret is None: + # 特别地,如果无法取得数据库连接,有可能是新安装的系统,尚未建立数据库,此时应该处于维护模式 + # 因此可以特别地处理用户验证:用户名admin,密码admin可以登录为管理员 + if cfg.app_mode == APP_MODE_MAINTENANCE: + if name == 'admin' and password == 'admin': + return 1, 100, 'admin', 0 + return 0, 0, '', 0 + + if len(db_ret) != 1: + return 0, 0, '', 0 + + user_id = db_ret[0][0] + account_type = db_ret[0][1] + name = db_ret[0][2] + locked = db_ret[0][4] + if locked == 1: + return 0, 0, '', locked + + if not sec_verify_password(password, db_ret[0][3]): + # 按新方法验证密码失败,可能是旧版本的密码散列格式,再尝试一下 + if db_ret[0][3] != hashlib.sha256(password.encode()).hexdigest(): + return 0, 0, '', locked + else: + # 发现此用户的密码散列格式还是旧的,更新成新的吧! + _new_sec_password = sec_generate_password(password) + sql = 'UPDATE `{}account` SET `account_pwd`="{}" WHERE `account_id`={}'.format(db.table_prefix, _new_sec_password, int(user_id)) + db.exec(sql) + + return user_id, account_type, name, locked + + +def modify_pwd(old_pwd, new_pwd, user_id): + db = get_db() + sql = 'SELECT `account_pwd` FROM `{}account` WHERE `account_id`={};'.format(db.table_prefix, int(user_id)) + db_ret = db.query(sql) + if db_ret is None or len(db_ret) != 1: + return -100 + + if not sec_verify_password(old_pwd, db_ret[0][0]): + # 按新方法验证密码失败,可能是旧版本的密码散列格式,再尝试一下 + if db_ret[0][0] != hashlib.sha256(old_pwd.encode()).hexdigest(): + return -101 + + _new_sec_password = sec_generate_password(new_pwd) + sql = 'UPDATE `{}account` SET `account_pwd`="{}" WHERE `account_id`={}'.format(db.table_prefix, _new_sec_password, int(user_id)) + db_ret = db.exec(sql) + if db_ret: + return 0 + else: + return -102 + + +def get_user_list(with_admin=False): + db = get_db() + ret = list() + + field_a = ['account_id', 'account_type', 'account_name', 'account_status', 'account_lock', 'account_desc'] + + if with_admin: + where = '' + else: + where = 'WHERE `a`.`account_type`<100' + + sql = 'SELECT {} FROM `{}account` as a {} ORDER BY `account_name`;'.format(','.join(['`a`.`{}`'.format(i) for i in field_a]), db.table_prefix, where) + db_ret = db.query(sql) + if db_ret is None: + return ret + + for item in db_ret: + x = DbItem() + x.load(item, ['a_{}'.format(i) for i in field_a]) + h = dict() + h['user_id'] = x.a_account_id + h['user_type'] = x.a_account_type + h['user_name'] = x.a_account_name + h['user_status'] = x.a_account_status + h['user_lock'] = x.a_account_lock + h['user_desc'] = x.a_account_desc + ret.append(h) + return ret + + +def delete_user(user_id): + db = get_db() + sql = 'DELETE FROM `{}account` WHERE `account_id`={};'.format(db.table_prefix, int(user_id)) + return db.exec(sql) + + +def lock_user(user_id, lock_status): + db = get_db() + sql = 'UPDATE `{}account` SET `account_lock`={} WHERE `account_id`={};'.format(db.table_prefix, lock_status, int(user_id)) + return db.exec(sql) + + +def reset_user(user_id): + db = get_db() + _new_sec_password = sec_generate_password('123456') + sql = 'UPDATE `{}account` SET `account_pwd`="{}" WHERE `account_id`={};'.format(db.table_prefix, _new_sec_password, int(user_id)) + return db.exec(sql) + + +def modify_user(user_id, user_desc): + db = get_db() + sql = 'UPDATE `{}account` SET `account_desc`="{}" WHERE `account_id`={};'.format(db.table_prefix, user_desc, int(user_id)) + return db.exec(sql) + + +def add_user(user_name, user_pwd, user_desc): + db = get_db() + sql = 'SELECT `account_id` FROM `{}account` WHERE `account_name`="{}";'.format(db.table_prefix, user_name) + db_ret = db.query(sql) + if db_ret is None or len(db_ret) != 0: + return -100 + + sec_password = sec_generate_password(user_pwd) + sql = 'INSERT INTO `{}account` (`account_type`, `account_name`, `account_pwd`, `account_status`,' \ + '`account_lock`,`account_desc`) VALUES (1,"{}","{}",0,0,"{}")'.format(db.table_prefix, user_name, sec_password, user_desc) + ret = db.exec(sql) + if ret: + return 0 + return -101 + + +def alloc_host(user_name, host_list): + db = get_db() + field_a = ['host_id'] + sql = 'SELECT {} FROM `{}auth` AS a WHERE `account_name`="{}";'.format(','.join(['`a`.`{}`'.format(i) for i in field_a]), db.table_prefix, user_name) + db_ret = db.query(sql) + ret = dict() + for item in db_ret: + x = DbItem() + x.load(item, ['a_{}'.format(i) for i in field_a]) + host_id = int(x.a_host_id) + ret[host_id] = host_id + + a_list = list() + for item in host_list: + if item in ret: + pass + else: + a_list.append(item) + try: + for item in a_list: + host_id = int(item) + sql = 'INSERT INTO `{}auth` (`account_name`, `host_id`) VALUES ("{}", {});'.format(db.table_prefix, user_name, host_id) + ret = db.exec(sql) + if not ret: + return False + return True + except: + return False + + +def alloc_host_user(user_name, host_auth_dict): + db = get_db() + field_a = ['host_id', 'host_auth_id'] + sql = 'SELECT {} FROM `{}auth` AS a WHERE `account_name`="{}";'.format(','.join(['`a`.`{}`'.format(i) for i in field_a]), db.table_prefix, user_name) + db_ret = db.query(sql) + ret = dict() + for item in db_ret: + x = DbItem() + x.load(item, ['a_{}'.format(i) for i in field_a]) + host_id = int(x.a_host_id) + host_auth_id = int(x.a_host_auth_id) + if host_id not in ret: + ret[host_id] = dict() + + temp = ret[host_id] + temp[host_auth_id] = host_id + ret[host_id] = temp + + add_dict = dict() + for k, v in host_auth_dict.items(): + host_id = int(k) + auth_id_list = v + for item in auth_id_list: + host_auth_id = int(item) + if host_id not in ret: + add_dict[host_auth_id] = host_id + continue + temp = ret[host_id] + if host_auth_id not in temp: + add_dict[host_auth_id] = host_id + continue + + try: + for k, v in add_dict.items(): + host_auth_id = int(k) + host_id = int(v) + sql = 'INSERT INTO `{}auth` (`account_name`, `host_id`, `host_auth_id`) VALUES ("{}", {}, {});'.format(db.table_prefix, user_name, host_id, host_auth_id) + ret = db.exec(sql) + if not ret: + return False + return True + except: + return False + + +def delete_host(user_name, host_list): + db = get_db() + try: + for item in host_list: + host_id = int(item) + sql = 'DELETE FROM `{}auth` WHERE `account_name`="{}" AND `host_id`={};'.format(db.table_prefix, user_name, host_id) + ret = db.exec(sql) + if not ret: + return False + return True + except: + return False + + +def delete_host_user(user_name, auth_id_list): + db = get_db() + try: + for item in auth_id_list: + auth_id = int(item) + sql = 'DELETE FROM `{}auth` WHERE `account_name`="{}" AND `auth_id`={};'.format(db.table_prefix, user_name, auth_id) + ret = db.exec(sql) + if not ret: + return False + return True + except: + return False + + +def get_log_list(_filter, limit): + db = get_db() + + _where = '' + + if len(_filter) > 0: + _where = 'WHERE ( ' + + need_and = False + for k in _filter: + if k == 'account_name': + if need_and: + _where += ' AND' + _where += ' `a`.`account_name`="{}"'.format(_filter[k]) + need_and = True + + if k == 'user_name': + if need_and: + _where += ' AND' + _where += ' `a`.`account_name`="{}"'.format(_filter[k]) + need_and = True + + elif k == 'search': + # 查找,限于主机ID和IP地址,前者是数字,只能精确查找,后者可以模糊匹配 + # 因此,先判断搜索项能否转换为数字。 + + if need_and: + _where += ' AND ' + + _where += '(' + _where += '`a`.`host_ip` LIKE "%{}%" )'.format(_filter[k]) + need_and = True + _where += ')' + + # http://www.jb51.net/article/46015.htm + field_a = ['id', 'session_id', 'account_name', 'host_ip', 'host_port', 'auth_type', 'sys_type', 'user_name', 'ret_code', + 'begin_time', 'end_time', 'log_time', 'protocol'] + + sql = 'SELECT COUNT(*) FROM `{}log` AS a {};'.format(db.table_prefix, _where) + + db_ret = db.query(sql) + total_count = db_ret[0][0] + # 修正分页数据 + _limit = '' + if len(limit) > 0: + _page_index = limit['page_index'] + _per_page = limit['per_page'] + _limit = 'LIMIT {},{}'.format(_page_index * _per_page, (_page_index + 1) * _per_page) + + if _page_index * _per_page >= total_count: + _page_index = int(total_count / _per_page) + _limit = 'LIMIT {},{}'.format(_page_index * _per_page, (_page_index + 1) * _per_page) + + sql = 'SELECT {} FROM `{}log` AS a {} ORDER BY `begin_time` DESC {};'.format(','.join(['a.{}'.format(i) for i in field_a]), db.table_prefix, _where, _limit) + db_ret = db.query(sql) + + ret = list() + for item in db_ret: + x = DbItem() + x.load(item, ['a_{}'.format(i) for i in field_a]) + h = dict() + h['id'] = x.a_id + h['session_id'] = x.a_session_id + h['account_name'] = x.a_account_name + h['host_ip'] = x.a_host_ip + h['host_port'] = x.a_host_port + h['auth_type'] = x.a_auth_type + h['sys_type'] = x.a_sys_type + h['user_name'] = x.a_user_name + h['ret_code'] = x.a_ret_code + cost_time = (x.a_end_time - x.a_begin_time) + if cost_time < 0: + cost_time = 0 + h['cost_time'] = cost_time + h['begin_time'] = x.a_begin_time + if x.a_protocol is not None: + h['protocol'] = x.a_protocol + else: + if x.a_sys_type == 1: + h['protocol'] = 1 + else: + h['protocol'] = 2 + + ret.append(h) + + return total_count, ret diff --git a/server/www/teleport/static/js/ui/admin_host.js b/server/www/teleport/static/js/ui/admin_host.js index dc89ad2..57a8386 100644 --- a/server/www/teleport/static/js/ui/admin_host.js +++ b/server/www/teleport/static/js/ui/admin_host.js @@ -209,8 +209,12 @@ ywl.on_init = function (cb_stack, cb_args) { var _fn_sure = function (cb_stack, cb_args) { ywl.ajax_post_json('/host/delete-host', {host_list: host_list}, function (ret) { - g_host_table.reload(); - ywl.notify_success('删除主机操作成功!'); + if (ret.code === TPE_OK) { + g_host_table.reload(); + ywl.notify_success('删除主机操作成功!'); + } else { + ywl.notify_error('删除主机操作失败:' + ret.message); + } }, function () { ywl.notify_error('网络故障,删除主机操作失败!'); @@ -344,12 +348,16 @@ ywl.on_host_table_created = function (tbl) { var _fn_sure = function (cb_stack, cb_args) { ywl.ajax_post_json('/host/lock-host', {host_id: host_id, lock: host_lock}, function (ret) { - var update_args = {host_lock: host_lock}; - tbl.update_row(row_id, update_args); - ywl.notify_success('操作成功'); + if (ret.code === TPE_OK) { + var update_args = {host_lock: host_lock}; + tbl.update_row(row_id, update_args); + ywl.notify_success('锁定主机操作成功!'); + } else { + ywl.notify_error('锁定主机操作失败:' + ret.message); + } }, function () { - ywl.notify_error('操作失败'); + ywl.notify_error('网络故障,锁定主机操作失败!'); } ); }; @@ -370,11 +378,15 @@ ywl.on_host_table_created = function (tbl) { host_list.push(host_id); ywl.ajax_post_json('/host/delete-host', {host_list: host_list}, function (ret) { - tbl.remove_row(row_id); - ywl.notify_success('操作成功'); + if (ret.code === TPE_OK) { + tbl.remove_row(row_id); + ywl.notify_success('删除主机操作成功!'); + } else { + ywl.notify_error('删除主机操作失败:' + ret.message); + } }, function () { - ywl.notify_error('操作失败'); + ywl.notify_error('网络故障,删除主机操作失败!'); } ); }; @@ -802,22 +814,26 @@ ywl.create_host_edit_dlg = function (tbl) { }; ywl.ajax_post_json('/host/update', {host_id: host_id, kv: args}, function (ret) { - var update_args = { - host_ip: dlg_edit_host.ip, - group_name: dlg_edit_host.group_name, - group_id: dlg_edit_host.group_id, - host_desc: dlg_edit_host.host_desc, - host_sys_type: dlg_edit_host.sys_type, - protocol: protocol, - host_port: host_port - }; + if (ret.code === TPE_OK) { + var update_args = { + host_ip: dlg_edit_host.ip, + group_name: dlg_edit_host.group_name, + group_id: dlg_edit_host.group_id, + host_desc: dlg_edit_host.host_desc, + host_sys_type: dlg_edit_host.sys_type, + protocol: protocol, + host_port: host_port + }; - dlg_edit_host.tbl.update_row(dlg_edit_host.row_id, update_args); - ywl.notify_success('主机 ' + dlg_edit_host.ip + ' 的认证信息已保存!'); - dlg_edit_host.hide(); + dlg_edit_host.tbl.update_row(dlg_edit_host.row_id, update_args); + ywl.notify_success('主机 ' + dlg_edit_host.ip + ' 信息已保存!'); + dlg_edit_host.hide(); + } else { + ywl.notify_error('主机 ' + self.host_ip + ' 信息更新失败:' + ret.message); + } }, function () { - ywl.notify_error('主机 ' + self.host_ip + ' 更新失败!', ''); + ywl.notify_error('网络故障,主机 ' + self.host_ip + ' 信息更新失败!'); } ); }; @@ -837,22 +853,22 @@ ywl.create_host_edit_dlg = function (tbl) { ywl.ajax_post_json('/host/add-host', args, function (ret) { - if (ret.code === 0) { + if (ret.code === TPE_OK) { dlg_edit_host.tbl.reload(); ywl.notify_success('主机 ' + dlg_edit_host.ip + ' 信息已添加!'); dlg_edit_host.hide(); } else { if (ret.code === -100) { - ywl.notify_error('主机 ' + dlg_edit_host.ip + ' 已经添加,请不要重复添加主机!', ''); + ywl.notify_error('主机 ' + dlg_edit_host.ip + ' 已存在,请不要重复添加主机!'); } else { - ywl.notify_error('主机 ' + dlg_edit_host.ip + ' 信息保存失败!' + ret.code, ''); + ywl.notify_error('主机 ' + dlg_edit_host.ip + ' 信息保存失败!' + ret.message); } } }, function () { - ywl.notify_error('主机 ' + dlg_edit_host.ip + ' 信息保存失败!', ''); + ywl.notify_error('网络故障,主机 ' + dlg_edit_host.ip + ' 信息保存失败!', ''); } ); }; @@ -895,9 +911,15 @@ ywl.create_host_user_edit_dlg = function (tbl) { html.push(''); return html.join(''); }; + dlg_user_edit_host.sync_user_info = function (host_id) { ywl.ajax_post_json('/host/sys-user/list', {host_id: host_id}, function (ret) { + if (ret.code !== TPE_OK) { + ywl.notify_error('获取主机用户列表失败:' + ret.message); + return; + } + var data = ret.data; dlg_user_edit_host.auth_list = data; @@ -951,18 +973,15 @@ ywl.create_host_user_edit_dlg = function (tbl) { var host_auth_id = parseInt($(this).attr("auth-id")); ywl.ajax_post_json('/host/sys-user/delete', {host_auth_id: host_auth_id}, function (ret) { - //console.log("ret,", ret); if (ret.code === TPE_OK) { - ywl.notify_success('系统用户删除成功'); - // var host_id = parseInt(dlg_user_edit_host.host_id); + ywl.notify_success('系统用户删除成功!'); g_dlg_edit_host_user.sync_user_info(host_id); - } else { - ywl.notify_error('系统用户删除失败!' + ret.code); + ywl.notify_error('系统用户删除失败:' + ret.message); } }, function () { - ywl.notify_error('系统用户删除失败!'); + ywl.notify_error('网络故障:系统用户删除失败!'); } ); }); @@ -1349,21 +1368,19 @@ ywl.create_sys_user = function (tbl) { cert_id: cert_id, user_param: dlg_sys_user.user_param }; - //console.log("args:", args); + ywl.ajax_post_json('/host/sys-user/update', {host_auth_id: host_auth_id, kv: args}, function (ret) { - //console.log("ret,", ret); - if (ret.code === 0) { - ywl.notify_success('系统用户信息更新成功'); + if (ret.code === TPE_OK) { + ywl.notify_success('系统用户信息更新成功!'); g_dlg_edit_host_user.sync_user_info(host_id); dlg_sys_user.hide(); - } else { - ywl.notify_error('系统用户信息更新失败' + ret.code); + ywl.notify_error('系统用户信息更新失败:' + ret.message); } }, function () { - ywl.notify_error('系统用户信息更新失败'); + ywl.notify_error('网络故障,系统用户信息更新失败!'); } ); }; @@ -1394,15 +1411,15 @@ ywl.create_sys_user = function (tbl) { ywl.ajax_post_json('/host/sys-user/add', args, function (ret) { if (ret.code === TPE_OK) { - ywl.notify_success('系统用户添加成功'); + ywl.notify_success('系统用户添加成功!'); g_dlg_edit_host_user.sync_user_info(host_id); dlg_sys_user.hide(); } else { - ywl.notify_error('系统用户添加失败' + ret.code); + ywl.notify_error('系统用户添加失败:' + ret.message); } }, function () { - ywl.notify_error('系统用户信息更新失败'); + ywl.notify_error('网络故障,系统用户信息更新失败!'); } ); }; @@ -1461,17 +1478,21 @@ ywl.create_batch_join_group_dlg = function (tbl) { ywl.ajax_post_json('/host/add-host-to-group', {host_list: data_list, group_id: group_id}, function (ret) { - var update_args = {group_name: group_name}; - for (var i = 0; i < batch_join_dlg.host_list.length; i++) { - var row_id = batch_join_dlg.host_list[i].row_id; - batch_join_dlg.tbl.update_row(row_id, update_args); - } + if (ret.code === TPE_OK) { + var update_args = {group_name: group_name}; + for (var i = 0; i < batch_join_dlg.host_list.length; i++) { + var row_id = batch_join_dlg.host_list[i].row_id; + batch_join_dlg.tbl.update_row(row_id, update_args); + } - ywl.notify_success("成功设定分组信息!"); - batch_join_dlg.hide(); + ywl.notify_success("成功设定主机分组信息!"); + batch_join_dlg.hide(); + } else { + ywl.notify_error("设定主机分组信息失败:" + ret.message); + } }, function () { - ywl.notify_error("设定分组信息失败!"); + ywl.notify_error("网络故障,设定主机分组信息失败!"); } ); }; diff --git a/server/www/teleport/static/js/ui/auth.js b/server/www/teleport/static/js/ui/auth.js index c75601a..f66c445 100644 --- a/server/www/teleport/static/js/ui/auth.js +++ b/server/www/teleport/static/js/ui/auth.js @@ -1,745 +1,750 @@ -/*! ywl v1.0.1, (c)2015 eomsoft.net */ -"use strict"; -var OS_TYPE_WINDOWS = 1; -var OS_TYPE_LINUX = 2; -var PROTOCOL_TYPE_RDP = 1; -var PROTOCOL_TYPE_SSH = 2; -var PROTOCOL_TYPE_TELNET = 3; -var AUTH_TYPE_PASSWORD = 1; -var AUTH_TYPE_SSHKEY = 2; -var AUTH_NONE = 0; -var g_cert_list = {}; -var g_group_list = {}; -var g_user_host_list = null; - -ywl.on_init = function (cb_stack, cb_args) { - ywl.create_host_table(cb_stack, cb_args); - ywl.create_user_host_table(cb_stack, cb_args); - cb_stack.exec(); -}; - - -ywl.create_host_table = function (cb_stack, cb_args) { - var dom_id = '#ywl_host_list'; - - //=================================== - // 创建页面控件对象 - //=================================== - // 表格数据 - var host_table_options = { - selector: dom_id + " [ywl-table='host-list']", - data_source: { - type: 'ajax-post', - url: '/host/list' - }, - //render: ywl.create_table_render(ywl.on_host_table_render_created),//ywl_TableRender.create(); - column_default: {sort: false, header_align: 'center', cell_align: 'center'}, - columns: [ - {title: '', key: 'select_all', sort: false, width: 24, render: 'make_check_box', fields: {id: 'host_id'}}, - {title: "远程协议", key: "auth_list", width: 280, header_align: 'left', cell_align: 'left', sort: false, render: 'auth_list', fields: {id: 'host_id', protocol: 'protocol', auth_list: 'auth_list'}}, - {title: "主机", key: "host_id", width: 240, sort: true, render: 'host_id', fields: {id: 'host_ip', host_desc: 'host_desc', host_port: 'host_port'}}, - {title: "分组", key: "group_name", width: 240}, - {title: "系统", key: "host_sys_type", width: 64, render: 'sys_type', fields: {sys_type: 'host_sys_type'}}, - {title: "状态", key: "host_lock", render: 'host_lock', fields: {host_lock: 'host_lock'}}, - ], - paging: {selector: dom_id + " [ywl-paging='host-list']", per_page: paging_normal}, - - // 可用的属性设置 - //have_header: true or false - - // 可用的回调函数 - on_created: ywl.on_host_table_created, - on_header_created: ywl.on_host_table_header_created - - // 可重载的函数(在on_created回调函数中重载) - // on_render_created - // on_header_created - // on_paging_created - // on_data_loaded - // on_row_rendered - // on_table_rendered - // on_cell_created - // on_begin_load - // on_after_load - - // 可用的函数 - // load_data - // cancel_load - // set_data - // add_row - // remove_row - // get_row - // update_row - // clear - // reset_filter - }; - - var host_table = ywl.create_table(host_table_options); - - // 主机分组过滤器 - g_cert_list = ywl.page_options.cert_list; - g_group_list = ywl.page_options.group_list; - ywl.create_table_filter_host_group(host_table, dom_id + " [ywl-filter='host-group']", g_group_list); - - ywl.create_table_filter_system_type(host_table, dom_id + " [ywl-filter='system-type']"); - // 搜索框 - ywl.create_table_filter_search_box(host_table, dom_id + " [ywl-filter='search']"); - - //====================================================== - // 事件绑定 - //====================================================== - $("#btn-add-host").click(function () { -// var _data_list = []; - var host_list = []; - var _host_id_objs = $(host_table.selector + " tbody tr td [data-check-box]"); - $.each(_host_id_objs, function (i, _host_id_objs) { - if ($(_host_id_objs).is(':checked')) { - var _row_data = host_table.get_row(_host_id_objs); - var data = {host_id: _row_data.host_id, row_id: _row_data.ywl_row_id}; - host_list.push(data) - } - }); - console.log('host_list', host_list); - var user_dict = {}; - var _user_objs = $(host_table.selector + " tbody tr td [user-check-box]"); - $.each(_user_objs, function (i, _user_objs) { - if ($(_user_objs).is(':checked')) { - var _row_data = host_table.get_row(_user_objs); - var host_auth_id = parseInt($(_user_objs).attr('user-check-box')); -// var data = {host_id: _row_data.host_id, row_id: _row_data.ywl_row_id}; - - if (typeof(user_dict[_row_data.ywl_row_id]) == "undefined") { - user_dict[_row_data.ywl_row_id] = []; - } - user_dict[_row_data.ywl_row_id].push(host_auth_id); - } - }); - console.log('user_dict', user_dict); - var length = 0; - var args = {}; - - for (var i = 0; i < host_list.length; i++) { - var host_id = host_list[i].host_id; - var row_id = host_list[i].row_id; - var host_auth_list = user_dict[row_id]; - if (typeof(host_auth_list) == "undefined") { - continue; - } - args[host_id] = host_auth_list; - length += 1; - } - console.log('args', args); - if (length === 0) { - ywl.notify_error('请先选择要批量授权的主机!'); - return; - } - - ywl.ajax_post_json('/user/alloc-host-user', {host_list: args, user_name: ywl.page_options.user_name}, - function (ret) { - g_user_host_list.reload(); - ywl.notify_success("主机授权操作成功!"); - }, - function () { - ywl.notify_error("主机授权操作时发生错误!"); - } - ); - }); - - // 将刷新按钮点击事件绑定到表格的重新加载函数上,这样,点击刷新就导致表格数据重新加载。 - $(dom_id + " [ywl-filter='reload']").click(host_table.reload); - - cb_stack - .add(host_table.load_data) - .add(host_table.init) - .exec(); -}; - -ywl.create_user_host_table = function (cb_stack, cb_args) { - var dom_id = '#ywl_user_host_list'; - //=================================== - // 创建页面控件对象 - //=================================== - // 表格数据 - var host_table_options = { - selector: dom_id + " [ywl-table='host-list']", - data_source: { - type: 'ajax-post', - url: '/user/host-list' - }, - //render: ywl.create_table_render(ywl.on_host_table_render_created),//ywl_TableRender.create(); - column_default: {sort: false, header_align: 'center', cell_align: 'center'}, - columns: [ - {title: '', key: 'select_all', sort: false, width: 24, render: 'make_check_box', fields: {id: 'host_id'}}, - {title: "远程协议", key: "auth_list", header_align: 'left', cell_align: 'left', render: 'auth_list', fields: {id: 'host_id', protocol: 'protocol', auth_list: 'auth_list'}}, - {title: "主机", key: "host_id", width: 240, sort: true, render: 'host_id', fields: {id: 'host_ip', host_desc: 'host_desc', host_port: 'host_port'}}, - {title: "分组", key: "group_name", width: 240}, - {title: "系统", key: "host_sys_type", width: 64, render: 'sys_type', fields: {sys_type: 'host_sys_type'}}, - {title: "状态", key: "host_lock", render: 'host_lock', fields: {host_lock: 'host_lock'}}, - {title: "操作", key: "action", width: 160, render: 'make_action_btn', fields: {id: 'host_id', host_lock: 'host_lock'}} - ], - paging: {selector: dom_id + " [ywl-paging='host-list']", per_page: paging_normal}, - - // 可用的属性设置 - //have_header: true or false - - // 可用的回调函数 - on_created: ywl.on_user_host_table_created, - on_header_created: ywl.on_user_host_table_header_created - - // 可重载的函数(在on_created回调函数中重载) - // on_render_created - // on_header_created - // on_paging_created - // on_data_loaded - // on_row_rendered - // on_table_rendered - // on_cell_created - // on_begin_load - // on_after_load - - // 可用的函数 - // load_data - // cancel_load - // set_data - // add_row - // remove_row - // get_row - // update_row - // clear - // reset_filter - }; - - var host_table = ywl.create_table(host_table_options); - g_user_host_list = host_table; - // 主机分组过滤器 - g_group_list = ywl.page_options.group_list; - ywl.create_table_filter_host_group(host_table, dom_id + " [ywl-filter='host-group']", g_group_list); - - ywl.create_table_filter_system_type(host_table, dom_id + " [ywl-filter='system-type']"); - // 搜索框 - ywl.create_table_filter_search_box(host_table, dom_id + " [ywl-filter='search']"); - - ywl.create_table_filter_user_name(host_table); - - //====================================================== - // 事件绑定 - //====================================================== - $("#btn-delete-host").click(function () { - var _data_list = []; - var _objs = $(host_table.selector + " tbody tr td [data-check-box]"); - $.each(_objs, function (i, _obj) { - if ($(_obj).is(':checked')) { - var _row_data = host_table.get_row(_obj); - var data = {host_id: _row_data.host_id, row_id: _row_data.ywl_row_id}; - _data_list.push(data); - } - }); - if (_data_list.length === 0) { - ywl.notify_error('请先选择要回收授权的主机!'); - return; - } - - var _fn_sure = function (cb_stack, cb_args) { - // var _data_list = cb_args._data_list || []; - var host_list = []; - for (var i = 0; i < _data_list.length; i++) { - var host_id = _data_list[i].host_id; - host_list.push(host_id); - } - host_list.push(host_id); - ywl.ajax_post_json('/user/delete-host', {host_list: host_list, user_name: ywl.page_options.user_name}, - function (ret) { - g_user_host_list.reload(); - ywl.notify_success('成功回收主机授权!'); - }, - function () { - ywl.notify_error('回收主机授权时发生错误!'); - } - ); - }; - - var cb_stack = CALLBACK_STACK.create(); - ywl.dlg_confirm(cb_stack, - { - msg: '

此操作不可恢复!!

您确定要回收选中主机的授权吗?

', - fn_yes: _fn_sure - // cb_args: _data_list - }); - - - }); - - // $("#user-host-titile").html('已经授权给用户' + ywl.page_options.user_name + "的主机列表"); - // 将刷新按钮点击事件绑定到表格的重新加载函数上,这样,点击刷新就导致表格数据重新加载。 - $(dom_id + " [ywl-filter='reload']").click(host_table.reload); - - cb_stack - .add(host_table.load_data) - .add(host_table.init) - .exec(); -}; - -// 扩展/重载表格的功能 -ywl.on_host_table_created = function (tbl) { - - tbl.on_cell_created = function (row_id, col_key, cell_obj) { - if (col_key == 'select_all') { - // 选择 - $('#host-select-' + row_id).click(function () { - console.log('host-sel'); - var _all_checked = true; - var _objs = $(tbl.selector + ' tbody').find('[data-check-box]'); - $.each(_objs, function (i, _obj) { - if (!$(_obj).is(':checked')) { - _all_checked = false; - return false; - } - }); - - var select_all_dom = $('#host-select-all'); - if (_all_checked) { - select_all_dom.prop('checked', true); - } else { - select_all_dom.prop('checked', false); - } - if ($(this).is(':checked')) { - $(this).parent().parent().parent().find("[user-check-box]").prop('checked', true); - } else { - $(this).parent().parent().parent().find("[user-check-box]").prop('checked', false); - } - //ywl.update_add_to_batch_btn(); - }); - - } else if (col_key == 'host_id') { - // 为主机描述绑定点击事件 - var _link = $(cell_obj).find(" [ywl-host-desc]"); - _link.click(function () { - var row_data = tbl.get_row(row_id); - ywl.create_dlg_modify_host_desc(tbl, row_data.ywl_row_id, row_data.host_id, row_data.host_ip, row_data.host_desc).show(_link); - }); - } else if (col_key == 'auth_list') { - $('#user-check-box-row-' + row_id).click(function () { - var _checked = false; - var _objs = $(this).parent().parent().parent().parent().find('[user-check-box]'); - $.each(_objs, function (i, _obj) { - if ($(_obj).is(':checked')) { - _checked = true; - return false; - } - }); - var select = $('#host-select-' + row_id); - - if (_checked) { - select.prop('checked', true); - } else { - select.prop('checked', false); - } - console.log("xxxxxxx"); - }); - } - }; - - // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 - tbl.on_render_created = function (render) { - - render.auth_list = function (row_id, fields) { - // TODO: 这里应该从fields里拿一个数组,是本主机上开放的所有远程访问协议和登录账号的组合 - var auth_list = fields.auth_list; - var protocol = fields.protocol; - var ret = []; - - if (auth_list.length == 0) { - ret.push('尚未添加系统用户'); - return ret.join(''); - } - - for (var i = 0; i < auth_list.length; i++) { - var auth = auth_list[i]; - ret.push('
'); - if (protocol == PROTOCOL_TYPE_RDP) { - - ret.push('
    '); - ret.push('
  • RDP
  • '); - ret.push('
  • ' + auth.user_name + '
  • '); - if (auth.auth_mode == AUTH_TYPE_PASSWORD) { - ret.push('
  • 密码
  • '); - } else if (auth.auth_mode == AUTH_TYPE_SSHKEY) { - ret.push('
  • 私钥
  • '); - } else if (auth.auth_mode == AUTH_NONE) { - ret.push('
  • '); - } else { - ret.push('
  • 未知
  • '); - } - ret.push('
'); - - } else if (protocol == PROTOCOL_TYPE_SSH) { - ret.push('
    '); - ret.push('
  • SSH
  • '); - ret.push('
  • ' + auth.user_name + '
  • '); - if (auth.auth_mode == AUTH_TYPE_PASSWORD) { - ret.push('
  • 密码
  • '); - } else if (auth.auth_mode == AUTH_TYPE_SSHKEY) { - ret.push('
  • 私钥
  • '); - } else if (auth.auth_mode == AUTH_NONE) { - ret.push('
  • '); - } else { - ret.push('
  • 未知
  • '); - } - ret.push('
'); - } else if (protocol == PROTOCOL_TYPE_TELNET) { - ret.push('
    '); - ret.push('
  • TELNET
  • '); - ret.push('
  • ' + auth.user_name + '
  • '); - if (auth.auth_mode == AUTH_TYPE_PASSWORD) { - ret.push('
  • 密码
  • '); - } else if (auth.auth_mode == AUTH_TYPE_SSHKEY) { - ret.push('
  • 私钥
  • '); - } else if (auth.auth_mode == AUTH_NONE) { - ret.push('
  • '); - } else { - ret.push('
  • 未知
  • '); - } - ret.push('
'); - } else { - ret.push('没有添加系统用户'); - } - ret.push('
'); - } - return ret.join(''); -// var ret = []; -// -// return ret.join(''); - }; - - render.host_id = function (row_id, fields) { - var ret = '' + fields.id + ':' + fields.host_port + ''; - ret += '' + fields.host_desc + ''; - - return ret; - }; - render.pro_type = function (row_id, fields) { - switch (fields.pro_type) { - case 1: - return 'RDP协议'; - case 2: - return 'SSH协议'; - default: - return '未知'; - } - }; - render.host_auth = function (row_id, fields) { - switch (fields.host_auth) { - case 0: - return '无认证'; - case 1: - return '用户名/密码'; - case 2: - return '用户名/SSH密钥'; - default: - return '未知'; - } - }; - render.host_lock = function (row_id, fields) { - switch (fields.host_lock) { - case 0: - return '允许访问'; - case 1: - return '禁止访问'; - default: - return '未知'; - } - }; - render.make_check_box = function (row_id, fields) { - return ''; - }; - // render.make_action_btn = function (row_id, fields) { - // var ret = []; - // ret.push('删除'); - // return ret.join(''); - // } - - }; -}; - -ywl.on_host_table_header_created = function (tbl) { - $('#host-select-all').click(function () { - var _is_selected = $(this).is(':checked'); - $(tbl.selector + ' tbody').find('[data-check-box]').prop('checked', _is_selected); - $(tbl.selector + ' tbody').find('[user-check-box]').prop('checked', _is_selected); - -// ################################################# - //ywl.update_add_to_batch_btn(); - }); -}; - -ywl.on_user_host_table_header_created = function (tbl) { - $('#user-host-select-all').click(function () { - var _is_selected = $(this).is(':checked'); - $(tbl.selector + ' tbody').find('[data-check-box]').prop('checked', _is_selected); - //ywl.update_add_to_batch_btn(); - }); -}; - -ywl.on_user_host_table_created = function (tbl) { - - tbl.on_cell_created = function (row_id, col_key, cell_obj) { - if (col_key == 'select_all') { - // 选择 - $('#user-host-select-' + row_id).click(function () { - var _all_checked = true; - var _objs = $(tbl.selector + ' tbody').find('[data-check-box]'); - $.each(_objs, function (i, _obj) { - if (!$(_obj).is(':checked')) { - _all_checked = false; - return false; - } - }); - - var select_all_dom = $('#user-host-select-all'); - if (_all_checked) { - select_all_dom.prop('checked', true); - } else { - select_all_dom.prop('checked', false); - } - - //ywl.update_add_to_batch_btn(); - }); - - } else if (col_key == 'host_id') { - // 为主机描述绑定点击事件 - var _link = $(cell_obj).find(" [ywl-host-desc]"); - _link.click(function () { - var row_data = tbl.get_row(row_id); - ywl.create_dlg_modify_host_desc(tbl, row_data.ywl_row_id, row_data.host_id, row_data.host_ip, row_data.host_desc).show(_link); - }); - } else if (col_key == 'action') { - var row_data = tbl.get_row(row_id); - $(cell_obj).find('[ywl-btn-delete]').click(function () { - var host_id = row_data.host_id; - var _fn_sure = function (cb_stack, cb_args) { - var host_list = []; - host_list.push(host_id); - ywl.ajax_post_json('/user/delete-host', {host_list: host_list, user_name: ywl.page_options.user_name}, - function (ret) { - tbl.remove_row(row_id); - ywl.notify_success('回收授权成功!'); - }, - function () { - ywl.notify_error('回收授权失败!'); - } - ); - }; - var cb_stack = CALLBACK_STACK.create(); - - ywl.dlg_confirm(cb_stack, - { - msg: '

此操作不可恢复!!

您确定要回收选中主机的授权吗?

', - fn_yes: _fn_sure - }); - }); - } else if (col_key == 'auth_list') { - - $(cell_obj).find('[data-remove]').click(function () { - var row_data = tbl.get_row(row_id); - var auth_id = parseInt($(this).attr('data-remove')); -// var host_id = row_data.host_id; - var _fn_sure = function (cb_stack, cb_args) { - var auth_id_list = []; - auth_id_list.push(auth_id); - ywl.ajax_post_json('/user/delete-host-user', {auth_id_list: auth_id_list, user_name: ywl.page_options.user_name}, - function (ret) { - if (ret.code == 0) { - var auth_list = []; - for (var i = 0; i < row_data.auth_list.length; i++) { - var auth = row_data.auth_list[i]; - if (auth.auth_id == auth_id) { - continue; - } else { - auth_list.push(auth); - } - } - console.log('auth_list', auth_list); - if (auth_list.length == 0) { - tbl.remove_row(row_id); - } else { - tbl.update_row(row_id, {auth_list: auth_list}); - } - ywl.notify_success('删除成功'); - } else { - ywl.notify_error('删除成功失败' + ret.code); - } - console.log('row_data', row_data); -// tbl.remove_row(row_id); - - }, - function () { - ywl.notify_error('删除成功失败'); - } - ); - }; - var cb_stack = CALLBACK_STACK.create(); - - ywl.dlg_confirm(cb_stack, - { - msg: '

此操作不可恢复!!

您确定要回收选中的用户授权吗?

', - fn_yes: _fn_sure - }); - }); - } - }; - - // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 - tbl.on_render_created = function (render) { - render.auth_list = function (row_id, fields) { - var auth_list = fields.auth_list; - var protocol = fields.protocol; - var ret = []; - - if (auth_list.length == 0) { - ret.push('尚未添加系统用户'); - return ret.join(''); - } - - for (var i = 0; i < auth_list.length; i++) { - var auth = auth_list[i]; - ret.push('
'); - switch (protocol) { - case PROTOCOL_TYPE_RDP: - - ret.push('
    '); - ret.push('
  • RDP
  • '); - ret.push('
  • ' + auth.user_name + '
  • '); - if (auth.auth_mode == AUTH_TYPE_PASSWORD) { - ret.push('
  • 密码
  • '); - } else if (auth.auth_mode == AUTH_TYPE_SSHKEY) { - ret.push('
  • 私钥
  • '); - } else if (auth.auth_mode == AUTH_NONE) { - ret.push('
  • '); - } else { - ret.push('
  • 未知
  • '); - } - ret.push('
  • 收回
  • '); - break; - case PROTOCOL_TYPE_SSH: - ret.push('
      '); - ret.push('
    • SSH
    • '); - ret.push('
    • ' + auth.user_name + '
    • '); - if (auth.auth_mode == AUTH_TYPE_PASSWORD) { - ret.push('
    • 密码
    • '); - } else if (auth.auth_mode == AUTH_TYPE_SSHKEY) { - ret.push('
    • 私钥
    • '); - } else if (auth.auth_mode == AUTH_NONE) { - ret.push('
    • '); - } else { - ret.push('
    • 未知
    • '); - } - ret.push('
    • 收回
    • '); - ret.push('
    '); - break; - case PROTOCOL_TYPE_TELNET: - ret.push('
      '); - ret.push('
    • TELENT
    • '); - ret.push('
    • ' + auth.user_name + '
    • '); - if (auth.auth_mode == AUTH_TYPE_PASSWORD) { - ret.push('
    • 密码
    • '); - } else if (auth.auth_mode == AUTH_TYPE_SSHKEY) { - ret.push('
    • 私钥
    • '); - } else if (auth.auth_mode == AUTH_NONE) { - ret.push('
    • '); - } else { - ret.push('
    • 未知
    • '); - } - ret.push('
    • 收回
    • '); - ret.push('
    '); - break; - default: - ret.push('此主机尚未添加系统用户'); - } - ret.push('
'); - } - - - return ret.join(''); - }; - render.host_id = function (row_id, fields) { - var ret = '' + fields.id + ':' + fields.host_port + ''; - ret += '' + fields.host_desc + ''; - - return ret; - }; - render.pro_type = function (row_id, fields) { - switch (fields.pro_type) { - case 1: - return 'RDP协议'; - case 2: - return 'SSH协议'; - default: - return '未知'; - } - }; - render.host_auth = function (row_id, fields) { - switch (fields.host_auth) { - case 0: - return '无认证'; - case 1: - return '用户名/密码'; - case 2: - return '用户名/SSH密钥'; - default: - return '未知'; - } - }; - render.host_lock = function (row_id, fields) { - switch (fields.host_lock) { - case 0: - return '允许访问'; - case 1: - return '禁止访问'; - default: - return '未知'; - } - }; - render.make_check_box = function (row_id, fields) { - return ''; - }; - render.make_action_btn = function (row_id, fields) { - var ret = []; - ret.push(' 收回授权'); - return ret.join(''); - } - - }; -}; - - -ywl.create_table_filter_user_name = function (tbl) { - var _tblf_st = {}; - - // 此表格绑定的DOM对象的ID,用于JQuery的选择器 - // 此过滤器绑定的表格控件 - _tblf_st._table_ctrl = tbl; - _tblf_st._table_ctrl.append_filter_ctrl(_tblf_st); - - // 过滤器内容 - _tblf_st.filter_name = 'account_name'; - _tblf_st.filter_default = ywl.page_options.user_name; - _tblf_st.filter_value = ywl.page_options.user_name; - - _tblf_st.get_filter = function () { - var _ret = {}; - _ret[_tblf_st.filter_name] = _tblf_st.filter_value; - return _ret; - }; - - _tblf_st.reset = function (cb_stack, cb_args) { - return; - //ywl.assist.set_cookie(cb_stack, {k: _tblf_st.filter_name, v: _tblf_st.filter_default}); - }; - - _tblf_st.init = function (cb_stack) { - return; - - }; - - return _tblf_st; -}; +"use strict"; +//var OS_TYPE_WINDOWS = 1; +//var OS_TYPE_LINUX = 2; +//var PROTOCOL_TYPE_RDP = 1; +//var PROTOCOL_TYPE_SSH = 2; +//var PROTOCOL_TYPE_TELNET = 3; +//var AUTH_TYPE_PASSWORD = 1; +//var AUTH_TYPE_SSHKEY = 2; +//var AUTH_NONE = 0; + +var g_cert_list = {}; +var g_group_list = {}; +var g_user_host_list = null; + +ywl.on_init = function (cb_stack, cb_args) { + ywl.create_host_table(cb_stack, cb_args); + ywl.create_user_host_table(cb_stack, cb_args); + cb_stack.exec(); +}; + + +ywl.create_host_table = function (cb_stack, cb_args) { + var dom_id = '#ywl_host_list'; + + //=================================== + // 创建页面控件对象 + //=================================== + // 表格数据 + var host_table_options = { + selector: dom_id + " [ywl-table='host-list']", + data_source: { + type: 'ajax-post', + url: '/host/list' + }, + //render: ywl.create_table_render(ywl.on_host_table_render_created),//ywl_TableRender.create(); + column_default: {sort: false, header_align: 'center', cell_align: 'center'}, + columns: [ + {title: '', key: 'select_all', sort: false, width: 24, render: 'make_check_box', fields: {id: 'host_id'}}, + {title: "远程协议", key: "auth_list", width: 280, header_align: 'left', cell_align: 'left', sort: false, render: 'auth_list', fields: {id: 'host_id', protocol: 'protocol', auth_list: 'auth_list'}}, + {title: "主机", key: "host_id", width: 240, sort: true, render: 'host_id', fields: {id: 'host_ip', host_desc: 'host_desc', host_port: 'host_port'}}, + {title: "分组", key: "group_name", width: 240}, + {title: "系统", key: "host_sys_type", width: 64, render: 'sys_type', fields: {sys_type: 'host_sys_type'}}, + {title: "状态", key: "host_lock", render: 'host_lock', fields: {host_lock: 'host_lock'}}, + ], + paging: {selector: dom_id + " [ywl-paging='host-list']", per_page: paging_normal}, + + // 可用的属性设置 + //have_header: true or false + + // 可用的回调函数 + on_created: ywl.on_host_table_created, + on_header_created: ywl.on_host_table_header_created + + // 可重载的函数(在on_created回调函数中重载) + // on_render_created + // on_header_created + // on_paging_created + // on_data_loaded + // on_row_rendered + // on_table_rendered + // on_cell_created + // on_begin_load + // on_after_load + + // 可用的函数 + // load_data + // cancel_load + // set_data + // add_row + // remove_row + // get_row + // update_row + // clear + // reset_filter + }; + + var host_table = ywl.create_table(host_table_options); + + // 主机分组过滤器 + g_cert_list = ywl.page_options.cert_list; + g_group_list = ywl.page_options.group_list; + ywl.create_table_filter_host_group(host_table, dom_id + " [ywl-filter='host-group']", g_group_list); + + ywl.create_table_filter_system_type(host_table, dom_id + " [ywl-filter='system-type']"); + // 搜索框 + ywl.create_table_filter_search_box(host_table, dom_id + " [ywl-filter='search']"); + + //====================================================== + // 事件绑定 + //====================================================== + $("#btn-add-host").click(function () { +// var _data_list = []; + var host_list = []; + var _host_id_objs = $(host_table.selector + " tbody tr td [data-check-box]"); + $.each(_host_id_objs, function (i, _host_id_objs) { + if ($(_host_id_objs).is(':checked')) { + var _row_data = host_table.get_row(_host_id_objs); + var data = {host_id: _row_data.host_id, row_id: _row_data.ywl_row_id}; + host_list.push(data) + } + }); + console.log('host_list', host_list); + var user_dict = {}; + var _user_objs = $(host_table.selector + " tbody tr td [user-check-box]"); + $.each(_user_objs, function (i, _user_objs) { + if ($(_user_objs).is(':checked')) { + var _row_data = host_table.get_row(_user_objs); + var host_auth_id = parseInt($(_user_objs).attr('user-check-box')); +// var data = {host_id: _row_data.host_id, row_id: _row_data.ywl_row_id}; + + if (typeof(user_dict[_row_data.ywl_row_id]) === "undefined") { + user_dict[_row_data.ywl_row_id] = []; + } + user_dict[_row_data.ywl_row_id].push(host_auth_id); + } + }); + console.log('user_dict', user_dict); + var length = 0; + var args = {}; + + for (var i = 0; i < host_list.length; i++) { + var host_id = host_list[i].host_id; + var row_id = host_list[i].row_id; + var host_auth_list = user_dict[row_id]; + if (typeof(host_auth_list) === "undefined") { + continue; + } + args[host_id] = host_auth_list; + length += 1; + } + console.log('args', args); + if (length === 0) { + ywl.notify_error('请先选择要批量授权的主机!'); + return; + } + + ywl.ajax_post_json('/user/alloc-host-user', {host_list: args, user_name: ywl.page_options.user_name}, + function (ret) { + if (ret.code === TPE_OK) { + g_user_host_list.reload(); + ywl.notify_success("主机授权操作成功!"); + } else { + ywl.notify_error("主机授权操作失败:" + ret.message); + } + }, + function () { + ywl.notify_error("网络故障,主机授权操作失败!"); + } + ); + }); + + // 将刷新按钮点击事件绑定到表格的重新加载函数上,这样,点击刷新就导致表格数据重新加载。 + $(dom_id + " [ywl-filter='reload']").click(host_table.reload); + + cb_stack + .add(host_table.load_data) + .add(host_table.init) + .exec(); +}; + +ywl.create_user_host_table = function (cb_stack, cb_args) { + var dom_id = '#ywl_user_host_list'; + //=================================== + // 创建页面控件对象 + //=================================== + // 表格数据 + var host_table_options = { + selector: dom_id + " [ywl-table='host-list']", + data_source: { + type: 'ajax-post', + url: '/user/host-list' + }, + //render: ywl.create_table_render(ywl.on_host_table_render_created),//ywl_TableRender.create(); + column_default: {sort: false, header_align: 'center', cell_align: 'center'}, + columns: [ + {title: '', key: 'select_all', sort: false, width: 24, render: 'make_check_box', fields: {id: 'host_id'}}, + {title: "远程协议", key: "auth_list", header_align: 'left', cell_align: 'left', render: 'auth_list', fields: {id: 'host_id', protocol: 'protocol', auth_list: 'auth_list'}}, + {title: "主机", key: "host_id", width: 240, sort: true, render: 'host_id', fields: {id: 'host_ip', host_desc: 'host_desc', host_port: 'host_port'}}, + {title: "分组", key: "group_name", width: 240}, + {title: "系统", key: "host_sys_type", width: 64, render: 'sys_type', fields: {sys_type: 'host_sys_type'}}, + {title: "状态", key: "host_lock", render: 'host_lock', fields: {host_lock: 'host_lock'}}, + {title: "操作", key: "action", width: 160, render: 'make_action_btn', fields: {id: 'host_id', host_lock: 'host_lock'}} + ], + paging: {selector: dom_id + " [ywl-paging='host-list']", per_page: paging_normal}, + + // 可用的属性设置 + //have_header: true or false + + // 可用的回调函数 + on_created: ywl.on_user_host_table_created, + on_header_created: ywl.on_user_host_table_header_created + + // 可重载的函数(在on_created回调函数中重载) + // on_render_created + // on_header_created + // on_paging_created + // on_data_loaded + // on_row_rendered + // on_table_rendered + // on_cell_created + // on_begin_load + // on_after_load + + // 可用的函数 + // load_data + // cancel_load + // set_data + // add_row + // remove_row + // get_row + // update_row + // clear + // reset_filter + }; + + var host_table = ywl.create_table(host_table_options); + g_user_host_list = host_table; + // 主机分组过滤器 + g_group_list = ywl.page_options.group_list; + ywl.create_table_filter_host_group(host_table, dom_id + " [ywl-filter='host-group']", g_group_list); + + ywl.create_table_filter_system_type(host_table, dom_id + " [ywl-filter='system-type']"); + // 搜索框 + ywl.create_table_filter_search_box(host_table, dom_id + " [ywl-filter='search']"); + + ywl.create_table_filter_user_name(host_table); + + //====================================================== + // 事件绑定 + //====================================================== + $("#btn-delete-host").click(function () { + var _data_list = []; + var _objs = $(host_table.selector + " tbody tr td [data-check-box]"); + $.each(_objs, function (i, _obj) { + if ($(_obj).is(':checked')) { + var _row_data = host_table.get_row(_obj); + var data = {host_id: _row_data.host_id, row_id: _row_data.ywl_row_id}; + _data_list.push(data); + } + }); + if (_data_list.length === 0) { + ywl.notify_error('请先选择要回收授权的主机!'); + return; + } + + var _fn_sure = function (cb_stack, cb_args) { + // var _data_list = cb_args._data_list || []; + var host_list = []; + for (var i = 0; i < _data_list.length; i++) { + var host_id = _data_list[i].host_id; + host_list.push(host_id); + } + host_list.push(host_id); + ywl.ajax_post_json('/user/delete-host', {host_list: host_list, user_name: ywl.page_options.user_name}, + function (ret) { + if (ret.code === TPE_OK) { + g_user_host_list.reload(); + ywl.notify_success('成功回收主机授权!'); + } else { + ywl.notify_error('回收主机授权失败:' + ret.message); + } + }, + function () { + ywl.notify_error('网络故障,回收主机授权失败!'); + } + ); + }; + + var cb_stack = CALLBACK_STACK.create(); + ywl.dlg_confirm(cb_stack, + { + msg: '

此操作不可恢复!!

您确定要回收选中主机的授权吗?

', + fn_yes: _fn_sure + // cb_args: _data_list + }); + + + }); + + // $("#user-host-titile").html('已经授权给用户' + ywl.page_options.user_name + "的主机列表"); + // 将刷新按钮点击事件绑定到表格的重新加载函数上,这样,点击刷新就导致表格数据重新加载。 + $(dom_id + " [ywl-filter='reload']").click(host_table.reload); + + cb_stack + .add(host_table.load_data) + .add(host_table.init) + .exec(); +}; + +// 扩展/重载表格的功能 +ywl.on_host_table_created = function (tbl) { + + tbl.on_cell_created = function (row_id, col_key, cell_obj) { + if (col_key === 'select_all') { + // 选择 + $('#host-select-' + row_id).click(function () { + console.log('host-sel'); + var _all_checked = true; + var _objs = $(tbl.selector + ' tbody').find('[data-check-box]'); + $.each(_objs, function (i, _obj) { + if (!$(_obj).is(':checked')) { + _all_checked = false; + return false; + } + }); + + var select_all_dom = $('#host-select-all'); + if (_all_checked) { + select_all_dom.prop('checked', true); + } else { + select_all_dom.prop('checked', false); + } + if ($(this).is(':checked')) { + $(this).parent().parent().parent().find("[user-check-box]").prop('checked', true); + } else { + $(this).parent().parent().parent().find("[user-check-box]").prop('checked', false); + } + //ywl.update_add_to_batch_btn(); + }); + + } else if (col_key === 'host_id') { + // 为主机描述绑定点击事件 + var _link = $(cell_obj).find(" [ywl-host-desc]"); + _link.click(function () { + var row_data = tbl.get_row(row_id); + ywl.create_dlg_modify_host_desc(tbl, row_data.ywl_row_id, row_data.host_id, row_data.host_ip, row_data.host_desc).show(_link); + }); + } else if (col_key === 'auth_list') { + $('#user-check-box-row-' + row_id).click(function () { + var _checked = false; + var _objs = $(this).parent().parent().parent().parent().find('[user-check-box]'); + $.each(_objs, function (i, _obj) { + if ($(_obj).is(':checked')) { + _checked = true; + return false; + } + }); + var select = $('#host-select-' + row_id); + + if (_checked) { + select.prop('checked', true); + } else { + select.prop('checked', false); + } + }); + } + }; + + // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 + tbl.on_render_created = function (render) { + + render.auth_list = function (row_id, fields) { + // TODO: 这里应该从fields里拿一个数组,是本主机上开放的所有远程访问协议和登录账号的组合 + var auth_list = fields.auth_list; + var protocol = fields.protocol; + var ret = []; + + if (auth_list.length === 0) { + ret.push('尚未添加系统用户'); + return ret.join(''); + } + + for (var i = 0; i < auth_list.length; i++) { + var auth = auth_list[i]; + ret.push('
'); + if (protocol === PROTOCOL_TYPE_RDP) { + + ret.push('
    '); + ret.push('
  • RDP
  • '); + ret.push('
  • ' + auth.user_name + '
  • '); + if (auth.auth_mode === AUTH_TYPE_PASSWORD) { + ret.push('
  • 密码
  • '); + } else if (auth.auth_mode === AUTH_TYPE_SSHKEY) { + ret.push('
  • 私钥
  • '); + } else if (auth.auth_mode === AUTH_NONE) { + ret.push('
  • '); + } else { + ret.push('
  • 未知
  • '); + } + ret.push('
'); + + } else if (protocol === PROTOCOL_TYPE_SSH) { + ret.push('
    '); + ret.push('
  • SSH
  • '); + ret.push('
  • ' + auth.user_name + '
  • '); + if (auth.auth_mode === AUTH_TYPE_PASSWORD) { + ret.push('
  • 密码
  • '); + } else if (auth.auth_mode === AUTH_TYPE_SSHKEY) { + ret.push('
  • 私钥
  • '); + } else if (auth.auth_mode === AUTH_NONE) { + ret.push('
  • '); + } else { + ret.push('
  • 未知
  • '); + } + ret.push('
'); + } else if (protocol === PROTOCOL_TYPE_TELNET) { + ret.push('
    '); + ret.push('
  • TELNET
  • '); + ret.push('
  • ' + auth.user_name + '
  • '); + if (auth.auth_mode === AUTH_TYPE_PASSWORD) { + ret.push('
  • 密码
  • '); + } else if (auth.auth_mode === AUTH_TYPE_SSHKEY) { + ret.push('
  • 私钥
  • '); + } else if (auth.auth_mode === AUTH_NONE) { + ret.push('
  • '); + } else { + ret.push('
  • 未知
  • '); + } + ret.push('
'); + } else { + ret.push('没有添加系统用户'); + } + ret.push('
'); + } + return ret.join(''); +// var ret = []; +// +// return ret.join(''); + }; + + render.host_id = function (row_id, fields) { + var ret = '' + fields.id + ':' + fields.host_port + ''; + ret += '' + fields.host_desc + ''; + + return ret; + }; + render.pro_type = function (row_id, fields) { + switch (fields.pro_type) { + case 1: + return 'RDP协议'; + case 2: + return 'SSH协议'; + default: + return '未知'; + } + }; + render.host_auth = function (row_id, fields) { + switch (fields.host_auth) { + case 0: + return '无认证'; + case 1: + return '用户名/密码'; + case 2: + return '用户名/SSH密钥'; + default: + return '未知'; + } + }; + render.host_lock = function (row_id, fields) { + switch (fields.host_lock) { + case 0: + return '允许访问'; + case 1: + return '禁止访问'; + default: + return '未知'; + } + }; + render.make_check_box = function (row_id, fields) { + return ''; + }; + // render.make_action_btn = function (row_id, fields) { + // var ret = []; + // ret.push('删除'); + // return ret.join(''); + // } + + }; +}; + +ywl.on_host_table_header_created = function (tbl) { + $('#host-select-all').click(function () { + var _is_selected = $(this).is(':checked'); + $(tbl.selector + ' tbody').find('[data-check-box]').prop('checked', _is_selected); + $(tbl.selector + ' tbody').find('[user-check-box]').prop('checked', _is_selected); + +// ################################################# + //ywl.update_add_to_batch_btn(); + }); +}; + +ywl.on_user_host_table_header_created = function (tbl) { + $('#user-host-select-all').click(function () { + var _is_selected = $(this).is(':checked'); + $(tbl.selector + ' tbody').find('[data-check-box]').prop('checked', _is_selected); + //ywl.update_add_to_batch_btn(); + }); +}; + +ywl.on_user_host_table_created = function (tbl) { + + tbl.on_cell_created = function (row_id, col_key, cell_obj) { + if (col_key === 'select_all') { + // 选择 + $('#user-host-select-' + row_id).click(function () { + var _all_checked = true; + var _objs = $(tbl.selector + ' tbody').find('[data-check-box]'); + $.each(_objs, function (i, _obj) { + if (!$(_obj).is(':checked')) { + _all_checked = false; + return false; + } + }); + + var select_all_dom = $('#user-host-select-all'); + if (_all_checked) { + select_all_dom.prop('checked', true); + } else { + select_all_dom.prop('checked', false); + } + + //ywl.update_add_to_batch_btn(); + }); + + } else if (col_key === 'host_id') { + // 为主机描述绑定点击事件 + var _link = $(cell_obj).find(" [ywl-host-desc]"); + _link.click(function () { + var row_data = tbl.get_row(row_id); + ywl.create_dlg_modify_host_desc(tbl, row_data.ywl_row_id, row_data.host_id, row_data.host_ip, row_data.host_desc).show(_link); + }); + } else if (col_key === 'action') { + var row_data = tbl.get_row(row_id); + $(cell_obj).find('[ywl-btn-delete]').click(function () { + var host_id = row_data.host_id; + var _fn_sure = function (cb_stack, cb_args) { + var host_list = []; + host_list.push(host_id); + ywl.ajax_post_json('/user/delete-host', {host_list: host_list, user_name: ywl.page_options.user_name}, + function (ret) { + if (ret.code === TPE_OK) { + tbl.remove_row(row_id); + ywl.notify_success('回收授权成功!'); + } else { + ywl.notify_error('回收授权失败:' + ret.message); + } + }, + function () { + ywl.notify_error('网络故障,回收授权失败!'); + } + ); + }; + var cb_stack = CALLBACK_STACK.create(); + + ywl.dlg_confirm(cb_stack, + { + msg: '

此操作不可恢复!!

您确定要回收选中主机的授权吗?

', + fn_yes: _fn_sure + }); + }); + } else if (col_key === 'auth_list') { + + $(cell_obj).find('[data-remove]').click(function () { + var row_data = tbl.get_row(row_id); + var auth_id = parseInt($(this).attr('data-remove')); + + var _fn_sure = function (cb_stack, cb_args) { + var auth_id_list = []; + auth_id_list.push(auth_id); + ywl.ajax_post_json('/user/delete-host-user', {auth_id_list: auth_id_list, user_name: ywl.page_options.user_name}, + function (ret) { + if (ret.code === TPE_OK) { + var auth_list = []; + for (var i = 0; i < row_data.auth_list.length; i++) { + var auth = row_data.auth_list[i]; + if (auth.auth_id !== auth_id) { + auth_list.push(auth); + } + } + + if (auth_list.length === 0) { + tbl.remove_row(row_id); + } else { + tbl.update_row(row_id, {auth_list: auth_list}); + } + ywl.notify_success('回收授权成功!'); + } else { + ywl.notify_error('回收授权失败:' + ret.message); + } + }, + function () { + ywl.notify_error('网络故障,回收授权失败!'); + } + ); + }; + var cb_stack = CALLBACK_STACK.create(); + + ywl.dlg_confirm(cb_stack, + { + msg: '

此操作不可恢复!!

您确定要回收选中的用户授权吗?

', + fn_yes: _fn_sure + }); + }); + } + }; + + // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 + tbl.on_render_created = function (render) { + render.auth_list = function (row_id, fields) { + var auth_list = fields.auth_list; + var protocol = fields.protocol; + var ret = []; + + if (auth_list.length === 0) { + ret.push('尚未添加系统用户'); + return ret.join(''); + } + + for (var i = 0; i < auth_list.length; i++) { + var auth = auth_list[i]; + ret.push('
'); + switch (protocol) { + case PROTOCOL_TYPE_RDP: + + ret.push('
    '); + ret.push('
  • RDP
  • '); + ret.push('
  • ' + auth.user_name + '
  • '); + if (auth.auth_mode === AUTH_TYPE_PASSWORD) { + ret.push('
  • 密码
  • '); + } else if (auth.auth_mode === AUTH_TYPE_SSHKEY) { + ret.push('
  • 私钥
  • '); + } else if (auth.auth_mode === AUTH_NONE) { + ret.push('
  • '); + } else { + ret.push('
  • 未知
  • '); + } + ret.push('
  • 收回
  • '); + break; + case PROTOCOL_TYPE_SSH: + ret.push('
      '); + ret.push('
    • SSH
    • '); + ret.push('
    • ' + auth.user_name + '
    • '); + if (auth.auth_mode === AUTH_TYPE_PASSWORD) { + ret.push('
    • 密码
    • '); + } else if (auth.auth_mode === AUTH_TYPE_SSHKEY) { + ret.push('
    • 私钥
    • '); + } else if (auth.auth_mode === AUTH_NONE) { + ret.push('
    • '); + } else { + ret.push('
    • 未知
    • '); + } + ret.push('
    • 收回
    • '); + ret.push('
    '); + break; + case PROTOCOL_TYPE_TELNET: + ret.push('
      '); + ret.push('
    • TELENT
    • '); + ret.push('
    • ' + auth.user_name + '
    • '); + if (auth.auth_mode === AUTH_TYPE_PASSWORD) { + ret.push('
    • 密码
    • '); + } else if (auth.auth_mode === AUTH_TYPE_SSHKEY) { + ret.push('
    • 私钥
    • '); + } else if (auth.auth_mode === AUTH_NONE) { + ret.push('
    • '); + } else { + ret.push('
    • 未知
    • '); + } + ret.push('
    • 收回
    • '); + ret.push('
    '); + break; + default: + ret.push('此主机尚未添加系统用户'); + } + ret.push('
'); + } + + + return ret.join(''); + }; + render.host_id = function (row_id, fields) { + var ret = '' + fields.id + ':' + fields.host_port + ''; + ret += '' + fields.host_desc + ''; + + return ret; + }; + render.pro_type = function (row_id, fields) { + switch (fields.pro_type) { + case 1: + return 'RDP协议'; + case 2: + return 'SSH协议'; + default: + return '未知'; + } + }; + render.host_auth = function (row_id, fields) { + switch (fields.host_auth) { + case 0: + return '无认证'; + case 1: + return '用户名/密码'; + case 2: + return '用户名/SSH密钥'; + default: + return '未知'; + } + }; + render.host_lock = function (row_id, fields) { + switch (fields.host_lock) { + case 0: + return '允许访问'; + case 1: + return '禁止访问'; + default: + return '未知'; + } + }; + render.make_check_box = function (row_id, fields) { + return ''; + }; + render.make_action_btn = function (row_id, fields) { + var ret = []; + ret.push(' 收回授权'); + return ret.join(''); + } + + }; +}; + + +ywl.create_table_filter_user_name = function (tbl) { + var _tblf_st = {}; + + // 此表格绑定的DOM对象的ID,用于JQuery的选择器 + // 此过滤器绑定的表格控件 + _tblf_st._table_ctrl = tbl; + _tblf_st._table_ctrl.append_filter_ctrl(_tblf_st); + + // 过滤器内容 + _tblf_st.filter_name = 'account_name'; + _tblf_st.filter_default = ywl.page_options.user_name; + _tblf_st.filter_value = ywl.page_options.user_name; + + _tblf_st.get_filter = function () { + var _ret = {}; + _ret[_tblf_st.filter_name] = _tblf_st.filter_value; + return _ret; + }; + + _tblf_st.reset = function (cb_stack, cb_args) { + return; + //ywl.assist.set_cookie(cb_stack, {k: _tblf_st.filter_name, v: _tblf_st.filter_default}); + }; + + _tblf_st.init = function (cb_stack) { + return; + }; + + return _tblf_st; +}; diff --git a/server/www/teleport/static/js/ui/cert.js b/server/www/teleport/static/js/ui/cert.js index f095f84..4a252c0 100644 --- a/server/www/teleport/static/js/ui/cert.js +++ b/server/www/teleport/static/js/ui/cert.js @@ -1,302 +1,248 @@ -"use strict"; - -var g_cert_dlg_info = null; - -ywl.on_init = function (cb_stack, cb_args) { - var dom_id = '#ywl_cert_list'; - - //=================================== - // 创建页面控件对象 - //=================================== - // 表格数据 - var host_table_options = { - selector: dom_id + " [ywl-table='cert-list']", - data_source: { - type: 'ajax-post', - url: '/cert/list' - }, - column_default: {sort: false, header_align: 'center', cell_align: 'center'}, - columns: [ - {title: "编号", key: "cert_id", width: 80}, - {title: "密钥名称", key: "cert_name", width: 240, header_align: 'left', cell_align: 'left'}, - {title: "公钥", key: "cert_pub", render: 'cert_pub', header_align: 'left', cell_align: 'left'}, - //{title: "私钥", key: "cert_pri"}, - {title: "操作", key: "action", width: 180, render: 'make_action_btn', fields: {id: 'cert_id'}} - ], - paging: {selector: dom_id + " [ywl-paging='cert-list']", per_page: paging_normal}, - - // 可用的属性设置 - //have_header: true or false - - // 可用的回调函数 - on_created: ywl.on_host_table_created, - on_header_created: ywl.on_host_table_header_created - - // 可重载的函数(在on_created回调函数中重载) - // on_render_created - // on_header_created - // on_paging_created - // on_data_loaded - // on_row_rendered - // on_table_rendered - // on_cell_created - // on_begin_load - // on_after_load - - // 可用的函数 - // load_data - // cancel_load - // set_data - // add_row - // remove_row - // get_row - // update_row - // clear - // reset_filter - }; - - var host_table = ywl.create_table(host_table_options); - g_cert_dlg_info = ywl.create_cert_info_dlg(host_table); - $(dom_id + " [ywl-filter='reload']").click(host_table.reload); - $("#btn-add-cert").click(function () { - g_cert_dlg_info.create_show(); - }); - cb_stack - .add(host_table.load_data) - .add(host_table.init) - .exec(); -}; - -// 扩展/重载表格的功能 -ywl.on_host_table_created = function (tbl) { - - tbl.on_cell_created = function (row_id, col_key, cell_obj) { - if (col_key === 'action') { - var row_data = tbl.get_row(row_id); - //console.log('row_data', row_data); - $(cell_obj).find('[ywl-btn-edit]').click(function () { - g_cert_dlg_info.update_show(row_data.cert_name, row_data.cert_id, row_data.cert_pub, row_data.cert_pri, row_id); - }); - $(cell_obj).find('[ywl-btn-delete]').click(function () { - var cert_id = row_data.cert_id; - var _fn_sure = function (cb_stack, cb_args) { - ywl.ajax_post_json('/host/delete-cert', {cert_id: cert_id}, - function (ret) { - if (ret.code === TPE_OK) { - tbl.remove_row(row_id); - ywl.notify_success('删除成功!'); - } else if (ret.code === -2) { - ywl.notify_error('不能删除,有主机使用了此密钥!'); - } else { - ywl.notify_error('删除失败!错误代码:'+ret.code); - } - - }, - function () { - ywl.notify_error('网络通讯失败!'); - } - ); - }; - var cb_stack = CALLBACK_STACK.create(); - - ywl.dlg_confirm(cb_stack, - { - msg: '

删除操作不可恢复!!

您确定要删除此密钥吗?

', - fn_yes: _fn_sure - }); - }); - - } - }; - - // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 - tbl.on_render_created = function (render) { - render.make_action_btn = function (row_id, fields) { - var ret = []; - ret.push('编辑 '); - ret.push('删除'); - return ret.join(''); - }; - - render.cert_pub = function (row_id, fields) { - return ''; - }; - }; -}; - -ywl.on_host_table_header_created = function (tbl) { -}; - -ywl.create_cert_info_dlg = function (tbl) { - var cert_info_dlg = {}; - cert_info_dlg.dom_id = "#dialog_cert_info"; - cert_info_dlg.update = 1; - cert_info_dlg.tbl = tbl; - cert_info_dlg.cert_name = ''; - cert_info_dlg.cert_id = 0; - cert_info_dlg.cert_pub = 0; - cert_info_dlg.cert_pri = 0; - cert_info_dlg.row_id = 0; - cert_info_dlg.title = ''; - - cert_info_dlg.update_show = function (cert_name, cert_id, cert_pub, cert_pri, row_id) { - cert_info_dlg.update = 1; - cert_info_dlg.title = '编辑SSH密钥'; - cert_info_dlg.init(cert_name, cert_id, cert_pub, cert_pri, row_id); - var msg = '如果您只是希望修改密钥名称,那么本区域可以忽略不填写!'; - $(cert_info_dlg.dom_id + ' #dlg-cert-pub').attr('placeholder', msg); - $(cert_info_dlg.dom_id + ' #dlg-cert-pri').attr('placeholder', msg); - $(cert_info_dlg.dom_id).modal(); - }; - cert_info_dlg.create_show = function () { - cert_info_dlg.update = 0; - cert_info_dlg.title = '添加SSH密钥'; - cert_info_dlg.init('', 0, '', '', 0); - $(cert_info_dlg.dom_id + ' #dlg-cert-pub').attr('placeholder', ''); - $(cert_info_dlg.dom_id + ' #dlg-cert-pri').attr('placeholder', ''); - $(cert_info_dlg.dom_id).modal(); - }; - cert_info_dlg.hide = function () { - $(cert_info_dlg.dom_id).modal('hide'); - }; - - cert_info_dlg.init = function (cert_name, cert_id, cert_pub, cert_pri, row_id) { - cert_info_dlg.cert_name = cert_name; - cert_info_dlg.cert_id = cert_id; - cert_info_dlg.cert_pub = cert_pub; - cert_info_dlg.cert_pri = '';//cert_pri; - cert_info_dlg.row_id = row_id; - cert_info_dlg.init_dlg(); - }; - - cert_info_dlg.init_dlg = function () { - $(cert_info_dlg.dom_id + ' #title').html(cert_info_dlg.title); - $(cert_info_dlg.dom_id + ' #dlg-cert-name').val(cert_info_dlg.cert_name); - $(cert_info_dlg.dom_id + ' #dlg-cert-pub').val(cert_info_dlg.cert_pub); -// $(cert_info_dlg.dom_id + ' #dlg-cert-pri').val(cert_info_dlg.cert_pri); - $(cert_info_dlg.dom_id + ' #dlg-cert-pri').val(''); - }; - - cert_info_dlg.check_args = function () { - cert_info_dlg.cert_name = $(cert_info_dlg.dom_id + ' #dlg-cert-name').val(); - cert_info_dlg.cert_pub = $(cert_info_dlg.dom_id + ' #dlg-cert-pub').val(); - cert_info_dlg.cert_pri = $(cert_info_dlg.dom_id + ' #dlg-cert-pri').val(); - if (cert_info_dlg.cert_name === '') { - ywl.notify_error('必须为密钥设置一个名称!'); - return false; - } - if (cert_info_dlg.cert_pub === '') { - ywl.notify_error('必须填写公钥内容!'); - return false; - } - if (cert_info_dlg.update === 0 && cert_info_dlg.cert_pri.length === 0) { - ywl.notify_error('添加密钥时,必须填写私钥内容!'); - return false; - } - return true; - }; - - cert_info_dlg.post = function () { - if (cert_info_dlg.update === 1) { - ywl.ajax_post_json('/host/update-cert', {cert_id: cert_info_dlg.cert_id, cert_name: cert_info_dlg.cert_name, cert_pub: cert_info_dlg.cert_pub, cert_pri: cert_info_dlg.cert_pri}, - function (ret) { - var update_args = {cert_id: cert_info_dlg.cert_id, cert_name: cert_info_dlg.cert_name}; - cert_info_dlg.tbl.update_row(cert_info_dlg.row_id, update_args); - ywl.notify_success('密钥更新成功!'); - cert_info_dlg.hide(); - }, - function () { - ywl.notify_error('密钥更新失败!'); - } - ); - } else { - ywl.ajax_post_json('/host/add-cert', {cert_name: cert_info_dlg.cert_name, cert_pub: cert_info_dlg.cert_pub, cert_pri: cert_info_dlg.cert_pri}, - function (ret) { - if(ret.code === TPE_OK){ - cert_info_dlg.tbl.reload(); - ywl.notify_success('密钥添加成功!'); - cert_info_dlg.hide(); - }else if(ret.code === TPE_NO_CORE_SERVER){ - ywl.notify_error('错误,没有启动核心服务!'); - }else{ - ywl.notify_error('密钥添加失败!code:' + ret.code); - } - - }, - function (ret) { - ywl.notify_error('密钥添加失败!'); - } - ); - } - return true; - }; - - $(cert_info_dlg.dom_id + " #btn-save").click(function () { - if (!cert_info_dlg.check_args()) { - return; - } - - cert_info_dlg.post(); -// if (cert_info_dlg.update == 0) { -// cert_info_dlg.on_get_enc_pri(); -// } else { -// if (cert_info_dlg.cert_pri.length > 0) -// cert_info_dlg.on_get_enc_pri(); -// else -// cert_info_dlg.post(); -// } - }); -// -// cert_info_dlg.on_get_enc_pri = function () { -// ywl.ajax_post_json('/auth/get-enc-data', {pwd: cert_info_dlg.cert_pri}, -// function (ret) { -// var data = ret.data; -// if (data.code == 0) { -//// var temp_password = data.data; -// -// cert_info_dlg.cert_pri = data.data; -// -// cert_info_dlg.post(); -// -// -//// $("#dlg-cert-pri").val(temp_password); -//// ywl.notify_success('成功得到私钥加密字符串'); -// } else { -// ywl.notify_error('获取加密私钥失败! [' + data.code + ']'); -// } -// -// }, -// function () { -// ywl.notify_error('获取加密私钥失败'); -// } -// ); -// -// }; - -// $(cert_info_dlg.dom_id + " #btn-get-enc-data").click(function () { -// var temp_dlg_cer__pri = $("#temp-dlg-cert-pri").val(); -// if (temp_dlg_cer__pri == '') { -// ywl.notify_error('私钥不能为空!'); -// return; -// } -// ywl.ajax_post_json('/auth/get-enc-data', {pwd: temp_dlg_cer__pri}, -// function (ret) { -// var data = ret.data; -// if (data.code == 0) { -// var temp_password = data.data; -// $("#dlg-cert-pri").val(temp_password); -// ywl.notify_success('成功得到私钥加密字符串'); -// } else { -// ywl.notify_error('获取加密私钥失败 ' + data.code); -// } -// -// }, -// function () { -// ywl.notify_error('获取加密私钥失败'); -// } -// ); -// }); - - return cert_info_dlg -}; - +"use strict"; + +var g_cert_dlg_info = null; + +ywl.on_init = function (cb_stack, cb_args) { + var dom_id = '#ywl_cert_list'; + + //=================================== + // 创建页面控件对象 + //=================================== + // 表格数据 + var host_table_options = { + selector: dom_id + " [ywl-table='cert-list']", + data_source: { + type: 'ajax-post', + url: '/cert/list' + }, + column_default: {sort: false, header_align: 'center', cell_align: 'center'}, + columns: [ + {title: "编号", key: "cert_id", width: 80}, + {title: "密钥名称", key: "cert_name", width: 240, header_align: 'left', cell_align: 'left'}, + {title: "公钥", key: "cert_pub", render: 'cert_pub', header_align: 'left', cell_align: 'left'}, + //{title: "私钥", key: "cert_pri"}, + {title: "操作", key: "action", width: 180, render: 'make_action_btn', fields: {id: 'cert_id'}} + ], + paging: {selector: dom_id + " [ywl-paging='cert-list']", per_page: paging_normal}, + + // 可用的属性设置 + //have_header: true or false + + // 可用的回调函数 + on_created: ywl.on_host_table_created, + on_header_created: ywl.on_host_table_header_created + + // 可重载的函数(在on_created回调函数中重载) + // on_render_created + // on_header_created + // on_paging_created + // on_data_loaded + // on_row_rendered + // on_table_rendered + // on_cell_created + // on_begin_load + // on_after_load + + // 可用的函数 + // load_data + // cancel_load + // set_data + // add_row + // remove_row + // get_row + // update_row + // clear + // reset_filter + }; + + var host_table = ywl.create_table(host_table_options); + g_cert_dlg_info = ywl.create_cert_info_dlg(host_table); + $(dom_id + " [ywl-filter='reload']").click(host_table.reload); + $("#btn-add-cert").click(function () { + g_cert_dlg_info.create_show(); + }); + cb_stack + .add(host_table.load_data) + .add(host_table.init) + .exec(); +}; + +// 扩展/重载表格的功能 +ywl.on_host_table_created = function (tbl) { + + tbl.on_cell_created = function (row_id, col_key, cell_obj) { + if (col_key === 'action') { + var row_data = tbl.get_row(row_id); + //console.log('row_data', row_data); + $(cell_obj).find('[ywl-btn-edit]').click(function () { + g_cert_dlg_info.update_show(row_data.cert_name, row_data.cert_id, row_data.cert_pub, row_data.cert_pri, row_id); + }); + $(cell_obj).find('[ywl-btn-delete]').click(function () { + var cert_id = row_data.cert_id; + var _fn_sure = function (cb_stack, cb_args) { + ywl.ajax_post_json('/host/delete-cert', {cert_id: cert_id}, + function (ret) { + if (ret.code === TPE_OK) { + tbl.remove_row(row_id); + ywl.notify_success('密钥删除成功!'); + } else if (ret.code === -2) { + ywl.notify_error('不能删除,有主机使用了此密钥!'); + } else { + ywl.notify_error('密钥删除失败:' + ret.message); + } + + }, + function () { + ywl.notify_error('网络故障,密钥删除失败!'); + } + ); + }; + var cb_stack = CALLBACK_STACK.create(); + + ywl.dlg_confirm(cb_stack, + { + msg: '

删除操作不可恢复!!

您确定要删除此密钥吗?

', + fn_yes: _fn_sure + }); + }); + + } + }; + + // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 + tbl.on_render_created = function (render) { + render.make_action_btn = function (row_id, fields) { + var ret = []; + ret.push('编辑 '); + ret.push('删除'); + return ret.join(''); + }; + + render.cert_pub = function (row_id, fields) { + return ''; + }; + }; +}; + +ywl.on_host_table_header_created = function (tbl) { +}; + +ywl.create_cert_info_dlg = function (tbl) { + var cert_info_dlg = {}; + cert_info_dlg.dom_id = "#dialog_cert_info"; + cert_info_dlg.update = 1; + cert_info_dlg.tbl = tbl; + cert_info_dlg.cert_name = ''; + cert_info_dlg.cert_id = 0; + cert_info_dlg.cert_pub = 0; + cert_info_dlg.cert_pri = 0; + cert_info_dlg.row_id = 0; + cert_info_dlg.title = ''; + + cert_info_dlg.update_show = function (cert_name, cert_id, cert_pub, cert_pri, row_id) { + cert_info_dlg.update = 1; + cert_info_dlg.title = '编辑SSH密钥'; + cert_info_dlg.init(cert_name, cert_id, cert_pub, cert_pri, row_id); + var msg = '如果您只是希望修改密钥名称,那么本区域可以忽略不填写!'; + $(cert_info_dlg.dom_id + ' #dlg-cert-pub').attr('placeholder', msg); + $(cert_info_dlg.dom_id + ' #dlg-cert-pri').attr('placeholder', msg); + $(cert_info_dlg.dom_id).modal(); + }; + cert_info_dlg.create_show = function () { + cert_info_dlg.update = 0; + cert_info_dlg.title = '添加SSH密钥'; + cert_info_dlg.init('', 0, '', '', 0); + $(cert_info_dlg.dom_id + ' #dlg-cert-pub').attr('placeholder', ''); + $(cert_info_dlg.dom_id + ' #dlg-cert-pri').attr('placeholder', ''); + $(cert_info_dlg.dom_id).modal(); + }; + cert_info_dlg.hide = function () { + $(cert_info_dlg.dom_id).modal('hide'); + }; + + cert_info_dlg.init = function (cert_name, cert_id, cert_pub, cert_pri, row_id) { + cert_info_dlg.cert_name = cert_name; + cert_info_dlg.cert_id = cert_id; + cert_info_dlg.cert_pub = cert_pub; + cert_info_dlg.cert_pri = '';//cert_pri; + cert_info_dlg.row_id = row_id; + cert_info_dlg.init_dlg(); + }; + + cert_info_dlg.init_dlg = function () { + $(cert_info_dlg.dom_id + ' #title').html(cert_info_dlg.title); + $(cert_info_dlg.dom_id + ' #dlg-cert-name').val(cert_info_dlg.cert_name); + $(cert_info_dlg.dom_id + ' #dlg-cert-pub').val(cert_info_dlg.cert_pub); +// $(cert_info_dlg.dom_id + ' #dlg-cert-pri').val(cert_info_dlg.cert_pri); + $(cert_info_dlg.dom_id + ' #dlg-cert-pri').val(''); + }; + + cert_info_dlg.check_args = function () { + cert_info_dlg.cert_name = $(cert_info_dlg.dom_id + ' #dlg-cert-name').val(); + cert_info_dlg.cert_pub = $(cert_info_dlg.dom_id + ' #dlg-cert-pub').val(); + cert_info_dlg.cert_pri = $(cert_info_dlg.dom_id + ' #dlg-cert-pri').val(); + if (cert_info_dlg.cert_name === '') { + ywl.notify_error('必须为密钥设置一个名称!'); + return false; + } + if (cert_info_dlg.cert_pub === '') { + ywl.notify_error('必须填写公钥内容!'); + return false; + } + if (cert_info_dlg.update === 0 && cert_info_dlg.cert_pri.length === 0) { + ywl.notify_error('添加密钥时,必须填写私钥内容!'); + return false; + } + return true; + }; + + cert_info_dlg.post = function () { + if (cert_info_dlg.update === 1) { + ywl.ajax_post_json('/host/update-cert', {cert_id: cert_info_dlg.cert_id, cert_name: cert_info_dlg.cert_name, cert_pub: cert_info_dlg.cert_pub, cert_pri: cert_info_dlg.cert_pri}, + function (ret) { + if (ret.code === TPE_OK) { + var update_args = {cert_id: cert_info_dlg.cert_id, cert_name: cert_info_dlg.cert_name}; + cert_info_dlg.tbl.update_row(cert_info_dlg.row_id, update_args); + ywl.notify_success('密钥更新成功!'); + cert_info_dlg.hide(); + } else { + ywl.notify_error('密钥更新失败:' + ret.message); + } + }, + function () { + ywl.notify_error('网络故障,密钥更新失败!'); + } + ); + } else { + ywl.ajax_post_json('/host/add-cert', {cert_name: cert_info_dlg.cert_name, cert_pub: cert_info_dlg.cert_pub, cert_pri: cert_info_dlg.cert_pri}, + function (ret) { + if (ret.code === TPE_OK) { + cert_info_dlg.tbl.reload(); + ywl.notify_success('密钥添加成功!'); + cert_info_dlg.hide(); + } else if (ret.code === TPE_NO_CORE_SERVER) { + ywl.notify_error('错误,没有启动核心服务!'); + } else { + ywl.notify_error('密钥添加失败:' + ret.message); + } + + }, + function (ret) { + ywl.notify_error('网络故障,密钥添加失败!'); + } + ); + } + return true; + }; + + $(cert_info_dlg.dom_id + " #btn-save").click(function () { + if (!cert_info_dlg.check_args()) { + return; + } + + cert_info_dlg.post(); + }); + + return cert_info_dlg +}; + diff --git a/server/www/teleport/static/js/ui/common.js b/server/www/teleport/static/js/ui/common.js index d433627..995c965 100644 --- a/server/www/teleport/static/js/ui/common.js +++ b/server/www/teleport/static/js/ui/common.js @@ -1,413 +1,420 @@ -/*! ywl v1.0.1, (c)2015 eomsoft.net */ -"use strict"; - - -ywl.notify_error = function (message_, title_) { - var _title = title_ || ''; - $.gritter.add({ - //sticky:true, - class_name: 'gritter-error', - time: 10000, - title: ' 错误:' + _title, - text: message_ - }); -}; - -ywl.notify_success = function (message_, title_) { - var _title = title_ || null; - if (_title !== null) - _title = ' ' + _title; - $.gritter.add({ - //sticky:true, - class_name: 'gritter-success', - time: 10000, - title: _title, - text: message_ - }); -}; - - -function get_host_group_by_id(gid) { - var _all = {id: 0, group_name: '全部'}; - return _all; -} - -function get_user_info_by_id(user_id) { - var _all = {id: 0, nickname: '未知'}; - return _all; -} - -function get_event_code_by_id(e_id) { - var _all = {id: 0, e_desc: '未知'}; - var ret = ywl.assist.get_cache_by_id(CACHE_TYPE_EVENT_CODE, e_id); - - if (ret == null) - return _all; - else - return ret; -} -function get_current_system_group() { - return get_system_group_by_id(0); -} - -function get_system_group_by_id(gid) { - var _all = {id: 0, name: '全部'}; - var ret = null; - - $.each(system_group, function (i, group) { - if (group.id == gid) { - ret = group; - return false; - } - }); - - if (ret == null) - return _all; - else - return ret; -} - - -//function get_command_name_by_id(cmd_id) { -// return ywl.assist.get_cache_by_id(CACHE_TYPE_COMMAND, cmd_id); -//} - -//function notify_error(message_, title_) { -// var _title = title_ || ''; -// $.gritter.add({ -// sticky: true, -// class_name: 'gritter-error', -// time: 10000, -// title: ' 错误:' + _title, -// text: message_ -// }); -//} -//function notify_success(message_, title_) { -// var _title = title_ || null; -// if (_title !== null) -// _title = ' ' + _title; -// $.gritter.add({ -// //sticky:true, -// class_name: 'gritter-success', -// time: 10000, -// title: _title, -// text: message_ -// }); -//} - -// 切换一个dom节点显示与否 -ywl.toggle_display = function (selector) { - var obj = $(selector); - if (typeof(obj) == 'undefined') - return; - - if (obj.is(':hidden')) { - obj.show(); - } else { - obj.hide(); - } -}; - -//====================================================== -// Dialog-box for confirm operation. -//====================================================== -ywl.dlg_confirm = function (cb_stack, cb_args) { - var self = {}; - self._cb_stack = cb_stack; - self._title = cb_args.title || '操作确认:'; - self._msg = cb_args.msg || ''; - self._btn_yes = cb_args.btn_yes || '确定'; - self._btn_no = cb_args.btn_no || '取消'; - self._fn_yes = cb_args.fn_yes || null; - self._fn_no = cb_args.fn_no || null; - self._dlg_id = _.uniqueId('dlg-confirm-'); - self._cb_args = cb_args.cb_args || {}; - - self._make_message_box = function () { - var _html = [ - ''].join('\n'); - $('body').append($(_html)); - }; - - self._destroy = function () { - $('#' + self._dlg_id).remove(); - }; - - self._on_btn_yes = function () { - $('#' + self._dlg_id).modal('hide'); - if (_.isFunction(self._fn_yes)) { - self._cb_stack - .add(self._fn_yes, self._cb_args) - .exec(); - } - }; - self._on_btn_no = function () { - $('#' + self._dlg_id).modal('hide'); - if (_.isFunction(self._fn_no)) { - self._cb_stack - .add(self._fn_no, self._cb_args) - .exec(); - } - }; - - self.show = function () { - $('#dlg-btn-' + self._dlg_id + "-yes").click(self._on_btn_yes); - $('#dlg-btn-' + self._dlg_id + "-no").click(self._on_btn_no); - $('#' + self._dlg_id) - .modal() - //.on('hide.bs.modal', self._on_cancel) - .on('hidden.bs.modal', self._destroy); - }; - - self._make_message_box(); - self.show(); -}; - - -//====================================================== -// Dialog-box for modify host description -//====================================================== -ywl.create_dlg_modify_host_desc = function (tbl, row_id, host_id, host_ip,host_desc) { - var self = {}; - - self.dlg_id = _.uniqueId('dlg-modify-host-desc-'); - self._table_ctrl = tbl; - self.host_id = host_id; - self.host_ip = host_ip; - self.host_desc = host_desc; - - self.show = function (pos_obj) { - self._make_dialog_box(); - $('body') - .addClass('modal-open') - .append($('')) - .keydown(function (event) { - if (event.which == 27) { - self._destroy(); - } - }); - $('.modal-backdrop').click(function () { - self._destroy(); - }); - - var t_obj = $('#' + self.dlg_id + ' .popover'); - t_obj.css({ - 'top': pos_obj.offset().top + pos_obj.height() - 5, - 'left': pos_obj.offset().left - }).show(); - - $('#' + self.dlg_id + " [ywl-input='desc']").focus(); - }; - - self._save = function () { - var dlg_dom_id = "[ywl-dlg='modify-host-desc']"; - - var val = $(dlg_dom_id + " input[ywl-input='desc']").val(); - if (val == self.host_desc) { - self._destroy(); - return; - } - - ywl.ajax_post_json('/host/update', {host_id: host_id, kv: {host_desc: val}}, - function (ret) { - self._table_ctrl.update_row(row_id, {host_desc: val}); - ywl.notify_success('主机 ' + self.host_ip + ' 的描述已保存!'); - self._destroy(); - }, - function () { - ywl.notify_error('主机 ' + self.host_ip + ' 的描述修改未能成功保存!', ''); - self._destroy(); - } - ); - - }; - - self._destroy = function () { - $('body').removeClass('modal-open'); - $('.modal-backdrop').remove(); - - $('#' + self.dlg_id).remove(); - }; - - self._make_dialog_box = function () { - var _html = [ - '
', - ' ', - '
'].join('\n'); - - $('body').append($(_html)); - - // “修改主机描述” 对话框上的两个按钮的点击事件 - $('#' + self.dlg_id + " [ywl-btn='ok']").click(function () { - self._save(); - }); - $('#' + self.dlg_id + " [ywl-btn='cancel']").click(function () { - self._destroy(); - }); - // 绑定“修改主机描述” 对话框中的输入框的回车事件 - $('#' + self.dlg_id + " [ywl-input='desc']").keydown(function (event) { - if (event.which == 13) { - self._save(); - } else if (event.which == 27) { - self._destroy(); - } - }); - - }; - - return self; -}; - -ywl.create_dlg_show_rdp_advance = function(row_data) { - var self = {}; - - self.dlg_id = _.uniqueId('dlg-rdp-advance-'); -// self._table_ctrl = tbl; -// self.host_id = host_id; -// self.host_ip = host_ip; -// self.host_desc = host_desc; - - self.show = function (pos_obj) { - self._make_dialog_box(); - $('body') - .addClass('modal-open') - .append($('')) - .keydown(function (event) { - if (event.which == 27) { - self._destroy(); - } - }); - $('.modal-backdrop').click(function () { - self._destroy(); - }); - - var t_obj = $('#' + self.dlg_id + ' .popover'); - t_obj.css({ - 'top': pos_obj.offset().top + pos_obj.height() + 5, - 'left': pos_obj.offset().left - 10 - }).show(); - - //$('#' + self.dlg_id + " [ywl-input='desc']").focus(); - }; - - self._save = function () { - var dlg_dom_id = '[data-dlg="show-rdp-advance"]'; - - var val = $(dlg_dom_id + " input[ywl-input='desc']").val(); - if (val == self.host_desc) { - self._destroy(); - return; - } - - ywl.ajax_post_json('/host/update', {host_id: host_id, kv: {host_desc: val}}, - function (ret) { - self._table_ctrl.update_row(row_id, {host_desc: val}); - ywl.notify_success('主机 ' + self.host_ip + ' 的描述已保存!'); - self._destroy(); - }, - function () { - ywl.notify_error('主机 ' + self.host_ip + ' 的描述修改未能成功保存!', ''); - self._destroy(); - } - ); - - }; - - self._destroy = function () { - $('body').removeClass('modal-open'); - $('.modal-backdrop').remove(); - - $('#' + self.dlg_id).remove(); - }; - - self._make_dialog_box = function () { - var _html = [ - '
', - ' ', - '
'].join('\n'); - - $('body').append($(_html)); - - // “修改主机描述” 对话框上的两个按钮的点击事件 - $('#' + self.dlg_id + " [data-action='ok']").click(function () { - self._save(); - }); - $('#' + self.dlg_id + " [data-action='cancel']").click(function () { - self._destroy(); - }); - -// // 绑定“修改主机描述” 对话框中的输入框的回车事件 -// $('#' + self.dlg_id + " [ywl-input='desc']").keydown(function (event) { -// if (event.which == 13) { -// self._save(); -// } else if (event.which == 27) { -// self._destroy(); -// } -// }); - - }; - - return self; -}; +/*! ywl v1.0.1, (c)2015 eomsoft.net */ +"use strict"; + + +ywl.notify_error = function (message_, title_) { + var _title = title_ || ''; + $.gritter.add({ + //sticky:true, + class_name: 'gritter-error', + time: 10000, + title: ' 错误:' + _title, + text: message_ + }); +}; + +ywl.notify_success = function (message_, title_) { + var _title = title_ || null; + if (_title !== null) + _title = ' ' + _title; + $.gritter.add({ + //sticky:true, + class_name: 'gritter-success', + time: 10000, + title: _title, + text: message_ + }); +}; + + +function get_host_group_by_id(gid) { + var _all = {id: 0, group_name: '全部'}; + return _all; +} + +function get_user_info_by_id(user_id) { + var _all = {id: 0, nickname: '未知'}; + return _all; +} + +function get_event_code_by_id(e_id) { + var _all = {id: 0, e_desc: '未知'}; + var ret = ywl.assist.get_cache_by_id(CACHE_TYPE_EVENT_CODE, e_id); + + if (ret == null) + return _all; + else + return ret; +} +function get_current_system_group() { + return get_system_group_by_id(0); +} + +function get_system_group_by_id(gid) { + var _all = {id: 0, name: '全部'}; + var ret = null; + + $.each(system_group, function (i, group) { + if (group.id == gid) { + ret = group; + return false; + } + }); + + if (ret == null) + return _all; + else + return ret; +} + + +//function get_command_name_by_id(cmd_id) { +// return ywl.assist.get_cache_by_id(CACHE_TYPE_COMMAND, cmd_id); +//} + +//function notify_error(message_, title_) { +// var _title = title_ || ''; +// $.gritter.add({ +// sticky: true, +// class_name: 'gritter-error', +// time: 10000, +// title: ' 错误:' + _title, +// text: message_ +// }); +//} +//function notify_success(message_, title_) { +// var _title = title_ || null; +// if (_title !== null) +// _title = ' ' + _title; +// $.gritter.add({ +// //sticky:true, +// class_name: 'gritter-success', +// time: 10000, +// title: _title, +// text: message_ +// }); +//} + +// 切换一个dom节点显示与否 +ywl.toggle_display = function (selector) { + var obj = $(selector); + if (typeof(obj) == 'undefined') + return; + + if (obj.is(':hidden')) { + obj.show(); + } else { + obj.hide(); + } +}; + +//====================================================== +// Dialog-box for confirm operation. +//====================================================== +ywl.dlg_confirm = function (cb_stack, cb_args) { + var self = {}; + self._cb_stack = cb_stack; + self._title = cb_args.title || '操作确认:'; + self._msg = cb_args.msg || ''; + self._btn_yes = cb_args.btn_yes || '确定'; + self._btn_no = cb_args.btn_no || '取消'; + self._fn_yes = cb_args.fn_yes || null; + self._fn_no = cb_args.fn_no || null; + self._dlg_id = _.uniqueId('dlg-confirm-'); + self._cb_args = cb_args.cb_args || {}; + + self._make_message_box = function () { + var _html = [ + ''].join('\n'); + $('body').append($(_html)); + }; + + self._destroy = function () { + $('#' + self._dlg_id).remove(); + }; + + self._on_btn_yes = function () { + $('#' + self._dlg_id).modal('hide'); + if (_.isFunction(self._fn_yes)) { + self._cb_stack + .add(self._fn_yes, self._cb_args) + .exec(); + } + }; + self._on_btn_no = function () { + $('#' + self._dlg_id).modal('hide'); + if (_.isFunction(self._fn_no)) { + self._cb_stack + .add(self._fn_no, self._cb_args) + .exec(); + } + }; + + self.show = function () { + $('#dlg-btn-' + self._dlg_id + "-yes").click(self._on_btn_yes); + $('#dlg-btn-' + self._dlg_id + "-no").click(self._on_btn_no); + $('#' + self._dlg_id) + .modal() + //.on('hide.bs.modal', self._on_cancel) + .on('hidden.bs.modal', self._destroy); + }; + + self._make_message_box(); + self.show(); +}; + + +//====================================================== +// Dialog-box for modify host description +//====================================================== +ywl.create_dlg_modify_host_desc = function (tbl, row_id, host_id, host_ip, host_desc) { + var self = {}; + + self.dlg_id = _.uniqueId('dlg-modify-host-desc-'); + self._table_ctrl = tbl; + self.host_id = host_id; + self.host_ip = host_ip; + self.host_desc = host_desc; + + self.show = function (pos_obj) { + self._make_dialog_box(); + $('body') + .addClass('modal-open') + .append($('')) + .keydown(function (event) { + if (event.which == 27) { + self._destroy(); + } + }); + $('.modal-backdrop').click(function () { + self._destroy(); + }); + + var t_obj = $('#' + self.dlg_id + ' .popover'); + t_obj.css({ + 'top': pos_obj.offset().top + pos_obj.height() - 5, + 'left': pos_obj.offset().left + }).show(); + + $('#' + self.dlg_id + " [ywl-input='desc']").focus(); + }; + + self._save = function () { + var dlg_dom_id = "[ywl-dlg='modify-host-desc']"; + + var val = $(dlg_dom_id + " input[ywl-input='desc']").val(); + if (val === self.host_desc) { + self._destroy(); + return; + } + + ywl.ajax_post_json('/host/update', {host_id: host_id, kv: {host_desc: val}}, + function (ret) { + if (ret.code === TPE_OK) { + self._table_ctrl.update_row(row_id, {host_desc: val}); + ywl.notify_success('主机 ' + self.host_ip + ' 的描述已保存!'); + } else { + ywl.notify_error('主机 ' + self.host_ip + ' 的描述修改未能成功保存:' + ret.message); + } + self._destroy(); + }, + function () { + ywl.notify_error('网络故障,主机 ' + self.host_ip + ' 的描述修改未能成功保存!'); + self._destroy(); + } + ); + + }; + + self._destroy = function () { + $('body').removeClass('modal-open'); + $('.modal-backdrop').remove(); + + $('#' + self.dlg_id).remove(); + }; + + self._make_dialog_box = function () { + var _html = [ + '
', + ' ', + '
'].join('\n'); + + $('body').append($(_html)); + + // “修改主机描述” 对话框上的两个按钮的点击事件 + $('#' + self.dlg_id + " [ywl-btn='ok']").click(function () { + self._save(); + }); + $('#' + self.dlg_id + " [ywl-btn='cancel']").click(function () { + self._destroy(); + }); + // 绑定“修改主机描述” 对话框中的输入框的回车事件 + $('#' + self.dlg_id + " [ywl-input='desc']").keydown(function (event) { + if (event.which == 13) { + self._save(); + } else if (event.which == 27) { + self._destroy(); + } + }); + + }; + + return self; +}; + +ywl.create_dlg_show_rdp_advance = function (row_data) { + var self = {}; + + self.dlg_id = _.uniqueId('dlg-rdp-advance-'); +// self._table_ctrl = tbl; +// self.host_id = host_id; +// self.host_ip = host_ip; +// self.host_desc = host_desc; + + self.show = function (pos_obj) { + self._make_dialog_box(); + $('body') + .addClass('modal-open') + .append($('')) + .keydown(function (event) { + if (event.which == 27) { + self._destroy(); + } + }); + $('.modal-backdrop').click(function () { + self._destroy(); + }); + + var t_obj = $('#' + self.dlg_id + ' .popover'); + t_obj.css({ + 'top': pos_obj.offset().top + pos_obj.height() + 5, + 'left': pos_obj.offset().left - 10 + }).show(); + + //$('#' + self.dlg_id + " [ywl-input='desc']").focus(); + }; + + self._save = function () { + var dlg_dom_id = '[data-dlg="show-rdp-advance"]'; + + var val = $(dlg_dom_id + " input[ywl-input='desc']").val(); + if (val === self.host_desc) { + self._destroy(); + return; + } + + ywl.ajax_post_json('/host/update', {host_id: host_id, kv: {host_desc: val}}, + function (ret) { + if (ret.code === TPE_OK) { + self._table_ctrl.update_row(row_id, {host_desc: val}); + ywl.notify_success('主机 ' + self.host_ip + ' 的描述已保存!'); + } else { + ywl.notify_error('主机 ' + self.host_ip + ' 的描述修改未能成功保存:' + ret.message); + } + self._destroy(); + }, + function () { + ywl.notify_error('网络故障,主机 ' + self.host_ip + ' 的描述修改未能成功保存!'); + self._destroy(); + } + ); + + }; + + self._destroy = function () { + $('body').removeClass('modal-open'); + $('.modal-backdrop').remove(); + + $('#' + self.dlg_id).remove(); + }; + + self._make_dialog_box = function () { + var _html = [ + '
', + ' ', + '
'].join('\n'); + + $('body').append($(_html)); + + // “修改主机描述” 对话框上的两个按钮的点击事件 + $('#' + self.dlg_id + " [data-action='ok']").click(function () { + self._save(); + }); + $('#' + self.dlg_id + " [data-action='cancel']").click(function () { + self._destroy(); + }); + +// // 绑定“修改主机描述” 对话框中的输入框的回车事件 +// $('#' + self.dlg_id + " [ywl-input='desc']").keydown(function (event) { +// if (event.which == 13) { +// self._save(); +// } else if (event.which == 27) { +// self._destroy(); +// } +// }); + + }; + + return self; +}; diff --git a/server/www/teleport/static/js/ui/controls.js b/server/www/teleport/static/js/ui/controls.js index 268703d..5c53ff5 100644 --- a/server/www/teleport/static/js/ui/controls.js +++ b/server/www/teleport/static/js/ui/controls.js @@ -1,1672 +1,1672 @@ -/*! ywl v1.0.1, (c)2015 eomsoft.net */ -"use strict"; - -ywl.create_table = function (table_options) { - var _tbl = {}; - - // 此表格绑定的DOM对象的ID,用于JQuery的选择器 - _tbl.selector = table_options.selector; - _tbl.options = table_options; - _tbl.column_count = _tbl.options.columns.length; - - _tbl.row_data = []; - _tbl.total = 0; // 记录总数 - _tbl.page_index = 0; // 当前页数(基数为0) - _tbl.per_page = 25; // 每页显示的记录数量 - - // 表头 - _tbl.header_ctrl = null; - // 关联的分页控件(一个表格只有一个分页控件) - _tbl.paging_ctrl = null; - // 关联的过滤器控件(一个表格可以有多个过滤器控件) - _tbl.filter_ctrls = []; - - _tbl.render = null;//ywl.create_table_render(self, self.options.on_render_created || null); - - //======================= - // 需要被重载的函数 - //======================= - - _tbl.on_data_loaded = function (cb_stack, cb_args) { - cb_stack.exec(); - }; - - _tbl.on_cell_created = function (row_id, col_key, obj) { - //log.v('on_cell_created:', row_id, col_key, obj); - }; - - _tbl.init = function (cb_stack, cb_args) { - // 表格创建完成后,加入表格的body部分,这样就可以在没有表头的情况下创建表格了 - cb_stack.add(_tbl._make_body); - - // 创建表格渲染器 - _tbl.render = ywl.create_table_render(_tbl, _tbl.on_render_created || null); - - // 根据需要创建表头并初始化 - if (_tbl.options.have_header) { - //log.v(' ======== create header.', _tbl.options.on_header_created); - _tbl.header_ctrl = ywl.create_table_header(_tbl, _tbl.options.on_header_created || null); - cb_stack.add(_tbl.header_ctrl.init); - } - - // 如果设置了分页控件的属性,那么创建分页控件并初始化 - if (_tbl.options.have_paging) { - _tbl.paging_ctrl = ywl.create_table_paging(_tbl, _tbl.on_paging_created || null); - cb_stack.add(_tbl.paging_ctrl.init); - } - - // 对每一个过滤器进行初始化 - for (var i = 0, cnt = _tbl.filter_ctrls.length; i < cnt; ++i) { - //$.each(self.filter_ctrls, function (i, f) { - if (_.isFunction(_tbl.filter_ctrls[i].init)) { - cb_stack.add(_tbl.filter_ctrls[i].init); - } - } - - // 执行初始化函数链 - cb_stack.exec(); - }; - - _tbl._make_body = function (cb_stack) { - $(_tbl.selector).append($('')); - cb_stack.exec(); - }; - - _tbl.destroy = function (cb_stack) { - $(_tbl.selector).empty(); - cb_stack.exec(); - }; - - _tbl._fix_options = function () { - if (!_.isUndefined(_tbl.options.column_default)) { - for (var i = 0, cnt = _tbl.options.columns.length; i < cnt; ++i) { - for (var k in _tbl.options.column_default) { - if (_tbl.options.column_default.hasOwnProperty(k)) { - if (_.isUndefined(_tbl.options.columns[i][k])) { - _tbl.options.columns[i][k] = _tbl.options.column_default[k]; - } - } - } - - if (_.isUndefined(_tbl.options.columns[i]['fields'])) { - _tbl.options.columns[i]['fields'] = {}; - _tbl.options.columns[i]['fields'][_tbl.options.columns[i]['key']] = _tbl.options.columns[i]['key']; - } - if (_.isUndefined(_tbl.options.columns[i]['sort_asc'])) { - _tbl.options.columns[i]['sort_asc'] = true; - } - if (_.isUndefined(_tbl.options.columns[i]['recreate'])) { - _tbl.options.columns[i]['recreate'] = true; - } - } - } - if (_.isUndefined(_tbl.options.sort)) { - _tbl.options.sort = 'remote'; - } - - if (_.isUndefined(_tbl.options.have_header)) { - _tbl.options.have_header = true; - } - - _tbl.options.have_paging = !_.isUndefined(_tbl.options.paging); - //if (_.isUndefined(_tbl.options.paging)) { - // _tbl.options.have_paging = false; - //} else { - // _tbl.options.have_paging = true; - //} - }; - - //===================================================================== - // 关联控件相关操作 - //===================================================================== - _tbl.append_filter_ctrl = function (filter_ctrl) { - _tbl.filter_ctrls.push(filter_ctrl); - }; - - //===================================================================== - // 过滤器相关操作 - //===================================================================== - _tbl.reset_filters = function (cb_stack, cb_args) { - for (var i = 0, cnt = _tbl.filter_ctrls.length; i < cnt; ++i) { - if (_.isFunction(_tbl.filter_ctrls[i].reset)) { - cb_stack.add(_tbl.filter_ctrls[i].reset); - } - } - cb_stack.exec(); - }; - - //===================================================================== - // 功能 - //===================================================================== - _tbl.load_data = function (cb_stack, cb_args) { - //log.v('load table data.', cb_args); - if (_tbl.paging_ctrl) - _tbl.per_page = _tbl.paging_ctrl.get_per_page(); - else - _tbl.per_page = 0; - - _tbl.load_begin(1500); - - var _filter = {}; - // 对每一个关联的过滤器,获取其设置 - for (var i = 0, _filter_count = _tbl.filter_ctrls.length; i < _filter_count; ++i) { - var _f = _tbl.filter_ctrls[i].get_filter(); - //$.each(_f, function (i, v) { - // _filter[v.k] = v.v; - //}); - for (var _filter_key in _f) { - if (_f.hasOwnProperty(_filter_key)) - _filter[_filter_key] = _f[_filter_key]; - } - - } - - var _order = null; - if (_tbl.header_ctrl) { - _order = _tbl.header_ctrl.get_order(); - } - - var _limit = {}; - _limit.page_index = _tbl.page_index; - _limit.per_page = _tbl.per_page; - - //log.d('when load, filter:', _filter); - //log.d('when load, order:', _order); - //log.d('when load, limit:', _limit); - - // 根据数据源的设定加载数据 - if (_tbl.options.data_source) { - if (_tbl.options.data_source.type == 'none') { - // 外部直接调用set_data()方法来设置数据,无需本控件主动获取 - - } else if (_tbl.options.data_source.type == 'callback') { - // 调用一个函数来加载数据 - //cb_stack.add(self.load_end); - //cb_stack.add(self.set_data); - _tbl.options.data_source.fn(cb_stack, {table: _tbl, filter: _filter, order: _order, limit: _limit}); - - } else if (_tbl.options.data_source.type == 'ajax-post') { - var _url = _tbl.options.data_source.url; - ywl.ajax_post_json(_url, {filter: _filter, order: _order, limit: _limit}, - function (ret) { - log.d('ajax-return:', ret); - if (ret.code != 0) { - ywl.notify_error(''); - } else { - //self.total = ret.data.total; - //self.page_index = ret.data.page_index; - cb_stack.add(_tbl.load_end); - _tbl.set_data(cb_stack, {}, {total: ret.data.total, page_index: ret.data.page_index, data: ret.data.data}); - } - }, - function () { - _tbl.show_load_failed(); - } - ); - } else { - log.e('table-options [data-source] type [' + _tbl.options.data_source.type + '] known.'); - } - - //return; - } else { - log.e('have no idea for load table data. need data_source.'); - } - }; - - _tbl._render_row = function (row_data, pos_row_id) { - var _pos = -1; // 0=插入到第一行,-1=插入到最后一行(默认),其他=插入到指定row_id的行之后,如果没有找到指定的行,则插入到最后 - if (!_.isUndefined(pos_row_id)) { - _pos = pos_row_id; - } - - var dom_obj = $(_tbl.selector + ' tbody'); - var node = ''); - - - for (var i = 0, cnt = _tbl.options.columns.length; i < cnt; ++i) { - var col = _tbl.options.columns[i]; - //node.push(''); - - //node.push(''); - - - if (_.isUndefined(col.render)) { - if (_.isUndefined(col.fields) || _.isEmpty(col.fields)) { - //node += row_data[col.key]; - node.push(row_datas[r][col.key]) - } else { - var _tmp = []; - for (k in col.fields) { - if (col.fields.hasOwnProperty(k)) - _tmp.push(row_datas[r][col.fields[k]]); - } - node.push(_tmp.join(' ')); - } - } else { - if (_.isFunction(_tbl.render[col.render])) { - var _args = {}; - for (k in col.fields) { - if (col.fields.hasOwnProperty(k)) - _args[k] = row_datas[r][col.fields[k]]; - } - node.push(_tbl.render[col.render](row_datas[r].ywl_row_id, _args)); - } - } - node.push(''); - } - node.push(''); - } - - - var _tr = $(node.join('')); - - if (_pos == -1) { - dom_obj.append(_tr); - } else if (_pos == 0) { - dom_obj.prepend(_tr); - } else { - var _pos_obj = $(dom_obj).find("[ywl-row-id='" + _pos + "']"); - if (0 == _pos_obj[0]) { - // 没有找到指定行,则加入到最后 - dom_obj.append(_tr); - } else { - // 找到了指定行,则尾随其后 - _pos_obj.after(_tr); - } - } - - //// callback for each cell. - //if (_.isFunction(_tbl.on_cell_created)) { - // var _cell_objs = $(_tbl.selector + " [ywl-row-id='" + row_datas[r].ywl_row_id + "'] td"); - // for (i = 0, cnt = _cell_objs.length; i < cnt; ++i) { - // _tbl.on_cell_created(row_datas[r].ywl_row_id, _tbl.options.columns[i].key, $(_cell_objs[i])); - // } - //} - // - //if (_.isFunction(_tbl.on_row_created)) { - // var _row_obj = $(_tbl.selector + " [ywl-row-id='" + row_datas[r].ywl_row_id + "']")[0]; - // _tbl.on_row_created(row_datas[r].ywl_row_id, $(_row_obj)); - //} - - var _have_cell_created = _.isFunction(_tbl.on_cell_created); - var _have_row_created = _.isFunction(_tbl.on_row_created); - - //if (_have_cell_created || _have_row_created) { - for (r = 0; r < row_count; ++r) { - var _row_obj = $('#row-' + row_datas[r].ywl_row_id); - _row_obj.data('ywl-row-data', row_datas[r]); - - if (_have_cell_created) { - for (i = 0, cnt = _tbl.options.columns.length; i < cnt; ++i) { - _tbl.on_cell_created(row_datas[r].ywl_row_id, _tbl.options.columns[i].key, $('#cell-' + row_datas[r].ywl_row_id + '-' + i)); - } - } - if (_have_row_created) { - _tbl.on_row_created(row_datas[r].ywl_row_id, _row_obj); - } - } - //} - }; - - _tbl.render_table = function (cb_stack, cb_args) { - var dom_obj = $(_tbl.selector + ' tbody'); - - if (_tbl.row_data.length == 0) { - _tbl.show_empty_table(); - cb_stack.exec(); - return; - } else { - dom_obj.empty(); - } - - _tbl._render_rows(_tbl.row_data); - - cb_stack.exec(); - }; - - _tbl.set_data = function (cb_stack, cb_args, ex_args) { - _tbl.row_data = ex_args.data || []; - _tbl.total = ex_args.total || _tbl.row_data.length; - _tbl.page_index = ex_args.page_index || 0; - - // 我们为表格的每一行数据加入我们自己的索引 - for (var i = 0, cnt = _tbl.row_data.length; i < cnt; ++i) { - if (_.isUndefined(_tbl.row_data[i].ywl_row_id)) { - _tbl.row_data[i].ywl_row_id = _.uniqueId(); - } - - if (_.isFunction(_tbl.on_set_row_data)) { - _tbl.on_set_row_data(_tbl.row_data[i]); - } - } - - cb_stack - .add(_tbl.on_data_loaded) - .add(_tbl.update_paging) - .add(_tbl.render_table) - .exec(); - }; - - _tbl.get_row = function (obj) { - //log.v('get-row, obj=', obj); - if (_.isElement(obj)) { - var _tr = null; - if ($(obj).prop('tagName') == 'TR') { - _tr = $(obj); - } else if ($(obj).prop('tagName') == 'TD') { - _tr = $($(obj).parent()[0]); - } else { - _tr = $($(obj).parentsUntil($('tr')).parent()[0]); - } - return _tr.data('ywl-row-data'); - - } else if (_.isString(obj)) { - for (var i = 0, cnt = _tbl.row_data.length; i < cnt; ++i) { - if (_tbl.row_data[i].ywl_row_id == obj) { - return _tbl.row_data[i]; - } - } - return null; - - } else { - log.e('need an element.'); - return null; - } - - }; - - _tbl.update_row = function (row_id, kv) { - //log.v('kv', kv); - var _row_data = $($(_tbl.selector + " [ywl-row-id='" + row_id + "']")[0]).data('ywl-row-data'); - for (var k in kv) { - if (kv.hasOwnProperty(k)) { - if (_.isUndefined(_row_data[k])) { - return false; - } else { - _row_data[k] = kv[k]; - } - } - } - - // 根据columns的设置,更新界面元素 - for (var i in _tbl.options.columns) { - if (!_tbl.options.columns.hasOwnProperty(i)) - continue; - var col = _tbl.options.columns[i]; - for (k in kv) { - if (!kv.hasOwnProperty(k)) - continue; - - //log.v('k:', k, 'fields:', col.fields, 'chk:', _.contains(col.fields, k)); - - //if (_.contains(col.fields, k) != -1) { - if (_.contains(col.fields, k)) { - - var _cell = $($(_tbl.selector + " [ywl-row-id='" + row_id + "'] td")[i]); - - if (col.recreate) { - if (_.isFunction(_tbl.on_cell_created)) { - var node = ''; - if (_.isUndefined(col.render)) { - node += _row_data[col.key]; - } else { - if (_.isFunction(_tbl.render[col.render])) { - var _args = {}; - for (var f in col.fields) { - if (col.fields.hasOwnProperty(f)) - _args[f] = _row_data[col.fields[f]]; - } - node += _tbl.render[col.render](row_id, _args); - } - } - _cell.html(node); - _tbl.on_cell_created(row_id, col.key, _cell); - } - } else { - //log.v('update-row.', col.key); - if (_.isFunction(_tbl.on_cell_update)) { - _tbl.on_cell_update(row_id, col.key, _cell); - } - } - - - //if (col.recreate) { - // _cell.html(node); - // _tbl.on_cell_created(row_id, col.key, _cell); - //} else { - // log.v('update-row.', col.key); - // _tbl.on_cell_created(row_id, col.key, _cell); - //} - - break; - } - } - } - }; - - // 参数pos_row_id: 0=插入到第一行,-1=插入到最后一行(默认),其他=插入到指定row_id的行之后,如果没有找到指定的行,则插入到最后 - _tbl.add_row = function (rows, pos_row_id, fn_is_duplicated) { - var ret_row_id = []; - var _fn = fn_is_duplicated || null; - var _new_count = rows.length; - for (var i = 0; i < _new_count; ++i) { - var _my_count = _tbl.row_data.length; - var _is_duplicated = false; - for (var j = 0; j < _my_count; ++j) { - if (_fn) { - if (_fn(rows[i], _tbl.row_data[j])) { - _is_duplicated = true; - break; - } - } else { - if (rows[i] == _tbl.row_data[j]) { - _is_duplicated = true; - break; - } - } - } - - if (!_is_duplicated) { - //if(_.isUndefined(rows[i].ywl_row_id)) { - // rows[i].ywl_row_id = _.uniqueId(); - //} - rows[i].ywl_row_id = _.uniqueId(); - ret_row_id.push(rows[i].ywl_row_id); - - _tbl.row_data.push(rows[i]); - if (_.isFunction(_tbl.on_set_row_data)) { - _tbl.on_set_row_data(rows[i]); - } - _tbl._render_row(rows[i], pos_row_id); - } else { - ret_row_id.push(-1); - } - } - - return ret_row_id; - }; - - _tbl.remove_row = function (row_id) { - var _index = -1; - for (var i = 0, cnt = _tbl.row_data.length; i < cnt; ++i) { - if (_tbl.row_data[i]['ywl_row_id'] == row_id) { - _index = i; - break; - } - } - - if (_index == -1) { - return false; - } - - _tbl.row_data.splice(_index, 1); - $(_tbl.selector + ' tbody [ywl-row-id="' + row_id + '"]').remove(); - //var row_dom = $(_tbl.selector + ' tbody [ywl-row-id="' + row_id + '"]'); - //row_dom.fadeOut('normal', function(){ - // $(this).remove(); - //}); - return true; - }; - - _tbl.clear = function () { - $(_tbl.selector + ' tbody').empty(); - _tbl.row_data = []; - var cb_stack = CALLBACK_STACK.create(); - cb_stack - .add(_tbl.on_data_loaded) - .add(_tbl.update_paging) - .exec(); - //self.render_table(cb_stack); - }; - - _tbl.reload = function () { - _tbl.load_data(CALLBACK_STACK.create(), {}); - }; - - _tbl.load_begin = function (delay_) { - var _delay = delay_ || 1000; - _tbl.show_loading(_delay); - }; - - _tbl.load_end = function (cb_stack) { - if (_tbl.loading_timer != null) { - clearTimeout(_tbl.loading_timer); - _tbl.loading_timer = null; - } - - cb_stack.exec(); - }; - - _tbl.show_loading = function (delay_) { - var _delay = delay_ || 0; - if (_delay > 0) { - if (_tbl.loading_timer == null) { - _tbl.loading_timer = setTimeout(function () { - _tbl.show_loading(); - }, _delay); - return; - } - } - - var msg_loading = ' 加载中,请稍候...'; - $(_tbl.selector + ' tbody').prepend($(msg_loading)) - }; - - _tbl.show_load_failed = function () { - if (_tbl.loading_timer != null) { - clearTimeout(_tbl.loading_timer); - _tbl.loading_timer = null; - } - - var msg_loading = ' 天啦撸!加载失败...'; - $(_tbl.selector + ' tbody').empty().append($(msg_loading)) - }; - - _tbl.show_empty_table = function () { - if (_tbl.loading_timer != null) { - clearTimeout(_tbl.loading_timer); - _tbl.loading_timer = null; - } - - var msg_loading = ' 哇哦,没有数据哦...'; - $(_tbl.selector + ' tbody').empty().append($(msg_loading)) - }; - - _tbl.update_paging = function (cb_stack, cb_args) { - if (_tbl.paging_ctrl) { - _tbl.paging_ctrl.update(cb_stack, {total: _tbl.total, page_index: _tbl.page_index, per_page: _tbl.per_page}); - } else { - cb_stack.exec(); - } - }; - - _tbl.paging_prev = function () { - if (_tbl.page_index == 0) - return; - _tbl.page_index -= 1; - _tbl.load_data(CALLBACK_STACK.create(), {}); - }; - _tbl.paging_next = function () { - _tbl.page_index += 1; - _tbl.load_data(CALLBACK_STACK.create(), {}); - }; - _tbl.paging_jump = function (page_index) { - _tbl.page_index = page_index || 0; - _tbl.load_data(CALLBACK_STACK.create(), {}); - }; - - _tbl._fix_options(); - - if (_.isFunction(_tbl.options.on_created)) { - _tbl.options.on_created(_tbl); - } - - return _tbl; -}; - -// TODO: to create fixed header (not scroll), see https://github.com/markmalek/Fixed-Header-Table - -ywl.create_table_header = function (tbl, on_created) { - var _tbl_header = {}; - - _tbl_header.selector = tbl.selector; - _tbl_header._table_ctrl = tbl; - //table_ctrl.header_ctrl = self; - _tbl_header._columns = tbl.options.columns; - - _tbl_header.order_by = ''; // 排序字段(不一定对应数据库的字段,可能需要对应转换) - _tbl_header.order_asc = true; // 是否以升序排列 - - _tbl_header.get_order = function () { - if (_tbl_header.order_by == '') { - return null; - } else { - return {k: _tbl_header.order_by, v: _tbl_header.order_asc}; - } - }; - - _tbl_header.init = function (cb_stack, cb_args) { - // 从cookie中取得排序规则 - _tbl_header.order_by = null - //log.d('order_by from cookie:', _tbl_header.order_by); - if (_tbl_header.order_by == null) { - _tbl_header.order_by = ''; - } - - var _first_sort = ''; - var _found = false; - $.each(_tbl_header._columns, function (i, col) { - if (col.sort) { - if (_first_sort == '') { - _first_sort = col.key; - //log.v('first_sort', col.key); - } - - if (_tbl_header.order_by == col.key) { - _found = true; - return false; // 跳出循环 - } - } - }); - - if (!_found) { - _tbl_header.order_by = _first_sort; - _tbl_header.order_asc = true; - } else { - _tbl_header.order_asc = ywl.assist.get_cookie('order_asc'); - if (_tbl_header.order_asc == null) { - _tbl_header.order_asc = true; - } - } - - //log.v('table header:', self.order_by, self.order_asc); - - // 创建表格头 - var _dom_head = ''; - $.each(_tbl_header._columns, function (i, col) { - if (col.sort) { - _dom_head += ''; - - if (_have_style) { - _style += '"'; - _dom_head += _style; - } - - _dom_head += ' data-key="' + col.key + '">' + col.title + ''; - }); - _dom_head += ''; - - //log.v('header dom-id:', self.selector); - $(_tbl_header.selector).append($(_dom_head)); - - // 为标题栏设置点击回调函数(点击可排序) - $(_tbl_header.selector + ' th.sorting').click(_tbl_header.click_header); - $(_tbl_header.selector + ' th.sorting_asc').click(_tbl_header.click_header); - $(_tbl_header.selector + ' th.sorting_desc').click(_tbl_header.click_header); - - if (_.isFunction(on_created)) { - on_created(_tbl_header); - } - - cb_stack.exec(); - }; - - _tbl_header.click_header = function () { - var t = $(this).attr('ywl-table-col-key'); - _tbl_header.on_head_click(t); - }; - - // 点击表格分栏,默认操作为按此栏进行升序/降序排序 - _tbl_header.on_head_click = function (col_key) { - var i = 0; - - if (col_key == _tbl_header.order_by) { - if (_tbl_header.order_asc) { - $(_tbl_header.selector + ' th.sorting_asc').removeClass('sorting_asc').addClass('sorting_desc'); - } else { - $(_tbl_header.selector + ' th.sorting_desc').removeClass('sorting_desc').addClass('sorting_asc'); - } - _tbl_header.order_asc = !_tbl_header.order_asc; - } else { - $(_tbl_header.selector + ' th.sorting_asc').removeClass('sorting_asc').addClass('sorting'); - $(_tbl_header.selector + ' th.sorting_desc').removeClass('sorting_desc').addClass('sorting'); - - $(_tbl_header.selector + " [ywl-table-col-key='" + col_key + "']").removeClass('sorting').addClass('sorting_asc'); - - _tbl_header.order_by = col_key; - - var order_asc = true; - - for (i = 0; i < _tbl_header._table_ctrl.column_count; ++i) { - if (_tbl_header._table_ctrl.options.columns[i].key == col_key) { - order_asc = _tbl_header._table_ctrl.options.columns[i].sort_asc; - log.v('-----', order_asc); - break; - } - } - - if (order_asc) { - $(_tbl_header.selector + " [ywl-table-col-key='" + col_key + "']").removeClass('sorting').addClass('sorting_asc'); - } else { - $(_tbl_header.selector + " [ywl-table-col-key='" + col_key + "']").removeClass('sorting').addClass('sorting_desc'); - } - - _tbl_header.order_asc = order_asc; - } - - var cb_stack = CALLBACK_STACK.create(); - if (_tbl_header._table_ctrl.options.sort == 'local') { - //cb_stack.add(ywl.assist.set_cookie, {k: 'order_by', v: _tbl_header.order_asc}); - - log.v('sort-by:', col_key); - var data = _.sortBy(_tbl_header._table_ctrl.row_data, col_key); - if (_tbl_header.order_asc) { - _tbl_header._table_ctrl.set_data(cb_stack, {}, {data: data}); - } else { - var tmp = []; - for (i = data.length - 1; i >= 0; --i) { - tmp.push(data[i]); - } - _tbl_header._table_ctrl.set_data(cb_stack, {}, {data: tmp}); - } - - } else { - cb_stack - //.add(ywl.assist.set_cookie, {k: 'order_by', v: _tbl_header.order_asc}) - .add(_tbl_header._table_ctrl.load_data) - .exec(); - //ywl.assist.set_cookie(cb_stack, {k: 'order_by', v: _tbl_header.order_asc}); - } - }; - - return _tbl_header; -}; - -ywl.create_table_render = function (tbl, on_created) { - var _tbl_render = {}; - - _tbl_render.fs_name = function (row_id, fields) { - //if(fields.type == 2) { - // return ' ' + fields.name + ''; - //} - // - return ' ' + fields.name + ''; - }; - _tbl_render.pl_desc = function (row_id, fields) { - //if(fields.type == 2) { - // return ' ' + fields.name + ''; - //} - // - var _desc = '未知'; - if (fields.pl == 0) { - _desc = '来宾'; - } else if (fields.pl == 1) { - _desc = '普通用户'; - } else if (fields.pl == 2) { - _desc = '管理员'; - } - return '' + _desc + ''; - }; - - _tbl_render.fs_size = function (row_id, fields) { - if (fields.type == 0 || fields.type == 2) { - return ''; - } - return size2str(fields.size, 2); - }; - - _tbl_render.date_time = function (row_id, fields) { - if (0 == fields.timestamp) { - return ''; - } - - return '' + format_datetime(utc_to_local(fields.timestamp)) + ''; - }; - - _tbl_render.date_time_local = function (row_id, fields) { - if (0 == fields.timestamp) { - return ''; - } - - return '' + format_datetime(fields.timestamp) + ''; - }; - - _tbl_render.log_content = function (row_id, fields) { - var _func = ywl_log_analysis[fields.cmd_id]; - var _content = fields.content; - if (_func != undefined) { - _content = _func(fields.content); - } - return '' + _content + ''; - }; - - _tbl_render.host_id = function (row_id, fields) { - var ret = ''; - ret = '' + fields.id + ''; - ret += '' + fields.desc + ''; - return ret; - }; - -// _tbl_render.host_status = function (row_id, fields) { -// if (fields.status == HOST_STAT_ACTIVE) { -// switch (fields.online) { -// case AGENT_STAT_ONLINE: -// return '在线'; -// case AGENT_STAT_OFFLINE: -// return '离线'; -// default: -// return '未知'; -// } -// } else { -// return '- 未使用 -'; -// } -// }; - - _tbl_render.sys_type = function (row_id, fields) { - switch (fields.sys_type) { - case 1: - return ''; - case 2: - return ''; - case 201: - return ''; - case 202: - return ''; - case 203: - return ''; - case 204: - return ''; - - case 3: - case 300: - return ''; - - default: - return ''; - } - }; - - _tbl_render.record_id = function (row_id, fields) { - return '' + fields.r_id + ''; - }; - - _tbl_render.host_group = function (row_id, fields) { - if (fields.status == HOST_STAT_NOT_ACTIVE) - return '-'; - var g = get_host_group_by_id(fields.group); - if (g.id == 0) - return '- 未知分组 -'; - else - return g.group_name; - }; - -// _tbl_render.command_info = function (row_id, fields) { -// var command = get_command_name_by_id(fields.cmd_id); -// if (command === null) -// return '命令 ' + fields.cmd_id; -// else -// //return '' + command.cmd_desc + ''; -// return '' + command.cmd_desc + ''; -// //var info = command.cmd_name + ' '+ command.cmd_desc; -// //return info; -// }; - _tbl_render.user_info = function (row_id, fields) { - var user_info = get_user_info_by_id(fields.u_id); - if (user_info === null) - return '用户名:' + fields.u_id; - else - return user_info.nickname; - //var info = command.cmd_name + ' '+ command.cmd_desc; - //return info; - }; -// _tbl_render.event_type = function (row_id, fields) { -// var _e_id = fields.id1 + '-' + fields.id2 + '-' + fields.id3 + '-' + fields.id4; -// var content = ''; -// if (_e_id == '3-1-1-100') { -// content = '系统性能监控'; -// return ' ' + content + ''; -// } else if (_e_id == '3-1-1-107') { -// content = 'TCP监听白名单监控'; -// return ' ' + content + ''; -// } else if (_e_id == '3-1-1-108') { -// content = 'UDP白名单监控'; -// return ' ' + content + ''; -// } else if (_e_id == '3-1-1-109') { -// content = 'TCP连接白名单监控'; -// return ' ' + content + ''; -// } else if (_e_id == '3-1-1-110') { -// content = '进程白名单监控'; -// return ' ' + content + ''; -// } else if (_e_id == '3-1-1-7') { -// content = '系统用户监控'; -// return ' ' + content + ''; -// } else { -// content = '未知'; -// return ' ' + content + ''; -// } -// -// -// //var info = command.cmd_name + ' '+ command.cmd_desc; -// //return info; -// }; - _tbl_render.event_code = function (row_id, fields) { - var _e_id = fields.id1 + '-' + fields.id2 + '-' + fields.id3 + '-' + fields.id4; - var _e_info = get_event_code_by_id(_e_id); - var _tip = ''; - if (_e_info === null) - _tip = '未知'; - else - _tip = _e_info.event_desc; - - return '' + _e_id + ''; - }; - - _tbl_render.ret_code = function (row_id, fields) { - if (fields.code === 0) - return '成功'; - else - var message = '失败(' + fields.code + ',' + fields.param1 + ',' + fields.param2 + ')'; - return '' + message + ''; - //var info = command.cmd_name + ' '+ command.cmd_desc; - //return info; - }; - _tbl_render.memory = function (row_id, fields) { - if (fields.status == HOST_STAT_NOT_ACTIVE) - return '-'; - if (0 == fields.value) - return ''; - return '' + size2str(fields.value, 0) + ''; - }; - - _tbl_render.ip = function (row_id, fields) { - if (fields.status == HOST_STAT_NOT_ACTIVE) - return '-'; - - var ret = ''; - var _this_id = _.uniqueId('ip-list-'); - - if (fields.ip.length > 2) { - ret += '
'; - } - - ret += '
'; - - var idx, loop; - (fields.ip.length > 2) ? loop = 2 : loop = fields.ip.length; - for (idx = 0; idx < loop; ++idx) { - ret += '
' + fields.ip[idx] + ''; - if (fields.ip.length > 1) { - // TODO:暂不支持调整IP列表顺序功能 - //ret += ''; - } - ret += '
'; - } - - ret += '
'; - - if (fields.ip.length > 2) { - ret += ''; - } - - return ret; - }; - - _tbl_render.disk = function (row_id, fields) { - if (fields.status == HOST_STAT_NOT_ACTIVE) - return '-'; - - var ret = ''; - $.each(fields.disk, function (i, disk_size) { - ret += '' + size2str(disk_size, 2) + ' '; - }); - return ret; - }; - - _tbl_render.second2str = function (row_id, fields) { - return ' ' + second2str(fields.seconds); - }; - - _tbl_render.host_rate_show = function (row_id, fields) { - if (fields.value >= 90) { - return '' + fields.value + ''; - } else if (fields.value >= 50) { - return '' + fields.value + ''; - } else { - return '' + fields.value + ''; - } - }; - if (_.isFunction(on_created)) { - on_created(_tbl_render); - } - - return _tbl_render; -}; - -ywl.create_table_paging = function (tbl, on_created) { - var _tbl_paging = {}; - _tbl_paging.selector = tbl.options.paging.selector; - _tbl_paging.options = tbl.options.paging; - - _tbl_paging._table_ctrl = tbl; - //self._table_ctrl.attach_paging_ctrl(self); - - _tbl_paging._per_page = -1; - - _tbl_paging.get_per_page = function () { - return _tbl_paging._per_page; - }; - - _tbl_paging.init = function (cb_stack, cb_args) { - _tbl_paging._per_page = -1; - if (_tbl_paging.options.per_page.use_cookie) { - _tbl_paging._per_page = 10|| -1; - } - - if (_tbl_paging._per_page == -1) { - $.each(_tbl_paging.options.per_page.selections, function (i, s) { - if (s.name == _tbl_paging.options.per_page.default_select) { - _tbl_paging._per_page = s.val; - return false; - } - }); - } - - if (_tbl_paging._per_page == -1) { - _tbl_paging._per_page = _tbl_paging.options.per_page.selections[0].val; - } - - if (_.isFunction(on_created)) { - on_created(_tbl_paging); - } - - _tbl_paging._update_per_page(cb_stack); - }; - - _tbl_paging._update_per_page = function (cb_stack, cb_args) { - var node = ''; - - $.each(_tbl_paging.options.per_page.selections, function (i, p) { - if (_tbl_paging._per_page == p.val) - node += ''; - else - node += ''; - }); - - $(_tbl_paging.selector + " select").unbind('change').empty().append($(node)); - $(_tbl_paging.selector + " select").change(function () { - var count = parseInt($(this).children('option:selected').val()); - //log.v('per page', count); - - var cb_stack = CALLBACK_STACK.create(); - cb_stack.add(_tbl_paging._table_ctrl.load_data); - if (_tbl_paging.options.per_page.use_cookie) { - _tbl_paging._per_page = count; - //cb_stack.add(ywl.assist.set_cookie, {k: 'count_per_page', v: count}); - } - - cb_stack.exec(); - }); - - cb_stack.exec(); - }; - - _tbl_paging.update = function (cb_stack, cb_args) { - var _total = cb_args.total || 0; - var _page_index = cb_args.page_index || 0; - //var _per_page = cb_args.per_page || 25; - - $(_tbl_paging.selector + " [ywl-field='recorder_total']").html(_total); - $(_tbl_paging.selector + " [ywl-field='page_current']").html(_page_index + 1); - // 计算总页数 - //log.v('paging: total and per-page:', _total, self._per_page); - var _total_page = Math.ceil(_total / _tbl_paging._per_page); - $(_tbl_paging.selector + " [ywl-field='page_total']").html(_total_page); - - //log.v('paging: page-index and total pages:', _page_index, _total_page); - - var node = []; - - // 分页显示规则: - // 总页数小于等于9的,全部显示 - // 总页数大于9的,部分显示 - // 第一页 上一页 ... x-4 x-3 x-2 x-1 x x+1 x+2 x+3 x+4 ... 下一页 最后一页 - - var _start = _page_index - 4; - if (_start < 0) - _start = 0; - var _end = _start + 9; - if (_end > _total_page) - _end = _total_page; - - if (_total_page > 9) { - if (_page_index == 0) - node.push('
  • '); - else - node.push('
  • '); - } - - if (_page_index == 0) - node.push('
  • '); - else - node.push('
  • '); - - if (_start > 0) { - node.push('
  • '); - } - - for (var i = _start; i < _end; ++i) { - if (i == _page_index) - node.push('
  • ' + (i + 1) + '
  • '); - else - node.push('
  • ' + (i + 1) + '
  • '); - } - - if (_end < _total_page - 1) { - node.push('
  • '); - } - - - if (_page_index == _total_page - 1) - node.push('
  • '); - else - node.push('
  • '); - - if (_total_page > 9) { - if (_page_index == _total_page - 1) - node.push('
  • '); - else - node.push('
  • '); - } - - - $(_tbl_paging.selector + " nav ul").empty().append($(node.join(''))); - - // 事件绑定 - $(_tbl_paging.selector + " [ywl-action='paging-prev']").click(_tbl_paging.paging_prev); - $(_tbl_paging.selector + " [ywl-action='paging-next']").click(_tbl_paging.paging_next); - $(_tbl_paging.selector + " [ywl-jump-page]").click(_tbl_paging.paging_jump); - - _tbl_paging._update_per_page(cb_stack); - }; - - // 绑定三个页面跳转函数 - _tbl_paging.paging_prev = function () { - _tbl_paging._table_ctrl.paging_prev(); - }; - _tbl_paging.paging_next = function () { - _tbl_paging._table_ctrl.paging_next(); - }; - _tbl_paging.paging_jump = function () { - var _page_index = parseInt($(this).attr('ywl-jump-page')); - _tbl_paging._table_ctrl.paging_jump(_page_index); - }; - - return _tbl_paging; -}; - -ywl.create_table_filter_host_group = function (tbl, selector, group_list, on_created) { - var _tblf_hg = {}; - - // 此过滤器绑定的DOM对象,用于JQuery的选择器 - _tblf_hg.selector = selector; - - // 此过滤器绑定的表格控件 - _tblf_hg._table_ctrl = tbl; - _tblf_hg._table_ctrl.append_filter_ctrl(_tblf_hg); - - // 过滤器内容 - _tblf_hg.filter_name = 'host_group'; - _tblf_hg.filter_default = 0; - _tblf_hg.filter_value = 0; - _tblf_hg.group_list = group_list; - - _tblf_hg.get_filter = function () { - var _ret = {}; - _ret[_tblf_hg.filter_name] = _tblf_hg.filter_value; - return _ret; - //return [{k: self.filter_name, v: self.filter_value}]; - }; - - _tblf_hg.reset = function (cb_stack, cb_args) { - if (_tblf_hg.filter_value == _tblf_hg.filter_default) { - cb_stack.exec(); - return; - } - - cb_stack - .add(function (cb_stack) { - _tblf_hg.filter_value = _tblf_hg.filter_default; - var g = get_host_group_by_id(_tblf_hg.filter_default); - $(_tblf_hg.selector + ' button span:first').html(g.group_name); - cb_stack.exec(); - }); - //ywl.assist.set_cookie(cb_stack, {k: _tblf_hg.filter_name, v: _tblf_hg.filter_default}); - }; - - _tblf_hg.init = function (cb_stack, cb_args) { - var _all = {id: 0, group_name: '全部'}; - var g = _all; - $(_tblf_hg.selector + ' button span:first').html(g.group_name); - _tblf_hg.filter_value = g.id; - - var _groups = _tblf_hg.group_list; - - var node = ''; - node += '
  • 全部
  • '; - node += ''; - $.each(_groups, function (i, g) { - node += '
  • ' + g.group_name + '
  • '; - }); - - $(_tblf_hg.selector + ' ul').empty().append($(node)); - - // 点击事件绑定 - $(_tblf_hg.selector + ' ul [ywl-group-id]').click(_tblf_hg._on_select); - - if (_.isFunction(on_created)) { - on_created(_tblf_hg); - } - - cb_stack.exec(); - }; - - _tblf_hg._on_select = function () { - var gid = parseInt($(this).attr('ywl-group-id')); - var group_name = $(this).text(); - //var _group = get_current_host_group(); - // - //if (gid == _group.id) - // return; - - //var g = get_host_group_by_id(gid); - var cb_stack = CALLBACK_STACK.create(); - cb_stack - .add(_tblf_hg._table_ctrl.load_data) - .add(function (cb_stack) { - _tblf_hg.filter_value = gid; - $(_tblf_hg.selector + ' button span:first').html(group_name); - cb_stack.exec(); - }); - cb_stack.exec(); - //ywl.assist.set_cookie(cb_stack, {k: _tblf_hg.filter_name, v: gid}); - }; - - return _tblf_hg; -}; - -ywl.create_table_filter_system_type = function (tbl, selector, on_created) { - var _tblf_st = {}; - - // 此表格绑定的DOM对象的ID,用于JQuery的选择器 - _tblf_st.selector = selector; - // 此过滤器绑定的表格控件 - _tblf_st._table_ctrl = tbl; - _tblf_st._table_ctrl.append_filter_ctrl(_tblf_st); - - // 过滤器内容 - _tblf_st.filter_name = 'host_sys_type'; - _tblf_st.filter_default = 0; - _tblf_st.filter_value = 0; - - _tblf_st.get_filter = function () { - var _ret = {}; - _ret[_tblf_st.filter_name] = _tblf_st.filter_value; - return _ret; - //return [{k: self.filter_name, v: self.filter_value}]; - }; - - _tblf_st.reset = function (cb_stack, cb_args) { - if (_tblf_st.filter_value == _tblf_st.filter_default) { - cb_stack.exec(); - return; - } - - cb_stack - .add(function (cb_stack) { - _tblf_st.filter_value = _tblf_st.filter_default; - var g = get_system_group_by_id(_tblf_st.filter_default); - $(_tblf_st.selector + ' button span:first').html(g.name); - cb_stack.exec(); - }); - //ywl.assist.set_cookie(cb_stack, {k: _tblf_st.filter_name, v: _tblf_st.filter_default}); - }; - - _tblf_st.init = function (cb_stack) { - var node = ''; - - $.each(system_group, function (i, g) { - if (g.id == -1) { - node += ''; - return true; - } - var is_sub = g.is_sub || false; - if (is_sub) - node += '
  • ' + g.name + '
  • '; - else - node += '
  • ' + g.name + '
  • '; - }); - - var g = get_current_system_group(); - _tblf_st.filter_value = g.id; - $(_tblf_st.selector + ' button span:first').html(g.name); - $(_tblf_st.selector + ' ul').empty().append($(node)); - - // 点击事件绑定 - $(_tblf_st.selector + ' ul [ywl-group-id]').click(_tblf_st._on_select); - - if (_.isFunction(on_created)) { - on_created(_tblf_st); - } - - cb_stack.exec(); - }; - - _tblf_st._on_select = function () { - var gid = parseInt($(this).attr('ywl-group-id')); - // - //var _group = get_current_system_group(); - //if (gid == _group.id) - // return; - - var g = get_system_group_by_id(gid); - - var cb_stack = CALLBACK_STACK.create(); - cb_stack - .add(_tblf_st._table_ctrl.load_data) - .add(function (cb_stack) { - _tblf_st.filter_value = gid; - $(_tblf_st.selector + ' button span:first').html(g.name); - cb_stack.exec(); - }); - cb_stack.exec(); - //ywl.assist.set_cookie(cb_stack, {k: _tblf_st.filter_name, v: gid}); - }; - - return _tblf_st; -}; - -ywl.create_table_filter_search_box = function (tbl, selector, on_created) { - var _tblf_sb = {}; - // 此过滤器绑定的DOM对象,用于JQuery的选择器 - _tblf_sb.selector = selector; - - // 此过滤器绑定的表格控件 - _tblf_sb._table_ctrl = tbl; - _tblf_sb._table_ctrl.append_filter_ctrl(_tblf_sb); - - // 过滤器内容 - _tblf_sb.filter_name = 'search'; - _tblf_sb.filter_default = ''; - - _tblf_sb.get_filter = function () { - var _val = $(_tblf_sb.selector + " input").val(); - - var _ret = {}; - _ret[_tblf_sb.filter_name] = _val; - return _ret; - - //return [{k: self.filter_name, v: _val}]; - }; - - _tblf_sb.reset = function (cb_stack, cb_args) { - var _val = $(_tblf_sb.selector + " input").val(); - - if (_val != _tblf_sb.filter_default) { - $(_tblf_sb.selector + " input").val(_tblf_sb.filter_default); - } - - cb_stack.exec(); - }; - - _tblf_sb.init = function (cb_stack, cb_args) { - // 绑定搜索按钮点击事件 - $(_tblf_sb.selector + " button").click(function () { - _tblf_sb._table_ctrl.load_data(CALLBACK_STACK.create(), {}); - }); - // 绑定搜索输入框中按下回车键 - $(_tblf_sb.selector + " input").keydown(function (event) { - if (event.which == 13) { - _tblf_sb._table_ctrl.load_data(CALLBACK_STACK.create(), {}); - } - }); - - if (_.isFunction(on_created)) { - on_created(_tblf_sb); - } - - cb_stack.exec(); - }; - - return _tblf_sb; -}; - -ywl.create_table_filter_show_online = function (tbl, selector, on_created) { - var _tblf_so = {}; - // 此过滤器绑定的DOM对象,用于JQuery的选择器 - _tblf_so.selector = selector; - - // 此过滤器绑定的表格控件 - _tblf_so._table_ctrl = tbl; - _tblf_so._table_ctrl.append_filter_ctrl(_tblf_so); - - // 过滤器内容 - _tblf_so.filter_name = 'show_online_host_only'; - //self.filter_default = false; - _tblf_so.filter_value = false; - - _tblf_so.get_filter = function () { - var _ret = {}; - _ret[_tblf_so.filter_name] = _tblf_so.filter_value; - return _ret; - //return [{k: self.filter_name, v: self.filter_value}]; - }; - - _tblf_so.reset = function (cb_stack, cb_args) { - // 注意,是否仅显示在线主机并不受“重置过滤器”按钮的影响,因此只需要传递调用栈即可 - cb_stack.exec(); - }; - - _tblf_so.init = function (cb_stack, cb_args) { - var _t = ywl.assist.get_cookie(_tblf_so.filter_name); - if (_t == null) - _tblf_so.filter_value = false; - else - _tblf_so.filter_value = _t; - - _tblf_so._update_button(); - - $(_tblf_so.selector).click(function () { - _tblf_so.filter_value = !_tblf_so.filter_value; - - var cb_stack = CALLBACK_STACK.create(); - cb_stack - .add(_tblf_so._table_ctrl.load_data) - .add(function (cb_stack) { - _tblf_so._update_button(); - cb_stack.exec(); - }); - //cb_stack.exec(); - //ywl.assist.set_cookie(cb_stack, {k: _tblf_so.filter_name, v: _tblf_so.filter_value}); - }); - - if (_.isFunction(on_created)) { - on_created(_tblf_so); - } - - cb_stack.exec(); - }; - - _tblf_so._update_button = function () { - if (_tblf_so.filter_value) { - $(_tblf_so.selector).html(' 显示所有主机'); - } else { - $(_tblf_so.selector).html(' 仅显示在线主机'); - } - }; - - return _tblf_so; -}; - +/*! ywl v1.0.1, (c)2015 eomsoft.net */ +"use strict"; + +ywl.create_table = function (table_options) { + var _tbl = {}; + + // 此表格绑定的DOM对象的ID,用于JQuery的选择器 + _tbl.selector = table_options.selector; + _tbl.options = table_options; + _tbl.column_count = _tbl.options.columns.length; + + _tbl.row_data = []; + _tbl.total = 0; // 记录总数 + _tbl.page_index = 0; // 当前页数(基数为0) + _tbl.per_page = 25; // 每页显示的记录数量 + + // 表头 + _tbl.header_ctrl = null; + // 关联的分页控件(一个表格只有一个分页控件) + _tbl.paging_ctrl = null; + // 关联的过滤器控件(一个表格可以有多个过滤器控件) + _tbl.filter_ctrls = []; + + _tbl.render = null;//ywl.create_table_render(self, self.options.on_render_created || null); + + //======================= + // 需要被重载的函数 + //======================= + + _tbl.on_data_loaded = function (cb_stack, cb_args) { + cb_stack.exec(); + }; + + _tbl.on_cell_created = function (row_id, col_key, obj) { + //log.v('on_cell_created:', row_id, col_key, obj); + }; + + _tbl.init = function (cb_stack, cb_args) { + // 表格创建完成后,加入表格的body部分,这样就可以在没有表头的情况下创建表格了 + cb_stack.add(_tbl._make_body); + + // 创建表格渲染器 + _tbl.render = ywl.create_table_render(_tbl, _tbl.on_render_created || null); + + // 根据需要创建表头并初始化 + if (_tbl.options.have_header) { + //log.v(' ======== create header.', _tbl.options.on_header_created); + _tbl.header_ctrl = ywl.create_table_header(_tbl, _tbl.options.on_header_created || null); + cb_stack.add(_tbl.header_ctrl.init); + } + + // 如果设置了分页控件的属性,那么创建分页控件并初始化 + if (_tbl.options.have_paging) { + _tbl.paging_ctrl = ywl.create_table_paging(_tbl, _tbl.on_paging_created || null); + cb_stack.add(_tbl.paging_ctrl.init); + } + + // 对每一个过滤器进行初始化 + for (var i = 0, cnt = _tbl.filter_ctrls.length; i < cnt; ++i) { + //$.each(self.filter_ctrls, function (i, f) { + if (_.isFunction(_tbl.filter_ctrls[i].init)) { + cb_stack.add(_tbl.filter_ctrls[i].init); + } + } + + // 执行初始化函数链 + cb_stack.exec(); + }; + + _tbl._make_body = function (cb_stack) { + $(_tbl.selector).append($('')); + cb_stack.exec(); + }; + + _tbl.destroy = function (cb_stack) { + $(_tbl.selector).empty(); + cb_stack.exec(); + }; + + _tbl._fix_options = function () { + if (!_.isUndefined(_tbl.options.column_default)) { + for (var i = 0, cnt = _tbl.options.columns.length; i < cnt; ++i) { + for (var k in _tbl.options.column_default) { + if (_tbl.options.column_default.hasOwnProperty(k)) { + if (_.isUndefined(_tbl.options.columns[i][k])) { + _tbl.options.columns[i][k] = _tbl.options.column_default[k]; + } + } + } + + if (_.isUndefined(_tbl.options.columns[i]['fields'])) { + _tbl.options.columns[i]['fields'] = {}; + _tbl.options.columns[i]['fields'][_tbl.options.columns[i]['key']] = _tbl.options.columns[i]['key']; + } + if (_.isUndefined(_tbl.options.columns[i]['sort_asc'])) { + _tbl.options.columns[i]['sort_asc'] = true; + } + if (_.isUndefined(_tbl.options.columns[i]['recreate'])) { + _tbl.options.columns[i]['recreate'] = true; + } + } + } + if (_.isUndefined(_tbl.options.sort)) { + _tbl.options.sort = 'remote'; + } + + if (_.isUndefined(_tbl.options.have_header)) { + _tbl.options.have_header = true; + } + + _tbl.options.have_paging = !_.isUndefined(_tbl.options.paging); + //if (_.isUndefined(_tbl.options.paging)) { + // _tbl.options.have_paging = false; + //} else { + // _tbl.options.have_paging = true; + //} + }; + + //===================================================================== + // 关联控件相关操作 + //===================================================================== + _tbl.append_filter_ctrl = function (filter_ctrl) { + _tbl.filter_ctrls.push(filter_ctrl); + }; + + //===================================================================== + // 过滤器相关操作 + //===================================================================== + _tbl.reset_filters = function (cb_stack, cb_args) { + for (var i = 0, cnt = _tbl.filter_ctrls.length; i < cnt; ++i) { + if (_.isFunction(_tbl.filter_ctrls[i].reset)) { + cb_stack.add(_tbl.filter_ctrls[i].reset); + } + } + cb_stack.exec(); + }; + + //===================================================================== + // 功能 + //===================================================================== + _tbl.load_data = function (cb_stack, cb_args) { + //log.v('load table data.', cb_args); + if (_tbl.paging_ctrl) + _tbl.per_page = _tbl.paging_ctrl.get_per_page(); + else + _tbl.per_page = 0; + + _tbl.load_begin(1500); + + var _filter = {}; + // 对每一个关联的过滤器,获取其设置 + for (var i = 0, _filter_count = _tbl.filter_ctrls.length; i < _filter_count; ++i) { + var _f = _tbl.filter_ctrls[i].get_filter(); + //$.each(_f, function (i, v) { + // _filter[v.k] = v.v; + //}); + for (var _filter_key in _f) { + if (_f.hasOwnProperty(_filter_key)) + _filter[_filter_key] = _f[_filter_key]; + } + + } + + var _order = null; + if (_tbl.header_ctrl) { + _order = _tbl.header_ctrl.get_order(); + } + + var _limit = {}; + _limit.page_index = _tbl.page_index; + _limit.per_page = _tbl.per_page; + + //log.d('when load, filter:', _filter); + //log.d('when load, order:', _order); + //log.d('when load, limit:', _limit); + + // 根据数据源的设定加载数据 + if (_tbl.options.data_source) { + if (_tbl.options.data_source.type === 'none') { + // 外部直接调用set_data()方法来设置数据,无需本控件主动获取 + + } else if (_tbl.options.data_source.type === 'callback') { + // 调用一个函数来加载数据 + //cb_stack.add(self.load_end); + //cb_stack.add(self.set_data); + _tbl.options.data_source.fn(cb_stack, {table: _tbl, filter: _filter, order: _order, limit: _limit}); + + } else if (_tbl.options.data_source.type === 'ajax-post') { + var _url = _tbl.options.data_source.url; + ywl.ajax_post_json(_url, {filter: _filter, order: _order, limit: _limit}, + function (ret) { + log.d('ajax-return:', ret); + if (ret.code !== TPE_OK) { + ywl.notify_error(''); + } else { + //self.total = ret.data.total; + //self.page_index = ret.data.page_index; + cb_stack.add(_tbl.load_end); + _tbl.set_data(cb_stack, {}, {total: ret.data.total, page_index: ret.data.page_index, data: ret.data.data}); + } + }, + function () { + _tbl.show_load_failed(); + } + ); + } else { + log.e('table-options [data-source] type [' + _tbl.options.data_source.type + '] known.'); + } + + //return; + } else { + log.e('have no idea for load table data. need data_source.'); + } + }; + + _tbl._render_row = function (row_data, pos_row_id) { + var _pos = -1; // 0=插入到第一行,-1=插入到最后一行(默认),其他=插入到指定row_id的行之后,如果没有找到指定的行,则插入到最后 + if (!_.isUndefined(pos_row_id)) { + _pos = pos_row_id; + } + + var dom_obj = $(_tbl.selector + ' tbody'); + var node = ''); + + + for (var i = 0, cnt = _tbl.options.columns.length; i < cnt; ++i) { + var col = _tbl.options.columns[i]; + //node.push(''); + + //node.push(''); + + + if (_.isUndefined(col.render)) { + if (_.isUndefined(col.fields) || _.isEmpty(col.fields)) { + //node += row_data[col.key]; + node.push(row_datas[r][col.key]) + } else { + var _tmp = []; + for (k in col.fields) { + if (col.fields.hasOwnProperty(k)) + _tmp.push(row_datas[r][col.fields[k]]); + } + node.push(_tmp.join(' ')); + } + } else { + if (_.isFunction(_tbl.render[col.render])) { + var _args = {}; + for (k in col.fields) { + if (col.fields.hasOwnProperty(k)) + _args[k] = row_datas[r][col.fields[k]]; + } + node.push(_tbl.render[col.render](row_datas[r].ywl_row_id, _args)); + } + } + node.push(''); + } + node.push(''); + } + + + var _tr = $(node.join('')); + + if (_pos == -1) { + dom_obj.append(_tr); + } else if (_pos == 0) { + dom_obj.prepend(_tr); + } else { + var _pos_obj = $(dom_obj).find("[ywl-row-id='" + _pos + "']"); + if (0 == _pos_obj[0]) { + // 没有找到指定行,则加入到最后 + dom_obj.append(_tr); + } else { + // 找到了指定行,则尾随其后 + _pos_obj.after(_tr); + } + } + + //// callback for each cell. + //if (_.isFunction(_tbl.on_cell_created)) { + // var _cell_objs = $(_tbl.selector + " [ywl-row-id='" + row_datas[r].ywl_row_id + "'] td"); + // for (i = 0, cnt = _cell_objs.length; i < cnt; ++i) { + // _tbl.on_cell_created(row_datas[r].ywl_row_id, _tbl.options.columns[i].key, $(_cell_objs[i])); + // } + //} + // + //if (_.isFunction(_tbl.on_row_created)) { + // var _row_obj = $(_tbl.selector + " [ywl-row-id='" + row_datas[r].ywl_row_id + "']")[0]; + // _tbl.on_row_created(row_datas[r].ywl_row_id, $(_row_obj)); + //} + + var _have_cell_created = _.isFunction(_tbl.on_cell_created); + var _have_row_created = _.isFunction(_tbl.on_row_created); + + //if (_have_cell_created || _have_row_created) { + for (r = 0; r < row_count; ++r) { + var _row_obj = $('#row-' + row_datas[r].ywl_row_id); + _row_obj.data('ywl-row-data', row_datas[r]); + + if (_have_cell_created) { + for (i = 0, cnt = _tbl.options.columns.length; i < cnt; ++i) { + _tbl.on_cell_created(row_datas[r].ywl_row_id, _tbl.options.columns[i].key, $('#cell-' + row_datas[r].ywl_row_id + '-' + i)); + } + } + if (_have_row_created) { + _tbl.on_row_created(row_datas[r].ywl_row_id, _row_obj); + } + } + //} + }; + + _tbl.render_table = function (cb_stack, cb_args) { + var dom_obj = $(_tbl.selector + ' tbody'); + + if (_tbl.row_data.length == 0) { + _tbl.show_empty_table(); + cb_stack.exec(); + return; + } else { + dom_obj.empty(); + } + + _tbl._render_rows(_tbl.row_data); + + cb_stack.exec(); + }; + + _tbl.set_data = function (cb_stack, cb_args, ex_args) { + _tbl.row_data = ex_args.data || []; + _tbl.total = ex_args.total || _tbl.row_data.length; + _tbl.page_index = ex_args.page_index || 0; + + // 我们为表格的每一行数据加入我们自己的索引 + for (var i = 0, cnt = _tbl.row_data.length; i < cnt; ++i) { + if (_.isUndefined(_tbl.row_data[i].ywl_row_id)) { + _tbl.row_data[i].ywl_row_id = _.uniqueId(); + } + + if (_.isFunction(_tbl.on_set_row_data)) { + _tbl.on_set_row_data(_tbl.row_data[i]); + } + } + + cb_stack + .add(_tbl.on_data_loaded) + .add(_tbl.update_paging) + .add(_tbl.render_table) + .exec(); + }; + + _tbl.get_row = function (obj) { + //log.v('get-row, obj=', obj); + if (_.isElement(obj)) { + var _tr = null; + if ($(obj).prop('tagName') == 'TR') { + _tr = $(obj); + } else if ($(obj).prop('tagName') == 'TD') { + _tr = $($(obj).parent()[0]); + } else { + _tr = $($(obj).parentsUntil($('tr')).parent()[0]); + } + return _tr.data('ywl-row-data'); + + } else if (_.isString(obj)) { + for (var i = 0, cnt = _tbl.row_data.length; i < cnt; ++i) { + if (_tbl.row_data[i].ywl_row_id == obj) { + return _tbl.row_data[i]; + } + } + return null; + + } else { + log.e('need an element.'); + return null; + } + + }; + + _tbl.update_row = function (row_id, kv) { + //log.v('kv', kv); + var _row_data = $($(_tbl.selector + " [ywl-row-id='" + row_id + "']")[0]).data('ywl-row-data'); + for (var k in kv) { + if (kv.hasOwnProperty(k)) { + if (_.isUndefined(_row_data[k])) { + return false; + } else { + _row_data[k] = kv[k]; + } + } + } + + // 根据columns的设置,更新界面元素 + for (var i in _tbl.options.columns) { + if (!_tbl.options.columns.hasOwnProperty(i)) + continue; + var col = _tbl.options.columns[i]; + for (k in kv) { + if (!kv.hasOwnProperty(k)) + continue; + + //log.v('k:', k, 'fields:', col.fields, 'chk:', _.contains(col.fields, k)); + + //if (_.contains(col.fields, k) != -1) { + if (_.contains(col.fields, k)) { + + var _cell = $($(_tbl.selector + " [ywl-row-id='" + row_id + "'] td")[i]); + + if (col.recreate) { + if (_.isFunction(_tbl.on_cell_created)) { + var node = ''; + if (_.isUndefined(col.render)) { + node += _row_data[col.key]; + } else { + if (_.isFunction(_tbl.render[col.render])) { + var _args = {}; + for (var f in col.fields) { + if (col.fields.hasOwnProperty(f)) + _args[f] = _row_data[col.fields[f]]; + } + node += _tbl.render[col.render](row_id, _args); + } + } + _cell.html(node); + _tbl.on_cell_created(row_id, col.key, _cell); + } + } else { + //log.v('update-row.', col.key); + if (_.isFunction(_tbl.on_cell_update)) { + _tbl.on_cell_update(row_id, col.key, _cell); + } + } + + + //if (col.recreate) { + // _cell.html(node); + // _tbl.on_cell_created(row_id, col.key, _cell); + //} else { + // log.v('update-row.', col.key); + // _tbl.on_cell_created(row_id, col.key, _cell); + //} + + break; + } + } + } + }; + + // 参数pos_row_id: 0=插入到第一行,-1=插入到最后一行(默认),其他=插入到指定row_id的行之后,如果没有找到指定的行,则插入到最后 + _tbl.add_row = function (rows, pos_row_id, fn_is_duplicated) { + var ret_row_id = []; + var _fn = fn_is_duplicated || null; + var _new_count = rows.length; + for (var i = 0; i < _new_count; ++i) { + var _my_count = _tbl.row_data.length; + var _is_duplicated = false; + for (var j = 0; j < _my_count; ++j) { + if (_fn) { + if (_fn(rows[i], _tbl.row_data[j])) { + _is_duplicated = true; + break; + } + } else { + if (rows[i] == _tbl.row_data[j]) { + _is_duplicated = true; + break; + } + } + } + + if (!_is_duplicated) { + //if(_.isUndefined(rows[i].ywl_row_id)) { + // rows[i].ywl_row_id = _.uniqueId(); + //} + rows[i].ywl_row_id = _.uniqueId(); + ret_row_id.push(rows[i].ywl_row_id); + + _tbl.row_data.push(rows[i]); + if (_.isFunction(_tbl.on_set_row_data)) { + _tbl.on_set_row_data(rows[i]); + } + _tbl._render_row(rows[i], pos_row_id); + } else { + ret_row_id.push(-1); + } + } + + return ret_row_id; + }; + + _tbl.remove_row = function (row_id) { + var _index = -1; + for (var i = 0, cnt = _tbl.row_data.length; i < cnt; ++i) { + if (_tbl.row_data[i]['ywl_row_id'] == row_id) { + _index = i; + break; + } + } + + if (_index == -1) { + return false; + } + + _tbl.row_data.splice(_index, 1); + $(_tbl.selector + ' tbody [ywl-row-id="' + row_id + '"]').remove(); + //var row_dom = $(_tbl.selector + ' tbody [ywl-row-id="' + row_id + '"]'); + //row_dom.fadeOut('normal', function(){ + // $(this).remove(); + //}); + return true; + }; + + _tbl.clear = function () { + $(_tbl.selector + ' tbody').empty(); + _tbl.row_data = []; + var cb_stack = CALLBACK_STACK.create(); + cb_stack + .add(_tbl.on_data_loaded) + .add(_tbl.update_paging) + .exec(); + //self.render_table(cb_stack); + }; + + _tbl.reload = function () { + _tbl.load_data(CALLBACK_STACK.create(), {}); + }; + + _tbl.load_begin = function (delay_) { + var _delay = delay_ || 1000; + _tbl.show_loading(_delay); + }; + + _tbl.load_end = function (cb_stack) { + if (_tbl.loading_timer != null) { + clearTimeout(_tbl.loading_timer); + _tbl.loading_timer = null; + } + + cb_stack.exec(); + }; + + _tbl.show_loading = function (delay_) { + var _delay = delay_ || 0; + if (_delay > 0) { + if (_tbl.loading_timer == null) { + _tbl.loading_timer = setTimeout(function () { + _tbl.show_loading(); + }, _delay); + return; + } + } + + var msg_loading = ' 加载中,请稍候...'; + $(_tbl.selector + ' tbody').prepend($(msg_loading)) + }; + + _tbl.show_load_failed = function () { + if (_tbl.loading_timer != null) { + clearTimeout(_tbl.loading_timer); + _tbl.loading_timer = null; + } + + var msg_loading = ' 天啦撸!加载失败...'; + $(_tbl.selector + ' tbody').empty().append($(msg_loading)) + }; + + _tbl.show_empty_table = function () { + if (_tbl.loading_timer != null) { + clearTimeout(_tbl.loading_timer); + _tbl.loading_timer = null; + } + + var msg_loading = ' 哇哦,没有数据哦...'; + $(_tbl.selector + ' tbody').empty().append($(msg_loading)) + }; + + _tbl.update_paging = function (cb_stack, cb_args) { + if (_tbl.paging_ctrl) { + _tbl.paging_ctrl.update(cb_stack, {total: _tbl.total, page_index: _tbl.page_index, per_page: _tbl.per_page}); + } else { + cb_stack.exec(); + } + }; + + _tbl.paging_prev = function () { + if (_tbl.page_index == 0) + return; + _tbl.page_index -= 1; + _tbl.load_data(CALLBACK_STACK.create(), {}); + }; + _tbl.paging_next = function () { + _tbl.page_index += 1; + _tbl.load_data(CALLBACK_STACK.create(), {}); + }; + _tbl.paging_jump = function (page_index) { + _tbl.page_index = page_index || 0; + _tbl.load_data(CALLBACK_STACK.create(), {}); + }; + + _tbl._fix_options(); + + if (_.isFunction(_tbl.options.on_created)) { + _tbl.options.on_created(_tbl); + } + + return _tbl; +}; + +// TODO: to create fixed header (not scroll), see https://github.com/markmalek/Fixed-Header-Table + +ywl.create_table_header = function (tbl, on_created) { + var _tbl_header = {}; + + _tbl_header.selector = tbl.selector; + _tbl_header._table_ctrl = tbl; + //table_ctrl.header_ctrl = self; + _tbl_header._columns = tbl.options.columns; + + _tbl_header.order_by = ''; // 排序字段(不一定对应数据库的字段,可能需要对应转换) + _tbl_header.order_asc = true; // 是否以升序排列 + + _tbl_header.get_order = function () { + if (_tbl_header.order_by == '') { + return null; + } else { + return {k: _tbl_header.order_by, v: _tbl_header.order_asc}; + } + }; + + _tbl_header.init = function (cb_stack, cb_args) { + // 从cookie中取得排序规则 + _tbl_header.order_by = null + //log.d('order_by from cookie:', _tbl_header.order_by); + if (_tbl_header.order_by == null) { + _tbl_header.order_by = ''; + } + + var _first_sort = ''; + var _found = false; + $.each(_tbl_header._columns, function (i, col) { + if (col.sort) { + if (_first_sort == '') { + _first_sort = col.key; + //log.v('first_sort', col.key); + } + + if (_tbl_header.order_by == col.key) { + _found = true; + return false; // 跳出循环 + } + } + }); + + if (!_found) { + _tbl_header.order_by = _first_sort; + _tbl_header.order_asc = true; + } else { + _tbl_header.order_asc = ywl.assist.get_cookie('order_asc'); + if (_tbl_header.order_asc == null) { + _tbl_header.order_asc = true; + } + } + + //log.v('table header:', self.order_by, self.order_asc); + + // 创建表格头 + var _dom_head = ''; + $.each(_tbl_header._columns, function (i, col) { + if (col.sort) { + _dom_head += ''; + + if (_have_style) { + _style += '"'; + _dom_head += _style; + } + + _dom_head += ' data-key="' + col.key + '">' + col.title + ''; + }); + _dom_head += ''; + + //log.v('header dom-id:', self.selector); + $(_tbl_header.selector).append($(_dom_head)); + + // 为标题栏设置点击回调函数(点击可排序) + $(_tbl_header.selector + ' th.sorting').click(_tbl_header.click_header); + $(_tbl_header.selector + ' th.sorting_asc').click(_tbl_header.click_header); + $(_tbl_header.selector + ' th.sorting_desc').click(_tbl_header.click_header); + + if (_.isFunction(on_created)) { + on_created(_tbl_header); + } + + cb_stack.exec(); + }; + + _tbl_header.click_header = function () { + var t = $(this).attr('ywl-table-col-key'); + _tbl_header.on_head_click(t); + }; + + // 点击表格分栏,默认操作为按此栏进行升序/降序排序 + _tbl_header.on_head_click = function (col_key) { + var i = 0; + + if (col_key == _tbl_header.order_by) { + if (_tbl_header.order_asc) { + $(_tbl_header.selector + ' th.sorting_asc').removeClass('sorting_asc').addClass('sorting_desc'); + } else { + $(_tbl_header.selector + ' th.sorting_desc').removeClass('sorting_desc').addClass('sorting_asc'); + } + _tbl_header.order_asc = !_tbl_header.order_asc; + } else { + $(_tbl_header.selector + ' th.sorting_asc').removeClass('sorting_asc').addClass('sorting'); + $(_tbl_header.selector + ' th.sorting_desc').removeClass('sorting_desc').addClass('sorting'); + + $(_tbl_header.selector + " [ywl-table-col-key='" + col_key + "']").removeClass('sorting').addClass('sorting_asc'); + + _tbl_header.order_by = col_key; + + var order_asc = true; + + for (i = 0; i < _tbl_header._table_ctrl.column_count; ++i) { + if (_tbl_header._table_ctrl.options.columns[i].key == col_key) { + order_asc = _tbl_header._table_ctrl.options.columns[i].sort_asc; + log.v('-----', order_asc); + break; + } + } + + if (order_asc) { + $(_tbl_header.selector + " [ywl-table-col-key='" + col_key + "']").removeClass('sorting').addClass('sorting_asc'); + } else { + $(_tbl_header.selector + " [ywl-table-col-key='" + col_key + "']").removeClass('sorting').addClass('sorting_desc'); + } + + _tbl_header.order_asc = order_asc; + } + + var cb_stack = CALLBACK_STACK.create(); + if (_tbl_header._table_ctrl.options.sort == 'local') { + //cb_stack.add(ywl.assist.set_cookie, {k: 'order_by', v: _tbl_header.order_asc}); + + log.v('sort-by:', col_key); + var data = _.sortBy(_tbl_header._table_ctrl.row_data, col_key); + if (_tbl_header.order_asc) { + _tbl_header._table_ctrl.set_data(cb_stack, {}, {data: data}); + } else { + var tmp = []; + for (i = data.length - 1; i >= 0; --i) { + tmp.push(data[i]); + } + _tbl_header._table_ctrl.set_data(cb_stack, {}, {data: tmp}); + } + + } else { + cb_stack + //.add(ywl.assist.set_cookie, {k: 'order_by', v: _tbl_header.order_asc}) + .add(_tbl_header._table_ctrl.load_data) + .exec(); + //ywl.assist.set_cookie(cb_stack, {k: 'order_by', v: _tbl_header.order_asc}); + } + }; + + return _tbl_header; +}; + +ywl.create_table_render = function (tbl, on_created) { + var _tbl_render = {}; + + _tbl_render.fs_name = function (row_id, fields) { + //if(fields.type == 2) { + // return ' ' + fields.name + ''; + //} + // + return ' ' + fields.name + ''; + }; + _tbl_render.pl_desc = function (row_id, fields) { + //if(fields.type == 2) { + // return ' ' + fields.name + ''; + //} + // + var _desc = '未知'; + if (fields.pl == 0) { + _desc = '来宾'; + } else if (fields.pl == 1) { + _desc = '普通用户'; + } else if (fields.pl == 2) { + _desc = '管理员'; + } + return '' + _desc + ''; + }; + + _tbl_render.fs_size = function (row_id, fields) { + if (fields.type == 0 || fields.type == 2) { + return ''; + } + return size2str(fields.size, 2); + }; + + _tbl_render.date_time = function (row_id, fields) { + if (0 == fields.timestamp) { + return ''; + } + + return '' + format_datetime(utc_to_local(fields.timestamp)) + ''; + }; + + _tbl_render.date_time_local = function (row_id, fields) { + if (0 == fields.timestamp) { + return ''; + } + + return '' + format_datetime(fields.timestamp) + ''; + }; + + _tbl_render.log_content = function (row_id, fields) { + var _func = ywl_log_analysis[fields.cmd_id]; + var _content = fields.content; + if (_func != undefined) { + _content = _func(fields.content); + } + return '' + _content + ''; + }; + + _tbl_render.host_id = function (row_id, fields) { + var ret = ''; + ret = '' + fields.id + ''; + ret += '' + fields.desc + ''; + return ret; + }; + +// _tbl_render.host_status = function (row_id, fields) { +// if (fields.status == HOST_STAT_ACTIVE) { +// switch (fields.online) { +// case AGENT_STAT_ONLINE: +// return '在线'; +// case AGENT_STAT_OFFLINE: +// return '离线'; +// default: +// return '未知'; +// } +// } else { +// return '- 未使用 -'; +// } +// }; + + _tbl_render.sys_type = function (row_id, fields) { + switch (fields.sys_type) { + case 1: + return ''; + case 2: + return ''; + case 201: + return ''; + case 202: + return ''; + case 203: + return ''; + case 204: + return ''; + + case 3: + case 300: + return ''; + + default: + return ''; + } + }; + + _tbl_render.record_id = function (row_id, fields) { + return '' + fields.r_id + ''; + }; + + _tbl_render.host_group = function (row_id, fields) { + if (fields.status == HOST_STAT_NOT_ACTIVE) + return '-'; + var g = get_host_group_by_id(fields.group); + if (g.id == 0) + return '- 未知分组 -'; + else + return g.group_name; + }; + +// _tbl_render.command_info = function (row_id, fields) { +// var command = get_command_name_by_id(fields.cmd_id); +// if (command === null) +// return '命令 ' + fields.cmd_id; +// else +// //return '' + command.cmd_desc + ''; +// return '' + command.cmd_desc + ''; +// //var info = command.cmd_name + ' '+ command.cmd_desc; +// //return info; +// }; + _tbl_render.user_info = function (row_id, fields) { + var user_info = get_user_info_by_id(fields.u_id); + if (user_info === null) + return '用户名:' + fields.u_id; + else + return user_info.nickname; + //var info = command.cmd_name + ' '+ command.cmd_desc; + //return info; + }; +// _tbl_render.event_type = function (row_id, fields) { +// var _e_id = fields.id1 + '-' + fields.id2 + '-' + fields.id3 + '-' + fields.id4; +// var content = ''; +// if (_e_id == '3-1-1-100') { +// content = '系统性能监控'; +// return ' ' + content + ''; +// } else if (_e_id == '3-1-1-107') { +// content = 'TCP监听白名单监控'; +// return ' ' + content + ''; +// } else if (_e_id == '3-1-1-108') { +// content = 'UDP白名单监控'; +// return ' ' + content + ''; +// } else if (_e_id == '3-1-1-109') { +// content = 'TCP连接白名单监控'; +// return ' ' + content + ''; +// } else if (_e_id == '3-1-1-110') { +// content = '进程白名单监控'; +// return ' ' + content + ''; +// } else if (_e_id == '3-1-1-7') { +// content = '系统用户监控'; +// return ' ' + content + ''; +// } else { +// content = '未知'; +// return ' ' + content + ''; +// } +// +// +// //var info = command.cmd_name + ' '+ command.cmd_desc; +// //return info; +// }; + _tbl_render.event_code = function (row_id, fields) { + var _e_id = fields.id1 + '-' + fields.id2 + '-' + fields.id3 + '-' + fields.id4; + var _e_info = get_event_code_by_id(_e_id); + var _tip = ''; + if (_e_info === null) + _tip = '未知'; + else + _tip = _e_info.event_desc; + + return '' + _e_id + ''; + }; + + _tbl_render.ret_code = function (row_id, fields) { + if (fields.code === 0) + return '成功'; + else + var message = '失败(' + fields.code + ',' + fields.param1 + ',' + fields.param2 + ')'; + return '' + message + ''; + //var info = command.cmd_name + ' '+ command.cmd_desc; + //return info; + }; + _tbl_render.memory = function (row_id, fields) { + if (fields.status == HOST_STAT_NOT_ACTIVE) + return '-'; + if (0 == fields.value) + return ''; + return '' + size2str(fields.value, 0) + ''; + }; + + _tbl_render.ip = function (row_id, fields) { + if (fields.status == HOST_STAT_NOT_ACTIVE) + return '-'; + + var ret = ''; + var _this_id = _.uniqueId('ip-list-'); + + if (fields.ip.length > 2) { + ret += '
    '; + } + + ret += '
    '; + + var idx, loop; + (fields.ip.length > 2) ? loop = 2 : loop = fields.ip.length; + for (idx = 0; idx < loop; ++idx) { + ret += '
    ' + fields.ip[idx] + ''; + if (fields.ip.length > 1) { + // TODO:暂不支持调整IP列表顺序功能 + //ret += ''; + } + ret += '
    '; + } + + ret += '
    '; + + if (fields.ip.length > 2) { + ret += ''; + } + + return ret; + }; + + _tbl_render.disk = function (row_id, fields) { + if (fields.status == HOST_STAT_NOT_ACTIVE) + return '-'; + + var ret = ''; + $.each(fields.disk, function (i, disk_size) { + ret += '' + size2str(disk_size, 2) + ' '; + }); + return ret; + }; + + _tbl_render.second2str = function (row_id, fields) { + return ' ' + second2str(fields.seconds); + }; + + _tbl_render.host_rate_show = function (row_id, fields) { + if (fields.value >= 90) { + return '' + fields.value + ''; + } else if (fields.value >= 50) { + return '' + fields.value + ''; + } else { + return '' + fields.value + ''; + } + }; + if (_.isFunction(on_created)) { + on_created(_tbl_render); + } + + return _tbl_render; +}; + +ywl.create_table_paging = function (tbl, on_created) { + var _tbl_paging = {}; + _tbl_paging.selector = tbl.options.paging.selector; + _tbl_paging.options = tbl.options.paging; + + _tbl_paging._table_ctrl = tbl; + //self._table_ctrl.attach_paging_ctrl(self); + + _tbl_paging._per_page = -1; + + _tbl_paging.get_per_page = function () { + return _tbl_paging._per_page; + }; + + _tbl_paging.init = function (cb_stack, cb_args) { + _tbl_paging._per_page = -1; + if (_tbl_paging.options.per_page.use_cookie) { + _tbl_paging._per_page = 10|| -1; + } + + if (_tbl_paging._per_page == -1) { + $.each(_tbl_paging.options.per_page.selections, function (i, s) { + if (s.name == _tbl_paging.options.per_page.default_select) { + _tbl_paging._per_page = s.val; + return false; + } + }); + } + + if (_tbl_paging._per_page == -1) { + _tbl_paging._per_page = _tbl_paging.options.per_page.selections[0].val; + } + + if (_.isFunction(on_created)) { + on_created(_tbl_paging); + } + + _tbl_paging._update_per_page(cb_stack); + }; + + _tbl_paging._update_per_page = function (cb_stack, cb_args) { + var node = ''; + + $.each(_tbl_paging.options.per_page.selections, function (i, p) { + if (_tbl_paging._per_page == p.val) + node += ''; + else + node += ''; + }); + + $(_tbl_paging.selector + " select").unbind('change').empty().append($(node)); + $(_tbl_paging.selector + " select").change(function () { + var count = parseInt($(this).children('option:selected').val()); + //log.v('per page', count); + + var cb_stack = CALLBACK_STACK.create(); + cb_stack.add(_tbl_paging._table_ctrl.load_data); + if (_tbl_paging.options.per_page.use_cookie) { + _tbl_paging._per_page = count; + //cb_stack.add(ywl.assist.set_cookie, {k: 'count_per_page', v: count}); + } + + cb_stack.exec(); + }); + + cb_stack.exec(); + }; + + _tbl_paging.update = function (cb_stack, cb_args) { + var _total = cb_args.total || 0; + var _page_index = cb_args.page_index || 0; + //var _per_page = cb_args.per_page || 25; + + $(_tbl_paging.selector + " [ywl-field='recorder_total']").html(_total); + $(_tbl_paging.selector + " [ywl-field='page_current']").html(_page_index + 1); + // 计算总页数 + //log.v('paging: total and per-page:', _total, self._per_page); + var _total_page = Math.ceil(_total / _tbl_paging._per_page); + $(_tbl_paging.selector + " [ywl-field='page_total']").html(_total_page); + + //log.v('paging: page-index and total pages:', _page_index, _total_page); + + var node = []; + + // 分页显示规则: + // 总页数小于等于9的,全部显示 + // 总页数大于9的,部分显示 + // 第一页 上一页 ... x-4 x-3 x-2 x-1 x x+1 x+2 x+3 x+4 ... 下一页 最后一页 + + var _start = _page_index - 4; + if (_start < 0) + _start = 0; + var _end = _start + 9; + if (_end > _total_page) + _end = _total_page; + + if (_total_page > 9) { + if (_page_index == 0) + node.push('
  • '); + else + node.push('
  • '); + } + + if (_page_index == 0) + node.push('
  • '); + else + node.push('
  • '); + + if (_start > 0) { + node.push('
  • '); + } + + for (var i = _start; i < _end; ++i) { + if (i == _page_index) + node.push('
  • ' + (i + 1) + '
  • '); + else + node.push('
  • ' + (i + 1) + '
  • '); + } + + if (_end < _total_page - 1) { + node.push('
  • '); + } + + + if (_page_index == _total_page - 1) + node.push('
  • '); + else + node.push('
  • '); + + if (_total_page > 9) { + if (_page_index == _total_page - 1) + node.push('
  • '); + else + node.push('
  • '); + } + + + $(_tbl_paging.selector + " nav ul").empty().append($(node.join(''))); + + // 事件绑定 + $(_tbl_paging.selector + " [ywl-action='paging-prev']").click(_tbl_paging.paging_prev); + $(_tbl_paging.selector + " [ywl-action='paging-next']").click(_tbl_paging.paging_next); + $(_tbl_paging.selector + " [ywl-jump-page]").click(_tbl_paging.paging_jump); + + _tbl_paging._update_per_page(cb_stack); + }; + + // 绑定三个页面跳转函数 + _tbl_paging.paging_prev = function () { + _tbl_paging._table_ctrl.paging_prev(); + }; + _tbl_paging.paging_next = function () { + _tbl_paging._table_ctrl.paging_next(); + }; + _tbl_paging.paging_jump = function () { + var _page_index = parseInt($(this).attr('ywl-jump-page')); + _tbl_paging._table_ctrl.paging_jump(_page_index); + }; + + return _tbl_paging; +}; + +ywl.create_table_filter_host_group = function (tbl, selector, group_list, on_created) { + var _tblf_hg = {}; + + // 此过滤器绑定的DOM对象,用于JQuery的选择器 + _tblf_hg.selector = selector; + + // 此过滤器绑定的表格控件 + _tblf_hg._table_ctrl = tbl; + _tblf_hg._table_ctrl.append_filter_ctrl(_tblf_hg); + + // 过滤器内容 + _tblf_hg.filter_name = 'host_group'; + _tblf_hg.filter_default = 0; + _tblf_hg.filter_value = 0; + _tblf_hg.group_list = group_list; + + _tblf_hg.get_filter = function () { + var _ret = {}; + _ret[_tblf_hg.filter_name] = _tblf_hg.filter_value; + return _ret; + //return [{k: self.filter_name, v: self.filter_value}]; + }; + + _tblf_hg.reset = function (cb_stack, cb_args) { + if (_tblf_hg.filter_value == _tblf_hg.filter_default) { + cb_stack.exec(); + return; + } + + cb_stack + .add(function (cb_stack) { + _tblf_hg.filter_value = _tblf_hg.filter_default; + var g = get_host_group_by_id(_tblf_hg.filter_default); + $(_tblf_hg.selector + ' button span:first').html(g.group_name); + cb_stack.exec(); + }); + //ywl.assist.set_cookie(cb_stack, {k: _tblf_hg.filter_name, v: _tblf_hg.filter_default}); + }; + + _tblf_hg.init = function (cb_stack, cb_args) { + var _all = {id: 0, group_name: '全部'}; + var g = _all; + $(_tblf_hg.selector + ' button span:first').html(g.group_name); + _tblf_hg.filter_value = g.id; + + var _groups = _tblf_hg.group_list; + + var node = ''; + node += '
  • 全部
  • '; + node += ''; + $.each(_groups, function (i, g) { + node += '
  • ' + g.group_name + '
  • '; + }); + + $(_tblf_hg.selector + ' ul').empty().append($(node)); + + // 点击事件绑定 + $(_tblf_hg.selector + ' ul [ywl-group-id]').click(_tblf_hg._on_select); + + if (_.isFunction(on_created)) { + on_created(_tblf_hg); + } + + cb_stack.exec(); + }; + + _tblf_hg._on_select = function () { + var gid = parseInt($(this).attr('ywl-group-id')); + var group_name = $(this).text(); + //var _group = get_current_host_group(); + // + //if (gid == _group.id) + // return; + + //var g = get_host_group_by_id(gid); + var cb_stack = CALLBACK_STACK.create(); + cb_stack + .add(_tblf_hg._table_ctrl.load_data) + .add(function (cb_stack) { + _tblf_hg.filter_value = gid; + $(_tblf_hg.selector + ' button span:first').html(group_name); + cb_stack.exec(); + }); + cb_stack.exec(); + //ywl.assist.set_cookie(cb_stack, {k: _tblf_hg.filter_name, v: gid}); + }; + + return _tblf_hg; +}; + +ywl.create_table_filter_system_type = function (tbl, selector, on_created) { + var _tblf_st = {}; + + // 此表格绑定的DOM对象的ID,用于JQuery的选择器 + _tblf_st.selector = selector; + // 此过滤器绑定的表格控件 + _tblf_st._table_ctrl = tbl; + _tblf_st._table_ctrl.append_filter_ctrl(_tblf_st); + + // 过滤器内容 + _tblf_st.filter_name = 'host_sys_type'; + _tblf_st.filter_default = 0; + _tblf_st.filter_value = 0; + + _tblf_st.get_filter = function () { + var _ret = {}; + _ret[_tblf_st.filter_name] = _tblf_st.filter_value; + return _ret; + //return [{k: self.filter_name, v: self.filter_value}]; + }; + + _tblf_st.reset = function (cb_stack, cb_args) { + if (_tblf_st.filter_value == _tblf_st.filter_default) { + cb_stack.exec(); + return; + } + + cb_stack + .add(function (cb_stack) { + _tblf_st.filter_value = _tblf_st.filter_default; + var g = get_system_group_by_id(_tblf_st.filter_default); + $(_tblf_st.selector + ' button span:first').html(g.name); + cb_stack.exec(); + }); + //ywl.assist.set_cookie(cb_stack, {k: _tblf_st.filter_name, v: _tblf_st.filter_default}); + }; + + _tblf_st.init = function (cb_stack) { + var node = ''; + + $.each(system_group, function (i, g) { + if (g.id == -1) { + node += ''; + return true; + } + var is_sub = g.is_sub || false; + if (is_sub) + node += '
  • ' + g.name + '
  • '; + else + node += '
  • ' + g.name + '
  • '; + }); + + var g = get_current_system_group(); + _tblf_st.filter_value = g.id; + $(_tblf_st.selector + ' button span:first').html(g.name); + $(_tblf_st.selector + ' ul').empty().append($(node)); + + // 点击事件绑定 + $(_tblf_st.selector + ' ul [ywl-group-id]').click(_tblf_st._on_select); + + if (_.isFunction(on_created)) { + on_created(_tblf_st); + } + + cb_stack.exec(); + }; + + _tblf_st._on_select = function () { + var gid = parseInt($(this).attr('ywl-group-id')); + // + //var _group = get_current_system_group(); + //if (gid == _group.id) + // return; + + var g = get_system_group_by_id(gid); + + var cb_stack = CALLBACK_STACK.create(); + cb_stack + .add(_tblf_st._table_ctrl.load_data) + .add(function (cb_stack) { + _tblf_st.filter_value = gid; + $(_tblf_st.selector + ' button span:first').html(g.name); + cb_stack.exec(); + }); + cb_stack.exec(); + //ywl.assist.set_cookie(cb_stack, {k: _tblf_st.filter_name, v: gid}); + }; + + return _tblf_st; +}; + +ywl.create_table_filter_search_box = function (tbl, selector, on_created) { + var _tblf_sb = {}; + // 此过滤器绑定的DOM对象,用于JQuery的选择器 + _tblf_sb.selector = selector; + + // 此过滤器绑定的表格控件 + _tblf_sb._table_ctrl = tbl; + _tblf_sb._table_ctrl.append_filter_ctrl(_tblf_sb); + + // 过滤器内容 + _tblf_sb.filter_name = 'search'; + _tblf_sb.filter_default = ''; + + _tblf_sb.get_filter = function () { + var _val = $(_tblf_sb.selector + " input").val(); + + var _ret = {}; + _ret[_tblf_sb.filter_name] = _val; + return _ret; + + //return [{k: self.filter_name, v: _val}]; + }; + + _tblf_sb.reset = function (cb_stack, cb_args) { + var _val = $(_tblf_sb.selector + " input").val(); + + if (_val != _tblf_sb.filter_default) { + $(_tblf_sb.selector + " input").val(_tblf_sb.filter_default); + } + + cb_stack.exec(); + }; + + _tblf_sb.init = function (cb_stack, cb_args) { + // 绑定搜索按钮点击事件 + $(_tblf_sb.selector + " button").click(function () { + _tblf_sb._table_ctrl.load_data(CALLBACK_STACK.create(), {}); + }); + // 绑定搜索输入框中按下回车键 + $(_tblf_sb.selector + " input").keydown(function (event) { + if (event.which == 13) { + _tblf_sb._table_ctrl.load_data(CALLBACK_STACK.create(), {}); + } + }); + + if (_.isFunction(on_created)) { + on_created(_tblf_sb); + } + + cb_stack.exec(); + }; + + return _tblf_sb; +}; + +ywl.create_table_filter_show_online = function (tbl, selector, on_created) { + var _tblf_so = {}; + // 此过滤器绑定的DOM对象,用于JQuery的选择器 + _tblf_so.selector = selector; + + // 此过滤器绑定的表格控件 + _tblf_so._table_ctrl = tbl; + _tblf_so._table_ctrl.append_filter_ctrl(_tblf_so); + + // 过滤器内容 + _tblf_so.filter_name = 'show_online_host_only'; + //self.filter_default = false; + _tblf_so.filter_value = false; + + _tblf_so.get_filter = function () { + var _ret = {}; + _ret[_tblf_so.filter_name] = _tblf_so.filter_value; + return _ret; + //return [{k: self.filter_name, v: self.filter_value}]; + }; + + _tblf_so.reset = function (cb_stack, cb_args) { + // 注意,是否仅显示在线主机并不受“重置过滤器”按钮的影响,因此只需要传递调用栈即可 + cb_stack.exec(); + }; + + _tblf_so.init = function (cb_stack, cb_args) { + var _t = ywl.assist.get_cookie(_tblf_so.filter_name); + if (_t == null) + _tblf_so.filter_value = false; + else + _tblf_so.filter_value = _t; + + _tblf_so._update_button(); + + $(_tblf_so.selector).click(function () { + _tblf_so.filter_value = !_tblf_so.filter_value; + + var cb_stack = CALLBACK_STACK.create(); + cb_stack + .add(_tblf_so._table_ctrl.load_data) + .add(function (cb_stack) { + _tblf_so._update_button(); + cb_stack.exec(); + }); + //cb_stack.exec(); + //ywl.assist.set_cookie(cb_stack, {k: _tblf_so.filter_name, v: _tblf_so.filter_value}); + }); + + if (_.isFunction(on_created)) { + on_created(_tblf_so); + } + + cb_stack.exec(); + }; + + _tblf_so._update_button = function () { + if (_tblf_so.filter_value) { + $(_tblf_so.selector).html(' 显示所有主机'); + } else { + $(_tblf_so.selector).html(' 仅显示在线主机'); + } + }; + + return _tblf_so; +}; + diff --git a/server/www/teleport/static/js/ui/group.js b/server/www/teleport/static/js/ui/group.js index cdafc0b..9dc4d68 100644 --- a/server/www/teleport/static/js/ui/group.js +++ b/server/www/teleport/static/js/ui/group.js @@ -3,198 +3,206 @@ */ var g_gourp_dlg_info = null; ywl.on_init = function (cb_stack, cb_args) { - var dom_id = '#ywl_group_list'; + var dom_id = '#ywl_group_list'; - //=================================== - // 创建页面控件对象 - //=================================== - // 表格数据 - var host_table_options = { - selector: dom_id + " [ywl-table='group-list']", - data_source: { - type: 'ajax-post', - url: '/group/list' - }, - column_default: {sort: false, header_align: 'center', cell_align: 'center'}, - columns: [ - {title: "分组ID", key: "id", width: 80}, - {title: "分组名称", key: "group_name", header_align: 'left', cell_align: 'left'}, - {title: "操作", key: "action", width: 240, render: 'make_action_btn', fields: {id: 'group_id'}} - ], - paging: {selector: dom_id + " [ywl-paging='group-list']", per_page: paging_normal}, + //=================================== + // 创建页面控件对象 + //=================================== + // 表格数据 + var host_table_options = { + selector: dom_id + " [ywl-table='group-list']", + data_source: { + type: 'ajax-post', + url: '/group/list' + }, + column_default: {sort: false, header_align: 'center', cell_align: 'center'}, + columns: [ + {title: "分组ID", key: "id", width: 80}, + {title: "分组名称", key: "group_name", header_align: 'left', cell_align: 'left'}, + {title: "操作", key: "action", width: 240, render: 'make_action_btn', fields: {id: 'group_id'}} + ], + paging: {selector: dom_id + " [ywl-paging='group-list']", per_page: paging_normal}, - // 可用的属性设置 - //have_header: true or false + // 可用的属性设置 + //have_header: true or false - // 可用的回调函数 - on_created: ywl.on_host_table_created, - on_header_created: ywl.on_host_table_header_created + // 可用的回调函数 + on_created: ywl.on_host_table_created, + on_header_created: ywl.on_host_table_header_created - // 可重载的函数(在on_created回调函数中重载) - // on_render_created - // on_header_created - // on_paging_created - // on_data_loaded - // on_row_rendered - // on_table_rendered - // on_cell_created - // on_begin_load - // on_after_load + // 可重载的函数(在on_created回调函数中重载) + // on_render_created + // on_header_created + // on_paging_created + // on_data_loaded + // on_row_rendered + // on_table_rendered + // on_cell_created + // on_begin_load + // on_after_load - // 可用的函数 - // load_data - // cancel_load - // set_data - // add_row - // remove_row - // get_row - // update_row - // clear - // reset_filter - }; + // 可用的函数 + // load_data + // cancel_load + // set_data + // add_row + // remove_row + // get_row + // update_row + // clear + // reset_filter + }; - var host_table = ywl.create_table(host_table_options); - g_gourp_dlg_info = ywl.create_group_info_dlg(host_table); - $(dom_id + " [ywl-filter='reload']").click(host_table.reload); - $("#btn-add-group").click(function () { - g_gourp_dlg_info.create_show(); - }); - cb_stack - .add(host_table.load_data) - .add(host_table.init) - .exec(); + var host_table = ywl.create_table(host_table_options); + g_gourp_dlg_info = ywl.create_group_info_dlg(host_table); + $(dom_id + " [ywl-filter='reload']").click(host_table.reload); + $("#btn-add-group").click(function () { + g_gourp_dlg_info.create_show(); + }); + cb_stack + .add(host_table.load_data) + .add(host_table.init) + .exec(); }; // 扩展/重载表格的功能 ywl.on_host_table_created = function (tbl) { - tbl.on_cell_created = function (row_id, col_key, cell_obj) { - if (col_key == 'action') { - var row_data = tbl.get_row(row_id); - //console.log('row_data', row_data); - $(cell_obj).find('[ywl-btn-edit]').click(function () { - g_gourp_dlg_info.update_show(row_data.group_name, row_data.id, row_id); - }); - $(cell_obj).find('[ywl-btn-delete]').click(function () { - var group_id = row_data.id; - var _fn_sure = function (cb_stack, cb_args) { - ywl.ajax_post_json('/host/delete-group', {group_id: group_id}, - function (ret) { - if (ret.code == 0) { - tbl.remove_row(row_id); - ywl.notify_success('删除分组成功!'); - } else if (ret.code == -2) { - ywl.notify_error('不能删除,此分组中已经包含了主机。如果您一定要删除此分组,请先将此分组中的主机设定为其他分组,然后才能删除!'); - } else { - ywl.notify_error('删除分组失败!'); - } + tbl.on_cell_created = function (row_id, col_key, cell_obj) { + if (col_key === 'action') { + var row_data = tbl.get_row(row_id); + //console.log('row_data', row_data); + $(cell_obj).find('[ywl-btn-edit]').click(function () { + g_gourp_dlg_info.update_show(row_data.group_name, row_data.id, row_id); + }); + $(cell_obj).find('[ywl-btn-delete]').click(function () { + var group_id = row_data.id; + var _fn_sure = function (cb_stack, cb_args) { + ywl.ajax_post_json('/host/delete-group', {group_id: group_id}, + function (ret) { + if (ret.code === TPE_OK) { + tbl.remove_row(row_id); + ywl.notify_success('删除分组成功!'); + } else if (ret.code === -2) { + ywl.notify_error('因为有主机隶属此分组,因此不能删除此分组。请先将此分组中的主机设定为其他分组,然后重试!'); + } else { + ywl.notify_error('删除分组失败:' + ret.message); + } - }, - function (ret) { - ywl.notify_error('删除分组失败!'); - } - ); - }; - var cb_stack = CALLBACK_STACK.create(); + }, + function () { + ywl.notify_error('网络故障,删除分组失败!'); + } + ); + }; + var cb_stack = CALLBACK_STACK.create(); - ywl.dlg_confirm(cb_stack, - { - msg: '

    注意:移除操作不可恢复!!

    您确定要删除此分组吗?

    ', - fn_yes: _fn_sure - }); + ywl.dlg_confirm(cb_stack, + { + msg: '

    注意:移除操作不可恢复!!

    您确定要删除此分组吗?

    ', + fn_yes: _fn_sure + }); - }); + }); - } - }; + } + }; - // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 - tbl.on_render_created = function (render) { - render.make_action_btn = function (row_id, fields) { - var ret = []; - ret.push('编辑 '); - ret.push('删除'); - return ret.join(''); - } + // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 + tbl.on_render_created = function (render) { + render.make_action_btn = function (row_id, fields) { + var ret = []; + ret.push('编辑 '); + ret.push('删除'); + return ret.join(''); + } - }; + }; }; ywl.on_host_table_header_created = function (tbl) { }; ywl.create_group_info_dlg = function (tbl) { - var group_info_dlg = {}; - group_info_dlg.dom_id = "#dialog_group_info"; - group_info_dlg.update = 1; - group_info_dlg.tbl = tbl; - group_info_dlg.group_name = ''; - group_info_dlg.group_id = 0; - group_info_dlg.row_id = 0; + var group_info_dlg = {}; + group_info_dlg.dom_id = "#dialog_group_info"; + group_info_dlg.update = 1; + group_info_dlg.tbl = tbl; + group_info_dlg.group_name = ''; + group_info_dlg.group_id = 0; + group_info_dlg.row_id = 0; - group_info_dlg.update_show = function (group_name, group_id, row_id) { - group_info_dlg.update = 1; - group_info_dlg.init(group_name, group_id, row_id); - $(group_info_dlg.dom_id).modal(); - }; - group_info_dlg.create_show = function () { - group_info_dlg.update = 0; - group_info_dlg.init('', 0, 0); - $(group_info_dlg.dom_id).modal(); - }; + group_info_dlg.update_show = function (group_name, group_id, row_id) { + group_info_dlg.update = 1; + group_info_dlg.init(group_name, group_id, row_id); + $(group_info_dlg.dom_id).modal(); + }; + group_info_dlg.create_show = function () { + group_info_dlg.update = 0; + group_info_dlg.init('', 0, 0); + $(group_info_dlg.dom_id).modal(); + }; - group_info_dlg.hide = function() { - $(group_info_dlg.dom_id).modal('hide'); - }; + group_info_dlg.hide = function () { + $(group_info_dlg.dom_id).modal('hide'); + }; - group_info_dlg.init = function (group_name, group_id, row_id) { - group_info_dlg.group_name = group_name; - group_info_dlg.group_id = group_id; - group_info_dlg.row_id = row_id; - group_info_dlg.init_dlg(); - }; - group_info_dlg.init_dlg = function () { - $(group_info_dlg.dom_id + ' #group_name').val(group_info_dlg.group_name); - }; + group_info_dlg.init = function (group_name, group_id, row_id) { + group_info_dlg.group_name = group_name; + group_info_dlg.group_id = group_id; + group_info_dlg.row_id = row_id; + group_info_dlg.init_dlg(); + }; + group_info_dlg.init_dlg = function () { + $(group_info_dlg.dom_id + ' #group_name').val(group_info_dlg.group_name); + }; - group_info_dlg.check_args = function () { - group_info_dlg.group_name = $(group_info_dlg.dom_id + ' #group_name').val(); - return true; - }; - group_info_dlg.post = function () { - if (group_info_dlg.update == 1) { - ywl.ajax_post_json('/host/update-group', {group_id: group_info_dlg.group_id, group_name: group_info_dlg.group_name}, - function (ret) { - var update_args = {id: group_info_dlg.group_id, group_name: group_info_dlg.group_name}; - group_info_dlg.tbl.update_row(group_info_dlg.row_id, update_args); - ywl.notify_success('更新分组信息成功!'); - group_info_dlg.hide(); - }, - function (ret) { - ywl.notify_error('更新分组信息失败!'); - } - ); - } else { - ywl.ajax_post_json('/host/add-group', {group_name: group_info_dlg.group_name}, - function (ret) { - group_info_dlg.tbl.reload(); - ywl.notify_success('分组创建成功!'); - group_info_dlg.hide(); - }, - function (ret) { - ywl.notify_error('分组创建失败!'); - } - ); - } - //group_info_dlg.group_name = $(group_info_dlg.dom_id + ' #group_name').val(); - return true; - }; - $(group_info_dlg.dom_id + " #btn-save").click(function () { - if (!group_info_dlg.check_args()) { - return; - } - group_info_dlg.post(); - }); - return group_info_dlg + group_info_dlg.check_args = function () { + group_info_dlg.group_name = $(group_info_dlg.dom_id + ' #group_name').val(); + return true; + }; + group_info_dlg.post = function () { + if (group_info_dlg.update == 1) { + ywl.ajax_post_json('/host/update-group', {group_id: group_info_dlg.group_id, group_name: group_info_dlg.group_name}, + function (ret) { + if (ret.code === TPE_OK) { + var update_args = {id: group_info_dlg.group_id, group_name: group_info_dlg.group_name}; + group_info_dlg.tbl.update_row(group_info_dlg.row_id, update_args); + ywl.notify_success('更新分组信息成功!'); + group_info_dlg.hide(); + } else { + ywl.notify_error('更新分组失败:' + ret.message); + } + }, + function () { + ywl.notify_error('网络故障,更新分组信息失败!'); + } + ); + } else { + ywl.ajax_post_json('/host/add-group', {group_name: group_info_dlg.group_name}, + function (ret) { + if (ret.code === TPE_OK) { + group_info_dlg.tbl.reload(); + ywl.notify_success('创建分组成功!'); + group_info_dlg.hide(); + } else { + ywl.notify_error('创建分组失败:' + ret.message); + } + }, + function () { + ywl.notify_error('网络故障,创建分组失败!'); + } + ); + } + //group_info_dlg.group_name = $(group_info_dlg.dom_id + ' #group_name').val(); + return true; + }; + $(group_info_dlg.dom_id + " #btn-save").click(function () { + if (!group_info_dlg.check_args()) { + return; + } + group_info_dlg.post(); + }); + return group_info_dlg } \ No newline at end of file diff --git a/server/www/teleport/static/js/ui/log.js b/server/www/teleport/static/js/ui/log.js index 1d34d2a..a18d2a3 100644 --- a/server/www/teleport/static/js/ui/log.js +++ b/server/www/teleport/static/js/ui/log.js @@ -1,386 +1,369 @@ -"use strict"; - -ywl.on_init = function (cb_stack, cb_args) { - var dom_id = '#ywl_log_list'; - - //=================================== - // 创建页面控件对象 - //=================================== - // 表格数据 - var disk_rate = parseInt(ywl.page_options.free_size * 100 / ywl.page_options.total_size); - $('#disk-status').text('日志磁盘大小:' + size2str(ywl.page_options.total_size, 2) + ',剩余空间:' + size2str(ywl.page_options.free_size, 2) + ',空闲' + disk_rate + '%'); - if (disk_rate < 10) { - $('#disk-status').removeClass().addClass('badge badge-danger'); - } else if (disk_rate < 30) { - $('#disk-status').removeClass().addClass('badge badge-warning'); - } else { - $('#disk-status').removeClass().addClass('badge badge-ignore'); - } - - var host_table_options = { - selector: dom_id + " [ywl-table='log-list']", - data_source: { - type: 'ajax-post', - url: '/log/list' - }, - column_default: {sort: false, header_align: 'center', cell_align: 'center'}, - columns: [ - { - title: '', - key: 'select_all', - sort: false, - width: 24, - render: 'make_check_box', - fields: {id: 'id'} - }, - {title: "ID", key: "id"}, - {title: "操作者", key: "account_name"}, - {title: "系统用户", key: "user_name"}, - {title: "协议", key: "protocol", render: 'protocol', fields: {protocol: 'protocol'}}, - {title: "系统", key: "sys_type", width: 40, render: 'sys_type', fields: {sys_type: 'sys_type'}}, - {title: "远程主机地址", key: "host_ip", render: 'server_info', fields: {host_ip: 'host_ip', host_port: 'host_port'}}, - {title: "开始时间", key: "begin_time", width: 160, render: 'begin_time', fields: {begin_time: 'begin_time'}}, - {title: "耗时", key: "cost_time", render: 'cost_time', fields: {cost_time: 'cost_time', ret_code: 'ret_code'}}, - {title: "状态", key: "ret_code", render: 'ret_code', fields: {ret_code: 'ret_code'}}, - { - title: "操作", - key: "action", - width: 160, - header_align: 'left', cell_align: 'left', - render: 'make_action_btn', - fields: {ID: 'id', ret_code:'ret_code', sys_type: 'sys_type', cost_time: 'cost_time', protocol: 'protocol'} - } - ], - paging: {selector: dom_id + " [ywl-paging='log-list']", per_page: paging_normal}, - - // 可用的属性设置 - //have_header: true or false - - // 可用的回调函数 - on_created: ywl.on_host_table_created, - on_header_created: ywl.on_host_table_header_created - - // 可重载的函数(在on_created回调函数中重载) - // on_render_created - // on_header_created - // on_paging_created - // on_data_loaded - // on_row_rendered - // on_table_rendered - // on_cell_created - // on_begin_load - // on_after_load - - // 可用的函数 - // load_data - // cancel_load - // set_data - // add_row - // remove_row - // get_row - // update_row - // clear - // reset_filter - }; - - var host_table = ywl.create_table(host_table_options); - - $(dom_id + " [ywl-filter='reload']").click(host_table.reload); - - $("#delete-log").click(function () { - var log_list = []; - var _objs = $(host_table.selector + " tbody tr td [data-check-box]"); - $.each(_objs, function (i, _obj) { - if ($(_obj).is(':checked')) { - var _row_data = host_table.get_row(_obj); - log_list.push(_row_data.id); - } - }); - if (log_list.length === 0) { - ywl.notify_error('请选择要批量删除的日志'); - return; - } - ; - var _fn_sure = function (cb_stack, cb_args) { - ywl.ajax_post_json_time_out('/log/delete-log', {log_list: log_list},1000*30, - function (ret) { - host_table.reload(); - ywl.notify_success('操作成功'); - }, - function () { - ywl.notify_error('操作失败'); - } - ); - }; - var cb_stack = CALLBACK_STACK.create(); - - ywl.dlg_confirm(cb_stack, { - msg: '

    您确定要删除选定的日志吗?此操作不可恢复!!

    ', - fn_yes: _fn_sure - }); - }); - - ywl.create_table_filter_user_list(host_table, dom_id + " [ywl-filter='user-name']"); - - ywl.create_table_filter_search_box(host_table, dom_id + " [ywl-filter='search']"); - - cb_stack - .add(host_table.load_data) - .add(host_table.init) - .exec(); -}; -ywl.on_host_table_header_created = function (tbl) { - $('#host-select-all').click(function () { - var _is_selected = $(this).is(':checked'); - $(tbl.selector + ' tbody').find('[data-check-box]').prop('checked', _is_selected); - }); -}; -// 扩展/重载表格的功能 -ywl.on_host_table_created = function (tbl) { - - tbl.on_cell_created = function (row_id, col_key, cell_obj) { - if (col_key == 'select_all') { - // 选择 - $('#host-select-' + row_id).click(function () { - var _all_checked = true; - var _objs = $(tbl.selector + ' tbody').find('[data-check-box]'); - $.each(_objs, function (i, _obj) { - if (!$(_obj).is(':checked')) { - _all_checked = false; - return false; - } - }); - - var select_all_dom = $('#host-select-all'); - if (_all_checked) { - select_all_dom.prop('checked', true); - } else { - select_all_dom.prop('checked', false); - } - - //ywl.update_add_to_batch_btn(); - }); - - } else if (col_key === 'action') { - var row_data = tbl.get_row(row_id); - var protocol = parseInt(row_data.protocol); - - if (protocol === PROTOCOL_TYPE_RDP) { - $(cell_obj).find('[ywl-btn-record]').click(function () { - var ip = window.location.hostname; - var port = parseInt(window.location.port); - var url = 'http://' + ip + ':' + port + '/log/replay/rdp/' + row_data.id; - var tail = 'log/replay/rdp/' + prefixInteger(row_data.id, 6); - var args = {}; - args.id = parseInt(row_data.id); - args.host = ip; - args.port = port; - args.tail = tail; - args.url = url; - start_rdp_replay(args, - function () { - ywl.notify_success('RDP 录像播放器成功启动!'); - }, - function (code, msg) { - if (code === TPE_NO_ASSIST) - g_assist.alert_assist_not_found(); - else { - ywl.notify_error(msg); - console.log('error:', msg) - } - }); - }); - } - else if (protocol === PROTOCOL_TYPE_SSH) { - $(cell_obj).find('[ywl-btn-record]').click(function () { - window.open('/log/record/' + parseInt(row_data.protocol) + '/' + row_data.id); - }); - - $(cell_obj).find('[ywl-btn-log]').click(function () { - window.open('/log/command-log/' + parseInt(row_data.protocol) + '/' + row_data.id); - }); - } - } - }; - - // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作f成功 - tbl.on_render_created = function (render) { - render.ret_code = function (row_id, fields) { - var msg = ''; - switch (fields.ret_code) { - case 0: - return '使用中' -// return '-'; - case 9999: - return '成功'; - case 1: - msg = '认证失败'; - break; - case 2: - msg = '连接失败'; - break; - case 3: - msg = '私钥错误'; - break; - case 4: - msg = '内部错误'; - break; - case 5: - msg = '协议不支持'; - break; - case 6: - msg = '通讯错误'; - break; - case 7: - msg = '错误重置'; - break; - default: - //return '' + fields.ret_code + ''; - msg = fields.ret_code; - } - - return '' + msg + ''; - -// if (fields.ret_code == 0) { -// -// } else if (fields.ret_code == 9999) { -// return '成功'; -// } else { -// return '' + fields.ret_code + ''; -// } - - }; - render.begin_time = function (row_id, fields) { - return '' + format_datetime(utc_to_local(fields.begin_time)) + ' '; - }; - - render.cost_time = function (row_id, fields) { - if (fields.ret_code == 0) { - return '使用中'; - } else { - return '' + second2str(fields.cost_time) + ''; - } - }; - render.server_info = function (row_id, fields) { - //return '' + fields.host_ip + ':' + fields.host_port + ''; - return '' + fields.host_ip + ':' + fields.host_port + ''; - }; -// render.auth_type = function (row_id, fields) { -// switch (fields.auth_type) { -// case 0: -// return '无认证'; -// case 1: -// return '用户名/密码'; -// case 2: -// return 'SSH密钥'; -// default: -// return '未知'; -// } -// }; - render.protocol = function (row_id, fields) { - switch (fields.protocol) { - case 1: - return 'RDP'; - case 2: - return 'SSH'; - case 3: - return 'TELNET'; - default: - return '未知'; - } - }; - - render.make_check_box = function (row_id, fields) { - return ''; - }; - - - render.make_action_btn = function (row_id, fields) { - var ret = []; - if (fields.protocol === PROTOCOL_TYPE_RDP) { - ret.push('录像查看 '); - } else if (fields.protocol === PROTOCOL_TYPE_SSH) { - if (fields.ret_code === 9999 && fields.cost_time > 0) { - ret.push('录像查看 '); - ret.push('日志查看 '); - } - } - - return ret.join(''); - } - }; -}; - -ywl.create_table_filter_user_list = function (tbl, selector, on_created) { - var _tblf_st = {}; - - // 此表格绑定的DOM对象的ID,用于JQuery的选择器 - _tblf_st.selector = selector; - // 此过滤器绑定的表格控件 - _tblf_st._table_ctrl = tbl; - _tblf_st._table_ctrl.append_filter_ctrl(_tblf_st); - - // 过滤器内容 - _tblf_st.filter_name = 'user_name'; - _tblf_st.filter_default = '全部'; - _tblf_st.filter_value = ''; - - _tblf_st.get_filter = function () { - var _ret = {}; - _ret[_tblf_st.filter_name] = _tblf_st.filter_value; - return _ret; - }; - - _tblf_st.reset = function (cb_stack, cb_args) { - if (_tblf_st.filter_value == _tblf_st.filter_default) { - cb_stack.exec(); - return; - } - - cb_stack - .add(function (cb_stack) { - _tblf_st.filter_value = _tblf_st.filter_default; - $(_tblf_st.selector + ' button span:first').html(_tblf_st.filter_value); - cb_stack.exec(); - }); - }; - - _tblf_st.init = function (cb_stack) { - var node = ''; - var user_list = ywl.page_options.user_list; - node += '
  • 全部
  • '; - node += ''; - $.each(user_list, function (i, g) { - node += '
  • ' + g.user_name + '
  • '; - }); - - _tblf_st.filter_value = _tblf_st.filter_default; - $(_tblf_st.selector + ' button span:first').html(_tblf_st.filter_value); - $(_tblf_st.selector + ' ul').empty().append($(node)); - - // 点击事件绑定 - $(_tblf_st.selector + ' ul [ywl-user-id]').click(_tblf_st._on_select); - - if (_.isFunction(on_created)) { - on_created(_tblf_st); - } - - cb_stack.exec(); - }; - - _tblf_st._on_select = function () { - var user_name = $(this).html(); - - var cb_stack = CALLBACK_STACK.create(); - cb_stack - .add(_tblf_st._table_ctrl.load_data) - .add(function (cb_stack) { - _tblf_st.filter_value = user_name; - $(_tblf_st.selector + ' button span:first').html(user_name); - cb_stack.exec(); - }); - cb_stack.exec(); - }; - - return _tblf_st; -}; +"use strict"; + +ywl.on_init = function (cb_stack, cb_args) { + var dom_id = '#ywl_log_list'; + + //=================================== + // 创建页面控件对象 + //=================================== + // 表格数据 + var disk_rate = parseInt(ywl.page_options.free_size * 100 / ywl.page_options.total_size); + $('#disk-status').text('日志磁盘大小:' + size2str(ywl.page_options.total_size, 2) + ',剩余空间:' + size2str(ywl.page_options.free_size, 2) + ',空闲' + disk_rate + '%'); + if (disk_rate < 10) { + $('#disk-status').removeClass().addClass('badge badge-danger'); + } else if (disk_rate < 30) { + $('#disk-status').removeClass().addClass('badge badge-warning'); + } else { + $('#disk-status').removeClass().addClass('badge badge-ignore'); + } + + var host_table_options = { + selector: dom_id + " [ywl-table='log-list']", + data_source: { + type: 'ajax-post', + url: '/log/list' + }, + column_default: {sort: false, header_align: 'center', cell_align: 'center'}, + columns: [ + { + title: '', + key: 'select_all', + sort: false, + width: 24, + render: 'make_check_box', + fields: {id: 'id'} + }, + {title: "ID", key: "id"}, + {title: "操作者", key: "account_name"}, + {title: "系统用户", key: "user_name"}, + {title: "协议", key: "protocol", render: 'protocol', fields: {protocol: 'protocol'}}, + {title: "系统", key: "sys_type", width: 40, render: 'sys_type', fields: {sys_type: 'sys_type'}}, + {title: "远程主机地址", key: "host_ip", render: 'server_info', fields: {host_ip: 'host_ip', host_port: 'host_port'}}, + {title: "开始时间", key: "begin_time", width: 160, render: 'begin_time', fields: {begin_time: 'begin_time'}}, + {title: "耗时", key: "cost_time", render: 'cost_time', fields: {cost_time: 'cost_time', ret_code: 'ret_code'}}, + {title: "状态", key: "ret_code", render: 'ret_code', fields: {ret_code: 'ret_code'}}, + { + title: "操作", + key: "action", + width: 160, + header_align: 'left', cell_align: 'left', + render: 'make_action_btn', + fields: {ID: 'id', ret_code: 'ret_code', sys_type: 'sys_type', cost_time: 'cost_time', protocol: 'protocol'} + } + ], + paging: {selector: dom_id + " [ywl-paging='log-list']", per_page: paging_normal}, + + // 可用的属性设置 + //have_header: true or false + + // 可用的回调函数 + on_created: ywl.on_host_table_created, + on_header_created: ywl.on_host_table_header_created + + // 可重载的函数(在on_created回调函数中重载) + // on_render_created + // on_header_created + // on_paging_created + // on_data_loaded + // on_row_rendered + // on_table_rendered + // on_cell_created + // on_begin_load + // on_after_load + + // 可用的函数 + // load_data + // cancel_load + // set_data + // add_row + // remove_row + // get_row + // update_row + // clear + // reset_filter + }; + + var host_table = ywl.create_table(host_table_options); + + $(dom_id + " [ywl-filter='reload']").click(host_table.reload); + + $("#delete-log").click(function () { + var log_list = []; + var _objs = $(host_table.selector + " tbody tr td [data-check-box]"); + $.each(_objs, function (i, _obj) { + if ($(_obj).is(':checked')) { + var _row_data = host_table.get_row(_obj); + log_list.push(_row_data.id); + } + }); + + if (log_list.length === 0) { + ywl.notify_error('请选择要批量删除的日志!'); + return; + } + + var _fn_sure = function (cb_stack, cb_args) { + ywl.ajax_post_json_time_out('/log/delete-log', {log_list: log_list}, 1000 * 30, + function (ret) { + if (ret.code === TPE_OK) { + host_table.reload(); + ywl.notify_success('删除日志成功!'); + } else { + ywl.notify_error('删除日志失败!'); + } + }, + function () { + ywl.notify_error('网络故障,删除日志失败!'); + } + ); + }; + var cb_stack = CALLBACK_STACK.create(); + + ywl.dlg_confirm(cb_stack, { + msg: '

    您确定要删除选定的日志吗?此操作不可恢复!!

    ', + fn_yes: _fn_sure + }); + }); + + ywl.create_table_filter_user_list(host_table, dom_id + " [ywl-filter='user-name']"); + + ywl.create_table_filter_search_box(host_table, dom_id + " [ywl-filter='search']"); + + cb_stack + .add(host_table.load_data) + .add(host_table.init) + .exec(); +}; +ywl.on_host_table_header_created = function (tbl) { + $('#host-select-all').click(function () { + var _is_selected = $(this).is(':checked'); + $(tbl.selector + ' tbody').find('[data-check-box]').prop('checked', _is_selected); + }); +}; +// 扩展/重载表格的功能 +ywl.on_host_table_created = function (tbl) { + + tbl.on_cell_created = function (row_id, col_key, cell_obj) { + if (col_key === 'select_all') { + // 选择 + $('#host-select-' + row_id).click(function () { + var _all_checked = true; + var _objs = $(tbl.selector + ' tbody').find('[data-check-box]'); + $.each(_objs, function (i, _obj) { + if (!$(_obj).is(':checked')) { + _all_checked = false; + return false; + } + }); + + var select_all_dom = $('#host-select-all'); + if (_all_checked) { + select_all_dom.prop('checked', true); + } else { + select_all_dom.prop('checked', false); + } + + //ywl.update_add_to_batch_btn(); + }); + + } else if (col_key === 'action') { + var row_data = tbl.get_row(row_id); + var protocol = parseInt(row_data.protocol); + + if (protocol === PROTOCOL_TYPE_RDP) { + $(cell_obj).find('[ywl-btn-record]').click(function () { + var ip = window.location.hostname; + var port = parseInt(window.location.port); + var url = 'http://' + ip + ':' + port + '/log/replay/rdp/' + row_data.id; + var tail = 'log/replay/rdp/' + prefixInteger(row_data.id, 6); + var args = {}; + args.id = parseInt(row_data.id); + args.host = ip; + args.port = port; + args.tail = tail; + args.url = url; + start_rdp_replay(args, + function () { + ywl.notify_success('RDP 录像播放器成功启动!'); + }, + function (code, msg) { + if (code === TPE_NO_ASSIST) + g_assist.alert_assist_not_found(); + else { + ywl.notify_error(msg); + console.log('error:', msg) + } + }); + }); + } + else if (protocol === PROTOCOL_TYPE_SSH) { + $(cell_obj).find('[ywl-btn-record]').click(function () { + window.open('/log/record/' + parseInt(row_data.protocol) + '/' + row_data.id); + }); + + $(cell_obj).find('[ywl-btn-log]').click(function () { + window.open('/log/command-log/' + parseInt(row_data.protocol) + '/' + row_data.id); + }); + } + } + }; + + // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作f成功 + tbl.on_render_created = function (render) { + render.ret_code = function (row_id, fields) { + var msg = ''; + switch (fields.ret_code) { + case 0: + return '使用中' + case 9999: + return '成功'; + case 1: + msg = '认证失败'; + break; + case 2: + msg = '连接失败'; + break; + case 3: + msg = '私钥错误'; + break; + case 4: + msg = '内部错误'; + break; + case 5: + msg = '协议不支持'; + break; + case 6: + msg = '通讯错误'; + break; + case 7: + msg = '错误重置'; + break; + default: + msg = fields.ret_code; + } + + return '' + msg + ''; + }; + render.begin_time = function (row_id, fields) { + return '' + format_datetime(utc_to_local(fields.begin_time)) + ' '; + }; + + render.cost_time = function (row_id, fields) { + if (fields.ret_code === 0) { + return '使用中'; + } else { + return '' + second2str(fields.cost_time) + ''; + } + }; + render.server_info = function (row_id, fields) { + //return '' + fields.host_ip + ':' + fields.host_port + ''; + return '' + fields.host_ip + ':' + fields.host_port + ''; + }; + + render.protocol = function (row_id, fields) { + switch (fields.protocol) { + case 1: + return 'RDP'; + case 2: + return 'SSH'; + case 3: + return 'TELNET'; + default: + return '未知'; + } + }; + + render.make_check_box = function (row_id, fields) { + return ''; + }; + + + render.make_action_btn = function (row_id, fields) { + var ret = []; + if (fields.protocol === PROTOCOL_TYPE_RDP) { + ret.push('录像查看 '); + } else if (fields.protocol === PROTOCOL_TYPE_SSH) { + if (fields.ret_code === 9999 && fields.cost_time > 0) { + ret.push('录像查看 '); + ret.push('日志查看 '); + } + } + + return ret.join(''); + } + }; +}; + +ywl.create_table_filter_user_list = function (tbl, selector, on_created) { + var _tblf_st = {}; + + // 此表格绑定的DOM对象的ID,用于JQuery的选择器 + _tblf_st.selector = selector; + // 此过滤器绑定的表格控件 + _tblf_st._table_ctrl = tbl; + _tblf_st._table_ctrl.append_filter_ctrl(_tblf_st); + + // 过滤器内容 + _tblf_st.filter_name = 'user_name'; + _tblf_st.filter_default = '全部'; + _tblf_st.filter_value = ''; + + _tblf_st.get_filter = function () { + var _ret = {}; + _ret[_tblf_st.filter_name] = _tblf_st.filter_value; + return _ret; + }; + + _tblf_st.reset = function (cb_stack, cb_args) { + if (_tblf_st.filter_value === _tblf_st.filter_default) { + cb_stack.exec(); + return; + } + + cb_stack + .add(function (cb_stack) { + _tblf_st.filter_value = _tblf_st.filter_default; + $(_tblf_st.selector + ' button span:first').html(_tblf_st.filter_value); + cb_stack.exec(); + }); + }; + + _tblf_st.init = function (cb_stack) { + var node = ''; + var user_list = ywl.page_options.user_list; + node += '
  • 全部
  • '; + node += ''; + $.each(user_list, function (i, g) { + node += '
  • ' + g.user_name + '
  • '; + }); + + _tblf_st.filter_value = _tblf_st.filter_default; + $(_tblf_st.selector + ' button span:first').html(_tblf_st.filter_value); + $(_tblf_st.selector + ' ul').empty().append($(node)); + + // 点击事件绑定 + $(_tblf_st.selector + ' ul [ywl-user-id]').click(_tblf_st._on_select); + + if (_.isFunction(on_created)) { + on_created(_tblf_st); + } + + cb_stack.exec(); + }; + + _tblf_st._on_select = function () { + var user_name = $(this).html(); + + var cb_stack = CALLBACK_STACK.create(); + cb_stack + .add(_tblf_st._table_ctrl.load_data) + .add(function (cb_stack) { + _tblf_st.filter_value = user_name; + $(_tblf_st.selector + ' button span:first').html(user_name); + cb_stack.exec(); + }); + cb_stack.exec(); + }; + + return _tblf_st; +}; diff --git a/server/www/teleport/static/js/ui/pwd.js b/server/www/teleport/static/js/ui/pwd.js index 9da6f19..0f84e72 100644 --- a/server/www/teleport/static/js/ui/pwd.js +++ b/server/www/teleport/static/js/ui/pwd.js @@ -27,13 +27,13 @@ ywl.on_init = function (cb_stack, cb_args) { } ywl.ajax_post_json('/auth/modify-pwd', {o_pwd: old_pwd, n_pwd: new_pwd_1, callback: 1}, function (ret) { - if (ret.code == 0) { + if (ret.code === TPE_OK) { ywl.notify_success('密码修改成功!'); ywl.clear_input(); - } else if (ret.code == -2) { + } else if (ret.code === -101) { ywl.notify_error('密码错误!'); } else { - ywl.notify_error('密码修改失败!errcode:'+ret.code); + ywl.notify_error('密码修改失败:'+ret.message); } }, diff --git a/server/www/teleport/static/js/ui/user.js b/server/www/teleport/static/js/ui/user.js index d814a6b..23a1345 100644 --- a/server/www/teleport/static/js/ui/user.js +++ b/server/www/teleport/static/js/ui/user.js @@ -5,302 +5,314 @@ var g_user_dlg_info = null; ywl.on_init = function (cb_stack, cb_args) { - var dom_id = '#ywl_user_list'; + var dom_id = '#ywl_user_list'; - //=================================== - // 创建页面控件对象 - //=================================== - // 表格数据 - var host_table_options = { - selector: dom_id + " [ywl-table='user-list']", - data_source: { - type: 'ajax-post', - url: '/user/list' - }, - column_default: {sort: false, header_align: 'center', cell_align: 'center'}, - columns: [ - {title: "用户ID", key: "user_id", width: 80}, - {title: "用户名", key: "user_name", width: 200}, - {title: "用户描述", key: "user_desc"}, - {title: "状态", key: "user_lock", width: 200, render: 'user_lock', fields: {user_lock: 'user_lock'}}, - {title: "操作", key: "action", width: 380, render: 'make_action_btn', fields: {user_id: 'user_id', user_lock: 'user_lock'}} - ], - paging: {selector: dom_id + " [ywl-paging='user-list']", per_page: paging_normal}, + //=================================== + // 创建页面控件对象 + //=================================== + // 表格数据 + var host_table_options = { + selector: dom_id + " [ywl-table='user-list']", + data_source: { + type: 'ajax-post', + url: '/user/list' + }, + column_default: {sort: false, header_align: 'center', cell_align: 'center'}, + columns: [ + {title: "用户ID", key: "user_id", width: 80}, + {title: "用户名", key: "user_name", width: 200}, + {title: "用户描述", key: "user_desc"}, + {title: "状态", key: "user_lock", width: 200, render: 'user_lock', fields: {user_lock: 'user_lock'}}, + {title: "操作", key: "action", width: 380, render: 'make_action_btn', fields: {user_id: 'user_id', user_lock: 'user_lock'}} + ], + paging: {selector: dom_id + " [ywl-paging='user-list']", per_page: paging_normal}, - // 可用的属性设置 - //have_header: true or false + // 可用的属性设置 + //have_header: true or false - // 可用的回调函数 - on_created: ywl.on_host_table_created, - on_header_created: ywl.on_host_table_header_created + // 可用的回调函数 + on_created: ywl.on_host_table_created, + on_header_created: ywl.on_host_table_header_created - // 可重载的函数(在on_created回调函数中重载) - // on_render_created - // on_header_created - // on_paging_created - // on_data_loaded - // on_row_rendered - // on_table_rendered - // on_cell_created - // on_begin_load - // on_after_load + // 可重载的函数(在on_created回调函数中重载) + // on_render_created + // on_header_created + // on_paging_created + // on_data_loaded + // on_row_rendered + // on_table_rendered + // on_cell_created + // on_begin_load + // on_after_load - // 可用的函数 - // load_data - // cancel_load - // set_data - // add_row - // remove_row - // get_row - // update_row - // clear - // reset_filter - }; + // 可用的函数 + // load_data + // cancel_load + // set_data + // add_row + // remove_row + // get_row + // update_row + // clear + // reset_filter + }; - var host_table = ywl.create_table(host_table_options); - g_user_dlg_info = ywl.create_user_info_dlg(host_table); + var host_table = ywl.create_table(host_table_options); + g_user_dlg_info = ywl.create_user_info_dlg(host_table); - $(dom_id + " [ywl-filter='reload']").click(host_table.reload); - $("#btn-add-user").click(function () { - g_user_dlg_info.create_show(); - }); - cb_stack - .add(host_table.load_data) - .add(host_table.init) - .exec(); + $(dom_id + " [ywl-filter='reload']").click(host_table.reload); + $("#btn-add-user").click(function () { + g_user_dlg_info.create_show(); + }); + cb_stack + .add(host_table.load_data) + .add(host_table.init) + .exec(); }; // 扩展/重载表格的功能 ywl.on_host_table_created = function (tbl) { - tbl.on_cell_created = function (row_id, col_key, cell_obj) { - if (col_key == 'action') { - var row_data = tbl.get_row(row_id); - //console.log('row_data', row_data); - $(cell_obj).find('[ywl-btn-edit]').click(function () { - g_user_dlg_info.update_show(row_data.user_name, row_data.user_desc, row_data.user_id, row_id); - }); + tbl.on_cell_created = function (row_id, col_key, cell_obj) { + if (col_key === 'action') { + var row_data = tbl.get_row(row_id); + //console.log('row_data', row_data); + $(cell_obj).find('[ywl-btn-edit]').click(function () { + g_user_dlg_info.update_show(row_data.user_name, row_data.user_desc, row_data.user_id, row_id); + }); - $(cell_obj).find('[ywl-btn-reset]').click(function () { - var user_id = row_data.user_id; - //var user_lock = row_data.user_lock; - var message = '此操作将用户密码重置为默认密码 123456,确定要执行吗?

    提示:密码重置后,请通知用户立即修改默认密码!'; - var _fn_sure = function (cb_stack, cb_args) { - ywl.ajax_post_json('/user/reset-user', {user_id: user_id}, - function (ret) { - ywl.notify_success('操作成功!'); - }, - function () { - ywl.notify_error('操作失败!'); - } - ); - }; - var cb_stack = CALLBACK_STACK.create(); + $(cell_obj).find('[ywl-btn-reset]').click(function () { + var user_id = row_data.user_id; + //var user_lock = row_data.user_lock; + var message = '此操作将用户密码重置为默认密码 123456,确定要执行吗?

    提示:密码重置后,请通知用户立即修改默认密码!'; + var _fn_sure = function (cb_stack, cb_args) { + ywl.ajax_post_json('/user/reset-user', {user_id: user_id}, + function (ret) { + if (ret.code === TPE_OK) { + ywl.notify_success('重置用户密码操作成功!'); + } else { + ywl.notify_error('重置用户密码操作失败!'); + } + }, + function () { + ywl.notify_error('网络故障,重置用户密码操作失败!'); + } + ); + }; + var cb_stack = CALLBACK_STACK.create(); - ywl.dlg_confirm(cb_stack, - { - msg: '

    ' + message + '

    ', - fn_yes: _fn_sure - }); - }); + ywl.dlg_confirm(cb_stack, + { + msg: '

    ' + message + '

    ', + fn_yes: _fn_sure + }); + }); - $(cell_obj).find('[ywl-btn-lock]').click(function () { - var user_id = row_data.user_id; - var user_lock = row_data.user_lock; - var message = ''; - if (user_lock === 0) { - user_lock = 1; - message = '被锁定的用户将无法登陆系统,确认要锁定该用户吗?'; - } else { - user_lock = 0; - message = '确认要解锁该用户吗?'; - } - var _fn_sure = function (cb_stack, cb_args) { - ywl.ajax_post_json('/user/lock-user', {user_id: user_id, lock_status: user_lock}, - function (ret) { - var update_args = {user_lock: user_lock}; - tbl.update_row(row_id, update_args); - ywl.notify_success('操作成功!'); - }, - function () { - ywl.notify_error('操作失败!'); - } - ); - }; - var cb_stack = CALLBACK_STACK.create(); + $(cell_obj).find('[ywl-btn-lock]').click(function () { + var user_id = row_data.user_id; + var user_lock = row_data.user_lock; + var message = ''; + if (user_lock === 0) { + user_lock = 1; + message = '被锁定的用户将无法登陆系统,确认要锁定该用户吗?'; + } else { + user_lock = 0; + message = '确认要解锁该用户吗?'; + } + var _fn_sure = function (cb_stack, cb_args) { + ywl.ajax_post_json('/user/lock-user', {user_id: user_id, lock_status: user_lock}, + function (ret) { + if (ret.code === TPE_OK) { + var update_args = {user_lock: user_lock}; + tbl.update_row(row_id, update_args); + ywl.notify_success('操作成功!'); + } else { + ywl.notify_error('操作失败!'); + } + }, + function () { + ywl.notify_error('网络故障,操作失败!'); + } + ); + }; + var cb_stack = CALLBACK_STACK.create(); - ywl.dlg_confirm(cb_stack, - { - msg: '

    ' + message + '

    ', - fn_yes: _fn_sure - }); + ywl.dlg_confirm(cb_stack, + { + msg: '

    ' + message + '

    ', + fn_yes: _fn_sure + }); - }); + }); - $(cell_obj).find('[ywl-btn-delete]').click(function () { - var user_id = row_data.user_id; - var _fn_sure = function (cb_stack, cb_args) { - ywl.ajax_post_json('/user/delete-user', {user_id: user_id}, - function (ret) { - if (ret.code == 0) { - tbl.remove_row(row_id); - ywl.notify_success('删除用户成功!'); - } else { - ywl.notify_error('删除用户失败!'); - } + $(cell_obj).find('[ywl-btn-delete]').click(function () { + var user_id = row_data.user_id; + var _fn_sure = function (cb_stack, cb_args) { + ywl.ajax_post_json('/user/delete-user', {user_id: user_id}, + function (ret) { + if (ret.code === TPE_OK) { + tbl.remove_row(row_id); + ywl.notify_success('删除用户成功!'); + } else { + ywl.notify_error('删除用户失败:' + ret.message); + } - }, - function (ret) { - ywl.notify_error('删除用户失败!'); - } - ); - }; - var cb_stack = CALLBACK_STACK.create(); + }, + function () { + ywl.notify_error('网络故障,删除用户失败!'); + } + ); + }; + var cb_stack = CALLBACK_STACK.create(); - ywl.dlg_confirm(cb_stack, - { - msg: '

    注意:移除操作不可恢复!!

    您确定要删除此用户吗?

    ', - fn_yes: _fn_sure - }); + ywl.dlg_confirm(cb_stack, + { + msg: '

    注意:移除操作不可恢复!!

    您确定要删除此用户吗?

    ', + fn_yes: _fn_sure + }); - }); - $(cell_obj).find('[ywl-auth-allo]').click(function () { - window.open("/user/auth/" + row_data.user_name); - }); + }); + $(cell_obj).find('[ywl-auth-allo]').click(function () { + window.open("/user/auth/" + row_data.user_name); + }); - } - }; + } + }; - // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 - tbl.on_render_created = function (render) { - render.user_lock = function (row_id, fields) { - switch (fields.user_lock) { - case 0: - return '允许访问'; - case 1: - return '禁止访问'; - default: - return '未知'; - } - }; - render.make_action_btn = function (row_id, fields) { - var ret = []; - ret.push('
    '); + // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 + tbl.on_render_created = function (render) { + render.user_lock = function (row_id, fields) { + switch (fields.user_lock) { + case 0: + return '允许访问'; + case 1: + return '禁止访问'; + default: + return '未知'; + } + }; + render.make_action_btn = function (row_id, fields) { + var ret = []; + ret.push('
    '); - ret.push(' 授权'); + ret.push(' 授权'); - ret.push('
     
    '); + ret.push('
     
    '); - ret.push(' 编辑'); - ret.push(' 重置密码'); + ret.push(' 编辑'); + ret.push(' 重置密码'); - ret.push('
     
    '); - if (fields.user_lock === 0) - ret.push(' 锁定'); - else - ret.push(' 解锁'); + ret.push('
     
    '); + if (fields.user_lock === 0) + ret.push(' 锁定'); + else + ret.push(' 解锁'); - ret.push(' 移除'); - ret.push('
    '); - return ret.join(''); - } + ret.push(' 移除'); + ret.push('
    '); + return ret.join(''); + } - }; + }; }; ywl.on_host_table_header_created = function (tbl) { }; ywl.create_user_info_dlg = function (tbl) { - var user_info_dlg = {}; - user_info_dlg.dom_id = "#dialog_user_info"; - user_info_dlg.update = 1; - user_info_dlg.tbl = tbl; - user_info_dlg.user_name = ''; - user_info_dlg.user_id = 0; - user_info_dlg.row_id = 0; - user_info_dlg.user_desc = ''; + var user_info_dlg = {}; + user_info_dlg.dom_id = "#dialog_user_info"; + user_info_dlg.update = 1; + user_info_dlg.tbl = tbl; + user_info_dlg.user_name = ''; + user_info_dlg.user_id = 0; + user_info_dlg.row_id = 0; + user_info_dlg.user_desc = ''; - user_info_dlg.update_show = function (user_name, user_desc, user_id, row_id) { - user_info_dlg.update = 1; - user_info_dlg.init(user_name, user_desc, user_id, row_id); - $('#dlg-notice').hide(); - $(user_info_dlg.dom_id).modal(); - }; - user_info_dlg.create_show = function () { - user_info_dlg.update = 0; - user_info_dlg.init('', '', 0, 0); - $('#dlg-notice').show(); - $(user_info_dlg.dom_id).modal(); - }; + user_info_dlg.update_show = function (user_name, user_desc, user_id, row_id) { + user_info_dlg.update = 1; + user_info_dlg.init(user_name, user_desc, user_id, row_id); + $('#dlg-notice').hide(); + $(user_info_dlg.dom_id).modal(); + }; + user_info_dlg.create_show = function () { + user_info_dlg.update = 0; + user_info_dlg.init('', '', 0, 0); + $('#dlg-notice').show(); + $(user_info_dlg.dom_id).modal(); + }; - user_info_dlg.hide = function() { - $(user_info_dlg.dom_id).modal('hide'); - }; + user_info_dlg.hide = function () { + $(user_info_dlg.dom_id).modal('hide'); + }; - user_info_dlg.init = function (user_name, user_desc, user_id, row_id) { - user_info_dlg.user_name = user_name; - user_info_dlg.user_desc = user_desc; - user_info_dlg.user_id = user_id; - user_info_dlg.row_id = row_id; - user_info_dlg.init_dlg(); - }; - user_info_dlg.init_dlg = function () { - $(user_info_dlg.dom_id + ' #user-name').val(user_info_dlg.user_name); - $(user_info_dlg.dom_id + ' #user-desc').val(user_info_dlg.user_desc); - if (user_info_dlg.update === 1) { - $(user_info_dlg.dom_id + ' #user-name').attr("disabled", "true"); - } else { - $(user_info_dlg.dom_id + ' #user-name').removeAttr("disabled"); - } + user_info_dlg.init = function (user_name, user_desc, user_id, row_id) { + user_info_dlg.user_name = user_name; + user_info_dlg.user_desc = user_desc; + user_info_dlg.user_id = user_id; + user_info_dlg.row_id = row_id; + user_info_dlg.init_dlg(); + }; + user_info_dlg.init_dlg = function () { + $(user_info_dlg.dom_id + ' #user-name').val(user_info_dlg.user_name); + $(user_info_dlg.dom_id + ' #user-desc').val(user_info_dlg.user_desc); + if (user_info_dlg.update === 1) { + $(user_info_dlg.dom_id + ' #user-name').attr("disabled", "true"); + } else { + $(user_info_dlg.dom_id + ' #user-name').removeAttr("disabled"); + } - }; + }; - user_info_dlg.check_args = function () { - user_info_dlg.user_name = $(user_info_dlg.dom_id + ' #user-name').val(); - user_info_dlg.user_desc = $(user_info_dlg.dom_id + ' #user-desc').val(); - return true; - }; - user_info_dlg.post = function () { - if (user_info_dlg.update == 1) { - ywl.ajax_post_json('/user/modify-user', {user_id: user_info_dlg.user_id, user_desc: user_info_dlg.user_desc}, - function (ret) { - var update_args = {user_desc: user_info_dlg.user_desc}; - user_info_dlg.tbl.update_row(user_info_dlg.row_id, update_args); - ywl.notify_success('更新用户信息成功!'); - user_info_dlg.hide(); - }, - function (ret) { - ywl.notify_error('更新用户信息失败!'); - } - ); - } else { - ywl.ajax_post_json('/user/add-user', {user_name: user_info_dlg.user_name, user_desc: user_info_dlg.user_desc}, - function (ret) { - if (ret.code === 0) { - user_info_dlg.tbl.reload(); - ywl.notify_success('添加用户成功!'); - user_info_dlg.hide(); - } else if (ret.code == -2) { - ywl.notify_error('已经存在同名用户!'); - } else { - ywl.notify_error('添加用户失败!'); - } - }, - function (ret) { - ywl.notify_error('添加用户失败!'); - } - ); - } - return true; - }; - $(user_info_dlg.dom_id + " #btn-save").click(function () { - if (!user_info_dlg.check_args()) { - return; - } - user_info_dlg.post(); - }); - return user_info_dlg + user_info_dlg.check_args = function () { + user_info_dlg.user_name = $(user_info_dlg.dom_id + ' #user-name').val(); + user_info_dlg.user_desc = $(user_info_dlg.dom_id + ' #user-desc').val(); + return true; + }; + user_info_dlg.post = function () { + if (user_info_dlg.update === 1) { + ywl.ajax_post_json('/user/modify-user', {user_id: user_info_dlg.user_id, user_desc: user_info_dlg.user_desc}, + function (ret) { + if (ret.code === TPE_OK) { + var update_args = {user_desc: user_info_dlg.user_desc}; + user_info_dlg.tbl.update_row(user_info_dlg.row_id, update_args); + ywl.notify_success('更新用户信息成功!'); + user_info_dlg.hide(); + } else { + ywl.notify_error('更新用户信息失败:' + ret.message); + } + }, + function () { + ywl.notify_error('网络故障,更新用户信息失败!'); + } + ); + } else { + ywl.ajax_post_json('/user/add-user', {user_name: user_info_dlg.user_name, user_desc: user_info_dlg.user_desc}, + function (ret) { + if (ret.code === TPE_OK) { + user_info_dlg.tbl.reload(); + ywl.notify_success('添加用户成功!'); + user_info_dlg.hide(); + } else if (ret.code === -100) { + ywl.notify_error('已经存在同名用户!'); + } else { + ywl.notify_error('添加用户失败:' + ret.message); + } + }, + function () { + ywl.notify_error('网络故障,添加用户失败!'); + } + ); + } + return true; + }; + $(user_info_dlg.dom_id + " #btn-save").click(function () { + if (!user_info_dlg.check_args()) { + return; + } + user_info_dlg.post(); + }); + return user_info_dlg }; diff --git a/server/www/teleport/static/js/ywl_const.js b/server/www/teleport/static/js/ywl_const.js index 9b793c1..0632028 100644 --- a/server/www/teleport/static/js/ywl_const.js +++ b/server/www/teleport/static/js/ywl_const.js @@ -1,166 +1,167 @@ -"use strict"; - -var PROTOCOL_TYPE_RDP = 1; -var PROTOCOL_TYPE_SSH = 2; -var PROTOCOL_TYPE_TELNET = 3; - -var OS_TYPE_WINDOWS = 1; -var OS_TYPE_LINUX = 2; -var AUTH_TYPE_PASSWORD = 1; -var AUTH_TYPE_SSHKEY = 2; -var AUTH_NONE = 0; - - -//var USER_TYPE_TEAM_MEMBER = 1; -//var USER_TYPE_TEAM_LEADER = 9; -//var USER_TYPE_SYS_ADMIN = 99; - -//var AGENT_STAT_ONLINE = 1; -//var AGENT_STAT_OFFLINE = 0; -//var AGENT_STAT_NOT_ACTIVE = 2; - -var HOST_STAT_NOT_ACTIVE = 0; -var HOST_STAT_ACTIVE = 2; - - -var CACHE_TYPE_COMMAND = 1; -var CACHE_TYPE_TEAM_MEMBER = 2; -var CACHE_TYPE_TEAM = 3; -var CACHE_TYPE_COMMAND_VER = 4; -var CACHE_TYPE_GROUP = 5; -var CACHE_TYPE_COOKIE = 6; -var CACHE_TYPE_EVENT_CODE = 7; -var CACHE_TYPE_CONFIG = 8; - - -var KB = 1024; -var MB = 1048576; -var GB = 1073741824; -var TB = 1099511627776; -var PB = 1125899906842624; - -var SECONDS_PER_DAY = 86400; -var SECONDS_PER_HOUR = 3600; -var SECONDS_PER_MINUTE = 60; - - -var system_group = [ - {id: 0, name: '全部'}, - {id: -1}, - {id: 1, name: 'Windows'}, - {id: -1}, - {id: 2, name: 'Linux'} -]; - -var paging_normal = { - use_cookie: true, - default_select: '25', - selections: [ - {name: '10', val: 10}, - {name: "25", val: 25}, - {name: "50", val: 50}, - {name: "100", val: 100}] -}; - -var paging_big = { - use_cookie: false, - default_select: '100', - selections: [{name: "100", val: 100}] -}; - - -//======================================================== -// 错误值(请参考源代码/common/teleport/teleport_const.h) -//======================================================== -var TPE_OK = 0; - -//------------------------------------------------------- -// 通用错误值 -//------------------------------------------------------- -var TPE_NEED_MORE_DATA = 1; // 需要更多数据(不一定是错误) - - -// 100~299是通用错误值 - -var TPE_FAILED = 100; // 内部错误 -var TPE_NETWORK = 101; // 网络错误 - -// HTTP请求相关错误 -var TPE_HTTP_METHOD = 120; // 无效的请求方法(不是GET/POST等),或者错误的请求方法(例如需要POST,却使用GET方式请求) -var TPE_HTTP_URL_ENCODE = 121; // URL编码错误(无法解码) -//#define TPE_HTTP_URI 122 // 无效的URI - -var TPE_UNKNOWN_CMD = 124; // 未知的命令 -var TPE_JSON_FORMAT = 125; // 错误的JSON格式(需要JSON格式数据,但是却无法按JSON格式解码) -var TPE_PARAM = 126; // 参数错误 -var TPE_DATA = 127; // 数据错误 - - -// #define TPE_OPENFILE_ERROR 0x1007 // 无法打开文件 -// #define TPE_GETTEMPPATH_ERROR 0x1007 -var TPE_OPENFILE = 300; // 无法打开文件 - - -//------------------------------------------------------- -// 助手程序专用错误值 -//------------------------------------------------------- -var TPE_NO_ASSIST = 100000; // 未能检测到助手程序 -var TPE_OLD_ASSIST = 100001; // 助手程序版本太低 -var TPE_START_CLIENT = 100002; // 无法启动客户端程序(无法创建进程) - - -//------------------------------------------------------- -// 核心服务专用错误值 -//------------------------------------------------------- -var TPE_NO_CORE_SERVER = 200000; // 未能检测到核心服务 - - -function tp_error_msg(error_code) { - switch (error_code) { - case TPE_FAILED: - return '内部错误'; - case TPE_NETWORK: - return '网络错误'; - -//------------------------------------------------------- -// HTTP请求相关错误 -//------------------------------------------------------- - case TPE_HTTP_METHOD: - return '无效/错误的请求方法'; - case TPE_HTTP_URL_ENCODE: - return 'URL编码错误(无法解码)'; - - case TPE_UNKNOWN_CMD: - return '未知命令'; - case TPE_JSON_FORMAT: - return '错误的JSON格式数据'; - case TPE_PARAM: - return '参数错误'; - case TPE_DATA: - return '数据错误'; - - - case TPE_OPENFILE: - return '无法打开文件'; - -//------------------------------------------------------- -// 助手程序专用错误值 -//------------------------------------------------------- - case TPE_NO_ASSIST: - return '未能检测到助手程序'; - case TPE_OLD_ASSIST: - return '助手程序版本太低'; - case TPE_START_CLIENT: - return '无法启动客户端程序(无法创建进程)'; - -//------------------------------------------------------- -// 核心服务专用错误值 -//------------------------------------------------------- - case TPE_NO_CORE_SERVER: - return '未能检测到核心服务'; - - default: - return '未知错误'; - } -} - +"use strict"; + +var PROTOCOL_TYPE_RDP = 1; +var PROTOCOL_TYPE_SSH = 2; +var PROTOCOL_TYPE_TELNET = 3; + +var OS_TYPE_WINDOWS = 1; +var OS_TYPE_LINUX = 2; + +var AUTH_TYPE_PASSWORD = 1; +var AUTH_TYPE_SSHKEY = 2; +var AUTH_NONE = 0; + + +//var USER_TYPE_TEAM_MEMBER = 1; +//var USER_TYPE_TEAM_LEADER = 9; +//var USER_TYPE_SYS_ADMIN = 99; + +//var AGENT_STAT_ONLINE = 1; +//var AGENT_STAT_OFFLINE = 0; +//var AGENT_STAT_NOT_ACTIVE = 2; + +var HOST_STAT_NOT_ACTIVE = 0; +var HOST_STAT_ACTIVE = 2; + + +var CACHE_TYPE_COMMAND = 1; +var CACHE_TYPE_TEAM_MEMBER = 2; +var CACHE_TYPE_TEAM = 3; +var CACHE_TYPE_COMMAND_VER = 4; +var CACHE_TYPE_GROUP = 5; +var CACHE_TYPE_COOKIE = 6; +var CACHE_TYPE_EVENT_CODE = 7; +var CACHE_TYPE_CONFIG = 8; + + +var KB = 1024; +var MB = 1048576; +var GB = 1073741824; +var TB = 1099511627776; +var PB = 1125899906842624; + +var SECONDS_PER_DAY = 86400; +var SECONDS_PER_HOUR = 3600; +var SECONDS_PER_MINUTE = 60; + + +var system_group = [ + {id: 0, name: '全部'}, + {id: -1}, + {id: 1, name: 'Windows'}, + {id: -1}, + {id: 2, name: 'Linux'} +]; + +var paging_normal = { + use_cookie: true, + default_select: '25', + selections: [ + {name: '10', val: 10}, + {name: "25", val: 25}, + {name: "50", val: 50}, + {name: "100", val: 100}] +}; + +var paging_big = { + use_cookie: false, + default_select: '100', + selections: [{name: "100", val: 100}] +}; + + +//======================================================== +// 错误值(请参考源代码/common/teleport/teleport_const.h) +//======================================================== +var TPE_OK = 0; + +//------------------------------------------------------- +// 通用错误值 +//------------------------------------------------------- +var TPE_NEED_MORE_DATA = 1; // 需要更多数据(不一定是错误) + + +// 100~299是通用错误值 + +var TPE_FAILED = 100; // 内部错误 +var TPE_NETWORK = 101; // 网络错误 + +// HTTP请求相关错误 +var TPE_HTTP_METHOD = 120; // 无效的请求方法(不是GET/POST等),或者错误的请求方法(例如需要POST,却使用GET方式请求) +var TPE_HTTP_URL_ENCODE = 121; // URL编码错误(无法解码) +//#define TPE_HTTP_URI 122 // 无效的URI + +var TPE_UNKNOWN_CMD = 124; // 未知的命令 +var TPE_JSON_FORMAT = 125; // 错误的JSON格式(需要JSON格式数据,但是却无法按JSON格式解码) +var TPE_PARAM = 126; // 参数错误 +var TPE_DATA = 127; // 数据错误 + + +// #define TPE_OPENFILE_ERROR 0x1007 // 无法打开文件 +// #define TPE_GETTEMPPATH_ERROR 0x1007 +var TPE_OPENFILE = 300; // 无法打开文件 + + +//------------------------------------------------------- +// 助手程序专用错误值 +//------------------------------------------------------- +var TPE_NO_ASSIST = 100000; // 未能检测到助手程序 +var TPE_OLD_ASSIST = 100001; // 助手程序版本太低 +var TPE_START_CLIENT = 100002; // 无法启动客户端程序(无法创建进程) + + +//------------------------------------------------------- +// 核心服务专用错误值 +//------------------------------------------------------- +var TPE_NO_CORE_SERVER = 200000; // 未能检测到核心服务 + + +function tp_error_msg(error_code) { + switch (error_code) { + case TPE_FAILED: + return '内部错误'; + case TPE_NETWORK: + return '网络错误'; + +//------------------------------------------------------- +// HTTP请求相关错误 +//------------------------------------------------------- + case TPE_HTTP_METHOD: + return '无效/错误的请求方法'; + case TPE_HTTP_URL_ENCODE: + return 'URL编码错误(无法解码)'; + + case TPE_UNKNOWN_CMD: + return '未知命令'; + case TPE_JSON_FORMAT: + return '错误的JSON格式数据'; + case TPE_PARAM: + return '参数错误'; + case TPE_DATA: + return '数据错误'; + + + case TPE_OPENFILE: + return '无法打开文件'; + +//------------------------------------------------------- +// 助手程序专用错误值 +//------------------------------------------------------- + case TPE_NO_ASSIST: + return '未能检测到助手程序'; + case TPE_OLD_ASSIST: + return '助手程序版本太低'; + case TPE_START_CLIENT: + return '无法启动客户端程序(无法创建进程)'; + +//------------------------------------------------------- +// 核心服务专用错误值 +//------------------------------------------------------- + case TPE_NO_CORE_SERVER: + return '未能检测到核心服务'; + + default: + return '未知错误'; + } +} + diff --git a/server/www/teleport/view/maintenance/install.mako b/server/www/teleport/view/maintenance/install.mako index 7b2c8ad..4e42a06 100644 --- a/server/www/teleport/view/maintenance/install.mako +++ b/server/www/teleport/view/maintenance/install.mako @@ -1,186 +1,186 @@ -<%! - page_title_ = '配置TELEPORT服务' -%> -<%inherit file="../page_maintenance_base.mako"/> - -<%block name="breadcrumb"> - - - -<%block name="embed_css"> - - - -## Begin Main Body. - -
    - -
    -
    - -

    配置TELEPORT服务

    -
    - -

    第一步:创建数据表

    -
    -

    请选择要使用的数据库类型(暂时仅支持sqlite,其它类型开发中):

    -
    - -
    - -
    - -
    -
    - - - -
    -
    - -
    - - -<%block name="embed_js"> - - +<%! + page_title_ = '配置TELEPORT服务' +%> +<%inherit file="../page_maintenance_base.mako"/> + +<%block name="breadcrumb"> + + + +<%block name="embed_css"> + + + +## Begin Main Body. + +
    + +
    +
    + +

    配置TELEPORT服务

    +
    + +

    第一步:创建数据表

    +
    +

    请选择要使用的数据库类型(暂时仅支持sqlite,其它类型开发中):

    +
    + +
    + +
    + +
    +
    + + + +
    +
    + +
    + + +<%block name="embed_js"> + + From 79451a95ffbfa96fcdd715302fcf9bf40fa18024 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Sat, 29 Apr 2017 21:34:19 +0800 Subject: [PATCH 5/8] temp. --- .../www/teleport/static/js/ui/admin_host.js | 29 +++++-------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/server/www/teleport/static/js/ui/admin_host.js b/server/www/teleport/static/js/ui/admin_host.js index 57a8386..daa7a78 100644 --- a/server/www/teleport/static/js/ui/admin_host.js +++ b/server/www/teleport/static/js/ui/admin_host.js @@ -209,12 +209,12 @@ ywl.on_init = function (cb_stack, cb_args) { var _fn_sure = function (cb_stack, cb_args) { ywl.ajax_post_json('/host/delete-host', {host_list: host_list}, function (ret) { - if (ret.code === TPE_OK) { - g_host_table.reload(); - ywl.notify_success('删除主机操作成功!'); - } else { - ywl.notify_error('删除主机操作失败:' + ret.message); - } + if (ret.code === TPE_OK) { + g_host_table.reload(); + ywl.notify_success('删除主机操作成功!'); + } else { + ywl.notify_error('删除主机操作失败:' + ret.message); + } }, function () { ywl.notify_error('网络故障,删除主机操作失败!'); @@ -245,23 +245,8 @@ ywl.on_init = function (cb_stack, cb_args) { update_file.trigger('click'); }); - $('#btn-batch-export-host').click(function (e) { + $('#btn-batch-export-host').click(function () { window.location.href = '/host/export-host'; -// ywl.ajax_post_json('/host/export-host', {}, -// function (ret) { -// console.log('ret', ret); -// if (ret.code == 0) { -// var url = ret.data.url; -// window.location.href = url; -// ywl.notify_success('操作成功'); -// } else { -// ywl.notify_error('操作失败'); -// } -// }, -// function () { -// ywl.notify_error('操作失败'); -// } -// ); }); $("#btn-apply-group").click(function () { From 13250ec081a96ce933c2094460c43209b421baf9 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Sun, 30 Apr 2017 17:46:11 +0000 Subject: [PATCH 6/8] 1. try to fix crash on Linux by use libssh multi-thread initialization function. 2. update libssh to v0.7.5. 3. update build script to match libssh threads library. --- build/builder/build-external.py | 11 ++++++++--- external/version.ini | 2 +- server/tp_core/core/CMakeLists.txt | 3 ++- server/tp_core/core/ts_main.cpp | 2 +- server/tp_core/protocol/ssh/CMakeLists.txt | 2 +- server/tp_core/protocol/ssh/tpssh.cpp | 5 +++++ 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/build/builder/build-external.py b/build/builder/build-external.py index 70b34db..badbd89 100644 --- a/build/builder/build-external.py +++ b/build/builder/build-external.py @@ -422,7 +422,7 @@ class BuilderLinux(BuilderBase): # os.rename(os.path.join(self.PATH_TMP, 'master'), os.path.join(self.PATH_TMP, 'libssh-{}'.format(LIBSSH_VER))) cc.n('build libssh...', end='') - if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')): + if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')) and os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh_threads.a')): cc.w('already exists, skip.') return cc.v('') @@ -482,7 +482,9 @@ class BuilderLinux(BuilderBase): # because make install will fail because we can not disable ssh_shared target, # so we copy necessary files ourselves. utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'libssh.a')) + utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'threads', 'libssh_threads.a')) utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh.a') + utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'threads'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh_threads.a') utils.copy_ex(os.path.join(self.LIBSSH_PATH_SRC, 'include'), os.path.join(self.PATH_RELEASE, 'include'), 'libssh') def _build_sqlite(self, file_name): @@ -504,7 +506,8 @@ class BuilderLinux(BuilderBase): def fix_output(self): # remove .so files, otherwise will link to .so but not .a in default. - rm = ['libsqlite3.la', 'libsqlite3.so.0', 'libsqlite3.so', 'libsqlite3.so.0.8.6', 'libuv.la', 'libuv.so.1', 'libuv.so', 'libuv.so.1.0.0'] + # rm = ['libsqlite3.la', 'libsqlite3.so.0', 'libsqlite3.so', 'libsqlite3.so.0.8.6', 'libuv.la', 'libuv.so.1', 'libuv.so', 'libuv.so.1.0.0'] + rm = ['libuv.la', 'libuv.so.1', 'libuv.so', 'libuv.so.1.0.0'] for i in rm: _path = os.path.join(self.PATH_RELEASE, 'lib', i) if os.path.exists(_path): @@ -550,7 +553,9 @@ def main(): builder.build_libuv() builder.build_mbedtls() builder.build_libssh() - builder.build_sqlite() + + # do not need sqlite any more. + # builder.build_sqlite() builder.fix_output() diff --git a/external/version.ini b/external/version.ini index f327296..cc745b6 100644 --- a/external/version.ini +++ b/external/version.ini @@ -36,7 +36,7 @@ openssl = 1.0.2h,1000208f libuv = 1.11.0 mbedtls = 2.3.0 sqlite = 3170000 -libssh = 0.7.4 +libssh = 0.7.5 jsoncpp = 0.10.6 mongoose = 6.6 diff --git a/server/tp_core/core/CMakeLists.txt b/server/tp_core/core/CMakeLists.txt index 1944597..05cc6ab 100644 --- a/server/tp_core/core/CMakeLists.txt +++ b/server/tp_core/core/CMakeLists.txt @@ -35,4 +35,5 @@ include_directories( link_directories(../../../external/linux/release/lib) add_executable(tp_core ${DIR_SRCS}) -target_link_libraries(tp_core ssl crypto mbedx509 mbedtls mbedcrypto sqlite3 dl pthread rt util) +#target_link_libraries(tp_core ssl crypto mbedx509 mbedtls mbedcrypto sqlite3 dl pthread rt util) +target_link_libraries(tp_core ssl crypto mbedx509 mbedtls mbedcrypto dl pthread rt util) diff --git a/server/tp_core/core/ts_main.cpp b/server/tp_core/core/ts_main.cpp index db58208..9c312a1 100644 --- a/server/tp_core/core/ts_main.cpp +++ b/server/tp_core/core/ts_main.cpp @@ -153,7 +153,7 @@ bool TppManager::load_tpp(const ex_wstr& libname) lib->dylib = ex_dlopen(libfile.c_str()); if (NULL == lib->dylib) { - EXLOGE(L"[core] load dylib `%ls` failed, maybe it not exists.\n", libfile.c_str()); + EXLOGE(L"[core] load dylib `%ls` failed.\n", libfile.c_str()); delete lib; return false; } diff --git a/server/tp_core/protocol/ssh/CMakeLists.txt b/server/tp_core/protocol/ssh/CMakeLists.txt index 1ffc4de..b35d1e6 100644 --- a/server/tp_core/protocol/ssh/CMakeLists.txt +++ b/server/tp_core/protocol/ssh/CMakeLists.txt @@ -22,4 +22,4 @@ include_directories( link_directories(../../../../external/linux/release/lib) add_library(tpssh SHARED ${DIR_SSH_SRCS}) -target_link_libraries(tpssh ssh ssl crypto mbedx509 mbedtls mbedcrypto dl pthread rt util) +target_link_libraries(tpssh ssh ssh_threads ssl crypto mbedx509 mbedtls mbedcrypto dl pthread rt util) diff --git a/server/tp_core/protocol/ssh/tpssh.cpp b/server/tp_core/protocol/ssh/tpssh.cpp index c1114ac..3fc3fcb 100644 --- a/server/tp_core/protocol/ssh/tpssh.cpp +++ b/server/tp_core/protocol/ssh/tpssh.cpp @@ -3,6 +3,11 @@ TPP_API ex_rv tpp_init(TPP_INIT_ARGS* init_args) { +#ifdef EX_OS_UNIX + ssh_threads_set_callbacks(ssh_threads_get_pthread()); + ssh_init(); +#endif + if (!g_ssh_env.init(init_args)) return TSR_FAILED; From 67c321dfa6e9a0b484297ee3f77ef0f6788df233 Mon Sep 17 00:00:00 2001 From: apexliu Date: Thu, 4 May 2017 08:14:17 +0000 Subject: [PATCH 7/8] temp. --- build/builder/core/ver.py | 6 +++--- server/tp_core/core/tp_core.rc | Bin 5166 -> 5166 bytes server/tp_core/core/ts_ver.h | 12 ++++++------ server/tp_web/src/tp_web.rc | Bin 5168 -> 5168 bytes server/tp_web/src/ts_ver.h | 12 ++++++------ server/www/teleport/app/eom_ver.py | 8 ++++---- version.in | 2 +- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/build/builder/core/ver.py b/build/builder/core/ver.py index 3fd5bd2..9193a29 100644 --- a/build/builder/core/ver.py +++ b/build/builder/core/ver.py @@ -1,3 +1,3 @@ -# -*- coding: utf8 -*- -VER_TELEPORT_SERVER = "2.2.6.1" -VER_TELEPORT_ASSIST = "2.2.5.1" +# -*- coding: utf8 -*- +VER_TELEPORT_SERVER = "2.2.7.3" +VER_TELEPORT_ASSIST = "2.2.5.1" diff --git a/server/tp_core/core/tp_core.rc b/server/tp_core/core/tp_core.rc index 736ce7815e76b2289505ed1e6592734ecfeb4cd9..4e03da855353ed96979444516cc4e4a56677d375 100644 GIT binary patch delta 74 zcmZ3du})*d0uEMl1|0_D$xAu3p)7e$@y%~IjxceXGw3lGGsG|$Fepv_$fddY3HKXD MG(q9b?|2>90M?)rVgLXD delta 74 zcmZ3du})*d0uEL)1|0^&$xAu3p)7e$@y%~IjxceXG3YTEGQ=<#Fepv_$fddY3HKXD MG(q9b?|2>90MwfkRsaA1 diff --git a/server/tp_core/core/ts_ver.h b/server/tp_core/core/ts_ver.h index 69e47d2..d840877 100644 --- a/server/tp_core/core/ts_ver.h +++ b/server/tp_core/core/ts_ver.h @@ -1,6 +1,6 @@ -#ifndef __TS_SERVER_VER_H__ -#define __TS_SERVER_VER_H__ - -#define TP_SERVER_VER L"2.2.6.1" - -#endif // __TS_SERVER_VER_H__ +#ifndef __TS_SERVER_VER_H__ +#define __TS_SERVER_VER_H__ + +#define TP_SERVER_VER L"2.2.7.3" + +#endif // __TS_SERVER_VER_H__ diff --git a/server/tp_web/src/tp_web.rc b/server/tp_web/src/tp_web.rc index 9e650a90c3f0a07eec4a37eabf944f722a785b11..8e3f968ff97e5f95da842fd33c75f94f20433c76 100644 GIT binary patch delta 62 zcmdm>u|Z?Q0uEMl1|0_D$xAu3p)7e$@y%~I&M*PFdJM*!_i~FvnUnW&OHO9t6WYwe Hr^5yS{_GCn delta 62 zcmdm>u|Z?Q0uEL)1|0^&$xAu3p)7e$@y%~I&M*PFdJKk}_i~FvnUnW&OHO9t6WYwe Hr^5yS{aFsx diff --git a/server/tp_web/src/ts_ver.h b/server/tp_web/src/ts_ver.h index 69e47d2..d840877 100644 --- a/server/tp_web/src/ts_ver.h +++ b/server/tp_web/src/ts_ver.h @@ -1,6 +1,6 @@ -#ifndef __TS_SERVER_VER_H__ -#define __TS_SERVER_VER_H__ - -#define TP_SERVER_VER L"2.2.6.1" - -#endif // __TS_SERVER_VER_H__ +#ifndef __TS_SERVER_VER_H__ +#define __TS_SERVER_VER_H__ + +#define TP_SERVER_VER L"2.2.7.3" + +#endif // __TS_SERVER_VER_H__ diff --git a/server/www/teleport/app/eom_ver.py b/server/www/teleport/app/eom_ver.py index ef4d6f5..b272e47 100644 --- a/server/www/teleport/app/eom_ver.py +++ b/server/www/teleport/app/eom_ver.py @@ -1,4 +1,4 @@ -# -*- coding: utf8 -*- -TS_VER = "2.2.6.1" -TP_ASSIST_LAST_VER = "2.2.5.1" -TP_ASSIST_REQUIRE = "2.0.0.1" +# -*- coding: utf8 -*- +TS_VER = "2.2.7.3" +TP_ASSIST_LAST_VER = "2.2.5.1" +TP_ASSIST_REQUIRE = "2.0.0.1" diff --git a/version.in b/version.in index a089cba..acaec57 100644 --- a/version.in +++ b/version.in @@ -14,6 +14,6 @@ Build : 构建号。构建号用于表明此版本发布之前进行了多少 -TELEPORT_SERVER 2.2.6.1 +TELEPORT_SERVER 2.2.7.3 TELEPORT_ASSIST 2.2.5.1 TELEPORT_ASSIST_REQUIRE 2.0.0.1 From a98df86d19d546868da042ece5bec4b951d3713c Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Fri, 5 May 2017 19:10:12 +0800 Subject: [PATCH 8/8] temp. --- .../teleport/app/eom_app/controller/rpc.py | 2 + server/www/teleport/static/js/ui/teleport.js | 394 +++++++++--------- 2 files changed, 199 insertions(+), 197 deletions(-) diff --git a/server/www/teleport/app/eom_app/controller/rpc.py b/server/www/teleport/app/eom_app/controller/rpc.py index 3b25186..ee7a006 100644 --- a/server/www/teleport/app/eom_app/controller/rpc.py +++ b/server/www/teleport/app/eom_app/controller/rpc.py @@ -68,6 +68,8 @@ class RpcHandler(TPBaseJsonHandler): return self.write_json(0, data=x) elif authid < 0: x = web_session().taken('tmp-auth-info-{}'.format(authid), None) + log.d("[rpc] get_auth_info(): ", x) + log.d("\n") return self.write_json(0, data=x) else: return self.write_json(-1, message='invalid auth id.') diff --git a/server/www/teleport/static/js/ui/teleport.js b/server/www/teleport/static/js/ui/teleport.js index ba6db61..6d8ee13 100644 --- a/server/www/teleport/static/js/ui/teleport.js +++ b/server/www/teleport/static/js/ui/teleport.js @@ -7,222 +7,222 @@ var g_current_version = ""; var g_host_name = window.location.hostname; var error_process = function (ret, func_success, func_error) { - var code = ret.code; - if (code === TPE_OK) { - func_success(ret); - return; - } + var code = ret.code; + if (code === TPE_OK) { + func_success(ret); + return; + } - if (code === TPE_START_CLIENT) { - func_error(TPE_START_CLIENT, '启动本地客户端进程失败,请检查命令行是否正确:' + ret.path); - console.log('启动本地进程失败,命令行:', ret.path); - } else if (code === TPE_JSON_FORMAT || code === TPE_PARAM) { - func_error(TPE_START_CLIENT, "启动本地客户端进程失败:启动参数错误!"); - } else if (code === TPE_OLD_ASSIST) { - func_error(TPE_OLD_ASSIST, '助手版本太低,请下载最新版本!'); - } - else { - func_error(TPE_START_CLIENT, '启动本地客户端失败,错误代码:' + ret.code); - } + if (code === TPE_START_CLIENT) { + func_error(TPE_START_CLIENT, '启动本地客户端进程失败,请检查命令行是否正确:' + ret.path); + console.log('启动本地进程失败,命令行:', ret.path); + } else if (code === TPE_JSON_FORMAT || code === TPE_PARAM) { + func_error(TPE_START_CLIENT, "启动本地客户端进程失败:启动参数错误!"); + } else if (code === TPE_OLD_ASSIST) { + func_error(TPE_OLD_ASSIST, '助手版本太低,请下载最新版本!'); + } + else { + func_error(TPE_START_CLIENT, '启动本地客户端失败,错误代码:' + ret.code); + } }; var teleport_init = function (last_version, req_version, func_success, func_error) { - g_req_version = req_version; - g_last_version = last_version; - var data = {}; - var args_ = encodeURIComponent(JSON.stringify(data)); - $.ajax({ - type: 'GET', - timeout: 5000, - url: 'http://127.0.0.1:50022/ts_get_version/' + args_, - jsonp: 'callback', - dataType: 'json', - success: function (ret) { - g_current_version = ret.version; - if (version_compare()) { - error_process(ret, func_success, func_error); - } else { - func_error(ret, TPE_OLD_ASSIST, '助手版本太低,请下载最新版本!'); - } - }, - error: function () { - func_error({}, TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!'); - } - }); + g_req_version = req_version; + g_last_version = last_version; + var data = {}; + var args_ = encodeURIComponent(JSON.stringify(data)); + $.ajax({ + type: 'GET', + timeout: 5000, + url: 'http://127.0.0.1:50022/ts_get_version/' + args_, + jsonp: 'callback', + dataType: 'json', + success: function (ret) { + g_current_version = ret.version; + if (version_compare()) { + error_process(ret, func_success, func_error); + } else { + func_error(ret, TPE_OLD_ASSIST, '助手版本太低,请下载最新版本!'); + } + }, + error: function () { + func_error({}, TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!'); + } + }); }; var version_compare = function () { - var cur_version = parseInt(g_current_version.split(".")[2]); - var req_version = parseInt(g_req_version.split(".")[2]); - return cur_version >= req_version; + var cur_version = parseInt(g_current_version.split(".")[2]); + var req_version = parseInt(g_req_version.split(".")[2]); + return cur_version >= req_version; }; var to_teleport = function (url, args, func_success, func_error) { - var auth_id = args['auth_id']; - // 开始Ajax调用 - var args_ = JSON.stringify({auth_id: auth_id}); - $.ajax({ - url: url, - type: 'POST', - timeout: 6000, - //data: {_xsrf: get_cookie('_xsrf'), args: args_}, - data: {args: args_}, - dataType: 'json', - success: function (ret) { - if (ret.code === 0) { - var session_id = ret.data.session_id; - var data = { - server_ip: g_host_name, //args.server_ip, - server_port: parseInt(args.server_port), - host_ip: args.host_ip, - size: parseInt(args.size), - console: args.console, - session_id: session_id, - pro_type: parseInt(args.pro_type), - pro_sub: parseInt(args.pro_sub) - }; - var args_ = encodeURIComponent(JSON.stringify(data)); - $.ajax({ - type: 'GET', - timeout: 5000, - url: 'http://127.0.0.1:50022/ts_op/' + args_, - jsonp: 'callback', - dataType: 'json', - success: function (ret) { - error_process(ret, func_success, func_error); - }, - error: function () { - func_error(TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!'); - } - }); - } else { - func_error(TPE_NO_CORE_SERVER, '远程连接请求失败,可能teleport核心服务尚未启动!'); - } - }, - error: function () { - func_error(TPE_NETWORK, '远程网络通讯失败!'); - } - }); + var auth_id = args['auth_id']; + // 开始Ajax调用 + var args_ = JSON.stringify({auth_id: auth_id}); + $.ajax({ + url: url, + type: 'POST', + timeout: 6000, + //data: {_xsrf: get_cookie('_xsrf'), args: args_}, + data: {args: args_}, + dataType: 'json', + success: function (ret) { + if (ret.code === 0) { + var session_id = ret.data.session_id; + var data = { + server_ip: g_host_name, //args.server_ip, + server_port: parseInt(args.server_port), + host_ip: args.host_ip, + size: parseInt(args.size), + console: args.console, + session_id: session_id, + pro_type: parseInt(args.pro_type), + pro_sub: parseInt(args.pro_sub) + }; + var args_ = encodeURIComponent(JSON.stringify(data)); + $.ajax({ + type: 'GET', + timeout: 5000, + url: 'http://127.0.0.1:50022/ts_op/' + args_, + jsonp: 'callback', + dataType: 'json', + success: function (ret) { + error_process(ret, func_success, func_error); + }, + error: function () { + func_error(TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!'); + } + }); + } else { + func_error(TPE_NO_CORE_SERVER, '远程连接请求失败,可能teleport核心服务尚未启动!' + ret.message); + } + }, + error: function () { + func_error(TPE_NETWORK, '远程网络通讯失败!'); + } + }); }; var to_admin_teleport = function (url, args, func_success, func_error) { - var host_auth_id = args['host_auth_id']; - // 开始Ajax调用 - var args_ = JSON.stringify({host_auth_id: host_auth_id}); - $.ajax({ - url: url, - type: 'POST', - timeout: 6000, - //data: {_xsrf: get_cookie('_xsrf'), args: args_}, - data: {args: args_}, - dataType: 'json', - success: function (ret) { - if (ret.code === 0) { - var session_id = ret.data.session_id; - var data = { - server_ip: g_host_name, - server_port: parseInt(args.server_port), - host_ip: args.host_ip, - size: parseInt(args.size), - console: args.console, - session_id: session_id, - pro_type: parseInt(args.pro_type), - pro_sub: parseInt(args.pro_sub) - }; - var args_ = encodeURIComponent(JSON.stringify(data)); - $.ajax({ - type: 'GET', - timeout: 5000, - url: 'http://127.0.0.1:50022/ts_op/' + args_, - jsonp: 'callback', - dataType: 'json', - success: function (ret) { - error_process(ret, func_success, func_error); - }, - error: function () { - func_error(TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!'); - } - }); - } else { - func_error(TPE_NO_CORE_SERVER, '远程连接请求失败,可能teleport核心服务尚未启动!'); - } - }, - error: function () { - func_error(TPE_NETWORK, '远程网络通讯失败!'); - } - }); + var host_auth_id = args['host_auth_id']; + // 开始Ajax调用 + var args_ = JSON.stringify({host_auth_id: host_auth_id}); + $.ajax({ + url: url, + type: 'POST', + timeout: 6000, + //data: {_xsrf: get_cookie('_xsrf'), args: args_}, + data: {args: args_}, + dataType: 'json', + success: function (ret) { + if (ret.code === 0) { + var session_id = ret.data.session_id; + var data = { + server_ip: g_host_name, + server_port: parseInt(args.server_port), + host_ip: args.host_ip, + size: parseInt(args.size), + console: args.console, + session_id: session_id, + pro_type: parseInt(args.pro_type), + pro_sub: parseInt(args.pro_sub) + }; + var args_ = encodeURIComponent(JSON.stringify(data)); + $.ajax({ + type: 'GET', + timeout: 5000, + url: 'http://127.0.0.1:50022/ts_op/' + args_, + jsonp: 'callback', + dataType: 'json', + success: function (ret) { + error_process(ret, func_success, func_error); + }, + error: function () { + func_error(TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!'); + } + }); + } else { + func_error(TPE_NO_CORE_SERVER, '远程连接请求失败,可能teleport核心服务尚未启动!' + ret.message); + } + }, + error: function () { + func_error(TPE_NETWORK, '远程网络通讯失败!'); + } + }); }; var to_admin_fast_teleport = function (url, args, func_success, func_error) { - // 开始Ajax调用 - var args_ = JSON.stringify(args); - $.ajax({ - url: url, - type: 'POST', - timeout: 6000, - //data: {_xsrf: get_cookie('_xsrf'), args: args_}, - data: {args: args_}, - dataType: 'json', - success: function (ret) { - if (ret.code === 0) { - var session_id = ret.data.session_id; - var data = { - server_ip: g_host_name, - server_port: parseInt(args.server_port), - host_ip: args.host_ip, - size: parseInt(args.size), - session_id: session_id, - pro_type: parseInt(args.protocol), - pro_sub: parseInt(args.protocol_sub) - }; - var args_ = encodeURIComponent(JSON.stringify(data)); - $.ajax({ - type: 'GET', - timeout: 5000, - url: 'http://127.0.0.1:50022/ts_op/' + args_, - jsonp: 'callback', - dataType: 'json', - success: function (ret) { - error_process(ret, func_success, func_error); - }, - error: function (jqXhr, _error, _e) { - console.log('jqXhr', jqXhr); - console.log('error', _error); - console.log('e', _e); + // 开始Ajax调用 + var args_ = JSON.stringify(args); + $.ajax({ + url: url, + type: 'POST', + timeout: 6000, + //data: {_xsrf: get_cookie('_xsrf'), args: args_}, + data: {args: args_}, + dataType: 'json', + success: function (ret) { + if (ret.code === 0) { + var session_id = ret.data.session_id; + var data = { + server_ip: g_host_name, + server_port: parseInt(args.server_port), + host_ip: args.host_ip, + size: parseInt(args.size), + session_id: session_id, + pro_type: parseInt(args.protocol), + pro_sub: parseInt(args.protocol_sub) + }; + var args_ = encodeURIComponent(JSON.stringify(data)); + $.ajax({ + type: 'GET', + timeout: 5000, + url: 'http://127.0.0.1:50022/ts_op/' + args_, + jsonp: 'callback', + dataType: 'json', + success: function (ret) { + error_process(ret, func_success, func_error); + }, + error: function (jqXhr, _error, _e) { + console.log('jqXhr', jqXhr); + console.log('error', _error); + console.log('e', _e); - console.log('state:', jqXhr.state()); - func_error(TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!'); - } - }); - } else { - func_error(TPE_NO_CORE_SERVER, '远程连接请求失败,可能teleport核心服务尚未启动!'); - } - }, - error: function () { - func_error(TPE_NETWORK, '远程网络通讯失败!'); - } - }); + console.log('state:', jqXhr.state()); + func_error(TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!'); + } + }); + } else { + func_error(TPE_NO_CORE_SERVER, '远程连接请求失败,可能teleport核心服务尚未启动!' + ret.message); + } + }, + error: function () { + func_error(TPE_NETWORK, '远程网络通讯失败!'); + } + }); }; var start_rdp_replay = function (args, func_success, func_error) { - var args_ = encodeURIComponent(JSON.stringify(args)); - $.ajax({ - type: 'GET', - timeout: 6000, - url: 'http://127.0.0.1:50022/ts_rdp_play/' + args_, - jsonp: 'callback', - dataType: 'json', - success: function (ret) { - if (ret.code === TPE_OK) { - error_process(ret, func_success, func_error); - } else { - func_error(ret.code, '查看录像失败!'); - } - console.log('ret', ret); - }, - error: function () { - func_error(TPE_NETWORK, '与助手的络通讯失败!'); - } - }); + var args_ = encodeURIComponent(JSON.stringify(args)); + $.ajax({ + type: 'GET', + timeout: 6000, + url: 'http://127.0.0.1:50022/ts_rdp_play/' + args_, + jsonp: 'callback', + dataType: 'json', + success: function (ret) { + if (ret.code === TPE_OK) { + error_process(ret, func_success, func_error); + } else { + func_error(ret.code, '查看录像失败!'); + } + console.log('ret', ret); + }, + error: function () { + func_error(TPE_NETWORK, '与助手的络通讯失败!'); + } + }); };