diff --git a/.gitignore b/.gitignore
index ab7da2a..59ea39c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,3 +73,4 @@ __pycache__
# for not finished code
/common/libex/test
/client/tp_rdp
+/server/share/etc/maintenance-mode
diff --git a/dist/windows/server/script/script/main.py b/dist/windows/server/script/script/main.py
index a261011..811411c 100644
--- a/dist/windows/server/script/script/main.py
+++ b/dist/windows/server/script/script/main.py
@@ -13,6 +13,9 @@ WIN_WEB_SERVICE_NAME = 'EOM Teleport Web Service'
class InstallerBase:
def __init__(self):
+ self._all_ok = True
+ self._err_msg = list()
+
self._is_installed = False
self._install_path = ''
self._config_path = ''
@@ -26,7 +29,7 @@ class InstallerBase:
ver_file = os.path.join(env.root_path, 'data', 'www', 'teleport', 'app', 'eom_ver.py')
try:
- with open(ver_file) as f:
+ with open(ver_file, 'r') as f:
x = f.readlines()
for i in x:
s = i.split('=', 1)
@@ -369,6 +372,13 @@ class InstallerWin(InstallerBase):
utils.copy_ex(os.path.join(env.src_path, 'bin'), os.path.join(self._install_path, 'bin'))
utils.copy_ex(os.path.join(env.src_path, 'www'), os.path.join(self._install_path, 'www'))
+ # 创建一个标志文件,这样访问后台时会进入维护模式
+ try:
+ with open(os.path.join(self._install_path, 'www', 'teleport', 'maintenance-mode'), 'w') as f:
+ f.write('!!! DO NOT TOUCH !!!')
+ except:
+ pass
+
if not os.path.exists(self._config_path):
utils.copy_ex(os.path.join(env.src_path, 'tmp', 'etc'), self._config_path)
diff --git a/server/share/etc/web.ini.in b/server/share/etc/web.ini.in
index 3efddf2..0724e56 100644
--- a/server/share/etc/web.ini.in
+++ b/server/share/etc/web.ini.in
@@ -14,7 +14,10 @@ port=7190
# LOG_LEVEL_INFO 2 log infomation/warning/error message.
# LOG_LEVEL_WARN 3 log warning and error message.
# LOG_LEVEL_ERROR 4 log error message only.
-log-level=0
+log-level=1
+; running in debug mode. default to 0.
+; in debug mode, log-level set to 0 and trace call stack while exception raise.
+debug=0
core-server-rpc=http://127.0.0.1:52080/rpc
diff --git a/server/www/teleport/app/eom_app/app/configs.py b/server/www/teleport/app/eom_app/app/configs.py
index 7498acc..d3e2e2e 100644
--- a/server/www/teleport/app/eom_app/app/configs.py
+++ b/server/www/teleport/app/eom_app/app/configs.py
@@ -60,6 +60,7 @@ class ConfigFile(AttrDict):
if self['log_file'] is not None:
self['log_path'] = os.path.dirname(self['log_file'])
+ self['log_level'] = LOG_INFO
_level = _comm.getint('log-level', 2)
if _level == 0:
self['log_level'] = LOG_DEBUG
@@ -76,6 +77,12 @@ class ConfigFile(AttrDict):
# log.set_attribute(min_level=self['log_level'])
+ self['debug'] = False
+ _debug = _comm.getint('debug', 0)
+ if _debug == 1:
+ self['log_level'] = LOG_DEBUG
+ self['debug'] = True
+
self['core_server_rpc'] = _comm.get('core-server-rpc', 'http://127.0.0.1:52080/rpc')
return True
diff --git a/server/www/teleport/app/eom_app/app/const.py b/server/www/teleport/app/eom_app/app/const.py
index e7754aa..3182f78 100644
--- a/server/www/teleport/app/eom_app/app/const.py
+++ b/server/www/teleport/app/eom_app/app/const.py
@@ -1,7 +1,4 @@
# -*- coding: utf-8 -*-
-APP_MODE_UNKNOWN = 0
APP_MODE_NORMAL = 1
-APP_MODE_INSTALL = 2
-APP_MODE_UPGRADE = 3
-APP_MODE_MAINTENANCE = 4
+APP_MODE_MAINTENANCE = 2
diff --git a/server/www/teleport/app/eom_app/app/core.py b/server/www/teleport/app/eom_app/app/core.py
index 1f6a2ac..f89428c 100644
--- a/server/www/teleport/app/eom_app/app/core.py
+++ b/server/www/teleport/app/eom_app/app/core.py
@@ -37,12 +37,11 @@ class WebServerCore:
cfg.res_path = os.path.abspath(options['res_path'])
cfg.cfg_path = os.path.abspath(options['cfg_path'])
- cfg.app_mode = APP_MODE_NORMAL
- # cfg.app_mode = APP_MODE_UNKNOWN
- # if os.path.exists(os.path.join(cfg.cfg_path, 'maintenance-mode')):
- # cfg.app_mode = APP_MODE_UPGRADE
- # else:
- # cfg.app_mode = APP_MODE_NORMAL
+ # cfg.app_mode = APP_MODE_NORMAL
+ if os.path.exists(os.path.join(cfg.cfg_path, 'maintenance-mode')):
+ cfg.app_mode = APP_MODE_MAINTENANCE
+ else:
+ cfg.app_mode = APP_MODE_NORMAL
_cfg_file = os.path.join(cfg.cfg_path, 'web.ini')
if not cfg.load_web(_cfg_file):
@@ -58,7 +57,8 @@ class WebServerCore:
return False
log.set_attribute(min_level=cfg.log_level, filename=cfg.log_file)
- # log.set_attribute(min_level=self['log_level'])
+ if cfg.debug:
+ log.set_attribute(trace_error=log.TRACE_ERROR_FULL)
# 尝试通过CORE-JSON-RPC获取core服务的配置(主要是ssh/rdp/telnet的端口)
self._get_core_server_config()
@@ -109,16 +109,13 @@ class WebServerCore:
# 'debug': True,
# Debug Mode.
- 'compiled_template_cache': False,
- 'static_hash_cache': False,
+ 'compiled_template_cache': True,
+ 'static_hash_cache': True,
}
- # TODO: 配置文件中应该增加 debug 选项
- # if cfg.debug:
- # settings['compiled_template_cache'] = False
- # settings['static_hash_cache'] = False
- # settings['compiled_template_cache'] = False
- # settings['static_hash_cache'] = False
+ if cfg.debug:
+ settings['compiled_template_cache'] = False
+ settings['static_hash_cache'] = False
from eom_app.controller import controllers
web_app = tornado.web.Application(controllers, **settings)
diff --git a/server/www/teleport/app/eom_app/app/session.py b/server/www/teleport/app/eom_app/app/session.py
index faa3011..9304815 100644
--- a/server/www/teleport/app/eom_app/app/session.py
+++ b/server/www/teleport/app/eom_app/app/session.py
@@ -98,9 +98,10 @@ class WebSession(threading.Thread):
else:
return _default
+
def web_session():
"""
- 取得 SwxSession 的唯一实例
+ 取得Session管理器的唯一实例
:rtype : WebSession
"""
diff --git a/server/www/teleport/app/eom_app/controller/auth.py b/server/www/teleport/app/eom_app/controller/auth.py
index 07d669b..4001368 100644
--- a/server/www/teleport/app/eom_app/controller/auth.py
+++ b/server/www/teleport/app/eom_app/controller/auth.py
@@ -4,11 +4,11 @@ import json
from eom_app.module import user
from eom_common.eomcore.logger import *
-from .base import SwxAppHandler, SwxJsonpHandler, SwxAuthJsonHandler
+from .base import TPBaseHandler, TPBaseUserAuthHandler, TPBaseJsonHandler, TPBaseUserAuthJsonHandler
from eom_app.app.util import gen_captcha
-class LoginHandler(SwxAppHandler):
+class LoginHandler(TPBaseHandler):
def get(self):
_user = self.get_current_user()
if _user['id'] == 0:
@@ -23,30 +23,33 @@ class LoginHandler(SwxAppHandler):
self.render('auth/login.mako', page_param=json.dumps(param))
-class VerifyUser(SwxJsonpHandler):
- def get(self):
+class VerifyUser(TPBaseJsonHandler):
+ def post(self):
code = self.get_session('captcha')
if code is None:
- self.write_jsonp(-1)
- return
-
- captcha = self.get_argument('captcha', None)
- username = self.get_argument('username', None)
- userpwd = self.get_argument('userpwd', None)
-
- if captcha is None or username is None:
- self.write_jsonp(-1)
- return
- if code.lower() != captcha.lower():
- self.write_jsonp(-1)
+ self.write_json(-1, 'can not get captcha')
return
self.del_session('captcha')
+ args = self.get_argument('args', None)
+ if args is not None:
+ args = json.loads(args)
+ captcha = args['captcha']
+ username = args['username']
+ userpwd = args['userpwd']
+ else:
+ self.write_json(-1, 'invalid param')
+ return
+
+ if code.lower() != captcha.lower():
+ self.write_json(-1, 'invalid captcha')
+ return
+
try:
user_id, account_type, nickname = user.verify_user(username, userpwd)
if user_id == 0:
- self.write_jsonp(-1)
+ self.write_json(-1, 'no such user or password.')
return
_user = self.get_session('user')
@@ -68,14 +71,14 @@ class VerifyUser(SwxJsonpHandler):
_user['type'] = account_type
self.set_session('user', _user)
- return self.write_jsonp(0)
+ return self.write_json(0)
except:
log.e('can not set session.')
- self.write_jsonp(-1)
+ self.write_json(-1, 'session error.')
-class LogoutHandler(SwxAppHandler):
+class LogoutHandler(TPBaseUserAuthHandler):
def get(self):
_user = self.get_current_user()
_user['is_login'] = False
@@ -84,7 +87,7 @@ class LogoutHandler(SwxAppHandler):
self.redirect('/auth/login')
-class GetCaptchaHandler(SwxAppHandler):
+class GetCaptchaHandler(TPBaseHandler):
def get(self):
code, img_data = gen_captcha()
self.set_session('captcha', code)
@@ -92,26 +95,29 @@ class GetCaptchaHandler(SwxAppHandler):
self.write(img_data)
-class VerifyCaptchaHandler(SwxJsonpHandler):
- def get(self):
+class VerifyCaptchaHandler(TPBaseJsonHandler):
+ def post(self):
code = self.get_session('captcha')
if code is None:
- self.write_jsonp(-1)
+ self.write_json(-1)
return
- captcha = self.get_argument('captcha', None)
- if captcha is None:
- self.write_jsonp(-1)
+ args = self.get_argument('args', None)
+ if args is not None:
+ args = json.loads(args)
+ captcha = args['captcha']
+ else:
+ self.write_json(-1)
return
if code.lower() != captcha.lower():
- self.write_jsonp(-1)
+ self.write_json(-1)
return
- self.write_jsonp(0)
+ self.write_json(0)
-class ModifyPwd(SwxAuthJsonHandler):
+class ModifyPwd(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
diff --git a/server/www/teleport/app/eom_app/controller/base.py b/server/www/teleport/app/eom_app/controller/base.py
index 4c327a5..9139e89 100644
--- a/server/www/teleport/app/eom_app/controller/base.py
+++ b/server/www/teleport/app/eom_app/controller/base.py
@@ -17,12 +17,21 @@ from eom_app.app.const import *
cfg = app_cfg()
-class SwxBaseHandler(tornado.web.RequestHandler):
+class TPBaseHandler(tornado.web.RequestHandler):
+ """
+ 所有http请求处理的基类,只有极少数的请求如登录、维护直接从本类继承,其他的所有类均从本类的子类(控制权限的类)继承
+ """
+
+ MODE_HTTP = 0
+ MODE_JSON = 1
+ # MODE_JSONP = 2
+
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
self._s_id = None
- # self._s_val = dict()
+ self._mode = self.MODE_HTTP
+ # self._jsonp_callback = ''
def initialize(self):
template_path = self.get_template_path()
@@ -35,10 +44,48 @@ class SwxBaseHandler(tornado.web.RequestHandler):
return template.render(**namespace)
def render(self, template_path, **kwargs):
+ if self._mode != self.MODE_HTTP:
+ self.write_json(-1, 'should be web page request.')
+ return
self.finish(self.render_string(template_path, **kwargs))
+ def write_json(self, code, message='', data=None):
+ if self._mode != self.MODE_JSON:
+ self.write('should be json request.')
+ self.finish()
+ return
+
+ if not isinstance(code, int):
+ raise RuntimeError('`code` must be a integer.')
+ if not isinstance(message, str):
+ raise RuntimeError('`msg` must be a string.')
+
+ if data is None:
+ data = list()
+
+ _ret = {'code': code, 'message': message, 'data': data}
+
+ self.set_header("Content-Type", "application/json")
+ self.write(json_encode(_ret))
+ self.finish()
+
+ def write_raw_json(self, data=None):
+ if self._mode != self.MODE_JSON:
+ self.write('should be json request.')
+ self.finish()
+ return
+
+ if data is None:
+ data = list()
+
+ self.set_header("Content-Type", "application/json")
+ self.write(json_encode(data))
+ self.finish()
+
def prepare(self):
super().prepare()
+ if self._finished:
+ return
# if self.application.settings.get("xsrf_cookies"):
# x = self.xsrf_token
@@ -76,58 +123,26 @@ class SwxBaseHandler(tornado.web.RequestHandler):
return user
-class SwxAppHandler(SwxBaseHandler):
- def __init__(self, application, request, **kwargs):
- super().__init__(application, request, **kwargs)
-
- def prepare(self):
- super().prepare()
- if self._finished:
- return
-
- if cfg.app_mode == APP_MODE_NORMAL:
- return
-
- # self.redirect('/maintenance')
- self.render('maintenance/index.mako')
+# class TPBaseAppHandler(TPBaseHandler):
+# """
+# 权限控制:如果处于维护模式,只有管理员登录后方可操作,其他用户均显示维护页面
+# """
+# def __init__(self, application, request, **kwargs):
+# super().__init__(application, request, **kwargs)
+#
+# def prepare(self):
+# super().prepare()
+# if self._finished:
+# return
+#
+# if cfg.app_mode == APP_MODE_NORMAL:
+# return
+#
+# # self.redirect('/maintenance')
+# self.render('maintenance/index.mako')
-class SwxJsonpHandler(SwxAppHandler):
- def __init__(self, application, request, **kwargs):
- super().__init__(application, request, **kwargs)
-
- self._js_callback = ''
-
- def prepare(self):
- super().prepare()
- if self._finished:
- return
-
- self._js_callback = self.get_argument('callback', None)
- if self._js_callback is None:
- raise RuntimeError('no callback in URL param.')
-
- def write_jsonp(self, err_code, data=None):
-
- self.write(self._js_callback)
- self.write('({code:')
- self.write('{}'.format(err_code))
-
- if data is None:
- self.write('})')
- self.finish()
- return
-
- if not isinstance(data, dict):
- raise RuntimeError('jsonp data should be dict.')
-
- self.write(',data:')
- self.write(json_encode(data))
- self.write('})')
- self.finish()
-
-
-class SwxJsonHandler(SwxAppHandler):
+class TPBaseJsonHandler(TPBaseHandler):
"""
所有返回JSON数据的控制器均从本类集成,返回的数据格式一律包含三个字段:code/msg/data
code: 0=成功,其他=失败
@@ -137,33 +152,10 @@ class SwxJsonHandler(SwxAppHandler):
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
-
- def write_json(self, code, message='', data=None):
- if not isinstance(code, int):
- raise RuntimeError('`code` must be a integer.')
- if not isinstance(message, str):
- raise RuntimeError('`msg` must be a string.')
-
- if data is None:
- data = list()
-
- _ret = {'code': code, 'message': message, 'data': data}
-
- self.set_header("Content-Type", "application/json")
- self.write(json_encode(_ret))
- self.finish()
-
- def write_raw_json(self, data=None):
-
- if data is None:
- data = list()
-
- self.set_header("Content-Type", "application/json")
- self.write(json_encode(data))
- self.finish()
+ self._mode = self.MODE_JSON
-class SwxAuthHandler(SwxAppHandler):
+class TPBaseUserAuthHandler(TPBaseHandler):
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
@@ -181,9 +173,14 @@ class SwxAuthHandler(SwxAppHandler):
self.redirect('/auth/login?ref={}'.format(x))
else:
self.redirect('/auth/login')
+ else:
+ if cfg.app_mode == APP_MODE_MAINTENANCE and user['type'] != 100:
+ self.render('maintenance/index.mako')
+ else:
+ pass
-class SwxAdminHandler(SwxAppHandler):
+class TPBaseAdminAuthHandler(TPBaseHandler):
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
@@ -195,20 +192,21 @@ class SwxAdminHandler(SwxAppHandler):
reference = self.request.uri
user = self.get_current_user()
- if user['type'] != 100:
- if reference != '/auth/login':
+ if not user['is_login'] or user['type'] != 100:
+ if reference != '/auth/login': # 防止循环重定向
x = quote(reference)
self.redirect('/auth/login?ref={}'.format(x))
else:
self.redirect('/auth/login')
+ else:
+ if cfg.app_mode == APP_MODE_MAINTENANCE:
+ # TODO: 如果是维护模式,且尚未建立数据库,则引导用户进入安装界面,否则检查数据库版本,可能引导用户进入升级界面。
+ self.render('maintenance/index.mako')
+ else:
+ pass
-# class SwxAuthJsonpHandler(SwxAppHandler):
-# def __init__(self, application, request, **kwargs):
-# super().__init__(application, request, **kwargs)
-
-
-class SwxAuthJsonHandler(SwxJsonHandler):
+class TPBaseUserAuthJsonHandler(TPBaseJsonHandler):
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
@@ -226,8 +224,14 @@ class SwxAuthJsonHandler(SwxJsonHandler):
else:
self.write_json(-99)
+ else:
+ if cfg.app_mode == APP_MODE_MAINTENANCE and user['type'] != 100:
+ self.write_json(-1, 'maintenance mode')
+ else:
+ pass
-class SwxAdminJsonHandler(SwxJsonHandler):
+
+class TPBaseAdminAuthJsonHandler(TPBaseJsonHandler):
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
@@ -239,6 +243,6 @@ class SwxAdminJsonHandler(SwxJsonHandler):
reference = self.request.uri
user = self.get_current_user()
- if user['type'] != 100:
+ if not user['is_login'] or user['type'] != 100:
if reference != '/auth/login':
self.write_json(-99)
diff --git a/server/www/teleport/app/eom_app/controller/cert.py b/server/www/teleport/app/eom_app/controller/cert.py
index 2da31a0..d6f084e 100644
--- a/server/www/teleport/app/eom_app/controller/cert.py
+++ b/server/www/teleport/app/eom_app/controller/cert.py
@@ -2,17 +2,17 @@
from eom_app.app.configs import app_cfg
from eom_app.module import host
-from .base import SwxAdminHandler, SwxAdminJsonHandler
+from .base import TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler
cfg = app_cfg()
-class IndexHandler(SwxAdminHandler):
+class IndexHandler(TPBaseAdminAuthHandler):
def get(self):
self.render('cert/index.mako')
-class GetListHandler(SwxAdminJsonHandler):
+class GetListHandler(TPBaseAdminAuthJsonHandler):
def post(self):
_certs = host.get_cert_list()
ret = dict()
diff --git a/server/www/teleport/app/eom_app/controller/group.py b/server/www/teleport/app/eom_app/controller/group.py
index 34b2c3d..5615638 100644
--- a/server/www/teleport/app/eom_app/controller/group.py
+++ b/server/www/teleport/app/eom_app/controller/group.py
@@ -2,17 +2,17 @@
from eom_app.app.configs import app_cfg
from eom_app.module import host
-from .base import SwxAdminHandler, SwxAdminJsonHandler
+from .base import TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler
cfg = app_cfg()
-class IndexHandler(SwxAdminHandler):
+class IndexHandler(TPBaseAdminAuthHandler):
def get(self):
self.render('group/index.mako')
-class GetListHandler(SwxAdminJsonHandler):
+class GetListHandler(TPBaseAdminAuthJsonHandler):
def post(self):
group_list = host.get_group_list()
ret = dict()
diff --git a/server/www/teleport/app/eom_app/controller/host.py b/server/www/teleport/app/eom_app/controller/host.py
index 3db0cf9..449484e 100644
--- a/server/www/teleport/app/eom_app/controller/host.py
+++ b/server/www/teleport/app/eom_app/controller/host.py
@@ -13,7 +13,7 @@ from eom_app.app.util import *
from eom_app.module import host
from eom_common.eomcore.logger import *
from eom_app.app.session import web_session
-from .base import SwxAuthHandler, SwxAdminHandler, SwxAuthJsonHandler, SwxAdminJsonHandler
+from .base import TPBaseUserAuthHandler, TPBaseAdminAuthHandler, TPBaseUserAuthJsonHandler, TPBaseAdminAuthJsonHandler
cfg = app_cfg()
@@ -22,7 +22,7 @@ tmp_auth_id_base = -1
tmp_auth_id_lock = threading.RLock()
-class IndexHandler(SwxAuthHandler):
+class IndexHandler(TPBaseUserAuthHandler):
def get(self):
_user = self.get_session('user')
if _user is None:
@@ -45,7 +45,7 @@ class IndexHandler(SwxAuthHandler):
self.render('host/common_index.mako', page_param=json.dumps(param))
-class UploadAndImportHandler(SwxAdminJsonHandler):
+class UploadAndImportHandler(TPBaseAdminAuthJsonHandler):
# TODO: 导入操作可能会比较耗时,应该分离导入和获取导入状态两个过程,在页面上可以呈现导入进度,并列出导出成功/失败的项
@tornado.gen.coroutine
@@ -208,7 +208,7 @@ class UploadAndImportHandler(SwxAdminJsonHandler):
os.remove(csv_filename)
-class GetListHandler(SwxAuthJsonHandler):
+class GetListHandler(TPBaseUserAuthJsonHandler):
def post(self):
_user = self.get_session('user')
if _user is None:
@@ -279,13 +279,13 @@ class GetListHandler(SwxAuthJsonHandler):
# self.write(json_encode(data))
-class GetGrouplist(SwxAuthJsonHandler):
+class GetGrouplist(TPBaseUserAuthJsonHandler):
def post(self):
group_list = host.get_group_list()
self.write_json(0, data=group_list)
-class UpdateHandler(SwxAuthJsonHandler):
+class UpdateHandler(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -311,7 +311,7 @@ class UpdateHandler(SwxAuthJsonHandler):
self.write_json(-1)
-class AddHost(SwxAuthJsonHandler):
+class AddHost(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -334,7 +334,7 @@ class AddHost(SwxAuthJsonHandler):
return
-class LockHost(SwxAuthJsonHandler):
+class LockHost(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -359,7 +359,7 @@ class LockHost(SwxAuthJsonHandler):
return
-class DeleteHost(SwxAuthJsonHandler):
+class DeleteHost(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -382,7 +382,7 @@ class DeleteHost(SwxAuthJsonHandler):
return
-class ExportHostHandler(SwxAdminHandler):
+class ExportHostHandler(TPBaseAdminAuthHandler):
def get(self):
self.set_header('Content-Type', 'application/octet-stream')
self.set_header('Content-Disposition', 'attachment; filename=teleport-host-export.csv')
@@ -451,7 +451,7 @@ class ExportHostHandler(SwxAdminHandler):
self.finish()
-class GetCertList(SwxAuthJsonHandler):
+class GetCertList(TPBaseUserAuthJsonHandler):
def post(self):
# args = self.get_argument('args', None)
# if args is not None:
@@ -470,7 +470,7 @@ class GetCertList(SwxAuthJsonHandler):
return
-class AddCert(SwxAuthJsonHandler):
+class AddCert(TPBaseUserAuthJsonHandler):
@tornado.gen.coroutine
def post(self):
args = self.get_argument('args', None)
@@ -508,7 +508,7 @@ class AddCert(SwxAuthJsonHandler):
return self.write_json(-1)
-class DeleteCert(SwxAuthJsonHandler):
+class DeleteCert(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -531,7 +531,7 @@ class DeleteCert(SwxAuthJsonHandler):
return
-class UpdateCert(SwxAuthJsonHandler):
+class UpdateCert(TPBaseUserAuthJsonHandler):
@tornado.gen.coroutine
def post(self):
args = self.get_argument('args', None)
@@ -570,7 +570,7 @@ class UpdateCert(SwxAuthJsonHandler):
return
-class AddGroup(SwxAuthJsonHandler):
+class AddGroup(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -593,7 +593,7 @@ class AddGroup(SwxAuthJsonHandler):
return
-class UpdateGroup(SwxAuthJsonHandler):
+class UpdateGroup(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -617,7 +617,7 @@ class UpdateGroup(SwxAuthJsonHandler):
return
-class DeleteGroup(SwxAuthJsonHandler):
+class DeleteGroup(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -640,7 +640,7 @@ class DeleteGroup(SwxAuthJsonHandler):
return
-class AddHostToGroup(SwxAuthJsonHandler):
+class AddHostToGroup(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -664,7 +664,7 @@ class AddHostToGroup(SwxAuthJsonHandler):
return
-class GetSessionId(SwxAuthJsonHandler):
+class GetSessionId(TPBaseUserAuthJsonHandler):
@tornado.gen.coroutine
def post(self, *args, **kwargs):
args = self.get_argument('args', None)
@@ -704,7 +704,7 @@ class GetSessionId(SwxAuthJsonHandler):
return self.write_json(0, data=data)
-class AdminGetSessionId(SwxAuthJsonHandler):
+class AdminGetSessionId(TPBaseUserAuthJsonHandler):
@tornado.gen.coroutine
def post(self, *args, **kwargs):
args = self.get_argument('args', None)
@@ -765,7 +765,7 @@ class AdminGetSessionId(SwxAuthJsonHandler):
return self.write_json(0, data=data)
-class AdminFastGetSessionId(SwxAdminJsonHandler):
+class AdminFastGetSessionId(TPBaseAdminAuthJsonHandler):
@tornado.gen.coroutine
def post(self, *args, **kwargs):
args = self.get_argument('args', None)
@@ -855,7 +855,7 @@ class AdminFastGetSessionId(SwxAdminJsonHandler):
return self.write_json(0, data=data)
-class SysUserList(SwxAuthJsonHandler):
+class SysUserList(TPBaseUserAuthJsonHandler):
def post(self, *args, **kwargs):
args = self.get_argument('args', None)
if args is not None:
@@ -873,7 +873,7 @@ class SysUserList(SwxAuthJsonHandler):
return self.write_json(0, data=data)
-class SysUserAdd(SwxAuthJsonHandler):
+class SysUserAdd(TPBaseUserAuthJsonHandler):
@tornado.gen.coroutine
def post(self, *args, **kwargs):
args = self.get_argument('args', None)
@@ -909,7 +909,7 @@ class SysUserAdd(SwxAuthJsonHandler):
return self.write_json(0)
-class SysUserUpdate(SwxAuthJsonHandler):
+class SysUserUpdate(TPBaseUserAuthJsonHandler):
@tornado.gen.coroutine
def post(self, *args, **kwargs):
args = self.get_argument('args', None)
@@ -957,7 +957,7 @@ class SysUserUpdate(SwxAuthJsonHandler):
return self.write_json(-1)
-class SysUserDelete(SwxAuthJsonHandler):
+class SysUserDelete(TPBaseUserAuthJsonHandler):
def post(self, *args, **kwargs):
args = self.get_argument('args', None)
if args is not None:
diff --git a/server/www/teleport/app/eom_app/controller/index.py b/server/www/teleport/app/eom_app/controller/index.py
index 6a2ddc1..cf01a81 100644
--- a/server/www/teleport/app/eom_app/controller/index.py
+++ b/server/www/teleport/app/eom_app/controller/index.py
@@ -1,15 +1,15 @@
# -*- coding: utf-8 -*-
import sys
import tornado.ioloop
-from .base import SwxBaseHandler, SwxAuthHandler
+from .base import TPBaseHandler, TPBaseUserAuthHandler
-class IndexHandler(SwxAuthHandler):
+class IndexHandler(TPBaseUserAuthHandler):
def get(self):
self.redirect('/host')
-class ExitHandler(SwxBaseHandler):
+class ExitHandler(TPBaseHandler):
def get(self):
self.write('exit ok')
tornado.ioloop.IOLoop.instance().stop()
diff --git a/server/www/teleport/app/eom_app/controller/maintenance.py b/server/www/teleport/app/eom_app/controller/maintenance.py
index aad0984..41aed8a 100644
--- a/server/www/teleport/app/eom_app/controller/maintenance.py
+++ b/server/www/teleport/app/eom_app/controller/maintenance.py
@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
-from .base import SwxBaseHandler
+from .base import TPBaseHandler
-class IndexHandler(SwxBaseHandler):
+class IndexHandler(TPBaseHandler):
def get(self):
self.render('maintenance/index.mako')
diff --git a/server/www/teleport/app/eom_app/controller/pwd.py b/server/www/teleport/app/eom_app/controller/pwd.py
index fdb8f8c..79290ca 100644
--- a/server/www/teleport/app/eom_app/controller/pwd.py
+++ b/server/www/teleport/app/eom_app/controller/pwd.py
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
-from .base import SwxAuthHandler
+from .base import TPBaseUserAuthHandler
-class IndexHandler(SwxAuthHandler):
+class IndexHandler(TPBaseUserAuthHandler):
def get(self):
self.render('pwd/index.mako')
diff --git a/server/www/teleport/app/eom_app/controller/record.py b/server/www/teleport/app/eom_app/controller/record.py
index 748da22..1c526a9 100644
--- a/server/www/teleport/app/eom_app/controller/record.py
+++ b/server/www/teleport/app/eom_app/controller/record.py
@@ -9,7 +9,7 @@ from eom_app.app.configs import app_cfg
# from eom_app.module import host
from eom_app.module import record
from eom_app.module import user
-from .base import SwxAdminHandler, SwxAdminJsonHandler
+from .base import TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler
cfg = app_cfg()
@@ -31,7 +31,7 @@ def get_free_space_bytes(folder):
return total_bytes, free_bytes
-class LogHandler(SwxAdminHandler):
+class LogHandler(TPBaseAdminAuthHandler):
def get(self):
user_list = user.get_user_list()
total_size, free_size = get_free_space_bytes(cfg.data_path)
@@ -47,7 +47,7 @@ class LogHandler(SwxAdminHandler):
self.render('log/index.mako', page_param=json.dumps(param))
-class RecordHandler(SwxAdminHandler):
+class RecordHandler(TPBaseAdminAuthHandler):
def get(self, protocol, record_id):
protocol = int(protocol)
if protocol == 1:
@@ -56,7 +56,7 @@ class RecordHandler(SwxAdminHandler):
self.render('log/record.mako', record_id=record_id)
-# class PlayRdpHandler(SwxAdminHandler):
+# class PlayRdpHandler(TPBaseAdminAuthHandler):
# def get(self, ip, record_id):
# # protocol = int(protocol)
# # if protocol == 1:
@@ -68,7 +68,7 @@ class RecordHandler(SwxAdminHandler):
# filename = os.path.join(cfg.data_path, 'replay', 'rdp', '{}'.format(record_id), 'tp-rdp.tpr')
-class ComandLogHandler(SwxAdminHandler):
+class ComandLogHandler(TPBaseAdminAuthHandler):
def get(self, protocol, record_id):
param = dict()
@@ -93,7 +93,7 @@ class ComandLogHandler(SwxAdminHandler):
self.render('log/record-ssh-cmd.mako', page_param=json.dumps(param))
-class RecordGetHeader(SwxAdminJsonHandler):
+class RecordGetHeader(TPBaseAdminAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -111,7 +111,7 @@ class RecordGetHeader(SwxAdminJsonHandler):
self.write_json(0, data=ret)
-class RecordGetInfo(SwxAdminJsonHandler):
+class RecordGetInfo(TPBaseAdminAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -124,7 +124,7 @@ class RecordGetInfo(SwxAdminJsonHandler):
self.write_json(0, data=data)
-class DeleteLog(SwxAdminJsonHandler):
+class DeleteLog(TPBaseAdminAuthJsonHandler):
# TODO: 用户可能会批量删除大量录像文件,因此io操作可能会比较耗时,这里应该改为异步方式。
def post(self):
args = self.get_argument('args', None)
@@ -136,7 +136,7 @@ class DeleteLog(SwxAdminJsonHandler):
self.write_json(0)
-class LogList(SwxAdminJsonHandler):
+class LogList(TPBaseAdminAuthJsonHandler):
def post(self):
filter = dict()
order = dict()
diff --git a/server/www/teleport/app/eom_app/controller/rpc.py b/server/www/teleport/app/eom_app/controller/rpc.py
index 7c92c15..9bc2497 100644
--- a/server/www/teleport/app/eom_app/controller/rpc.py
+++ b/server/www/teleport/app/eom_app/controller/rpc.py
@@ -10,12 +10,12 @@ from eom_app.app.util import async_post_http
from eom_app.module import host, record
from eom_common.eomcore.logger import *
-from .base import SwxJsonHandler
+from .base import TPBaseJsonHandler
cfg = app_cfg()
-class RpcHandler(SwxJsonHandler):
+class RpcHandler(TPBaseJsonHandler):
@tornado.gen.coroutine
def get(self):
_uri = self.request.uri.split('?', 1)
diff --git a/server/www/teleport/app/eom_app/controller/set.py b/server/www/teleport/app/eom_app/controller/set.py
index 4e74875..0e9160f 100644
--- a/server/www/teleport/app/eom_app/controller/set.py
+++ b/server/www/teleport/app/eom_app/controller/set.py
@@ -12,7 +12,7 @@ import time
from eom_app.app.configs import app_cfg
from eom_app.module import host
from eom_app.module import set
-from .base import SwxAdminHandler, SwxAdminJsonHandler
+from .base import TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler
cfg = app_cfg()
@@ -40,7 +40,7 @@ def get_local_ip():
return iplist
-class IndexHandler(SwxAdminHandler):
+class IndexHandler(TPBaseAdminAuthHandler):
def get(self):
# static_path = cfg.static_path
# var_js = os.path.join(static_path, 'js', 'var.js')
@@ -114,7 +114,7 @@ def restart_service():
t.start()
-class UpdateConfig(SwxAdminJsonHandler):
+class UpdateConfig(TPBaseAdminAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -159,7 +159,7 @@ class UpdateConfig(SwxAdminJsonHandler):
except:
self.write_json(-2)
-# class OsOperator(SwxAuthJsonHandler):
+# class OsOperator(TPBaseUserAuthJsonHandler):
# def post(self):
# args = self.get_argument('args', None)
# if args is not None:
diff --git a/server/www/teleport/app/eom_app/controller/user.py b/server/www/teleport/app/eom_app/controller/user.py
index 0f85996..0d4e935 100644
--- a/server/www/teleport/app/eom_app/controller/user.py
+++ b/server/www/teleport/app/eom_app/controller/user.py
@@ -4,17 +4,17 @@ import json
from eom_app.app.configs import app_cfg
from eom_app.module import host
from eom_app.module import user
-from .base import SwxAuthJsonHandler, SwxAdminHandler, SwxAdminJsonHandler
+from .base import TPBaseUserAuthJsonHandler, TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler
cfg = app_cfg()
-class IndexHandler(SwxAdminHandler):
+class IndexHandler(TPBaseAdminAuthHandler):
def get(self):
self.render('user/index.mako')
-class AuthHandler(SwxAdminHandler):
+class AuthHandler(TPBaseAdminAuthHandler):
def get(self, user_name):
group_list = host.get_group_list()
cert_list = host.get_cert_list()
@@ -23,7 +23,7 @@ class AuthHandler(SwxAdminHandler):
cert_list=cert_list, user_name=user_name)
-class GetListHandler(SwxAdminJsonHandler):
+class GetListHandler(TPBaseAdminAuthJsonHandler):
def post(self):
user_list = user.get_user_list()
ret = dict()
@@ -33,7 +33,7 @@ class GetListHandler(SwxAdminJsonHandler):
self.write_json(0, data=ret)
-class DeleteUser(SwxAuthJsonHandler):
+class DeleteUser(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -56,7 +56,7 @@ class DeleteUser(SwxAuthJsonHandler):
return
-class ModifyUser(SwxAuthJsonHandler):
+class ModifyUser(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -82,7 +82,7 @@ class ModifyUser(SwxAuthJsonHandler):
return
-class AddUser(SwxAuthJsonHandler):
+class AddUser(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -106,7 +106,7 @@ class AddUser(SwxAuthJsonHandler):
return
-class LockUser(SwxAuthJsonHandler):
+class LockUser(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -131,7 +131,7 @@ class LockUser(SwxAuthJsonHandler):
return
-class ResetUser(SwxAuthJsonHandler):
+class ResetUser(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -156,7 +156,7 @@ class ResetUser(SwxAuthJsonHandler):
return
-class HostList(SwxAuthJsonHandler):
+class HostList(TPBaseUserAuthJsonHandler):
def post(self):
filter = dict()
# user = self.get_current_user()
@@ -217,7 +217,7 @@ class HostList(SwxAuthJsonHandler):
self.write_json(0, data=ret)
-class AllocHost(SwxAuthJsonHandler):
+class AllocHost(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -239,7 +239,7 @@ class AllocHost(SwxAuthJsonHandler):
self.write_json(-2)
-class AllocHostUser(SwxAuthJsonHandler):
+class AllocHostUser(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -261,7 +261,7 @@ class AllocHostUser(SwxAuthJsonHandler):
self.write_json(-2)
-class DeleteHost(SwxAuthJsonHandler):
+class DeleteHost(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
@@ -283,7 +283,7 @@ class DeleteHost(SwxAuthJsonHandler):
self.write_json(-2)
-class DeleteHostUser(SwxAuthJsonHandler):
+class DeleteHostUser(TPBaseUserAuthJsonHandler):
def post(self):
args = self.get_argument('args', None)
if args is not None:
diff --git a/server/www/teleport/app/eom_app/module/user.py b/server/www/teleport/app/eom_app/module/user.py
index 5c01ba6..76a2756 100644
--- a/server/www/teleport/app/eom_app/module/user.py
+++ b/server/www/teleport/app/eom_app/module/user.py
@@ -1,20 +1,34 @@
# -*- coding: utf-8 -*-
+
import hashlib
+from eom_app.app.const import *
+from eom_app.app.configs import app_cfg
from .common import *
+cfg = app_cfg()
-def verify_user(username, userpwd):
- sql_exec = get_db_con()
- userpwd = hashlib.sha256(userpwd.encode()).hexdigest()
+def verify_user(name, password):
+ _password = hashlib.sha256(password.encode()).hexdigest()
string_sql = 'select account_id, account_type, ' \
- 'account_name FROM ts_account WHERE account_name =\'{}\' AND account_pwd = \'{}\''.format(username, userpwd)
+ 'account_name FROM ts_account WHERE account_name =\'{}\' AND account_pwd = \'{}\''.format(name, _password)
+
+ sql_exec = get_db_con()
db_ret = sql_exec.ExecProcQuery(string_sql)
+ if db_ret is None:
+ # 特别地,如果无法取得数据库连接,有可能是新安装的系统,尚未建立数据库,此时应该处于维护模式
+ # 因此可以特别地处理用户验证:用户名admin,密码admin可以登录为管理员
+ if cfg.app_mode == APP_MODE_MAINTENANCE:
+ if name == 'admin' and password == 'admin':
+ return 1, 100, 'admin'
+ else:
+ return 0, 0, ''
+
if len(db_ret) != 1:
return 0, 0, ''
- user_id, account_type, username = db_ret[0]
- return user_id, account_type, username
+ user_id, account_type, name = db_ret[0]
+ return user_id, account_type, name
def modify_pwd(old_pwd, new_pwd, user_id):
diff --git a/server/www/teleport/app/eom_common/eomcore/env.py b/server/www/teleport/app/eom_common/eomcore/env.py
deleted file mode 100644
index 7d973d1..0000000
--- a/server/www/teleport/app/eom_common/eomcore/env.py
+++ /dev/null
@@ -1,203 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-运行环境检测
-"""
-
-import os
-import sys
-import platform
-from eom_common.common.const import *
-from eom_common.eomcore.logger import log
-from . import utils
-
-
-class EomEnvBase(object):
- def __init__(self):
- self._os_type = OS_UNKNOWN
- self._linux_dist = OS_LINUX_UNKNOWN
-
- self._os_name = 'unknown'
- self._os_id = 0 # 0 = unknown, 1 = windows, 200=Linux, 201=Ubuntu...
-
- # # 脚本是由Python运行,还是由我们自己的主程序运行
- self._is_self_exec = False
- #
- # 是否运行于管理员身份
- self._is_run_as_root = False
-
- #
- self._app_path = ''
- self._conf_path = ''
- self._log_path = ''
- self._data_path = ''
-
- self._check()
-
- # def init(self, app_path):
- # self._app_path = app_path
- # self._conf_path = os.path.join(self._app_path, 'conf')
- # # self._log_path = os.path.join(self._app_path, 'log')
-
- def _check(self):
- # 判断操作系统
- if 'win32' == sys.platform:
- self._os_type = OS_WIN32
- self._os_name = 'windows'
- self._os_id = 1
- elif 'linux' == sys.platform:
- self._os_type = OS_LINUX
- self._os_name = 'linux'
- self._os_id = 200
- elif 'darwin' == sys.platform:
- self._os_type = OS_MAC
- self._os_name = 'macos'
- self._os_id = 300
- else:
- log.e('[ERROR] Can not detect system type.\n')
- return
-
- # 如果是Linux,判断其发行版
- if OS_LINUX == self._os_type:
- (dist, ver, sys_id) = platform.dist()
- dist = dist.lower()
- if 'centos' == dist:
- self._linux_dist = OS_LINUX_CENTOS
- self._os_id = 201
- elif 'ubuntu' == dist:
- self._linux_dist = OS_LINUX_UBUNTU
- self._os_id = 202
- elif 'debian' == dist:
- self._linux_dist = OS_LINUX_DEBIAN
- self._os_id = 203
- elif 'redhat' == dist:
- self._linux_dist = OS_LINUX_REDHAT
- self._os_id = 204
- elif 'gentoo' == dist:
- self._linux_dist = OS_LINUX_GENTOO
- self._os_id = 205
- else:
- log.w('[WARNING] Can not detect linux distribution, try default settings.\n')
- self._linux_dist = OS_LINUX_DEFAULT
-
- # 判断宿主程序是python还是我们自己的主程序
- exec_names = os.path.split(sys.executable)
- # print(sys.executable)
- if 'python3' == exec_names[1] or 'python.exe' == exec_names[1]:
- self._is_self_exec = False
- else:
- self._is_self_exec = True
-
- # 判断是否是以root身份运行
- if self._os_type == OS_WIN32:
- # 在windows平台,没有直接的方式,可以尝试在特定目录下创建文件,然后根据成功与否来判断
- tmp_file = '%s\\System32\\6A5D77DDFCFB40CEB26A8444EEC5757E_%s.tmp' % (os.getenv('SystemRoot'), utils.gen_random(4))
- try:
- f = open(tmp_file, 'w')
- f.close()
- os.remove(tmp_file)
- self._is_run_as_root = True
- except IOError:
- pass
- else:
- if 0 == os.getuid():
- self._is_run_as_root = True
-
- # # 确定路径
- # tmp = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
- # if tmp[-4:] == '.zip':
- # self._app_path = os.path.abspath(os.path.join(tmp, '..', '..'))
- # else:
- # self._app_path = os.path.abspath(os.path.join(tmp, '..'))
-
- # self._conf_path = os.path.join(self._app_path, 'conf')
-
- def is_self_exec(self):
- return self._is_self_exec
-
- def is_root(self):
- return self._is_run_as_root
-
- def get_os_type(self):
- return self._os_type
-
- def get_os_name(self):
- return self._os_name
-
- def get_os_id(self):
- return self._os_id
-
- def is_windows(self):
- return True if self._os_type == OS_WIN32 else False
-
- def is_macos(self):
- return True if self._os_type == OS_MAC else False
-
- def is_linux(self):
- return True if self._os_type == OS_LINUX else False
-
- def get_linux_dist(self):
- return self._linux_dist
-
- def is_ubuntu(self):
- return True if self._linux_dist == OS_LINUX_UBUNTU else False
-
- def is_centos(self):
- return True if self._linux_dist == OS_LINUX_CENTOS else False
-
- def is_debian(self):
- return True if self._linux_dist == OS_LINUX_DEBIAN else False
-
- def is_redhat(self):
- return True if self._linux_dist == OS_LINUX_REDHAT else False
-
- def is_gentoo(self):
- return True if self._linux_dist == OS_LINUX_GENTOO else False
-
- # def get_log_file_path(self):
- # if self.is_windows():
- # path = os.path.join(self.app_path, 'log', 'eom-agent')
- # elif self.is_macos():
- # path = '/var/log/eom-agent'
- # else:
- # path = '/var/log/eom-agent'
- #
- # return path
-
- def log_path(self):
- return self._log_path
-
- @property
- def app_path(self):
- """
- 返回的路径是app脚本文件所在路径的上一级路径,可用于合成log、conf等路径。
-
- :rtype : str
- """
- return self._app_path
-
- @property
- def conf_path(self):
- return self._conf_path
-
- @property
- def data_path(self):
- return self._data_path
-
-#
-#
-# # eom_env = EomEnv()
-# # del EomEnv
-# eom_env = None
-#
-#
-# def get_env():
-# """
-#
-# :rtype : EomEnv
-# """
-# global eom_env
-# if eom_env is None:
-# eom_env = EomEnv()
-# # del EomEnv
-# return eom_env
diff --git a/server/www/teleport/app/eom_common/eomcore/eom_mysql.py b/server/www/teleport/app/eom_common/eomcore/eom_mysql.py
index d04a93e..aeb9908 100644
--- a/server/www/teleport/app/eom_common/eomcore/eom_mysql.py
+++ b/server/www/teleport/app/eom_common/eomcore/eom_mysql.py
@@ -1,20 +1,9 @@
-# coding=utf-8
-# !/usr/bin/env python
-# -------------------------------------------------------------------------------
-# Name: pymssqlTest.py
-# Purpose: 测试 pymssql库,该库到这里下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql
-#
-# Author: scott
-#
-# Created: 04/02/2012
-# -------------------------------------------------------------------------------
+# -*- coding: utf-8 -*-
import pymysql
import threading
from .logger import *
-# import logic.config_file
-# eom_comm_conf = logic.config_file.get_comm_conf()
mysql_pool = None
diff --git a/server/www/teleport/app/eom_common/eomcore/eom_sqlite.py b/server/www/teleport/app/eom_common/eomcore/eom_sqlite.py
index 3cf792c..e7219cd 100644
--- a/server/www/teleport/app/eom_common/eomcore/eom_sqlite.py
+++ b/server/www/teleport/app/eom_common/eomcore/eom_sqlite.py
@@ -28,6 +28,8 @@ class eom_sqlite:
self._conn = None
def connect(self):
+ if not os.path.exists(self._db_file):
+ return None
try:
self._conn = sqlite3.connect(self._db_file)
except:
diff --git a/server/www/teleport/app/eom_common/eomcore/logger.py b/server/www/teleport/app/eom_common/eomcore/logger.py
index 60dc707..420b981 100644
--- a/server/www/teleport/app/eom_common/eomcore/logger.py
+++ b/server/www/teleport/app/eom_common/eomcore/logger.py
@@ -10,7 +10,7 @@ import traceback
__all__ = ['log',
'CR_DEBUG', 'CR_VERBOSE', 'CR_INFO', 'CR_WARN', 'CR_ERROR',
- 'LOG_DEBUG', 'LOG_VERBOSE', 'LOG_INFO', 'LOG_WARN', 'LOG_ERROR', 'TRACE_ERROR_NONE', 'TRACE_ERROR_FULL']
+ 'LOG_DEBUG', 'LOG_VERBOSE', 'LOG_INFO', 'LOG_WARN', 'LOG_ERROR']
LOG_DEBUG = 0
LOG_VERBOSE = 1
@@ -32,9 +32,6 @@ try:
except ImportError:
pass
-TRACE_ERROR_NONE = 0
-TRACE_ERROR_FULL = 999999
-
# ======================================
# 颜色
# ======================================
@@ -95,6 +92,9 @@ class EomLogger:
:type _win_color : Win32ColorConsole
"""
+ TRACE_ERROR_NONE = 0
+ TRACE_ERROR_FULL = 999999
+
def __init__(self):
atexit.register(self.finalize)
@@ -104,7 +104,7 @@ class EomLogger:
# self._end = '\n'
self._min_level = LOG_INFO # 大于等于此值的日志信息才会记录
- self._trace_error = TRACE_ERROR_NONE # 记录错误信息时,是否追加记录调用栈
+ self._trace_error = self.TRACE_ERROR_NONE # 记录错误信息时,是否追加记录调用栈
self._log_datetime = True # 是否记录日志时间
self._file_handle = None # 日志文件的句柄,为None时表示不记录到文件
@@ -257,7 +257,7 @@ class EomLogger:
self._console_set_color(CR_ERROR)
self._do_log(LOG_ERROR, *args, **kwargs)
- if self._trace_error == TRACE_ERROR_NONE:
+ if self._trace_error == self.TRACE_ERROR_NONE:
return
s = traceback.extract_stack()
diff --git a/server/www/teleport/app/eom_common/eomcore/sysexec.py b/server/www/teleport/app/eom_common/eomcore/sysexec.py
deleted file mode 100644
index ef75cc2..0000000
--- a/server/www/teleport/app/eom_common/eomcore/sysexec.py
+++ /dev/null
@@ -1,152 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-执行系统命令的模块
-"""
-
-import subprocess
-
-from .logger import *
-
-
-class SysExec:
- def __init__(self, cmd, line_processor=None):
- self.__cmd = cmd
- self.__process_ret = 0
- self.__console_output = bytes()
- self.__line_processor = line_processor
-
- def get_exec_ret(self):
- return self.__process_ret
-
- def get_console_output(self):
- return self.__console_output
-
- def run(self, direct_output=False, output_codec=None):
- # 注意:output_codec在windows默认为gb2312,其他平台默认utf8
- if output_codec is None:
- if env.is_windows():
- output_codec = 'gb2312'
- else:
- output_codec = 'utf8'
-
- p = None
- """type: subprocess.Popen"""
-
- if env.is_windows():
- try:
- p = subprocess.Popen(self.__cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
- except WindowsError as e:
- self.__process_ret = e.errno
- msg = 'Unknown error.'
- if 2 == e.errno:
- msg = 'The system cannot find the file specified.'
- elif 3 == e.errno:
- msg = 'The system cannot find the path specified.'
- elif 5 == e.errno:
- msg = 'Access is denied.'
- elif 13 == e.errno:
- msg = 'The process cannot access the file because it is being used by another process.'
-
- self.__console_output = msg.encode(output_codec)
- return
-
- except:
- msg = 'Unknown error.'
- self.__process_ret = 999
- self.__console_output = msg.encode(output_codec)
- return
-
- else:
- try:
- # Test under Mac, shell must be True.
- p = subprocess.Popen(self.__cmd, close_fds=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
- except:
- msg = 'Unknown error.'
- self.__process_ret = 999
- self.__console_output = msg.encode(output_codec)
-
- f = p.stdout
- while True:
- line = f.readline()
- if 0 == len(line):
- break
-
- # if '\n' == line[-1]:
- # line = line[:-1]
-
- if line[-2:] == '\r\n':
- line = line[:-2]
- line += '\n'
- if line[-1:] == '\r':
- line = line[:-1]
- line += '\n'
-
- if self.__line_processor is not None:
- self.__line_processor(line)
-
- if direct_output:
- log.d(line.decode(output_codec))
-
- self.__console_output += line
-
- # # 捕获输出的字符串,在内部使用时先转换为unicode,再根据需要转为其他编码格式
- # # 例如存储时总是转换为utf-8,输出时在Win平台上转换为gb2312,其他平台上会是utf-8.
- # _line = None
- # if const.CONSOLE_WIN_CMD == self.console_type:
- # _line = unicode(line, output_codec)
- # else:
- # log.v('tab\n')
- # _line = utf8_coder.decode(line)[0]#unicode(line, 'utf-8')
-
- # if direct_output == True:
- # log.cap(_line)
-
- # strOutput += utf8_coder.encode(_line)[0]#_line.encode('utf-8')
-
- self.__process_ret = p.wait()
-
- # if bCompareRet:
- # if retWanted != ret:
- # self.error("\nExecute command returned %d, but we wanted %d.\n\n" % (ret, retWanted))
-
- # print(self.__console_output.decode(output_codec))
- return
-
- def start(self):
- # Start a command and return, not wait it end.
-
- if env.is_windows():
- try:
- subprocess.Popen(self.__cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
- except OSError as e:
- self.__process_ret = e.errno
- # msg = 'Unknown error.'
- # if 2 == e.errno:
- # msg = 'The system cannot find the file specified.'
- # elif 3 == e.errno:
- # msg = 'The system cannot find the path specified.'
- # elif 5 == e.errno:
- # msg = 'Access is denied.'
- # elif 13 == e.errno:
- # msg = 'The process cannot access the file because it is being used by another process.'
- #
- # self.__console_output = msg.encode(output_codec)
- return False
-
- except:
- # msg = 'Unknown error.'
- self.__process_ret = 999
- # self.__console_output = msg.encode(output_codec)
- return False
-
- else:
- try:
- subprocess.Popen(self.__cmd, close_fds=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
- except:
- # msg = 'Unknown error.'
- self.__process_ret = 999
- # self.__console_output = msg.encode(output_codec)
- return False
-
- return True
diff --git a/server/www/teleport/app/eom_common/eomcore/win_api.py b/server/www/teleport/app/eom_common/eomcore/win_api.py
deleted file mode 100644
index 26bd495..0000000
--- a/server/www/teleport/app/eom_common/eomcore/win_api.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import ctypes
-import os
-import struct
-from ctypes import windll, wintypes
-
-# FSCTL_GET_REPARSE_POINT = 0x900a8
-#
-# FILE_ATTRIBUTE_READONLY = 0x0001
-# FILE_ATTRIBUTE_HIDDEN = 0x0002
-# FILE_ATTRIBUTE_DIRECTORY = 0x0010
-# FILE_ATTRIBUTE_NORMAL = 0x0080
-FILE_ATTRIBUTE_REPARSE_POINT = 0x0400
-#
-# GENERIC_READ = 0x80000000
-# GENERIC_WRITE = 0x40000000
-# OPEN_EXISTING = 3
-# FILE_READ_ATTRIBUTES = 0x80
-# FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
-# INVALID_HANDLE_VALUE = wintypes.HANDLE(-1).value
-#
-# INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF
-#
-# # FILE_FLAG_OPEN_REPARSE_POINT = 2097152
-# FILE_FLAG_BACKUP_SEMANTICS = 33554432
-# # FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTI
-# FILE_FLAG_REPARSE_BACKUP = 35651584
-
-GetFileAttributes = windll.kernel32.GetFileAttributesW
-# _CreateFileW = windll.kernel32.CreateFileW
-# _DevIoCtl = windll.kernel32.DeviceIoControl
-# _DevIoCtl.argtypes = [
-# wintypes.HANDLE, # HANDLE hDevice
-# wintypes.DWORD, # DWORD dwIoControlCode
-# wintypes.LPVOID, # LPVOID lpInBuffer
-# wintypes.DWORD, # DWORD nInBufferSize
-# wintypes.LPVOID, # LPVOID lpOutBuffer
-# wintypes.DWORD, # DWORD nOutBufferSize
-# ctypes.POINTER(wintypes.DWORD), # LPDWORD lpBytesReturned
-# wintypes.LPVOID] # LPOVERLAPPED lpOverlapped
-# _DevIoCtl.restype = wintypes.BOOL
-
-
-def islink(path):
- assert os.path.isdir(path), path
- if GetFileAttributes(path) & FILE_ATTRIBUTE_REPARSE_POINT:
- return True
- else:
- return False
-
-#
-# def DeviceIoControl(hDevice, ioControlCode, input, output):
-# # DeviceIoControl Function
-# # http://msdn.microsoft.com/en-us/library/aa363216(v=vs.85).aspx
-# if input:
-# input_size = len(input)
-# else:
-# input_size = 0
-# if isinstance(output, int):
-# output = ctypes.create_string_buffer(output)
-# output_size = len(output)
-# assert isinstance(output, ctypes.Array)
-# bytesReturned = wintypes.DWORD()
-# status = _DevIoCtl(hDevice, ioControlCode, input,
-# input_size, output, output_size, bytesReturned, None)
-# print("status(%d)" % status)
-# if status != 0:
-# return output[:bytesReturned.value]
-# else:
-# return None
-#
-#
-# def CreateFile(path, access, sharemode, creation, flags):
-# return _CreateFileW(path, access, sharemode, None, creation, flags, None)
-#
-#
-# SymbolicLinkReparseFormat = "LHHHHHHL"
-# SymbolicLinkReparseSize = struct.calcsize(SymbolicLinkReparseFormat);
-#
-#
-# def readlink(path):
-# """ Windows readlink implementation. """
-# # This wouldn't return true if the file didn't exist, as far as I know.
-# assert islink(path)
-# assert type(path) == unicode
-#
-# # Open the file correctly depending on the string type.
-# hfile = CreateFile(path, GENERIC_READ, 0, OPEN_EXISTING,
-# FILE_FLAG_REPARSE_BACKUP)
-# # MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384 = (16*1024)
-# buffer = DeviceIoControl(hfile, FSCTL_GET_REPARSE_POINT, None, 16384)
-# CloseHandle(hfile)
-#
-# # Minimum possible length (assuming length of the target is bigger than 0)
-# if not buffer or len(buffer) < 9:
-# return None
-#
-# # Parse and return our result.
-# # typedef struct _REPARSE_DATA_BUFFER {
-# # ULONG ReparseTag;
-# # USHORT ReparseDataLength;
-# # USHORT Reserved;
-# # union {
-# # struct {
-# # USHORT SubstituteNameOffset;
-# # USHORT SubstituteNameLength;
-# # USHORT PrintNameOffset;
-# # USHORT PrintNameLength;
-# # ULONG Flags;
-# # WCHAR PathBuffer[1];
-# # } SymbolicLinkReparseBuffer;
-# # struct {
-# # USHORT SubstituteNameOffset;
-# # USHORT SubstituteNameLength;
-# # USHORT PrintNameOffset;
-# # USHORT PrintNameLength;
-# # WCHAR PathBuffer[1];
-# # } MountPointReparseBuffer;
-# # struct {
-# # UCHAR DataBuffer[1];
-# # } GenericReparseBuffer;
-# # } DUMMYUNIONNAME;
-# # } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
-#
-# # Only handle SymbolicLinkReparseBuffer
-# (tag, dataLength, reserver, SubstituteNameOffset, SubstituteNameLength,
-# PrintNameOffset, PrintNameLength,
-# Flags) = struct.unpack(SymbolicLinkReparseFormat,
-# buffer[:SymbolicLinkReparseSize])
-# print(tag, dataLength, reserver, SubstituteNameOffset, SubstituteNameLength)
-# start = SubstituteNameOffset + SymbolicLinkReparseSize
-# actualPath = buffer[start: start + SubstituteNameLength].decode("utf-16")
-# # This utf-16 string is null terminated
-# index = actualPath.find(u"\0")
-# assert index > 0
-# if index > 0:
-# actualPath = actualPath[:index]
-# if actualPath.startswith(u"?\\"):
-# return actualPath[2:]
-# else:
-# return actualPath
-
diff --git a/server/www/teleport/app/eom_common/eomcore/zip.py b/server/www/teleport/app/eom_common/eomcore/zip.py
deleted file mode 100644
index d03d6f6..0000000
--- a/server/www/teleport/app/eom_common/eomcore/zip.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# -*- coding: utf-8 -*-
-import zipfile
-import os
-
-
-# class ZFile(object):
-# def __init__(self, filename, mode='r', basedir=''):
-# self.filename = filename
-# self.mode = mode
-# if self.mode in ('w', 'a'):
-# self.zfile = zipfile.ZipFile(filename, self.mode, compression=zipfile.ZIP_DEFLATED)
-# else:
-# self.zfile = zipfile.ZipFile(filename, self.mode)
-# self.basedir = basedir
-# if not self.basedir:
-# self.basedir = os.path.dirname(filename)
-#
-# def addfile(self, path, arcname=None):
-# path = path.replace('//', '/')
-# if not arcname:
-# if path.startswith(self.basedir):
-# arcname = path[len(self.basedir):]
-# else:
-# arcname = ''
-# self.zfile.write(path, arcname)
-#
-# def addfiles(self, paths):
-# for path in paths:
-# if isinstance(path, tuple):
-# self.addfile(*path)
-# else:
-# self.addfile(path)
-#
-# def close(self):
-# self.zfile.close()
-#
-# def extract_to(self, path):
-# for p in self.zfile.namelist():
-# self.extract(p, path)
-#
-# def extract(self, filename, path):
-# if not filename.endswith('/'):
-# strtemp = type(filename)
-# # filename = filename.encode()
-# # filename = filename.decode('gbk')
-# # filename.
-# if sys.getfilesystemencoding() == 'mbcs':
-# filename = filename.decode('mbcs')
-# f = os.path.join(path, filename)
-# dir = os.path.dirname(f)
-# if not os.path.exists(dir):
-# os.makedirs(dir)
-# # file(f, 'wb').write(self.zfile.read(filename))
-# file_object = open(f, 'wb')
-# file_object.write(self.zfile.read(filename))
-# file_object.close()
-#
-#
-# def create(zfile, files):
-# z = ZFile(zfile, 'w')
-# z.addfiles(files)
-# z.close()
-#
-#
-# def extract(zfile, path):
-# z = ZFile(zfile)
-# z.extract_to(path)
-# z.close()
-
-
-def zip_dir(dirname, zipfilename):
- ret = False
- filelist = []
- if os.path.isfile(dirname):
- item = os.path.split(dirname)
- dirname = item[0]
- root = dirname
- name = item[1]
- filelist.append(os.path.join(root, name))
- else:
- for root, dirs, files in os.walk(dirname):
- for name in files:
- filelist.append(os.path.join(root, name))
-
- if os.path.exists(zipfilename):
- os.remove(zipfilename)
-
- zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
- try:
- for tar in filelist:
- arcname = tar[len(dirname):]
- # print arcname
- zf.write(tar, arcname)
- ret = True
- except Exception as e:
- ret = False
- finally:
- zf.close()
- return ret
-
-
-def unzip_file(zipfilename, unziptodir):
- ret = False
- if not os.path.exists(unziptodir):
- os.makedirs(unziptodir, 0o777)
-
- zfobj = zipfile.ZipFile(zipfilename)
- try:
- for name in zfobj.namelist():
- name = name.replace('\\', '/')
-
- if name.endswith('/'):
- os.mkdir(os.path.join(unziptodir, name))
- else:
- ext_filename = os.path.join(unziptodir, name)
- ext_dir = os.path.dirname(ext_filename)
- if not os.path.exists(ext_dir):
- os.mkdir(ext_dir, 0o777)
- outfile = open(ext_filename, 'wb')
- outfile.write(zfobj.read(name))
- outfile.close()
- ret = True
- except Exception as e:
- ret = False
- finally:
- zfobj.close()
- return ret
-
-# if __name__ == '__main__':
-# try:
-# # create('d:\\5.zip', 'd:\\1\\2.txt')
-# # zip_dir('d:\\1\\', 'd:\\5.zip')
-# # zip_dir('d:\\1\\2.txt', 'd:\\5.zip')
-# unzip_file('d:\\5.zip', 'c:\\3\\3\\')
-# # temp = sys.getfilesystemencoding()
-# # extract('d:\\1.zip','c:\\')
-# except Exception as e:
-# temp = str(e)
-# pass
diff --git a/server/www/teleport/app/eom_upgrade.py b/server/www/teleport/app/eom_upgrade.py
index 19b2754..3fb365a 100644
--- a/server/www/teleport/app/eom_upgrade.py
+++ b/server/www/teleport/app/eom_upgrade.py
@@ -9,7 +9,7 @@ from eom_env import *
from eom_common.eomcore.eom_sqlite import get_sqlite_pool
from eom_common.eomcore.logger import *
-log.set_attribute(min_level=LOG_DEBUG, log_datetime=False, trace_error=TRACE_ERROR_FULL)
+log.set_attribute(min_level=LOG_DEBUG, log_datetime=False, trace_error=log.TRACE_ERROR_FULL)
db_file = os.path.join(PATH_DATA, 'ts_db.db')
diff --git a/server/www/teleport/static/js/ui/auth/login.js b/server/www/teleport/static/js/ui/auth/login.js
index 79ef1bd..b2fb966 100644
--- a/server/www/teleport/static/js/ui/auth/login.js
+++ b/server/www/teleport/static/js/ui/auth/login.js
@@ -86,15 +86,9 @@ ywl.create_app = function () {
show_op_box('wait', ' 正在进行身份认证,请稍候...');
// 先判断一下captcha是否正确,如果不正确,拒绝登录
- $.ajax({
- type: 'GET',
- url: '/auth/verify-captcha',
- jsonp: "callback",
- //jsonpCallback:"login_ret",
- data: {captcha: str_captcha},
- dataType: 'jsonp',
- success: function (data) {
- if (data.code == 0) {
+ ywl.ajax_post_json('/auth/verify-captcha', {captcha: str_captcha},
+ function (ret) {
+ if (ret.code == 0) {
// 验证成功
hide_op_box();
show_op_box('wait', ' 正在登录TELEPORT,请稍候...');
@@ -103,48 +97,98 @@ ywl.create_app = function () {
else {
hide_op_box();
show_op_box('error', '验证码错误!');
- // renew the captcha.
- //change_captcha();
$('#captcha_image').attr('src', '/auth/get-captcha?' + Math.random());
$('#captcha').focus().val('');
}
$('#btn_login').removeAttr('disabled');
- },
- error: function () {
+ },
+ function () {
hide_op_box();
show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!');
$('#btn_login').removeAttr('disabled');
- }
- });
+ }
+ );
+
+// $.ajax({
+// type: 'GET',
+// url: '/auth/verify-captcha',
+// jsonp: "callback",
+// //jsonpCallback:"login_ret",
+// data: {captcha: str_captcha},
+// dataType: 'jsonp',
+// success: function (data) {
+// if (data.code == 0) {
+// // 验证成功
+// hide_op_box();
+// show_op_box('wait', ' 正在登录TELEPORT,请稍候...');
+// _app.do_account_login(str_username, str_password, str_captcha);
+// }
+// else {
+// hide_op_box();
+// show_op_box('error', '验证码错误!');
+// // renew the captcha.
+// //change_captcha();
+// $('#captcha_image').attr('src', '/auth/get-captcha?' + Math.random());
+// $('#captcha').focus().val('');
+// }
+//
+// $('#btn_login').removeAttr('disabled');
+// },
+// error: function () {
+// hide_op_box();
+// show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!');
+// $('#btn_login').removeAttr('disabled');
+// }
+// });
};
_app.do_account_login = function (username, userpwd, captcha) {
-
- $.ajax({
- type: 'GET',
- url: '/auth/verify-user',
- jsonp: "callback",
- data: {username: username, userpwd: userpwd, captcha: captcha},
- dataType: 'jsonp',
- success: function (data) {
- if (data.code == 0) {
+ ywl.ajax_post_json('/auth/verify-user', {username: username, userpwd: userpwd, captcha: captcha},
+ function (ret) {
+ if (ret.code == 0) {
// 验证成功
window.location.href = ywl.page_options.ref;
}
else {
hide_op_box();
show_op_box('error', '无法登录TELEPORT!');
+ console.log(ret);
}
$('#btn_login').removeAttr('disabled');
- },
- error: function () {
+ },
+ function () {
hide_op_box();
show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!');
$('#btn_login').removeAttr('disabled');
- }
- });
+ }
+ );
+
+// $.ajax({
+// type: 'GET',
+// url: '/auth/verify-user',
+// jsonp: "callback",
+// data: {username: username, userpwd: userpwd, captcha: captcha},
+// dataType: 'jsonp',
+// success: function (data) {
+// if (data.code == 0) {
+// // 验证成功
+// window.location.href = ywl.page_options.ref;
+// }
+// else {
+// hide_op_box();
+// show_op_box('error', '无法登录TELEPORT!');
+// }
+//
+// $('#btn_login').removeAttr('disabled');
+// },
+// error: function () {
+// hide_op_box();
+// show_op_box('error', '很抱歉,无法连接服务器!请稍后再试一次!');
+// $('#btn_login').removeAttr('disabled');
+// }
+// });
};
return _app;