diff --git a/server/idea.md b/server/idea.md deleted file mode 100644 index a69efcc..0000000 --- a/server/idea.md +++ /dev/null @@ -1,75 +0,0 @@ -# 一些想法 - -## 服务解耦 - -将core服务和web服务解耦合,让core服务不直接访问数据库。 - -优点: - -- 简化core服务代码,不用直接访问数据库,C++访问数据库比python访问数据库代码复杂度更高。 -- 通过web提供的rpc接口来访问数据库,限定数据库访问点仅通过web进行,容易做多类型的数据库的支持,比如从sqlite迁移到mysql。 - -缺点: - -- 需要web提供特别的rpc接口,web服务和core服务的交互增加了。 - - - -目前的core服务中直接访问数据库,涉及到 - -- 生成会话ID,需要根据认证ID获取认证信息; -- 更新当前连接状态(连接、结束,出错等); - -可改为web查询数据库,然后将数据传递给core服务。_但是这里有一个潜在的安全漏洞:认证信息中包含的私密信息会在网络上传播了。_解决的办法是:如果core和web在同一台主机上,没有漏洞,如果不在同一台主机上,core需要配置一个密钥放在配置文件中,web配置时需要输入此密钥才能与指定的core连接,且传输隐秘数据时使用此密钥进行加密。 - - - - -## 会话ID - -关于会话ID的有效期,现有版本是设置一个引用计数,对于rdp可以使用两次,而ssh只能使用一次,原因是rdp连接时,通常第一次连接用于协商子协议,然后会断开,并立即重连并使用确定好的子协议进行后续操作。 - -改进的方法是:为一个会话ID设置一个标志及一个最后活动时间,会话ID刚生成时标志为false,调用take_session()时设置为true,当连接断开时(或者未能连接成功时)重置为false并更新最后活动时间为当前时间。标志为true时不允许重复take_session(),每次调用take_session()时检查标志为false的回话ID的最后活动时间,如果超过5秒未活动,则删除此会话ID。 - -这样做可以适配各种连接方式。 - - - -## 用户体验 - -纯净安装:基本上就是复制文件,没有别的操作了。安装完成后,提示teleport的运维管理WEB服务的URL,让用户进行访问。 - -### 纯净安装 - -**尽可能使用WEB-UI进行配置** - -完全新安装的服务端,仅启动了web服务(但是web服务的监听IP和端口如何设定?监听IP可以设置为在0.0.0.0上监听,但是端口如何设定?)。因此,端口必须用配置文件的方式进行设定。其次,对于log级别、log输出路径等设定,涉及到系统的调试(可能web服务根本就启动不了,所以无法通过web界面进行设置),因此也需要通过配置文件的方式设定。 - -core与web之间通过JSON-RPC方式进行通讯,core并不直接操作数据库,而是转由web提供RPC接口进行操作。web服务并不直接读取core的配置,而是通过core提供的RPC接口获取或修改其配置。 - -core服务提供RPC接口,能够获取其内部状态,例如当前连接数、网络IO负载等等。 - -可以通过RPC接口停止或重启core和web服务。 - -web服务启动后,访问登录页面,但是如果缺少配置数据表,就跳转到配置页面。 - -- 设定所用数据库(可选本地sqlite,或者MySQL,如果是MySQL,需要给出root权限,或者指定有权限访问的数据库和用户名及密码,以及teleport相关表的前缀,默认为“tp_”),注意,这些信息必须存放在配置文件中,因此配置文件需要支持写入操作; -- 创建配置数据库(包括用户表、配置表等); -- 设定管理员密码(管理员用户名固定为admin); -- 设置core服务的地址和端口(默认是本机127.0.0.1,端口包括RPC端口、SSH/RDP/Telnet端口等); -- 设定core服务存放日志回放记录文件的目录地址; -- core和web的配置信息均存放在.ini配置文件中,方便特定情况下用户手工编辑; - - -安装时需要用户选择安装core还是web,还是二者皆安装。 - -安装完成后,core服务和web服务均会启动,在第一次启动时,需要创建config数据库,里面是一堆空表,只有用户表里面有一个管理员账号admin,安装部署人员可以使用此账号登陆系统。 - -需要增强服务的自检功能,例如端口已经被占用等,需要在日志中给出明确的错误信息。另外,考虑到将来core服务可能部署到多个主机上以提升承载能力,所以web需要访问core的数据时(包括取日志回放文件数据等),均使用RPC接口进行。 - -第一次登陆系统,会自动跳转到配置向导界面,让用户一步一步进行服务器配置。 - - - -- ​ - diff --git a/server/www/teleport/app/eom_app/app/configs.py b/server/www/teleport/app/eom_app/app/configs.py index 1a0eda9..345aada 100644 --- a/server/www/teleport/app/eom_app/app/configs.py +++ b/server/www/teleport/app/eom_app/app/configs.py @@ -88,7 +88,7 @@ class ConfigFile(AttrDict): return True def update_core(self, conf_data): - log.d('update core server config info.\n') + # log.d('update core server config info.\n') self['core'] = AttrDict() if conf_data is None: diff --git a/server/www/teleport/app/eom_app/app/core.py b/server/www/teleport/app/eom_app/app/core.py index 0e324ed..c1fc61c 100644 --- a/server/www/teleport/app/eom_app/app/core.py +++ b/server/www/teleport/app/eom_app/app/core.py @@ -78,6 +78,7 @@ class WebServerCore: rep = urllib.request.urlopen(req, timeout=3) body = rep.read().decode() x = json.loads(body) + log.d('update core server config info.\n') cfg.update_core(x['data']) except: log.w('can not connect to core server to get config, maybe it not start yet, ignore.\n') diff --git a/server/www/teleport/app/eom_app/controller/rpc.py b/server/www/teleport/app/eom_app/controller/rpc.py index 3b25186..33f2f1a 100644 --- a/server/www/teleport/app/eom_app/controller/rpc.py +++ b/server/www/teleport/app/eom_app/controller/rpc.py @@ -123,6 +123,7 @@ class RpcHandler(TPBaseJsonHandler): if return_data['code'] != 0: return self.write_json(-3, 'get config from core service return code: {}'.format(return_data['code'])) + log.d('update core server config info.\n') app_cfg().update_core(return_data['data']) return 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 bc21471..f436e51 100644 --- a/server/www/teleport/app/eom_app/controller/set.py +++ b/server/www/teleport/app/eom_app/controller/set.py @@ -5,6 +5,7 @@ import tornado.gen import tornado.httpclient from eom_ver import * +from eom_app.app.db import get_db from eom_app.app.configs import app_cfg from eom_app.app.util import * from .base import TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler @@ -30,11 +31,19 @@ class InfoHandler(TPBaseAdminAuthHandler): if not core_detected: cfg.update_core(None) + _db = get_db() + database = '未知' + if _db.db_source['type'] == _db.DB_TYPE_SQLITE: + database = 'SQLite({})'.format(_db.db_source['file']) + elif _db.db_source['type'] == _db.DB_TYPE_MYSQL: + database = 'MySQL' + param = { 'core': cfg.core, 'web': { 'version': TS_VER, - 'core_server_rpc': cfg['core_server_rpc'] + 'core_server_rpc': cfg['core_server_rpc'], + 'database': database } } self.render('set/info.mako', page_param=json.dumps(param)) diff --git a/server/www/teleport/static/js/ui/config/info.js b/server/www/teleport/static/js/ui/config/info.js index 4e9b0de..5cb837a 100644 --- a/server/www/teleport/static/js/ui/config/info.js +++ b/server/www/teleport/static/js/ui/config/info.js @@ -17,12 +17,13 @@ ywl.on_init = function (cb_stack, cb_args) { html.push(ywl._make_info('核心服务版本', ywl.page_options.core.version)); } + html.push(ywl._make_info('数据库类型', ywl.page_options.web.database)); html.push(ywl._make_info('核心服务通讯地址', ywl.page_options.web.core_server_rpc)); if (ywl.page_options.core.detected) { html.push(ywl._make_info('WEB服务通讯地址', ywl.page_options.core.web_server_rpc)); html.push(ywl._make_protocol_info('RDP 端口', ywl.page_options.core.rdp)); html.push(ywl._make_protocol_info('SSH 端口', ywl.page_options.core.ssh)); - html.push(ywl._make_protocol_info('TELNET 端口', ywl.page_options.core.telnet)); +// html.push(ywl._make_protocol_info('TELNET 端口', ywl.page_options.core.telnet)); html.push(ywl._make_info('录像文件路径', ywl.page_options.core.replay_path)); }