diff --git a/server/www/teleport/app/eom_app/app/core.py b/server/www/teleport/app/eom_app/app/core.py index 79d74a0..4df1e8a 100644 --- a/server/www/teleport/app/eom_app/app/core.py +++ b/server/www/teleport/app/eom_app/app/core.py @@ -48,13 +48,6 @@ class WebServerCore: if not cfg.load_web(_cfg_file): return False - # TODO: 不要直接读取core.ini,而是通过core的json-rpc获取其配置数据 - # _cfg_file = os.path.join(cfg.cfg_path, 'core.ini') - # if not cfg.load_core(_cfg_file): - # return False - # if not self._get_core_server_config(): - # return False - cfg.log_path = os.path.abspath(options['log_path']) cfg.log_file = os.path.join(cfg.log_path, 'tpweb.log') diff --git a/server/www/teleport/app/eom_app/app/util.py b/server/www/teleport/app/eom_app/app/util.py index a1bdaab..2328242 100644 --- a/server/www/teleport/app/eom_app/app/util.py +++ b/server/www/teleport/app/eom_app/app/util.py @@ -28,7 +28,6 @@ __all__ = ['async_post_http', 'async_enc'] @tornado.gen.coroutine def async_post_http(post_data): - print('async_post_http:', post_data) try: v = json.dumps(post_data) data = urllib.parse.quote(v).encode('utf-8') @@ -36,7 +35,7 @@ def async_post_http(post_data): c = tornado.httpclient.AsyncHTTPClient() r = yield c.fetch(cfg.core_server_rpc, body=data, method='POST') - print('async_post_http return:', r.body.decode()) + # print('async_post_http return:', r.body.decode()) return json.loads(r.body.decode()) except: return None diff --git a/server/www/teleport/app/eom_app/controller/__init__.py b/server/www/teleport/app/eom_app/controller/__init__.py index 17ceeb8..677b3fe 100644 --- a/server/www/teleport/app/eom_app/controller/__init__.py +++ b/server/www/teleport/app/eom_app/controller/__init__.py @@ -79,7 +79,7 @@ controllers = [ (r'/host/add-host', host.AddHost), (r'/host/lock-host', host.LockHost), (r'/host/delete-host', host.DeleteHost), - (r'/host/export-host', host.ExportHost), + (r'/host/export-host', host.ExportHostHandler), (r'/host/get-cert-list', host.GetCertList), (r'/host/add-cert', host.AddCert), (r'/host/delete-cert', host.DeleteCert), @@ -92,7 +92,7 @@ controllers = [ # (r'/host/get-host-extend-info', host.GetHostExtendInfo), # (r'/host/update-host-extend-info', host.UpdateHostExtendInfo), (r'/host/update', host.UpdateHandler), - (r'/host/load-file', host.LoadFile), + (r'/host/upload-import', host.UploadAndImportHandler), (r'/host/', host.IndexHandler), (r'/host', host.IndexHandler), (r'/host/get-session-id', host.GetSessionId), diff --git a/server/www/teleport/app/eom_app/controller/auth.py b/server/www/teleport/app/eom_app/controller/auth.py index 18ba980..07d669b 100644 --- a/server/www/teleport/app/eom_app/controller/auth.py +++ b/server/www/teleport/app/eom_app/controller/auth.py @@ -16,13 +16,11 @@ class LoginHandler(SwxAppHandler): else: user_name = _user['name'] - page_param = { + param = { 'ref': self.get_argument('ref', '/'), - 'login_type': 'account', 'user_name': user_name } - page_param = json.dumps(page_param) - self.render('auth/login.mako', page_param=page_param) + self.render('auth/login.mako', page_param=json.dumps(param)) class VerifyUser(SwxJsonpHandler): @@ -70,7 +68,6 @@ class VerifyUser(SwxJsonpHandler): _user['type'] = account_type self.set_session('user', _user) - # log.v('set session ok.\n') return self.write_jsonp(0) except: @@ -116,14 +113,10 @@ class VerifyCaptchaHandler(SwxJsonpHandler): class ModifyPwd(SwxAuthJsonHandler): def post(self): - # print('verify-ticket') - 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 _old_pwd = args['o_pwd'] diff --git a/server/www/teleport/app/eom_app/controller/host.py b/server/www/teleport/app/eom_app/controller/host.py index dfa52d1..3db0cf9 100644 --- a/server/www/teleport/app/eom_app/controller/host.py +++ b/server/www/teleport/app/eom_app/controller/host.py @@ -11,10 +11,9 @@ import tornado.httpclient from eom_app.app.configs import app_cfg from eom_app.app.util import * from eom_app.module import host -# from eom_app.module.common import * from eom_common.eomcore.logger import * from eom_app.app.session import web_session -from .base import SwxAuthHandler, SwxAuthJsonHandler, SwxAdminJsonHandler +from .base import SwxAuthHandler, SwxAdminHandler, SwxAuthJsonHandler, SwxAdminJsonHandler cfg = app_cfg() @@ -29,53 +28,24 @@ class IndexHandler(SwxAuthHandler): if _user is None: return self.write(-1) - # static_path = cfg.static_path - # var_js = os.path.join(static_path, 'js', 'var.js') - try: - # f = open(var_js, 'w') - _type = _user['type'] - # config_list = set.get_config_list() - ts_server = dict() - # ts_server['ip'] = config_list['ts_server_ip'] - # ts_server['ip'] = cfg['ts_server_ip'] - # ts_server['ip'] = '0.0.0.0' + param = dict() - # ts_server['ssh_port'] = config_list['ts_server_ssh_port'] - # ts_server['rdp_port'] = config_list['ts_server_rdp_port'] - # ts_server['telnet_port'] = config_list['ts_server_telnet_port'] + param['core'] = { + 'ssh_port': cfg.core.ssh.port, + 'rdp_port': cfg.core.telnet.port, + 'telnet_port': cfg.core.telnet.port + } - ts_server['ssh_port'] = cfg.core.ssh.port - ts_server['rdp_port'] = cfg.core.rdp.port - ts_server['telnet_port'] = cfg.core.telnet.port + param['group_list'] = host.get_group_list() - # f.write("\"use strict\";\nvar teleport_ip = \"{}\";\n".format(ts_server['ip'])) - except Exception: - return self.write(-1) - # finally: - # f.close() - - if _type >= 100: - group_list = host.get_group_list() - cert_list = host.get_cert_list() - self.render('host/admin_index.mako', - group_list=group_list, - cert_list=cert_list, - ts_server=ts_server) + if _user['type'] >= 100: + param['cert_list'] = host.get_cert_list() + self.render('host/admin_index.mako', page_param=json.dumps(param)) else: - group_list = host.get_group_list() - - # if config_list is None: - # return - - self.render('host/common_index.mako', - group_list=group_list, - ts_server=ts_server) + self.render('host/common_index.mako', page_param=json.dumps(param)) -class LoadFile(SwxAuthJsonHandler): - # def get(self): - # pass - +class UploadAndImportHandler(SwxAdminJsonHandler): # TODO: 导入操作可能会比较耗时,应该分离导入和获取导入状态两个过程,在页面上可以呈现导入进度,并列出导出成功/失败的项 @tornado.gen.coroutine @@ -96,7 +66,8 @@ class LoadFile(SwxAuthJsonHandler): csv_filename = '' try: - upload_path = os.path.join(os.path.dirname(__file__), 'csv-files') # 文件的暂存路径 + # 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) file_metas = self.request.files['csvfile'] # 提取表单中‘name’为‘file’的文件元数据 @@ -411,49 +382,26 @@ class DeleteHost(SwxAuthJsonHandler): return -class ExportHost(SwxAuthJsonHandler): - def post(self): - 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 +class ExportHostHandler(SwxAdminHandler): + def get(self): + self.set_header('Content-Type', 'application/octet-stream') + self.set_header('Content-Disposition', 'attachment; filename=teleport-host-export.csv') + order = dict() order['name'] = 'host_id' order['asc'] = True - limit = dict() limit['page_index'] = 0 limit['per_page'] = 999999 _total, _hosts = host.get_all_host_info_list(dict(), order, limit, True) - export_file = os.path.join(cfg.static_path, 'download', 'export_csv_data.csv') - if os.path.exists(export_file): - os.remove(export_file) - try: - csv_file = open(export_file, 'w', encoding='utf8') - # with open(export_file, 'wb') as csvfile: - # spamwriter = csv.writer(csvfile) - # spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) - # spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) - csv_header = "分组ID, 操作系统, " \ - "IP地址, 端口, 协议, 状态, 描述, " \ - "系统用户, 系统密码, 是否加密,附加参数, 密钥ID, 认证类型" - csv_file.write(csv_header) - csv_file.write('\n') - except: - log.e('') - csv_file.close() - self.write_json(-1) - return + + self.write("分组ID, 操作系统, IP地址, 端口, 协议, 状态, 描述, 系统用户, 系统密码, 是否加密, 附加参数, 密钥ID, 认证类型\n".encode('gbk')) try: for h in _hosts: auth_list = h['auth_list'] - # 分组ID, 操作系统, IP地址, 端口, 协议, 状态, 描述, 系统用户, 系统密码, 是否加密,附加参数, , 密钥ID, 认证类型 + # 分组ID, 操作系统, IP地址, 端口, 协议, 状态, 描述, 系统用户, 系统密码, 是否加密,附加参数, 密钥ID, 认证类型 for j in auth_list: row_string = '' # row_string = str(h['host_id']) @@ -489,46 +437,30 @@ class ExportHost(SwxAuthJsonHandler): row_string += str(j['cert_id']) row_string += ',' row_string += str(j['auth_mode']) - csv_file.write(row_string) - csv_file.write('\n') - # row = list() - # row.append(h['host_id']) - # row.append(h['group_id']) - # row.append(h['host_sys_type']) - # row.append(h['host_ip']) - # row.append(h['host_port']) - # row.append(h['protocol']) - # row.append(h['host_lock']) - # row.append(h['host_desc']) - # auth_list = h['auth_list'] - # row.append(j['host_auth_id']) - # row.append(j['user_name']) - # row.append(j['user_pswd']) - # row.append(1) - # row.append(j['user_param']) - # row.append(j['cert_id']) - # row.append(j['auth_mode']) - except Exception as e: + + self.write(row_string.encode('gbk')) + self.write('\n') + + except IndexError: + self.write('**********************************************\n'.encode('gbk')) + self.write('!!错误!!\n'.encode('gbk')) + self.write('导出过程中发生了错误!!\n'.encode('gbk')) + self.write('**********************************************\n'.encode('gbk')) log.e('') - finally: - csv_file.close() - url = '/static/download/export_csv_data.csv' - ret = dict() - ret['url'] = url - self.write_json(0, data=ret) - return + + self.finish() class GetCertList(SwxAuthJsonHandler): def post(self): - 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 + # 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 _certs = host.get_cert_list() if _certs is None: self.write_json(-1) @@ -539,7 +471,6 @@ class GetCertList(SwxAuthJsonHandler): class AddCert(SwxAuthJsonHandler): - @tornado.gen.coroutine def post(self): args = self.get_argument('args', None) @@ -557,7 +488,6 @@ class AddCert(SwxAuthJsonHandler): self.write_json(-1) return - # ret_code, cert_pri = _yr = async_enc(cert_pri) return_data = yield _yr if return_data is None: @@ -568,16 +498,6 @@ class AddCert(SwxAuthJsonHandler): cert_pri = return_data['data'] - - # try: - # ret_code, cert_pri = get_enc_data(cert_pri) - # except Exception as e: - # self.write_json(-100) - # return - # if 0 != ret_code: - # self.write_json(ret_code) - # return - try: ret = host.add_cert(cert_pub, cert_pri, cert_name) if ret: @@ -612,7 +532,6 @@ class DeleteCert(SwxAuthJsonHandler): class UpdateCert(SwxAuthJsonHandler): - @tornado.gen.coroutine def post(self): args = self.get_argument('args', None) @@ -638,13 +557,6 @@ class UpdateCert(SwxAuthJsonHandler): return self.write_json(-1) cert_pri = return_data['data'] - # - # try: - # ret_code, cert_pri = get_enc_data(cert_pri) - # except Exception as e: - # return self.write_json(-100) - # if 0 != ret_code: - # return self.write_json(ret_code) try: ret = host.update_cert(cert_id, cert_pub, cert_pri, cert_name) @@ -752,64 +664,6 @@ class AddHostToGroup(SwxAuthJsonHandler): return -# class GetHostExtendInfo(SwxAuthJsonHandler): -# def post(self): -# 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 -# try: -# host_id = args['host_id'] -# _host = host.get_host_extend_info(host_id) -# self.write_json(0, data=_host) -# return -# except: -# self.write_json(-1) -# return -# -# -# class UpdateHostExtendInfo(SwxAuthJsonHandler): -# def post(self): -# 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 -# host_id = args['host_id'] -# -# if args['host_auth_mode'] == 1: -# if len(args['user_pwd']) > 0: -# try: -# ret_code, tmp_pswd = get_enc_data(args['user_pwd']) -# except Exception as e: -# self.write_json(-100) -# return -# if 0 != ret_code: -# self.write_json(ret_code) -# return -# -# args['user_pwd'] = tmp_pswd -# -# # ip = args['ip'] -# # port = args['port'] -# # user_name = args['user_name'] -# # user_pwd = args['user_pwd'] -# # cert_id = args['cert_id'] -# # pro_type = args['pro_type'] -# ret = host.update_host_extend_info(host_id, args) -# if ret: -# self.write_json(0) -# else: -# self.write_json(-1) -# - class GetSessionId(SwxAuthJsonHandler): @tornado.gen.coroutine def post(self, *args, **kwargs): @@ -826,18 +680,6 @@ class GetSessionId(SwxAuthJsonHandler): return auth_id = args['auth_id'] - # config_list = host.get_config_list() - # ts_server_rpc_ip = '127.0.0.1' - # - # if 'ts_server_rpc_ip' in config_list: - # ts_server_rpc_ip = config_list['ts_server_rpc_ip'] - # ts_server_rpc_port = 52080 - # if 'ts_server_rpc_port' in config_list: - # ts_server_rpc_port = config_list['ts_server_rpc_port'] - # ts_server_rpc_ip = cfg.core.rpc.ip - # ts_server_rpc_port = cfg.core.rpc.port - - # url = 'http://{}:{}/rpc'.format(ts_server_rpc_ip, ts_server_rpc_port) req = {'method': 'request_session', 'param': {'authid': auth_id}} _yr = async_post_http(req) return_data = yield _yr @@ -891,17 +733,14 @@ class AdminGetSessionId(SwxAuthJsonHandler): tmp_auth_info['account_lock'] = 0 tmp_auth_info['account_name'] = user['name'] - # ts_server_rpc_ip = cfg.core.rpc.ip - # ts_server_rpc_port = cfg.core.rpc.port - with tmp_auth_id_lock: global tmp_auth_id_base tmp_auth_id_base -= 1 auth_id = tmp_auth_id_base + # 将这个临时认证信息放到session中备后续查找使用(10秒内有效) web_session().set('tmp-auth-info-{}'.format(auth_id), tmp_auth_info, 10) - # url = 'http://{}:{}/rpc'.format(ts_server_rpc_ip, ts_server_rpc_port) req = {'method': 'request_session', 'param': {'authid': auth_id}} _yr = async_post_http(req) return_data = yield _yr @@ -959,15 +798,11 @@ class AdminFastGetSessionId(SwxAdminJsonHandler): self.write_json(-2) return - # ts_server_rpc_ip = cfg.core.rpc.ip - # ts_server_rpc_port = cfg.core.rpc.port - if tmp_auth_info['auth_mode'] == 1: if len(_user_pswd) == 0: # 修改登录用户信息时可能不会修改密码,因此页面上可能不会传来密码,需要从数据库中直接读取 h = host.get_host_auth_info(_host_auth_id) tmp_auth_info['user_auth'] = h['user_auth'] else: # 如果页面上修改了密码或者新建账号时设定了密码,那么需要先交给core服务进行加密 - # url = 'http://{}:{}/rpc'.format(ts_server_rpc_ip, ts_server_rpc_port) req = {'method': 'enc', 'param': {'p': _user_pswd}} _yr = async_post_http(req) return_data = yield _yr @@ -996,7 +831,6 @@ class AdminFastGetSessionId(SwxAdminJsonHandler): web_session().set('tmp-auth-info-{}'.format(auth_id), tmp_auth_info, 10) - # url = 'http://{}:{}/rpc'.format(ts_server_rpc_ip, ts_server_rpc_port) req = {'method': 'request_session', 'param': {'authid': auth_id}} _yr = async_post_http(req) return_data = yield _yr @@ -1069,17 +903,6 @@ class SysUserAdd(SwxAuthJsonHandler): args['user_pswd'] = return_data['data'] - # try: - # ret_code, tmp_pswd = get_enc_data(user_pswd) - # except Exception as e: - # self.write_json(ret_code) - # return - # if 0 != ret_code: - # self.write_json(ret_code) - # return - # - # args['user_pswd'] = tmp_pswd - if host.sys_user_add(args) < 0: return self.write_json(-1) @@ -1118,16 +941,6 @@ class SysUserUpdate(SwxAuthJsonHandler): cert_id = kv['cert_id'] if auth_mode == 1 and user_pswd is not None: - # try: - # ret_code, tmp_pswd = get_enc_data(user_pswd) - # except Exception as e: - # self.write_json(-100) - # return - # if 0 != ret_code: - # self.write_json(ret_code) - # return - # - # args['kv']['user_pswd'] = tmp_pswd _yr = async_enc(user_pswd) return_data = yield _yr if return_data is None: @@ -1154,7 +967,7 @@ class SysUserDelete(SwxAuthJsonHandler): return try: host_auth_id = args['host_auth_id'] - except Exception as e: + except IndexError: self.write_json(-2) return diff --git a/server/www/teleport/app/eom_app/controller/index.py b/server/www/teleport/app/eom_app/controller/index.py index bee94ac..6a2ddc1 100644 --- a/server/www/teleport/app/eom_app/controller/index.py +++ b/server/www/teleport/app/eom_app/controller/index.py @@ -13,4 +13,3 @@ class ExitHandler(SwxBaseHandler): def get(self): self.write('exit ok') tornado.ioloop.IOLoop.instance().stop() - # sys.exit(0) diff --git a/server/www/teleport/app/eom_app/controller/maintenance.py b/server/www/teleport/app/eom_app/controller/maintenance.py index ba45de5..aad0984 100644 --- a/server/www/teleport/app/eom_app/controller/maintenance.py +++ b/server/www/teleport/app/eom_app/controller/maintenance.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -# import sys -# import tornado.ioloop + from .base import SwxBaseHandler diff --git a/server/www/teleport/app/eom_app/controller/pwd.py b/server/www/teleport/app/eom_app/controller/pwd.py index cd6b5ef..fdb8f8c 100644 --- a/server/www/teleport/app/eom_app/controller/pwd.py +++ b/server/www/teleport/app/eom_app/controller/pwd.py @@ -1,15 +1,8 @@ -import json -import urllib -import gzip -import os -# from .configs import app_cfg -from eom_app.app.configs import app_cfg -from eom_app.module import host -from .base import SwxJsonHandler, SwxAuthHandler +# -*- coding: utf-8 -*- -cfg = app_cfg() +from .base import SwxAuthHandler class IndexHandler(SwxAuthHandler): def get(self): - self.render('pwd/index.mako') \ No newline at end of file + self.render('pwd/index.mako') diff --git a/server/www/teleport/app/eom_app/controller/record.py b/server/www/teleport/app/eom_app/controller/record.py index 2fa7917..748da22 100644 --- a/server/www/teleport/app/eom_app/controller/record.py +++ b/server/www/teleport/app/eom_app/controller/record.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- + import ctypes import json import os import platform from eom_app.app.configs import app_cfg -from eom_app.module import host +# from eom_app.module import host from eom_app.module import record from eom_app.module import user from .base import SwxAdminHandler, SwxAdminJsonHandler @@ -35,12 +36,15 @@ class LogHandler(SwxAdminHandler): user_list = user.get_user_list() total_size, free_size = get_free_space_bytes(cfg.data_path) - # ts_server = dict() - # ts_server['ip'] = cfg.core.rpc.ip - # ts_server['port'] = cfg.core.rpc.port - ts_server = '""' + # ts_server = '""' + param = { + 'user_list': user.get_user_list(), + 'total_size': total_size, + 'free_size': free_size, + } - self.render('log/index.mako', user_list=user_list, total_size=total_size, free_size=free_size, ts_server=ts_server) + # self.render('log/index.mako', user_list=user_list, total_size=total_size, free_size=free_size, ts_server=ts_server) + self.render('log/index.mako', page_param=json.dumps(param)) class RecordHandler(SwxAdminHandler): @@ -50,8 +54,6 @@ class RecordHandler(SwxAdminHandler): return elif protocol == 2: self.render('log/record.mako', record_id=record_id) - return - pass # class PlayRdpHandler(SwxAdminHandler): @@ -68,25 +70,27 @@ class RecordHandler(SwxAdminHandler): class ComandLogHandler(SwxAdminHandler): def get(self, protocol, record_id): + + param = dict() + param['count'] = 0 + param['op'] = list() + protocol = int(protocol) if protocol == 1: - return + pass elif protocol == 2: record_path = os.path.join(cfg.data_path, 'replay', 'ssh', '{:06d}'.format(int(record_id))) file_info = os.path.join(record_path, 'tp-ssh-cmd.txt') try: file = open(file_info, 'r') - data = file.read() + data = file.readlines() + for i in range(len(data)): + param['op'].append({'t': data[i][1:20], 'c': data[i][22:-1]}) except: - self.write('open file error {}'.format(file_info)) - return - # "Content-Type": "text/html; charset=UTF-8", - self.set_header('Content-Type', 'text/plain; charset=UTF-8') - if len(data) == 0: - self.write('该用户没有操作') - else: - self.write(data) - return + pass + param['count'] = len(param['op']) + + self.render('log/record-ssh-cmd.mako', page_param=json.dumps(param)) class RecordGetHeader(SwxAdminJsonHandler): @@ -121,17 +125,15 @@ class RecordGetInfo(SwxAdminJsonHandler): class DeleteLog(SwxAdminJsonHandler): - # TODO: 用户可能会批量删除大量录像文件,因此io操作可能会比较耗时,这里应该改为异步方式。 def post(self): args = self.get_argument('args', None) if args is not None: args = json.loads(args) log_list = args['log_list'] - data = record.delete_log(log_list) - if data is None: + if not record.delete_log(log_list): return self.write_json(-1) - self.write_json(0, data=data) + self.write_json(0) class LogList(SwxAdminJsonHandler): diff --git a/server/www/teleport/app/eom_app/controller/rpc.py b/server/www/teleport/app/eom_app/controller/rpc.py index ec2786b..7c92c15 100644 --- a/server/www/teleport/app/eom_app/controller/rpc.py +++ b/server/www/teleport/app/eom_app/controller/rpc.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -# import tornado.web import tornado.gen import json @@ -20,7 +19,6 @@ class RpcHandler(SwxJsonHandler): @tornado.gen.coroutine def get(self): _uri = self.request.uri.split('?', 1) - print(_uri) if len(_uri) != 2: self.write_json(-1, message='need request param.') return @@ -39,7 +37,6 @@ class RpcHandler(SwxJsonHandler): @tornado.gen.coroutine def _dispatch(self, req): - print('rpc-req:', req) try: _req = json.loads(req) @@ -78,11 +75,9 @@ class RpcHandler(SwxJsonHandler): if authid > 0: # 根据authid从数据库中查询对应的数据,然后返回给调用者 x = host.get_auth_info(param['authid']) - print('get_auth_info():', x) self.write_json(0, data=x) elif authid < 0: x = web_session().taken('tmp-auth-info-{}'.format(authid), None) - print('get_auth_info():', x) self.write_json(0, data=x) else: self.write_json(-1, message='invalid auth id.') @@ -91,15 +86,6 @@ class RpcHandler(SwxJsonHandler): if 'sid' not in param: return self.write_json(-1, message='invalid request.') - # jreq["param"]["sid"] = info.sid.c_str(); - # jreq["param"]["account_name"] = info.account_name.c_str(); - # jreq["param"]["host_ip"] = info.host_ip.c_str(); - # jreq["param"]["sys_type"] = info.sys_type; - # jreq["param"]["host_port"] = info.host_port; - # jreq["param"]["auth_mode"] = info.auth_mode, - # jreq["param"]["user_name"] = info.user_name.c_str(); - # jreq["param"]["protocol"] = info.protocol; - try: _sid = param['sid'] _acc_name = param['account_name'] @@ -147,7 +133,6 @@ class RpcHandler(SwxJsonHandler): return self.write_json(return_data['code']) cfg.update_core(return_data['data']) - print(cfg.core) self.write_json(0) diff --git a/server/www/teleport/app/eom_app/controller/set.py b/server/www/teleport/app/eom_app/controller/set.py index 6cd159a..4e74875 100644 --- a/server/www/teleport/app/eom_app/controller/set.py +++ b/server/www/teleport/app/eom_app/controller/set.py @@ -87,8 +87,8 @@ class IndexHandler(SwxAdminHandler): # cfg_list['ts_server_telnet_enabled'] = 1 if cfg.core.telnet.enabled else 0 # self.render('set/index.mako', config_list=cfg_list) - page_param = json.dumps({'core_server': cfg.core}) - self.render('set/index.mako', page_param=page_param) + param = {'core_server': cfg.core} + self.render('set/index.mako', page_param=json.dumps(param)) def _restart_func(): diff --git a/server/www/teleport/app/eom_app/module/host.py b/server/www/teleport/app/eom_app/module/host.py index 84c3f18..beebeb6 100644 --- a/server/www/teleport/app/eom_app/module/host.py +++ b/server/www/teleport/app/eom_app/module/host.py @@ -84,12 +84,11 @@ def get_all_host_info_list(filter, order, limit, with_pwd=False): ','.join(['b.{}'.format(i) for i in field_b]), _where, _order, _limit) - # print(str_sql) db_ret = sql_exec.ExecProcQuery(str_sql) if db_ret is None: return 0, None + ret = list() - host = dict() for item in db_ret: x = DbItem() x.load(item, ['a_{}'.format(i) for i in field_a] + @@ -524,14 +523,12 @@ def get_host_auth_info(host_auth_id): 'WHERE a.id = {}'.format( ','.join(['a.{}'.format(i) for i in field_a]), ','.join(['b.{}'.format(i) for i in field_b]), host_auth_id) - # print(str_sql) db_ret = sql_exec.ExecProcQuery(str_sql) if db_ret is None or len(db_ret) != 1: return None x = DbItem() x.load(db_ret[0], ['a_{}'.format(i) for i in field_a] + ['b_{}'.format(i) for i in field_b]) - print(x) h = dict() h['host_ip'] = x.b_host_ip @@ -553,7 +550,6 @@ def get_host_auth_info(host_auth_id): h['user_auth'] = x.a_user_pswd - # user_auth = x.a_user_auth if x.a_auth_mode == 1: h['user_auth'] = x.a_user_pswd elif x.a_auth_mode == 2: @@ -715,7 +711,6 @@ def sys_user_add(args): 'user_pswd,cert_id, encrypt, log_time) ' \ 'VALUES ({},{},\'{}\',\'{}\',\'{}\',{},{}, \'{}\')'.format(host_id, auth_mode, user_name, user_param, '', 0, encrypt, log_time) - # print(str_sql) ret = sql_exec.ExecProcNonQuery(str_sql) if not ret: return -101 diff --git a/server/www/teleport/app/eom_app/module/record.py b/server/www/teleport/app/eom_app/module/record.py index 3783304..a275b9c 100644 --- a/server/www/teleport/app/eom_app/module/record.py +++ b/server/www/teleport/app/eom_app/module/record.py @@ -6,6 +6,7 @@ import struct from .common import * from eom_app.app.configs import app_cfg +from eom_common.eomcore.logger import log cfg = app_cfg() @@ -176,6 +177,7 @@ def read_record_info(record_id, file_id): break except Exception as e: + log.e('failed to read record file: {}\n'.format(file_info)) return None finally: if file is not None: @@ -185,13 +187,17 @@ def read_record_info(record_id, file_id): def delete_log(log_list): try: - sql_exec = get_db_con() + where = list() + for item in log_list: + where.append(' id={}'.format(item)) + + str_sql = 'DELETE FROM ts_log WHERE{};'.format(' OR'.join(where)) + ret = get_db_con().ExecProcNonQuery(str_sql) + if not ret: + return False + for item in log_list: log_id = int(item) - str_sql = 'DELETE FROM ts_log WHERE id={}'.format(log_id) - ret = sql_exec.ExecProcNonQuery(str_sql) - if not ret: - return False try: record_path = os.path.join(cfg.data_path, 'replay', 'ssh', '{:06d}'.format(log_id)) if os.path.exists(record_path): diff --git a/server/www/teleport/app/eom_app/module/user.py b/server/www/teleport/app/eom_app/module/user.py index a0595ae..5c01ba6 100644 --- a/server/www/teleport/app/eom_app/module/user.py +++ b/server/www/teleport/app/eom_app/module/user.py @@ -35,10 +35,11 @@ def modify_pwd(old_pwd, new_pwd, user_id): def get_user_list(): + # TODO: 用户管理页面不需要列出超级管理员,但是日志查看页面需要,所以应该有参数来区分不同的请求。 sql_exec = get_db_con() field_a = ['account_id', 'account_type', 'account_name', 'account_status', 'account_lock', 'account_desc'] - # string_sql = 'SELECT {} FROM ts_account as a WHERE account_type<100;'.format(','.join(['a.{}'.format(i) for i in field_a])) - string_sql = 'SELECT {} FROM ts_account as a;'.format(','.join(['a.{}'.format(i) for i in field_a])) + string_sql = 'SELECT {} FROM ts_account as a WHERE account_type<100;'.format(','.join(['a.{}'.format(i) for i in field_a])) + # string_sql = 'SELECT {} FROM ts_account as a;'.format(','.join(['a.{}'.format(i) for i in field_a])) db_ret = sql_exec.ExecProcQuery(string_sql) ret = list() for item in db_ret: diff --git a/server/www/teleport/static/js/ui/admin_host.js b/server/www/teleport/static/js/ui/admin_host.js index 1c292f0..ba3441c 100644 --- a/server/www/teleport/static/js/ui/admin_host.js +++ b/server/www/teleport/static/js/ui/admin_host.js @@ -22,7 +22,7 @@ var g_join_group_dlg = null; ywl.do_upload_file = function () { var param = {}; $.ajaxFileUpload({ - url: "/host/load-file",// 需要链接到服务器地址 + url: "/host/upload-import",// 需要链接到服务器地址 secureuri: false, fileElementId: "upload-file", // 文件选择框的id属性 dataType: 'text', // 服务器返回的格式,可以是json @@ -243,29 +243,24 @@ ywl.on_init = function (cb_stack, cb_args) { update_file.trigger('click'); }); + $('#btn-batch-export-host').click(function (e) { - console.log('xxxxxx'); - - 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('操作失败'); - } - - -// var update_args = {host_lock: host_lock}; -// tbl.update_row(row_id, update_args); - - }, - function () { - ywl.notify_error('操作失败'); - } - ); + 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 () { @@ -400,9 +395,9 @@ ywl.on_host_table_created = function (tbl) { } else if (col_key == 'auth_list') { row_data = tbl.get_row(row_id); $(cell_obj).find('[data-action="remote"]').click(function () { - var ts_rdp_port = ywl.page_options.ts_server.rdp_port; - var ts_ssh_port = ywl.page_options.ts_server.ssh_port; - var ts_telnet_port = ywl.page_options.ts_server.telnet_port; + var ts_rdp_port = ywl.page_options.core.rdp_port; + var ts_ssh_port = ywl.page_options.core.ssh_port; + var ts_telnet_port = ywl.page_options.core.telnet_port; var host_ip = row_data.host_ip; var host_port = 0; var pro_type = parseInt($(this).attr('data-protocol')); @@ -431,12 +426,12 @@ ywl.on_host_table_created = function (tbl) { } else if (pro_type == 3) { host_port = ts_telnet_port; } else { - ywl.notify_error("未知的服务器端口号" + row_data.pro_port); + ywl.notify_error("未知的服务器端口号" + pro_port); return; } var args = {}; args.host_auth_id = host_auth_id; - args.server_ip = ywl.page_options.ts_server.ip; + args.server_ip = ywl.server_ip; args.server_port = host_port; args.pro_type = pro_type; args.pro_sub = pro_sub; @@ -1070,9 +1065,9 @@ ywl.create_sys_user = function (tbl) { if (!dlg_sys_user.check_args()) return; - var ts_rdp_port = ywl.page_options.ts_server.rdp_port; - var ts_ssh_port = ywl.page_options.ts_server.ssh_port; - var ts_telnet_port = ywl.page_options.ts_server.telnet_port; + var ts_rdp_port = ywl.page_options.core.rdp_port; + var ts_ssh_port = ywl.page_options.core.ssh_port; + var ts_telnet_port = ywl.page_options.core.telnet_port; var server_port = 0; var host_port = dlg_sys_user.host_port; var protocol = dlg_sys_user.protocol; @@ -1088,7 +1083,7 @@ ywl.create_sys_user = function (tbl) { } var args = {}; - args.server_ip = ywl.page_options.ts_server.ip; + args.server_ip = ywl.server_ip; args.server_port = parseInt(server_port); args.host_port = parseInt(host_port); args.protocol = parseInt(protocol); diff --git a/server/www/teleport/static/js/ui/auth/login.js b/server/www/teleport/static/js/ui/auth/login.js index 886ff2a..79ef1bd 100644 --- a/server/www/teleport/static/js/ui/auth/login.js +++ b/server/www/teleport/static/js/ui/auth/login.js @@ -1,302 +1,163 @@ -/** - * Created by ApexLiu on 2016-03-28. - */ "use strict"; - -var g_login_type = 'account'; -//g_reference = '${ reference }'; - ywl.on_init = function (cb_stack, cb_args) { - ywl.login_type = ywl.page_options.login_type; - g_login_type = ywl.page_options.login_type; - - if(ywl.page_options.user_name.length > 0) { + if (ywl.page_options.user_name.length > 0) { $('#username_account').val(ywl.page_options.user_name); } - $('#captcha_image').attr('src', '/auth/get-captcha?' + Math.random()); + $('#captcha_image').attr('src', '/auth/get-captcha?' + Math.random()); - ywl.app = ywl.create_app(); - cb_stack - .add(ywl.app.init) - .exec(); + ywl.app = ywl.create_app(); + cb_stack + .add(ywl.app.init) + .exec(); }; - ywl.create_app = function () { - var _app = {}; + var _app = {}; - _app.dom_login_quick = null; - _app.dom_login_account = null; + _app.dom_login_account = null; - _app.init = function (cb_stack, cb_args) { - _app.dom_login_quick = $('#login-type-quick'); - _app.dom_login_account = $('#login-type-account'); + _app.init = function (cb_stack, cb_args) { + _app.dom_login_account = $('#login-type-account'); - _app.dom_login_quick.click(function (e) { - _app.dom_login_account.removeClass('selected'); - $(this).addClass('selected'); - $('#input-area-account').slideUp(100); - $('#input-area-quick').slideDown(100); - }); - _app.dom_login_account.click(function (e) { - _app.dom_login_quick.removeClass('selected'); - $(this).addClass('selected'); - $('#input-area-quick').slideUp(100); - $('#input-area-account').slideDown(100); - }); + $('#btn-login-account').click(_app.login_account); - if (ywl.assist.is_logon) { - $('#input-area-quick' + ' .quick-yes').show(); - $('#quick-username').html(ywl.assist.user_name); - _app.dom_login_quick.trigger('click'); - } else { - $('#input-area-quick' + ' .quick-no').show(); - _app.dom_login_account.trigger('click'); - } + $('#captcha_image').click(function () { + $(this).attr('src', '/auth/get-captcha?' + Math.random()); + $('#captcha').focus(); + }); + $('#username_account').keydown(function (event) { + $('[data-toggle="popover"]').popover('hide'); + if (event.which == 13) { + $('#password_account').focus(); + } + }); + $('#password_account').keydown(function (event) { + $('[data-toggle="popover"]').popover('hide'); + if (event.which == 13) { + $('#captcha').focus(); + } + }); + $('#captcha').keydown(function (event) { + $('[data-toggle="popover"]').popover('hide'); + if (event.which == 13) { + _app.login_account(); + } + }); - $('#btn-login-quick').click(_app.login_quick); - $('#btn-login-account').click(_app.login_account); + cb_stack.exec(); + }; - $('#captcha_image').click(function () { - $(this).attr('src', '/auth/get-captcha?' + Math.random()); - $('#captcha').focus(); - }); - $('#username_account').keydown(function (event) { - $('[data-toggle="popover"]').popover('hide'); - if (event.which == 13) { - $('#password_account').focus(); - } - }); - $('#password_account').keydown(function (event) { - $('[data-toggle="popover"]').popover('hide'); - if (event.which == 13) { - $('#captcha').focus(); - } - }); - $('#username_usbkey').keydown(function (event) { - $('[data-toggle="popover"]').popover('hide'); - if (event.which == 13) { - $('#password_usbkey').focus(); - } - }); - $('#password_usbkey').keydown(function (event) { - $('[data-toggle="popover"]').popover('hide'); - if (event.which == 13) { - $('#captcha').focus(); - } - }); - $('#captcha').keydown(function (event) { - $('[data-toggle="popover"]').popover('hide'); - if (event.which == 13) { - _app.login_account(); - } - }); + _app.login_account = function () { + var str_username = ''; + var str_password = ''; + var str_captcha = ''; - cb_stack.exec(); - }; + var dom_username = $('#username_account'); + var dom_password = $('#password_account'); + var dom_captcha = $('#captcha'); - _app.login_quick = function () { - if (!ywl.assist.is_logon) { - return; - } - _app.do_quick_login(ywl.assist.user_id, ywl.assist.ticket); - }; + str_username = dom_username.val(); + str_password = dom_password.val(); + str_captcha = dom_captcha.val(); - _app.login_account = function () { - var str_username = ''; - var str_password = ''; - var str_captcha = ''; + if (str_username.length == 0) { + show_op_box('error', '缺少账号!'); + dom_username.attr('data-content', "请填写您的账号!").popover('show'); + dom_username.focus(); + return; + } - var dom_username = $('#username_' + ywl.login_type); - var dom_password = $('#password_' + ywl.login_type); - var dom_captcha = $('#captcha'); + if (str_password.length == 0) { + show_op_box('error', '缺少密码!'); + dom_password.attr('data-content', "请填写密码!").popover('show'); + dom_password.focus(); + return; + } - str_username = dom_username.val(); - str_password = dom_password.val(); - str_captcha = dom_captcha.val(); + if (str_captcha.length != 4) { + show_op_box('error', '验证码错误!'); + dom_captcha.attr('data-content', "验证码为4位数字和字母的组合,请重新填写!").popover('show').focus(); + return; + } - if (str_username.length == 0) { - show_op_box('error', '缺少账号!'); - dom_username.attr('data-content', "请填写您的账号!").popover('show'); - dom_username.focus(); - return; - } + $('#btn_login').attr('disabled', 'disabled'); + show_op_box('wait', ' 正在进行身份认证,请稍候...'); - if (str_password.length == 0) { - show_op_box('error', '缺少密码!'); - dom_password.attr('data-content', "请填写密码!").popover('show'); - dom_password.focus(); - return; - } + // 先判断一下captcha是否正确,如果不正确,拒绝登录 + $.ajax({ + type: 'GET', + url: '/auth/verify-captcha', + jsonp: "callback", + //jsonpCallback:"login_ret", + data: {captcha: str_captcha}, + dataType: 'jsonp', + success: function (data) { + if (data.code == 0) { + // 验证成功 + hide_op_box(); + show_op_box('wait', ' 正在登录TELEPORT,请稍候...'); + _app.do_account_login(str_username, str_password, str_captcha); + } + else { + hide_op_box(); + show_op_box('error', '验证码错误!'); + // renew the captcha. + //change_captcha(); + $('#captcha_image').attr('src', '/auth/get-captcha?' + Math.random()); + $('#captcha').focus().val(''); + } - if (str_captcha.length != 4) { - show_op_box('error', '验证码错误!'); - dom_captcha.attr('data-content', "验证码为4位数字和字母的组合,请重新填写!").popover('show').focus(); - return; - } + $('#btn_login').removeAttr('disabled'); + }, + error: function () { + hide_op_box(); + show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!'); + $('#btn_login').removeAttr('disabled'); + } + }); + }; - $('#btn_login').attr('disabled', 'disabled'); - show_op_box('wait', ' 正在进行身份认证,请稍候...'); + _app.do_account_login = function (username, userpwd, captcha) { - // 先判断一下captcha是否正确,如果不正确,拒绝登录 - $.ajax({ - type: 'GET', - url: '/auth/verify-captcha', - jsonp: "callback", - //jsonpCallback:"login_ret", - data: {captcha: str_captcha}, - dataType: 'jsonp', - success: function (data) { - if (data.code == 0) { - // 验证成功 - hide_op_box(); - show_op_box('wait', ' 正在登录TELEPORT,请稍候...'); - //var ticket = data.data.ticket; - //var user_id = data.data.user_id; - _app.do_account_login(str_username, str_password, str_captcha); + $.ajax({ + type: 'GET', + url: '/auth/verify-user', + jsonp: "callback", + data: {username: username, userpwd: userpwd, captcha: captcha}, + dataType: 'jsonp', + success: function (data) { + if (data.code == 0) { + // 验证成功 + window.location.href = ywl.page_options.ref; + } + else { + hide_op_box(); + show_op_box('error', '无法登录TELEPORT!'); + } - //_app.do_auth(ywl.login_type, str_username, str_password, str_captcha); - } - else { - hide_op_box(); - show_op_box('error', '验证码错误!'); - // renew the captcha. - //change_captcha(); - $('#captcha_image').attr('src', '/auth/get-captcha?' + Math.random()); - $('#captcha').focus().val(''); - } + $('#btn_login').removeAttr('disabled'); + }, + error: function () { + hide_op_box(); + show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!'); + $('#btn_login').removeAttr('disabled'); + } + }); + }; - $('#btn_login').removeAttr('disabled'); - }, - error: function () { - hide_op_box(); - show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!'); - $('#btn_login').removeAttr('disabled'); - } - }); - }; - - _app.do_quick_login = function (uid, ticket) { - log.v('quick'); - $.ajax({ - type: 'GET', - url: '/auth/quick-login', - jsonp: "callback", - data: {uid: uid, ticket: ticket}, - dataType: 'jsonp', - success: function (data) { - if (data.code == 0) { - // 验证成功 - window.location.href = ywl.page_options.ref; - } - else { - hide_op_box(); - show_op_box('error', '无法登录TELEPORT!'); - } - - $('#btn_login').removeAttr('disabled'); - }, - error: function () { - hide_op_box(); - show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!'); - $('#btn_login').removeAttr('disabled'); - } - }); - }; - - - _app.do_auth = function (login_type, username, password, captcha) { - // 开始Ajax调用 - $.ajax({ - type: 'GET', - url: 'http://127.0.0.1:50021/login', - jsonp: "callback", - data: {login_type: login_type, username: username, password: password}, - dataType: 'jsonp', - success: function (data) { - if (data.code == 0) { - // 登录成功了 - hide_op_box(); - show_op_box('wait', ' 正在登录TELEPORT,请稍候...'); - var ticket = data.data.ticket; - var user_id = data.data.user_id; - _app.do_account_login(user_id, username, ticket, captcha); - } - else { - hide_op_box(); - show_op_box('error', data.data.err_msg); - } - - $('#btn_login').removeAttr('disabled'); - }, - error: function () { - hide_op_box(); - show_op_box(login_type, 'error', '很抱歉,身份认证失败!请稍后再试一次!'); - $('#btn_login').removeAttr('disabled'); - } - }); - }; - - _app.do_account_login = function (username, userpwd, captcha) { - - $.ajax({ - type: 'GET', - url: '/auth/verify-user', - jsonp: "callback", - data: {username: username, userpwd: userpwd, captcha: captcha}, - dataType: 'jsonp', - success: function (data) { - if (data.code == 0) { - // 验证成功 - window.location.href = ywl.page_options.ref; - } - else { - hide_op_box(); - show_op_box('error', '无法登录TELEPORT!'); - } - - $('#btn_login').removeAttr('disabled'); - }, - error: function () { - hide_op_box(); - show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!'); - $('#btn_login').removeAttr('disabled'); - } - }); - }; - - - return _app; + return _app; }; -function change_login_type(login_type) { - if (login_type == g_login_type) - return; - - $('#login_' + login_type).show('fast'); - $('#login_' + g_login_type).hide('fast'); - - $('#login_type_' + login_type).addClass('selected'); - $('#login_type_' + g_login_type).removeClass('selected'); - - if (login_type == 'usbkey') - $('#btn_login').attr('disabled', 'disabled'); - else - $('#btn_login').removeAttr('disabled'); - - g_login_type = login_type; -} - function hide_op_box() { - $('#login_message').hide(); + $('#login_message').hide(); } function show_op_box(op_type, op_msg) { - var obj_box = $('#login_message'); + var obj_box = $('#login_message'); - obj_box.html(op_msg); - obj_box.removeClass().addClass('op_box op_' + op_type); - obj_box.show(); + obj_box.html(op_msg); + obj_box.removeClass().addClass('op_box op_' + op_type); + obj_box.show(); } diff --git a/server/www/teleport/static/js/ui/common_host.js b/server/www/teleport/static/js/ui/common_host.js index 94a2fb2..5468309 100644 --- a/server/www/teleport/static/js/ui/common_host.js +++ b/server/www/teleport/static/js/ui/common_host.js @@ -1,5 +1,5 @@ -/*! 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; @@ -8,312 +8,298 @@ var PROTOCOL_TYPE_TELNET = 3; var AUTH_TYPE_PASSWORD = 1; var AUTH_TYPE_SSHKEY = 2; var AUTH_NONE = 0; + var g_assist = null; + ywl.on_init = function (cb_stack, cb_args) { - var dom_id = '#ywl_host_list'; - g_assist = ywl.create_assist(); + var dom_id = '#ywl_host_list'; + g_assist = ywl.create_assist(); - var last_version = $("#tp-assist-version").text(); - var low_version = $("#tp-assist-version").attr("low-version"); + var last_version = $("#tp-assist-version").text(); + var low_version = $("#tp-assist-version").attr("low-version"); - teleport_init(last_version, low_version, function (ret) { - $("#tp-assist-current-version").text("当前助手版本:" + ret.version); - }, function (ret, code, error) { - if (code == TP_ERR_NO_ASSIST) { - $("#tp-assist-current-version").text("未能检测到TP助手,请您下载并启动TP助手!") - g_assist.alert_assist_not_found(); + teleport_init(last_version, low_version, + function (ret) { + $("#tp-assist-current-version").text("当前助手版本:" + ret.version); + }, + function (ret, code, error) { + if (code == TP_ERR_NO_ASSIST) { + $("#tp-assist-current-version").text("未能检测到TP助手,请您下载并启动TP助手!") + g_assist.alert_assist_not_found(); + } + else if (code == TP_ERR_VERSION_TOO_LOW) { + ywl.notify_error(error); + $('#tp-assist-current-version').html('当前助手版本太低(v' + ret.version + '),请下载最新版本!'); + } + else { + $("#tp-assist-current-version").text(error) + ywl.notify_error(error); - } + console.log('error:', error) + } + }); - else if (code == TP_ERR_VERSION_TOO_LOW) { - ywl.notify_error(error); - $('#tp-assist-current-version').html('当前助手版本太低(v' + ret.version + '),请下载最新版本!'); - return; - } - else { - $("#tp-assist-current-version").text(error) - ywl.notify_error(error); - - console.log('error:', error) - } - }); - - //=================================== - // 创建页面控件对象 - //=================================== - // 表格数据 - var host_table_options = { - selector: dom_id + " [ywl-table='host-list']", - data_source: { - type: 'ajax-post', - url: '/host/list' - }, - column_default: {sort: false, header_align: 'center', cell_align: 'center'}, - columns: [ - {title: "主机", key: "host_id", width: 240, render: 'host_id', fields: {id: 'host_ip', host_desc: 'host_desc', host_port: 'host_port'}}, - {title: "分组", key: "group_name", width: 180}, - {title: "系统", key: "host_sys_type", width: 64, render: 'sys_type', fields: {sys_type: 'host_sys_type'}}, - {title: "状态", key: "host_lock", width: 90, render: 'host_lock', fields: {host_lock: 'host_lock'}}, - {title: "远程连接", key: "auth_list", header_align: 'left', cell_align: 'left', render: 'auth_list', fields: {id: 'host_id', protocol: 'protocol', auth_list: 'auth_list'}}, + //=================================== + // 创建页面控件对象 + //=================================== + // 表格数据 + var host_table_options = { + selector: dom_id + " [ywl-table='host-list']", + data_source: { + type: 'ajax-post', + url: '/host/list' + }, + column_default: {sort: false, header_align: 'center', cell_align: 'center'}, + columns: [ + {title: "主机", key: "host_id", width: 240, render: 'host_id', fields: {id: 'host_ip', host_desc: 'host_desc', host_port: 'host_port'}}, + {title: "分组", key: "group_name", width: 180}, + {title: "系统", key: "host_sys_type", width: 64, render: 'sys_type', fields: {sys_type: 'host_sys_type'}}, + {title: "状态", key: "host_lock", width: 90, render: 'host_lock', fields: {host_lock: 'host_lock'}}, + {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: "padding"}, // {title: "操作", key: "action", width: 160, render: 'make_action_btn', fields: {id: 'host_id'}} - ], - paging: {selector: dom_id + " [ywl-paging='host-list']", per_page: paging_normal}, + ], + paging: {selector: dom_id + " [ywl-paging='host-list']", per_page: paging_normal}, - // 可用的属性设置 - //have_header: true or false + // 可用的属性设置 + //have_header: true or false - // 可用的回调函数 - on_created: ywl.on_host_table_created, + // 可用的回调函数 + on_created: ywl.on_host_table_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); + var host_table = ywl.create_table(host_table_options); - // 主机分组过滤器 - ywl.create_table_filter_host_group(host_table, dom_id + " [ywl-filter='host-group']", ywl.page_options.group_list); + // 主机分组过滤器 + ywl.create_table_filter_host_group(host_table, dom_id + " [ywl-filter='host-group']", ywl.page_options.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_system_type(host_table, dom_id + " [ywl-filter='system-type']"); + // 搜索框 + ywl.create_table_filter_search_box(host_table, dom_id + " [ywl-filter='search']"); - //====================================================== - // 事件绑定 - //====================================================== + //====================================================== + // 事件绑定 + //====================================================== - // 将刷新按钮点击事件绑定到表格的重新加载函数上,这样,点击刷新就导致表格数据重新加载。 - $(dom_id + " [ywl-filter='reload']").click(host_table.reload); + // 将刷新按钮点击事件绑定到表格的重新加载函数上,这样,点击刷新就导致表格数据重新加载。 + $(dom_id + " [ywl-filter='reload']").click(host_table.reload); - cb_stack - .add(host_table.load_data) - .add(host_table.init) - .exec(); + 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) { - var row_data = tbl.get_row(row_id); - if (col_key == 'host_pro_type') { - console.log('row-data', row_data); - $(cell_obj).find('[data-action="remote"]').click(function () { - var ts_rdp_port = ywl.page_options.ts_server.rdp_port; - var ts_ssh_port = ywl.page_options.ts_server.ssh_port; - var port = 0; - var pro_type = row_data.host_pro_type; - if (pro_type === 1) { - port = ts_rdp_port; - } else if (pro_type === 2) { - port = ts_ssh_port; - } else { - return; - } - var args = {}; - args.auth_id = row_data.auth_id; - args.server_ip = ywl.page_options.ts_server.ip; - args.port = port; - args.pro_type = pro_type; - args.pro_sub = $(this).attr('data-sub-protocol'); - args.host_ip = row_data.host_ip; - args.size = 2; - to_teleport( - '/host/get-session-id', - args, - function () { - console.log('远程连接建立成功!') - }, - function (code, error) { - if (code == TP_ERR_NO_ASSIST) - g_assist.alert_assist_not_found(); - else { - ywl.notify_error(error); - console.log('error:', error) - } - } - ); - }); - } else if (col_key == 'auth_list') { - console.log('row-data', row_data); - $(cell_obj).find('[data-action="remote"]').click(function () { - var ts_rdp_port = ywl.page_options.ts_server.rdp_port; - var ts_ssh_port = ywl.page_options.ts_server.ssh_port; - var ts_telnet_port = ywl.page_options.ts_server.telnet_port; - console.log("row_data", row_data); - console.log('page-option', ywl.page_options); - var pro_type = parseInt($(this).attr('data-protocol')); - var pro_sub = parseInt($(this).attr('data-sub-protocol')); - var auth_id = parseInt($(this).attr('auth-id')); - var host_ip = row_data.host_ip; - var server_port = 0; - var size = 0; - var rdp_console = 0; - if (pro_type == 1) { - server_port = ts_rdp_port; - size = parseInt($(this).parent().parent().find('#dlg-rdp-size select').val()) - if ($(this).parent().parent().find('#dlg-action-rdp-console').is(':checked')) { - rdp_console = 1; - } else { - rdp_console = 0; - } - } else if (pro_type == 2) { - server_port = ts_ssh_port; - } else if (pro_type == 3) { - server_port = ts_telnet_port; - } else { - ywl.notify_error("未知的服务器端口号" + row_data.pro_port); - return; - } - var args = {}; - args.auth_id = auth_id; - args.server_ip = ywl.page_options.ts_server.ip; - args.server_port = server_port; - args.pro_type = pro_type; - args.pro_sub = pro_sub; - args.host_ip = host_ip; - args.size = size; - args.console = rdp_console; - console.log('args', args); - to_teleport( - '/host/get-session-id', - args, - function () { - console.log('远程连接建立成功!') - }, - function (code, error) { - if (code == TP_ERR_NO_ASSIST) - g_assist.alert_assist_not_found(); - else { - ywl.notify_error(error); - console.log('error:', error) - } - } - ); - }); - } - }; + tbl.on_cell_created = function (row_id, col_key, cell_obj) { + var row_data = tbl.get_row(row_id); + if (col_key == 'host_pro_type') { + console.log('row-data', row_data); + $(cell_obj).find('[data-action="remote"]').click(function () { + var ts_rdp_port = ywl.page_options.core.rdp_port; + var ts_ssh_port = ywl.page_options.core.ssh_port; + var port = 0; + var pro_type = row_data.host_pro_type; + if (pro_type === 1) { + port = ts_rdp_port; + } else if (pro_type === 2) { + port = ts_ssh_port; + } else { + return; + } + var args = {}; + args.auth_id = row_data.auth_id; + args.server_ip = ywl.server_ip; + args.port = port; + args.pro_type = pro_type; + args.pro_sub = $(this).attr('data-sub-protocol'); + args.host_ip = row_data.host_ip; + args.size = 2; + to_teleport( + '/host/get-session-id', + args, + function () { + console.log('远程连接建立成功!') + }, + function (code, error) { + if (code == TP_ERR_NO_ASSIST) + g_assist.alert_assist_not_found(); + else { + ywl.notify_error(error); + console.log('error:', error) + } + } + ); + }); + } else if (col_key == 'auth_list') { +// console.log('row-data', row_data); + $(cell_obj).find('[data-action="remote"]').click(function () { + var ts_rdp_port = ywl.page_options.core.rdp_port; + var ts_ssh_port = ywl.page_options.core.ssh_port; + var ts_telnet_port = ywl.page_options.core.telnet_port; +// console.log("row_data", row_data); +// console.log('page-option', ywl.page_options); + var pro_type = parseInt($(this).attr('data-protocol')); + var pro_sub = parseInt($(this).attr('data-sub-protocol')); + var auth_id = parseInt($(this).attr('auth-id')); + var host_ip = row_data.host_ip; + var server_port = 0; + var size = 0; + var rdp_console = 0; + if (pro_type == 1) { + server_port = ts_rdp_port; + size = parseInt($(this).parent().parent().find('#dlg-rdp-size select').val()) + if ($(this).parent().parent().find('#dlg-action-rdp-console').is(':checked')) { + rdp_console = 1; + } else { + rdp_console = 0; + } + } else if (pro_type == 2) { + server_port = ts_ssh_port; + } else if (pro_type == 3) { + server_port = ts_telnet_port; + } else { + ywl.notify_error("未知的服务器端口号" + row_data.pro_port); + return; + } + var args = {}; + args.auth_id = auth_id; + args.server_ip = ywl.server_ip; + args.server_port = server_port; + args.pro_type = pro_type; + args.pro_sub = pro_sub; + args.host_ip = host_ip; + args.size = size; + args.console = rdp_console; +// console.log('args', args); + to_teleport('/host/get-session-id', args, + function () { + console.log('远程连接建立成功!') + }, + function (code, error) { + if (code == TP_ERR_NO_ASSIST) + g_assist.alert_assist_not_found(); + else { + ywl.notify_error(error); + console.log('error:', error) + } + } + ); + }); + } + }; - // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 - tbl.on_render_created = function (render) { - render.host_id = function (row_id, fields) { - var ret = []; - ret.push('' + fields.id + ':' + fields.host_port + ''); - ret.push('' + fields.host_desc + ''); - return ret.join(''); - }; + // 重载表格渲染器的部分渲染方式,加入本页面相关特殊操作 + tbl.on_render_created = function (render) { + render.host_id = function (row_id, fields) { + var ret = []; + ret.push('' + fields.id + ':' + fields.host_port + ''); + ret.push('' + fields.host_desc + ''); + return ret.join(''); + }; - render.auth_list = function (row_id, fields) { + render.auth_list = function (row_id, fields) { + var auth_list = fields.auth_list; + var ret = []; + var protocol = fields.protocol; + for (var i = 0; i < auth_list.length; i++) { + var auth = auth_list[i]; - // TODO: 新版本应该返回一个数组,这里应该根据一个数组合成多个用户的连接按钮 - var auth_list = fields.auth_list; - var ret = []; - var protocol = fields.protocol; - for (var i = 0; i < auth_list.length; i++) { - var auth = auth_list[i]; + ret.push('
'); + ret.push(''); - ret.push('
'); - } + return ret.join(''); + }; + render.host_lock = function (row_id, fields) { + switch (fields.host_lock) { + case 0: + return '正常'; + case 1: + return '禁止连接'; + default: + return '未知'; + } + }; + render.pro_type = function (row_id, fields) { + switch (fields.pro_type) { + case 1: + return ' RDP'; + case 2: + var ret = []; + ret.push('
'); + ret.push(' SSH'); + ret.push(' SFTP'); + ret.push('
'); + return ret.join(''); + default: + return '未知协议'; + } + }; - return ret.join(''); - }; + render.make_action_btn = function (row_id, fields) { + var ret = []; - render.host_lock = function (row_id, fields) { - switch (fields.host_lock) { - case 0: - return '正常'; - case 1: - return '禁止连接'; - default: - return '未知'; - } - }; - render.pro_type = function (row_id, fields) { - switch (fields.pro_type) { - case 1: - return ' RDP'; - case 2: - var ret = []; - ret.push('
'); - ret.push(' SSH'); - ret.push(' SFTP'); - ret.push('
'); - return ret.join(''); - default: - return '未知协议'; - } - }; + ret.push('
'); + ret.push(' 远程连接'); + ret.push('
'); + return ret.join(''); + } - render.make_action_btn = function (row_id, fields) { - var ret = []; - - ret.push('
'); - ret.push(' 远程连接'); - ret.push('
'); - return ret.join(''); - } - - }; + }; }; diff --git a/server/www/teleport/static/js/ywl.js b/server/www/teleport/static/js/ywl.js index 1bb258f..f0eb270 100644 --- a/server/www/teleport/static/js/ywl.js +++ b/server/www/teleport/static/js/ywl.js @@ -8,6 +8,8 @@ var YWL = { self.assist = null; self.page_options = {}; + self.server_ip = window.location.hostname || ''; + self.add_page_options = function (options) { _.extend(self.page_options, options); }; diff --git a/server/www/teleport/view/auth/login.mako b/server/www/teleport/view/auth/login.mako index 99cab75..a21b865 100644 --- a/server/www/teleport/view/auth/login.mako +++ b/server/www/teleport/view/auth/login.mako @@ -26,22 +26,7 @@
- -
@@ -56,32 +41,12 @@
- +
- - -
diff --git a/server/www/teleport/view/host/admin_index.mako b/server/www/teleport/view/host/admin_index.mako index c866dd9..4d724b6 100644 --- a/server/www/teleport/view/host/admin_index.mako +++ b/server/www/teleport/view/host/admin_index.mako @@ -597,16 +597,15 @@ <%block name="embed_js"> diff --git a/server/www/teleport/view/host/common_index.mako b/server/www/teleport/view/host/common_index.mako index 4b3fec4..ed17d4b 100644 --- a/server/www/teleport/view/host/common_index.mako +++ b/server/www/teleport/view/host/common_index.mako @@ -56,9 +56,7 @@
- - - +
@@ -70,9 +68,6 @@ @@ -127,52 +104,12 @@ <%block name="extend_content"> - - ##
- ## - ##
- <%block name="embed_js"> diff --git a/server/www/teleport/view/log/index.mako b/server/www/teleport/view/log/index.mako index 2ddda28..06581fa 100644 --- a/server/www/teleport/view/log/index.mako +++ b/server/www/teleport/view/log/index.mako @@ -1,140 +1,100 @@ <%! - page_title_ = '日志查询' - page_menu_ = ['log'] - page_id_ = 'log' + page_title_ = '日志查询' + page_menu_ = ['log'] + page_id_ = 'log' %> <%inherit file="../page_base.mako"/> <%block name="extend_js"> - - +## + <%block name="breadcrumb"> - + ## Begin Main Body.
- -
- -
-
+ +
+ +
+
磁盘状态 - 刷新 + 刷新 +
-
+
-
- -
- 用户名 -
- - -
-
+
+ 用户名 +
+ + +
+
-
- +
+ -
+
-
-
- +
+
+ - + - - + -
- - - - - -##
-##
-## -##
-## -##
-##
- - +
+
- - - - -<%block name="extend_content"> - - - - - <%block name="embed_js"> - + diff --git a/server/www/teleport/view/log/record-ssh-cmd.mako b/server/www/teleport/view/log/record-ssh-cmd.mako new file mode 100644 index 0000000..6dce187 --- /dev/null +++ b/server/www/teleport/view/log/record-ssh-cmd.mako @@ -0,0 +1,101 @@ +<%! + page_title_ = '操作记录' +%> + +<%inherit file="../page_no_sidebar_base.mako"/> +<%block name="extend_js"> + + +<%block name="breadcrumb"> + + + +<%block name="extend_css"> + + + +
+
+ 他悄悄地来,又悄悄地走,挥一挥衣袖,没有留下任何操作~~~~ +
+
+
+ +<%block name="embed_js"> + + \ No newline at end of file diff --git a/server/www/teleport/view/log/record.mako b/server/www/teleport/view/log/record.mako index 146da2e..5cce917 100644 --- a/server/www/teleport/view/log/record.mako +++ b/server/www/teleport/view/log/record.mako @@ -10,7 +10,7 @@ <%block name="breadcrumb"> @@ -41,13 +41,8 @@ <%block name="embed_js"> \ No newline at end of file