mirror of https://github.com/tp4a/teleport
temp: 暂时不允许升级到MySQL,如需使用MySQL,只能在新安装的时候选择使用。
parent
f7b5768155
commit
4c3e98d38d
|
@ -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),
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
|
@ -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))
|
||||||
|
|
|
@ -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>';
|
|
||||||
};
|
|
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>
|
|
@ -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 | ©2015 - 2017 <a href="http://teleport.eomsoft.net/" target="_blank">触维软件</a>,保留所有权利。</p>
|
<p>触维软件旗下产品 | TELEPORT | ©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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
Loading…
Reference in New Issue