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 cb390f14d..e647e918d 100644 Binary files a/apps/locale/zh/LC_MESSAGES/django.mo and b/apps/locale/zh/LC_MESSAGES/django.mo differ 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'