From 324cf2469f1e7f15a58477ba42954c7fe1a79a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E5=B9=BF?= Date: Mon, 18 Mar 2019 11:34:13 +0800 Subject: [PATCH] Bugfix (#2506) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Update] 增加清理celery日志 * [Update] 修复两周前会话命令数量系那是问题 * [Update] 修复两周前会话命令数量系那是问题 * [Update] 修改结构 * [Update] 添加datatable失败的日志 * [Update] 转换配置文件格式 * [Update] 添加traceback --- apps/assets/forms/user.py | 6 +- .../migrations/0026_auto_20190308_1045.py | 17 ++ apps/assets/tasks.py | 2 +- apps/jumpserver/conf.py | 21 ++- apps/locale/zh/LC_MESSAGES/django.mo | Bin 65375 -> 65022 bytes apps/locale/zh/LC_MESSAGES/django.po | 147 +++++++++-------- apps/ops/models/adhoc.py | 1 + apps/ops/tasks.py | 2 + apps/perms/models.py | 1 - apps/settings/signals_handler.py | 2 +- apps/static/js/jumpserver.js | 11 ++ apps/static/js/webterminal.js | 154 ------------------ apps/static/js/wssh.js | 89 ---------- apps/terminal/api/__init__.py | 3 + apps/terminal/api/{v1 => }/session.py | 10 +- apps/terminal/api/{v1 => }/task.py | 4 +- apps/terminal/api/{v1 => }/terminal.py | 4 +- apps/terminal/{api/v2 => api_v2}/__init__.py | 0 apps/terminal/{api/v2 => api_v2}/terminal.py | 4 +- apps/terminal/backends/command/db.py | 12 +- apps/terminal/serializers/__init__.py | 1 + .../{api/v1 => serializers_v2}/__init__.py | 3 +- .../v2.py => serializers_v2/terminal.py} | 2 +- apps/terminal/urls/api_urls.py | 2 +- apps/terminal/urls/api_urls_v2.py | 2 +- apps/users/{api/v2 => api_v2}/__init__.py | 0 apps/users/{api/v2 => api_v2}/user.py | 2 +- apps/users/serializers_v2/__init__.py | 3 + .../v2.py => serializers_v2/user.py} | 2 + apps/users/urls/api_urls_v2.py | 2 +- 30 files changed, 171 insertions(+), 338 deletions(-) create mode 100644 apps/assets/migrations/0026_auto_20190308_1045.py delete mode 100644 apps/static/js/webterminal.js delete mode 100644 apps/static/js/wssh.js rename apps/terminal/api/{v1 => }/session.py (96%) rename apps/terminal/api/{v1 => }/task.py (93%) rename apps/terminal/api/{v1 => }/terminal.py (98%) rename apps/terminal/{api/v2 => api_v2}/__init__.py (100%) rename apps/terminal/{api/v2 => api_v2}/terminal.py (93%) rename apps/terminal/{api/v1 => serializers_v2}/__init__.py (53%) rename apps/terminal/{serializers/v2.py => serializers_v2/terminal.py} (96%) rename apps/users/{api/v2 => api_v2}/__init__.py (100%) rename apps/users/{api/v2 => api_v2}/user.py (87%) create mode 100644 apps/users/serializers_v2/__init__.py rename apps/users/{serializers/v2.py => serializers_v2/user.py} (97%) diff --git a/apps/assets/forms/user.py b/apps/assets/forms/user.py index b51ec85c2..e832ab158 100644 --- a/apps/assets/forms/user.py +++ b/apps/assets/forms/user.py @@ -35,8 +35,12 @@ class PasswordAndKeyAuthForm(forms.ModelForm): if private_key_file: key_string = private_key_file.read() private_key_file.seek(0) + key_string = key_string.decode() + if not validate_ssh_private_key(key_string, password): - raise forms.ValidationError(_('Invalid private key')) + msg = _('Invalid private key, Only support ' + 'RSA/DSA format key') + raise forms.ValidationError(msg) return private_key_file def validate_password_key(self): diff --git a/apps/assets/migrations/0026_auto_20190308_1045.py b/apps/assets/migrations/0026_auto_20190308_1045.py new file mode 100644 index 000000000..13e8f428a --- /dev/null +++ b/apps/assets/migrations/0026_auto_20190308_1045.py @@ -0,0 +1,17 @@ +# Generated by Django 2.1.7 on 2019-03-08 02:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0025_auto_20190221_1902'), + ] + + operations = [ + migrations.AlterModelOptions( + name='node', + options={'ordering': ['key'], 'verbose_name': 'Node'}, + ), + ] diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index d6dc58a8e..172175f38 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -45,7 +45,7 @@ def clean_hosts(assets): continue clean_assets.append(asset) if not clean_assets: - logger.info(_("No assets matched, stop task")) + print(_("No assets matched, stop task")) return clean_assets diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 4ef326a36..ea9e9915e 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -268,25 +268,36 @@ class Config(dict): rv[key] = v return rv + def convert_type(self, k, v): + default_value = self.defaults.get(k) + if default_value is None: + return v + tp = type(default_value) + try: + v = tp(v) + except Exception: + pass + return v + def __repr__(self): return '<%s %s>' % (self.__class__.__name__, dict.__repr__(self)) def __getitem__(self, item): + # 先从设置的来 try: value = super().__getitem__(item) except KeyError: value = None if value is not None: - return value + return self.convert_type(item, value) + # 其次从环境变量来 value = os.environ.get(item, None) if value is not None: - if value.isdigit(): - value = int(value) - elif value.lower() == 'false': + if value.lower() == 'false': value = False elif value.lower() == 'true': value = True - return value + return self.convert_type(item, value) return self.defaults.get(item) def __getattr__(self, item): diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index cb390f14de1f7bf97b68df6fa2a169cbdc07a22c..e647e918d5daa9ccf8014f675ba0c73f844a4618 100644 GIT binary patch delta 19418 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 delta 19649 zcmZA72bfJ)`}gt9U@(I*+UUKEFlzJ~M2{Z5chN_0M~^6p8X+Qx5~7bTI?+W{{yLsF8aLy)c%E0HuIKH?r1d;6V|>p$S)V-Z_Zqr+cQx|7 zP~tx@2|mO$p6B!arjm$6vc?oljX{_L(_#c>#cIgDyv|qzdtfm_|)@KvA*{!6>Z=)>ICj%Y7A^j!AzJObD;(n!(gmv*1=T7%~A98 zG6$e;XgH?8FEAa>Lyg~n0j%%srlKR+kJ`Wq)KT5T#P|j?V!~!_1KCmef|vtKpvE;v zozNiE#)o4FjzithY)ptNF)6M?pDH`3q{Kt0o&Js;Fa~u8wVHcg9&Co;=)*p^5+gBv z3(w;*d()7o>D@4kw{-bQSd#o@)CN+uawnC(73a@;=Vc?IhFn+`^P`?=AJoPcqKRtF5b>vr28+?qq^LMCu0$RHxPJ()LX)!J4M$J>s@-

{(2ToNob-@)}cSf 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 QF5M8jX<5{Or;~&JAO5g65C8xG diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 542b7d674..e8c5704f4 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Jumpserver 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-14 16:26+0800\n" +"POT-Creation-Date: 2019-03-18 10:49+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -32,7 +32,7 @@ msgstr "测试节点下资产是否可连接: {}" #: assets/forms/asset.py:27 assets/models/asset.py:80 assets/models/user.py:133 #: assets/templates/assets/asset_detail.html:194 #: assets/templates/assets/asset_detail.html:202 -#: assets/templates/assets/system_user_asset.html:95 perms/models.py:32 +#: assets/templates/assets/system_user_asset.html:95 perms/models.py:31 msgid "Nodes" msgstr "节点管理" @@ -69,7 +69,7 @@ msgstr "网域" #: assets/forms/asset.py:124 assets/models/node.py:31 #: assets/templates/assets/asset_create.html:30 #: assets/templates/assets/asset_update.html:35 perms/forms.py:45 -#: perms/forms.py:52 perms/models.py:85 +#: perms/forms.py:52 perms/models.py:84 #: perms/templates/perms/asset_permission_list.html:57 #: perms/templates/perms/asset_permission_list.html:78 #: perms/templates/perms/asset_permission_list.html:128 @@ -121,7 +121,7 @@ msgstr "端口" #: assets/templates/assets/system_user_list.html:33 audits/models.py:18 #: audits/templates/audits/ftp_log_list.html:41 #: audits/templates/audits/ftp_log_list.html:71 perms/forms.py:42 -#: perms/models.py:31 +#: perms/models.py:30 #: perms/templates/perms/asset_permission_create_update.html:45 #: perms/templates/perms/asset_permission_list.html:56 #: perms/templates/perms/asset_permission_list.html:125 @@ -130,7 +130,6 @@ msgstr "端口" #: terminal/templates/terminal/command_list.html:73 #: terminal/templates/terminal/session_list.html:41 #: terminal/templates/terminal/session_list.html:72 -#: xpack/plugins/change_asset_password_plan/models.py:17 #: xpack/plugins/cloud/models.py:187 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:65 #: xpack/plugins/orgs/templates/orgs/org_list.html:16 @@ -141,8 +140,8 @@ msgstr "资产" msgid "Password should not contain special characters" msgstr "不能包含特殊字符" -#: assets/forms/domain.py:70 assets/forms/user.py:80 assets/forms/user.py:142 -#: assets/models/base.py:22 assets/models/cluster.py:18 +#: assets/forms/domain.py:70 assets/forms/user.py:84 assets/forms/user.py:146 +#: assets/models/base.py:26 assets/models/cluster.py:18 #: assets/models/cmd_filter.py:20 assets/models/domain.py:20 #: assets/models/group.py:20 assets/models/label.py:18 #: assets/templates/assets/admin_user_detail.html:56 @@ -156,7 +155,7 @@ msgstr "不能包含特殊字符" #: assets/templates/assets/system_user_detail.html:58 #: assets/templates/assets/system_user_list.html:29 ops/models/adhoc.py:37 #: ops/templates/ops/task_detail.html:60 ops/templates/ops/task_list.html:27 -#: orgs/models.py:12 perms/models.py:28 +#: orgs/models.py:12 perms/models.py:27 #: perms/templates/perms/asset_permission_detail.html:62 #: perms/templates/perms/asset_permission_list.html:53 #: perms/templates/perms/asset_permission_list.html:72 @@ -174,7 +173,6 @@ msgstr "不能包含特殊字符" #: users/templates/users/user_list.html:23 #: users/templates/users/user_profile.html:51 #: users/templates/users/user_pubkey_update.html:53 -#: xpack/plugins/change_asset_password_plan/models.py:15 #: xpack/plugins/cloud/models.py:49 xpack/plugins/cloud/models.py:119 #: xpack/plugins/cloud/templates/cloud/account_detail.html:52 #: xpack/plugins/cloud/templates/cloud/account_list.html:12 @@ -185,8 +183,8 @@ msgstr "不能包含特殊字符" msgid "Name" msgstr "名称" -#: assets/forms/domain.py:71 assets/forms/user.py:81 assets/forms/user.py:143 -#: assets/models/base.py:23 +#: assets/forms/domain.py:71 assets/forms/user.py:85 assets/forms/user.py:147 +#: assets/models/base.py:27 #: assets/templates/assets/_asset_user_auth_modal.html:15 #: assets/templates/assets/admin_user_detail.html:60 #: assets/templates/assets/admin_user_list.html:27 @@ -202,7 +200,6 @@ msgstr "名称" #: users/templates/users/user_detail.html:67 #: users/templates/users/user_list.html:24 #: users/templates/users/user_profile.html:47 -#: xpack/plugins/change_asset_password_plan/models.py:16 msgid "Username" msgstr "用户名" @@ -210,7 +207,7 @@ msgstr "用户名" msgid "Password or private key passphrase" msgstr "密码或密钥密码" -#: assets/forms/user.py:26 assets/models/base.py:24 +#: assets/forms/user.py:26 assets/models/base.py:28 #: assets/serializers/asset_user.py:19 #: assets/templates/assets/_asset_user_auth_modal.html:21 #: authentication/forms.py:13 settings/forms.py:103 users/forms.py:15 @@ -223,39 +220,37 @@ msgstr "密码或密钥密码" #: users/templates/users/user_profile_update.html:40 #: users/templates/users/user_pubkey_update.html:40 #: users/templates/users/user_update.html:20 -#: xpack/plugins/change_asset_password_plan/models.py:19 msgid "Password" msgstr "密码" #: assets/forms/user.py:29 assets/serializers/asset_user.py:27 #: users/models/user.py:81 -#: xpack/plugins/change_asset_password_plan/models.py:20 msgid "Private key" msgstr "ssh私钥" -#: assets/forms/user.py:39 -msgid "Invalid private key" -msgstr "ssh密钥不合法" +#: assets/forms/user.py:41 +msgid "Invalid private key, Only support RSA/DSA format key" +msgstr "不合法的密钥,仅支持RSA/DSA格式的密钥" -#: assets/forms/user.py:48 +#: assets/forms/user.py:52 msgid "Password and private key file must be input one" msgstr "密码和私钥, 必须输入一个" -#: assets/forms/user.py:130 +#: assets/forms/user.py:134 msgid "* Automatic login mode must fill in the username." msgstr "自动登录模式,必须填写用户名" -#: assets/forms/user.py:145 assets/models/cmd_filter.py:31 +#: assets/forms/user.py:149 assets/models/cmd_filter.py:31 #: assets/models/user.py:141 assets/templates/assets/_system_user.html:66 #: assets/templates/assets/system_user_detail.html:165 msgid "Command filter" msgstr "命令过滤器" -#: assets/forms/user.py:149 +#: assets/forms/user.py:153 msgid "Auto push system user to asset" msgstr "自动推送系统用户到资产" -#: assets/forms/user.py:150 +#: assets/forms/user.py:154 msgid "" "1-100, High level will be using login asset as default, if user was granted " "more than 2 system user" @@ -263,13 +258,13 @@ msgstr "" "1-100, 1最低优先级,100最高优先级。授权多个用户时,高优先级的系统用户将会作为" "默认登录用户" -#: assets/forms/user.py:152 +#: assets/forms/user.py:156 msgid "" "If you choose manual login mode, you do not need to fill in the username and " "password." msgstr "如果选择手动登录模式,用户名和密码可以不填写" -#: assets/forms/user.py:154 +#: assets/forms/user.py:158 msgid "Use comma split multi command, ex: /bin/whoami,/bin/ifconfig" msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig" @@ -398,7 +393,7 @@ msgstr "主机名原始" msgid "Labels" msgstr "标签管理" -#: assets/models/asset.py:109 assets/models/base.py:30 +#: assets/models/asset.py:109 assets/models/base.py:34 #: assets/models/cluster.py:28 assets/models/cmd_filter.py:25 #: assets/models/cmd_filter.py:58 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 @@ -406,8 +401,8 @@ msgstr "标签管理" #: assets/templates/assets/cmd_filter_detail.html:77 #: assets/templates/assets/domain_detail.html:72 #: assets/templates/assets/system_user_detail.html:100 -#: ops/templates/ops/adhoc_detail.html:86 orgs/models.py:15 perms/models.py:37 -#: perms/models.py:90 perms/templates/perms/asset_permission_detail.html:98 +#: ops/templates/ops/adhoc_detail.html:86 orgs/models.py:15 perms/models.py:36 +#: perms/models.py:89 perms/templates/perms/asset_permission_detail.html:98 #: users/models/user.py:95 users/templates/users/user_detail.html:111 #: xpack/plugins/cloud/models.py:55 xpack/plugins/cloud/models.py:127 msgid "Created by" @@ -420,7 +415,7 @@ msgstr "创建者" #: assets/templates/assets/domain_detail.html:68 #: assets/templates/assets/system_user_detail.html:96 #: ops/templates/ops/adhoc_detail.html:90 ops/templates/ops/task_detail.html:64 -#: orgs/models.py:16 perms/models.py:38 perms/models.py:91 +#: orgs/models.py:16 perms/models.py:37 perms/models.py:90 #: perms/templates/perms/asset_permission_detail.html:94 #: terminal/templates/terminal/terminal_detail.html:59 users/models/group.py:17 #: users/templates/users/user_group_detail.html:63 @@ -431,7 +426,7 @@ msgstr "创建者" msgid "Date created" msgstr "创建日期" -#: assets/models/asset.py:111 assets/models/base.py:27 +#: assets/models/asset.py:111 assets/models/base.py:31 #: assets/models/cluster.py:29 assets/models/cmd_filter.py:22 #: assets/models/cmd_filter.py:55 assets/models/domain.py:21 #: assets/models/domain.py:53 assets/models/group.py:23 @@ -447,16 +442,15 @@ msgstr "创建日期" #: assets/templates/assets/system_user_detail.html:104 #: assets/templates/assets/system_user_list.html:37 #: assets/templates/assets/user_asset_list.html:165 ops/models/adhoc.py:43 -#: orgs/models.py:17 perms/models.py:39 perms/models.py:92 +#: orgs/models.py:17 perms/models.py:38 perms/models.py:91 #: perms/templates/perms/asset_permission_detail.html:102 settings/models.py:34 #: terminal/models.py:32 terminal/templates/terminal/terminal_detail.html:63 #: users/models/group.py:15 users/models/user.py:87 #: users/templates/users/user_detail.html:127 #: users/templates/users/user_group_detail.html:67 #: users/templates/users/user_group_list.html:14 -#: users/templates/users/user_profile.html:134 -#: xpack/plugins/change_asset_password_plan/models.py:26 -#: xpack/plugins/cloud/models.py:54 xpack/plugins/cloud/models.py:125 +#: users/templates/users/user_profile.html:134 xpack/plugins/cloud/models.py:54 +#: xpack/plugins/cloud/models.py:125 #: xpack/plugins/cloud/templates/cloud/account_detail.html:72 #: xpack/plugins/cloud/templates/cloud/account_list.html:15 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:71 @@ -466,13 +460,13 @@ msgstr "创建日期" msgid "Comment" msgstr "备注" -#: assets/models/asset.py:117 assets/models/base.py:34 +#: assets/models/asset.py:117 assets/models/base.py:38 #: assets/templates/assets/admin_user_list.html:30 #: assets/templates/assets/system_user_list.html:35 msgid "Unreachable" msgstr "不可达" -#: assets/models/asset.py:118 assets/models/base.py:35 +#: assets/models/asset.py:118 assets/models/base.py:39 #: assets/templates/assets/admin_user_assets.html:51 #: assets/templates/assets/admin_user_list.html:29 #: assets/templates/assets/asset_asset_user_list.html:50 @@ -483,7 +477,7 @@ msgstr "不可达" msgid "Reachable" msgstr "可连接" -#: assets/models/asset.py:119 assets/models/base.py:36 +#: assets/models/asset.py:119 assets/models/base.py:40 #: authentication/utils.py:9 xpack/plugins/license/models.py:78 msgid "Unknown" msgstr "未知" @@ -504,11 +498,11 @@ msgstr "版本" msgid "AuthBook" msgstr "" -#: assets/models/base.py:25 +#: assets/models/base.py:29 msgid "SSH private key" msgstr "ssh密钥" -#: assets/models/base.py:26 +#: assets/models/base.py:30 msgid "SSH public key" msgstr "ssh公钥" @@ -681,7 +675,7 @@ msgstr "默认资产组" #: audits/templates/audits/password_change_log_list.html:50 #: ops/templates/ops/command_execution_list.html:34 #: ops/templates/ops/command_execution_list.html:59 perms/forms.py:36 -#: perms/models.py:29 +#: perms/models.py:28 #: perms/templates/perms/asset_permission_create_update.html:41 #: perms/templates/perms/asset_permission_list.html:54 #: perms/templates/perms/asset_permission_list.html:119 templates/index.html:87 @@ -769,7 +763,7 @@ msgstr "登录模式" #: assets/models/user.py:247 assets/templates/assets/user_asset_list.html:162 #: audits/models.py:19 audits/templates/audits/ftp_log_list.html:49 #: audits/templates/audits/ftp_log_list.html:72 perms/forms.py:48 -#: perms/models.py:33 perms/models.py:87 +#: perms/models.py:32 perms/models.py:86 #: perms/templates/perms/asset_permission_detail.html:140 #: perms/templates/perms/asset_permission_list.html:58 #: perms/templates/perms/asset_permission_list.html:79 @@ -794,7 +788,6 @@ msgstr "%(value)s is not an even number" #: users/templates/users/user_profile.html:68 #: users/templates/users/user_profile_update.html:43 #: users/templates/users/user_pubkey_update.html:43 -#: xpack/plugins/change_asset_password_plan/models.py:21 msgid "Public key" msgstr "ssh公钥" @@ -1284,8 +1277,8 @@ msgid "Date joined" msgstr "创建日期" #: assets/templates/assets/asset_detail.html:154 -#: assets/templates/assets/user_asset_list.html:46 perms/models.py:34 -#: perms/models.py:88 +#: assets/templates/assets/user_asset_list.html:46 perms/models.py:33 +#: perms/models.py:87 #: perms/templates/perms/asset_permission_create_update.html:52 #: perms/templates/perms/asset_permission_detail.html:120 #: terminal/templates/terminal/terminal_list.html:34 @@ -1882,7 +1875,7 @@ msgstr "登录日期" #: ops/templates/ops/adhoc_history.html:52 #: ops/templates/ops/adhoc_history_detail.html:61 #: ops/templates/ops/command_execution_list.html:65 -#: ops/templates/ops/task_history.html:58 perms/models.py:35 +#: ops/templates/ops/task_history.html:58 perms/models.py:34 #: perms/templates/perms/asset_permission_detail.html:86 terminal/models.py:165 #: terminal/templates/terminal/session_list.html:78 msgid "Date start" @@ -2071,15 +2064,39 @@ msgstr "%(name)s 创建成功" msgid "%(name)s was updated successfully" msgstr "%(name)s 更新成功" -#: common/fields.py:31 +#: common/fields/form.py:34 msgid "Not a valid json" msgstr "不是合法json" -#: common/fields.py:33 +#: common/fields/form.py:36 msgid "Not a string type" msgstr "不是字符类型" -#: common/fields.py:70 +#: common/fields/model.py:79 +msgid "Marshal dict data to char field" +msgstr "" + +#: common/fields/model.py:83 +msgid "Marshal dict data to text field" +msgstr "" + +#: common/fields/model.py:95 +msgid "Marshal list data to char field" +msgstr "" + +#: common/fields/model.py:99 +msgid "Marshal list data to text field" +msgstr "" + +#: common/fields/model.py:103 +msgid "Marshal data to char field" +msgstr "" + +#: common/fields/model.py:107 +msgid "Marshal data to text field" +msgstr "" + +#: common/fields/model.py:123 msgid "Encrypt field using Secret Key" msgstr "" @@ -2109,20 +2126,19 @@ msgstr "" msgid "Waiting task start" msgstr "等待任务开始" -#: ops/models/adhoc.py:38 xpack/plugins/change_asset_password_plan/models.py:22 +#: ops/models/adhoc.py:38 msgid "Interval" msgstr "间隔" #: ops/models/adhoc.py:38 settings/forms.py:151 -#: xpack/plugins/change_asset_password_plan/models.py:22 msgid "Units: seconds" msgstr "单位: 秒" -#: ops/models/adhoc.py:39 xpack/plugins/change_asset_password_plan/models.py:23 +#: ops/models/adhoc.py:39 msgid "Crontab" msgstr "Crontab" -#: ops/models/adhoc.py:39 xpack/plugins/change_asset_password_plan/models.py:23 +#: ops/models/adhoc.py:39 msgid "5 * * * *" msgstr "" @@ -2179,36 +2195,36 @@ msgstr "{} 任务开始: {}" msgid "{} Task finish" msgstr "{} 任务结束" -#: ops/models/adhoc.py:323 +#: ops/models/adhoc.py:324 msgid "Start time" msgstr "开始时间" -#: ops/models/adhoc.py:324 +#: ops/models/adhoc.py:325 msgid "End time" msgstr "完成时间" -#: ops/models/adhoc.py:325 ops/templates/ops/adhoc_history.html:57 +#: ops/models/adhoc.py:326 ops/templates/ops/adhoc_history.html:57 #: ops/templates/ops/task_history.html:63 ops/templates/ops/task_list.html:33 msgid "Time" msgstr "时间" -#: ops/models/adhoc.py:326 ops/templates/ops/adhoc_detail.html:106 +#: ops/models/adhoc.py:327 ops/templates/ops/adhoc_detail.html:106 #: ops/templates/ops/adhoc_history.html:55 #: ops/templates/ops/adhoc_history_detail.html:69 #: ops/templates/ops/task_detail.html:84 ops/templates/ops/task_history.html:61 msgid "Is finished" msgstr "是否完成" -#: ops/models/adhoc.py:327 ops/templates/ops/adhoc_history.html:56 +#: ops/models/adhoc.py:328 ops/templates/ops/adhoc_history.html:56 #: ops/templates/ops/task_history.html:62 msgid "Is success" msgstr "是否成功" -#: ops/models/adhoc.py:328 +#: ops/models/adhoc.py:329 msgid "Adhoc raw result" msgstr "结果" -#: ops/models/adhoc.py:329 +#: ops/models/adhoc.py:330 msgid "Adhoc result summary" msgstr "汇总" @@ -2439,7 +2455,7 @@ msgstr "命令执行" msgid "Organization" msgstr "组织管理" -#: perms/forms.py:39 perms/models.py:30 perms/models.py:86 +#: perms/forms.py:39 perms/models.py:29 perms/models.py:85 #: perms/templates/perms/asset_permission_list.html:55 #: perms/templates/perms/asset_permission_list.html:75 #: perms/templates/perms/asset_permission_list.html:122 templates/_nav.html:14 @@ -2459,14 +2475,14 @@ msgstr "用户和用户组至少选一个" msgid "Asset or group at least one required" msgstr "资产和节点至少选一个" -#: perms/models.py:36 perms/models.py:89 +#: perms/models.py:35 perms/models.py:88 #: perms/templates/perms/asset_permission_detail.html:90 #: users/models/user.py:92 users/templates/users/user_detail.html:107 #: users/templates/users/user_profile.html:116 msgid "Date expired" msgstr "失效日期" -#: perms/models.py:45 perms/models.py:98 templates/_nav.html:34 +#: perms/models.py:44 perms/models.py:97 templates/_nav.html:34 msgid "Asset permission" msgstr "资产授权" @@ -3596,7 +3612,7 @@ msgid "" "You should use your ssh client tools connect terminal: {}

{}" msgstr "你可以使用ssh客户端工具连接终端" -#: users/api/user.py:145 +#: users/api/user.py:146 msgid "Could not reset self otp, use profile reset instead" msgstr "不能再该页面重置MFA, 请去个人信息页面重置" @@ -3748,7 +3764,7 @@ msgstr "用户认证源来自 {}, 请去相应系统修改密码" msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" -#: users/serializers/v2.py:34 +#: users/serializers_v2/user.py:36 msgid "name not unique" msgstr "名称重复" @@ -4979,6 +4995,9 @@ msgstr "创建组织" msgid "Update org" msgstr "更新组织" +#~ msgid "Invalid private key" +#~ msgstr "ssh密钥不合法" + #, fuzzy #~| msgid "CPU count" #~ msgid "Cpu count" diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index f4d67b945..2f1adc355 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -233,6 +233,7 @@ class AdHoc(models.Model): history.summary = summary return raw, summary except Exception as e: + logger.error(e, exc_info=True) return {}, {"dark": {"all": str(e)}, "contacted": []} finally: history.date_finished = timezone.now() diff --git a/apps/ops/tasks.py b/apps/ops/tasks.py index 07a86a3be..9de1d0437 100644 --- a/apps/ops/tasks.py +++ b/apps/ops/tasks.py @@ -81,6 +81,8 @@ def clean_celery_tasks_period(): settings.CELERY_LOG_DIR, expire_days ) subprocess.call(command, shell=True) + command = "echo > {}".format(os.path.join(settings.LOG_DIR, 'celery.log')) + subprocess.call(command, shell=True) @shared_task diff --git a/apps/perms/models.py b/apps/perms/models.py index d771a57f5..1ae4f5e69 100644 --- a/apps/perms/models.py +++ b/apps/perms/models.py @@ -5,7 +5,6 @@ from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from common.utils import date_expired_default, set_or_append_attr_bulk - from orgs.mixins import OrgModelMixin, OrgManager diff --git a/apps/settings/signals_handler.py b/apps/settings/signals_handler.py index 7de4e150b..e346fe249 100644 --- a/apps/settings/signals_handler.py +++ b/apps/settings/signals_handler.py @@ -3,7 +3,7 @@ import json from django.dispatch import receiver -from django.db.models.signals import post_save, pre_save, pre_migrate +from django.db.models.signals import post_save, pre_save from django.conf import LazySettings, empty from django.db.utils import ProgrammingError, OperationalError from django.core.cache import cache diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index 85ae506d1..8740a6508 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -555,6 +555,17 @@ jumpserver.initServerSideDataTable = function (options) { processing: true, ajax: { url: options.ajax_url , + error: function(jqXHR, textStatus, errorThrown) { + var msg = gettext("Unknown error occur"); + if (jqXHR.responseJSON) { + if (jqXHR.responseJSON.error) { + msg = jqXHR.responseJSON.error + } else if (jqXHR.responseJSON.msg) { + msg = jqXHR.responseJSON.msg + } + } + alert(msg) + }, data: function (data) { delete data.columns; if (data.length !== null){ diff --git a/apps/static/js/webterminal.js b/apps/static/js/webterminal.js deleted file mode 100644 index 12e15c0a8..000000000 --- a/apps/static/js/webterminal.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Created by liuzheng on 3/3/16. - */ -var rowHeight = 1; -var colWidth = 1; -function WSSHClient() { -} -WSSHClient.prototype._generateEndpoint = function (options) { - console.log(options); - if (window.location.protocol == 'https:') { - var protocol = 'wss://'; - } else { - var protocol = 'ws://'; - } - - var endpoint = protocol + document.URL.match(RegExp('//(.*?)/'))[1] + '/ws/applications' + document.URL.match(/(\?.*)/); - return endpoint; -}; -WSSHClient.prototype.connect = function (options) { - var endpoint = this._generateEndpoint(options); - - if (window.WebSocket) { - this._connection = new WebSocket(endpoint); - } - else if (window.MozWebSocket) { - this._connection = MozWebSocket(endpoint); - } - else { - options.onError('WebSocket Not Supported'); - return; - } - - this._connection.onopen = function () { - options.onConnect(); - }; - - this._connection.onmessage = function (evt) { - try { - options.onData(evt.data); - } catch (e) { - var data = JSON.parse(evt.data.toString()); - options.onError(data.error); - } - }; - - this._connection.onclose = function (evt) { - options.onClose(); - }; -}; - -WSSHClient.prototype.send = function (data) { - this._connection.send(JSON.stringify({'data': data})); -}; - -function openTerminal(options) { - var client = new WSSHClient(); - var rowHeight, colWidth; - try { - rowHeight = localStorage.getItem('term-row'); - colWidth = localStorage.getItem('term-col'); - } catch (err) { - rowHeight = 35; - colWidth = 100 - } - if (rowHeight) { - } else { - rowHeight = 35 - } - if (colWidth) { - } else { - colWidth = 100 - } - - var term = new Terminal({ - rows: rowHeight, - cols: colWidth, - useStyle: true, - screenKeys: true - }); - term.open(); - term.on('data', function (data) { - client.send(data) - }); - $('.applications').detach().appendTo('#term'); - //term.resize(colWidth, rowHeight); - term.write('Connecting...'); - client.connect($.extend(options, { - onError: function (error) { - term.write('Error: ' + error + '\r\n'); - }, - onConnect: function () { - // Erase our connecting message - client.send({'resize': {'rows': rowHeight, 'cols': colWidth}}); - term.write('\r'); - }, - onClose: function () { - term.write('Connection Reset By Peer'); - }, - onData: function (data) { - term.write(data); - } - })); - //rowHeight = 0.0 + 1.00 * $('.applications').height() / 24; - //colWidth = 0.0 + 1.00 * $('.applications').width() / 80; - return {'term': term, 'client': client}; -} - -//function resize() { -// $('.applications').css('width', window.innerWidth - 25); -// console.log(window.innerWidth); -// console.log(window.innerWidth - 10); -// var rows = Math.floor(window.innerHeight / rowHeight) - 2; -// var cols = Math.floor(window.innerWidth / colWidth) - 1; -// -// return {rows: rows, cols: cols}; -//} - -$(document).ready(function () { - var options = {}; - - $('#ssh').show(); - var term_client = openTerminal(options); - console.log(rowHeight); - // by liuzheng712 because it will bring record bug - //window.onresize = function () { - // var geom = resize(); - // console.log(geom); - // term_client.term.resize(geom.cols, geom.rows); - // term_client.client.send({'resize': {'rows': geom.rows, 'cols': geom.cols}}); - // $('#ssh').show(); - //} - try { - $('#term-row')[0].value = localStorage.getItem('term-row'); - $('#term-col')[0].value = localStorage.getItem('term-col'); - } catch (err) { - $('#term-row')[0].value = 35; - $('#term-col')[0].value = 100; - } - $('#col-row').click(function () { - var col = $('#term-col').val(); - var row = $('#term-row').val(); - localStorage.setItem('term-col', col); - localStorage.setItem('term-row', row); - term_client.term.resize(col, row); - term_client.client.send({'resize': {'rows': row, 'cols': col}}); - $('#ssh').show(); - }); - $(".applications").mouseleave(function () { - $(".termChangBar").slideDown(); - }); - $(".applications").mouseenter(function () { - $(".termChangBar").slideUp(); - }) -}); \ No newline at end of file diff --git a/apps/static/js/wssh.js b/apps/static/js/wssh.js deleted file mode 100644 index e538a0a24..000000000 --- a/apps/static/js/wssh.js +++ /dev/null @@ -1,89 +0,0 @@ -/* -WSSH Javascript Client - -Usage: - -var client = new WSSHClient(); - -client.connect({ - // Connection and authentication parameters - username: 'root', - hostname: 'localhost', - authentication_method: 'password', // can either be password or private_key - password: 'secretpassword', // do not provide when using private_key - key_passphrase: 'secretpassphrase', // *may* be provided if the private_key is encrypted - - // Callbacks - onError: function(error) { - // Called upon an error - console.error(error); - }, - onConnect: function() { - // Called after a successful connection to the server - console.debug('Connected!'); - - client.send('ls\n'); // You can send data back to the server by using WSSHClient.send() - }, - onClose: function() { - // Called when the remote closes the connection - console.debug('Connection Reset By Peer'); - }, - onData: function(data) { - // Called when data is received from the server - console.debug('Received: ' + data); - } -}); - -*/ - -function WSSHClient() { -} - -WSSHClient.prototype._generateEndpoint = function(options) { - console.log(options); - if (window.location.protocol == 'https:') { - var protocol = 'wss://'; - } else { - var protocol = 'ws://'; - } - - var endpoint = protocol + window.location.host + ':8080' + '/applications'; - return endpoint; -}; - -WSSHClient.prototype.connect = function(options) { - var endpoint = this._generateEndpoint(options); - - if (window.WebSocket) { - this._connection = new WebSocket(endpoint); - } - else if (window.MozWebSocket) { - this._connection = MozWebSocket(endpoint); - } - else { - options.onError('WebSocket Not Supported'); - return ; - } - - this._connection.onopen = function() { - options.onConnect(); - }; - - this._connection.onmessage = function (evt) { - var data = JSON.parse(evt.data.toString()); - if (data.error !== undefined) { - options.onError(data.error); - } - else { - options.onData(data.data); - } - }; - - this._connection.onclose = function(evt) { - options.onClose(); - }; -}; - -WSSHClient.prototype.send = function(data) { - this._connection.send(JSON.stringify({'data': data})); -}; diff --git a/apps/terminal/api/__init__.py b/apps/terminal/api/__init__.py index ec51c5a2b..21e78a2d7 100644 --- a/apps/terminal/api/__init__.py +++ b/apps/terminal/api/__init__.py @@ -1,2 +1,5 @@ # -*- coding: utf-8 -*- # +from .terminal import * +from .session import * +from .task import * diff --git a/apps/terminal/api/v1/session.py b/apps/terminal/api/session.py similarity index 96% rename from apps/terminal/api/v1/session.py rename to apps/terminal/api/session.py index e6ead0915..39d18b159 100644 --- a/apps/terminal/api/v1/session.py +++ b/apps/terminal/api/session.py @@ -9,17 +9,17 @@ from django.http import HttpResponseNotFound from django.conf import settings from rest_framework.pagination import LimitOffsetPagination from rest_framework import viewsets -from rest_framework.views import Response +from rest_framework.response import Response from rest_framework_bulk import BulkModelViewSet import jms_storage from common.utils import is_uuid from common.permissions import IsOrgAdminOrAppUser -from ...hands import SystemUser -from ...models import Terminal, Session -from ...serializers import v1 as serializers -from ...backends import get_command_storage, get_multi_command_storage, \ +from ..hands import SystemUser +from ..models import Terminal, Session +from .. import serializers +from ..backends import get_command_storage, get_multi_command_storage, \ SessionCommandSerializer __all__ = ['SessionViewSet', 'SessionReplayViewSet', 'CommandViewSet'] diff --git a/apps/terminal/api/v1/task.py b/apps/terminal/api/task.py similarity index 93% rename from apps/terminal/api/v1/task.py rename to apps/terminal/api/task.py index f94096595..d030b80a2 100644 --- a/apps/terminal/api/v1/task.py +++ b/apps/terminal/api/task.py @@ -6,8 +6,8 @@ from rest_framework_bulk import BulkModelViewSet from common.utils import get_object_or_none from common.permissions import IsOrgAdminOrAppUser -from ...models import Session, Task -from ...serializers import v1 as serializers +from ..models import Session, Task +from .. import serializers __all__ = ['TaskViewSet', 'KillSessionAPI'] diff --git a/apps/terminal/api/v1/terminal.py b/apps/terminal/api/terminal.py similarity index 98% rename from apps/terminal/api/v1/terminal.py rename to apps/terminal/api/terminal.py index c44ac4320..3aed8537e 100644 --- a/apps/terminal/api/v1/terminal.py +++ b/apps/terminal/api/terminal.py @@ -14,8 +14,8 @@ from rest_framework.permissions import AllowAny from common.utils import get_object_or_none from common.permissions import IsAppUser, IsOrgAdminOrAppUser, IsSuperUser -from ...models import Terminal, Status, Session -from ...serializers import v1 as serializers +from ..models import Terminal, Status, Session +from .. import serializers __all__ = [ 'TerminalViewSet', 'TerminalTokenApi', 'StatusViewSet', 'TerminalConfig', diff --git a/apps/terminal/api/v2/__init__.py b/apps/terminal/api_v2/__init__.py similarity index 100% rename from apps/terminal/api/v2/__init__.py rename to apps/terminal/api_v2/__init__.py diff --git a/apps/terminal/api/v2/terminal.py b/apps/terminal/api_v2/terminal.py similarity index 93% rename from apps/terminal/api/v2/terminal.py rename to apps/terminal/api_v2/terminal.py index 11157a0df..bad0aabc9 100644 --- a/apps/terminal/api/v2/terminal.py +++ b/apps/terminal/api_v2/terminal.py @@ -7,8 +7,8 @@ from rest_framework.response import Response from common.permissions import IsSuperUser, WithBootstrapToken -from ...models import Terminal -from ...serializers import v2 as serializers +from ..models import Terminal +from .. import serializers_v2 as serializers __all__ = ['TerminalViewSet', 'TerminalRegistrationApi'] diff --git a/apps/terminal/backends/command/db.py b/apps/terminal/backends/command/db.py index a2d3f7e32..fa457b75d 100644 --- a/apps/terminal/backends/command/db.py +++ b/apps/terminal/backends/command/db.py @@ -66,10 +66,14 @@ class CommandStore(CommandBase): date_from_default = timezone.now() - datetime.timedelta(days=7) date_to_default = timezone.now() - date_from = date_from if date_from else date_from_default - date_to = date_to if date_to else date_to_default - filter_kwargs['timestamp__gte'] = int(date_from.timestamp()) - filter_kwargs['timestamp__lte'] = int(date_to.timestamp()) + if not date_from and not session: + date_from = date_from_default + if not date_to and not session: + date_to = date_to_default + if date_from is not None: + filter_kwargs['timestamp__gte'] = int(date_from.timestamp()) + if date_to is not None: + filter_kwargs['timestamp__lte'] = int(date_to.timestamp()) if user: filter_kwargs["user"] = user diff --git a/apps/terminal/serializers/__init__.py b/apps/terminal/serializers/__init__.py index ec51c5a2b..e198ec278 100644 --- a/apps/terminal/serializers/__init__.py +++ b/apps/terminal/serializers/__init__.py @@ -1,2 +1,3 @@ # -*- coding: utf-8 -*- # +from .v1 import * diff --git a/apps/terminal/api/v1/__init__.py b/apps/terminal/serializers_v2/__init__.py similarity index 53% rename from apps/terminal/api/v1/__init__.py rename to apps/terminal/serializers_v2/__init__.py index 21e78a2d7..9161be085 100644 --- a/apps/terminal/api/v1/__init__.py +++ b/apps/terminal/serializers_v2/__init__.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- # + from .terminal import * -from .session import * -from .task import * diff --git a/apps/terminal/serializers/v2.py b/apps/terminal/serializers_v2/terminal.py similarity index 96% rename from apps/terminal/serializers/v2.py rename to apps/terminal/serializers_v2/terminal.py index 242c07268..338842094 100644 --- a/apps/terminal/serializers/v2.py +++ b/apps/terminal/serializers_v2/terminal.py @@ -3,7 +3,7 @@ from rest_framework import serializers from common.utils import get_request_ip -from users.serializers.v2 import ServiceAccountSerializer +from users.serializers_v2 import ServiceAccountSerializer from ..models import Terminal diff --git a/apps/terminal/urls/api_urls.py b/apps/terminal/urls/api_urls.py index 50be22a8c..54724c7ad 100644 --- a/apps/terminal/urls/api_urls.py +++ b/apps/terminal/urls/api_urls.py @@ -5,7 +5,7 @@ from django.urls import path, include from rest_framework_bulk.routes import BulkRouter -from ..api import v1 as api +from .. import api app_name = 'terminal' diff --git a/apps/terminal/urls/api_urls_v2.py b/apps/terminal/urls/api_urls_v2.py index 15254d216..e03e69c28 100644 --- a/apps/terminal/urls/api_urls_v2.py +++ b/apps/terminal/urls/api_urls_v2.py @@ -5,7 +5,7 @@ from django.urls import path from rest_framework_bulk.routes import BulkRouter -from ..api import v2 as api +from .. import api_v2 as api app_name = 'terminal' diff --git a/apps/users/api/v2/__init__.py b/apps/users/api_v2/__init__.py similarity index 100% rename from apps/users/api/v2/__init__.py rename to apps/users/api_v2/__init__.py diff --git a/apps/users/api/v2/user.py b/apps/users/api_v2/user.py similarity index 87% rename from apps/users/api/v2/user.py rename to apps/users/api_v2/user.py index b0f121809..fe097fa3f 100644 --- a/apps/users/api/v2/user.py +++ b/apps/users/api_v2/user.py @@ -3,7 +3,7 @@ from rest_framework import viewsets from common.permissions import WithBootstrapToken -from ...serializers import v2 as serializers +from .. import serializers_v2 as serializers class ServiceAccountRegistrationViewSet(viewsets.ModelViewSet): diff --git a/apps/users/serializers_v2/__init__.py b/apps/users/serializers_v2/__init__.py new file mode 100644 index 000000000..c2dce9535 --- /dev/null +++ b/apps/users/serializers_v2/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +# +from .user import * diff --git a/apps/users/serializers/v2.py b/apps/users/serializers_v2/user.py similarity index 97% rename from apps/users/serializers/v2.py rename to apps/users/serializers_v2/user.py index 79914ef0e..aab5db8a1 100644 --- a/apps/users/serializers/v2.py +++ b/apps/users/serializers_v2/user.py @@ -6,6 +6,8 @@ from ..models import User from authentication.serializers import AccessKeySerializer +__all__ = ['ServiceAccountSerializer'] + class ServiceAccountSerializer(serializers.ModelSerializer): access_key = AccessKeySerializer(read_only=True) diff --git a/apps/users/urls/api_urls_v2.py b/apps/users/urls/api_urls_v2.py index f2a42729c..dc3c6e249 100644 --- a/apps/users/urls/api_urls_v2.py +++ b/apps/users/urls/api_urls_v2.py @@ -5,7 +5,7 @@ from __future__ import absolute_import from django.urls import path, include from rest_framework_bulk.routes import BulkRouter -from ..api import v2 as api +from .. import api_v2 as api app_name = 'users'