From 1be2d393c999f972db5964eee4c57fb06d2c7748 Mon Sep 17 00:00:00 2001 From: apexliu Date: Tue, 18 Apr 2017 01:34:21 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E6=AD=A3=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E6=93=8D=E4=BD=9C=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E6=96=B0=E5=AE=89=E8=A3=85=E7=9A=84=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BC=9A=E5=87=BA=E7=8E=B0=E6=97=A0=E6=B3=95=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9B=202.=20=E4=BC=98=E5=8C=96=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E5=90=91=E5=AF=BC=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E4=B8=8D=E7=9F=A5=E9=81=93=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E6=AD=A5=E6=93=8D=E4=BD=9C=E7=9A=84=E5=9B=B0=E6=89=B0=EF=BC=9B?= =?UTF-8?q?=203.=20=E6=97=A5=E5=BF=97=E9=A1=B5=E9=9D=A2=EF=BC=8C=E5=8F=AA?= =?UTF-8?q?=E6=9C=89=E6=88=90=E5=8A=9F=E6=93=8D=E4=BD=9C=E7=9A=84=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E6=89=8D=E5=87=BA=E7=8E=B0=E5=9B=9E=E6=94=BE=E6=8C=89?= =?UTF-8?q?=E9=92=AE=EF=BC=8C=E9=81=BF=E5=85=8D=E5=9B=B0=E6=89=B0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/www/teleport/app/eom_app/app/db.py | 114 ++++++++++-------- .../app/eom_app/controller/__init__.py | 3 - .../teleport/app/eom_app/controller/host.py | 10 +- .../app/eom_app/controller/maintenance.py | 5 - .../www/teleport/app/eom_app/module/host.py | 10 +- .../www/teleport/static/js/ui/admin_host.js | 4 +- server/www/teleport/static/js/ui/log.js | 37 +++--- .../teleport/view/maintenance/install.mako | 6 + 8 files changed, 95 insertions(+), 94 deletions(-) diff --git a/server/www/teleport/app/eom_app/app/db.py b/server/www/teleport/app/eom_app/app/db.py index 0d2be09..46d1f83 100644 --- a/server/www/teleport/app/eom_app/app/db.py +++ b/server/www/teleport/app/eom_app/app/db.py @@ -57,8 +57,8 @@ class TPDatabase: return False # 看看数据库中是否存在指定的数据表(如果不存在,可能是一个空数据库文件),则可能是一个新安装的系统 - # ret = self.query('SELECT COUNT(*) FROM `sqlite_master` WHERE `type`="table" AND `name`="{}account";'.format(self._table_prefix)) - ret = self.is_table_exists('{}group'.format(self._table_prefix)) + # ret = self.query('SELECT COUNT(*) FROM `sqlite_master` WHERE `type`="table" AND `name`="{}account";'.format(self._table_prefix)) + ret = self.is_table_exists('{}group'.format(self._table_prefix)) if ret is None or not ret: log.w('database need create.\n') self.need_create = True @@ -76,9 +76,9 @@ class TPDatabase: self.need_upgrade = True return True - # DO TEST - # self.alter_table('ts_account', [['account_id', 'id'], ['account_type', 'type']]) - + # DO TEST + # self.alter_table('ts_account', [['account_id', 'id'], ['account_type', 'type']]) + return True def is_table_exists(self, table_name): @@ -128,6 +128,14 @@ class TPDatabase: if not os.path.exists(db_path): log.e('can not create folder `{}` to store database file.\n'.format(db_path)) return False + # 创建一个空数据文件,这样才能进行connect。 + if not os.path.exists(self.db_source['file']): + try: + with open(self.db_source['file'], 'w') as f: + pass + except: + log.e('can not create db file `{}`.\n'.format(self.db_source['file'])) + return False if create_and_init(self, step_begin, step_end): log.v('database created.\n') @@ -154,54 +162,55 @@ class TPDatabase: fields_names: 如果为None,则不修改字段名,否则应该是一个list,其中每个元素是包含两个str的list,表示将此list第一个指定的字段改名为第二个指定的名称 @return: None or Boolean """ + # TODO: 此函数尚未完成 if self.db_source['type'] == self.DB_TYPE_SQLITE: if not isinstance(table_names, list) and field_names is None: log.w('nothing to do.\n') return False - if isinstance(table_names, str): - old_table_name = table_names - new_table_name = table_names - elif isinstance(table_names, list) and len(table_names) == 2: - old_table_name = table_names[0] - new_table_name = table_names[1] - else: - log.w('invalid param.\n') - return False - - if isinstance(field_names, list): - for i in field_names: - if not isinstance(i, list) or 2 != len(i): - log.w('invalid param.\n') - return False - - if field_names is None: - # 仅数据表改名 - return self.exec('ALTER TABLE `{}` RENAME TO `{}`;'.format(old_table_name, new_table_name)) - else: - # sqlite不支持字段改名,所以需要通过临时表中转一下 - - # 先获取数据表的字段名列表 - ret = self.query('SELECT * FROM `sqlite_master` WHERE `type`="table" AND `name`="{}";'.format(old_table_name)) - log.w('-----\n') - log.w(ret[0][4]) - log.w('\n') - - # 先将数据表改名,成为一个临时表 - # tmp_table_name = '{}_sqlite_tmp'.format(old_table_name) - # ret = self.exec('ALTER TABLE `{}` RENAME TO `{}`;'.format(old_table_name, tmp_table_name)) - # if ret is None or not ret: - # return ret - - pass - elif self.db_source['type'] == self.DB_TYPE_MYSQL: - log.e('mysql not supported yet.\n') - return False - else: - log.e('Unknown database type.\n') - return False - - + if isinstance(table_names, str): + old_table_name = table_names + new_table_name = table_names + elif isinstance(table_names, list) and len(table_names) == 2: + old_table_name = table_names[0] + new_table_name = table_names[1] + else: + log.w('invalid param.\n') + return False + + if isinstance(field_names, list): + for i in field_names: + if not isinstance(i, list) or 2 != len(i): + log.w('invalid param.\n') + return False + + if field_names is None: + # 仅数据表改名 + return self.exec('ALTER TABLE `{}` RENAME TO `{}`;'.format(old_table_name, new_table_name)) + else: + # sqlite不支持字段改名,所以需要通过临时表中转一下 + + # 先获取数据表的字段名列表 + ret = self.query('SELECT * FROM `sqlite_master` WHERE `type`="table" AND `name`="{}";'.format(old_table_name)) + log.w('-----\n') + log.w(ret[0][4]) + log.w('\n') + + # 先将数据表改名,成为一个临时表 + # tmp_table_name = '{}_sqlite_tmp'.format(old_table_name) + # ret = self.exec('ALTER TABLE `{}` RENAME TO `{}`;'.format(old_table_name, tmp_table_name)) + # if ret is None or not ret: + # return ret + + pass + elif self.db_source['type'] == self.DB_TYPE_MYSQL: + log.e('mysql not supported yet.\n') + return False + else: + log.e('Unknown database type.\n') + return False + + class TPDatabasePool: def __init__(self): self._locker = threading.RLock() @@ -224,7 +233,8 @@ class TPDatabasePool: thread_id = threading.get_ident() if thread_id not in self._connections: _conn = self._do_connect() - self._connections[thread_id] = _conn + if _conn is not None: + self._connections[thread_id] = _conn else: _conn = self._connections[thread_id] @@ -246,6 +256,10 @@ class TPSqlitePool(TPDatabasePool): self._db_file = db_file def _do_connect(self): + if not os.path.exists(self._db_file): + log.e('[sqlite] can not connect, database file not exists.\n') + return None + try: return sqlite3.connect(self._db_file) except: @@ -259,6 +273,7 @@ class TPSqlitePool(TPDatabasePool): db_ret = cursor.fetchall() return db_ret except sqlite3.OperationalError: + # log.e('_do_query() error.\n') return None finally: cursor.close() @@ -270,6 +285,7 @@ class TPSqlitePool(TPDatabasePool): conn.commit() return True except sqlite3.OperationalError: + # log.e('_do_exec() error.\n') return False finally: cursor.close() diff --git a/server/www/teleport/app/eom_app/controller/__init__.py b/server/www/teleport/app/eom_app/controller/__init__.py index 08416ba..9683e1f 100644 --- a/server/www/teleport/app/eom_app/controller/__init__.py +++ b/server/www/teleport/app/eom_app/controller/__init__.py @@ -50,9 +50,6 @@ controllers = [ (r'/user', user.IndexHandler), (r'/user/list', user.GetListHandler), - # add another path to static-path - - # todo: 重放数据路径是动态从core服务的json-rpc接口获取的,因此这里的数据获取方式需要改变 #(r"/log/replay/(.*)", tornado.web.StaticFileHandler, {"path": os.path.join(cfg.data_path, 'replay')}), (r"/log/replay/(.*)", record.ReplayStaticFileHandler, {"path": os.path.join(cfg.data_path, 'replay')}), diff --git a/server/www/teleport/app/eom_app/controller/host.py b/server/www/teleport/app/eom_app/controller/host.py index e6279d7..cb33257 100644 --- a/server/www/teleport/app/eom_app/controller/host.py +++ b/server/www/teleport/app/eom_app/controller/host.py @@ -453,16 +453,8 @@ class ExportHostHandler(TPBaseAdminAuthHandler): class GetCertList(TPBaseUserAuthJsonHandler): 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 _certs = host.get_cert_list() - if _certs is None: + if _certs is None or len(_certs) == 0: self.write_json(-1) return else: diff --git a/server/www/teleport/app/eom_app/controller/maintenance.py b/server/www/teleport/app/eom_app/controller/maintenance.py index 7c9d1d7..dce00dd 100644 --- a/server/www/teleport/app/eom_app/controller/maintenance.py +++ b/server/www/teleport/app/eom_app/controller/maintenance.py @@ -78,7 +78,6 @@ class RpcThreadManage: 'steps': self._threads[task_id]['steps'] } if not self._threads[task_id]['running']: - print('remove task-id', task_id) del self._threads[task_id] return ret else: @@ -153,15 +152,12 @@ thread_mgr = RpcThreadManage() class RpcHandler(TPBaseAdminAuthJsonHandler): def post(self): args = self.get_argument('args', None) - # print('args', args) if args is not None: args = json.loads(args) else: self.write_json(-1) return - # print(args) - cmd = args['cmd'] if cmd == 'create_db': if not get_db().need_create: @@ -176,7 +172,6 @@ class RpcHandler(TPBaseAdminAuthJsonHandler): return self.write_json(0, data={"task_id": task_id}) elif cmd == 'get_task_ret': - # return self.write_json(-1) r = thread_mgr.get_task(args['tid']) if r is None: return self.write_json(0, data={'running': False, 'steps': []}) diff --git a/server/www/teleport/app/eom_app/module/host.py b/server/www/teleport/app/eom_app/module/host.py index 8546662..2046971 100644 --- a/server/www/teleport/app/eom_app/module/host.py +++ b/server/www/teleport/app/eom_app/module/host.py @@ -51,6 +51,8 @@ def get_all_host_info_list(_filter, order, limit, with_pwd=False): '{};'.format(db.table_prefix, db.table_prefix, _where) db_ret = db.query(sql) + if db_ret is None: + return 0, list() total_count = db_ret[0][0] # 修正分页数据 @@ -88,7 +90,7 @@ def get_all_host_info_list(_filter, order, limit, with_pwd=False): db_ret = db.query(sql) if db_ret is None: - return 0, None + return 0, list() ret = list() for item in db_ret: @@ -310,9 +312,11 @@ def get_cert_list(): sql = 'SELECT {} FROM `{}key` AS a;'.format(','.join(['`a`.`{}`'.format(i) for i in field_a]), db.table_prefix) db_ret = db.query(sql) - if db_ret is None: - return None ret = list() + + if db_ret is None: + return ret + for item in db_ret: x = DbItem() diff --git a/server/www/teleport/static/js/ui/admin_host.js b/server/www/teleport/static/js/ui/admin_host.js index d80762d..f6f2792 100644 --- a/server/www/teleport/static/js/ui/admin_host.js +++ b/server/www/teleport/static/js/ui/admin_host.js @@ -11,8 +11,8 @@ var g_assist = null; var g_host_table = null; -var g_cert_list = {}; -var g_group_list = {}; +var g_cert_list = []; +var g_group_list = []; var g_dlg_edit_host = null; var g_dlg_edit_host_user = null; var g_dlg_sys_user = null; diff --git a/server/www/teleport/static/js/ui/log.js b/server/www/teleport/static/js/ui/log.js index 208bb14..1d34d2a 100644 --- a/server/www/teleport/static/js/ui/log.js +++ b/server/www/teleport/static/js/ui/log.js @@ -1,6 +1,4 @@ -/** - * Created by mi on 2016/7/4. - */ +"use strict"; ywl.on_init = function (cb_stack, cb_args) { var dom_id = '#ywl_log_list'; @@ -36,7 +34,6 @@ ywl.on_init = function (cb_stack, cb_args) { fields: {id: 'id'} }, {title: "ID", key: "id"}, -// {title: "Session", key: "session_id"}, {title: "操作者", key: "account_name"}, {title: "系统用户", key: "user_name"}, {title: "协议", key: "protocol", render: 'protocol', fields: {protocol: 'protocol'}}, @@ -51,7 +48,7 @@ ywl.on_init = function (cb_stack, cb_args) { width: 160, header_align: 'left', cell_align: 'left', render: 'make_action_btn', - fields: {ID: 'id', sys_type: 'sys_type', cost_time: 'cost_time', protocol: 'protocol'} + 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}, @@ -164,16 +161,14 @@ ywl.on_host_table_created = function (tbl) { //ywl.update_add_to_batch_btn(); }); - } else if (col_key == 'action') { + } else if (col_key === 'action') { var row_data = tbl.get_row(row_id); - //console.log('row_data', row_data); - var protocol = parseInt(row_data.protocol); - if (protocol == 1) { + if (protocol === PROTOCOL_TYPE_RDP) { $(cell_obj).find('[ywl-btn-record]').click(function () { - var ip = window.location.hostname;//ywl.page_options.ts_server.ip; - var port = parseInt(window.location.port);//ywl.page_options.ts_server.port; + 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 = {}; @@ -187,7 +182,7 @@ ywl.on_host_table_created = function (tbl) { ywl.notify_success('RDP 录像播放器成功启动!'); }, function (code, msg) { - if (code == TPE_NO_ASSIST) + if (code === TPE_NO_ASSIST) g_assist.alert_assist_not_found(); else { ywl.notify_error(msg); @@ -196,7 +191,7 @@ ywl.on_host_table_created = function (tbl) { }); }); } - else if (protocol == 2) { + 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); }); @@ -214,8 +209,8 @@ ywl.on_host_table_created = function (tbl) { var msg = ''; switch (fields.ret_code) { case 0: - // return '正在使用中' - return '-'; + return '使用中' +// return '-'; case 9999: return '成功'; case 1: @@ -261,7 +256,7 @@ ywl.on_host_table_created = function (tbl) { render.cost_time = function (row_id, fields) { if (fields.ret_code == 0) { - return '正在使用中'; + return '使用中'; } else { return '' + second2str(fields.cost_time) + ''; } @@ -302,19 +297,17 @@ ywl.on_host_table_created = function (tbl) { render.make_action_btn = function (row_id, fields) { var ret = []; - if (fields.protocol == 1) { + if (fields.protocol === PROTOCOL_TYPE_RDP) { ret.push('录像查看 '); - } else if (fields.protocol == 2) { - if (fields.cost_time > 0) { + } else if (fields.protocol === PROTOCOL_TYPE_SSH) { + if (fields.ret_code === 9999 && fields.cost_time > 0) { ret.push('录像查看 '); ret.push('日志查看 '); } - } return ret.join(''); } - }; }; @@ -378,7 +371,6 @@ ywl.create_table_filter_user_list = function (tbl, selector, on_created) { _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) @@ -392,4 +384,3 @@ ywl.create_table_filter_user_list = function (tbl, selector, on_created) { return _tblf_st; }; - diff --git a/server/www/teleport/view/maintenance/install.mako b/server/www/teleport/view/maintenance/install.mako index 88fcacf..7b2c8ad 100644 --- a/server/www/teleport/view/maintenance/install.mako +++ b/server/www/teleport/view/maintenance/install.mako @@ -68,6 +68,11 @@
+ @@ -157,6 +162,7 @@ if (!ret.data.running) { + $('#step2').show('fast'); return; }