temp: 暂时不允许升级到MySQL,如需使用MySQL,只能在新安装的时候选择使用。

pull/32/head
Apex Liu 2017-05-17 02:15:07 +08:00
parent f7b5768155
commit 4c3e98d38d
12 changed files with 661 additions and 678 deletions

View File

@ -8,12 +8,12 @@ from . import host
from . import cert from . import cert
from . import user from . import user
from . import pwd from . import pwd
from . import set from . import config
from . import group from . import group
from . import index from . import index
from . import record from . import record
from . import maintenance from . import maintenance
import tornado.web # import tornado.web
from eom_app.app.configs import app_cfg from eom_app.app.configs import app_cfg
@ -29,8 +29,8 @@ controllers = [
(r'/maintenance/install', maintenance.InstallHandler), (r'/maintenance/install', maintenance.InstallHandler),
(r'/maintenance/upgrade', maintenance.UpgradeHandler), (r'/maintenance/upgrade', maintenance.UpgradeHandler),
(r'/maintenance/rpc', maintenance.RpcHandler), (r'/maintenance/rpc', maintenance.RpcHandler),
(r'/maintenance/', maintenance.IndexHandler), (r'/maintenance/index', maintenance.IndexHandler),
(r'/maintenance', maintenance.IndexHandler), # (r'/maintenance', maintenance.IndexHandler),
(r'/rpc', rpc.RpcHandler), (r'/rpc', rpc.RpcHandler),
@ -111,10 +111,10 @@ controllers = [
# (r'/set/update-config', set.UpdateConfig), # (r'/set/update-config', set.UpdateConfig),
# (r'/set/os-operator', set.OsOperator), # (r'/set/os-operator', set.OsOperator),
(r'/set/info', set.InfoHandler), # (r'/set/info', config.InfoHandler),
(r'/set/db', set.DatabaseHandler), # (r'/set/db', config.DatabaseHandler),
# (r'/set/', set.IndexHandler), (r'/config/', config.IndexHandler),
# (r'/set', set.IndexHandler), (r'/config', config.IndexHandler),
(r'/uidesign', index.UIDesignHandler), (r'/uidesign', index.UIDesignHandler),
(r'/uidesign/without-sidebar', index.UIDesignWithoutSidebarHandler), (r'/uidesign/without-sidebar', index.UIDesignWithoutSidebarHandler),

View File

@ -1,233 +1,233 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import binascii import binascii
import os import os
import time import time
from urllib.parse import quote from urllib.parse import quote
import mako.lookup import mako.lookup
import mako.template import mako.template
import tornado.web import tornado.web
from eom_app.app.configs import app_cfg from eom_app.app.configs import app_cfg
from eom_app.app.const import * from eom_app.app.const import *
from eom_app.app.db import get_db from eom_app.app.db import get_db
from eom_app.app.session import web_session, SESSION_EXPIRE from eom_app.app.session import web_session, SESSION_EXPIRE
from tornado.escape import json_encode from tornado.escape import json_encode
cfg = app_cfg() cfg = app_cfg()
class TPBaseHandler(tornado.web.RequestHandler): class TPBaseHandler(tornado.web.RequestHandler):
""" """
所有http请求处理的基类只有极少数的请求如登录维护直接从本类继承其他的所有类均从本类的子类控制权限的类继承 所有http请求处理的基类只有极少数的请求如登录维护直接从本类继承其他的所有类均从本类的子类控制权限的类继承
""" """
MODE_HTTP = 0 MODE_HTTP = 0
MODE_JSON = 1 MODE_JSON = 1
def __init__(self, application, request, **kwargs): def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs) super().__init__(application, request, **kwargs)
self._s_id = None self._s_id = None
self._mode = self.MODE_HTTP self._mode = self.MODE_HTTP
def initialize(self): def initialize(self):
template_path = self.get_template_path() template_path = self.get_template_path()
self.lookup = mako.lookup.TemplateLookup(directories=[template_path], input_encoding='utf-8', output_encoding='utf-8') self.lookup = mako.lookup.TemplateLookup(directories=[template_path], input_encoding='utf-8', output_encoding='utf-8')
def render_string(self, template_name, **kwargs): def render_string(self, template_name, **kwargs):
template = self.lookup.get_template(template_name) template = self.lookup.get_template(template_name)
namespace = self.get_template_namespace() namespace = self.get_template_namespace()
namespace.update(kwargs) namespace.update(kwargs)
return template.render(**namespace) return template.render(**namespace)
def render(self, template_path, **kwargs): def render(self, template_path, **kwargs):
if self._mode != self.MODE_HTTP: if self._mode != self.MODE_HTTP:
self.write_json(-1, 'should be web page request.') self.write_json(-1, 'should be web page request.')
return return
self.finish(self.render_string(template_path, **kwargs)) self.finish(self.render_string(template_path, **kwargs))
def write_json(self, code, message='', data=None): def write_json(self, code, message='', data=None):
if self._mode != self.MODE_JSON: if self._mode != self.MODE_JSON:
self.write('should be json request.') self.write('should be json request.')
self.finish() self.finish()
return return
if not isinstance(code, int): if not isinstance(code, int):
raise RuntimeError('`code` must be a integer.') raise RuntimeError('`code` must be a integer.')
if not isinstance(message, str): if not isinstance(message, str):
raise RuntimeError('`msg` must be a string.') raise RuntimeError('`msg` must be a string.')
if data is None: if data is None:
data = list() data = list()
_ret = {'code': code, 'message': message, 'data': data} _ret = {'code': code, 'message': message, 'data': data}
self.set_header("Content-Type", "application/json") self.set_header("Content-Type", "application/json")
self.write(json_encode(_ret)) self.write(json_encode(_ret))
self.finish() self.finish()
def write_raw_json(self, data=None): def write_raw_json(self, data=None):
if self._mode != self.MODE_JSON: if self._mode != self.MODE_JSON:
self.write('should be json request.') self.write('should be json request.')
self.finish() self.finish()
return return
if data is None: if data is None:
data = list() data = list()
self.set_header("Content-Type", "application/json") self.set_header("Content-Type", "application/json")
self.write(json_encode(data)) self.write(json_encode(data))
self.finish() self.finish()
def prepare(self): def prepare(self):
super().prepare() super().prepare()
if self._finished: if self._finished:
return return
# if self.application.settings.get("xsrf_cookies"): # if self.application.settings.get("xsrf_cookies"):
# x = self.xsrf_token # x = self.xsrf_token
self._s_id = self.get_cookie('_sid') self._s_id = self.get_cookie('_sid')
if self._s_id is None: if self._s_id is None:
self._s_id = 'tp_{}_{}'.format(int(time.time()), binascii.b2a_hex(os.urandom(8)).decode()) self._s_id = 'tp_{}_{}'.format(int(time.time()), binascii.b2a_hex(os.urandom(8)).decode())
self.set_cookie('_sid', self._s_id) self.set_cookie('_sid', self._s_id)
def set_session(self, name, value, expire=SESSION_EXPIRE): def set_session(self, name, value, expire=SESSION_EXPIRE):
k = '{}-{}'.format(self._s_id, name) k = '{}-{}'.format(self._s_id, name)
web_session().set(k, value, expire) web_session().set(k, value, expire)
def get_session(self, name, _default=None): def get_session(self, name, _default=None):
k = '{}-{}'.format(self._s_id, name) k = '{}-{}'.format(self._s_id, name)
return web_session().get(k, _default) return web_session().get(k, _default)
def del_session(self, name): def del_session(self, name):
k = '{}-{}'.format(self._s_id, name) k = '{}-{}'.format(self._s_id, name)
return web_session().set(k, '', -1) return web_session().set(k, '', -1)
def get_current_user(self): def get_current_user(self):
user = self.get_session('user') user = self.get_session('user')
if user is None: if user is None:
user = dict() user = dict()
user['id'] = 0 user['id'] = 0
user['name'] = 'guest' user['name'] = 'guest'
user['nick_name'] = '访客' user['nick_name'] = '访客'
user['status'] = 0 user['status'] = 0
user['phone_num'] = '110' user['phone_num'] = '110'
user['type'] = 0 user['type'] = 0
user['permission'] = 0 user['permission'] = 0
user['is_login'] = False user['is_login'] = False
return user return user
class TPBaseJsonHandler(TPBaseHandler): class TPBaseJsonHandler(TPBaseHandler):
""" """
所有返回JSON数据的控制器均从本类集成返回的数据格式一律包含三个字段code/msg/data 所有返回JSON数据的控制器均从本类集成返回的数据格式一律包含三个字段code/msg/data
code: 0=成功其他=失败 code: 0=成功其他=失败
msg: 字符串一般用于code为非零指出错误原因 msg: 字符串一般用于code为非零指出错误原因
data: 一般用于成功操作的返回的业务数据 data: 一般用于成功操作的返回的业务数据
""" """
def __init__(self, application, request, **kwargs): def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs) super().__init__(application, request, **kwargs)
self._mode = self.MODE_JSON self._mode = self.MODE_JSON
class TPBaseUserAuthHandler(TPBaseHandler): class TPBaseUserAuthHandler(TPBaseHandler):
def __init__(self, application, request, **kwargs): def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs) super().__init__(application, request, **kwargs)
def prepare(self): def prepare(self):
super().prepare() super().prepare()
if self._finished: if self._finished:
return return
reference = self.request.uri reference = self.request.uri
user = self.get_current_user() user = self.get_current_user()
if not user['is_login']: if not user['is_login']:
if reference != '/auth/login': if reference != '/auth/login':
x = quote(reference) x = quote(reference)
self.redirect('/auth/login?ref={}'.format(x)) self.redirect('/auth/login?ref={}'.format(x))
else: else:
self.redirect('/auth/login') self.redirect('/auth/login')
else: else:
if cfg.app_mode == APP_MODE_MAINTENANCE: if cfg.app_mode == APP_MODE_MAINTENANCE:
if user['type'] != 100: if user['type'] != 100:
self.render('maintenance/index.mako') self.render('maintenance/index.mako')
else: else:
if not reference.startswith('/maintenance/'): if not reference.startswith('/maintenance/'):
if get_db().need_create: if get_db().need_create:
self.redirect('/maintenance/install') self.redirect('/maintenance/install')
elif get_db().need_upgrade: elif get_db().need_upgrade:
self.redirect('/maintenance/upgrade') self.redirect('/maintenance/upgrade')
class TPBaseAdminAuthHandler(TPBaseHandler): class TPBaseAdminAuthHandler(TPBaseHandler):
def __init__(self, application, request, **kwargs): def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs) super().__init__(application, request, **kwargs)
def prepare(self): def prepare(self):
super().prepare() super().prepare()
if self._finished: if self._finished:
return return
reference = self.request.uri reference = self.request.uri
user = self.get_current_user() user = self.get_current_user()
if not user['is_login'] or user['type'] != 100: if not user['is_login'] or user['type'] != 100:
if reference != '/auth/login': # 防止循环重定向 if reference != '/auth/login': # 防止循环重定向
x = quote(reference) x = quote(reference)
self.redirect('/auth/login?ref={}'.format(x)) self.redirect('/auth/login?ref={}'.format(x))
else: else:
self.redirect('/auth/login') self.redirect('/auth/login')
else: else:
if cfg.app_mode == APP_MODE_MAINTENANCE: if cfg.app_mode == APP_MODE_MAINTENANCE:
if not reference.startswith('/maintenance/'): if not reference.startswith('/maintenance/'):
if get_db().need_create: if get_db().need_create:
self.redirect('/maintenance/install') self.redirect('/maintenance/install')
elif get_db().need_upgrade: elif get_db().need_upgrade:
self.redirect('/maintenance/upgrade') self.redirect('/maintenance/upgrade')
class TPBaseUserAuthJsonHandler(TPBaseJsonHandler): class TPBaseUserAuthJsonHandler(TPBaseJsonHandler):
def __init__(self, application, request, **kwargs): def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs) super().__init__(application, request, **kwargs)
def prepare(self): def prepare(self):
super().prepare() super().prepare()
if self._finished: if self._finished:
return return
reference = self.request.uri reference = self.request.uri
user = self.get_current_user() user = self.get_current_user()
if not user['is_login']: if not user['is_login']:
if reference != '/auth/login': if reference != '/auth/login':
self.write_json(-99) self.write_json(-99)
else: else:
self.write_json(-99) self.write_json(-99)
else: else:
if cfg.app_mode == APP_MODE_MAINTENANCE and user['type'] != 100: if cfg.app_mode == APP_MODE_MAINTENANCE and user['type'] != 100:
self.write_json(-1, 'maintenance mode') self.write_json(-1, 'maintenance mode')
else: else:
pass pass
class TPBaseAdminAuthJsonHandler(TPBaseJsonHandler): class TPBaseAdminAuthJsonHandler(TPBaseJsonHandler):
def __init__(self, application, request, **kwargs): def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs) super().__init__(application, request, **kwargs)
def prepare(self): def prepare(self):
super().prepare() super().prepare()
if self._finished: if self._finished:
return return
reference = self.request.uri reference = self.request.uri
user = self.get_current_user() user = self.get_current_user()
if not user['is_login'] or user['type'] != 100: if not user['is_login'] or user['type'] != 100:
if reference != '/auth/login': if reference != '/auth/login':
self.write_json(-99) self.write_json(-99)

View File

@ -13,7 +13,7 @@ from .base import TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler
cfg = app_cfg() cfg = app_cfg()
class InfoHandler(TPBaseAdminAuthHandler): class IndexHandler(TPBaseAdminAuthHandler):
@tornado.gen.coroutine @tornado.gen.coroutine
def get(self): def get(self):
core_detected = False core_detected = False
@ -32,34 +32,73 @@ class InfoHandler(TPBaseAdminAuthHandler):
cfg.update_core(None) cfg.update_core(None)
_db = get_db() _db = get_db()
database = '未知' # database = '未知'
if _db.db_source['type'] == _db.DB_TYPE_SQLITE: db = _db.db_source
database = 'SQLite{}'.format(_db.db_source['file']) # if _db.db_source['type'] == _db.DB_TYPE_SQLITE:
elif _db.db_source['type'] == _db.DB_TYPE_MYSQL: # database = 'SQLite{}'.format(_db.db_source['file'])
database = 'MySQL' # el
if _db.db_source['type'] == _db.DB_TYPE_MYSQL:
# database = 'MySQL'
del db['password']
param = { param = {
'core': cfg.core, 'core': cfg.core,
'web': { 'web': {
'version': TS_VER, 'version': TS_VER,
'core_server_rpc': cfg['core_server_rpc'], '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): # class DatabaseHandler(TPBaseAdminAuthHandler):
def get(self): # def get(self):
_db = get_db() # _db = get_db()
# database = '未知' # # database = '未知'
# if _db.db_source['type'] == _db.DB_TYPE_SQLITE: # # if _db.db_source['type'] == _db.DB_TYPE_SQLITE:
# database = 'SQLite{}'.format(_db.db_source['file']) # # database = 'SQLite{}'.format(_db.db_source['file'])
# elif _db.db_source['type'] == _db.DB_TYPE_MYSQL: # # elif _db.db_source['type'] == _db.DB_TYPE_MYSQL:
# database = 'MySQL' # # database = 'MySQL'
#
param = {'db': _db.db_source} # param = {'db': _db.db_source}
self.render('set/database.mako', page_param=json.dumps(param)) # self.render('set/database.mako', page_param=json.dumps(param))
# def _restart_func(): # def _restart_func():
# time.sleep(1) # time.sleep(1)

View File

@ -1,181 +1,185 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json import json
import threading import threading
from eom_app.app.configs import app_cfg from eom_app.app.configs import app_cfg
from eom_app.app.const import * from eom_app.app.const import *
from eom_app.app.db import get_db from eom_app.app.db import get_db
from .base import TPBaseUserAuthHandler, TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler from .base import TPBaseUserAuthHandler, TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler
cfg = app_cfg() cfg = app_cfg()
class IndexHandler(TPBaseUserAuthHandler): class IndexHandler(TPBaseUserAuthHandler):
def get(self): def get(self):
self.render('maintenance/index.mako') self.render('maintenance/index.mako')
class InstallHandler(TPBaseAdminAuthHandler): class InstallHandler(TPBaseAdminAuthHandler):
def get(self): def get(self):
if get_db().need_create: if get_db().need_create:
self.render('maintenance/install.mako') self.render('maintenance/install.mako')
elif get_db().need_upgrade: elif get_db().need_upgrade:
return self.redirect('/maintenance/upgrade') return self.redirect('/maintenance/upgrade')
else: else:
self.redirect('/') self.redirect('/')
class UpgradeHandler(TPBaseAdminAuthHandler): class UpgradeHandler(TPBaseAdminAuthHandler):
def get(self): def get(self):
if get_db().need_create: if get_db().need_create:
return self.redirect('/maintenance/install') return self.redirect('/maintenance/install')
elif get_db().need_upgrade: elif get_db().need_upgrade:
self.render('maintenance/upgrade.mako') self.render('maintenance/upgrade.mako')
else: else:
self.redirect('/') self.redirect('/')
class RpcThreadManage: class RpcThreadManage:
def __init__(self): def __init__(self):
self._lock = threading.RLock() self._lock = threading.RLock()
self._threads = dict() self._threads = dict()
self._id_base = 0 self._id_base = 0
def create_db(self): def create_db(self):
with self._lock: with self._lock:
self._id_base += 1 self._id_base += 1
task_id = self._id_base task_id = self._id_base
t = threading.Thread(target=self._create_db, args=[task_id]) t = threading.Thread(target=self._create_db, args=[task_id])
self._threads[task_id] = {'cmd': 'create_db', 'running': True, 'stop': False, 'steps': list()} self._threads[task_id] = {'cmd': 'create_db', 'running': True, 'stop': False, 'steps': list()}
t.start() t.start()
return task_id return task_id
def upgrade_db(self): def upgrade_db(self):
with self._lock: with self._lock:
self._id_base += 1 self._id_base += 1
task_id = self._id_base task_id = self._id_base
t = threading.Thread(target=self._upgrade_db, args=[task_id]) t = threading.Thread(target=self._upgrade_db, args=[task_id])
self._threads[task_id] = {'cmd': 'create_db', 'running': True, 'stop': False, 'steps': list()} self._threads[task_id] = {'cmd': 'create_db', 'running': True, 'stop': False, 'steps': list()}
t.start() t.start()
return task_id return task_id
def get_task(self, task_id): def get_task(self, task_id):
with self._lock: with self._lock:
if task_id in self._threads: if task_id in self._threads:
# msg = list() # msg = list()
# for i in range(len(self._threads[task_id]['sub_tasks'])): # 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']}) # msg.append({'ip': self._threads[task_id]['sub_tasks'][i]['ip'], 'msg': self._threads[task_id]['sub_tasks'][i]['msg']})
ret = { ret = {
'cmd': self._threads[task_id]['cmd'], 'cmd': self._threads[task_id]['cmd'],
'running': self._threads[task_id]['running'], 'running': self._threads[task_id]['running'],
# 'stop': self._threads[task_id]['stop'], # 'stop': self._threads[task_id]['stop'],
'steps': self._threads[task_id]['steps'] 'steps': self._threads[task_id]['steps']
} }
if not self._threads[task_id]['running']: if not self._threads[task_id]['running']:
del self._threads[task_id] del self._threads[task_id]
return ret return ret
else: else:
return None return None
def stop_task(self, task_id): def stop_task(self, task_id):
with self._lock: with self._lock:
if task_id in self._threads: if task_id in self._threads:
self._threads[task_id]['msg'] = '正在终止...' self._threads[task_id]['msg'] = '正在终止...'
self._threads[task_id]['stop'] = True self._threads[task_id]['stop'] = True
def _create_db(self, tid): def _create_db(self, tid):
def _step_begin(msg): def _step_begin(msg):
return self._step_begin(tid, msg) return self._step_begin(tid, msg)
def _step_end(sid, code, msg=None): def _step_end(sid, code, msg=None):
self._step_end(tid, sid, code, msg) self._step_end(tid, sid, code, msg)
if get_db().create_and_init(_step_begin, _step_end): if get_db().create_and_init(_step_begin, _step_end):
cfg.app_mode = APP_MODE_NORMAL cfg.app_mode = APP_MODE_NORMAL
# self._step_begin(tid, '操作已完成') # self._step_begin(tid, '操作已完成')
self._thread_end(tid) self._thread_end(tid)
def _upgrade_db(self, tid): def _upgrade_db(self, tid):
def _step_begin(msg): def _step_begin(msg):
return self._step_begin(tid, msg) return self._step_begin(tid, msg)
def _step_end(sid, code, msg=None): def _step_end(sid, code, msg=None):
self._step_end(tid, sid, code, msg) self._step_end(tid, sid, code, msg)
if get_db().upgrade_database(_step_begin, _step_end): if get_db().upgrade_database(_step_begin, _step_end):
cfg.app_mode = APP_MODE_NORMAL cfg.app_mode = APP_MODE_NORMAL
# self._step_begin(tid, '操作已完成') # self._step_begin(tid, '操作已完成')
self._thread_end(tid) self._thread_end(tid)
def _step_begin(self, tid, msg): def _step_begin(self, tid, msg):
with self._lock: with self._lock:
if len(self._threads[tid]['steps']) > 0: if len(self._threads[tid]['steps']) > 0:
self._threads[tid]['steps'][-1]['stat'] = 0 # 0 表示此步骤已完成 self._threads[tid]['steps'][-1]['stat'] = 0 # 0 表示此步骤已完成
self._threads[tid]['steps'].append({'stat': 1, 'code': 0, 'msg': msg}) self._threads[tid]['steps'].append({'stat': 1, 'code': 0, 'msg': msg})
return len(self._threads[tid]['steps']) - 1 return len(self._threads[tid]['steps']) - 1
def _step_end(self, tid, sid, code, msg=None): def _step_end(self, tid, sid, code, msg=None):
with self._lock: with self._lock:
try: try:
self._threads[tid]['steps'][sid]['code'] = code self._threads[tid]['steps'][sid]['code'] = code
self._threads[tid]['steps'][sid]['stat'] = 0 # 0 表示此步骤已完成 self._threads[tid]['steps'][sid]['stat'] = 0 # 0 表示此步骤已完成
if msg is not None: if msg is not None:
self._threads[tid]['steps'][sid]['msg'] = '{}{}'.format(self._threads[tid]['steps'][sid]['msg'], msg) self._threads[tid]['steps'][sid]['msg'] = '{}{}'.format(self._threads[tid]['steps'][sid]['msg'], msg)
except: except:
pass pass
def _thread_end(self, tid): def _thread_end(self, tid):
with self._lock: with self._lock:
if tid in self._threads: if tid in self._threads:
self._threads[tid]['running'] = False self._threads[tid]['running'] = False
if self._threads[tid]['stop']: if self._threads[tid]['stop']:
sid = self._step_begin(tid, '操作被终止') sid = self._step_begin(tid, '操作被终止')
self._step_end(tid, sid, -1) self._step_end(tid, sid, -1)
if len(self._threads[tid]['steps']) > 0: if len(self._threads[tid]['steps']) > 0:
self._threads[tid]['steps'][-1]['stat'] = 0 self._threads[tid]['steps'][-1]['stat'] = 0
thread_mgr = RpcThreadManage() thread_mgr = RpcThreadManage()
class RpcHandler(TPBaseAdminAuthJsonHandler): class RpcHandler(TPBaseAdminAuthJsonHandler):
def post(self): def post(self):
args = self.get_argument('args', None) args = self.get_argument('args', None)
if args is not None: if args is not None:
args = json.loads(args) args = json.loads(args)
else: else:
return self.write_json(-1, '参数错误') return self.write_json(-1, '参数错误')
cmd = args['cmd'] cmd = args['cmd']
if cmd == 'create_db': if cmd == 'enter_maintenance_mode':
if not get_db().need_create: cfg.app_mode = APP_MODE_MAINTENANCE
return self.write_json(-1, '无需创建') return self.write_json(0)
task_id = thread_mgr.create_db()
return self.write_json(0, data={"task_id": task_id}) if cmd == 'create_db':
if not get_db().need_create:
if cmd == 'upgrade_db': return self.write_json(-1, '无需创建')
if not get_db().need_upgrade: task_id = thread_mgr.create_db()
return self.write_json(-1, '无需升级') return self.write_json(0, data={"task_id": task_id})
task_id = thread_mgr.upgrade_db()
return self.write_json(0, data={"task_id": task_id}) if cmd == 'upgrade_db':
if not get_db().need_upgrade:
elif cmd == 'get_task_ret': return self.write_json(-1, '无需升级')
r = thread_mgr.get_task(args['tid']) task_id = thread_mgr.upgrade_db()
if r is None: return self.write_json(0, data={"task_id": task_id})
return self.write_json(0, data={'running': False, 'steps': []})
else: elif cmd == 'get_task_ret':
return self.write_json(0, data=r) r = thread_mgr.get_task(args['tid'])
if r is None:
else: return self.write_json(0, data={'running': False, 'steps': []})
self.write_json(-1, '未知命令 `{}`'.format(cmd)) else:
return self.write_json(0, data=r)
else:
self.write_json(-1, '未知命令 `{}`'.format(cmd))

View File

@ -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 = '<span class="error">未能检测到</span>';
return '<tr><td class="key">' + key + '</td><td class="value">' + value + '</td></tr>';
};

View File

@ -5,6 +5,7 @@ ywl.on_init = function (cb_stack, cb_args) {
var dom = { var dom = {
info: $('#info-kv') info: $('#info-kv')
// , btn_maintance: $('#btn_maintenance')
}; };
var html = []; 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.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)); html.push(ywl._make_info('核心服务通讯地址', ywl.page_options.web.core_server_rpc));
if (ywl.page_options.core.detected) { if (ywl.page_options.core.detected) {
html.push(ywl._make_info('WEB服务通讯地址', ywl.page_options.core.web_server_rpc)); 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('')); dom.info.append(html.join(''));
// $("#current-rdp-port").val(core.rdp.port); // dom.btn_maintance.click(function () {
// $("#current-ssh-port").val(core.ssh.port); // var _fn_sure = function (cb_stack, cb_args) {
// $("#current-telnet-port").val(core.telnet.port); // 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: '<p>您确定要进入维护模式吗?!!</p>',
// fn_yes: _fn_sure
// });
// });
//
cb_stack.exec(); cb_stack.exec();
}; };

View File

@ -11,6 +11,9 @@ var AUTH_TYPE_PASSWORD = 1;
var AUTH_TYPE_SSHKEY = 2; var AUTH_TYPE_SSHKEY = 2;
var AUTH_NONE = 0; 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_MEMBER = 1;
//var USER_TYPE_TEAM_LEADER = 9; //var USER_TYPE_TEAM_LEADER = 9;

View File

@ -3,13 +3,13 @@
%> %>
<% <%
_sidebar = [ _sidebar = [
{ ## {
'require_type': 100, ## 'require_type': 100,
'id': 'dashboard', ## 'id': 'dashboard',
'link': '/dashboard', ## 'link': '/dashboard',
'name': '信息总览', ## 'name': '信息总览',
'icon': 'fa-dashboard', ## 'icon': 'fa-dashboard',
}, ## },
{ {
'require_type': 1, 'require_type': 1,
'id': 'host', 'id': 'host',
@ -38,26 +38,33 @@
'name': '分组管理', 'name': '分组管理',
'icon': 'fa-object-group', '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, 'require_type': 100,
'id': 'set', 'id': 'config',
'link': '', 'link': '/config',
'name': '配置管理', 'name': '配置管理',
'icon': 'fa-cogs', '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, 'require_type': 100,

View File

@ -1,7 +1,7 @@
<%! <%!
page_title_ = '配置管理' page_title_ = '配置管理'
page_menu_ = ['set', 'info'] page_menu_ = ['config']
page_id_ = 'set' page_id_ = 'config'
%> %>
<%inherit file="../page_base.mako"/> <%inherit file="../page_base.mako"/>
@ -14,7 +14,6 @@
<%block name="breadcrumb"> <%block name="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><i class="fa fa-cogs fa-fw"></i> ${self.attr.page_title_}</li> <li><i class="fa fa-cogs fa-fw"></i> ${self.attr.page_title_}</li>
<li>配置信息</li>
</ol> </ol>
</%block> </%block>
@ -51,6 +50,11 @@
<table id="info-kv" class="table"></table> <table id="info-kv" class="table"></table>
</div> </div>
## <div>
## <h4><strong>高级设置</strong></h4>
## <p><a href="javascript:;" id="btn_maintenance">进入维护模式</a></p>
## </div>
</div> </div>
<!-- end of box --> <!-- end of box -->
</div> </div>

View File

@ -1,104 +1,104 @@
<!DOCTYPE html> <!DOCTYPE html>
<%! <%!
page_title_ = '' page_title_ = ''
%> %>
<!--[if IE 8]><html lang="en" class="ie8"> <![endif]--> <!--[if IE 8]><html lang="en" class="ie8"> <![endif]-->
<!--[if !IE]><!--> <!--[if !IE]><!-->
<html lang="zh_CN"> <html lang="zh_CN">
<!--<![endif]--> <!--<![endif]-->
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta content="yes" name="apple-mobile-web-app-capable"> <meta content="yes" name="apple-mobile-web-app-capable">
<meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"> <meta content="black-translucent" name="apple-mobile-web-app-status-bar-style">
<title>${self.attr.page_title_}::TELEPORT</title> <title>${self.attr.page_title_}::TELEPORT</title>
<link rel="shortcut icon" href="${ static_url('favicon.png') }"> <link rel="shortcut icon" href="${ static_url('favicon.png') }">
<link href="${ static_url('plugins/google-cache/open-sans.css') }" rel="stylesheet"> <link href="${ static_url('plugins/google-cache/open-sans.css') }" rel="stylesheet">
<link href="${ static_url('plugins/bootstrap/css/bootstrap.min.css') }" rel="stylesheet" type="text/css"/> <link href="${ static_url('plugins/bootstrap/css/bootstrap.min.css') }" rel="stylesheet" type="text/css"/>
<link href="${ static_url('plugins/font-awesome/css/font-awesome.min.css') }" rel="stylesheet"> <link href="${ static_url('plugins/font-awesome/css/font-awesome.min.css') }" rel="stylesheet">
<link href="${ static_url('plugins/gritter/css/jquery.gritter.css') }" rel="stylesheet"> <link href="${ static_url('plugins/gritter/css/jquery.gritter.css') }" rel="stylesheet">
<link href="${ static_url('css/sub.css') }" rel="stylesheet" type="text/css"/> <link href="${ static_url('css/sub.css') }" rel="stylesheet" type="text/css"/>
<%block name="extend_css"/> <%block name="extend_css"/>
<%block name="embed_css"/> <%block name="embed_css"/>
</head> </head>
<body> <body>
<!-- begin #page-container --> <!-- begin #page-container -->
<div class="page-header-fixed"> <div class="page-header-fixed">
<div id="header" class="header header-fixed-top"> <div id="header" class="header header-fixed-top">
<div class="container-fluid top-navbar"> <div class="container-fluid top-navbar">
<div class="brand"><div class="site-logo"></div></div> <div class="brand"><div class="site-logo"></div></div>
<div class="breadcrumb-container"> <div class="breadcrumb-container">
<%block name="breadcrumb" /> <%block name="breadcrumb" />
</div> </div>
## <div class="status-container"> ## <div class="status-container">
## more status or global tool buttons goes here. ## more status or global tool buttons goes here.
## </div> ## </div>
</div> </div>
</div> </div>
<div id="footer" class="footer footer-fixed-bottom"> <div id="footer" class="footer footer-fixed-bottom">
<div class="container-fluid"> <div class="container-fluid">
<p>触维软件旗下产品 | TELEPORT | &copy;2015 - 2017 <a href="http://teleport.eomsoft.net/" target="_blank">触维软件</a>,保留所有权利。</p> <p>触维软件旗下产品 | TELEPORT | &copy;2015 - 2017 <a href="http://teleport.eomsoft.net/" target="_blank">触维软件</a>,保留所有权利。</p>
</div> </div>
</div> </div>
<div class="container-fluid"> <div class="container-fluid">
${self.body()} ${self.body()}
</div> </div>
</div> </div>
<%block name="extend_content" /> <%block name="extend_content" />
<script type="text/javascript" src="${ static_url('plugins/underscore/underscore.js') }"></script> <script type="text/javascript" src="${ static_url('plugins/underscore/underscore.js') }"></script>
<script type="text/javascript" src="${ static_url('plugins/jquery/jquery.min.js') }"></script> <script type="text/javascript" src="${ static_url('plugins/jquery/jquery.min.js') }"></script>
<script type="text/javascript" src="${ static_url('plugins/bootstrap/js/bootstrap.min.js') }"></script> <script type="text/javascript" src="${ static_url('plugins/bootstrap/js/bootstrap.min.js') }"></script>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="${ static_url('plugins/html5shiv/html5shiv.min.js') }"></script> <script src="${ static_url('plugins/html5shiv/html5shiv.min.js') }"></script>
<![endif]--> <![endif]-->
## <script type="text/javascript" src="${ static_url('js/json2.js') }"></script> ## <script type="text/javascript" src="${ static_url('js/json2.js') }"></script>
<script type="text/javascript" src="${ static_url('plugins/gritter/js/jquery.gritter.js') }"></script> <script type="text/javascript" src="${ static_url('plugins/gritter/js/jquery.gritter.js') }"></script>
## <script type="text/javascript" src="${ static_url('plugins/jstree/jstree.js') }"></script> ## <script type="text/javascript" src="${ static_url('plugins/jstree/jstree.js') }"></script>
<script type="text/javascript" src="${ static_url('plugins/keypress/keypress.js') }"></script> <script type="text/javascript" src="${ static_url('plugins/keypress/keypress.js') }"></script>
<script type="text/javascript" src="${ static_url('js/ywl_const.js') }"></script> <script type="text/javascript" src="${ static_url('js/ywl_const.js') }"></script>
<script type="text/javascript" src="${ static_url('js/ywl_common.js') }"></script> <script type="text/javascript" src="${ static_url('js/ywl_common.js') }"></script>
<script type="text/javascript" src="${ static_url('js/ywl.js') }"></script> <script type="text/javascript" src="${ static_url('js/ywl.js') }"></script>
## <script type="text/javascript" src="${ static_url('js/ywl_assist.js') }"></script> ## <script type="text/javascript" src="${ static_url('js/ywl_assist.js') }"></script>
## <script type="text/javascript" src="${ static_url('js/ui/common.js') }"></script> ## <script type="text/javascript" src="${ static_url('js/ui/common.js') }"></script>
## <script type="text/javascript" src="${ static_url('js/ui/controls.js') }"></script> ## <script type="text/javascript" src="${ static_url('js/ui/controls.js') }"></script>
<%block name="extend_js"/> <%block name="extend_js"/>
<script type="text/javascript"> <script type="text/javascript">
$(document).ready(function () { $(document).ready(function () {
// once page ready, init ywl object. // once page ready, init ywl object.
ywl.init(); ywl.init();
}); });
</script> </script>
<%block name="embed_js" /> <%block name="embed_js" />
</body> </body>
</html> </html>

View File

@ -34,7 +34,7 @@
<div id="header" class="header header-fixed-top"> <div id="header" class="header header-fixed-top">
<div class="container-fluid top-navbar"> <div class="container-fluid top-navbar">
<div class="brand"><div class="site-logo"></div></div> <div class="brand"><a href="http://teleport.eomsoft.net" target="_blank"><span class="navbar-logo"></span></a></div>
<div class="breadcrumb-container"> <div class="breadcrumb-container">
<%block name="breadcrumb" /> <%block name="breadcrumb" />
</div> </div>

View File

@ -1,66 +0,0 @@
<%!
page_title_ = '数据库管理'
page_menu_ = ['set', 'database']
page_id_ = 'set'
%>
<%inherit file="../page_base.mako"/>
<%block name="extend_js">
## <script type="text/javascript" src="${ static_url('js/ui/teleport.js') }"></script>
<script type="text/javascript" src="${ static_url('js/ui/config/database.js') }"></script>
</%block>
<%block name="breadcrumb">
<ol class="breadcrumb">
<li><i class="fa fa-cogs fa-fw"></i> ${self.attr.page_title_}</li>
<li>数据库管理</li>
</ol>
</%block>
<%block name="extend_css">
<style type="text/css">
.table .key {
text-align: right;
}
.table .value {
text-align: left;
font-weight: bold;
}
.table .value .error {
color: #ff4c4c;
}
.table .value .disabled {
color: #ffa861;
}
</style>
</%block>
## Begin Main Body.
<div class="page-content">
<!-- begin box -->
<div class="box">
<div>
<h4><strong>数据库配置信息</strong></h4>
<table id="info-kv" class="table"></table>
</div>
</div>
<!-- end of box -->
</div>
<%block name="extend_content"></%block>
<%block name="embed_js">
<script type="text/javascript">
ywl.add_page_options(${ page_param });
</script>
</%block>