mirror of https://github.com/tp4a/teleport
temp.
parent
8a04467e2a
commit
9b59d6ec99
|
@ -3,9 +3,6 @@
|
||||||
from eom_app.app.util import sec_generate_password
|
from eom_app.app.util import sec_generate_password
|
||||||
from eom_common.eomcore.logger import log
|
from eom_common.eomcore.logger import log
|
||||||
|
|
||||||
# 升级数据表结构时必须升级此版本号,并编写响应的升级SQL
|
|
||||||
TELEPORT_DATABASE_VERSION = 10
|
|
||||||
|
|
||||||
|
|
||||||
def _db_exec(db, step_begin, step_end, msg, sql):
|
def _db_exec(db, step_begin, step_end, msg, sql):
|
||||||
_step = step_begin(msg)
|
_step = step_begin(msg)
|
||||||
|
@ -18,7 +15,7 @@ def _db_exec(db, step_begin, step_end, msg, sql):
|
||||||
step_end(_step, 0)
|
step_end(_step, 0)
|
||||||
|
|
||||||
|
|
||||||
def create_and_init(db, step_begin, step_end):
|
def create_and_init(db, step_begin, step_end, db_ver):
|
||||||
try:
|
try:
|
||||||
_db_exec(db, step_begin, step_end, '创建表 account', """CREATE TABLE `{}account` (
|
_db_exec(db, step_begin, step_end, '创建表 account', """CREATE TABLE `{}account` (
|
||||||
`account_id` integer PRIMARY KEY AUTOINCREMENT,
|
`account_id` integer PRIMARY KEY AUTOINCREMENT,
|
||||||
|
@ -107,7 +104,7 @@ PRIMARY KEY (`name` ASC)
|
||||||
|
|
||||||
_db_exec(db, step_begin, step_end,
|
_db_exec(db, step_begin, step_end,
|
||||||
'设定数据库版本',
|
'设定数据库版本',
|
||||||
'INSERT INTO `{}config` VALUES ("db_ver", "{}");'.format(db.table_prefix, TELEPORT_DATABASE_VERSION)
|
'INSERT INTO `{}config` VALUES ("db_ver", "{}");'.format(db.table_prefix, db_ver)
|
||||||
)
|
)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from eom_app.app.util import sec_generate_password
|
||||||
|
from eom_common.eomcore.logger import log
|
||||||
|
|
||||||
|
|
||||||
|
def _db_exec(db, step_begin, step_end, msg, sql):
|
||||||
|
_step = step_begin(msg)
|
||||||
|
|
||||||
|
ret = db.exec(sql)
|
||||||
|
if not ret:
|
||||||
|
step_end(_step, -1)
|
||||||
|
raise RuntimeError('[FAILED] {}'.format(sql))
|
||||||
|
else:
|
||||||
|
step_end(_step, 0)
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade_database(db, step_begin, step_end, db_ver):
|
||||||
|
try:
|
||||||
|
pass
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
log.e('ERROR')
|
||||||
|
return False
|
|
@ -7,7 +7,8 @@ import threading
|
||||||
|
|
||||||
from eom_common.eomcore.logger import log
|
from eom_common.eomcore.logger import log
|
||||||
from .configs import app_cfg
|
from .configs import app_cfg
|
||||||
from .database.create import create_and_init, TELEPORT_DATABASE_VERSION
|
from .database.create import create_and_init
|
||||||
|
from .database.upgrade import upgrade_database
|
||||||
|
|
||||||
cfg = app_cfg()
|
cfg = app_cfg()
|
||||||
|
|
||||||
|
@ -15,7 +16,7 @@ __all__ = ['get_db']
|
||||||
|
|
||||||
|
|
||||||
# 注意,每次调整数据库结构,必须增加版本号,并且在升级接口中编写对应的升级操作
|
# 注意,每次调整数据库结构,必须增加版本号,并且在升级接口中编写对应的升级操作
|
||||||
# TELEPORT_DATABASE_VERSION = 2
|
TELEPORT_DATABASE_VERSION = 10
|
||||||
|
|
||||||
|
|
||||||
class TPDatabase:
|
class TPDatabase:
|
||||||
|
@ -55,7 +56,7 @@ class TPDatabase:
|
||||||
|
|
||||||
# 尝试从配置表中读取当前数据库版本号(如果不存在,说明是比较旧的版本了,则置为0)
|
# 尝试从配置表中读取当前数据库版本号(如果不存在,说明是比较旧的版本了,则置为0)
|
||||||
ret = self.query('SELECT `value` FROM {}config WHERE `name`="db_ver";'.format(self._table_prefix))
|
ret = self.query('SELECT `value` FROM {}config WHERE `name`="db_ver";'.format(self._table_prefix))
|
||||||
if ret is None or 0 == len(ret):
|
if ret is None or 0 == len(ret) or ret[0][0] < TELEPORT_DATABASE_VERSION:
|
||||||
log.w('database need upgrade.\n')
|
log.w('database need upgrade.\n')
|
||||||
self.need_upgrade = True
|
self.need_upgrade = True
|
||||||
|
|
||||||
|
@ -67,12 +68,20 @@ class TPDatabase:
|
||||||
|
|
||||||
def create_and_init(self, step_begin, step_end):
|
def create_and_init(self, step_begin, step_end):
|
||||||
step_begin('准备创建数据表')
|
step_begin('准备创建数据表')
|
||||||
if create_and_init(self, step_begin, step_end):
|
if create_and_init(self, step_begin, step_end, TELEPORT_DATABASE_VERSION):
|
||||||
self.need_create = False
|
self.need_create = False
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def upgrade_database(self, step_begin, step_end):
|
||||||
|
step_begin('准备升级数据表')
|
||||||
|
if upgrade_database(self, step_begin, step_end, TELEPORT_DATABASE_VERSION):
|
||||||
|
self.need_upgrade = False
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class TPDatabasePool:
|
class TPDatabasePool:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import threading
|
import threading
|
||||||
import time
|
|
||||||
|
|
||||||
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 *
|
||||||
|
@ -11,8 +10,6 @@ from .base import TPBaseUserAuthHandler, TPBaseAdminAuthHandler, TPBaseAdminAuth
|
||||||
|
|
||||||
cfg = app_cfg()
|
cfg = app_cfg()
|
||||||
|
|
||||||
# from eom_app.app.util import sec_generate_password, sec_verify_password
|
|
||||||
|
|
||||||
|
|
||||||
class IndexHandler(TPBaseUserAuthHandler):
|
class IndexHandler(TPBaseUserAuthHandler):
|
||||||
def get(self):
|
def get(self):
|
||||||
|
@ -56,6 +53,17 @@ class RpcThreadManage:
|
||||||
|
|
||||||
return task_id
|
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):
|
def get_task(self, task_id):
|
||||||
with self._lock:
|
with self._lock:
|
||||||
if task_id in self._threads:
|
if task_id in self._threads:
|
||||||
|
@ -83,34 +91,31 @@ class RpcThreadManage:
|
||||||
self._threads[task_id]['stop'] = True
|
self._threads[task_id]['stop'] = True
|
||||||
|
|
||||||
def _create_db(self, tid):
|
def _create_db(self, tid):
|
||||||
# x = sec_generate_password('admin')
|
|
||||||
# print(sec_verify_password('admin', x))
|
|
||||||
# print(sec_verify_password('.admin', x))
|
|
||||||
|
|
||||||
def _step_begin(msg):
|
def _step_begin(msg):
|
||||||
self._step_begin(tid, msg)
|
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)
|
||||||
|
|
||||||
time.sleep(1)
|
|
||||||
# self._add_step_result(tid, 0, '正在初始化 1...')
|
|
||||||
|
|
||||||
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, '操作已完成')
|
||||||
|
|
||||||
# time.sleep(1)
|
self._thread_end(tid)
|
||||||
# self._add_step_result(tid, 0, '正在初始化 2...')
|
|
||||||
# time.sleep(1)
|
def _upgrade_db(self, tid):
|
||||||
# self._add_step_result(tid, 0, '正在初始化 3...')
|
def _step_begin(msg):
|
||||||
# time.sleep(1)
|
self._step_begin(tid, msg)
|
||||||
# self._add_step_result(tid, 0, '正在初始化 4...')
|
|
||||||
|
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._threads[tid]['steps'].append({'stat': 0, 'msg': '执行已结束'})
|
|
||||||
# if self._threads[tid]['stop']:
|
|
||||||
# self._add_step_result(tid, -1, '操作被终止')
|
|
||||||
self._thread_end(tid)
|
self._thread_end(tid)
|
||||||
|
|
||||||
def _step_begin(self, tid, msg):
|
def _step_begin(self, tid, msg):
|
||||||
|
@ -133,11 +138,6 @@ class RpcThreadManage:
|
||||||
|
|
||||||
return len(self._threads[tid]['steps']) - 1
|
return len(self._threads[tid]['steps']) - 1
|
||||||
|
|
||||||
# def _add_step_result(self, tid, code, msg):
|
|
||||||
# if len(self._threads[tid]['steps']) > 0:
|
|
||||||
# self._threads[tid]['steps'][-1]['stat'] = 0 # 0 表示此步骤已完成
|
|
||||||
# self._threads[tid]['steps'].append({'stat': 1, 'code': code, 'msg': msg})
|
|
||||||
|
|
||||||
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:
|
||||||
|
@ -171,13 +171,18 @@ class RpcHandler(TPBaseAdminAuthJsonHandler):
|
||||||
task_id = thread_mgr.create_db()
|
task_id = thread_mgr.create_db()
|
||||||
return self.write_json(0, data={"task_id": task_id})
|
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':
|
elif cmd == 'get_task_ret':
|
||||||
# return self.write_json(-1)
|
# return self.write_json(-1)
|
||||||
r = thread_mgr.get_task(args['tid'])
|
r = thread_mgr.get_task(args['tid'])
|
||||||
if r is None:
|
if r is None:
|
||||||
return self.write_json(0, data={'running': False, 'steps': []})
|
return self.write_json(0, data={'running': False, 'steps': []})
|
||||||
else:
|
else:
|
||||||
# del r['stop']
|
|
||||||
return self.write_json(0, data=r)
|
return self.write_json(0, data=r)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -53,8 +53,8 @@
|
||||||
<h1>配置TELEPORT服务</h1>
|
<h1>配置TELEPORT服务</h1>
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<h2>第一步:创建数据表 <span id="step-create-db-result"></span></h2>
|
<h2>第一步:创建数据表</h2>
|
||||||
<div id="step-create-db">
|
<div>
|
||||||
<p>请选择要使用的数据库类型(暂时仅支持sqlite,其它类型开发中):</p>
|
<p>请选择要使用的数据库类型(暂时仅支持sqlite,其它类型开发中):</p>
|
||||||
<input id="db-sqlite" type="radio" checked="checked" name="database" value="sqlite"/> <label for="db-sqlite">SQLite</label><br/>
|
<input id="db-sqlite" type="radio" checked="checked" name="database" value="sqlite"/> <label for="db-sqlite">SQLite</label><br/>
|
||||||
<input id="db-mysql" type="radio" name="database" value="mysql" disabled="disabled"/> <label for="db-mysql">MySQL(开发中,暂不支持)</label>
|
<input id="db-mysql" type="radio" name="database" value="mysql" disabled="disabled"/> <label for="db-mysql">MySQL(开发中,暂不支持)</label>
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
<%!
|
<%!
|
||||||
page_title_ = '系统升级'
|
page_title_ = '升级TELEPORT服务'
|
||||||
## page_menu_ = ['user']
|
|
||||||
## page_id_ = 'user'
|
|
||||||
%>
|
%>
|
||||||
<%inherit file="../page_maintenance_base.mako"/>
|
<%inherit file="../page_maintenance_base.mako"/>
|
||||||
|
|
||||||
|
@ -13,34 +11,34 @@
|
||||||
|
|
||||||
<%block name="embed_css">
|
<%block name="embed_css">
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.content_box {
|
.container {
|
||||||
margin-top:48px;
|
background-color: #fff;
|
||||||
|
padding-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content_box .error_sidebar {
|
h1 {
|
||||||
float: left;
|
font-size: 200%;
|
||||||
width: 160px;
|
|
||||||
margin-left: 120px;
|
|
||||||
font-size: 260px;
|
|
||||||
color: #e3693b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.content_box .error_content {
|
h2 {
|
||||||
min-height: 400px;
|
font-size: 160%;
|
||||||
width: 800px;
|
|
||||||
padding: 30px;
|
|
||||||
margin-left: 300px;
|
|
||||||
background: #ffffff;
|
|
||||||
border-radius: 5px;
|
|
||||||
|
|
||||||
background: rgba(255, 255, 255, 0.8);
|
|
||||||
background: #fff \9;
|
|
||||||
z-index: 9;
|
|
||||||
position: relative;
|
|
||||||
}
|
}
|
||||||
|
.steps-detail {
|
||||||
h1 .fa-spin {
|
display: none;
|
||||||
color:#aaa;
|
margin:10px;
|
||||||
|
padding:10px;
|
||||||
|
border:1px solid #b4b4b4;
|
||||||
|
background-color: #dcdcdc;
|
||||||
|
}
|
||||||
|
.steps-detail p {
|
||||||
|
padding-left:5px;
|
||||||
|
margin:2px 0 2px 1px;
|
||||||
|
}
|
||||||
|
.steps-detail p.error {
|
||||||
|
color:#ffffff;
|
||||||
|
margin:2px 0 2px 0;
|
||||||
|
background-color: #cc3632;
|
||||||
|
border:1px solid #9c2a26;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</%block>
|
</%block>
|
||||||
|
@ -52,18 +50,119 @@
|
||||||
<div class="content_box">
|
<div class="content_box">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
||||||
<div class="error_sidebar">
|
<h1>升级TELEPORT服务</h1>
|
||||||
<i class="fa fa-exclamation-triangle"></i>
|
<hr/>
|
||||||
|
|
||||||
|
<h2>第一步:升级数据库</h2>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<button id="btn-upgrade-db" type="button" class="btn btn-primary"><i class="fa fa-wrench fa-fw"></i> 开始升级</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="steps-detail" class="steps-detail"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="error_content">
|
|
||||||
<br/>
|
|
||||||
<h1><i class="fa fa-cog fa-spin"></i> 系统维护中...</h1>
|
|
||||||
<hr/>
|
|
||||||
<p>系统管理员正在紧张地维护系统,请稍后刷新页面重试!</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<%block name="embed_js">
|
||||||
|
<script type="text/javascript">
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
ywl.on_init = function (cb_stack, cb_args) {
|
||||||
|
ywl.dom = {
|
||||||
|
btn_upgrade_db: $('#btn-upgrade-db'),
|
||||||
|
steps_detail: $('#steps-detail')
|
||||||
|
};
|
||||||
|
|
||||||
|
ywl.dom.btn_upgrade_db.click(function () {
|
||||||
|
|
||||||
|
ywl.dom.btn_upgrade_db.attr('disabled', 'disabled').hide();
|
||||||
|
ywl.dom.steps_detail.show();
|
||||||
|
|
||||||
|
console.log('upgrade-db-click');
|
||||||
|
ywl.ajax_post_json('/maintenance/rpc', {cmd: 'upgrade_db'},
|
||||||
|
function (ret) {
|
||||||
|
console.log('upgrade-db:', ret);
|
||||||
|
if (ret.code == 0) {
|
||||||
|
|
||||||
|
var cb_stack = CALLBACK_STACK.create();
|
||||||
|
cb_stack
|
||||||
|
.add(ywl.get_task_ret, {task_id: ret.data.task_id})
|
||||||
|
.add(ywl.delay_exec, {delay_ms: 500})
|
||||||
|
.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
ywl.show_message('error', '无法连接到服务器!');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ywl.get_task_ret = function (cb_stack, cb_args) {
|
||||||
|
var task_id = cb_args.task_id || 0;
|
||||||
|
if (task_id == 0) {
|
||||||
|
console.log('task-id', task_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ywl.ajax_post_json('/maintenance/rpc', {cmd: 'get_task_ret', 'tid': task_id},
|
||||||
|
function (ret) {
|
||||||
|
console.log('get_task_ret:', ret);
|
||||||
|
if (ret.code == 0) {
|
||||||
|
|
||||||
|
// show step progress.
|
||||||
|
var steps = ret.data.steps;
|
||||||
|
ywl.dom.steps_detail.empty();
|
||||||
|
|
||||||
|
var html = [];
|
||||||
|
var icon_class = '';
|
||||||
|
var err_class = '';
|
||||||
|
for(var i = 0; i < steps.length; ++i) {
|
||||||
|
if(steps[i].stat == 0)
|
||||||
|
icon_class = 'fa-check';
|
||||||
|
else
|
||||||
|
icon_class = 'fa-cog fa-spin';
|
||||||
|
if(steps[i].code != 0)
|
||||||
|
err_class = ' class="error"';
|
||||||
|
else
|
||||||
|
err_class = '';
|
||||||
|
html.push('<p');
|
||||||
|
html.push(err_class);
|
||||||
|
html.push('><i class="fa ');
|
||||||
|
html.push(icon_class);
|
||||||
|
html.push('"></i> ');
|
||||||
|
html.push(steps[i].msg);
|
||||||
|
html.push('</p>')
|
||||||
|
}
|
||||||
|
ywl.dom.steps_detail.html(html.join(''));
|
||||||
|
|
||||||
|
|
||||||
|
if (!ret.data.running) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cb_stack
|
||||||
|
.add(ywl.get_task_ret, {task_id: task_id})
|
||||||
|
.add(ywl.delay_exec, {delay_ms: 500})
|
||||||
|
.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
ywl.show_message('error', '无法连接到服务器!');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
cb_stack.exec();
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</%block>
|
||||||
|
|
Loading…
Reference in New Issue