def init(self): cfg = tp_cfg() cfg_file = os.path.join(cfg.cfg_path, 'extsrv.json') # 如果配置文件不存在,则不支持第三方服务调用TP-API if not os.path.exists(cfg_file): return True log.i('Loading external server configuration...\n') with open(cfg_file, encoding='utf_8') as f: c = f.read() try: sc = json.loads(c) except: return False if 'version' not in sc: return False if 'ext_srv' not in sc: return False srv = sc['ext_srv'] try: for i in range(len(srv)): srv_name = srv[i]['name'] srv_desc = srv[i]['desc'] for j in range(len(srv[i]['access'])): key = srv[i]['access'][j]['key'] secret = srv[i]['access'][j]['secret'] privilege = int(srv[i]['access'][j]['privilege']) if key in self._cfg: log.e( 'Invalid extsrv.json, duplicated key: {}\n'.format( key)) return False self._cfg[key] = { 'name': srv_name, 'desc': srv_desc, 'secret': secret, 'privilege': privilege } except: log.e('Invalid extsrv.json\n') return False return True
def run(self): log.i('\n') log.i('###############################################################\n') log.i('Teleport Web Server v{}\n'.format(TP_SERVER_VER)) log.i('Load config file: {}\n'.format(self._cfg_file)) self._thread = threading.Thread(target=self._run_loop) self._thread.start() while not self._need_stop: time.sleep(1) self._thread.join() return 0
def _run_loop(self): ext_srv_cfg = tp_ext_srv_cfg() if not ext_srv_cfg.init(): return 0 log.i('Teleport Web Server starting ...\n') tp_cron().init() # 尝试通过CORE-JSON-RPC获取core服务的配置(主要是ssh/rdp/telnet的端口以及录像文件存放路径) self._get_core_server_config() _db = get_db() if not _db.init(): log.e('can not initialize database interface.\n') return 0 _db.connect() while not _db.connected: log.w('database not connected, retry after 5 seconds.\n') time.sleep(5) _db.connect() cfg = tp_cfg() _db.check_status() if _db.need_create or _db.need_upgrade: cfg.app_mode = APP_MODE_MAINTENANCE tp_cfg().update_sys(None) else: cfg.app_mode = APP_MODE_NORMAL _db.load_system_config() try: # 将运行时配置发送给核心服务 req = {'method': 'set_config', 'param': {'noop_timeout': tp_cfg().sys.session.noop_timeout}} req_data = json.dumps(req) data = urllib.parse.quote(req_data).encode('utf-8') req = urllib.request.Request(url=cfg.common.core_server_rpc, data=data) rep = urllib.request.urlopen(req, timeout=3) body = rep.read().decode() x = json.loads(body) if 'code' not in x or x['code'] != 0: print(x) log.e('connect core-server for set runtime-config failed.\n') else: log.d('set runtime-config for core-server succeeded.\n') except: log.w('can not connect to core-server to set runtime-config, maybe it not start yet, ignore.\n') if not tp_session().init(): log.e('can not initialize session manager.\n') return 0 if not tp_stats().init(): log.e('can not initialize system status collector.\n') return 0 if cfg.common.check_host_alive: if not tp_host_alive().init(): log.e('can not initialize host state inspector.\n') return 0 settings = { # 'cookie_secret': '8946svdABGD345fg98uhIaefEBePIfegOIakjFH43oETzK', 'login_url': '/auth/login', # 指定静态文件的路径,页面模板中可以用 {{ static_url('css/main.css') }} 的方式调用 'static_path': cfg.static_path, # 指定模板文件的路径 'template_path': cfg.template_path, # 防止跨站伪造请求,参见 http://old.sebug.net/paper/books/tornado/#_7 'xsrf_cookies': False, 'autoescape': 'xhtml_escape', # 'ui_modules': ui_modules, 'debug': False, # 不开启模板和静态文件的缓存,这样一旦模板文件和静态文件变化,刷新浏览器即可看到更新。 'compiled_template_cache': False, 'static_hash_cache': False, } from app.controller import controllers, fix_controller fix_controller() _app = tornado.web.Application(controllers, **settings) server = tornado.httpserver.HTTPServer(_app, xheaders=True) # server = tornado.httpserver.HTTPServer(_app, xheaders=True, ssl_options={ # "certfile": os.path.join(cfg.data_path, 'cert', "server.pem"), # "keyfile": os.path.join(cfg.data_path, 'cert', "server.key"), # }) try: server.listen(cfg.common.port, address=cfg.common.ip) if cfg.common.ip == '0.0.0.0': log.i('works on [http://127.0.0.1:{}]\n'.format(cfg.common.port)) else: log.i('works on [http://{}:{}]\n'.format(cfg.common.ip, cfg.common.port)) except: log.e('can not listen on port {}:{}, make sure it not been used by another application.\n'.format(cfg.common.ip, cfg.common.port)) return 0 # 启动定时任务调度器 tp_cron().start() try: tornado.ioloop.IOLoop.instance().start() except: log.e('\n') if tp_cfg().common.check_host_alive: tp_host_alive().stop() tp_cron().stop() return 0
def run(self): log.i('\n') log.i('###############################################################\n') log.i('Load config file: {}\n'.format(self._cfg_file)) log.i('Teleport Web Server starting ...\n') tp_cron().init() # 尝试通过CORE-JSON-RPC获取core服务的配置(主要是ssh/rdp/telnet的端口以及录像文件存放路径) self._get_core_server_config() _db = get_db() if not _db.init(): log.e('can not initialize database interface.\n') return 0 _db.connect() while not _db.connected: log.w('database not connected, retry after 5 seconds.\n') time.sleep(5) _db.connect() cfg = tp_cfg() _db.check_status() if _db.need_create or _db.need_upgrade: cfg.app_mode = APP_MODE_MAINTENANCE tp_cfg().update_sys(None) else: cfg.app_mode = APP_MODE_NORMAL _db.load_system_config() try: # 将运行时配置发送给核心服务 req = {'method': 'set_config', 'param': {'noop_timeout': tp_cfg().sys.session.noop_timeout}} req_data = json.dumps(req) data = urllib.parse.quote(req_data).encode('utf-8') req = urllib.request.Request(url=cfg.common.core_server_rpc, data=data) rep = urllib.request.urlopen(req, timeout=3) body = rep.read().decode() x = json.loads(body) if 'code' not in x or x['code'] != 0: print(x) log.e('connect core-server for set runtime-config failed.\n') else: log.d('set runtime-config for core-server succeeded.\n') except: log.w('can not connect to core-server to set runtime-config, maybe it not start yet, ignore.\n') if not tp_session().init(): log.e('can not initialize session manager.\n') return 0 if not tp_stats().init(): log.e('can not initialize system status collector.\n') return 0 settings = { # 'cookie_secret': '8946svdABGD345fg98uhIaefEBePIfegOIakjFH43oETzK', 'login_url': '/auth/login', # 指定静态文件的路径,页面模板中可以用 {{ static_url('css/main.css') }} 的方式调用 'static_path': cfg.static_path, # 指定模板文件的路径 'template_path': cfg.template_path, # 防止跨站伪造请求,参见 http://old.sebug.net/paper/books/tornado/#_7 'xsrf_cookies': False, 'autoescape': 'xhtml_escape', # 'ui_modules': ui_modules, 'debug': False, # 不开启模板和静态文件的缓存,这样一旦模板文件和静态文件变化,刷新浏览器即可看到更新。 'compiled_template_cache': False, 'static_hash_cache': False, } from app.controller import controllers, fix_controller fix_controller() _app = tornado.web.Application(controllers, **settings) server = tornado.httpserver.HTTPServer(_app, xheaders=True) # server = tornado.httpserver.HTTPServer(_app, ssl_options={ # "certfile": os.path.join(cfg.data_path, 'cert', "server.pem"), # "keyfile": os.path.join(cfg.data_path, 'cert', "server.key"), # }) try: server.listen(cfg.common.port, address=cfg.common.ip) if cfg.common.ip == '0.0.0.0': log.i('works on [http://127.0.0.1:{}]\n'.format(cfg.common.port)) else: log.i('works on [http://{}:{}]\n'.format(cfg.common.ip, cfg.common.port)) except: log.e('can not listen on port {}:{}, make sure it not been used by another application.\n'.format(cfg.common.ip, cfg.common.port)) return 0 # 启动定时任务调度器 tp_cron().start() try: tornado.ioloop.IOLoop.instance().start() except: log.e('\n') tp_cron().stop() return 0
def run(self): log.i('\n') log.i( '###############################################################\n' ) log.i('Load config file: {}\n'.format(self._cfg_file)) log.i('Teleport Web Server starting ...\n') # 尝试通过CORE-JSON-RPC获取core服务的配置(主要是ssh/rdp/telnet的端口以及录像文件存放路径) # self._get_core_server_config() _db = get_db() if not _db.init(): log.e('can not initialize database interface.\n') return 0 _db.connect() while not _db.connected: log.w('database not connected, retry after 5 seconds.\n') time.sleep(5) _db.connect() cfg = tp_cfg() _db.check_status() if _db.need_create or _db.need_upgrade: cfg.app_mode = APP_MODE_MAINTENANCE else: cfg.app_mode = APP_MODE_NORMAL if not tp_session().init(): log.e('can not initialize session manager.\n') return 0 # if not tp_stats().init(): # log.e('can not initialize system status collector.\n') # return 0 settings = { # 'cookie_secret': '8946svdABGD345fg98uhIaefEBePIfegOIakjFH43oETzK', 'login_url': '/auth/login', # 指定静态文件的路径,页面模板中可以用 {{ static_url('css/main.css') }} 的方式调用 'static_path': cfg.static_path, # 指定模板文件的路径 'template_path': cfg.template_path, # 防止跨站伪造请求,参见 http://old.sebug.net/paper/books/tornado/#_7 'xsrf_cookies': False, 'autoescape': 'xhtml_escape', # 'ui_modules': ui_modules, 'debug': False, # 不开启模板和静态文件的缓存,这样一旦模板文件和静态文件变化,刷新浏览器即可看到更新。 'compiled_template_cache': False, 'static_hash_cache': False, } from app.controller import controllers _app = tornado.web.Application(controllers, **settings) server = tornado.httpserver.HTTPServer(_app, xheaders=True) # server = tornado.httpserver.HTTPServer(_app, ssl_options={ # "certfile": os.path.join(cfg.data_path, 'cert', "server.pem"), # "keyfile": os.path.join(cfg.data_path, 'cert', "server.key"), # }) try: server.listen(cfg.common.port, address=cfg.common.ip) if cfg.common.ip == '0.0.0.0': log.i('works on [http://127.0.0.1:{}]\n'.format( cfg.common.port)) else: log.i('works on [http://{}:{}]\n'.format( cfg.common.ip, cfg.common.port)) except: log.e( 'can not listen on port {}:{}, make sure it not been used by another application.\n' .format(cfg.common.ip, cfg.common.port)) return 0 try: tornado.ioloop.IOLoop.instance().start() except: log.e('\n') return 0