예제 #1
0
파일: extsrv.py 프로젝트: yangmain/teleport
    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
예제 #2
0
파일: webapp.py 프로젝트: tp4a/teleport
    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
예제 #3
0
파일: webapp.py 프로젝트: tp4a/teleport
    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
예제 #4
0
파일: webapp.py 프로젝트: eomsoft/teleport
    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
예제 #5
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