pref: 修改 applet host

pull/9019/head
ibuler 2022-11-03 16:55:38 +08:00
parent 9b3b3d09da
commit b0ae9b47ca
22 changed files with 527 additions and 366 deletions

View File

@ -30,11 +30,13 @@ class AccountHistoricalRecords(HistoricalRecords):
return return
super().post_save(instance, created, using=using, **kwargs) super().post_save(instance, created, using=using, **kwargs)
def fields_included(self, model): def create_history_model(self, model, inherited):
if self.included_fields: if self.included_fields and not self.excluded_fields:
fields = [i for i in model._meta.fields if i.name in self.included_fields] self.excluded_fields = [
return fields field.name for field in model._meta.fields
return super().fields_included(model) if field.name not in self.included_fields
]
return super().create_history_model(model, inherited)
class Account(AbsConnectivity, BaseAccount): class Account(AbsConnectivity, BaseAccount):

View File

@ -9,8 +9,6 @@ logger = get_logger(__name__)
@receiver(pre_save, sender=Account) @receiver(pre_save, sender=Account)
def on_account_pre_create(sender, instance, **kwargs): def on_account_pre_create(sender, instance, **kwargs):
# Todo: 是否只有更改密码的时候才有版本增加, bitwarden 只有再改密码的时候,
# 才会有版本,代表的是 password_version
# 升级版本号 # 升级版本号
instance.version += 1 instance.version += 1
# 即使在 root 组织也不怕 # 即使在 root 组织也不怕

View File

@ -13,8 +13,8 @@ from .mixin import BulkListSerializerMixin, BulkSerializerMixin
__all__ = [ __all__ = [
'MethodSerializer', 'EmptySerializer', 'BulkModelSerializer', 'MethodSerializer', 'EmptySerializer', 'BulkModelSerializer',
'AdaptedBulkListSerializer', 'CeleryTaskExecutionSerializer', 'AdaptedBulkListSerializer', 'CeleryTaskExecutionSerializer',
'WritableNestedModelSerializer', 'WritableNestedModelSerializer', 'GroupedChoiceSerializer',
'GroupedChoiceSerializer', 'FileSerializer'
] ]
@ -88,3 +88,7 @@ class GroupedChoiceSerializer(ChoiceSerializer):
class WritableNestedModelSerializer(NestedModelSerializer): class WritableNestedModelSerializer(NestedModelSerializer):
pass pass
class FileSerializer(serializers.Serializer):
file = serializers.FileField(label=_("File"))

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c4c889e251a4de3161f462e042882ba3c4ab40eaf34799e2d49d4788ad961586 oid sha256:07f1cfd07039142f4847b4139586bf815467f266119eae57476c073130f0ac92
size 119171 size 118098

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-11-01 15:30+0800\n" "POT-Creation-Date: 2022-11-03 16:00+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"
@ -25,7 +25,7 @@ msgstr "Acls"
#: acls/models/base.py:25 acls/serializers/login_asset_acl.py:48 #: acls/models/base.py:25 acls/serializers/login_asset_acl.py:48
#: applications/models.py:10 assets/models/_user.py:33 #: applications/models.py:10 assets/models/_user.py:33
#: assets/models/asset/common.py:81 assets/models/asset/common.py:91 #: assets/models/asset/common.py:81 assets/models/asset/common.py:91
#: assets/models/base.py:59 assets/models/cmd_filter.py:25 #: assets/models/base.py:57 assets/models/cmd_filter.py:25
#: assets/models/domain.py:24 assets/models/group.py:20 #: assets/models/domain.py:24 assets/models/group.py:20
#: assets/models/label.py:17 assets/models/platform.py:22 #: assets/models/label.py:17 assets/models/platform.py:22
#: assets/models/platform.py:68 assets/serializers/asset/common.py:86 #: assets/models/platform.py:68 assets/serializers/asset/common.py:86
@ -60,7 +60,7 @@ msgstr "アクティブ"
#: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40 #: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40
#: assets/models/asset/common.py:100 assets/models/automations/base.py:26 #: assets/models/asset/common.py:100 assets/models/automations/base.py:26
#: assets/models/backup.py:30 assets/models/base.py:66 #: assets/models/backup.py:30 assets/models/base.py:65
#: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88 #: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88
#: assets/models/domain.py:25 assets/models/domain.py:69 #: assets/models/domain.py:25 assets/models/domain.py:69
#: assets/models/group.py:23 assets/models/label.py:22 #: assets/models/group.py:23 assets/models/label.py:22
@ -68,7 +68,7 @@ msgstr "アクティブ"
#: ops/models/playbook.py:25 orgs/models.py:74 #: ops/models/playbook.py:25 orgs/models.py:74
#: perms/models/asset_permission.py:84 rbac/models/role.py:37 #: perms/models/asset_permission.py:84 rbac/models/role.py:37
#: settings/models.py:38 terminal/models/applet/applet.py:28 #: settings/models.py:38 terminal/models/applet/applet.py:28
#: terminal/models/applet/applet.py:58 terminal/models/applet/host.py:34 #: terminal/models/applet/applet.py:61 terminal/models/applet/host.py:104
#: terminal/models/component/endpoint.py:24 #: terminal/models/component/endpoint.py:24
#: terminal/models/component/endpoint.py:97 #: terminal/models/component/endpoint.py:97
#: terminal/models/component/storage.py:28 #: terminal/models/component/storage.py:28
@ -129,14 +129,14 @@ msgstr "レビュー担当者"
msgid "Login acl" msgid "Login acl"
msgstr "ログインacl" msgstr "ログインacl"
#: acls/models/login_asset_acl.py:21 assets/models/account.py:57 #: acls/models/login_asset_acl.py:21 assets/models/account.py:59
#: authentication/models/connection_token.py:33 ops/models/base.py:18 #: authentication/models/connection_token.py:33 ops/models/base.py:18
#: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87 #: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87
#: xpack/plugins/cloud/serializers/task.py:65 #: xpack/plugins/cloud/serializers/task.py:65
msgid "Account" msgid "Account"
msgstr "アカウント" msgstr "アカウント"
#: acls/models/login_asset_acl.py:22 assets/models/account.py:47 #: acls/models/login_asset_acl.py:22 assets/models/account.py:49
#: assets/models/asset/common.py:83 assets/models/asset/common.py:227 #: assets/models/asset/common.py:83 assets/models/asset/common.py:227
#: assets/models/cmd_filter.py:36 assets/models/gathered_user.py:14 #: assets/models/cmd_filter.py:36 assets/models/gathered_user.py:14
#: assets/serializers/account/account.py:58 assets/serializers/label.py:30 #: assets/serializers/account/account.py:58 assets/serializers/label.py:30
@ -164,7 +164,7 @@ msgstr "コンマ区切り文字列の形式。* はすべて一致すること
#: acls/serializers/login_acl.py:15 acls/serializers/login_asset_acl.py:18 #: acls/serializers/login_acl.py:15 acls/serializers/login_asset_acl.py:18
#: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34 #: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34
#: assets/models/base.py:60 assets/models/gathered_user.py:15 #: assets/models/base.py:58 assets/models/gathered_user.py:15
#: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27 #: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27
#: authentication/models/temp_token.py:9 #: authentication/models/temp_token.py:9
#: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_different_city.html:9
@ -210,7 +210,7 @@ msgstr ""
"ション: {}" "ション: {}"
#: acls/serializers/login_asset_acl.py:84 #: acls/serializers/login_asset_acl.py:84
#: tickets/serializers/ticket/ticket.py:85 #: tickets/serializers/ticket/ticket.py:86
msgid "The organization `{}` does not exist" msgid "The organization `{}` does not exist"
msgstr "組織 '{}'は存在しません" msgstr "組織 '{}'は存在しません"
@ -255,7 +255,7 @@ msgstr "カテゴリ"
#: assets/models/platform.py:70 assets/serializers/asset/common.py:63 #: assets/models/platform.py:70 assets/serializers/asset/common.py:63
#: assets/serializers/platform.py:75 terminal/models/applet/applet.py:24 #: assets/serializers/platform.py:75 terminal/models/applet/applet.py:24
#: terminal/models/component/storage.py:57 #: terminal/models/component/storage.py:57
#: terminal/models/component/storage.py:142 terminal/serializers/applet.py:20 #: terminal/models/component/storage.py:142 terminal/serializers/applet.py:33
#: tickets/models/comment.py:26 tickets/models/flow.py:57 #: tickets/models/comment.py:26 tickets/models/flow.py:57
#: tickets/models/ticket/apply_application.py:17 #: tickets/models/ticket/apply_application.py:17
#: tickets/models/ticket/general.py:273 #: tickets/models/ticket/general.py:273
@ -303,7 +303,7 @@ msgstr "アプリ資産"
msgid "{} disabled" msgid "{} disabled"
msgstr "無効" msgstr "無効"
#: assets/const/account.py:6 assets/tasks/const.py:51 audits/const.py:5 #: assets/const/account.py:6 audits/const.py:5
#: common/utils/ip/geoip/utils.py:31 common/utils/ip/geoip/utils.py:37 #: common/utils/ip/geoip/utils.py:31 common/utils/ip/geoip/utils.py:37
#: common/utils/ip/utils.py:84 #: common/utils/ip/utils.py:84
msgid "Unknown" msgid "Unknown"
@ -313,14 +313,14 @@ msgstr "不明"
msgid "Ok" msgid "Ok"
msgstr "OK" msgstr "OK"
#: assets/const/account.py:8 audits/models.py:118 common/const/choices.py:18 #: assets/const/account.py:8 audits/models.py:118 common/const/choices.py:19
#: xpack/plugins/change_auth_plan/serializers/asset.py:190 #: xpack/plugins/change_auth_plan/serializers/asset.py:190
#: xpack/plugins/cloud/const.py:33 #: xpack/plugins/cloud/const.py:33
msgid "Failed" msgid "Failed"
msgstr "失敗しました" msgstr "失敗しました"
#: assets/const/account.py:12 assets/models/_user.py:35 #: assets/const/account.py:12 assets/models/_user.py:35
#: assets/models/base.py:53 assets/models/domain.py:71 #: assets/models/base.py:52 assets/models/domain.py:71
#: assets/serializers/base.py:15 audits/signal_handlers.py:50 #: assets/serializers/base.py:15 audits/signal_handlers.py:50
#: authentication/confirm/password.py:9 authentication/forms.py:32 #: authentication/confirm/password.py:9 authentication/forms.py:32
#: authentication/templates/authentication/login.html:228 #: authentication/templates/authentication/login.html:228
@ -337,19 +337,19 @@ msgstr "失敗しました"
msgid "Password" msgid "Password"
msgstr "パスワード" msgstr "パスワード"
#: assets/const/account.py:13 assets/models/base.py:54 #: assets/const/account.py:13 assets/models/base.py:53
#, fuzzy #, fuzzy
#| msgid "SSH Key" #| msgid "SSH Key"
msgid "SSH key" msgid "SSH key"
msgstr "SSHキー" msgstr "SSHキー"
#: assets/const/account.py:14 assets/models/base.py:55 #: assets/const/account.py:14 assets/models/base.py:54
#: authentication/models/access_key.py:31 #: authentication/models/access_key.py:31
msgid "Access key" msgid "Access key"
msgstr "アクセスキー" msgstr "アクセスキー"
#: assets/const/account.py:15 assets/models/_user.py:38 #: assets/const/account.py:15 assets/models/_user.py:38
#: assets/models/base.py:56 authentication/models/sso_token.py:13 #: assets/models/base.py:55 authentication/models/sso_token.py:13
msgid "Token" msgid "Token"
msgstr "トークン" msgstr "トークン"
@ -417,7 +417,7 @@ msgid "Replace (The key generated by JumpServer) "
msgstr "置換(JumpServerによって生成された鍵)" msgstr "置換(JumpServerによって生成された鍵)"
#: assets/const/category.py:11 settings/serializers/auth/radius.py:14 #: assets/const/category.py:11 settings/serializers/auth/radius.py:14
#: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:56 #: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:59
#: terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:12
#: xpack/plugins/cloud/serializers/account_attrs.py:72 #: xpack/plugins/cloud/serializers/account_attrs.py:72
msgid "Host" msgid "Host"
@ -499,22 +499,20 @@ msgstr "SSH秘密鍵"
msgid "SSH public key" msgid "SSH public key"
msgstr "SSHパブリックキー" msgstr "SSHパブリックキー"
#: assets/models/_user.py:41 assets/models/automations/base.py:87 #: assets/models/_user.py:41 assets/models/automations/base.py:96
#: assets/models/base.py:67 assets/models/domain.py:26 #: assets/models/domain.py:26 assets/models/gathered_user.py:19
#: assets/models/gathered_user.py:19 assets/models/group.py:22 #: assets/models/group.py:22 common/db/models.py:76 common/mixins/models.py:50
#: common/db/models.py:76 common/mixins/models.py:50 ops/models/base.py:53 #: ops/models/base.py:53 orgs/models.py:73 perms/models/asset_permission.py:82
#: orgs/models.py:73 perms/models/asset_permission.py:82
#: users/models/group.py:18 users/models/user.py:927 #: users/models/group.py:18 users/models/user.py:927
msgid "Date created" msgid "Date created"
msgstr "作成された日付" msgstr "作成された日付"
#: assets/models/_user.py:42 assets/models/base.py:68 #: assets/models/_user.py:42 assets/models/gathered_user.py:20
#: assets/models/gathered_user.py:20 common/db/models.py:77 #: common/db/models.py:77 common/mixins/models.py:51
#: common/mixins/models.py:51
msgid "Date updated" msgid "Date updated"
msgstr "更新日" msgstr "更新日"
#: assets/models/_user.py:43 assets/models/base.py:69 #: assets/models/_user.py:43 assets/models/base.py:66
#: assets/models/cmd_filter.py:44 assets/models/cmd_filter.py:91 #: assets/models/cmd_filter.py:44 assets/models/cmd_filter.py:91
#: assets/models/group.py:21 common/db/models.py:74 common/mixins/models.py:49 #: assets/models/group.py:21 common/db/models.py:74 common/mixins/models.py:49
#: orgs/models.py:71 perms/models/asset_permission.py:81 #: orgs/models.py:71 perms/models/asset_permission.py:81
@ -582,34 +580,34 @@ msgstr "システムユーザー"
msgid "Can match system user" msgid "Can match system user"
msgstr "システムユーザーに一致できます" msgstr "システムユーザーに一致できます"
#: assets/models/account.py:51 #: assets/models/account.py:53
#, fuzzy #, fuzzy
#| msgid "Switch from" #| msgid "Switch from"
msgid "Su from" msgid "Su from"
msgstr "から切り替え" msgstr "から切り替え"
#: assets/models/account.py:53 settings/serializers/auth/cas.py:18 #: assets/models/account.py:55 settings/serializers/auth/cas.py:18
#: terminal/models/applet/applet.py:22 #: terminal/models/applet/applet.py:22
msgid "Version" msgid "Version"
msgstr "バージョン" msgstr "バージョン"
#: assets/models/account.py:63 #: assets/models/account.py:65
msgid "Can view asset account secret" msgid "Can view asset account secret"
msgstr "資産アカウントの秘密を表示できます" msgstr "資産アカウントの秘密を表示できます"
#: assets/models/account.py:64 #: assets/models/account.py:66
msgid "Can change asset account secret" msgid "Can change asset account secret"
msgstr "資産口座の秘密を変更できます" msgstr "資産口座の秘密を変更できます"
#: assets/models/account.py:65 #: assets/models/account.py:67
msgid "Can view asset history account" msgid "Can view asset history account"
msgstr "資産履歴アカウントを表示できます" msgstr "資産履歴アカウントを表示できます"
#: assets/models/account.py:66 #: assets/models/account.py:68
msgid "Can view asset history account secret" msgid "Can view asset history account secret"
msgstr "資産履歴アカウントパスワードを表示できます" msgstr "資産履歴アカウントパスワードを表示できます"
#: assets/models/account.py:89 assets/serializers/account/account.py:13 #: assets/models/account.py:91 assets/serializers/account/account.py:13
#, fuzzy #, fuzzy
#| msgid "Account name" #| msgid "Account name"
msgid "Account template" msgid "Account template"
@ -642,9 +640,9 @@ msgid "Nodes"
msgstr "ノード" msgstr "ノード"
#: assets/models/asset/common.py:98 assets/models/automations/base.py:25 #: assets/models/asset/common.py:98 assets/models/automations/base.py:25
#: assets/models/cmd_filter.py:39 assets/models/domain.py:70 #: assets/models/base.py:64 assets/models/cmd_filter.py:39
#: assets/models/label.py:21 terminal/models/applet/applet.py:25 #: assets/models/domain.py:70 assets/models/label.py:21
#: users/serializers/user.py:147 #: terminal/models/applet/applet.py:25 users/serializers/user.py:147
msgid "Is active" msgid "Is active"
msgstr "アクティブです。" msgstr "アクティブです。"
@ -661,7 +659,9 @@ msgid "Can test asset connectivity"
msgstr "資産接続をテストできます" msgstr "資産接続をテストできます"
#: assets/models/asset/common.py:232 #: assets/models/asset/common.py:232
msgid "Can push system user to asset" #, fuzzy
#| msgid "Can push system user to asset"
msgid "Can push account to asset"
msgstr "システムユーザーを資産にプッシュできます" msgstr "システムユーザーを資産にプッシュできます"
#: assets/models/asset/common.py:233 #: assets/models/asset/common.py:233
@ -677,6 +677,7 @@ msgid "Move asset to node"
msgstr "アセットをノードに移動する" msgstr "アセットをノードに移動する"
#: assets/models/asset/web.py:9 audits/models.py:111 #: assets/models/asset/web.py:9 audits/models.py:111
#: terminal/serializers/applet_host.py:24
msgid "Disabled" msgid "Disabled"
msgstr "無効" msgstr "無効"
@ -723,15 +724,15 @@ msgstr "アカウント"
msgid "Assets" msgid "Assets"
msgstr "資産" msgstr "資産"
#: assets/models/automations/base.py:77 assets/models/automations/base.py:84 #: assets/models/automations/base.py:86 assets/models/automations/base.py:93
#, fuzzy #, fuzzy
#| msgid "Automatic managed" #| msgid "Automatic managed"
msgid "Automation task" msgid "Automation task"
msgstr "自動管理" msgstr "自動管理"
#: assets/models/automations/base.py:88 assets/models/backup.py:77 #: assets/models/automations/base.py:97 assets/models/backup.py:77
#: audits/models.py:44 ops/models/base.py:54 #: audits/models.py:44 ops/models/base.py:54
#: perms/models/asset_permission.py:76 terminal/models/applet/host.py:32 #: perms/models/asset_permission.py:76 terminal/models/applet/host.py:102
#: terminal/models/session/session.py:43 #: terminal/models/session/session.py:43
#: tickets/models/ticket/apply_application.py:28 #: tickets/models/ticket/apply_application.py:28
#: tickets/models/ticket/apply_asset.py:21 #: tickets/models/ticket/apply_asset.py:21
@ -741,32 +742,32 @@ msgstr "自動管理"
msgid "Date start" msgid "Date start"
msgstr "開始日" msgstr "開始日"
#: assets/models/automations/base.py:89 #: assets/models/automations/base.py:98
#: assets/models/automations/change_secret.py:58 ops/models/base.py:55 #: assets/models/automations/change_secret.py:58 ops/models/base.py:55
#: terminal/models/applet/host.py:33 #: terminal/models/applet/host.py:103
msgid "Date finished" msgid "Date finished"
msgstr "終了日" msgstr "終了日"
#: assets/models/automations/base.py:91 #: assets/models/automations/base.py:100
#, fuzzy #, fuzzy
#| msgid "Relation snapshot" #| msgid "Relation snapshot"
msgid "Automation snapshot" msgid "Automation snapshot"
msgstr "製造オーダスナップショット" msgstr "製造オーダスナップショット"
#: assets/models/automations/base.py:95 assets/models/backup.py:88 #: assets/models/automations/base.py:104 assets/models/backup.py:88
#: assets/serializers/account/backup.py:36 #: assets/serializers/account/backup.py:36
#: xpack/plugins/change_auth_plan/models/base.py:121 #: xpack/plugins/change_auth_plan/models/base.py:121
#: xpack/plugins/change_auth_plan/serializers/base.py:78 #: xpack/plugins/change_auth_plan/serializers/base.py:78
msgid "Trigger mode" msgid "Trigger mode"
msgstr "トリガーモード" msgstr "トリガーモード"
#: assets/models/automations/base.py:99 #: assets/models/automations/base.py:108
#, fuzzy #, fuzzy
#| msgid "Command execution" #| msgid "Command execution"
msgid "Automation task execution" msgid "Automation task execution"
msgstr "コマンド実行" msgstr "コマンド実行"
#: assets/models/automations/change_secret.py:15 assets/models/base.py:62 #: assets/models/automations/change_secret.py:15 assets/models/base.py:60
#, fuzzy #, fuzzy
#| msgid "Secret key" #| msgid "Secret key"
msgid "Secret type" msgid "Secret type"
@ -779,7 +780,7 @@ msgid "Secret strategy"
msgstr "SSHキー戦略" msgstr "SSHキー戦略"
#: assets/models/automations/change_secret.py:21 #: assets/models/automations/change_secret.py:21
#: assets/models/automations/change_secret.py:56 assets/models/base.py:64 #: assets/models/automations/change_secret.py:56 assets/models/base.py:62
#: assets/serializers/account/base.py:17 #: assets/serializers/account/base.py:17
#: authentication/models/connection_token.py:34 #: authentication/models/connection_token.py:34
#: authentication/models/temp_token.py:10 #: authentication/models/temp_token.py:10
@ -825,7 +826,7 @@ msgstr "ひみつ"
msgid "Date started" msgid "Date started"
msgstr "開始日" msgstr "開始日"
#: assets/models/automations/change_secret.py:60 common/const/choices.py:19 #: assets/models/automations/change_secret.py:60 common/const/choices.py:20
#, fuzzy #, fuzzy
#| msgid "WeCom Error" #| msgid "WeCom Error"
msgid "Error" msgid "Error"
@ -855,6 +856,12 @@ msgstr "資産ユーザーの収集"
msgid "Gather asset facts" msgid "Gather asset facts"
msgstr "資産ユーザーの収集" msgstr "資産ユーザーの収集"
#: assets/models/automations/ping.py:15
#, fuzzy
#| msgid "Login asset"
msgid "Ping asset"
msgstr "ログイン資産"
#: assets/models/automations/push_account.py:16 #: assets/models/automations/push_account.py:16
#, fuzzy #, fuzzy
#| msgid "Is service account" #| msgid "Is service account"
@ -902,15 +909,15 @@ msgstr "成功は"
msgid "Account backup execution" msgid "Account backup execution"
msgstr "アカウントバックアップの実行" msgstr "アカウントバックアップの実行"
#: assets/models/base.py:30 assets/serializers/domain.py:42 #: assets/models/base.py:29 assets/serializers/domain.py:42
msgid "Connectivity" msgid "Connectivity"
msgstr "接続性" msgstr "接続性"
#: assets/models/base.py:32 authentication/models/temp_token.py:12 #: assets/models/base.py:31 authentication/models/temp_token.py:12
msgid "Date verified" msgid "Date verified"
msgstr "確認済みの日付" msgstr "確認済みの日付"
#: assets/models/base.py:65 #: assets/models/base.py:63
msgid "Privileged" msgid "Privileged"
msgstr "" msgstr ""
@ -1079,6 +1086,7 @@ msgid "Setting"
msgstr "設定" msgstr "設定"
#: assets/models/platform.py:43 audits/models.py:112 settings/models.py:37 #: assets/models/platform.py:43 audits/models.py:112 settings/models.py:37
#: terminal/serializers/applet_host.py:25
msgid "Enabled" msgid "Enabled"
msgstr "有効化" msgstr "有効化"
@ -1415,60 +1423,18 @@ msgstr "パスワードには `'` を含まない"
msgid "Password can not contains `\"` " msgid "Password can not contains `\"` "
msgstr "パスワードには `\"` を含まない" msgstr "パスワードには `\"` を含まない"
#: assets/tasks/account_connectivity.py:30 #: assets/tasks/gather_facts.py:25
msgid "The asset {} system platform {} does not support run Ansible tasks"
msgstr ""
"資産 {} システムプラットフォーム {} はAnsibleタスクの実行をサポートしていませ"
"ん。"
#: assets/tasks/account_connectivity.py:108
msgid "Test account connectivity: "
msgstr "テストアカウント接続:"
#: assets/tasks/asset_connectivity.py:49
msgid "Test assets connectivity. "
msgstr "資産の接続性をテストします。"
#: assets/tasks/asset_connectivity.py:94 assets/tasks/asset_connectivity.py:107
msgid "Test assets connectivity: "
msgstr "資産の接続性のテスト:"
#: assets/tasks/asset_connectivity.py:121
msgid "Test if the assets under the node are connectable: "
msgstr "ノードの下のアセットが接続可能かどうかをテストします。"
#: assets/tasks/const.py:49
msgid "Unreachable"
msgstr "達成できない"
#: assets/tasks/const.py:50
msgid "Reachable"
msgstr "接続可能"
#: assets/tasks/gather_asset_hardware_info.py:46
msgid "Get asset info failed: {}"
msgstr "資産情報の取得に失敗しました: {}"
#: assets/tasks/gather_asset_hardware_info.py:97
msgid "Update some assets hardware info. " msgid "Update some assets hardware info. "
msgstr "一部の資産ハードウェア情報を更新します。" msgstr "一部の資産ハードウェア情報を更新します。"
#: assets/tasks/gather_asset_hardware_info.py:118 #: assets/tasks/gather_facts.py:48
msgid "Update asset hardware info: "
msgstr "資産ハードウェア情報の更新:"
#: assets/tasks/gather_asset_hardware_info.py:124
msgid "Update assets hardware info: " msgid "Update assets hardware info: "
msgstr "資産のハードウェア情報を更新する:" msgstr "資産のハードウェア情報を更新する:"
#: assets/tasks/gather_asset_hardware_info.py:146 #: assets/tasks/gather_facts.py:58
msgid "Update node asset hardware information: " msgid "Update node asset hardware information: "
msgstr "ノード資産のハードウェア情報を更新します。" msgstr "ノード資産のハードウェア情報を更新します。"
#: assets/tasks/gather_asset_users.py:110
msgid "Gather assets users"
msgstr "資産ユーザーの収集"
#: assets/tasks/nodes_amount.py:29 #: assets/tasks/nodes_amount.py:29
msgid "" msgid ""
"The task of self-checking is already running and cannot be started repeatedly" "The task of self-checking is already running and cannot be started repeatedly"
@ -1476,6 +1442,24 @@ msgstr ""
"セルフチェックのタスクはすでに実行されており、繰り返し開始することはできませ" "セルフチェックのタスクはすでに実行されており、繰り返し開始することはできませ"
"ん" "ん"
#: assets/tasks/ping.py:20 assets/tasks/ping.py:38
#, fuzzy
#| msgid "Test assets connectivity. "
msgid "Test assets connectivity "
msgstr "資産の接続性をテストします。"
#: assets/tasks/ping.py:48
#, fuzzy
#| msgid "Test if the assets under the node are connectable: "
msgid "Test if the assets under the node are connectable "
msgstr "ノードの下のアセットが接続可能かどうかをテストします。"
#: assets/tasks/push_account.py:36
#, fuzzy
#| msgid "Create account successfully"
msgid "Push accounts to assets"
msgstr "アカウントを正常に作成"
#: assets/tasks/utils.py:17 #: assets/tasks/utils.py:17
msgid "Asset has been disabled, skipped: {}" msgid "Asset has been disabled, skipped: {}"
msgstr "資産が無効化されました。スキップ: {}" msgstr "資産が無効化されました。スキップ: {}"
@ -1492,6 +1476,12 @@ msgstr "セキュリティのために、ユーザー {} をプッシュしな
msgid "No assets matched, stop task" msgid "No assets matched, stop task"
msgstr "一致する資産がない、タスクを停止" msgstr "一致する資産がない、タスクを停止"
#: assets/tasks/verify_account.py:36
#, fuzzy
#| msgid "Test account connectivity: "
msgid "Verify accounts connectivity"
msgstr "テストアカウント接続:"
#: audits/apps.py:9 #: audits/apps.py:9
msgid "Audits" msgid "Audits"
msgstr "監査" msgstr "監査"
@ -1539,7 +1529,7 @@ msgstr "操作"
msgid "Filename" msgid "Filename"
msgstr "ファイル名" msgstr "ファイル名"
#: audits/models.py:43 audits/models.py:117 common/const/choices.py:17 #: audits/models.py:43 audits/models.py:117 common/const/choices.py:18
#: terminal/models/session/sharing.py:104 tickets/views/approve.py:114 #: terminal/models/session/sharing.py:104 tickets/views/approve.py:114
#: xpack/plugins/change_auth_plan/serializers/asset.py:189 #: xpack/plugins/change_auth_plan/serializers/asset.py:189
msgid "Success" msgid "Success"
@ -1619,8 +1609,8 @@ msgid "MFA"
msgstr "MFA" msgstr "MFA"
#: audits/models.py:128 ops/models/base.py:48 #: audits/models.py:128 ops/models/base.py:48
#: terminal/models/applet/applet.py:57 terminal/models/applet/host.py:19 #: terminal/models/applet/applet.py:60 terminal/models/applet/host.py:101
#: terminal/models/applet/host.py:31 terminal/models/component/status.py:33 #: terminal/models/component/status.py:33 terminal/serializers/applet.py:22
#: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171 #: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171
#: xpack/plugins/cloud/models.py:223 #: xpack/plugins/cloud/models.py:223
msgid "Status" msgid "Status"
@ -2144,13 +2134,13 @@ msgstr "アセットがアクティブ化されていません"
msgid "No account" msgid "No account"
msgstr "ログインacl" msgstr "ログインacl"
#: authentication/models/connection_token.py:103 #: authentication/models/connection_token.py:101
msgid "User has no permission to access asset or permission expired" msgid "User has no permission to access asset or permission expired"
msgstr "" msgstr ""
"ユーザーがアセットにアクセスする権限を持っていないか、権限の有効期限が切れて" "ユーザーがアセットにアクセスする権限を持っていないか、権限の有効期限が切れて"
"います" "います"
#: authentication/models/connection_token.py:145 #: authentication/models/connection_token.py:144
msgid "Super connection token" msgid "Super connection token"
msgstr "スーパー接続トークン" msgstr "スーパー接続トークン"
@ -2576,15 +2566,19 @@ msgstr "手動トリガー"
msgid "Timing trigger" msgid "Timing trigger"
msgstr "タイミングトリガー" msgstr "タイミングトリガー"
#: common/const/choices.py:15 tickets/const.py:29 tickets/const.py:37 #: common/const/choices.py:15 xpack/plugins/change_auth_plan/models/base.py:183
msgid "Ready"
msgstr "の準備を"
#: common/const/choices.py:16 tickets/const.py:29 tickets/const.py:37
msgid "Pending" msgid "Pending"
msgstr "未定" msgstr "未定"
#: common/const/choices.py:16 #: common/const/choices.py:17
msgid "Running" msgid "Running"
msgstr "" msgstr ""
#: common/const/choices.py:20 #: common/const/choices.py:21
#, fuzzy #, fuzzy
#| msgid "Cancel" #| msgid "Cancel"
msgid "Canceled" msgid "Canceled"
@ -2653,6 +2647,12 @@ msgstr "解析ファイルエラー: {}"
msgid "Children" msgid "Children"
msgstr "" msgstr ""
#: common/drf/serializers/common.py:94
#, fuzzy
#| msgid "Filename"
msgid "File"
msgstr "ファイル名"
#: common/exceptions.py:15 #: common/exceptions.py:15
#, python-format #, python-format
msgid "%s object does not exist." msgid "%s object does not exist."
@ -3091,7 +3091,7 @@ msgstr "アプリ組織"
#: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:88 #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:88
#: rbac/const.py:7 rbac/models/rolebinding.py:48 #: rbac/const.py:7 rbac/models/rolebinding.py:48
#: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:62 #: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:62
#: tickets/models/ticket/general.py:300 tickets/serializers/ticket/ticket.py:71 #: tickets/models/ticket/general.py:300 tickets/serializers/ticket/ticket.py:72
msgid "Organization" msgid "Organization"
msgstr "組織" msgstr "組織"
@ -4928,50 +4928,52 @@ msgstr "認証アドレス"
msgid "Tags" msgid "Tags"
msgstr "" msgstr ""
#: terminal/models/applet/applet.py:29 terminal/serializers/storage.py:157 #: terminal/models/applet/applet.py:31 terminal/serializers/storage.py:157
msgid "Hosts" msgid "Hosts"
msgstr "ホスト" msgstr "ホスト"
#: terminal/models/applet/applet.py:55 terminal/models/applet/host.py:21 #: terminal/models/applet/applet.py:58 terminal/models/applet/host.py:28
#, fuzzy #, fuzzy
#| msgid "Apply assets" #| msgid "Apply assets"
msgid "Applet" msgid "Applet"
msgstr "資産の適用" msgstr "資産の適用"
#: terminal/models/applet/host.py:14 #: terminal/models/applet/host.py:19 terminal/serializers/applet_host.py:36
#, fuzzy
#| msgid "Verify auth"
msgid "Account automation"
msgstr "パスワード/キーの確認"
#: terminal/models/applet/host.py:15 terminal/serializers/applet.py:66
#, fuzzy #, fuzzy
#| msgid "More login options" #| msgid "More login options"
msgid "Deploy options" msgid "Deploy options"
msgstr "その他のログインオプション" msgstr "その他のログインオプション"
#: terminal/models/applet/host.py:16 #: terminal/models/applet/host.py:20
msgid "Inited" msgid "Inited"
msgstr "" msgstr ""
#: terminal/models/applet/host.py:17 #: terminal/models/applet/host.py:21
#, fuzzy #, fuzzy
#| msgid "Date finished" #| msgid "Date finished"
msgid "Date inited" msgid "Date inited"
msgstr "終了日" msgstr "終了日"
#: terminal/models/applet/host.py:18 #: terminal/models/applet/host.py:22
#, fuzzy #, fuzzy
#| msgid "Date sync" #| msgid "Date sync"
msgid "Date synced" msgid "Date synced"
msgstr "日付の同期" msgstr "日付の同期"
#: terminal/models/applet/host.py:30 #: terminal/models/applet/host.py:25 terminal/models/component/terminal.py:183
msgid "Terminal"
msgstr "ターミナル"
#: terminal/models/applet/host.py:99
#, fuzzy #, fuzzy
#| msgid "Host" #| msgid "Host"
msgid "Hosting" msgid "Hosting"
msgstr "ホスト" msgstr "ホスト"
#: terminal/models/applet/host.py:100
msgid "Initial"
msgstr ""
#: terminal/models/component/endpoint.py:14 #: terminal/models/component/endpoint.py:14
msgid "HTTPS Port" msgid "HTTPS Port"
msgstr "HTTPS ポート" msgstr "HTTPS ポート"
@ -5076,10 +5078,6 @@ msgstr "再生ストレージ"
msgid "type" msgid "type"
msgstr "タイプ" msgstr "タイプ"
#: terminal/models/component/terminal.py:183
msgid "Terminal"
msgstr "ターミナル"
#: terminal/models/component/terminal.py:185 #: terminal/models/component/terminal.py:185
msgid "Can view terminal config" msgid "Can view terminal config"
msgstr "ターミナル構成を表示できます" msgstr "ターミナル構成を表示できます"
@ -5196,49 +5194,61 @@ msgstr "レベル"
msgid "Batch danger command alert" msgid "Batch danger command alert"
msgstr "一括危険コマンド警告" msgstr "一括危険コマンド警告"
#: terminal/serializers/applet.py:19 #: terminal/serializers/applet.py:16
#, fuzzy
#| msgid "Public key"
msgid "Published"
msgstr "公開キー"
#: terminal/serializers/applet.py:17
#, fuzzy
#| msgid "Finished"
msgid "Unpublished"
msgstr "終了"
#: terminal/serializers/applet.py:18
#, fuzzy
#| msgid "Phone not set"
msgid "Not match"
msgstr "電話が設定されていない"
#: terminal/serializers/applet.py:32
msgid "Icon" msgid "Icon"
msgstr "" msgstr ""
#: terminal/serializers/applet.py:53 #: terminal/serializers/applet_host.py:20
#, fuzzy
#| msgid "Phone not set"
msgid "Not set"
msgstr "電話が設定されていない"
#: terminal/serializers/applet.py:54
#, fuzzy #, fuzzy
#| msgid "Session" #| msgid "Session"
msgid "Per Session" msgid "Per Session"
msgstr "セッション" msgstr "セッション"
#: terminal/serializers/applet.py:55 #: terminal/serializers/applet_host.py:21
msgid "Per Device" msgid "Per Device"
msgstr "" msgstr ""
#: terminal/serializers/applet.py:57 #: terminal/serializers/applet_host.py:27
#, fuzzy #, fuzzy
#| msgid "License" #| msgid "License"
msgid "RDS Licensing" msgid "RDS Licensing"
msgstr "ライセンス" msgstr "ライセンス"
#: terminal/serializers/applet.py:58 #: terminal/serializers/applet_host.py:28
msgid "RDS License Server" msgid "RDS License Server"
msgstr "" msgstr ""
#: terminal/serializers/applet.py:59 #: terminal/serializers/applet_host.py:29
msgid "RDS Licensing Mode" msgid "RDS Licensing Mode"
msgstr "" msgstr ""
#: terminal/serializers/applet.py:60 #: terminal/serializers/applet_host.py:30
msgid "RDS fSingleSessionPerUser" msgid "RDS fSingleSessionPerUser"
msgstr "" msgstr ""
#: terminal/serializers/applet.py:61 #: terminal/serializers/applet_host.py:31
msgid "RDS Max Disconnection Time" msgid "RDS Max Disconnection Time"
msgstr "" msgstr ""
#: terminal/serializers/applet.py:62 #: terminal/serializers/applet_host.py:32
msgid "RDS Remote App Logoff Time Limit" msgid "RDS Remote App Logoff Time Limit"
msgstr "" msgstr ""
@ -5673,7 +5683,7 @@ msgstr "有効期限は開始日より大きくする必要があります"
msgid "Permission named `{}` already exists" msgid "Permission named `{}` already exists"
msgstr "'{}'という名前の権限は既に存在します" msgstr "'{}'という名前の権限は既に存在します"
#: tickets/serializers/ticket/ticket.py:99 #: tickets/serializers/ticket/ticket.py:101
msgid "The ticket flow `{}` does not exist" msgid "The ticket flow `{}` does not exist"
msgstr "チケットフロー '{}'が存在しない" msgstr "チケットフロー '{}'が存在しない"
@ -6377,10 +6387,6 @@ msgstr "公開鍵をnull、exitに設定することはできません。"
msgid "Change auth plan snapshot" msgid "Change auth plan snapshot"
msgstr "計画スナップショットの暗号化" msgstr "計画スナップショットの暗号化"
#: xpack/plugins/change_auth_plan/models/base.py:183
msgid "Ready"
msgstr "の準備を"
#: xpack/plugins/change_auth_plan/models/base.py:184 #: xpack/plugins/change_auth_plan/models/base.py:184
msgid "Preflight check" msgid "Preflight check"
msgstr "プリフライトチェック" msgstr "プリフライトチェック"
@ -6991,11 +6997,11 @@ msgstr "テーマ"
msgid "Interface setting" msgid "Interface setting"
msgstr "インターフェイスの設定" msgstr "インターフェイスの設定"
#: xpack/plugins/license/api.py:50 #: xpack/plugins/license/api.py:53
msgid "License import successfully" msgid "License import successfully"
msgstr "ライセンスのインポートに成功" msgstr "ライセンスのインポートに成功"
#: xpack/plugins/license/api.py:51 #: xpack/plugins/license/api.py:54
msgid "License is invalid" msgid "License is invalid"
msgstr "ライセンスが無効です" msgstr "ライセンスが無効です"
@ -7019,6 +7025,34 @@ msgstr "究極のエディション"
msgid "Community edition" msgid "Community edition"
msgstr "コミュニティ版" msgstr "コミュニティ版"
#, fuzzy
#~| msgid "Verify auth"
#~ msgid "Account automation"
#~ msgstr "パスワード/キーの確認"
#~ msgid "The asset {} system platform {} does not support run Ansible tasks"
#~ msgstr ""
#~ "資産 {} システムプラットフォーム {} はAnsibleタスクの実行をサポートしてい"
#~ "ません。"
#~ msgid "Test assets connectivity: "
#~ msgstr "資産の接続性のテスト:"
#~ msgid "Unreachable"
#~ msgstr "達成できない"
#~ msgid "Reachable"
#~ msgstr "接続可能"
#~ msgid "Get asset info failed: {}"
#~ msgstr "資産情報の取得に失敗しました: {}"
#~ msgid "Update asset hardware info: "
#~ msgstr "資産ハードウェア情報の更新:"
#~ msgid "Gather assets users"
#~ msgstr "資産ユーザーの収集"
#, fuzzy #, fuzzy
#~| msgid "Automatic managed" #~| msgid "Automatic managed"
#~ msgid "Push automation" #~ msgid "Push automation"

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:08529907ac3879f60c2026f91e7ba3f48a3a7d288f7b29cd35c0f73bc3999c21 oid sha256:0b396cc9a485f6474d14ca30a1a7ba4f954b07754148b964efbb21519c55b280
size 103630 size 102849

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-11-01 15:30+0800\n" "POT-Creation-Date: 2022-11-03 16:00+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"
@ -24,7 +24,7 @@ msgstr "访问控制"
#: acls/models/base.py:25 acls/serializers/login_asset_acl.py:48 #: acls/models/base.py:25 acls/serializers/login_asset_acl.py:48
#: applications/models.py:10 assets/models/_user.py:33 #: applications/models.py:10 assets/models/_user.py:33
#: assets/models/asset/common.py:81 assets/models/asset/common.py:91 #: assets/models/asset/common.py:81 assets/models/asset/common.py:91
#: assets/models/base.py:59 assets/models/cmd_filter.py:25 #: assets/models/base.py:57 assets/models/cmd_filter.py:25
#: assets/models/domain.py:24 assets/models/group.py:20 #: assets/models/domain.py:24 assets/models/group.py:20
#: assets/models/label.py:17 assets/models/platform.py:22 #: assets/models/label.py:17 assets/models/platform.py:22
#: assets/models/platform.py:68 assets/serializers/asset/common.py:86 #: assets/models/platform.py:68 assets/serializers/asset/common.py:86
@ -59,7 +59,7 @@ msgstr "激活中"
#: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40 #: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40
#: assets/models/asset/common.py:100 assets/models/automations/base.py:26 #: assets/models/asset/common.py:100 assets/models/automations/base.py:26
#: assets/models/backup.py:30 assets/models/base.py:66 #: assets/models/backup.py:30 assets/models/base.py:65
#: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88 #: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88
#: assets/models/domain.py:25 assets/models/domain.py:69 #: assets/models/domain.py:25 assets/models/domain.py:69
#: assets/models/group.py:23 assets/models/label.py:22 #: assets/models/group.py:23 assets/models/label.py:22
@ -67,7 +67,7 @@ msgstr "激活中"
#: ops/models/playbook.py:25 orgs/models.py:74 #: ops/models/playbook.py:25 orgs/models.py:74
#: perms/models/asset_permission.py:84 rbac/models/role.py:37 #: perms/models/asset_permission.py:84 rbac/models/role.py:37
#: settings/models.py:38 terminal/models/applet/applet.py:28 #: settings/models.py:38 terminal/models/applet/applet.py:28
#: terminal/models/applet/applet.py:58 terminal/models/applet/host.py:34 #: terminal/models/applet/applet.py:61 terminal/models/applet/host.py:104
#: terminal/models/component/endpoint.py:24 #: terminal/models/component/endpoint.py:24
#: terminal/models/component/endpoint.py:97 #: terminal/models/component/endpoint.py:97
#: terminal/models/component/storage.py:28 #: terminal/models/component/storage.py:28
@ -128,14 +128,14 @@ msgstr "审批人"
msgid "Login acl" msgid "Login acl"
msgstr "登录访问控制" msgstr "登录访问控制"
#: acls/models/login_asset_acl.py:21 assets/models/account.py:57 #: acls/models/login_asset_acl.py:21 assets/models/account.py:59
#: authentication/models/connection_token.py:33 ops/models/base.py:18 #: authentication/models/connection_token.py:33 ops/models/base.py:18
#: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87 #: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87
#: xpack/plugins/cloud/serializers/task.py:65 #: xpack/plugins/cloud/serializers/task.py:65
msgid "Account" msgid "Account"
msgstr "账号" msgstr "账号"
#: acls/models/login_asset_acl.py:22 assets/models/account.py:47 #: acls/models/login_asset_acl.py:22 assets/models/account.py:49
#: assets/models/asset/common.py:83 assets/models/asset/common.py:227 #: assets/models/asset/common.py:83 assets/models/asset/common.py:227
#: assets/models/cmd_filter.py:36 assets/models/gathered_user.py:14 #: assets/models/cmd_filter.py:36 assets/models/gathered_user.py:14
#: assets/serializers/account/account.py:58 assets/serializers/label.py:30 #: assets/serializers/account/account.py:58 assets/serializers/label.py:30
@ -163,7 +163,7 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. "
#: acls/serializers/login_acl.py:15 acls/serializers/login_asset_acl.py:18 #: acls/serializers/login_acl.py:15 acls/serializers/login_asset_acl.py:18
#: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34 #: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34
#: assets/models/base.py:60 assets/models/gathered_user.py:15 #: assets/models/base.py:58 assets/models/gathered_user.py:15
#: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27 #: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27
#: authentication/models/temp_token.py:9 #: authentication/models/temp_token.py:9
#: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_different_city.html:9
@ -206,7 +206,7 @@ msgid ""
msgstr "格式为逗号分隔的字符串, * 表示匹配所有. 可选的协议有: {}" msgstr "格式为逗号分隔的字符串, * 表示匹配所有. 可选的协议有: {}"
#: acls/serializers/login_asset_acl.py:84 #: acls/serializers/login_asset_acl.py:84
#: tickets/serializers/ticket/ticket.py:85 #: tickets/serializers/ticket/ticket.py:86
msgid "The organization `{}` does not exist" msgid "The organization `{}` does not exist"
msgstr "组织 `{}` 不存在" msgstr "组织 `{}` 不存在"
@ -250,7 +250,7 @@ msgstr "类别"
#: assets/models/platform.py:70 assets/serializers/asset/common.py:63 #: assets/models/platform.py:70 assets/serializers/asset/common.py:63
#: assets/serializers/platform.py:75 terminal/models/applet/applet.py:24 #: assets/serializers/platform.py:75 terminal/models/applet/applet.py:24
#: terminal/models/component/storage.py:57 #: terminal/models/component/storage.py:57
#: terminal/models/component/storage.py:142 terminal/serializers/applet.py:20 #: terminal/models/component/storage.py:142 terminal/serializers/applet.py:33
#: tickets/models/comment.py:26 tickets/models/flow.py:57 #: tickets/models/comment.py:26 tickets/models/flow.py:57
#: tickets/models/ticket/apply_application.py:17 #: tickets/models/ticket/apply_application.py:17
#: tickets/models/ticket/general.py:273 #: tickets/models/ticket/general.py:273
@ -296,7 +296,7 @@ msgstr "资产管理"
msgid "{} disabled" msgid "{} disabled"
msgstr "{} 已禁用" msgstr "{} 已禁用"
#: assets/const/account.py:6 assets/tasks/const.py:51 audits/const.py:5 #: assets/const/account.py:6 audits/const.py:5
#: common/utils/ip/geoip/utils.py:31 common/utils/ip/geoip/utils.py:37 #: common/utils/ip/geoip/utils.py:31 common/utils/ip/geoip/utils.py:37
#: common/utils/ip/utils.py:84 #: common/utils/ip/utils.py:84
msgid "Unknown" msgid "Unknown"
@ -306,14 +306,14 @@ msgstr "未知"
msgid "Ok" msgid "Ok"
msgstr "成功" msgstr "成功"
#: assets/const/account.py:8 audits/models.py:118 common/const/choices.py:18 #: assets/const/account.py:8 audits/models.py:118 common/const/choices.py:19
#: xpack/plugins/change_auth_plan/serializers/asset.py:190 #: xpack/plugins/change_auth_plan/serializers/asset.py:190
#: xpack/plugins/cloud/const.py:33 #: xpack/plugins/cloud/const.py:33
msgid "Failed" msgid "Failed"
msgstr "失败" msgstr "失败"
#: assets/const/account.py:12 assets/models/_user.py:35 #: assets/const/account.py:12 assets/models/_user.py:35
#: assets/models/base.py:53 assets/models/domain.py:71 #: assets/models/base.py:52 assets/models/domain.py:71
#: assets/serializers/base.py:15 audits/signal_handlers.py:50 #: assets/serializers/base.py:15 audits/signal_handlers.py:50
#: authentication/confirm/password.py:9 authentication/forms.py:32 #: authentication/confirm/password.py:9 authentication/forms.py:32
#: authentication/templates/authentication/login.html:228 #: authentication/templates/authentication/login.html:228
@ -330,17 +330,17 @@ msgstr "失败"
msgid "Password" msgid "Password"
msgstr "密码" msgstr "密码"
#: assets/const/account.py:13 assets/models/base.py:54 #: assets/const/account.py:13 assets/models/base.py:53
msgid "SSH key" msgid "SSH key"
msgstr "SSH 密钥" msgstr "SSH 密钥"
#: assets/const/account.py:14 assets/models/base.py:55 #: assets/const/account.py:14 assets/models/base.py:54
#: authentication/models/access_key.py:31 #: authentication/models/access_key.py:31
msgid "Access key" msgid "Access key"
msgstr "Access key" msgstr "Access key"
#: assets/const/account.py:15 assets/models/_user.py:38 #: assets/const/account.py:15 assets/models/_user.py:38
#: assets/models/base.py:56 authentication/models/sso_token.py:13 #: assets/models/base.py:55 authentication/models/sso_token.py:13
msgid "Token" msgid "Token"
msgstr "Token" msgstr "Token"
@ -398,7 +398,7 @@ msgid "Replace (The key generated by JumpServer) "
msgstr "替换 (由 JumpServer 生成的密钥)" msgstr "替换 (由 JumpServer 生成的密钥)"
#: assets/const/category.py:11 settings/serializers/auth/radius.py:14 #: assets/const/category.py:11 settings/serializers/auth/radius.py:14
#: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:56 #: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:59
#: terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:12
#: xpack/plugins/cloud/serializers/account_attrs.py:72 #: xpack/plugins/cloud/serializers/account_attrs.py:72
msgid "Host" msgid "Host"
@ -474,22 +474,20 @@ msgstr "SSH 密钥"
msgid "SSH public key" msgid "SSH public key"
msgstr "SSH 公钥" msgstr "SSH 公钥"
#: assets/models/_user.py:41 assets/models/automations/base.py:87 #: assets/models/_user.py:41 assets/models/automations/base.py:96
#: assets/models/base.py:67 assets/models/domain.py:26 #: assets/models/domain.py:26 assets/models/gathered_user.py:19
#: assets/models/gathered_user.py:19 assets/models/group.py:22 #: assets/models/group.py:22 common/db/models.py:76 common/mixins/models.py:50
#: common/db/models.py:76 common/mixins/models.py:50 ops/models/base.py:53 #: ops/models/base.py:53 orgs/models.py:73 perms/models/asset_permission.py:82
#: orgs/models.py:73 perms/models/asset_permission.py:82
#: users/models/group.py:18 users/models/user.py:927 #: users/models/group.py:18 users/models/user.py:927
msgid "Date created" msgid "Date created"
msgstr "创建日期" msgstr "创建日期"
#: assets/models/_user.py:42 assets/models/base.py:68 #: assets/models/_user.py:42 assets/models/gathered_user.py:20
#: assets/models/gathered_user.py:20 common/db/models.py:77 #: common/db/models.py:77 common/mixins/models.py:51
#: common/mixins/models.py:51
msgid "Date updated" msgid "Date updated"
msgstr "更新日期" msgstr "更新日期"
#: assets/models/_user.py:43 assets/models/base.py:69 #: assets/models/_user.py:43 assets/models/base.py:66
#: assets/models/cmd_filter.py:44 assets/models/cmd_filter.py:91 #: assets/models/cmd_filter.py:44 assets/models/cmd_filter.py:91
#: assets/models/group.py:21 common/db/models.py:74 common/mixins/models.py:49 #: assets/models/group.py:21 common/db/models.py:74 common/mixins/models.py:49
#: orgs/models.py:71 perms/models/asset_permission.py:81 #: orgs/models.py:71 perms/models/asset_permission.py:81
@ -557,32 +555,32 @@ msgstr "系统用户"
msgid "Can match system user" msgid "Can match system user"
msgstr "可以匹配系统用户" msgstr "可以匹配系统用户"
#: assets/models/account.py:51 #: assets/models/account.py:53
msgid "Su from" msgid "Su from"
msgstr "切换自" msgstr "切换自"
#: assets/models/account.py:53 settings/serializers/auth/cas.py:18 #: assets/models/account.py:55 settings/serializers/auth/cas.py:18
#: terminal/models/applet/applet.py:22 #: terminal/models/applet/applet.py:22
msgid "Version" msgid "Version"
msgstr "版本" msgstr "版本"
#: assets/models/account.py:63 #: assets/models/account.py:65
msgid "Can view asset account secret" msgid "Can view asset account secret"
msgstr "可以查看资产账号密码" msgstr "可以查看资产账号密码"
#: assets/models/account.py:64 #: assets/models/account.py:66
msgid "Can change asset account secret" msgid "Can change asset account secret"
msgstr "可以更改资产账号密码" msgstr "可以更改资产账号密码"
#: assets/models/account.py:65 #: assets/models/account.py:67
msgid "Can view asset history account" msgid "Can view asset history account"
msgstr "可以查看资产历史账号" msgstr "可以查看资产历史账号"
#: assets/models/account.py:66 #: assets/models/account.py:68
msgid "Can view asset history account secret" msgid "Can view asset history account secret"
msgstr "可以查看资产历史账号密码" msgstr "可以查看资产历史账号密码"
#: assets/models/account.py:89 assets/serializers/account/account.py:13 #: assets/models/account.py:91 assets/serializers/account/account.py:13
msgid "Account template" msgid "Account template"
msgstr "账号模版" msgstr "账号模版"
@ -613,9 +611,9 @@ msgid "Nodes"
msgstr "节点" msgstr "节点"
#: assets/models/asset/common.py:98 assets/models/automations/base.py:25 #: assets/models/asset/common.py:98 assets/models/automations/base.py:25
#: assets/models/cmd_filter.py:39 assets/models/domain.py:70 #: assets/models/base.py:64 assets/models/cmd_filter.py:39
#: assets/models/label.py:21 terminal/models/applet/applet.py:25 #: assets/models/domain.py:70 assets/models/label.py:21
#: users/serializers/user.py:147 #: terminal/models/applet/applet.py:25 users/serializers/user.py:147
msgid "Is active" msgid "Is active"
msgstr "激活" msgstr "激活"
@ -632,7 +630,9 @@ msgid "Can test asset connectivity"
msgstr "可以测试资产连接性" msgstr "可以测试资产连接性"
#: assets/models/asset/common.py:232 #: assets/models/asset/common.py:232
msgid "Can push system user to asset" #, fuzzy
#| msgid "Can push system user to asset"
msgid "Can push account to asset"
msgstr "可以推送系统用户到资产" msgstr "可以推送系统用户到资产"
#: assets/models/asset/common.py:233 #: assets/models/asset/common.py:233
@ -648,6 +648,7 @@ msgid "Move asset to node"
msgstr "移动资产到节点" msgstr "移动资产到节点"
#: assets/models/asset/web.py:9 audits/models.py:111 #: assets/models/asset/web.py:9 audits/models.py:111
#: terminal/serializers/applet_host.py:24
msgid "Disabled" msgid "Disabled"
msgstr "禁用" msgstr "禁用"
@ -688,13 +689,13 @@ msgstr "账号管理"
msgid "Assets" msgid "Assets"
msgstr "资产" msgstr "资产"
#: assets/models/automations/base.py:77 assets/models/automations/base.py:84 #: assets/models/automations/base.py:86 assets/models/automations/base.py:93
msgid "Automation task" msgid "Automation task"
msgstr "自动化任务" msgstr "自动化任务"
#: assets/models/automations/base.py:88 assets/models/backup.py:77 #: assets/models/automations/base.py:97 assets/models/backup.py:77
#: audits/models.py:44 ops/models/base.py:54 #: audits/models.py:44 ops/models/base.py:54
#: perms/models/asset_permission.py:76 terminal/models/applet/host.py:32 #: perms/models/asset_permission.py:76 terminal/models/applet/host.py:102
#: terminal/models/session/session.py:43 #: terminal/models/session/session.py:43
#: tickets/models/ticket/apply_application.py:28 #: tickets/models/ticket/apply_application.py:28
#: tickets/models/ticket/apply_asset.py:21 #: tickets/models/ticket/apply_asset.py:21
@ -704,28 +705,28 @@ msgstr "自动化任务"
msgid "Date start" msgid "Date start"
msgstr "开始日期" msgstr "开始日期"
#: assets/models/automations/base.py:89 #: assets/models/automations/base.py:98
#: assets/models/automations/change_secret.py:58 ops/models/base.py:55 #: assets/models/automations/change_secret.py:58 ops/models/base.py:55
#: terminal/models/applet/host.py:33 #: terminal/models/applet/host.py:103
msgid "Date finished" msgid "Date finished"
msgstr "结束日期" msgstr "结束日期"
#: assets/models/automations/base.py:91 #: assets/models/automations/base.py:100
msgid "Automation snapshot" msgid "Automation snapshot"
msgstr "自动化快照" msgstr "自动化快照"
#: assets/models/automations/base.py:95 assets/models/backup.py:88 #: assets/models/automations/base.py:104 assets/models/backup.py:88
#: assets/serializers/account/backup.py:36 #: assets/serializers/account/backup.py:36
#: xpack/plugins/change_auth_plan/models/base.py:121 #: xpack/plugins/change_auth_plan/models/base.py:121
#: xpack/plugins/change_auth_plan/serializers/base.py:78 #: xpack/plugins/change_auth_plan/serializers/base.py:78
msgid "Trigger mode" msgid "Trigger mode"
msgstr "触发模式" msgstr "触发模式"
#: assets/models/automations/base.py:99 #: assets/models/automations/base.py:108
msgid "Automation task execution" msgid "Automation task execution"
msgstr "自动化任务执行" msgstr "自动化任务执行"
#: assets/models/automations/change_secret.py:15 assets/models/base.py:62 #: assets/models/automations/change_secret.py:15 assets/models/base.py:60
msgid "Secret type" msgid "Secret type"
msgstr "密文类型" msgstr "密文类型"
@ -734,7 +735,7 @@ msgid "Secret strategy"
msgstr "密钥策略" msgstr "密钥策略"
#: assets/models/automations/change_secret.py:21 #: assets/models/automations/change_secret.py:21
#: assets/models/automations/change_secret.py:56 assets/models/base.py:64 #: assets/models/automations/change_secret.py:56 assets/models/base.py:62
#: assets/serializers/account/base.py:17 #: assets/serializers/account/base.py:17
#: authentication/models/connection_token.py:34 #: authentication/models/connection_token.py:34
#: authentication/models/temp_token.py:10 #: authentication/models/temp_token.py:10
@ -772,7 +773,7 @@ msgstr "原来密码"
msgid "Date started" msgid "Date started"
msgstr "开始日期" msgstr "开始日期"
#: assets/models/automations/change_secret.py:60 common/const/choices.py:19 #: assets/models/automations/change_secret.py:60 common/const/choices.py:20
msgid "Error" msgid "Error"
msgstr "错误" msgstr "错误"
@ -794,6 +795,12 @@ msgstr "收集资产信息"
msgid "Gather asset facts" msgid "Gather asset facts"
msgstr "收集资产信息" msgstr "收集资产信息"
#: assets/models/automations/ping.py:15
#, fuzzy
#| msgid "Login asset"
msgid "Ping asset"
msgstr "登录资产"
#: assets/models/automations/push_account.py:16 #: assets/models/automations/push_account.py:16
#, fuzzy #, fuzzy
#| msgid "Is service account" #| msgid "Is service account"
@ -841,15 +848,15 @@ msgstr "是否成功"
msgid "Account backup execution" msgid "Account backup execution"
msgstr "账号备份执行" msgstr "账号备份执行"
#: assets/models/base.py:30 assets/serializers/domain.py:42 #: assets/models/base.py:29 assets/serializers/domain.py:42
msgid "Connectivity" msgid "Connectivity"
msgstr "可连接性" msgstr "可连接性"
#: assets/models/base.py:32 authentication/models/temp_token.py:12 #: assets/models/base.py:31 authentication/models/temp_token.py:12
msgid "Date verified" msgid "Date verified"
msgstr "校验日期" msgstr "校验日期"
#: assets/models/base.py:65 #: assets/models/base.py:63
msgid "Privileged" msgid "Privileged"
msgstr "特权的" msgstr "特权的"
@ -1015,6 +1022,7 @@ msgid "Setting"
msgstr "设置" msgstr "设置"
#: assets/models/platform.py:43 audits/models.py:112 settings/models.py:37 #: assets/models/platform.py:43 audits/models.py:112 settings/models.py:37
#: terminal/serializers/applet_host.py:25
msgid "Enabled" msgid "Enabled"
msgstr "启用" msgstr "启用"
@ -1306,63 +1314,41 @@ msgstr "密码不能包含 `'` 字符"
msgid "Password can not contains `\"` " msgid "Password can not contains `\"` "
msgstr "密码不能包含 `\"` 字符" msgstr "密码不能包含 `\"` 字符"
#: assets/tasks/account_connectivity.py:30 #: assets/tasks/gather_facts.py:25
msgid "The asset {} system platform {} does not support run Ansible tasks"
msgstr "资产 {} 系统平台 {} 不支持运行 Ansible 任务"
#: assets/tasks/account_connectivity.py:108
msgid "Test account connectivity: "
msgstr "测试账号可连接性: "
#: assets/tasks/asset_connectivity.py:49
msgid "Test assets connectivity. "
msgstr "测试资产可连接性. "
#: assets/tasks/asset_connectivity.py:94 assets/tasks/asset_connectivity.py:107
msgid "Test assets connectivity: "
msgstr "测试资产可连接性: "
#: assets/tasks/asset_connectivity.py:121
msgid "Test if the assets under the node are connectable: "
msgstr "测试节点下资产是否可连接: "
#: assets/tasks/const.py:49
msgid "Unreachable"
msgstr "不可达"
#: assets/tasks/const.py:50
msgid "Reachable"
msgstr "可连接"
#: assets/tasks/gather_asset_hardware_info.py:46
msgid "Get asset info failed: {}"
msgstr "获取资产信息失败:{}"
#: assets/tasks/gather_asset_hardware_info.py:97
msgid "Update some assets hardware info. " msgid "Update some assets hardware info. "
msgstr "更新资产硬件信息. " msgstr "更新资产硬件信息. "
#: assets/tasks/gather_asset_hardware_info.py:118 #: assets/tasks/gather_facts.py:48
msgid "Update asset hardware info: "
msgstr "更新资产硬件信息: "
#: assets/tasks/gather_asset_hardware_info.py:124
msgid "Update assets hardware info: " msgid "Update assets hardware info: "
msgstr "更新资产硬件信息: " msgstr "更新资产硬件信息: "
#: assets/tasks/gather_asset_hardware_info.py:146 #: assets/tasks/gather_facts.py:58
msgid "Update node asset hardware information: " msgid "Update node asset hardware information: "
msgstr "更新节点资产硬件信息: " msgstr "更新节点资产硬件信息: "
#: assets/tasks/gather_asset_users.py:110
msgid "Gather assets users"
msgstr "收集资产上的用户"
#: assets/tasks/nodes_amount.py:29 #: assets/tasks/nodes_amount.py:29
msgid "" msgid ""
"The task of self-checking is already running and cannot be started repeatedly" "The task of self-checking is already running and cannot be started repeatedly"
msgstr "自检程序已经在运行,不能重复启动" msgstr "自检程序已经在运行,不能重复启动"
#: assets/tasks/ping.py:20 assets/tasks/ping.py:38
#, fuzzy
#| msgid "Test assets connectivity. "
msgid "Test assets connectivity "
msgstr "测试资产可连接性. "
#: assets/tasks/ping.py:48
#, fuzzy
#| msgid "Test if the assets under the node are connectable: "
msgid "Test if the assets under the node are connectable "
msgstr "测试节点下资产是否可连接: "
#: assets/tasks/push_account.py:36
#, fuzzy
#| msgid "Push account method"
msgid "Push accounts to assets"
msgstr "推送方式"
#: assets/tasks/utils.py:17 #: assets/tasks/utils.py:17
msgid "Asset has been disabled, skipped: {}" msgid "Asset has been disabled, skipped: {}"
msgstr "资产已经被禁用, 跳过: {}" msgstr "资产已经被禁用, 跳过: {}"
@ -1379,6 +1365,12 @@ msgstr "为了安全,禁止推送用户 {}"
msgid "No assets matched, stop task" msgid "No assets matched, stop task"
msgstr "没有匹配到资产,结束任务" msgstr "没有匹配到资产,结束任务"
#: assets/tasks/verify_account.py:36
#, fuzzy
#| msgid "Test account connectivity: "
msgid "Verify accounts connectivity"
msgstr "测试账号可连接性: "
#: audits/apps.py:9 #: audits/apps.py:9
msgid "Audits" msgid "Audits"
msgstr "日志审计" msgstr "日志审计"
@ -1426,7 +1418,7 @@ msgstr "操作"
msgid "Filename" msgid "Filename"
msgstr "文件名" msgstr "文件名"
#: audits/models.py:43 audits/models.py:117 common/const/choices.py:17 #: audits/models.py:43 audits/models.py:117 common/const/choices.py:18
#: terminal/models/session/sharing.py:104 tickets/views/approve.py:114 #: terminal/models/session/sharing.py:104 tickets/views/approve.py:114
#: xpack/plugins/change_auth_plan/serializers/asset.py:189 #: xpack/plugins/change_auth_plan/serializers/asset.py:189
msgid "Success" msgid "Success"
@ -1506,8 +1498,8 @@ msgid "MFA"
msgstr "MFA" msgstr "MFA"
#: audits/models.py:128 ops/models/base.py:48 #: audits/models.py:128 ops/models/base.py:48
#: terminal/models/applet/applet.py:57 terminal/models/applet/host.py:19 #: terminal/models/applet/applet.py:60 terminal/models/applet/host.py:101
#: terminal/models/applet/host.py:31 terminal/models/component/status.py:33 #: terminal/models/component/status.py:33 terminal/serializers/applet.py:22
#: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171 #: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171
#: xpack/plugins/cloud/models.py:223 #: xpack/plugins/cloud/models.py:223
msgid "Status" msgid "Status"
@ -2018,11 +2010,11 @@ msgstr "资产未激活"
msgid "No account" msgid "No account"
msgstr "登录账号" msgstr "登录账号"
#: authentication/models/connection_token.py:103 #: authentication/models/connection_token.py:101
msgid "User has no permission to access asset or permission expired" msgid "User has no permission to access asset or permission expired"
msgstr "用户没有权限访问资产或权限已过期" msgstr "用户没有权限访问资产或权限已过期"
#: authentication/models/connection_token.py:145 #: authentication/models/connection_token.py:144
msgid "Super connection token" msgid "Super connection token"
msgstr "超级连接令牌" msgstr "超级连接令牌"
@ -2439,15 +2431,19 @@ msgstr "手动触发"
msgid "Timing trigger" msgid "Timing trigger"
msgstr "定时触发" msgstr "定时触发"
#: common/const/choices.py:15 tickets/const.py:29 tickets/const.py:37 #: common/const/choices.py:15 xpack/plugins/change_auth_plan/models/base.py:183
msgid "Ready"
msgstr "准备"
#: common/const/choices.py:16 tickets/const.py:29 tickets/const.py:37
msgid "Pending" msgid "Pending"
msgstr "待定的" msgstr "待定的"
#: common/const/choices.py:16 #: common/const/choices.py:17
msgid "Running" msgid "Running"
msgstr "" msgstr ""
#: common/const/choices.py:20 #: common/const/choices.py:21
#, fuzzy #, fuzzy
#| msgid "Cancel" #| msgid "Cancel"
msgid "Canceled" msgid "Canceled"
@ -2515,6 +2511,12 @@ msgstr "解析文件错误: {}"
msgid "Children" msgid "Children"
msgstr "" msgstr ""
#: common/drf/serializers/common.py:94
#, fuzzy
#| msgid "Filename"
msgid "File"
msgstr "文件名"
#: common/exceptions.py:15 #: common/exceptions.py:15
#, python-format #, python-format
msgid "%s object does not exist." msgid "%s object does not exist."
@ -2925,7 +2927,7 @@ msgstr "组织管理"
#: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:88 #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:88
#: rbac/const.py:7 rbac/models/rolebinding.py:48 #: rbac/const.py:7 rbac/models/rolebinding.py:48
#: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:62 #: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:62
#: tickets/models/ticket/general.py:300 tickets/serializers/ticket/ticket.py:71 #: tickets/models/ticket/general.py:300 tickets/serializers/ticket/ticket.py:72
msgid "Organization" msgid "Organization"
msgstr "组织" msgstr "组织"
@ -4725,42 +4727,46 @@ msgstr "作者"
msgid "Tags" msgid "Tags"
msgstr "标签" msgstr "标签"
#: terminal/models/applet/applet.py:29 terminal/serializers/storage.py:157 #: terminal/models/applet/applet.py:31 terminal/serializers/storage.py:157
msgid "Hosts" msgid "Hosts"
msgstr "主机" msgstr "主机"
#: terminal/models/applet/applet.py:55 terminal/models/applet/host.py:21 #: terminal/models/applet/applet.py:58 terminal/models/applet/host.py:28
msgid "Applet" msgid "Applet"
msgstr "远程应用" msgstr "远程应用"
#: terminal/models/applet/host.py:14 #: terminal/models/applet/host.py:19 terminal/serializers/applet_host.py:36
msgid "Account automation"
msgstr "账号自动化"
#: terminal/models/applet/host.py:15 terminal/serializers/applet.py:66
#, fuzzy #, fuzzy
#| msgid "More login options" #| msgid "More login options"
msgid "Deploy options" msgid "Deploy options"
msgstr "其他方式登录" msgstr "其他方式登录"
#: terminal/models/applet/host.py:16 #: terminal/models/applet/host.py:20
msgid "Inited" msgid "Inited"
msgstr "" msgstr ""
#: terminal/models/applet/host.py:17 #: terminal/models/applet/host.py:21
#, fuzzy #, fuzzy
#| msgid "Date finished" #| msgid "Date finished"
msgid "Date inited" msgid "Date inited"
msgstr "结束日期" msgstr "结束日期"
#: terminal/models/applet/host.py:18 #: terminal/models/applet/host.py:22
msgid "Date synced" msgid "Date synced"
msgstr "最后同步日期" msgstr "最后同步日期"
#: terminal/models/applet/host.py:30 #: terminal/models/applet/host.py:25 terminal/models/component/terminal.py:183
msgid "Terminal"
msgstr "终端"
#: terminal/models/applet/host.py:99
msgid "Hosting" msgid "Hosting"
msgstr "主机" msgstr "主机"
#: terminal/models/applet/host.py:100
msgid "Initial"
msgstr ""
#: terminal/models/component/endpoint.py:14 #: terminal/models/component/endpoint.py:14
msgid "HTTPS Port" msgid "HTTPS Port"
msgstr "HTTPS 端口" msgstr "HTTPS 端口"
@ -4865,10 +4871,6 @@ msgstr "录像存储"
msgid "type" msgid "type"
msgstr "类型" msgstr "类型"
#: terminal/models/component/terminal.py:183
msgid "Terminal"
msgstr "终端"
#: terminal/models/component/terminal.py:185 #: terminal/models/component/terminal.py:185
msgid "Can view terminal config" msgid "Can view terminal config"
msgstr "可以查看终端配置" msgstr "可以查看终端配置"
@ -4985,43 +4987,51 @@ msgstr "级别"
msgid "Batch danger command alert" msgid "Batch danger command alert"
msgstr "批量危险命令告警" msgstr "批量危险命令告警"
#: terminal/serializers/applet.py:19 #: terminal/serializers/applet.py:16
msgid "Published"
msgstr "已安装"
#: terminal/serializers/applet.py:17
msgid "Unpublished"
msgstr "未安装"
#: terminal/serializers/applet.py:18
msgid "Not match"
msgstr "不匹配"
#: terminal/serializers/applet.py:32
msgid "Icon" msgid "Icon"
msgstr "图标" msgstr "图标"
#: terminal/serializers/applet.py:53 #: terminal/serializers/applet_host.py:20
msgid "Not set"
msgstr "不设置"
#: terminal/serializers/applet.py:54
msgid "Per Session" msgid "Per Session"
msgstr "按会话" msgstr "按会话"
#: terminal/serializers/applet.py:55 #: terminal/serializers/applet_host.py:21
msgid "Per Device" msgid "Per Device"
msgstr "按设备" msgstr "按设备"
#: terminal/serializers/applet.py:57 #: terminal/serializers/applet_host.py:27
msgid "RDS Licensing" msgid "RDS Licensing"
msgstr "部署 RDS 许可服务" msgstr "部署 RDS 许可服务"
#: terminal/serializers/applet.py:58 #: terminal/serializers/applet_host.py:28
msgid "RDS License Server" msgid "RDS License Server"
msgstr "RDS 许可服务主机" msgstr "RDS 许可服务主机"
#: terminal/serializers/applet.py:59 #: terminal/serializers/applet_host.py:29
msgid "RDS Licensing Mode" msgid "RDS Licensing Mode"
msgstr "RDS 许可模式" msgstr "RDS 许可模式"
#: terminal/serializers/applet.py:60 #: terminal/serializers/applet_host.py:30
msgid "RDS fSingleSessionPerUser" msgid "RDS fSingleSessionPerUser"
msgstr "RDS 会话用户数" msgstr "RDS 会话用户数"
#: terminal/serializers/applet.py:61 #: terminal/serializers/applet_host.py:31
msgid "RDS Max Disconnection Time" msgid "RDS Max Disconnection Time"
msgstr "RDS 会话断开时间" msgstr "RDS 会话断开时间"
#: terminal/serializers/applet.py:62 #: terminal/serializers/applet_host.py:32
msgid "RDS Remote App Logoff Time Limit" msgid "RDS Remote App Logoff Time Limit"
msgstr "RDS 远程应用注销时间" msgstr "RDS 远程应用注销时间"
@ -5447,7 +5457,7 @@ msgstr "过期时间要大于开始时间"
msgid "Permission named `{}` already exists" msgid "Permission named `{}` already exists"
msgstr "授权名称 `{}` 已存在" msgstr "授权名称 `{}` 已存在"
#: tickets/serializers/ticket/ticket.py:99 #: tickets/serializers/ticket/ticket.py:101
msgid "The ticket flow `{}` does not exist" msgid "The ticket flow `{}` does not exist"
msgstr "工单流程 `{}` 不存在" msgstr "工单流程 `{}` 不存在"
@ -6136,10 +6146,6 @@ msgstr "公钥不能设置为空, 退出. "
msgid "Change auth plan snapshot" msgid "Change auth plan snapshot"
msgstr "改密计划快照" msgstr "改密计划快照"
#: xpack/plugins/change_auth_plan/models/base.py:183
msgid "Ready"
msgstr "准备"
#: xpack/plugins/change_auth_plan/models/base.py:184 #: xpack/plugins/change_auth_plan/models/base.py:184
msgid "Preflight check" msgid "Preflight check"
msgstr "改密前的校验" msgstr "改密前的校验"
@ -6747,11 +6753,11 @@ msgstr "主题"
msgid "Interface setting" msgid "Interface setting"
msgstr "界面设置" msgstr "界面设置"
#: xpack/plugins/license/api.py:50 #: xpack/plugins/license/api.py:53
msgid "License import successfully" msgid "License import successfully"
msgstr "许可证导入成功" msgstr "许可证导入成功"
#: xpack/plugins/license/api.py:51 #: xpack/plugins/license/api.py:54
msgid "License is invalid" msgid "License is invalid"
msgstr "无效的许可证" msgstr "无效的许可证"
@ -6775,6 +6781,30 @@ msgstr "旗舰版"
msgid "Community edition" msgid "Community edition"
msgstr "社区版" msgstr "社区版"
#~ msgid "Account automation"
#~ msgstr "账号自动化"
#~ msgid "The asset {} system platform {} does not support run Ansible tasks"
#~ msgstr "资产 {} 系统平台 {} 不支持运行 Ansible 任务"
#~ msgid "Test assets connectivity: "
#~ msgstr "测试资产可连接性: "
#~ msgid "Unreachable"
#~ msgstr "不可达"
#~ msgid "Reachable"
#~ msgstr "可连接"
#~ msgid "Get asset info failed: {}"
#~ msgstr "获取资产信息失败:{}"
#~ msgid "Update asset hardware info: "
#~ msgstr "更新资产硬件信息: "
#~ msgid "Gather assets users"
#~ msgstr "收集资产上的用户"
#~ msgid "Push automation" #~ msgid "Push automation"
#~ msgstr "自动化推送" #~ msgstr "自动化推送"

View File

@ -13,9 +13,9 @@ from rest_framework.response import Response
from rest_framework.serializers import ValidationError from rest_framework.serializers import ValidationError
from common.utils import is_uuid from common.utils import is_uuid
from common.drf.serializers import FileSerializer
from terminal import serializers from terminal import serializers
from terminal.models import AppletPublication, Applet from terminal.models import AppletPublication, Applet
from terminal.serializers import AppletUploadSerializer
__all__ = ['AppletViewSet', 'AppletPublicationViewSet'] __all__ = ['AppletViewSet', 'AppletPublicationViewSet']
@ -59,7 +59,7 @@ class DownloadUploadMixin:
raise ValidationError({'error': 'Missing name in manifest.yml'}) raise ValidationError({'error': 'Missing name in manifest.yml'})
return manifest, tmp_dir return manifest, tmp_dir
@action(detail=False, methods=['post'], serializer_class=AppletUploadSerializer) @action(detail=False, methods=['post'], serializer_class=FileSerializer)
def upload(self, request, *args, **kwargs): def upload(self, request, *args, **kwargs):
manifest, tmp_dir = self.extract_and_check_file(request) manifest, tmp_dir = self.extract_and_check_file(request)
name = manifest['name'] name = manifest['name']

View File

@ -2,6 +2,8 @@ from rest_framework import viewsets
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
from common.drf.api import JMSModelViewSet
from orgs.utils import tmp_to_builtin_org
from terminal import serializers from terminal import serializers
from terminal.models import AppletHost, Applet, AppletHostDeployment from terminal.models import AppletHost, Applet, AppletHostDeployment
from terminal.tasks import run_applet_host_deployment from terminal.tasks import run_applet_host_deployment
@ -10,26 +12,34 @@ from terminal.tasks import run_applet_host_deployment
__all__ = ['AppletHostViewSet', 'AppletHostDeploymentViewSet'] __all__ = ['AppletHostViewSet', 'AppletHostDeploymentViewSet']
class AppletHostViewSet(viewsets.ModelViewSet): class AppletHostViewSet(JMSModelViewSet):
serializer_class = serializers.AppletHostSerializer serializer_class = serializers.AppletHostSerializer
queryset = AppletHost.objects.all() queryset = AppletHost.objects.all()
rbac_perms = {
'accounts': 'terminal.view_applethost',
'reports': '*'
}
@action(methods=['post'], detail=True) @action(methods=['post'], detail=True, serializer_class=serializers.AppletHostReportSerializer)
def report(self, request, *args, **kwargs): def reports(self, request, *args, **kwargs):
# TODO: # 1. Host 和 Terminal 关联
# 1. 上报 安装的 Applets 每小时 # 2. 上报 安装的 Applets 每小时
# 2. Host 和 Terminal 关联
instance = self.get_object() instance = self.get_object()
instance.sync() serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
instance.check_terminal_binding(request)
instance.check_applets_state(data['applets'])
return Response({'msg': 'ok'}) return Response({'msg': 'ok'})
@action(methods=['get'], detail=True) @action(methods=['get'], detail=True, serializer_class=serializers.AppletHostAccountSerializer)
def accounts(self, request, *args, **kwargs): def accounts(self, request, *args, **kwargs):
# TODO: host = self.get_object()
# 1. 返回 host 上的所有用户, host 可以去创建和更新 每小时 with tmp_to_builtin_org(system=1):
# 2. 密码长度最少 8 位,包含大小写字母和数字和特殊字符 accounts = host.accounts.all().filter(privileged=False)
instance = self.get_object() response = self.get_paginated_response_from_queryset(accounts)
return Response(instance.get_accounts()) return response
class AppletHostDeploymentViewSet(viewsets.ModelViewSet): class AppletHostDeploymentViewSet(viewsets.ModelViewSet):

View File

@ -52,7 +52,7 @@ class StatusViewSet(viewsets.ModelViewSet):
terminal_id = self.kwargs.get("terminal", None) terminal_id = self.kwargs.get("terminal", None)
if terminal_id: if terminal_id:
terminal = get_object_or_404(Terminal, id=terminal_id) terminal = get_object_or_404(Terminal, id=terminal_id)
return terminal.status_set.all() return terminal.status.all()
return super().get_queryset() return super().get_queryset()

View File

@ -42,37 +42,6 @@ class TerminalViewSet(JMSBulkModelViewSet):
self.perform_destroy(instance) self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_204_NO_CONTENT)
def create(self, request, *args, **kwargs):
if isinstance(request.data, list):
raise exceptions.BulkCreateNotSupport()
name = request.data.get('name')
remote_ip = request.META.get('REMOTE_ADDR')
x_real_ip = request.META.get('X-Real-IP')
remote_addr = x_real_ip or remote_ip
terminal = get_object_or_none(Terminal, name=name, is_deleted=False)
if terminal:
msg = 'Terminal name %s already used' % name
return Response({'msg': msg}, status=409)
serializer = self.serializer_class(data={
'name': name, 'remote_addr': remote_addr
})
if serializer.is_valid():
terminal = serializer.save()
# App should use id, token get access key, if accepted
token = uuid.uuid4().hex
cache.set(token, str(terminal.id), 3600)
data = {"id": str(terminal.id), "token": token, "msg": "Need accept"}
return Response(data, status=201)
else:
data = serializer.errors
logger.error("Register terminal error: {}".format(data))
return Response(data, status=400)
def filter_queryset(self, queryset): def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset) queryset = super().filter_queryset(queryset)
s = self.request.query_params.get('status') s = self.request.query_params.get('status')

View File

@ -50,6 +50,7 @@ class TerminalTypeChoices(TextChoices):
celery = 'celery', 'Celery' celery = 'celery', 'Celery'
magnus = 'magnus', 'Magnus' magnus = 'magnus', 'Magnus'
razor = 'razor', 'Razor' razor = 'razor', 'Razor'
tinker = 'tinker', 'Tinker'
@classmethod @classmethod
def types(cls): def types(cls):

View File

@ -13,6 +13,10 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='terminal', model_name='terminal',
name='type', name='type',
field=models.CharField(choices=[('koko', 'KoKo'), ('guacamole', 'Guacamole'), ('omnidb', 'OmniDB'), ('xrdp', 'Xrdp'), ('lion', 'Lion'), ('core', 'Core'), ('celery', 'Celery'), ('magnus', 'Magnus'), ('razor', 'Razor')], default='koko', max_length=64, verbose_name='type'), field=models.CharField(choices=[
('koko', 'KoKo'), ('guacamole', 'Guacamole'), ('omnidb', 'OmniDB'),
('xrdp', 'Xrdp'), ('lion', 'Lion'), ('core', 'Core'), ('celery', 'Celery'),
('magnus', 'Magnus'), ('razor', 'Razor'), ('tinker', 'Tinker'),
], default='koko', max_length=64, verbose_name='type'),
), ),
] ]

View File

@ -39,7 +39,6 @@ class Migration(migrations.Migration):
name='AppletHost', name='AppletHost',
fields=[ fields=[
('host_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.host')), ('host_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.host')),
('account_automation', models.BooleanField(default=False, verbose_name='Account automation')),
('date_synced', models.DateTimeField(blank=True, null=True, verbose_name='Date synced')), ('date_synced', models.DateTimeField(blank=True, null=True, verbose_name='Date synced')),
('status', models.CharField(max_length=16, verbose_name='Status')), ('status', models.CharField(max_length=16, verbose_name='Status')),
], ],

View File

@ -0,0 +1,33 @@
# Generated by Django 3.2.14 on 2022-11-03 08:24
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('terminal', '0057_auto_20221102_1941'),
]
operations = [
migrations.AlterModelOptions(
name='terminal',
options={'permissions': (('view_terminalconfig', 'Can view terminal config'),), 'verbose_name': 'Terminal'},
),
migrations.RemoveField(
model_name='terminal',
name='http_port',
),
migrations.RemoveField(
model_name='terminal',
name='is_accepted',
),
migrations.RemoveField(
model_name='terminal',
name='ssh_port',
),
migrations.RemoveField(
model_name='applethost',
name='status',
),
]

View File

@ -1,7 +1,14 @@
import os
from collections import defaultdict
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils import timezone
from rest_framework.exceptions import ValidationError
from simple_history.utils import bulk_create_with_history
from common.db.models import JMSBaseModel from common.db.models import JMSBaseModel
from common.utils import random_string
from assets.models import Host from assets.models import Host
@ -9,14 +16,10 @@ __all__ = ['AppletHost', 'AppletHostDeployment']
class AppletHost(Host): class AppletHost(Host):
LOCKING_ORG = '00000000-0000-0000-0000-000000000004'
account_automation = models.BooleanField(default=False, verbose_name=_('Account automation'))
deploy_options = models.JSONField(default=dict, verbose_name=_('Deploy options')) deploy_options = models.JSONField(default=dict, verbose_name=_('Deploy options'))
inited = models.BooleanField(default=False, verbose_name=_('Inited')) inited = models.BooleanField(default=False, verbose_name=_('Inited'))
date_inited = models.DateTimeField(null=True, blank=True, verbose_name=_('Date inited')) date_inited = models.DateTimeField(null=True, blank=True, verbose_name=_('Date inited'))
date_synced = models.DateTimeField(null=True, blank=True, verbose_name=_('Date synced')) date_synced = models.DateTimeField(null=True, blank=True, verbose_name=_('Date synced'))
status = models.CharField(max_length=16, verbose_name=_('Status'))
terminal = models.OneToOneField( terminal = models.OneToOneField(
'terminal.Terminal', on_delete=models.PROTECT, null=True, blank=True, 'terminal.Terminal', on_delete=models.PROTECT, null=True, blank=True,
related_name='applet_host', verbose_name=_('Terminal') related_name='applet_host', verbose_name=_('Terminal')
@ -25,10 +28,78 @@ class AppletHost(Host):
'Applet', verbose_name=_('Applet'), 'Applet', verbose_name=_('Applet'),
through='AppletPublication', through_fields=('host', 'applet'), through='AppletPublication', through_fields=('host', 'applet'),
) )
LOCKING_ORG = '00000000-0000-0000-0000-000000000004'
def __str__(self): def __str__(self):
return self.name return self.name
@property
def status(self):
if self.terminal:
return 'online'
return self.terminal.status
def check_terminal_binding(self, request):
request_terminal = getattr(request.user, 'terminal', None)
if not request_terminal:
raise ValidationError('Request user has no terminal')
self.date_synced = timezone.now()
if not self.terminal:
self.terminal = request_terminal
self.save(update_fields=['terminal', 'date_synced'])
elif self.terminal and self.terminal != request_terminal:
raise ValidationError('Terminal has been set')
else:
self.save(update_fields=['date_synced'])
def check_applets_state(self, applets_value_list):
applets = self.applets.all()
name_version_mapper = {
value['name']: value['version']
for value in applets_value_list
}
status_applets = defaultdict(list)
for applet in applets:
if applet.name not in name_version_mapper:
status_applets['unpublished'].append(applet)
elif applet.version != name_version_mapper[applet.name]:
status_applets['not_match'].append(applet)
else:
status_applets['published'].append(applet)
for status, applets in status_applets.items():
self.publications.filter(applet__in=applets)\
.exclude(status=status)\
.update(status=status)
@staticmethod
def random_username():
return 'jms_' + random_string(8)
@staticmethod
def random_password():
return random_string(16, special_char=True)
def generate_accounts(self):
amount = int(os.getenv('TERMINAL_ACCOUNTS_AMOUNT', 100))
now_count = self.accounts.filter(privileged=False).count()
need = amount - now_count
accounts = []
account_model = self.accounts.model
for i in range(need):
username = self.random_username()
password = self.random_password()
account = account_model(
username=username, secret=password, name=username,
asset_id=self.id, secret_type='password', version=1,
org_id=self.LOCKING_ORG
)
accounts.append(account)
bulk_create_with_history(accounts, account_model, batch_size=20)
class AppletHostDeployment(JMSBaseModel): class AppletHostDeployment(JMSBaseModel):
host = models.ForeignKey('AppletHost', on_delete=models.CASCADE, verbose_name=_('Hosting')) host = models.ForeignKey('AppletHost', on_delete=models.CASCADE, verbose_name=_('Hosting'))

View File

@ -22,7 +22,7 @@ class Status(models.Model):
connections = models.IntegerField(verbose_name=_("Connections"), default=0) connections = models.IntegerField(verbose_name=_("Connections"), default=0)
threads = models.IntegerField(verbose_name=_("Threads"), default=0) threads = models.IntegerField(verbose_name=_("Threads"), default=0)
boot_time = models.FloatField(verbose_name=_("Boot Time"), default=0) boot_time = models.FloatField(verbose_name=_("Boot Time"), default=0)
terminal = models.ForeignKey('terminal.Terminal', null=True, on_delete=models.CASCADE) terminal = models.ForeignKey('terminal.Terminal', null=True, on_delete=models.CASCADE, related_name='status')
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)
CACHE_KEY = 'TERMINAL_STATUS_{}' CACHE_KEY = 'TERMINAL_STATUS_{}'

View File

@ -9,7 +9,7 @@ from common.utils import get_logger
from users.models import User from users.models import User
from orgs.utils import tmp_to_root_org from orgs.utils import tmp_to_root_org
from .status import Status from .status import Status
from terminal import const from terminal.const import TerminalTypeChoices as TypeChoices
from terminal.const import ComponentStatusChoices as StatusChoice from terminal.const import ComponentStatusChoices as StatusChoice
from ..session import Session from ..session import Session
@ -99,16 +99,13 @@ class Terminal(StorageMixin, TerminalStatusMixin, models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True) id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(max_length=128, verbose_name=_('Name')) name = models.CharField(max_length=128, verbose_name=_('Name'))
type = models.CharField( type = models.CharField(
choices=const.TerminalTypeChoices.choices, default=const.TerminalTypeChoices.koko.value, choices=TypeChoices.choices, default=TypeChoices.koko,
max_length=64, verbose_name=_('type') max_length=64, verbose_name=_('type')
) )
remote_addr = models.CharField(max_length=128, blank=True, verbose_name=_('Remote Address')) remote_addr = models.CharField(max_length=128, blank=True, verbose_name=_('Remote Address'))
ssh_port = models.IntegerField(verbose_name=_('SSH Port'), default=2222)
http_port = models.IntegerField(verbose_name=_('HTTP Port'), default=5000)
command_storage = models.CharField(max_length=128, verbose_name=_("Command storage"), default='default') command_storage = models.CharField(max_length=128, verbose_name=_("Command storage"), default='default')
replay_storage = models.CharField(max_length=128, verbose_name=_("Replay storage"), default='default') replay_storage = models.CharField(max_length=128, verbose_name=_("Replay storage"), default='default')
user = models.OneToOneField(User, related_name='terminal', verbose_name='Application User', null=True, on_delete=models.CASCADE) user = models.OneToOneField(User, related_name='terminal', verbose_name='Application User', null=True, on_delete=models.CASCADE)
is_accepted = models.BooleanField(default=False, verbose_name='Is Accepted')
is_deleted = models.BooleanField(default=False) is_deleted = models.BooleanField(default=False)
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)
comment = models.TextField(blank=True, verbose_name=_('Comment')) comment = models.TextField(blank=True, verbose_name=_('Comment'))
@ -167,9 +164,7 @@ class Terminal(StorageMixin, TerminalStatusMixin, models.Model):
def __str__(self): def __str__(self):
status = "Active" status = "Active"
if not self.is_accepted: if self.is_deleted:
status = "NotAccept"
elif self.is_deleted:
status = "Deleted" status = "Deleted"
elif not self.is_active: elif not self.is_active:
status = "Disable" status = "Disable"
@ -178,7 +173,6 @@ class Terminal(StorageMixin, TerminalStatusMixin, models.Model):
return '%s: %s' % (self.name, status) return '%s: %s' % (self.name, status)
class Meta: class Meta:
ordering = ('is_accepted',)
db_table = "terminal" db_table = "terminal"
verbose_name = _("Terminal") verbose_name = _("Terminal")
permissions = ( permissions = (

View File

@ -1,22 +1,22 @@
from rest_framework import serializers from rest_framework import serializers
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.db import models
from common.drf.fields import ObjectRelatedField, LabeledChoiceField from common.drf.fields import ObjectRelatedField, LabeledChoiceField
from common.const.choices import Status
from ..models import Applet, AppletPublication, AppletHost from ..models import Applet, AppletPublication, AppletHost
__all__ = [ __all__ = [
'AppletSerializer', 'AppletPublicationSerializer', 'AppletSerializer', 'AppletPublicationSerializer',
'AppletUploadSerializer',
] ]
class AppletUploadSerializer(serializers.Serializer):
file = serializers.FileField()
class AppletPublicationSerializer(serializers.ModelSerializer): class AppletPublicationSerializer(serializers.ModelSerializer):
class Status(models.TextChoices):
PUBLISHED = 'published', _('Published')
UNPUBLISHED = 'unpublished', _('Unpublished')
NOT_MATCH = 'not_match', _('Not match')
applet = ObjectRelatedField(attrs=('id', 'display_name', 'icon', 'version'), queryset=Applet.objects.all()) applet = ObjectRelatedField(attrs=('id', 'display_name', 'icon', 'version'), queryset=Applet.objects.all())
host = ObjectRelatedField(queryset=AppletHost.objects.all()) host = ObjectRelatedField(queryset=AppletHost.objects.all())
status = LabeledChoiceField(choices=Status.choices, label=_("Status")) status = LabeledChoiceField(choices=Status.choices, label=_("Status"))

View File

@ -2,7 +2,8 @@ from rest_framework import serializers
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from common.validators import ProjectUniqueValidator from common.validators import ProjectUniqueValidator
from assets.models import Platform from common.drf.fields import ObjectRelatedField
from assets.models import Platform, Account
from assets.serializers import HostSerializer from assets.serializers import HostSerializer
from ..models import AppletHost, AppletHostDeployment, Applet from ..models import AppletHost, AppletHostDeployment, Applet
from .applet import AppletSerializer from .applet import AppletSerializer
@ -10,6 +11,7 @@ from .applet import AppletSerializer
__all__ = [ __all__ = [
'AppletHostSerializer', 'AppletHostDeploymentSerializer', 'AppletHostSerializer', 'AppletHostDeploymentSerializer',
'AppletHostAccountSerializer', 'AppletHostReportSerializer'
] ]
@ -36,7 +38,7 @@ class AppletHostSerializer(HostSerializer):
class Meta(HostSerializer.Meta): class Meta(HostSerializer.Meta):
model = AppletHost model = AppletHost
fields = HostSerializer.Meta.fields + [ fields = HostSerializer.Meta.fields + [
'account_automation', 'status', 'date_synced', 'deploy_options' 'status', 'date_synced', 'deploy_options'
] ]
extra_kwargs = { extra_kwargs = {
'status': {'read_only': True}, 'status': {'read_only': True},
@ -86,3 +88,13 @@ class AppletHostDeploymentSerializer(serializers.ModelSerializer):
'date_start', 'date_finished' 'date_start', 'date_finished'
] ]
fields = fields_mini + ['comment'] + read_only_fields fields = fields_mini + ['comment'] + read_only_fields
class AppletHostAccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ['id', 'username', 'secret', 'date_updated']
class AppletHostReportSerializer(serializers.Serializer):
applets = ObjectRelatedField(attrs=('id', 'name', 'version'), queryset=Applet.objects.all(), many=True)

View File

@ -3,8 +3,8 @@ from django.utils.translation import ugettext_lazy as _
from common.drf.serializers import BulkModelSerializer from common.drf.serializers import BulkModelSerializer
from common.utils import is_uuid from common.utils import is_uuid
from users.serializers import ServiceAccountSerializer
from common.utils import get_request_ip, pretty_string from common.utils import get_request_ip, pretty_string
from users.serializers import ServiceAccountSerializer
from .. import const from .. import const
from ..models import ( from ..models import (

View File

@ -4,7 +4,6 @@
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver
from .models import Applet, AppletHost from .models import Applet, AppletHost
@ -14,6 +13,7 @@ def on_applet_host_create(sender, instance, created=False, **kwargs):
return return
applets = Applet.objects.all() applets = Applet.objects.all()
instance.applets.set(applets) instance.applets.set(applets)
instance.generate_accounts()
@receiver(post_save, sender=Applet) @receiver(post_save, sender=Applet)