diff --git a/server/www/teleport/static/js/auth/login.js b/server/www/teleport/static/js/auth/login.js
index 90eeb43..958ee68 100644
--- a/server/www/teleport/static/js/auth/login.js
+++ b/server/www/teleport/static/js/auth/login.js
@@ -23,7 +23,7 @@ var SLOGAN = [
// $app.on_init = function (cb_stack, cb_args) {
$app.on_init = function (cb_stack) {
- $app.login_type = LOGIN_TYPE_PASSWORD_CAPTCHA;
+ $app.login_type = TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA;
$app.dom = {
slogan: $('#msg-slogan'),
btn_login_type_password: $('#login-type-password'),
@@ -58,14 +58,14 @@ $app.on_init = function (cb_stack) {
$app.init_slogan();
$app.dom.btn_login_type_password.click(function () {
- $app.login_type = LOGIN_TYPE_PASSWORD_CAPTCHA;
+ $app.login_type = TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA;
$app.dom.btn_login_type_oath.removeClass('selected');
$(this).addClass('selected');
$app.dom.area_oath.slideUp(100);
$app.dom.area_captcha.slideDown(100);
});
$app.dom.btn_login_type_oath.click(function () {
- $app.login_type = LOGIN_TYPE_PASSWORD_OATH;
+ $app.login_type = TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH;
$app.dom.btn_login_type_password.removeClass('selected');
$(this).addClass('selected');
$app.dom.area_oath.slideDown(100);
@@ -88,9 +88,9 @@ $app.on_init = function (cb_stack) {
$app.dom.input_password.keydown(function (event) {
$('[data-toggle="popover"]').popover('hide');
if (event.which === 13) {
- if ($app.login_type === LOGIN_TYPE_PASSWORD_CAPTCHA)
+ if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA)
$app.dom.input_captcha.focus();
- else if ($app.login_type === LOGIN_TYPE_PASSWORD_OATH)
+ else if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH)
$app.dom.input_oath.focus();
}
});
@@ -141,7 +141,7 @@ $app.login_account = function () {
return;
}
- if ($app.login_type === LOGIN_TYPE_PASSWORD_CAPTCHA) {
+ if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA) {
if (str_captcha.length !== 4) {
$app.show_op_box('error', '验证码错误!');
setTimeout(function () {
@@ -149,7 +149,7 @@ $app.login_account = function () {
}, 150);
return;
}
- } else if ($app.login_type === LOGIN_TYPE_PASSWORD_OATH) {
+ } else if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH) {
if (str_oath.length !== 6 || ('' + parseInt(str_oath)) !== str_oath) {
$app.show_op_box('error', '身份验证器动态验证码错误!');
setTimeout(function () {
@@ -163,7 +163,7 @@ $app.login_account = function () {
$app.show_op_box('wait', ' 正在进行身份认证,请稍候...');
// 先判断一下captcha是否正确,如果不正确,拒绝登录
- if ($app.login_type === LOGIN_TYPE_PASSWORD_CAPTCHA) {
+ if ($app.login_type === TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA) {
$tp.ajax_post_json('/auth/verify-captcha', {captcha: str_captcha},
function (ret) {
if (ret.code === TPE_OK) {
diff --git a/server/www/teleport/static/js/system/config.js b/server/www/teleport/static/js/system/config.js
index 01ac1b8..8715218 100644
--- a/server/www/teleport/static/js/system/config.js
+++ b/server/www/teleport/static/js/system/config.js
@@ -2,23 +2,6 @@
$app.on_init = function () {
$app.dom = {
- // btn_reset_oath_code: $('#btn-reset-oath-code'),
- // btn_verify_oath_code: $('#btn-verify-oath-code'),
- // btn_verify_oath_code_and_save: $('#btn-verify-oath-and-save'),
- // btn_modify_password: $('#btn-modify-password'),
- // btn_toggle_oath_download: $('#toggle-oath-download'),
- //
- // oath_app_download_box: $('#oath-app-download-box'),
- //
- // input_current_password: $('#current-password'),
- // input_new_password: $('#new-password-1'),
- // input_new_password_confirm: $('#new-password-2'),
- // input_oath_code: $('#oath-code'),
- // input_oath_code_verify: $('#oath-code-verify'),
- //
- // dlg_reset_oath_code: $('#dialog-reset-oath-code'),
- // oath_secret_image: $('#oath-secret-qrcode'),
- // tmp_oath_secret: $('#tmp-oath-secret'),
// 邮件系统设置
mail: {
@@ -183,7 +166,7 @@ $app._on_btn_save_mail_config = function () {
return;
$app.dom.mail.btn_save_mail_config.attr('disabled', 'disabled');
- $tp.ajax_post_json('/system/save-mail-config',
+ $tp.ajax_post_json('/system/save-smtp-config',
{
smtp_server: _server,
smtp_port: _port,
diff --git a/server/www/teleport/static/js/system/role.js b/server/www/teleport/static/js/system/role.js
index 6d6f2be..85c475e 100644
--- a/server/www/teleport/static/js/system/role.js
+++ b/server/www/teleport/static/js/system/role.js
@@ -79,15 +79,15 @@ $app.create_controls = function () {
},
{
t: '审计', i: [
- {n: '审计(查看历史会话)', p: TP_PRIVILEGE_AUDIT_OPS_HISTORY},
+ {n: '审计(回放操作录像)', p: TP_PRIVILEGE_AUDIT_OPS_HISTORY},
{n: '审计授权管理', p: TP_PRIVILEGE_AUDIT_AUZ}]
},
{
t: '系统', i: [
{n: '角色管理', p: TP_PRIVILEGE_SYS_ROLE},
{n: '系统配置与维护', p: TP_PRIVILEGE_SYS_CONFIG},
- {n: '历史会话管理', p: TP_PRIVILEGE_SYS_OPS_HISTORY},
- {n: '系统日志管理', p: TP_PRIVILEGE_SYS_LOG}]
+ // {n: '历史会话管理', p: TP_PRIVILEGE_SYS_OPS_HISTORY},
+ {n: '查看系统日志', p: TP_PRIVILEGE_SYS_LOG}]
}
];
nodes = [];
@@ -160,7 +160,7 @@ $app.show_role = function (role_id, edit_mode) {
}
if (role_id === 0) {
- role = {id: 0, name: '', privilege: 0};
+ role = {id: 0, name: '', privilege: TP_PRIVILEGE_LOGIN_WEB};
edit = true;
} else {
for (var i = 0; i < $app.role_list.length; ++i) {
diff --git a/server/www/teleport/static/js/tp-const.js b/server/www/teleport/static/js/tp-const.js
index fcec8d7..1ea1f0e 100644
--- a/server/www/teleport/static/js/tp-const.js
+++ b/server/www/teleport/static/js/tp-const.js
@@ -1,5 +1,12 @@
"use strict";
+
+var TP_LOGIN_AUTH_SYS_DEFAULT = 0; // 系统默认
+var TP_LOGIN_AUTH_USERNAME_PASSWORD = 0x0001; // 用户名+密码
+var TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA = 0x0002; // 用户名+密码+验证码
+var TP_LOGIN_AUTH_USERNAME_OATH = 0x0004; // 用户名+OATH
+var TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH = 0x0008; // 用户名+密码+OATH
+
//=======================================================
// 远程连接认证方式
//=======================================================
@@ -135,8 +142,8 @@ var TP_PRIVILEGE_AUDIT_AUZ = 0x00010000;// # 审计策略授权管理
var TP_PRIVILEGE_SYS_ROLE = 0x00040000;// # 角色管理
var TP_PRIVILEGE_SYS_CONFIG = 0x00080000;// # 系统配置维护
-var TP_PRIVILEGE_SYS_OPS_HISTORY = 0x00100000;// # 历史会话管理(例如删除历史会话、设定多长时间之前的历史会话自动删除等)
-var TP_PRIVILEGE_SYS_LOG = 0x00200000;// # 系统日志管理(例如日志备份、删除等)
+//var TP_PRIVILEGE_SYS_OPS_HISTORY = 0x00100000;// # 历史会话管理(例如删除历史会话、设定多长时间之前的历史会话自动删除等)
+var TP_PRIVILEGE_SYS_LOG = 0x00200000;// # 查看系统日志
var TP_PRIVILEGES = [
TP_PRIVILEGE_LOGIN_WEB,
@@ -159,7 +166,7 @@ var TP_PRIVILEGES = [
//TP_PRIVILEGE_AUDIT_SYSLOG,
TP_PRIVILEGE_SYS_ROLE,
TP_PRIVILEGE_SYS_CONFIG,
- TP_PRIVILEGE_SYS_OPS_HISTORY,
+ //TP_PRIVILEGE_SYS_OPS_HISTORY,
TP_PRIVILEGE_SYS_LOG
];
@@ -222,11 +229,6 @@ var TPE_START_CLIENT = 100002; // 无法启动客户端程序(无法创建进
var TPE_NO_CORE_SERVER = 200000; // 未能检测到核心服务
-// 使用用户名密码登录(额外需要验证码)
-var LOGIN_TYPE_PASSWORD_CAPTCHA = 1;
-// 使用用户名密码登录(额外需要身份验证器的动态验证码)
-var LOGIN_TYPE_PASSWORD_OATH = 2;
-
// ==========================================================================
// 数据库类型
// ==========================================================================
diff --git a/server/www/teleport/view/ops/auz-list.mako b/server/www/teleport/view/ops/auz-list.mako
index 5f5536f..6129e05 100644
--- a/server/www/teleport/view/ops/auz-list.mako
+++ b/server/www/teleport/view/ops/auz-list.mako
@@ -78,7 +78,8 @@
@@ -88,7 +89,6 @@
说明:
-## - 可以通过表格标题栏进行搜索或过滤,以便快速定位你需要的信息。标题栏左侧的 可以重置过滤器。
- 上下拖动“顺序”栏中的 可以调节策略的检查顺序。
- 可以在“快速查找”中快速定位用户或主机的授权关系。
diff --git a/server/www/teleport/view/system/config.mako b/server/www/teleport/view/system/config.mako
index 67ec938..19c9661 100644
--- a/server/www/teleport/view/system/config.mako
+++ b/server/www/teleport/view/system/config.mako
@@ -17,15 +17,15 @@
-
+
密码策略 |
@@ -130,7 +130,7 @@
-
+
当前会话录像存储空间:总 123.35GB,可用空间 85.17GB。
@@ -163,6 +163,8 @@
+
备份功能尚未实现
+
数据库备份 |
diff --git a/server/www/teleport/view/system/role.mako b/server/www/teleport/view/system/role.mako
index 4cff0a1..788ce92 100644
--- a/server/www/teleport/view/system/role.mako
+++ b/server/www/teleport/view/system/role.mako
@@ -63,28 +63,28 @@
权限说明:
- - 主机信息创建/编辑 允许创建和编辑主机资产信息,如IP地址、端口与协议、名称、备注等。
- - 删除主机信息 允许删除主机资产。
+ - 主机创建/编辑 允许创建和编辑主机资产信息,如IP地址、端口与协议、名称、备注等。
+ - 删除主机 允许删除主机资产。
- 主机禁用/解禁 允许设置禁止访问某主机,或者解禁。
- 主机分组管理 将主机进行分组,便于快速查找或者授权管理。
- - 主机账号管理 管理能够远程登录主机的账号,包括账号名称和密码、SSH密钥等。
- - 主机账号分组管理 管理大量主机时,可能会为这些主机设置相同的主机账号和密码,使用主机账号分组可便于批量授权
+ - 账号管理 管理能够远程登录主机的账号,包括账号名称和密码、SSH密钥等。
+ - 账号分组管理 将远程账号进行分组管理,便于批量授权。
- 登录WEB系统 允许用户登录本WEB系统,除特殊情况外,用户应该具有本权限。
- 用户创建/编辑 允许创建或编辑登录teleport系统的用户账号。
- - 删除用户 允许删除登录teleport系统的用户账号。
+ - 删除用户 允许删除登录teleport系统的用户。
- 用户禁用/解禁 允许设置禁止用户访问teleport系统,或者解禁。当用户因连续认证失败而被临时锁定时,也可由此权限进行解锁。
- 用户分组管理 将用户进行分组,便于快速查找或者授权管理。
- 远程主机运维 允许用户访问远程主机。
- 运维授权管理 授权用户/用户组使用特定的远程主机账号访问指定远程主机。具有本权限的用户自动具有远程主机运维的权限。
- 查看在线会话 允许查看在线运维会话,并进行实时同步显示。【此功能尚未实现】
- 阻断在线会话 强行终止在线运维会话。【此功能尚未实现】
- - 审计(查看历史会话) 允许重放历史会话。
+ - 审计(回放操作录像) 允许重放会话的操作录像。注意:运维人员总是可以回放自己的操作录像。
- 审计授权管理 授权用户/用户组重放指定远程主机的历史会话。具有本权限的用户自动具有审计权限。
- 角色管理 允许创建、编辑、删除角色。
- - 系统配置与维护
- - 历史会话管理
- - 系统日志管理
+ - 系统配置与维护 允许对teleport系统进行配置和维护操作。
+## - 历史会话管理 允许查看用户在teleport系统上的操作记录。
+ - 查看系统日志 允许查看用户在teleport系统上的操作记录。
-##
特别注意:teleport系统使用最小权限判定规则,也即,在检查权限时,会按用户所具有的最小权限进行判断。例如:如用户无远程主机运维权限,那么即使其所在用户组被授权访问某远程主机,此用户也无法连接到该远程主机。
+
特别注意:teleport系统使用最小权限判定规则,也即,在检查权限时,会按用户所具有的最小权限进行判断。例如:如用户无远程主机运维权限,那么即使其所在用户组被授权访问某远程主机,此用户也无法连接到该远程主机。
diff --git a/server/www/teleport/webroot/app/base/configs.py b/server/www/teleport/webroot/app/base/configs.py
index a876a0b..e0b343d 100644
--- a/server/www/teleport/webroot/app/base/configs.py
+++ b/server/www/teleport/webroot/app/base/configs.py
@@ -3,6 +3,7 @@
import configparser
import os
+from app.const import *
from .logger import log
from .utils import AttrDict, tp_make_dir
@@ -457,6 +458,40 @@ class AppConfig(BaseAppConfig):
return True
try:
+ # =====================================
+ # 密码策略相关
+ # =====================================
+ self.sys.password = AttrDict()
+ self.sys.password.find = True
+ self.sys.password.strong = True
+ self.sys.password.timeout = 30 # 30 days
+ if 'password_find' in conf_data:
+ self.sys.password.find = conf_data['password_find']
+ if 'password_strong' in conf_data:
+ self.sys.password.strong = conf_data['password_strong']
+ if 'password_timeout' in conf_data:
+ self.sys.password.timeout = int(conf_data['password_timeout'])
+
+ # =====================================
+ # 登录相关
+ # =====================================
+ self.sys.login = AttrDict()
+ self.sys.login.session_timeout = 30
+ self.sys.login.retry = 0
+ self.sys.login.lock_timeout = 30 # 30 min
+ self.sys.login.auth = TP_LOGIN_AUTH_USERNAME_PASSWORD | TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA | TP_LOGIN_AUTH_USERNAME_OATH
+ if 'login_session_timeout' in conf_data:
+ self.sys.login.session_timeout = int(conf_data['login_session_timeout'])
+ if 'login_retry' in conf_data:
+ self.sys.login.retry = int(conf_data['login_retry'])
+ if 'login_lock_timeout' in conf_data:
+ self.sys.login.lock_timeout = int(conf_data['login_lock_timeout'])
+ if 'login_auth' in conf_data:
+ self.sys.login.auth = int(conf_data['login_auth'])
+
+ # =====================================
+ # SMTP相关
+ # =====================================
self.sys.smtp = AttrDict()
self.sys.smtp.server = ""
self.sys.smtp.port = 25
@@ -473,6 +508,17 @@ class AppConfig(BaseAppConfig):
if 'smtp_password' in conf_data:
self.sys_smtp_password = conf_data['smtp_password']
+ # =====================================
+ # 存储相关
+ # =====================================
+ self.sys.storage = AttrDict()
+ self.sys.storage.log = 0
+ self.sys.storage.record = 0
+ if 'storage_log' in conf_data:
+ self.sys.storage.log = int(conf_data['storage_log'])
+ if 'storage_record' in conf_data:
+ self.sys.storage.record = int(conf_data['storage_record'])
+
self.sys.loaded = True
except IndexError:
diff --git a/server/www/teleport/webroot/app/base/database/create.py b/server/www/teleport/webroot/app/base/database/create.py
index 292265b..af44f4c 100644
--- a/server/www/teleport/webroot/app/base/database/create.py
+++ b/server/www/teleport/webroot/app/base/database/create.py
@@ -741,8 +741,9 @@ class DatabaseInit:
self._db_exec(
'创建系统管理员账号',
'INSERT INTO `{}user` (`type`, `auth_type`, `username`, `surname`, `password`, `role_id`, `state`, `email`, `creator_id`, `create_time`, `last_login`, `last_chpass`) VALUES '
- '(1, 1, "{username}", "{surname}", "{password}", 1, {state}, "{email}", 0, {create_time}, {last_login}, {last_chpass});'
+ '(1, {auth_type}, "{username}", "{surname}", "{password}", 1, {state}, "{email}", 0, {create_time}, {last_login}, {last_chpass});'
''.format(self.db.table_prefix,
+ auth_type=TP_LOGIN_AUTH_SYS_DEFAULT,
username=sysadmin, surname=sysadmin, password=tp_password_generate_secret(password), state=TP_STATE_NORMAL, email=email,
create_time=_time_now, last_login=_time_now, last_chpass=_time_now)
)
diff --git a/server/www/teleport/webroot/app/const.py b/server/www/teleport/webroot/app/const.py
index e81d8d1..2ed30d9 100644
--- a/server/www/teleport/webroot/app/const.py
+++ b/server/www/teleport/webroot/app/const.py
@@ -1,7 +1,10 @@
# -*- coding: utf-8 -*-
-LOGIN_TYPE_PASSWORD_CAPTCHA = 1
-LOGIN_TYPE_PASSWORD_OATH = 2
+TP_LOGIN_AUTH_SYS_DEFAULT = 0 # 系统默认(根据系统配置进行)
+TP_LOGIN_AUTH_USERNAME_PASSWORD = 0x0001 # 用户名+密码
+TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA = 0x0002 # 用户名+密码+验证码
+TP_LOGIN_AUTH_USERNAME_OATH = 0x0004 # 用户名+OATH
+TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH = 0x0008 # 用户名+密码+OATH
APP_MODE_NORMAL = 1
APP_MODE_MAINTENANCE = 2
@@ -156,8 +159,8 @@ TP_PRIVILEGE_AUDIT_AUZ = 0x00010000 # 审计策略授权管理
TP_PRIVILEGE_SYS_ROLE = 0x00040000 # 角色管理
TP_PRIVILEGE_SYS_CONFIG = 0x00080000 # 系统配置维护
-TP_PRIVILEGE_SYS_OPS_HISTORY = 0x00100000 # 历史会话管理(例如删除历史会话、设定多长时间之前的历史会话自动删除等)
-TP_PRIVILEGE_SYS_LOG = 0x00200000 # 系统日志管理(例如日志备份、删除等)
+# TP_PRIVILEGE_SYS_OPS_HISTORY = 0x00100000 # 历史会话管理(例如删除历史会话、设定多长时间之前的历史会话自动删除等)
+TP_PRIVILEGE_SYS_LOG = 0x00200000 # 查看系统日志
# ===================================================================
# error code
diff --git a/server/www/teleport/webroot/app/controller/__init__.py b/server/www/teleport/webroot/app/controller/__init__.py
index b1b6945..bebad2e 100644
--- a/server/www/teleport/webroot/app/controller/__init__.py
+++ b/server/www/teleport/webroot/app/controller/__init__.py
@@ -220,7 +220,7 @@ controllers = [
# - [json] 系统配置-发送测试邮件
(r'/system/send-test-mail', system.DoSendTestMailHandler),
# - [json] 系统配置-保存邮件系统配置
- (r'/system/save-mail-config', system.DoSaveMailConfigHandler),
+ (r'/system/save-smtp-config', system.DoSaveSmtpConfigHandler),
# - [json] 获取服务器时间
(r'/system/get-time', system.DoGetTimeHandler),
diff --git a/server/www/teleport/webroot/app/controller/auth.py b/server/www/teleport/webroot/app/controller/auth.py
index 0e6d1d9..f095da7 100644
--- a/server/www/teleport/webroot/app/controller/auth.py
+++ b/server/www/teleport/webroot/app/controller/auth.py
@@ -74,7 +74,7 @@ class DoLoginHandler(TPBaseJsonHandler):
_tmp = {'username': username, 'surname': username}
- if login_type == LOGIN_TYPE_PASSWORD_CAPTCHA:
+ if login_type == TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA:
oath = None
code = self.get_session('captcha')
if code is None:
@@ -82,7 +82,7 @@ class DoLoginHandler(TPBaseJsonHandler):
self.del_session('captcha')
if code.lower() != captcha.lower():
return self.write_json(TPE_CAPTCHA_MISMATCH, '验证码错误')
- elif login_type == LOGIN_TYPE_PASSWORD_OATH:
+ elif login_type == TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH:
if len(oath) == 0:
return self.write_json(TPE_OATH_MISMATCH, '未提供身份验证器动态验证码')
else:
@@ -108,11 +108,11 @@ class DoLoginHandler(TPBaseJsonHandler):
syslog.sys_log(_tmp, self.request.remote_ip, TPE_FAILED, '登录失败,系统内部错误')
return self.write_json(TPE_FAILED)
- if login_type == LOGIN_TYPE_PASSWORD_CAPTCHA:
+ if login_type == TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA:
if not tp_password_verify(password, user_info['password']):
syslog.sys_log(_tmp, self.request.remote_ip, TPE_USER_AUTH, '登录失败,密码错误!')
return self.write_json(TPE_USER_AUTH)
- elif login_type == LOGIN_TYPE_PASSWORD_OATH:
+ elif login_type == TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH:
if not tp_oath_verify_code(user_info['oath_secret'], oath):
syslog.sys_log(_tmp, self.request.remote_ip, TPE_OATH_MISMATCH, "登录失败,身份验证器动态验证码错误!")
return self.write_json(TPE_OATH_MISMATCH)
diff --git a/server/www/teleport/webroot/app/controller/system.py b/server/www/teleport/webroot/app/controller/system.py
index 3143fc5..e27a865 100644
--- a/server/www/teleport/webroot/app/controller/system.py
+++ b/server/www/teleport/webroot/app/controller/system.py
@@ -14,7 +14,6 @@ from app.const import *
from app.model import syslog
-# time_now = int(time.time())
class DoGetTimeHandler(TPBaseJsonHandler):
def post(self):
time_now = int(datetime.datetime.utcnow().timestamp())
@@ -223,7 +222,7 @@ class DoSendTestMailHandler(TPBaseJsonHandler):
self.write_json(code, message=msg)
-class DoSaveMailConfigHandler(TPBaseJsonHandler):
+class DoSaveSmtpConfigHandler(TPBaseJsonHandler):
def post(self):
ret = self.check_privilege(TP_PRIVILEGE_SYS_CONFIG)
if ret != TPE_OK:
diff --git a/server/www/teleport/webroot/app/model/system.py b/server/www/teleport/webroot/app/model/system.py
index 87f9fd7..8443a98 100644
--- a/server/www/teleport/webroot/app/model/system.py
+++ b/server/www/teleport/webroot/app/model/system.py
@@ -101,7 +101,7 @@ def remove_role(handler, role_id):
if not db.transaction(sql_list):
return TPE_DATABASE
- syslog.sys_log(handler.get_current_user(), handler.request.remote_ip, TPE_OK, "删除角色:{}".format(','.join(role_name)))
+ syslog.sys_log(handler.get_current_user(), handler.request.remote_ip, TPE_OK, "删除角色:{}".format(role_name))
return TPE_OK