mirror of https://github.com/tp4a/teleport
temp.
parent
40619185a7
commit
461c8d2dad
|
@ -15,9 +15,8 @@ class Builder:
|
|||
self.ver_in = os.path.join(env.root_path, 'version.in')
|
||||
|
||||
self.VER_TP_SERVER = ''
|
||||
self.VER_TP_SRV_WWW = ''
|
||||
self.VER_TP_SRV_TPCORE = ''
|
||||
self.VER_TP_SRV_TPWEB = ''
|
||||
self.VER_TP_TPCORE = ''
|
||||
self.VER_TP_TPWEB = ''
|
||||
self.VER_TP_ASSIST = ''
|
||||
|
||||
def build(self):
|
||||
|
@ -31,32 +30,29 @@ class Builder:
|
|||
if l.startswith('TP_SERVER '):
|
||||
x = l.split(' ')
|
||||
self.VER_TP_SERVER = x[1].strip()
|
||||
elif l.startswith('TP_SRV_WWW '):
|
||||
elif l.startswith('TP_TPCORE '):
|
||||
x = l.split(' ')
|
||||
self.VER_TP_SRV_WWW = x[1].strip()
|
||||
elif l.startswith('TP_SRV_TPCORE '):
|
||||
self.VER_TP_TPCORE = x[1].strip()
|
||||
elif l.startswith('TP_TPWEB '):
|
||||
x = l.split(' ')
|
||||
self.VER_TP_SRV_TPCORE = x[1].strip()
|
||||
elif l.startswith('TP_SRV_TPWEB '):
|
||||
x = l.split(' ')
|
||||
self.VER_TP_SRV_TPWEB = x[1].strip()
|
||||
self.VER_TP_TPWEB = x[1].strip()
|
||||
elif l.startswith('TP_ASSIST '):
|
||||
x = l.split(' ')
|
||||
self.VER_TP_ASSIST = x[1].strip()
|
||||
|
||||
cc.v('new version:')
|
||||
cc.v(' Server : ', self.VER_TP_SERVER)
|
||||
cc.v(' - WWW Server : ', self.VER_TP_SRV_WWW)
|
||||
cc.v(' - Core Server : ', self.VER_TP_SRV_TPCORE)
|
||||
cc.v(' - Web Server : ', self.VER_TP_SRV_TPWEB)
|
||||
cc.v(' - tp_core : ', self.VER_TP_TPCORE)
|
||||
cc.v(' - tp_web : ', self.VER_TP_TPWEB)
|
||||
cc.v(' Assist : ', self.VER_TP_ASSIST)
|
||||
cc.v('')
|
||||
|
||||
self.make_builder_ver()
|
||||
self.make_srv_www_ver()
|
||||
self.make_srv_tpcore_ver()
|
||||
self.make_srv_tpweb_ver()
|
||||
self.make_assist_ver()
|
||||
self.make_server_ver()
|
||||
self.make_tpcore_ver()
|
||||
self.make_tpweb_ver()
|
||||
self.make_assist_win_ver()
|
||||
self.make_assist_macos_ver()
|
||||
|
||||
def make_builder_ver(self):
|
||||
ver_file = os.path.join(env.root_path, 'build', 'builder', 'core', 'ver.py')
|
||||
|
@ -66,7 +62,6 @@ class Builder:
|
|||
if not os.path.exists(ver_file):
|
||||
rewrite = True
|
||||
else:
|
||||
old_content = ''
|
||||
with open(ver_file, 'r') as f:
|
||||
old_content = f.read()
|
||||
if old_content != ver_content:
|
||||
|
@ -77,9 +72,9 @@ class Builder:
|
|||
with open(ver_file, 'w') as f:
|
||||
f.write(ver_content)
|
||||
|
||||
def make_srv_tpcore_ver(self):
|
||||
def make_tpcore_ver(self):
|
||||
ver_file = os.path.join(env.root_path, 'server', 'tp_core', 'core', 'ts_ver.h')
|
||||
ver_content = '#ifndef __TS_SERVER_VER_H__\n#define __TS_SERVER_VER_H__\n\n#define TP_SERVER_VER\tL"{}"\n\n#endif // __TS_SERVER_VER_H__\n'.format(self.VER_TP_SRV_TPCORE)
|
||||
ver_content = '#ifndef __TS_SERVER_VER_H__\n#define __TS_SERVER_VER_H__\n\n#define TP_SERVER_VER\tL"{}"\n\n#endif // __TS_SERVER_VER_H__\n'.format(self.VER_TP_TPCORE)
|
||||
|
||||
rewrite = False
|
||||
if not os.path.exists(ver_file):
|
||||
|
@ -96,12 +91,12 @@ class Builder:
|
|||
f.write(ver_content)
|
||||
|
||||
rc_file = os.path.join(env.root_path, 'server', 'tp_core', 'core', 'tp_core.rc')
|
||||
self._update_vs_rc(rc_file, self.VER_TP_SRV_TPCORE)
|
||||
self._update_ver_rc(rc_file, self.VER_TP_TPCORE)
|
||||
|
||||
def make_srv_www_ver(self):
|
||||
def make_server_ver(self):
|
||||
ver_file = os.path.join(env.root_path, 'server', 'www', 'teleport', 'webroot', 'app', 'app_ver.py')
|
||||
# ver_content = '# -*- coding: utf8 -*-\n\nTS_VER = "{}"\n'.format(self.VER_TELEPORT_SERVER)
|
||||
ver_content = '# -*- coding: utf8 -*-\nTP_SRV_WWW_VER = "{}"\n'.format(self.VER_TP_SRV_WWW)
|
||||
ver_content = '# -*- coding: utf8 -*-\nTP_SERVER_VER = "{}"\n'.format(self.VER_TP_SERVER)
|
||||
|
||||
rewrite = False
|
||||
if not os.path.exists(ver_file):
|
||||
|
@ -117,7 +112,7 @@ class Builder:
|
|||
with open(ver_file, 'w') as f:
|
||||
f.write(ver_content)
|
||||
|
||||
def make_assist_ver(self):
|
||||
def make_assist_win_ver(self):
|
||||
ver_file = os.path.join(env.root_path, 'client', 'tp_assist_win', 'ts_ver.h')
|
||||
ver_content = '#ifndef __TS_ASSIST_VER_H__\n#define __TS_ASSIST_VER_H__\n\n#define TP_ASSIST_VER\tL"{}"\n\n#endif // __TS_ASSIST_VER_H__\n'.format(self.VER_TP_ASSIST)
|
||||
|
||||
|
@ -125,7 +120,6 @@ class Builder:
|
|||
if not os.path.exists(ver_file):
|
||||
rewrite = True
|
||||
else:
|
||||
old_content = ''
|
||||
with open(ver_file, 'r') as f:
|
||||
old_content = f.read()
|
||||
if old_content != ver_content:
|
||||
|
@ -137,14 +131,18 @@ class Builder:
|
|||
f.write(ver_content)
|
||||
|
||||
rc_file = os.path.join(env.root_path, 'client', 'tp_assist_win', 'tp_assist.rc')
|
||||
self._update_vs_rc(rc_file, self.VER_TP_ASSIST)
|
||||
self._update_ver_rc(rc_file, self.VER_TP_ASSIST)
|
||||
|
||||
nsi_file = os.path.join(env.root_path, 'dist', 'client', 'windows', 'assist', 'installer.nsi')
|
||||
self._update_nsi_rc(nsi_file, self.VER_TP_ASSIST)
|
||||
self._update_ver_nsi(nsi_file, self.VER_TP_ASSIST)
|
||||
|
||||
def make_srv_tpweb_ver(self):
|
||||
def make_assist_macos_ver(self):
|
||||
plist_file = os.path.join(env.root_path, 'client', 'tp_assist_macos', 'src', 'tp_assist-Info.plist')
|
||||
self._update_ver_plist(plist_file, self.VER_TP_ASSIST)
|
||||
|
||||
def make_tpweb_ver(self):
|
||||
ver_file = os.path.join(env.root_path, 'server', 'tp_web', 'src', 'ts_ver.h')
|
||||
ver_content = '#ifndef __TS_SERVER_VER_H__\n#define __TS_SERVER_VER_H__\n\n#define TP_SERVER_VER\tL"{}"\n\n#endif // __TS_SERVER_VER_H__\n'.format(self.VER_TP_SRV_TPWEB)
|
||||
ver_content = '#ifndef __TS_SERVER_VER_H__\n#define __TS_SERVER_VER_H__\n\n#define TP_SERVER_VER\tL"{}"\n\n#endif // __TS_SERVER_VER_H__\n'.format(self.VER_TP_TPWEB)
|
||||
|
||||
rewrite = False
|
||||
if not os.path.exists(ver_file):
|
||||
|
@ -161,14 +159,14 @@ class Builder:
|
|||
f.write(ver_content)
|
||||
|
||||
rc_file = os.path.join(env.root_path, 'server', 'tp_web', 'src', 'tp_web.rc')
|
||||
self._update_vs_rc(rc_file, self.VER_TP_SRV_TPWEB)
|
||||
self._update_ver_rc(rc_file, self.VER_TP_TPWEB)
|
||||
|
||||
def _update_vs_rc(self, rcFilePath, ver):
|
||||
def _update_ver_rc(self, rcFilePath, ver):
|
||||
""" update rc file version info """
|
||||
|
||||
t_ver = ver.split('.')
|
||||
if len(t_ver) != 4:
|
||||
raise RuntimeError('Invalid version for assist.')
|
||||
raise RuntimeError('Invalid version for .rc file.')
|
||||
|
||||
bOK = False
|
||||
try:
|
||||
|
@ -272,14 +270,13 @@ class Builder:
|
|||
wrcFile.close()
|
||||
|
||||
except IOError:
|
||||
raise RuntimeError('can not open rc file.')
|
||||
raise RuntimeError('can not process rc file.')
|
||||
|
||||
def _update_nsi_rc(self, nsiFilePath, ver):
|
||||
def _update_ver_nsi(self, nsiFilePath, ver):
|
||||
""" update nsis file version info """
|
||||
# nver = ver.split('.')
|
||||
t_ver = ver.split('.')
|
||||
if len(t_ver) != 4:
|
||||
raise RuntimeError('Invalid version for assist.')
|
||||
raise RuntimeError('Invalid version for nsis file.')
|
||||
|
||||
bOK = False
|
||||
try:
|
||||
|
@ -346,7 +343,77 @@ class Builder:
|
|||
return bOK
|
||||
|
||||
except IOError:
|
||||
raise RuntimeError('can not open nsi file.')
|
||||
raise RuntimeError('can not process nsi file.')
|
||||
|
||||
def _update_ver_plist(self, plist_file, ver):
|
||||
""" update plist file version info for MacOS app."""
|
||||
t_ver = ver.split('.')
|
||||
if len(t_ver) != 4:
|
||||
raise RuntimeError('Invalid version for plist file.')
|
||||
|
||||
bOK = False
|
||||
try:
|
||||
# open rc file
|
||||
f = codecs.open(plist_file, 'r', 'utf8')
|
||||
# read out all lines of rc file
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
is_ver = False
|
||||
for x in range(len(lines)):
|
||||
l = lines[x]
|
||||
|
||||
if l.find('<key>CFBundleShortVersionString</key>') != -1:
|
||||
is_ver = True
|
||||
continue
|
||||
if l.find('<key>CFBundleVersion</key>') != -1:
|
||||
is_ver = True
|
||||
continue
|
||||
# pos1 = rcline.find(' FILEVERSION ')
|
||||
# pos2 = rcline.rfind('\\0"')
|
||||
# _ver = rcline[pos1 + 13: pos2].strip()
|
||||
#
|
||||
# rcSplitList = _ver.split(",")
|
||||
# if (len(rcSplitList) < 4):
|
||||
# rcSplitList = _ver.split(".")
|
||||
# if (len(rcSplitList) < 4):
|
||||
# raise RuntimeError('Invalid .rc file.')
|
||||
# if '.'.join(rcSplitList) == ver:
|
||||
# continue
|
||||
#
|
||||
# rcline = '%s%s,%s,%s,%s\n' % (rcline[0:pos1 + 13], t_ver[0], t_ver[1], t_ver[2], t_ver[3])
|
||||
#
|
||||
# rcLines[x] = ""
|
||||
# rcLines[x] = rcline
|
||||
# # cc.v('[ver] new ver: %s' % rcLines[x])
|
||||
# bOK = True
|
||||
|
||||
if is_ver:
|
||||
is_ver = False
|
||||
|
||||
pos1 = l.find('<string>')
|
||||
pos2 = l.rfind('</string>')
|
||||
if pos1 == -1 or pos2 == -2:
|
||||
continue
|
||||
_ver = l[pos1 + 8: pos2].strip()
|
||||
|
||||
v = _ver.split(".")
|
||||
if len(v) < 4:
|
||||
raise RuntimeError('Invalid .plist file.')
|
||||
old_ver = '.'.join(v)
|
||||
if old_ver == ver:
|
||||
continue
|
||||
lines[x] = '<string>{ver}</string>'.format(ver=ver)
|
||||
bOK = True
|
||||
|
||||
if bOK:
|
||||
cc.v(' update {}...'.format(plist_file))
|
||||
wrcFile = codecs.open(plist_file, 'w', 'utf8')
|
||||
wrcFile.writelines(lines)
|
||||
wrcFile.close()
|
||||
|
||||
except IOError:
|
||||
raise RuntimeError('can not process plist file.')
|
||||
|
||||
|
||||
def main():
|
||||
|
|
|
@ -810,7 +810,7 @@ int SshSession::_on_server_channel_data(ssh_session session, ssh_channel channel
|
|||
else
|
||||
auth_mode = "unknown";
|
||||
|
||||
int w = min(cp->win_width, 128);
|
||||
int w = std::min(cp->win_width, 128);
|
||||
ex_astr line(w, '=');
|
||||
|
||||
snprintf(buf, sizeof(buf),
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -2,6 +2,7 @@
|
|||
|
||||
$app.on_init = function (cb_stack) {
|
||||
$app.dom = {
|
||||
assist_ver: $('#tp-assist-ver'),
|
||||
btn_refresh_host: $('#btn-refresh-host'),
|
||||
btn_add_host: $('#btn-add-host'),
|
||||
chkbox_host_select_all: $('#table-host-select-all'),
|
||||
|
@ -18,6 +19,15 @@ $app.on_init = function (cb_stack) {
|
|||
upload_file_message: $('#upload-file-message')
|
||||
};
|
||||
|
||||
$tp.assist_checked = function() {
|
||||
console.log("---------");
|
||||
if($tp.assist.running) {
|
||||
$app.dom.assist_ver.html($tp.assist.version);
|
||||
} else {
|
||||
$app.dom.assist_ver.html('<a href="http://teleport.eomsoft.net/download" target="_blank" class="error">未能检测到</a>');
|
||||
}
|
||||
};
|
||||
|
||||
cb_stack
|
||||
.add($app.create_controls)
|
||||
.add($app.load_role_list);
|
||||
|
|
|
@ -59,17 +59,17 @@ var CALLBACK_STACK = {
|
|||
|
||||
// Teleport核心JS
|
||||
var $tp = {
|
||||
// server_host: window.location.hostname || '',
|
||||
// server_port: (window.location.port === "") ? 80 : parseInt(window.location.port),
|
||||
web_server: window.location.protocol+'://'+window.location.host,
|
||||
web_server: window.location.protocol+'://'+window.location.host
|
||||
|
||||
// Teleport页面应用对象,放置页面自身特有的属性和函数
|
||||
app: {
|
||||
options: {},
|
||||
on_init: function (cb_stack) {
|
||||
, app: {
|
||||
options: {}
|
||||
, on_init: function (cb_stack) {
|
||||
cb_stack.exec();
|
||||
} // should be overwrite.
|
||||
}
|
||||
|
||||
, assist_checked: null
|
||||
};
|
||||
|
||||
$tp.init = function () {
|
||||
|
@ -115,12 +115,14 @@ $tp.init = function () {
|
|||
];
|
||||
|
||||
var cs = CALLBACK_STACK.create();
|
||||
cs.add($tp.app.init);
|
||||
|
||||
|
||||
if(!_.isUndefined($tp.assist)) {
|
||||
cs.add($tp.assist.init);
|
||||
}
|
||||
|
||||
cs.add($tp.app.init);
|
||||
|
||||
cs.exec();
|
||||
};
|
||||
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
"use strict";
|
||||
|
||||
$tp.assist = {
|
||||
ver_request: '',
|
||||
ver_last: '',
|
||||
ver_current: '',
|
||||
running: false,
|
||||
version: '',
|
||||
api_url: 'http://localhost:50022/api',
|
||||
teleport_ip: window.location.hostname
|
||||
};
|
||||
|
@ -25,7 +24,12 @@ $assist.init = function (cb_stack) {
|
|||
jsonp: 'callback',
|
||||
dataType: 'json',
|
||||
success: function (ret) {
|
||||
$assist.ver_current = ret.version;
|
||||
$assist.running = true;
|
||||
$assist.version = ret.version;
|
||||
|
||||
if(_.isFunction($tp.assist_checked)) {
|
||||
$tp.assist_checked();
|
||||
}
|
||||
// if (version_compare()) {
|
||||
// error_process(ret, func_success, func_error);
|
||||
// } else {
|
||||
|
@ -33,6 +37,10 @@ $assist.init = function (cb_stack) {
|
|||
// }
|
||||
},
|
||||
error: function () {
|
||||
$assist.running = false;
|
||||
if(_.isFunction($tp.assist_checked)) {
|
||||
$tp.assist_checked();
|
||||
}
|
||||
// func_error({}, TPE_NO_ASSIST, '无法连接到teleport助手,可能尚未启动!');
|
||||
// $tp.notify_error('无法连接到teleport助手,可能尚未启动!');
|
||||
// $assist.alert_assist_not_found();
|
||||
|
|
|
@ -83,6 +83,10 @@ label {
|
|||
//font-style: italic;
|
||||
}
|
||||
|
||||
.error {
|
||||
color: @color-text-danger;
|
||||
}
|
||||
|
||||
.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
@color-text-ignore: #999;
|
||||
@color-text-default: #333;
|
||||
@color-text-warning: #f59c1a;
|
||||
@color-text-danger: #d34242;
|
||||
|
||||
@color-text-on-dark-bg: #fff;
|
||||
@color-text-shadow-on-dark-bg: #525252;
|
||||
|
|
|
@ -77,13 +77,21 @@ body {
|
|||
//line-height: 20px;
|
||||
|
||||
& > li + li:before {
|
||||
//font-size: 24px;
|
||||
//line-height: 20px;
|
||||
//padding: 0 5px;
|
||||
//color: #ccc;
|
||||
content: "\f105";
|
||||
font-family: 'FontAwesome';
|
||||
}
|
||||
|
||||
&.breadcrumb-list {
|
||||
& > li {
|
||||
font-size: @text-size-normal;
|
||||
}
|
||||
& > li + li:before {
|
||||
//content: "\f105";
|
||||
//font-family: 'FontAwesome';
|
||||
content: " ";
|
||||
margin:0 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -205,7 +205,8 @@
|
|||
|
||||
<hr style="border:none;border-bottom:1px dotted #4a4a4a;margin-bottom:0;"/>
|
||||
<div style="color:#717171;font-size:90%;margin-top:5px;"><span style="display:inline-block;width:70px;text-align: right">服务端:</span><span class="mono">v${app_ver.TP_SERVER_VER}</span></div>
|
||||
<div style="color:#717171;font-size:90%;margin-top:5px;"><span style="display:inline-block;width:70px;text-align: right">助手:</span><span class="mono" id="tp-assist-version" data-req-version=${app_ver.TP_ASSIST_REQUIRE}>v${app_ver.TP_ASSIST_LAST_VER}</span></div>
|
||||
## <div style="color:#717171;font-size:90%;margin-top:5px;"><span style="display:inline-block;width:70px;text-align: right">助手:</span><span class="mono" id="tp-assist-version" data-req-version=$ { app_ver.TP_ASSIST_REQUIRE}>v$ { app_ver.TP_ASSIST_LAST_VER}</span></div>
|
||||
## <div style="color:#717171;font-size:90%;margin-top:5px;"><span style="display:inline-block;width:70px;text-align: right">助手:</span><span class="mono" id="tp-assist-version">未连接</span></div>
|
||||
<hr style="border:none;border-bottom:1px dotted #4a4a4a;margin-bottom:20px;margin-top:5px;"/>
|
||||
|
||||
## </div>
|
||||
|
|
|
@ -16,6 +16,13 @@
|
|||
</style>
|
||||
</%block>
|
||||
|
||||
<%block name="breadcrumb_extra">
|
||||
<ol class="breadcrumb breadcrumb-list">
|
||||
## <li><i class="fa fa-clock-o"></i> 服务器时间:<span id="tp-timer">-</span></li>
|
||||
<li><i class="fa fa-flash"></i> 助手版本:<span id="tp-assist-ver"></span></li>
|
||||
</ol>
|
||||
</%block>
|
||||
|
||||
## Begin Main Body.
|
||||
|
||||
<div class="page-content-inner">
|
||||
|
@ -29,8 +36,6 @@
|
|||
</div>
|
||||
<div class="table-extend-cell table-extend-cell-right group-actions">
|
||||
<button id="btn-add-host" class="btn btn-sm btn-primary"><i class="fa fa-plus-circle fa-fw"></i> 添加主机</button>
|
||||
## <button id="btn-add-temp-account" class="btn btn-sm btn-success"><i class="fa fa-plus-circle fa-fw"></i> 添加主机</button>
|
||||
|
||||
<button id="btn-import-asset" class="btn btn-sm btn-default"><i class="fa fa-plus-square fa-fw"></i> 导入主机和账号</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
## Begin Main Body.
|
||||
|
||||
<div class="content-box">
|
||||
<p class="welcome-message"><i class="fa fa-heart"></i> <span>欢迎安装使用 TELEPORT v${app_ver.TP_SERVER_VER} 社区版!</span></p>
|
||||
<p class="welcome-message"><i class="fa fa-heart"></i> <span>欢迎安装使用 TELEPORT v${app_ver.TP_SRV_WWW_VER} 社区版!</span></p>
|
||||
|
||||
<hr/>
|
||||
<h2><i class="fa fa-chevron-right"></i> 确定数据库类型</h2>
|
||||
|
|
|
@ -50,10 +50,10 @@
|
|||
</%block>
|
||||
</div>
|
||||
|
||||
<div class="page-header-extra" style="display:inline-block;float:right;padding-top:12px;">
|
||||
## <ol class="bread-crumb">
|
||||
## <li><i class="fa fa-clock-o fa-fw"></i> <span id="system-timer">111</span></li>
|
||||
## </ol>
|
||||
<div class="page-header-extra" style="display:inline-block;float:right;">
|
||||
<div class="breadcrumb-container">
|
||||
<%block name="breadcrumb_extra"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
# -*- coding: utf8 -*-
|
||||
TP_SRV_WWW_VER = "3.0.0.1"
|
||||
TP_SERVER_VER = "3.0.0.1"
|
||||
|
|
|
@ -13,8 +13,7 @@ Revision : 修订号。主版本号和次版本号都相同但修订号不同
|
|||
Build : 构建号。构建号用于表明此版本发布之前进行了多少次构建及测试。某些情况下此版本号可以省略。
|
||||
|
||||
|
||||
TP_SERVER 3.0.0.1 # 整个服务端打包的版本,任意一个 TP_SRV_xxx 升级,此版本也需要升级
|
||||
TP_SRV_WWW 3.0.0.1 # web前后端版本
|
||||
TP_SRV_TPCORE 3.0.0.1 # 核心服务 tp_core 的版本
|
||||
TP_SRV_TPWEB 3.0.0.1 # web服务 tp_web 的版本(一般除非升级Python,否则不会变化)
|
||||
TP_SERVER 3.0.0.1 # 整个服务端打包的版本
|
||||
TP_TPCORE 3.0.0.1 # 核心服务 tp_core 的版本
|
||||
TP_TPWEB 3.0.0.1 # web服务 tp_web 的版本(一般除非升级Python,否则不会变化)
|
||||
TP_ASSIST 3.0.0.1 # 助手版本
|
||||
|
|
Loading…
Reference in New Issue