Merge branch 'v3' of github.com:jumpserver/jumpserver into v3

pull/9246/head
ibuler 2022-12-27 15:28:32 +08:00
commit 3336f2ba67
16 changed files with 211 additions and 100 deletions

View File

@ -8,6 +8,7 @@ from collections import OrderedDict
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.http import Http404 from django.http import Http404
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
from rest_framework import exceptions, serializers from rest_framework import exceptions, serializers
from rest_framework.fields import empty from rest_framework.fields import empty
from rest_framework.metadata import SimpleMetadata from rest_framework.metadata import SimpleMetadata
@ -122,6 +123,12 @@ class SimpleMetadataWithFilters(SimpleMetadata):
self.set_tree_field(field, field_info) self.set_tree_field(field, field_info)
elif isinstance(field, serializers.ChoiceField): elif isinstance(field, serializers.ChoiceField):
self.set_choices_field(field, field_info) self.set_choices_field(field, field_info)
if field.field_name == 'id':
field_info['label'] = 'ID'
if field.field_name == 'org_id':
field_info['label'] = _('Organization ID')
return field_info return field_info
@staticmethod @staticmethod

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7f83a00d90fe74749386ecd1f64d507b135e8c4d35acea1c5cd56bba3387e834 oid sha256:a533ee3b36cdd61fe239be159cc80362e5cd358f134857987029bde8e4c1231e
size 119674 size 119530

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-23 15:35+0800\n" "POT-Creation-Date: 2022-12-26 20:28+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -95,8 +95,8 @@ msgstr "アクティブ"
#: authentication/models/sso_token.py:16 #: authentication/models/sso_token.py:16
#: notifications/models/notification.py:12 #: notifications/models/notification.py:12
#: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:57 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:57
#: rbac/builtin.py:120 rbac/models/rolebinding.py:41 #: perms/serializers/permission.py:23 rbac/builtin.py:120
#: terminal/backends/command/models.py:20 #: rbac/models/rolebinding.py:41 terminal/backends/command/models.py:20
#: terminal/backends/command/serializers.py:13 #: terminal/backends/command/serializers.py:13
#: terminal/models/session/session.py:29 terminal/models/session/sharing.py:32 #: terminal/models/session/session.py:29 terminal/models/session/sharing.py:32
#: terminal/notifications.py:94 terminal/notifications.py:142 #: terminal/notifications.py:94 terminal/notifications.py:142
@ -114,7 +114,8 @@ msgstr "ユーザー"
#: assets/serializers/domain.py:19 assets/serializers/gathered_user.py:11 #: assets/serializers/domain.py:19 assets/serializers/gathered_user.py:11
#: assets/serializers/label.py:27 audits/models.py:34 #: assets/serializers/label.py:27 audits/models.py:34
#: authentication/models/connection_token.py:32 #: authentication/models/connection_token.py:32
#: perms/models/asset_permission.py:63 terminal/backends/command/models.py:21 #: perms/models/asset_permission.py:63 perms/serializers/permission.py:27
#: terminal/backends/command/models.py:21
#: terminal/backends/command/serializers.py:14 #: terminal/backends/command/serializers.py:14
#: terminal/models/session/session.py:31 terminal/notifications.py:93 #: terminal/models/session/session.py:31 terminal/notifications.py:93
#: xpack/plugins/cloud/models.py:220 #: xpack/plugins/cloud/models.py:220
@ -369,9 +370,9 @@ msgstr "失敗しました"
#: assets/const/account.py:12 assets/models/_user.py:35 #: assets/const/account.py:12 assets/models/_user.py:35
#: audits/signal_handlers.py:49 authentication/confirm/password.py:9 #: audits/signal_handlers.py:49 authentication/confirm/password.py:9
#: authentication/forms.py:32 #: authentication/forms.py:32
#: authentication/templates/authentication/login.html:260 #: authentication/templates/authentication/login.html:288
#: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47
#: users/forms/profile.py:22 users/serializers/user.py:90 #: users/forms/profile.py:22 users/serializers/user.py:97
#: users/templates/users/_msg_user_created.html:13 #: users/templates/users/_msg_user_created.html:13
#: users/templates/users/user_password_verify.html:18 #: users/templates/users/user_password_verify.html:18
#: xpack/plugins/cloud/serializers/account_attrs.py:28 #: xpack/plugins/cloud/serializers/account_attrs.py:28
@ -421,7 +422,7 @@ msgstr "パスワード/キーの確認"
msgid "Gather accounts" msgid "Gather accounts"
msgstr "アカウントを集める" msgstr "アカウントを集める"
#: assets/const/automation.py:38 assets/serializers/account/base.py:26 #: assets/const/automation.py:38 assets/serializers/account/base.py:29
msgid "Specific" msgid "Specific"
msgstr "" msgstr ""
@ -651,17 +652,17 @@ msgstr "資産履歴アカウントを表示できます"
msgid "Can view asset history account secret" msgid "Can view asset history account secret"
msgstr "資産履歴アカウントパスワードを表示できます" msgstr "資産履歴アカウントパスワードを表示できます"
#: assets/models/account.py:102 assets/serializers/account/account.py:15 #: assets/models/account.py:106 assets/serializers/account/account.py:15
#, fuzzy #, fuzzy
msgid "Account template" msgid "Account template"
msgstr "アカウント名" msgstr "アカウント名"
#: assets/models/account.py:107 #: assets/models/account.py:111
#, fuzzy #, fuzzy
msgid "Can view asset account template secret" msgid "Can view asset account template secret"
msgstr "資産アカウントの秘密を表示できます" msgstr "資産アカウントの秘密を表示できます"
#: assets/models/account.py:108 #: assets/models/account.py:112
#, fuzzy #, fuzzy
msgid "Can change asset account template secret" msgid "Can change asset account template secret"
msgstr "資産口座の秘密を変更できます" msgstr "資産口座の秘密を変更できます"
@ -691,7 +692,7 @@ msgstr "ノード"
#: assets/models/base.py:71 assets/models/cmd_filter.py:39 #: assets/models/base.py:71 assets/models/cmd_filter.py:39
#: assets/models/label.py:22 #: assets/models/label.py:22
#: authentication/serializers/connect_token_secret.py:106 #: authentication/serializers/connect_token_secret.py:106
#: terminal/models/applet/applet.py:27 users/serializers/user.py:151 #: terminal/models/applet/applet.py:27 users/serializers/user.py:158
msgid "Is active" msgid "Is active"
msgstr "アクティブです。" msgstr "アクティブです。"
@ -985,7 +986,8 @@ msgid "Privileged"
msgstr "" msgstr ""
#: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:60 #: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:60
#: users/models/group.py:25 users/models/user.py:681 #: perms/serializers/permission.py:25 users/models/group.py:25
#: users/models/user.py:681
msgid "User group" msgid "User group"
msgstr "ユーザーグループ" msgstr "ユーザーグループ"
@ -1104,7 +1106,8 @@ msgstr "フルバリュー"
msgid "Parent key" msgid "Parent key"
msgstr "親キー" msgstr "親キー"
#: assets/models/node.py:566 xpack/plugins/cloud/models.py:96 #: assets/models/node.py:566 perms/serializers/permission.py:28
#: xpack/plugins/cloud/models.py:96
msgid "Node" msgid "Node"
msgstr "ノード" msgstr "ノード"
@ -1267,6 +1270,7 @@ msgid "Push now"
msgstr "" msgstr ""
#: assets/serializers/account/account.py:20 #: assets/serializers/account/account.py:20
#: assets/serializers/account/base.py:13
#, fuzzy #, fuzzy
msgid "Has secret" msgid "Has secret"
msgstr "ひみつ" msgstr "ひみつ"
@ -1781,7 +1785,7 @@ msgstr ""
"さい。" "さい。"
#: authentication/api/password.py:59 #: authentication/api/password.py:59
#: authentication/templates/authentication/login.html:289 #: authentication/templates/authentication/login.html:319
#: users/templates/users/forgot_password.html:27 #: users/templates/users/forgot_password.html:27
#: users/templates/users/forgot_password.html:28 #: users/templates/users/forgot_password.html:28
#: users/templates/users/forgot_password_previewing.html:13 #: users/templates/users/forgot_password_previewing.html:13
@ -2266,7 +2270,7 @@ msgid "The {} cannot be empty"
msgstr "{} 空にしてはならない" msgstr "{} 空にしてはならない"
#: authentication/serializers/token.py:79 perms/serializers/permission.py:30 #: authentication/serializers/token.py:79 perms/serializers/permission.py:30
#: perms/serializers/permission.py:61 users/serializers/user.py:152 #: perms/serializers/permission.py:61 users/serializers/user.py:159
msgid "Is valid" msgid "Is valid"
msgstr "有効です" msgstr "有効です"
@ -2455,17 +2459,13 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "キャンセル" msgstr "キャンセル"
#: authentication/templates/authentication/login.html:235 #: authentication/templates/authentication/login.html:254
msgid "Welcome back, please enter username and password to login" #: authentication/templates/authentication/login.html:327
msgstr ""
"おかえりなさい、ログインするためにユーザー名とパスワードを入力してください"
#: authentication/templates/authentication/login.html:297
#: templates/_header_bar.html:89 #: templates/_header_bar.html:89
msgid "Login" msgid "Login"
msgstr "ログイン" msgstr "ログイン"
#: authentication/templates/authentication/login.html:304 #: authentication/templates/authentication/login.html:334
msgid "More login options" msgid "More login options"
msgstr "その他のログインオプション" msgstr "その他のログインオプション"
@ -2735,6 +2735,10 @@ msgstr ""
msgid "Invalid choice: {}" msgid "Invalid choice: {}"
msgstr "無効なIP" msgstr "無効なIP"
#: common/drf/metadata.py:130
msgid "Organization ID"
msgstr "組織 ID"
#: common/drf/parsers/base.py:17 #: common/drf/parsers/base.py:17
msgid "The file content overflowed (The maximum length `{}` bytes)" msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "ファイルの内容がオーバーフローしました (最大長 '{}' バイト)" msgstr "ファイルの内容がオーバーフローしました (最大長 '{}' バイト)"
@ -2912,7 +2916,7 @@ msgstr "アカウントを正常に作成"
msgid "Your account has been created successfully" msgid "Your account has been created successfully"
msgstr "アカウントが正常に作成されました" msgstr "アカウントが正常に作成されました"
#: jumpserver/context_processor.py:13 #: jumpserver/context_processor.py:12
msgid "JumpServer Open Source Bastion Host" msgid "JumpServer Open Source Bastion Host"
msgstr "JumpServer オープンソースの要塞ホスト" msgstr "JumpServer オープンソースの要塞ホスト"
@ -3040,6 +3044,12 @@ msgstr "特権アカウント優先"
msgid "Skip" msgid "Skip"
msgstr "スキップ" msgstr "スキップ"
#: ops/const.py:45 ops/models/adhoc.py:20
#, fuzzy
#| msgid "PowerShell"
msgid "Powershell"
msgstr "PowerShell"
#: ops/exception.py:6 #: ops/exception.py:6
msgid "no valid program entry found." msgid "no valid program entry found."
msgstr "利用可能なプログラムポータルがありません" msgstr "利用可能なプログラムポータルがありません"
@ -3176,11 +3186,11 @@ msgstr "ジョブ#ジョブ#"
msgid "Parameters" msgid "Parameters"
msgstr "パラメータ" msgstr "パラメータ"
#: ops/models/job.py:288 #: ops/models/job.py:300
msgid "Job Execution" msgid "Job Execution"
msgstr "ジョブ実行" msgstr "ジョブ実行"
#: ops/models/job.py:299 #: ops/models/job.py:311
msgid "Job audit log" msgid "Job audit log"
msgstr "ジョブ監査ログ" msgstr "ジョブ監査ログ"
@ -3212,17 +3222,17 @@ msgstr "{max_threshold}%: => {value} を超える使用メモリ"
msgid "CPU load more than {max_threshold}: => {value}" msgid "CPU load more than {max_threshold}: => {value}"
msgstr "{max_threshold} を超えるCPUロード: => {value}" msgstr "{max_threshold} を超えるCPUロード: => {value}"
#: ops/serializers/job.py:12 #: ops/serializers/job.py:14
#, fuzzy #, fuzzy
msgid "Run after save" msgid "Run after save"
msgstr "システムユーザーの実行" msgstr "システムユーザーの実行"
#: ops/serializers/job.py:31 #: ops/serializers/job.py:43
#, fuzzy #, fuzzy
msgid "Job type" msgid "Job type"
msgstr "Docタイプ" msgstr "Docタイプ"
#: ops/serializers/job.py:32 #: ops/serializers/job.py:44
msgid "Material" msgid "Material"
msgstr "マテリアル" msgstr "マテリアル"
@ -3458,7 +3468,7 @@ msgid "asset permissions of organization {}"
msgstr "組織 {} の資産権限" msgstr "組織 {} の資産権限"
#: perms/serializers/permission.py:31 perms/serializers/permission.py:60 #: perms/serializers/permission.py:31 perms/serializers/permission.py:60
#: users/serializers/user.py:85 users/serializers/user.py:154 #: users/serializers/user.py:91 users/serializers/user.py:161
msgid "Is expired" msgid "Is expired"
msgstr "期限切れです" msgstr "期限切れです"
@ -6131,7 +6141,7 @@ msgstr "強制有効"
msgid "Local" msgid "Local"
msgstr "ローカル" msgstr "ローカル"
#: users/models/user.py:687 users/serializers/user.py:153 #: users/models/user.py:687 users/serializers/user.py:160
msgid "Is service account" msgid "Is service account"
msgstr "サービスアカウントです" msgstr "サービスアカウントです"
@ -6160,7 +6170,7 @@ msgid "Secret key"
msgstr "秘密キー" msgstr "秘密キー"
#: users/models/user.py:716 users/serializers/profile.py:149 #: users/models/user.py:716 users/serializers/profile.py:149
#: users/serializers/user.py:150 #: users/serializers/user.py:157
msgid "Is first login" msgid "Is first login"
msgstr "最初のログインです" msgstr "最初のログインです"
@ -6247,51 +6257,51 @@ msgstr "新しいパスワードを最後の {} 個のパスワードにする
msgid "The newly set password is inconsistent" msgid "The newly set password is inconsistent"
msgstr "新しく設定されたパスワードが一致しない" msgstr "新しく設定されたパスワードが一致しない"
#: users/serializers/user.py:29 #: users/serializers/user.py:31
msgid "System roles" msgid "System roles"
msgstr "システムの役割" msgstr "システムの役割"
#: users/serializers/user.py:30 #: users/serializers/user.py:35
msgid "Org roles" msgid "Org roles"
msgstr "組織ロール" msgstr "組織ロール"
#: users/serializers/user.py:78 #: users/serializers/user.py:84
msgid "Password strategy" msgid "Password strategy"
msgstr "パスワード戦略" msgstr "パスワード戦略"
#: users/serializers/user.py:80 #: users/serializers/user.py:86
msgid "MFA enabled" msgid "MFA enabled"
msgstr "MFA有効化" msgstr "MFA有効化"
#: users/serializers/user.py:82 #: users/serializers/user.py:88
msgid "MFA force enabled" msgid "MFA force enabled"
msgstr "MFAフォース有効化" msgstr "MFAフォース有効化"
#: users/serializers/user.py:84 #: users/serializers/user.py:90
msgid "Login blocked" msgid "Login blocked"
msgstr "ログインブロック" msgstr "ログインブロック"
#: users/serializers/user.py:87 #: users/serializers/user.py:93
msgid "Can public key authentication" msgid "Can public key authentication"
msgstr "公開鍵認証が可能" msgstr "公開鍵認証が可能"
#: users/serializers/user.py:155 #: users/serializers/user.py:162
msgid "Avatar url" msgid "Avatar url"
msgstr "アバターURL" msgstr "アバターURL"
#: users/serializers/user.py:158 #: users/serializers/user.py:165
msgid "Is OTP bound" msgid "Is OTP bound"
msgstr "仮想MFAがバインドされているか" msgstr "仮想MFAがバインドされているか"
#: users/serializers/user.py:265 #: users/serializers/user.py:272
msgid "Select users" msgid "Select users"
msgstr "ユーザーの選択" msgstr "ユーザーの選択"
#: users/serializers/user.py:266 #: users/serializers/user.py:273
msgid "For security, only list several users" msgid "For security, only list several users"
msgstr "セキュリティのために、複数のユーザーのみをリストします" msgstr "セキュリティのために、複数のユーザーのみをリストします"
#: users/serializers/user.py:300 #: users/serializers/user.py:307
msgid "name not unique" msgid "name not unique"
msgstr "名前が一意ではない" msgstr "名前が一意ではない"
@ -7124,6 +7134,10 @@ msgstr "究極のエディション"
msgid "Community edition" msgid "Community edition"
msgstr "コミュニティ版" msgstr "コミュニティ版"
#~ msgid "Welcome back, please enter username and password to login"
#~ msgstr ""
#~ "おかえりなさい、ログインするためにユーザー名とパスワードを入力してください"
#, fuzzy #, fuzzy
#~ msgid "Run account" #~ msgid "Run account"
#~ msgstr "アカウント" #~ msgstr "アカウント"

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:aec4662e56ce44daac5eea9fe6d39c21ce9b2c55cfb60006ad6f0e639329c552 oid sha256:7496f27202b5dcd9d677a70f9efc86c30b74fc306d6b5fa7202238c15c845971
size 105895 size 105814

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-23 15:35+0800\n" "POT-Creation-Date: 2022-12-26 20:28+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -94,8 +94,8 @@ msgstr "激活中"
#: authentication/models/sso_token.py:16 #: authentication/models/sso_token.py:16
#: notifications/models/notification.py:12 #: notifications/models/notification.py:12
#: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:57 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:57
#: rbac/builtin.py:120 rbac/models/rolebinding.py:41 #: perms/serializers/permission.py:23 rbac/builtin.py:120
#: terminal/backends/command/models.py:20 #: rbac/models/rolebinding.py:41 terminal/backends/command/models.py:20
#: terminal/backends/command/serializers.py:13 #: terminal/backends/command/serializers.py:13
#: terminal/models/session/session.py:29 terminal/models/session/sharing.py:32 #: terminal/models/session/session.py:29 terminal/models/session/sharing.py:32
#: terminal/notifications.py:94 terminal/notifications.py:142 #: terminal/notifications.py:94 terminal/notifications.py:142
@ -113,7 +113,8 @@ msgstr "用户"
#: assets/serializers/domain.py:19 assets/serializers/gathered_user.py:11 #: assets/serializers/domain.py:19 assets/serializers/gathered_user.py:11
#: assets/serializers/label.py:27 audits/models.py:34 #: assets/serializers/label.py:27 audits/models.py:34
#: authentication/models/connection_token.py:32 #: authentication/models/connection_token.py:32
#: perms/models/asset_permission.py:63 terminal/backends/command/models.py:21 #: perms/models/asset_permission.py:63 perms/serializers/permission.py:27
#: terminal/backends/command/models.py:21
#: terminal/backends/command/serializers.py:14 #: terminal/backends/command/serializers.py:14
#: terminal/models/session/session.py:31 terminal/notifications.py:93 #: terminal/models/session/session.py:31 terminal/notifications.py:93
#: xpack/plugins/cloud/models.py:220 #: xpack/plugins/cloud/models.py:220
@ -363,9 +364,9 @@ msgstr "失败"
#: assets/const/account.py:12 assets/models/_user.py:35 #: assets/const/account.py:12 assets/models/_user.py:35
#: audits/signal_handlers.py:49 authentication/confirm/password.py:9 #: audits/signal_handlers.py:49 authentication/confirm/password.py:9
#: authentication/forms.py:32 #: authentication/forms.py:32
#: authentication/templates/authentication/login.html:260 #: authentication/templates/authentication/login.html:288
#: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47
#: users/forms/profile.py:22 users/serializers/user.py:90 #: users/forms/profile.py:22 users/serializers/user.py:97
#: users/templates/users/_msg_user_created.html:13 #: users/templates/users/_msg_user_created.html:13
#: users/templates/users/user_password_verify.html:18 #: users/templates/users/user_password_verify.html:18
#: xpack/plugins/cloud/serializers/account_attrs.py:28 #: xpack/plugins/cloud/serializers/account_attrs.py:28
@ -409,7 +410,7 @@ msgstr "验证账号"
msgid "Gather accounts" msgid "Gather accounts"
msgstr "收集账号" msgstr "收集账号"
#: assets/const/automation.py:38 assets/serializers/account/base.py:26 #: assets/const/automation.py:38 assets/serializers/account/base.py:29
msgid "Specific" msgid "Specific"
msgstr "特有的" msgstr "特有的"
@ -634,15 +635,15 @@ msgstr "可以查看资产历史账号"
msgid "Can view asset history account secret" msgid "Can view asset history account secret"
msgstr "可以查看资产历史账号密码" msgstr "可以查看资产历史账号密码"
#: assets/models/account.py:102 assets/serializers/account/account.py:15 #: assets/models/account.py:106 assets/serializers/account/account.py:15
msgid "Account template" msgid "Account template"
msgstr "账号模版" msgstr "账号模版"
#: assets/models/account.py:107 #: assets/models/account.py:111
msgid "Can view asset account template secret" msgid "Can view asset account template secret"
msgstr "可以查看资产账号密码" msgstr "可以查看资产账号密码"
#: assets/models/account.py:108 #: assets/models/account.py:112
msgid "Can change asset account template secret" msgid "Can change asset account template secret"
msgstr "可以更改账号模版密码" msgstr "可以更改账号模版密码"
@ -671,7 +672,7 @@ msgstr "节点"
#: assets/models/base.py:71 assets/models/cmd_filter.py:39 #: assets/models/base.py:71 assets/models/cmd_filter.py:39
#: assets/models/label.py:22 #: assets/models/label.py:22
#: authentication/serializers/connect_token_secret.py:106 #: authentication/serializers/connect_token_secret.py:106
#: terminal/models/applet/applet.py:27 users/serializers/user.py:151 #: terminal/models/applet/applet.py:27 users/serializers/user.py:158
msgid "Is active" msgid "Is active"
msgstr "激活" msgstr "激活"
@ -944,7 +945,8 @@ msgid "Privileged"
msgstr "特权账号" msgstr "特权账号"
#: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:60 #: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:60
#: users/models/group.py:25 users/models/user.py:681 #: perms/serializers/permission.py:25 users/models/group.py:25
#: users/models/user.py:681
msgid "User group" msgid "User group"
msgstr "用户组" msgstr "用户组"
@ -1062,7 +1064,8 @@ msgstr "全称"
msgid "Parent key" msgid "Parent key"
msgstr "ssh私钥" msgstr "ssh私钥"
#: assets/models/node.py:566 xpack/plugins/cloud/models.py:96 #: assets/models/node.py:566 perms/serializers/permission.py:28
#: xpack/plugins/cloud/models.py:96
msgid "Node" msgid "Node"
msgstr "节点" msgstr "节点"
@ -1208,6 +1211,7 @@ msgid "Push now"
msgstr "立即推送" msgstr "立即推送"
#: assets/serializers/account/account.py:20 #: assets/serializers/account/account.py:20
#: assets/serializers/account/base.py:13
msgid "Has secret" msgid "Has secret"
msgstr "已托管密码" msgstr "已托管密码"
@ -1700,7 +1704,7 @@ msgid ""
msgstr "用户来自 {} 请去相应系统修改密码" msgstr "用户来自 {} 请去相应系统修改密码"
#: authentication/api/password.py:59 #: authentication/api/password.py:59
#: authentication/templates/authentication/login.html:289 #: authentication/templates/authentication/login.html:319
#: users/templates/users/forgot_password.html:27 #: users/templates/users/forgot_password.html:27
#: users/templates/users/forgot_password.html:28 #: users/templates/users/forgot_password.html:28
#: users/templates/users/forgot_password_previewing.html:13 #: users/templates/users/forgot_password_previewing.html:13
@ -2166,7 +2170,7 @@ msgid "The {} cannot be empty"
msgstr "{} 不能为空" msgstr "{} 不能为空"
#: authentication/serializers/token.py:79 perms/serializers/permission.py:30 #: authentication/serializers/token.py:79 perms/serializers/permission.py:30
#: perms/serializers/permission.py:61 users/serializers/user.py:152 #: perms/serializers/permission.py:61 users/serializers/user.py:159
msgid "Is valid" msgid "Is valid"
msgstr "账号是否有效" msgstr "账号是否有效"
@ -2347,16 +2351,13 @@ msgstr "如果这次公钥更新不是由你发起的,那么你的账号可能
msgid "Cancel" msgid "Cancel"
msgstr "取消" msgstr "取消"
#: authentication/templates/authentication/login.html:235 #: authentication/templates/authentication/login.html:254
msgid "Welcome back, please enter username and password to login" #: authentication/templates/authentication/login.html:327
msgstr "欢迎回来,请输入用户名和密码登录"
#: authentication/templates/authentication/login.html:297
#: templates/_header_bar.html:89 #: templates/_header_bar.html:89
msgid "Login" msgid "Login"
msgstr "登录" msgstr "登录"
#: authentication/templates/authentication/login.html:304 #: authentication/templates/authentication/login.html:334
msgid "More login options" msgid "More login options"
msgstr "其他方式登录" msgstr "其他方式登录"
@ -2624,6 +2625,10 @@ msgstr "错误的数据类型,应该是列表"
msgid "Invalid choice: {}" msgid "Invalid choice: {}"
msgstr "无效选项: {}" msgstr "无效选项: {}"
#: common/drf/metadata.py:130
msgid "Organization ID"
msgstr "组织 ID"
#: common/drf/parsers/base.py:17 #: common/drf/parsers/base.py:17
msgid "The file content overflowed (The maximum length `{}` bytes)" msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "文件内容太大 (最大长度 `{}` 字节)" msgstr "文件内容太大 (最大长度 `{}` 字节)"
@ -2798,7 +2803,7 @@ msgstr "创建账号成功"
msgid "Your account has been created successfully" msgid "Your account has been created successfully"
msgstr "你的账号已创建成功" msgstr "你的账号已创建成功"
#: jumpserver/context_processor.py:13 #: jumpserver/context_processor.py:12
msgid "JumpServer Open Source Bastion Host" msgid "JumpServer Open Source Bastion Host"
msgstr "JumpServer 开源堡垒机" msgstr "JumpServer 开源堡垒机"
@ -3053,11 +3058,11 @@ msgstr "作业"
msgid "Parameters" msgid "Parameters"
msgstr "" msgstr ""
#: ops/models/job.py:288 #: ops/models/job.py:300
msgid "Job Execution" msgid "Job Execution"
msgstr "作业执行" msgstr "作业执行"
#: ops/models/job.py:299 #: ops/models/job.py:311
msgid "Job audit log" msgid "Job audit log"
msgstr "作业审计日志" msgstr "作业审计日志"
@ -3089,15 +3094,15 @@ msgstr "内存使用率超过 {max_threshold}%: => {value}"
msgid "CPU load more than {max_threshold}: => {value}" msgid "CPU load more than {max_threshold}: => {value}"
msgstr "CPU 使用率超过 {max_threshold}: => {value}" msgstr "CPU 使用率超过 {max_threshold}: => {value}"
#: ops/serializers/job.py:12 #: ops/serializers/job.py:14
msgid "Run after save" msgid "Run after save"
msgstr "保存后执行" msgstr "保存后执行"
#: ops/serializers/job.py:31 #: ops/serializers/job.py:43
msgid "Job type" msgid "Job type"
msgstr "任务类型" msgstr "任务类型"
#: ops/serializers/job.py:32 #: ops/serializers/job.py:44
msgid "Material" msgid "Material"
msgstr "" msgstr ""
@ -3323,7 +3328,7 @@ msgid "asset permissions of organization {}"
msgstr "组织 ({}) 的资产授权" msgstr "组织 ({}) 的资产授权"
#: perms/serializers/permission.py:31 perms/serializers/permission.py:60 #: perms/serializers/permission.py:31 perms/serializers/permission.py:60
#: users/serializers/user.py:85 users/serializers/user.py:154 #: users/serializers/user.py:91 users/serializers/user.py:161
msgid "Is expired" msgid "Is expired"
msgstr "已过期" msgstr "已过期"
@ -5930,7 +5935,7 @@ msgstr "强制启用"
msgid "Local" msgid "Local"
msgstr "数据库" msgstr "数据库"
#: users/models/user.py:687 users/serializers/user.py:153 #: users/models/user.py:687 users/serializers/user.py:160
msgid "Is service account" msgid "Is service account"
msgstr "服务账号" msgstr "服务账号"
@ -5959,7 +5964,7 @@ msgid "Secret key"
msgstr "Secret key" msgstr "Secret key"
#: users/models/user.py:716 users/serializers/profile.py:149 #: users/models/user.py:716 users/serializers/profile.py:149
#: users/serializers/user.py:150 #: users/serializers/user.py:157
msgid "Is first login" msgid "Is first login"
msgstr "首次登录" msgstr "首次登录"
@ -6046,51 +6051,51 @@ msgstr "新密码不能是最近 {} 次的密码"
msgid "The newly set password is inconsistent" msgid "The newly set password is inconsistent"
msgstr "两次密码不一致" msgstr "两次密码不一致"
#: users/serializers/user.py:29 #: users/serializers/user.py:31
msgid "System roles" msgid "System roles"
msgstr "系统角色" msgstr "系统角色"
#: users/serializers/user.py:30 #: users/serializers/user.py:35
msgid "Org roles" msgid "Org roles"
msgstr "组织角色" msgstr "组织角色"
#: users/serializers/user.py:78 #: users/serializers/user.py:84
msgid "Password strategy" msgid "Password strategy"
msgstr "密码策略" msgstr "密码策略"
#: users/serializers/user.py:80 #: users/serializers/user.py:86
msgid "MFA enabled" msgid "MFA enabled"
msgstr "MFA 已启用" msgstr "MFA 已启用"
#: users/serializers/user.py:82 #: users/serializers/user.py:88
msgid "MFA force enabled" msgid "MFA force enabled"
msgstr "强制 MFA" msgstr "强制 MFA"
#: users/serializers/user.py:84 #: users/serializers/user.py:90
msgid "Login blocked" msgid "Login blocked"
msgstr "登录被阻塞" msgstr "登录被阻塞"
#: users/serializers/user.py:87 #: users/serializers/user.py:93
msgid "Can public key authentication" msgid "Can public key authentication"
msgstr "能否公钥认证" msgstr "能否公钥认证"
#: users/serializers/user.py:155 #: users/serializers/user.py:162
msgid "Avatar url" msgid "Avatar url"
msgstr "头像路径" msgstr "头像路径"
#: users/serializers/user.py:158 #: users/serializers/user.py:165
msgid "Is OTP bound" msgid "Is OTP bound"
msgstr "是否绑定了虚拟 MFA" msgstr "是否绑定了虚拟 MFA"
#: users/serializers/user.py:265 #: users/serializers/user.py:272
msgid "Select users" msgid "Select users"
msgstr "选择用户" msgstr "选择用户"
#: users/serializers/user.py:266 #: users/serializers/user.py:273
msgid "For security, only list several users" msgid "For security, only list several users"
msgstr "为了安全,仅列出几个用户" msgstr "为了安全,仅列出几个用户"
#: users/serializers/user.py:300 #: users/serializers/user.py:307
msgid "name not unique" msgid "name not unique"
msgstr "名称重复" msgstr "名称重复"
@ -6908,6 +6913,9 @@ msgstr "旗舰版"
msgid "Community edition" msgid "Community edition"
msgstr "社区版" msgstr "社区版"
#~ msgid "Welcome back, please enter username and password to login"
#~ msgstr "欢迎回来,请输入用户名和密码登录"
#~ msgid "Discovery account automation" #~ msgid "Discovery account automation"
#~ msgstr "账号发现" #~ msgstr "账号发现"

View File

@ -13,7 +13,8 @@ class AdHocRunner:
"reboot", 'shutdown', 'poweroff', 'halt', 'dd', 'half', 'top' "reboot", 'shutdown', 'poweroff', 'halt', 'dd', 'half', 'top'
] ]
def __init__(self, inventory, module, module_args='', pattern='*', project_dir='/tmp/', extra_vars={}): def __init__(self, inventory, module, module_args='', pattern='*', project_dir='/tmp/', extra_vars={},
dry_run=False):
self.id = uuid.uuid4() self.id = uuid.uuid4()
self.inventory = inventory self.inventory = inventory
self.pattern = pattern self.pattern = pattern
@ -23,6 +24,7 @@ class AdHocRunner:
self.cb = DefaultCallback() self.cb = DefaultCallback()
self.runner = None self.runner = None
self.extra_vars = extra_vars self.extra_vars = extra_vars
self.dry_run = dry_run
def check_module(self): def check_module(self):
if self.module not in self.cmd_modules_choices: if self.module not in self.cmd_modules_choices:

View File

@ -1,3 +1,4 @@
from django.db.models import Count
from rest_framework.views import APIView from rest_framework.views import APIView
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from rest_framework.response import Response from rest_framework.response import Response
@ -5,12 +6,14 @@ from rest_framework.response import Response
from ops.models import Job, JobExecution from ops.models import Job, JobExecution
from ops.serializers.job import JobSerializer, JobExecutionSerializer from ops.serializers.job import JobSerializer, JobExecutionSerializer
__all__ = ['JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', 'JobAssetDetail', 'JobExecutionTaskDetail'] __all__ = ['JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView',
'JobAssetDetail', 'JobExecutionTaskDetail','FrequentUsernames']
from ops.tasks import run_ops_job_execution from ops.tasks import run_ops_job_execution
from ops.variables import JMS_JOB_VARIABLE_HELP from ops.variables import JMS_JOB_VARIABLE_HELP
from orgs.mixins.api import OrgBulkModelViewSet from orgs.mixins.api import OrgBulkModelViewSet
from orgs.utils import tmp_to_org, get_current_org_id, get_current_org from orgs.utils import tmp_to_org, get_current_org_id, get_current_org
from assets.models import Account
def set_task_to_serializer_data(serializer, task): def set_task_to_serializer_data(serializer, task):
@ -111,3 +114,12 @@ class JobExecutionTaskDetail(APIView):
'is_success': execution.is_success, 'is_success': execution.is_success,
'time_cost': execution.time_cost, 'time_cost': execution.time_cost,
}) })
class FrequentUsernames(APIView):
rbac_perms = ()
permission_classes = ()
def get(self, request, **kwargs):
top_accounts = Account.objects.all().values('username').annotate(total=Count('username')).order_by('total')
return Response(data=top_accounts)

View File

@ -0,0 +1,17 @@
# Generated by Django 3.2.16 on 2022-12-27 06:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('ops', '0033_auto_20221223_1536'),
]
operations = [
migrations.AlterModelOptions(
name='celerytask',
options={'ordering': ('name',), 'permissions': [('view_taskmonitor', 'Can view task monitor')], 'verbose_name': 'Celery Task'},
),
]

View File

@ -46,6 +46,9 @@ class CeleryTask(models.Model):
class Meta: class Meta:
verbose_name = _("Celery Task") verbose_name = _("Celery Task")
ordering = ('name',) ordering = ('name',)
permissions = [
('view_taskmonitor', _('Can view task monitor'))
]
class CeleryTaskExecution(models.Model): class CeleryTaskExecution(models.Model):

View File

@ -166,6 +166,10 @@ class JobExecution(JMSOrgBaseModel):
return return
result = self.current_job.args result = self.current_job.args
result += " chdir={}".format(self.current_job.chdir) result += " chdir={}".format(self.current_job.chdir)
if self.current_job.module in ['python']:
result += " executable={}".format(self.current_job.module)
print(result)
return self.job.args return self.job.args
def get_runner(self): def get_runner(self):
@ -187,9 +191,17 @@ class JobExecution(JMSOrgBaseModel):
if self.current_job.type == 'adhoc': if self.current_job.type == 'adhoc':
args = self.compile_shell() args = self.compile_shell()
module = "shell"
if self.current_job.module not in ['python']:
module = self.current_job.module
runner = AdHocRunner( runner = AdHocRunner(
self.inventory_path, self.current_job.module, module_args=args, self.inventory_path,
pattern="all", project_dir=self.private_dir, extra_vars=extra_vars, module,
module_args=args,
pattern="all",
project_dir=self.private_dir,
extra_vars=extra_vars,
) )
elif self.current_job.type == 'playbook': elif self.current_job.type == 'playbook':
runner = PlaybookRunner( runner = PlaybookRunner(

View File

@ -1,5 +1,7 @@
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from rest_framework import serializers from rest_framework import serializers
from assets.models import Node
from common.drf.fields import ReadableHiddenField from common.drf.fields import ReadableHiddenField
from ops.mixin import PeriodTaskSerializerMixin from ops.mixin import PeriodTaskSerializerMixin
from ops.models import Job, JobExecution from ops.models import Job, JobExecution
@ -10,6 +12,16 @@ from orgs.mixins.serializers import BulkOrgResourceModelSerializer
class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin): class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin):
creator = ReadableHiddenField(default=serializers.CurrentUserDefault()) creator = ReadableHiddenField(default=serializers.CurrentUserDefault())
run_after_save = serializers.BooleanField(label=_("Run after save"), default=False, required=False) run_after_save = serializers.BooleanField(label=_("Run after save"), default=False, required=False)
nodes = serializers.ListField(required=False, child=serializers.CharField())
def create(self, validated_data):
assets = validated_data.__getitem__('assets')
node_ids = validated_data.pop('nodes')
if node_ids:
nodes = Node.objects.filter(id__in=node_ids)
assets.extend(
Node.get_nodes_all_assets(*nodes).exclude(id__in=[asset.id for asset in assets]))
return super().create(validated_data)
class Meta: class Meta:
model = Job model = Job
@ -22,7 +34,7 @@ class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin):
"chdir", "chdir",
"comment", "comment",
"summary", "summary",
"is_periodic", "interval", "crontab", "run_after_save" "is_periodic", "interval", "crontab", "run_after_save", "nodes"
] ]

View File

@ -26,6 +26,7 @@ urlpatterns = [
path('variables/help/', api.JobRunVariableHelpAPIView.as_view(), name='variable-help'), path('variables/help/', api.JobRunVariableHelpAPIView.as_view(), name='variable-help'),
path('job-execution/asset-detail/', api.JobAssetDetail.as_view(), name='asset-detail'), path('job-execution/asset-detail/', api.JobAssetDetail.as_view(), name='asset-detail'),
path('job-execution/task-detail/', api.JobExecutionTaskDetail.as_view(), name='task-detail'), path('job-execution/task-detail/', api.JobExecutionTaskDetail.as_view(), name='task-detail'),
path('frequent-username/', api.FrequentUsernames.as_view(), name='frequent-usernames'),
path('ansible/job-execution/<uuid:pk>/log/', api.AnsibleTaskLogApi.as_view(), name='job-execution-log'), path('ansible/job-execution/<uuid:pk>/log/', api.AnsibleTaskLogApi.as_view(), name='job-execution-log'),
path('celery/task/<uuid:name>/task-execution/<uuid:pk>/log/', api.CeleryTaskExecutionLogApi.as_view(), path('celery/task/<uuid:name>/task-execution/<uuid:pk>/log/', api.CeleryTaskExecutionLogApi.as_view(),

View File

@ -70,7 +70,6 @@ exclude_permissions = (
('rbac', 'role', '*', '*'), ('rbac', 'role', '*', '*'),
('ops', 'adhoc', 'delete,change', '*'), ('ops', 'adhoc', 'delete,change', '*'),
('ops', 'adhocexecution', 'add,delete,change', '*'), ('ops', 'adhocexecution', 'add,delete,change', '*'),
('ops', 'task', 'add,change', 'task'),
('ops', 'jobexecution', 'change,delete', 'jobexecution'), ('ops', 'jobexecution', 'change,delete', 'jobexecution'),
('ops', 'historicaljob', '*', '*'), ('ops', 'historicaljob', '*', '*'),
('ops', 'celerytask', 'add,change,delete', 'celerytask'), ('ops', 'celerytask', 'add,change,delete', 'celerytask'),
@ -99,9 +98,6 @@ exclude_permissions = (
('xpack', 'license', '*', '*'), ('xpack', 'license', '*', '*'),
('xpack', 'syncinstancedetail', 'add,delete,change', 'syncinstancedetail'), ('xpack', 'syncinstancedetail', 'add,delete,change', 'syncinstancedetail'),
('xpack', 'syncinstancetaskexecution', 'delete,change', 'syncinstancetaskexecution'), ('xpack', 'syncinstancetaskexecution', 'delete,change', 'syncinstancetaskexecution'),
('xpack', 'changeauthplanexecution', '*', '*'),
('xpack', 'changeauthplantask', '*', '*'),
('xpack', 'gatherusertaskexecution', '*', '*'),
('common', 'permission', 'add,delete,view,change', 'permission'), ('common', 'permission', 'add,delete,view,change', 'permission'),
('terminal', 'command', 'delete,change', 'command'), ('terminal', 'command', 'delete,change', 'command'),
('terminal', 'status', 'delete,change', 'status'), ('terminal', 'status', 'delete,change', 'status'),

View File

@ -0,0 +1,24 @@
# Generated by Django 3.2.16 on 2022-12-27 02:41
from django.db import migrations
def migrate_remove_redundant_permission(apps, *args):
model = apps.get_model('rbac', 'ContentType')
model.objects.filter(app_label='applications').delete()
model.objects.filter(app_label='ops', model='task').delete()
model.objects.filter(app_label='xpack', model__in=[
'applicationchangeauthplan', 'applicationchangeauthplanexecution',
'applicationchangeauthplantask', 'changeauthplan', 'changeauthplanexecution',
'changeauthplantask', 'gatherusertask', 'gatherusertaskexecution'
]).delete()
class Migration(migrations.Migration):
dependencies = [
('rbac', '0010_auto_20221220_1956'),
]
operations = [
migrations.RunPython(migrate_remove_redundant_permission)
]

View File

@ -100,6 +100,8 @@ special_pid_mapper = {
'ops.jobauditlog': 'audits', 'ops.jobauditlog': 'audits',
'ops.view_celerytask': 'task_center', 'ops.view_celerytask': 'task_center',
'ops.view_celerytaskexecution': 'task_center', 'ops.view_celerytaskexecution': 'task_center',
'ops.view_taskmonitor': 'task_center',
'ops.adhocexecution': 'task_center',
'ops.job': 'operation_center', 'ops.job': 'operation_center',
'ops.adhoc': 'operation_center', 'ops.adhoc': 'operation_center',
'ops.playbook': 'operation_center', 'ops.playbook': 'operation_center',

View File

@ -89,8 +89,9 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, serializer
) )
login_blocked = serializers.BooleanField(read_only=True, label=_("Login blocked")) login_blocked = serializers.BooleanField(read_only=True, label=_("Login blocked"))
is_expired = serializers.BooleanField(read_only=True, label=_("Is expired")) is_expired = serializers.BooleanField(read_only=True, label=_("Is expired"))
can_public_key_auth = serializers.ReadOnlyField( can_public_key_auth = serializers.BooleanField(
source="can_use_ssh_key_login", label=_("Can public key authentication") source="can_use_ssh_key_login", label=_("Can public key authentication"),
read_only=True
) )
password = EncryptedField( password = EncryptedField(
label=_("Password"), label=_("Password"),