diff --git a/server/www/teleport/app/eom_app/controller/__init__.py b/server/www/teleport/app/eom_app/controller/__init__.py index 5e0a752..21bee29 100644 --- a/server/www/teleport/app/eom_app/controller/__init__.py +++ b/server/www/teleport/app/eom_app/controller/__init__.py @@ -8,12 +8,12 @@ from . import host from . import cert from . import user from . import pwd -from . import set +from . import config from . import group from . import index from . import record from . import maintenance -import tornado.web +# import tornado.web from eom_app.app.configs import app_cfg @@ -29,8 +29,8 @@ controllers = [ (r'/maintenance/install', maintenance.InstallHandler), (r'/maintenance/upgrade', maintenance.UpgradeHandler), (r'/maintenance/rpc', maintenance.RpcHandler), - (r'/maintenance/', maintenance.IndexHandler), - (r'/maintenance', maintenance.IndexHandler), + (r'/maintenance/index', maintenance.IndexHandler), + # (r'/maintenance', maintenance.IndexHandler), (r'/rpc', rpc.RpcHandler), @@ -111,10 +111,10 @@ controllers = [ # (r'/set/update-config', set.UpdateConfig), # (r'/set/os-operator', set.OsOperator), - (r'/set/info', set.InfoHandler), - (r'/set/db', set.DatabaseHandler), - # (r'/set/', set.IndexHandler), - # (r'/set', set.IndexHandler), + # (r'/set/info', config.InfoHandler), + # (r'/set/db', config.DatabaseHandler), + (r'/config/', config.IndexHandler), + (r'/config', config.IndexHandler), (r'/uidesign', index.UIDesignHandler), (r'/uidesign/without-sidebar', index.UIDesignWithoutSidebarHandler), diff --git a/server/www/teleport/app/eom_app/controller/base.py b/server/www/teleport/app/eom_app/controller/base.py index ce66af9..35abf24 100644 --- a/server/www/teleport/app/eom_app/controller/base.py +++ b/server/www/teleport/app/eom_app/controller/base.py @@ -1,233 +1,233 @@ -# -*- coding: utf-8 -*- - -import binascii -import os -import time -from urllib.parse import quote - -import mako.lookup -import mako.template -import tornado.web -from eom_app.app.configs import app_cfg -from eom_app.app.const import * -from eom_app.app.db import get_db -from eom_app.app.session import web_session, SESSION_EXPIRE -from tornado.escape import json_encode - -cfg = app_cfg() - - -class TPBaseHandler(tornado.web.RequestHandler): - """ - 所有http请求处理的基类,只有极少数的请求如登录、维护直接从本类继承,其他的所有类均从本类的子类(控制权限的类)继承 - """ - - MODE_HTTP = 0 - MODE_JSON = 1 - - def __init__(self, application, request, **kwargs): - super().__init__(application, request, **kwargs) - - self._s_id = None - self._mode = self.MODE_HTTP - - def initialize(self): - template_path = self.get_template_path() - self.lookup = mako.lookup.TemplateLookup(directories=[template_path], input_encoding='utf-8', output_encoding='utf-8') - - def render_string(self, template_name, **kwargs): - template = self.lookup.get_template(template_name) - namespace = self.get_template_namespace() - namespace.update(kwargs) - return template.render(**namespace) - - def render(self, template_path, **kwargs): - if self._mode != self.MODE_HTTP: - self.write_json(-1, 'should be web page request.') - return - self.finish(self.render_string(template_path, **kwargs)) - - def write_json(self, code, message='', data=None): - if self._mode != self.MODE_JSON: - self.write('should be json request.') - self.finish() - return - - if not isinstance(code, int): - raise RuntimeError('`code` must be a integer.') - if not isinstance(message, str): - raise RuntimeError('`msg` must be a string.') - - if data is None: - data = list() - - _ret = {'code': code, 'message': message, 'data': data} - - self.set_header("Content-Type", "application/json") - self.write(json_encode(_ret)) - self.finish() - - def write_raw_json(self, data=None): - if self._mode != self.MODE_JSON: - self.write('should be json request.') - self.finish() - return - - if data is None: - data = list() - - self.set_header("Content-Type", "application/json") - self.write(json_encode(data)) - self.finish() - - def prepare(self): - super().prepare() - if self._finished: - return - - # if self.application.settings.get("xsrf_cookies"): - # x = self.xsrf_token - - self._s_id = self.get_cookie('_sid') - if self._s_id is None: - self._s_id = 'tp_{}_{}'.format(int(time.time()), binascii.b2a_hex(os.urandom(8)).decode()) - self.set_cookie('_sid', self._s_id) - - def set_session(self, name, value, expire=SESSION_EXPIRE): - k = '{}-{}'.format(self._s_id, name) - web_session().set(k, value, expire) - - def get_session(self, name, _default=None): - k = '{}-{}'.format(self._s_id, name) - return web_session().get(k, _default) - - def del_session(self, name): - k = '{}-{}'.format(self._s_id, name) - return web_session().set(k, '', -1) - - def get_current_user(self): - user = self.get_session('user') - if user is None: - user = dict() - user['id'] = 0 - user['name'] = 'guest' - user['nick_name'] = '访客' - user['status'] = 0 - user['phone_num'] = '110' - user['type'] = 0 - user['permission'] = 0 - user['is_login'] = False - - return user - - -class TPBaseJsonHandler(TPBaseHandler): - """ - 所有返回JSON数据的控制器均从本类集成,返回的数据格式一律包含三个字段:code/msg/data - code: 0=成功,其他=失败 - msg: 字符串,一般用于code为非零,指出错误原因 - data: 一般用于成功操作的返回的业务数据 - """ - - def __init__(self, application, request, **kwargs): - super().__init__(application, request, **kwargs) - self._mode = self.MODE_JSON - - -class TPBaseUserAuthHandler(TPBaseHandler): - def __init__(self, application, request, **kwargs): - super().__init__(application, request, **kwargs) - - def prepare(self): - super().prepare() - if self._finished: - return - - reference = self.request.uri - - user = self.get_current_user() - if not user['is_login']: - if reference != '/auth/login': - x = quote(reference) - self.redirect('/auth/login?ref={}'.format(x)) - else: - self.redirect('/auth/login') - else: - if cfg.app_mode == APP_MODE_MAINTENANCE: - if user['type'] != 100: - self.render('maintenance/index.mako') - else: - if not reference.startswith('/maintenance/'): - if get_db().need_create: - self.redirect('/maintenance/install') - elif get_db().need_upgrade: - self.redirect('/maintenance/upgrade') - - -class TPBaseAdminAuthHandler(TPBaseHandler): - def __init__(self, application, request, **kwargs): - super().__init__(application, request, **kwargs) - - def prepare(self): - super().prepare() - if self._finished: - return - - reference = self.request.uri - - user = self.get_current_user() - if not user['is_login'] or user['type'] != 100: - if reference != '/auth/login': # 防止循环重定向 - x = quote(reference) - self.redirect('/auth/login?ref={}'.format(x)) - else: - self.redirect('/auth/login') - else: - if cfg.app_mode == APP_MODE_MAINTENANCE: - if not reference.startswith('/maintenance/'): - if get_db().need_create: - self.redirect('/maintenance/install') - elif get_db().need_upgrade: - self.redirect('/maintenance/upgrade') - - -class TPBaseUserAuthJsonHandler(TPBaseJsonHandler): - def __init__(self, application, request, **kwargs): - super().__init__(application, request, **kwargs) - - def prepare(self): - super().prepare() - if self._finished: - return - - reference = self.request.uri - - user = self.get_current_user() - if not user['is_login']: - if reference != '/auth/login': - self.write_json(-99) - else: - self.write_json(-99) - - else: - if cfg.app_mode == APP_MODE_MAINTENANCE and user['type'] != 100: - self.write_json(-1, 'maintenance mode') - else: - pass - - -class TPBaseAdminAuthJsonHandler(TPBaseJsonHandler): - def __init__(self, application, request, **kwargs): - super().__init__(application, request, **kwargs) - - def prepare(self): - super().prepare() - if self._finished: - return - - reference = self.request.uri - - user = self.get_current_user() - if not user['is_login'] or user['type'] != 100: - if reference != '/auth/login': - self.write_json(-99) +# -*- coding: utf-8 -*- + +import binascii +import os +import time +from urllib.parse import quote + +import mako.lookup +import mako.template +import tornado.web +from eom_app.app.configs import app_cfg +from eom_app.app.const import * +from eom_app.app.db import get_db +from eom_app.app.session import web_session, SESSION_EXPIRE +from tornado.escape import json_encode + +cfg = app_cfg() + + +class TPBaseHandler(tornado.web.RequestHandler): + """ + 所有http请求处理的基类,只有极少数的请求如登录、维护直接从本类继承,其他的所有类均从本类的子类(控制权限的类)继承 + """ + + MODE_HTTP = 0 + MODE_JSON = 1 + + def __init__(self, application, request, **kwargs): + super().__init__(application, request, **kwargs) + + self._s_id = None + self._mode = self.MODE_HTTP + + def initialize(self): + template_path = self.get_template_path() + self.lookup = mako.lookup.TemplateLookup(directories=[template_path], input_encoding='utf-8', output_encoding='utf-8') + + def render_string(self, template_name, **kwargs): + template = self.lookup.get_template(template_name) + namespace = self.get_template_namespace() + namespace.update(kwargs) + return template.render(**namespace) + + def render(self, template_path, **kwargs): + if self._mode != self.MODE_HTTP: + self.write_json(-1, 'should be web page request.') + return + self.finish(self.render_string(template_path, **kwargs)) + + def write_json(self, code, message='', data=None): + if self._mode != self.MODE_JSON: + self.write('should be json request.') + self.finish() + return + + if not isinstance(code, int): + raise RuntimeError('`code` must be a integer.') + if not isinstance(message, str): + raise RuntimeError('`msg` must be a string.') + + if data is None: + data = list() + + _ret = {'code': code, 'message': message, 'data': data} + + self.set_header("Content-Type", "application/json") + self.write(json_encode(_ret)) + self.finish() + + def write_raw_json(self, data=None): + if self._mode != self.MODE_JSON: + self.write('should be json request.') + self.finish() + return + + if data is None: + data = list() + + self.set_header("Content-Type", "application/json") + self.write(json_encode(data)) + self.finish() + + def prepare(self): + super().prepare() + if self._finished: + return + + # if self.application.settings.get("xsrf_cookies"): + # x = self.xsrf_token + + self._s_id = self.get_cookie('_sid') + if self._s_id is None: + self._s_id = 'tp_{}_{}'.format(int(time.time()), binascii.b2a_hex(os.urandom(8)).decode()) + self.set_cookie('_sid', self._s_id) + + def set_session(self, name, value, expire=SESSION_EXPIRE): + k = '{}-{}'.format(self._s_id, name) + web_session().set(k, value, expire) + + def get_session(self, name, _default=None): + k = '{}-{}'.format(self._s_id, name) + return web_session().get(k, _default) + + def del_session(self, name): + k = '{}-{}'.format(self._s_id, name) + return web_session().set(k, '', -1) + + def get_current_user(self): + user = self.get_session('user') + if user is None: + user = dict() + user['id'] = 0 + user['name'] = 'guest' + user['nick_name'] = '访客' + user['status'] = 0 + user['phone_num'] = '110' + user['type'] = 0 + user['permission'] = 0 + user['is_login'] = False + + return user + + +class TPBaseJsonHandler(TPBaseHandler): + """ + 所有返回JSON数据的控制器均从本类集成,返回的数据格式一律包含三个字段:code/msg/data + code: 0=成功,其他=失败 + msg: 字符串,一般用于code为非零,指出错误原因 + data: 一般用于成功操作的返回的业务数据 + """ + + def __init__(self, application, request, **kwargs): + super().__init__(application, request, **kwargs) + self._mode = self.MODE_JSON + + +class TPBaseUserAuthHandler(TPBaseHandler): + def __init__(self, application, request, **kwargs): + super().__init__(application, request, **kwargs) + + def prepare(self): + super().prepare() + if self._finished: + return + + reference = self.request.uri + + user = self.get_current_user() + if not user['is_login']: + if reference != '/auth/login': + x = quote(reference) + self.redirect('/auth/login?ref={}'.format(x)) + else: + self.redirect('/auth/login') + else: + if cfg.app_mode == APP_MODE_MAINTENANCE: + if user['type'] != 100: + self.render('maintenance/index.mako') + else: + if not reference.startswith('/maintenance/'): + if get_db().need_create: + self.redirect('/maintenance/install') + elif get_db().need_upgrade: + self.redirect('/maintenance/upgrade') + + +class TPBaseAdminAuthHandler(TPBaseHandler): + def __init__(self, application, request, **kwargs): + super().__init__(application, request, **kwargs) + + def prepare(self): + super().prepare() + if self._finished: + return + + reference = self.request.uri + + user = self.get_current_user() + if not user['is_login'] or user['type'] != 100: + if reference != '/auth/login': # 防止循环重定向 + x = quote(reference) + self.redirect('/auth/login?ref={}'.format(x)) + else: + self.redirect('/auth/login') + else: + if cfg.app_mode == APP_MODE_MAINTENANCE: + if not reference.startswith('/maintenance/'): + if get_db().need_create: + self.redirect('/maintenance/install') + elif get_db().need_upgrade: + self.redirect('/maintenance/upgrade') + + +class TPBaseUserAuthJsonHandler(TPBaseJsonHandler): + def __init__(self, application, request, **kwargs): + super().__init__(application, request, **kwargs) + + def prepare(self): + super().prepare() + if self._finished: + return + + reference = self.request.uri + + user = self.get_current_user() + if not user['is_login']: + if reference != '/auth/login': + self.write_json(-99) + else: + self.write_json(-99) + + else: + if cfg.app_mode == APP_MODE_MAINTENANCE and user['type'] != 100: + self.write_json(-1, 'maintenance mode') + else: + pass + + +class TPBaseAdminAuthJsonHandler(TPBaseJsonHandler): + def __init__(self, application, request, **kwargs): + super().__init__(application, request, **kwargs) + + def prepare(self): + super().prepare() + if self._finished: + return + + reference = self.request.uri + + user = self.get_current_user() + if not user['is_login'] or user['type'] != 100: + if reference != '/auth/login': + self.write_json(-99) diff --git a/server/www/teleport/app/eom_app/controller/set.py b/server/www/teleport/app/eom_app/controller/config.py similarity index 68% rename from server/www/teleport/app/eom_app/controller/set.py rename to server/www/teleport/app/eom_app/controller/config.py index 70fe8bc..b9d35d3 100644 --- a/server/www/teleport/app/eom_app/controller/set.py +++ b/server/www/teleport/app/eom_app/controller/config.py @@ -13,7 +13,7 @@ from .base import TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler cfg = app_cfg() -class InfoHandler(TPBaseAdminAuthHandler): +class IndexHandler(TPBaseAdminAuthHandler): @tornado.gen.coroutine def get(self): core_detected = False @@ -32,34 +32,73 @@ class InfoHandler(TPBaseAdminAuthHandler): 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' + # database = '未知' + db = _db.db_source + # if _db.db_source['type'] == _db.DB_TYPE_SQLITE: + # database = 'SQLite({})'.format(_db.db_source['file']) + # el + if _db.db_source['type'] == _db.DB_TYPE_MYSQL: + # database = 'MySQL' + del db['password'] param = { 'core': cfg.core, 'web': { 'version': TS_VER, 'core_server_rpc': cfg['core_server_rpc'], - 'database': database + # 'database': database, + 'db': db } } - self.render('set/info.mako', page_param=json.dumps(param)) + self.render('config/index.mako', page_param=json.dumps(param)) + +# class InfoHandler(TPBaseAdminAuthHandler): +# @tornado.gen.coroutine +# def get(self): +# core_detected = False +# req = {'method': 'get_config', 'param': []} +# _yr = async_post_http(req) +# return_data = yield _yr +# if return_data is not None: +# if 'code' in return_data: +# _code = return_data['code'] +# if _code == 0: +# # core['detected'] = True +# cfg.update_core(return_data['data']) +# core_detected = True +# +# 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'], +# 'database': database +# } +# } +# self.render('set/info.mako', page_param=json.dumps(param)) -class DatabaseHandler(TPBaseAdminAuthHandler): - def get(self): - _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 = {'db': _db.db_source} - self.render('set/database.mako', page_param=json.dumps(param)) +# class DatabaseHandler(TPBaseAdminAuthHandler): +# def get(self): +# _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 = {'db': _db.db_source} +# self.render('set/database.mako', page_param=json.dumps(param)) # def _restart_func(): # time.sleep(1) diff --git a/server/www/teleport/app/eom_app/controller/maintenance.py b/server/www/teleport/app/eom_app/controller/maintenance.py index ec37940..8975ce8 100644 --- a/server/www/teleport/app/eom_app/controller/maintenance.py +++ b/server/www/teleport/app/eom_app/controller/maintenance.py @@ -1,181 +1,185 @@ -# -*- coding: utf-8 -*- - -import json -import threading - -from eom_app.app.configs import app_cfg -from eom_app.app.const import * -from eom_app.app.db import get_db -from .base import TPBaseUserAuthHandler, TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler - -cfg = app_cfg() - - -class IndexHandler(TPBaseUserAuthHandler): - def get(self): - self.render('maintenance/index.mako') - - -class InstallHandler(TPBaseAdminAuthHandler): - def get(self): - if get_db().need_create: - self.render('maintenance/install.mako') - elif get_db().need_upgrade: - return self.redirect('/maintenance/upgrade') - else: - self.redirect('/') - - -class UpgradeHandler(TPBaseAdminAuthHandler): - def get(self): - if get_db().need_create: - return self.redirect('/maintenance/install') - elif get_db().need_upgrade: - self.render('maintenance/upgrade.mako') - else: - self.redirect('/') - - -class RpcThreadManage: - def __init__(self): - self._lock = threading.RLock() - self._threads = dict() - self._id_base = 0 - - def create_db(self): - with self._lock: - self._id_base += 1 - task_id = self._id_base - - t = threading.Thread(target=self._create_db, args=[task_id]) - self._threads[task_id] = {'cmd': 'create_db', 'running': True, 'stop': False, 'steps': list()} - t.start() - - return task_id - - def upgrade_db(self): - with self._lock: - self._id_base += 1 - task_id = self._id_base - - t = threading.Thread(target=self._upgrade_db, args=[task_id]) - self._threads[task_id] = {'cmd': 'create_db', 'running': True, 'stop': False, 'steps': list()} - t.start() - - return task_id - - def get_task(self, task_id): - with self._lock: - if task_id in self._threads: - # msg = list() - # for i in range(len(self._threads[task_id]['sub_tasks'])): - # msg.append({'ip': self._threads[task_id]['sub_tasks'][i]['ip'], 'msg': self._threads[task_id]['sub_tasks'][i]['msg']}) - - ret = { - 'cmd': self._threads[task_id]['cmd'], - 'running': self._threads[task_id]['running'], - # 'stop': self._threads[task_id]['stop'], - 'steps': self._threads[task_id]['steps'] - } - if not self._threads[task_id]['running']: - del self._threads[task_id] - return ret - else: - return None - - def stop_task(self, task_id): - with self._lock: - if task_id in self._threads: - self._threads[task_id]['msg'] = '正在终止...' - self._threads[task_id]['stop'] = True - - def _create_db(self, tid): - def _step_begin(msg): - return self._step_begin(tid, msg) - - def _step_end(sid, code, msg=None): - self._step_end(tid, sid, code, msg) - - if get_db().create_and_init(_step_begin, _step_end): - cfg.app_mode = APP_MODE_NORMAL - - # self._step_begin(tid, '操作已完成') - - self._thread_end(tid) - - def _upgrade_db(self, tid): - def _step_begin(msg): - return self._step_begin(tid, msg) - - def _step_end(sid, code, msg=None): - self._step_end(tid, sid, code, msg) - - if get_db().upgrade_database(_step_begin, _step_end): - cfg.app_mode = APP_MODE_NORMAL - - # self._step_begin(tid, '操作已完成') - - self._thread_end(tid) - - def _step_begin(self, tid, msg): - with self._lock: - if len(self._threads[tid]['steps']) > 0: - self._threads[tid]['steps'][-1]['stat'] = 0 # 0 表示此步骤已完成 - self._threads[tid]['steps'].append({'stat': 1, 'code': 0, 'msg': msg}) - - return len(self._threads[tid]['steps']) - 1 - - def _step_end(self, tid, sid, code, msg=None): - with self._lock: - try: - self._threads[tid]['steps'][sid]['code'] = code - self._threads[tid]['steps'][sid]['stat'] = 0 # 0 表示此步骤已完成 - if msg is not None: - self._threads[tid]['steps'][sid]['msg'] = '{}{}'.format(self._threads[tid]['steps'][sid]['msg'], msg) - except: - pass - - def _thread_end(self, tid): - with self._lock: - if tid in self._threads: - self._threads[tid]['running'] = False - if self._threads[tid]['stop']: - sid = self._step_begin(tid, '操作被终止') - self._step_end(tid, sid, -1) - if len(self._threads[tid]['steps']) > 0: - self._threads[tid]['steps'][-1]['stat'] = 0 - - -thread_mgr = RpcThreadManage() - - -class RpcHandler(TPBaseAdminAuthJsonHandler): - def post(self): - args = self.get_argument('args', None) - if args is not None: - args = json.loads(args) - else: - return self.write_json(-1, '参数错误') - - cmd = args['cmd'] - if cmd == 'create_db': - if not get_db().need_create: - return self.write_json(-1, '无需创建') - task_id = thread_mgr.create_db() - return self.write_json(0, data={"task_id": task_id}) - - if cmd == 'upgrade_db': - if not get_db().need_upgrade: - return self.write_json(-1, '无需升级') - task_id = thread_mgr.upgrade_db() - return self.write_json(0, data={"task_id": task_id}) - - elif cmd == 'get_task_ret': - r = thread_mgr.get_task(args['tid']) - if r is None: - return self.write_json(0, data={'running': False, 'steps': []}) - else: - return self.write_json(0, data=r) - - else: - self.write_json(-1, '未知命令 `{}`!'.format(cmd)) +# -*- coding: utf-8 -*- + +import json +import threading + +from eom_app.app.configs import app_cfg +from eom_app.app.const import * +from eom_app.app.db import get_db +from .base import TPBaseUserAuthHandler, TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler + +cfg = app_cfg() + + +class IndexHandler(TPBaseUserAuthHandler): + def get(self): + self.render('maintenance/index.mako') + + +class InstallHandler(TPBaseAdminAuthHandler): + def get(self): + if get_db().need_create: + self.render('maintenance/install.mako') + elif get_db().need_upgrade: + return self.redirect('/maintenance/upgrade') + else: + self.redirect('/') + + +class UpgradeHandler(TPBaseAdminAuthHandler): + def get(self): + if get_db().need_create: + return self.redirect('/maintenance/install') + elif get_db().need_upgrade: + self.render('maintenance/upgrade.mako') + else: + self.redirect('/') + + +class RpcThreadManage: + def __init__(self): + self._lock = threading.RLock() + self._threads = dict() + self._id_base = 0 + + def create_db(self): + with self._lock: + self._id_base += 1 + task_id = self._id_base + + t = threading.Thread(target=self._create_db, args=[task_id]) + self._threads[task_id] = {'cmd': 'create_db', 'running': True, 'stop': False, 'steps': list()} + t.start() + + return task_id + + def upgrade_db(self): + with self._lock: + self._id_base += 1 + task_id = self._id_base + + t = threading.Thread(target=self._upgrade_db, args=[task_id]) + self._threads[task_id] = {'cmd': 'create_db', 'running': True, 'stop': False, 'steps': list()} + t.start() + + return task_id + + def get_task(self, task_id): + with self._lock: + if task_id in self._threads: + # msg = list() + # for i in range(len(self._threads[task_id]['sub_tasks'])): + # msg.append({'ip': self._threads[task_id]['sub_tasks'][i]['ip'], 'msg': self._threads[task_id]['sub_tasks'][i]['msg']}) + + ret = { + 'cmd': self._threads[task_id]['cmd'], + 'running': self._threads[task_id]['running'], + # 'stop': self._threads[task_id]['stop'], + 'steps': self._threads[task_id]['steps'] + } + if not self._threads[task_id]['running']: + del self._threads[task_id] + return ret + else: + return None + + def stop_task(self, task_id): + with self._lock: + if task_id in self._threads: + self._threads[task_id]['msg'] = '正在终止...' + self._threads[task_id]['stop'] = True + + def _create_db(self, tid): + def _step_begin(msg): + return self._step_begin(tid, msg) + + def _step_end(sid, code, msg=None): + self._step_end(tid, sid, code, msg) + + if get_db().create_and_init(_step_begin, _step_end): + cfg.app_mode = APP_MODE_NORMAL + + # self._step_begin(tid, '操作已完成') + + self._thread_end(tid) + + def _upgrade_db(self, tid): + def _step_begin(msg): + return self._step_begin(tid, msg) + + def _step_end(sid, code, msg=None): + self._step_end(tid, sid, code, msg) + + if get_db().upgrade_database(_step_begin, _step_end): + cfg.app_mode = APP_MODE_NORMAL + + # self._step_begin(tid, '操作已完成') + + self._thread_end(tid) + + def _step_begin(self, tid, msg): + with self._lock: + if len(self._threads[tid]['steps']) > 0: + self._threads[tid]['steps'][-1]['stat'] = 0 # 0 表示此步骤已完成 + self._threads[tid]['steps'].append({'stat': 1, 'code': 0, 'msg': msg}) + + return len(self._threads[tid]['steps']) - 1 + + def _step_end(self, tid, sid, code, msg=None): + with self._lock: + try: + self._threads[tid]['steps'][sid]['code'] = code + self._threads[tid]['steps'][sid]['stat'] = 0 # 0 表示此步骤已完成 + if msg is not None: + self._threads[tid]['steps'][sid]['msg'] = '{}{}'.format(self._threads[tid]['steps'][sid]['msg'], msg) + except: + pass + + def _thread_end(self, tid): + with self._lock: + if tid in self._threads: + self._threads[tid]['running'] = False + if self._threads[tid]['stop']: + sid = self._step_begin(tid, '操作被终止') + self._step_end(tid, sid, -1) + if len(self._threads[tid]['steps']) > 0: + self._threads[tid]['steps'][-1]['stat'] = 0 + + +thread_mgr = RpcThreadManage() + + +class RpcHandler(TPBaseAdminAuthJsonHandler): + def post(self): + args = self.get_argument('args', None) + if args is not None: + args = json.loads(args) + else: + return self.write_json(-1, '参数错误') + + cmd = args['cmd'] + if cmd == 'enter_maintenance_mode': + cfg.app_mode = APP_MODE_MAINTENANCE + return self.write_json(0) + + if cmd == 'create_db': + if not get_db().need_create: + return self.write_json(-1, '无需创建') + task_id = thread_mgr.create_db() + return self.write_json(0, data={"task_id": task_id}) + + if cmd == 'upgrade_db': + if not get_db().need_upgrade: + return self.write_json(-1, '无需升级') + task_id = thread_mgr.upgrade_db() + return self.write_json(0, data={"task_id": task_id}) + + elif cmd == 'get_task_ret': + r = thread_mgr.get_task(args['tid']) + if r is None: + return self.write_json(0, data={'running': False, 'steps': []}) + else: + return self.write_json(0, data=r) + + else: + self.write_json(-1, '未知命令 `{}`!'.format(cmd)) diff --git a/server/www/teleport/static/js/ui/config/database.js b/server/www/teleport/static/js/ui/config/database.js deleted file mode 100644 index 6d21ade..0000000 --- a/server/www/teleport/static/js/ui/config/database.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; - -ywl.on_init = function (cb_stack, cb_args) { - console.log(ywl.page_options); - - var dom = { - info: $('#info-kv') - }; - - var html = []; - - // 版本号 - var db = ywl.page_options.db; - if (db.type === 1) { - html.push(ywl._make_info('数据库类型', 'SQLite')); - html.push(ywl._make_info('数据库文件', db.file)); - } else if(db.type === 2) { - html.push(ywl._make_info('数据库类型', 'MySQL')); - } else { - html.push(ywl._make_info('数据库类型', '未知类型(' + db.type + ')')); - } - - dom.info.append(html.join('')); - -// $("#current-rdp-port").val(core.rdp.port); -// $("#current-ssh-port").val(core.ssh.port); -// $("#current-telnet-port").val(core.telnet.port); - - cb_stack.exec(); -}; - -ywl._make_info = function (key, value) { - if (_.isUndefined(value)) - value = '未能检测到'; - return '' + key + ':' + value + ''; -}; diff --git a/server/www/teleport/static/js/ui/config/info.js b/server/www/teleport/static/js/ui/config/info.js index 5cb837a..3f7aaa2 100644 --- a/server/www/teleport/static/js/ui/config/info.js +++ b/server/www/teleport/static/js/ui/config/info.js @@ -5,6 +5,7 @@ ywl.on_init = function (cb_stack, cb_args) { var dom = { info: $('#info-kv') +// , btn_maintance: $('#btn_maintenance') }; var html = []; @@ -17,7 +18,14 @@ 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)); + var db_type = '未知'; + if (ywl.page_options.web.db.type === DB_TYPE_SQLITE) { + db_type = 'SQLite(' + ywl.page_options.web.db.file + ')'; + } else if (ywl.page_options.web.db.type === DB_TYPE_MYSQL) { + db_type = 'MySQL'; + } + + html.push(ywl._make_info('数据库类型', db_type)); 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)); @@ -29,10 +37,30 @@ ywl.on_init = function (cb_stack, cb_args) { dom.info.append(html.join('')); -// $("#current-rdp-port").val(core.rdp.port); -// $("#current-ssh-port").val(core.ssh.port); -// $("#current-telnet-port").val(core.telnet.port); - +// dom.btn_maintance.click(function () { +// var _fn_sure = function (cb_stack, cb_args) { +// ywl.ajax_post_json('/maintenance/rpc', {cmd: 'enter_maintenance_mode'}, +// function (ret) { +// if (ret.code === TPE_OK) { +// window.location.href = '/maintenance/index'; +// } +// else { +// ywl.notify_error('无法进入维护模式:' + ret.message); +// } +// }, +// function () { +// ywl.notify_error('网络故障,无法进入维护模式!'); +// } +// ); +// }; +// var cb_stack = CALLBACK_STACK.create(); +// +// ywl.dlg_confirm(cb_stack, { +// msg: '

您确定要进入维护模式吗?!!

', +// fn_yes: _fn_sure +// }); +// }); +// cb_stack.exec(); }; diff --git a/server/www/teleport/static/js/ywl_const.js b/server/www/teleport/static/js/ywl_const.js index 0632028..a53e16a 100644 --- a/server/www/teleport/static/js/ywl_const.js +++ b/server/www/teleport/static/js/ywl_const.js @@ -11,6 +11,9 @@ var AUTH_TYPE_PASSWORD = 1; var AUTH_TYPE_SSHKEY = 2; var AUTH_NONE = 0; +var DB_TYPE_UNKNOWN = 0; +var DB_TYPE_SQLITE = 1; +var DB_TYPE_MYSQL = 2; //var USER_TYPE_TEAM_MEMBER = 1; //var USER_TYPE_TEAM_LEADER = 9; diff --git a/server/www/teleport/view/common/_sidebar_nav_menu.mako b/server/www/teleport/view/common/_sidebar_nav_menu.mako index 59854e0..7507325 100644 --- a/server/www/teleport/view/common/_sidebar_nav_menu.mako +++ b/server/www/teleport/view/common/_sidebar_nav_menu.mako @@ -3,13 +3,13 @@ %> <% _sidebar = [ - { - 'require_type': 100, - 'id': 'dashboard', - 'link': '/dashboard', - 'name': '信息总览', - 'icon': 'fa-dashboard', - }, +## { +## 'require_type': 100, +## 'id': 'dashboard', +## 'link': '/dashboard', +## 'name': '信息总览', +## 'icon': 'fa-dashboard', +## }, { 'require_type': 1, 'id': 'host', @@ -38,26 +38,33 @@ 'name': '分组管理', 'icon': 'fa-object-group', }, +## { +## 'require_type': 100, +## 'id': 'set', +## 'link': '', +## 'name': '配置管理', +## 'icon': 'fa-cogs', +## 'sub': [ +## { +## 'require_type': 100, +## 'id': 'info', +## 'link': '/set/info', +## 'name': '配置信息' +## }, +## { +## 'require_type': 100, +## 'id': 'database', +## 'link': '/set/db', +## 'name': '数据库管理' +## } +## ] +## }, { 'require_type': 100, - 'id': 'set', - 'link': '', + 'id': 'config', + 'link': '/config', 'name': '配置管理', 'icon': 'fa-cogs', - 'sub': [ - { - 'require_type': 100, - 'id': 'info', - 'link': '/set/info', - 'name': '配置信息' - }, - { - 'require_type': 100, - 'id': 'database', - 'link': '/set/db', - 'name': '数据库管理' - } - ] }, { 'require_type': 100, diff --git a/server/www/teleport/view/set/info.mako b/server/www/teleport/view/config/index.mako similarity index 81% rename from server/www/teleport/view/set/info.mako rename to server/www/teleport/view/config/index.mako index 117b923..810f7c8 100644 --- a/server/www/teleport/view/set/info.mako +++ b/server/www/teleport/view/config/index.mako @@ -1,7 +1,7 @@ <%! page_title_ = '配置管理' - page_menu_ = ['set', 'info'] - page_id_ = 'set' + page_menu_ = ['config'] + page_id_ = 'config' %> <%inherit file="../page_base.mako"/> @@ -14,7 +14,6 @@ <%block name="breadcrumb"> @@ -51,6 +50,11 @@
+##
+##

高级设置

+##

进入维护模式

+##
+ diff --git a/server/www/teleport/view/page_maintenance_base.mako b/server/www/teleport/view/page_maintenance_base.mako index 1530767..96d011d 100644 --- a/server/www/teleport/view/page_maintenance_base.mako +++ b/server/www/teleport/view/page_maintenance_base.mako @@ -1,104 +1,104 @@ - - <%! - page_title_ = '' - %> - - - - - - - - - - - - ${self.attr.page_title_}::TELEPORT - - - - - - - - - - <%block name="extend_css"/> - <%block name="embed_css"/> - - - - - -
- - - - - -
- ${self.body()} -
- - -
- - - <%block name="extend_content" /> - - - - - - ## - - -## - - - - - - -## -## -## - - - <%block name="extend_js"/> - - - - - - <%block name="embed_js" /> - - - + + <%! + page_title_ = '' + %> + + + + + + + + + + + + ${self.attr.page_title_}::TELEPORT + + + + + + + + + + <%block name="extend_css"/> + <%block name="embed_css"/> + + + + + +
+ + + + + +
+ ${self.body()} +
+ + +
+ + + <%block name="extend_content" /> + + + + + + ## + + +## + + + + + + +## +## +## + + + <%block name="extend_js"/> + + + + + + <%block name="embed_js" /> + + + \ No newline at end of file diff --git a/server/www/teleport/view/page_no_sidebar_base.mako b/server/www/teleport/view/page_no_sidebar_base.mako index f459d5a..74460bd 100644 --- a/server/www/teleport/view/page_no_sidebar_base.mako +++ b/server/www/teleport/view/page_no_sidebar_base.mako @@ -34,7 +34,7 @@