diff --git a/apps/authentication/api/connection_token.py b/apps/authentication/api/connection_token.py index 1ddd9fa77..a67fc92bd 100644 --- a/apps/authentication/api/connection_token.py +++ b/apps/authentication/api/connection_token.py @@ -210,7 +210,7 @@ class ConnectionTokenMixin: class ConnectionTokenViewSet(ConnectionTokenMixin, RootOrgViewMixin, JMSModelViewSet): filterset_fields = ( - 'type', 'user_display', 'asset_display' + 'user_display', 'asset_display' ) search_fields = filterset_fields serializer_classes = { diff --git a/apps/authentication/migrations/0012_auto_20220816_1629.py b/apps/authentication/migrations/0012_auto_20220816_1629.py index 6e22b0e0f..23bcccb68 100644 --- a/apps/authentication/migrations/0012_auto_20220816_1629.py +++ b/apps/authentication/migrations/0012_auto_20220816_1629.py @@ -49,5 +49,9 @@ class Migration(migrations.Migration): migrations.RemoveField( model_name='connectiontoken', name='system_user', - ) + ), + migrations.RemoveField( + model_name='connectiontoken', + name='type', + ), ] diff --git a/apps/authentication/migrations/0013_remove_connectiontoken_type.py b/apps/authentication/migrations/0013_remove_connectiontoken_type.py deleted file mode 100644 index 52c6813dc..000000000 --- a/apps/authentication/migrations/0013_remove_connectiontoken_type.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.14 on 2022-10-26 08:07 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('authentication', '0012_auto_20220816_1629'), - ] - - operations = [ - migrations.RemoveField( - model_name='connectiontoken', - name='type', - ), - ] diff --git a/apps/authentication/serializers/connection_token.py b/apps/authentication/serializers/connection_token.py index 03df575ba..1093da1f9 100644 --- a/apps/authentication/serializers/connection_token.py +++ b/apps/authentication/serializers/connection_token.py @@ -23,7 +23,7 @@ class ConnectionTokenSerializer(OrgResourceModelSerializerMixin): class Meta: model = ConnectionToken - fields_mini = ['id', 'type'] + fields_mini = ['id'] fields_small = fields_mini + [ 'secret', 'date_expired', 'date_created', 'date_updated', 'created_by', 'updated_by', 'org_id', 'org_name', diff --git a/apps/common/apps.py b/apps/common/apps.py index 2a5799d10..c55e4c6e3 100644 --- a/apps/common/apps.py +++ b/apps/common/apps.py @@ -10,6 +10,8 @@ class CommonConfig(AppConfig): def ready(self): from . import signal_handlers from .signals import django_ready - if 'migrate' in sys.argv or 'compilemessages' in sys.argv: - return + excludes = ['migrate', 'compilemessages', 'makemigrations'] + for i in excludes: + if i in sys.argv: + return django_ready.send(CommonConfig) diff --git a/apps/common/drf/serializers/common.py b/apps/common/drf/serializers/common.py index 688e1bfcc..a522e3a82 100644 --- a/apps/common/drf/serializers/common.py +++ b/apps/common/drf/serializers/common.py @@ -12,7 +12,7 @@ from .mixin import BulkListSerializerMixin, BulkSerializerMixin __all__ = [ 'MethodSerializer', 'EmptySerializer', 'BulkModelSerializer', - 'AdaptedBulkListSerializer', 'CeleryTaskSerializer', + 'AdaptedBulkListSerializer', 'CeleryTaskExecutionSerializer', 'WritableNestedModelSerializer', 'GroupedChoiceSerializer', ] @@ -73,7 +73,7 @@ class AdaptedBulkListSerializer(BulkListSerializerMixin, BulkListSerializer): pass -class CeleryTaskSerializer(serializers.Serializer): +class CeleryTaskExecutionSerializer(serializers.Serializer): task = serializers.CharField(read_only=True) diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po index abb6e56fb..545f1231e 100644 --- a/apps/locale/ja/LC_MESSAGES/django.po +++ b/apps/locale/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-10-20 20:21+0800\n" +"POT-Creation-Date: 2022-10-26 16:41+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -29,36 +29,37 @@ msgstr "Acls" #: assets/models/domain.py:24 assets/models/group.py:20 #: assets/models/label.py:17 assets/models/platform.py:22 #: assets/models/platform.py:68 assets/serializers/asset/common.py:86 -#: assets/serializers/platform.py:104 ops/mixin.py:22 ops/models/playbook.py:9 +#: assets/serializers/platform.py:104 ops/mixin.py:20 ops/models/playbook.py:9 #: orgs/models.py:70 perms/models/asset_permission.py:56 rbac/models/role.py:29 #: settings/models.py:33 settings/serializers/sms.py:6 -#: terminal/models/endpoint.py:10 terminal/models/endpoint.py:86 -#: terminal/models/storage.py:26 terminal/models/task.py:16 -#: terminal/models/terminal.py:100 users/forms/profile.py:33 +#: terminal/models/applet/applet.py:25 terminal/models/component/endpoint.py:11 +#: terminal/models/component/endpoint.py:87 +#: terminal/models/component/storage.py:25 terminal/models/component/task.py:16 +#: terminal/models/component/terminal.py:100 users/forms/profile.py:33 #: users/models/group.py:15 users/models/user.py:665 #: xpack/plugins/cloud/models.py:30 msgid "Name" msgstr "名前" #: acls/models/base.py:27 assets/models/_user.py:47 -#: assets/models/cmd_filter.py:76 terminal/models/endpoint.py:89 +#: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:90 msgid "Priority" msgstr "優先順位" #: acls/models/base.py:28 assets/models/_user.py:47 -#: assets/models/cmd_filter.py:76 terminal/models/endpoint.py:90 +#: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:91 msgid "1-100, the lower the value will be match first" msgstr "1-100、低い値は最初に一致します" #: acls/models/base.py:31 authentication/models.py:22 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:74 terminal/models/sharing.py:28 +#: perms/models/asset_permission.py:74 terminal/models/session/sharing.py:28 #: tickets/const.py:38 msgid "Active" msgstr "アクティブ" #: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40 -#: assets/models/asset/common.py:101 assets/models/automations/base.py:24 +#: assets/models/asset/common.py:100 assets/models/automations/base.py:25 #: assets/models/backup.py:30 assets/models/base.py:66 #: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88 #: assets/models/domain.py:25 assets/models/domain.py:69 @@ -66,9 +67,12 @@ msgstr "アクティブ" #: assets/models/platform.py:73 ops/models/playbook.py:11 #: ops/models/playbook.py:25 orgs/models.py:73 #: perms/models/asset_permission.py:84 rbac/models/role.py:37 -#: settings/models.py:38 terminal/models/endpoint.py:23 -#: terminal/models/endpoint.py:96 terminal/models/storage.py:29 -#: terminal/models/terminal.py:114 tickets/models/comment.py:32 +#: settings/models.py:38 terminal/models/applet/applet.py:33 +#: terminal/models/applet/applet.py:62 terminal/models/applet/host.py:12 +#: terminal/models/applet/host.py:28 terminal/models/component/endpoint.py:24 +#: terminal/models/component/endpoint.py:97 +#: terminal/models/component/storage.py:28 +#: terminal/models/component/terminal.py:114 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:288 users/models/group.py:16 #: users/models/user.py:702 xpack/plugins/change_auth_plan/models/base.py:44 #: xpack/plugins/cloud/models.py:37 xpack/plugins/cloud/models.py:118 @@ -93,14 +97,14 @@ msgstr "ログイン確認" #: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20 #: assets/models/cmd_filter.py:28 assets/models/label.py:15 audits/models.py:37 #: audits/models.py:62 audits/models.py:87 authentication/models.py:55 -#: authentication/models.py:79 perms/models/asset_permission.py:58 +#: authentication/models.py:72 perms/models/asset_permission.py:58 #: rbac/builtin.py:120 rbac/models/rolebinding.py:41 #: terminal/backends/command/models.py:20 -#: terminal/backends/command/serializers.py:13 terminal/models/session.py:30 -#: terminal/models/sharing.py:33 terminal/notifications.py:91 -#: terminal/notifications.py:139 tickets/models/comment.py:21 users/const.py:14 -#: users/models/user.py:895 users/models/user.py:926 -#: users/serializers/group.py:19 +#: terminal/backends/command/serializers.py:13 +#: terminal/models/session/session.py:30 terminal/models/session/sharing.py:33 +#: terminal/notifications.py:91 terminal/notifications.py:139 +#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:895 +#: users/models/user.py:926 users/serializers/group.py:19 msgid "User" msgstr "ユーザー" @@ -125,8 +129,8 @@ msgid "Login acl" msgstr "ログインacl" #: acls/models/login_asset_acl.py:21 assets/models/account.py:57 -#: authentication/models.py:88 ops/models/base.py:18 -#: terminal/models/session.py:34 xpack/plugins/cloud/models.py:87 +#: authentication/models.py:82 ops/models/base.py:18 +#: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87 #: xpack/plugins/cloud/serializers/task.py:65 msgid "Account" msgstr "アカウント" @@ -135,10 +139,10 @@ msgstr "アカウント" #: 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/serializers/account/account.py:58 assets/serializers/label.py:30 -#: audits/models.py:39 authentication/models.py:67 authentication/models.py:84 +#: audits/models.py:39 authentication/models.py:77 #: perms/models/asset_permission.py:64 terminal/backends/command/models.py:21 -#: terminal/backends/command/serializers.py:14 terminal/models/session.py:32 -#: terminal/notifications.py:90 +#: terminal/backends/command/serializers.py:14 +#: terminal/models/session/session.py:32 terminal/notifications.py:90 #: xpack/plugins/change_auth_plan/models/asset.py:200 #: xpack/plugins/change_auth_plan/serializers/asset.py:172 #: xpack/plugins/cloud/models.py:219 @@ -161,7 +165,7 @@ msgstr "コンマ区切り文字列の形式。* はすべて一致すること #: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34 #: assets/models/base.py:60 assets/models/gathered_user.py:15 #: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27 -#: authentication/models.py:248 +#: authentication/models.py:245 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: users/forms/profile.py:32 users/models/user.py:663 @@ -246,10 +250,11 @@ msgid "Category" msgstr "カテゴリ" #: applications/models.py:15 assets/models/_user.py:46 -#: assets/models/automations/base.py:22 assets/models/cmd_filter.py:74 +#: assets/models/automations/base.py:23 assets/models/cmd_filter.py:74 #: assets/models/platform.py:70 assets/serializers/asset/common.py:63 -#: assets/serializers/platform.py:75 authentication/models.py:71 -#: terminal/models/storage.py:58 terminal/models/storage.py:143 +#: assets/serializers/platform.py:75 terminal/models/applet/applet.py:29 +#: terminal/models/component/storage.py:57 +#: terminal/models/component/storage.py:142 terminal/serializers/applet.py:20 #: tickets/models/comment.py:26 tickets/models/flow.py:57 #: tickets/models/ticket/apply_application.py:17 #: tickets/models/ticket/general.py:273 @@ -263,7 +268,7 @@ msgstr "タイプ" msgid "Attrs" msgstr "ツールバーの" -#: applications/models.py:23 authentication/models.py:68 +#: applications/models.py:23 msgid "Application" msgstr "アプリケーション" @@ -409,7 +414,8 @@ msgid "Replace (The key generated by JumpServer) " msgstr "置換(JumpServerによって生成された鍵)" #: assets/const/category.py:11 settings/serializers/auth/radius.py:14 -#: settings/serializers/auth/sms.py:56 terminal/models/endpoint.py:11 +#: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:60 +#: terminal/models/applet/host.py:11 terminal/models/component/endpoint.py:12 #: xpack/plugins/cloud/serializers/account_attrs.py:72 msgid "Host" msgstr "ホスト" @@ -430,11 +436,12 @@ msgstr "データベース" msgid "Cloud service" msgstr "クラウドセンター" -#: assets/const/category.py:15 +#: assets/const/category.py:15 terminal/models/applet/applet.py:18 msgid "Web" msgstr "" -#: assets/const/device.py:7 tickets/const.py:8 +#: assets/const/device.py:7 terminal/models/applet/applet.py:17 +#: tickets/const.py:8 msgid "General" msgstr "一般" @@ -489,7 +496,7 @@ msgstr "SSH秘密鍵" msgid "SSH public key" msgstr "SSHパブリックキー" -#: assets/models/_user.py:41 assets/models/automations/base.py:78 +#: assets/models/_user.py:41 assets/models/automations/base.py:86 #: assets/models/base.py:67 assets/models/domain.py:26 #: assets/models/gathered_user.py:19 assets/models/group.py:22 #: common/db/models.py:76 common/mixins/models.py:50 ops/models/base.py:53 @@ -518,8 +525,8 @@ msgid "Username same with user" msgstr "ユーザーと同じユーザー名" #: assets/models/_user.py:48 assets/models/domain.py:67 -#: terminal/serializers/session.py:18 terminal/serializers/session.py:32 -#: terminal/serializers/storage.py:68 +#: terminal/models/applet/applet.py:31 terminal/serializers/session.py:18 +#: terminal/serializers/session.py:32 terminal/serializers/storage.py:68 msgid "Protocol" msgstr "プロトコル" @@ -578,6 +585,7 @@ msgid "Su from" msgstr "から切り替え" #: assets/models/account.py:53 settings/serializers/auth/cas.py:18 +#: terminal/models/applet/applet.py:27 msgid "Version" msgstr "バージョン" @@ -610,32 +618,33 @@ msgstr "アカウント名" msgid "Port" msgstr "ポート" -#: assets/models/asset/common.py:94 assets/models/platform.py:104 +#: assets/models/asset/common.py:93 assets/models/platform.py:104 #: assets/serializers/asset/common.py:65 #: perms/serializers/user_permission.py:21 #: xpack/plugins/cloud/serializers/account_attrs.py:172 msgid "Platform" msgstr "プラットフォーム" -#: assets/models/asset/common.py:96 assets/models/domain.py:29 +#: assets/models/asset/common.py:95 assets/models/domain.py:29 #: assets/models/domain.py:68 assets/serializers/asset/common.py:64 msgid "Domain" msgstr "ドメイン" -#: assets/models/asset/common.py:98 assets/models/automations/base.py:17 +#: assets/models/asset/common.py:97 assets/models/automations/base.py:18 #: assets/serializers/asset/common.py:66 perms/models/asset_permission.py:67 #: xpack/plugins/change_auth_plan/models/asset.py:44 #: xpack/plugins/gathered_user/models.py:24 msgid "Nodes" msgstr "ノード" -#: assets/models/asset/common.py:99 assets/models/automations/base.py:23 +#: assets/models/asset/common.py:98 assets/models/automations/base.py:24 #: assets/models/cmd_filter.py:39 assets/models/domain.py:70 -#: assets/models/label.py:21 users/serializers/user.py:147 +#: assets/models/label.py:21 terminal/models/applet/applet.py:30 +#: users/serializers/user.py:147 msgid "Is active" msgstr "アクティブです。" -#: assets/models/asset/common.py:100 assets/serializers/asset/common.py:67 +#: assets/models/asset/common.py:99 assets/serializers/asset/common.py:67 msgid "Labels" msgstr "ラベル" @@ -697,28 +706,28 @@ msgstr "パスワードルール" msgid "Submit selector" msgstr "" -#: assets/models/automations/base.py:15 assets/models/cmd_filter.py:38 +#: assets/models/automations/base.py:16 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:68 perms/models/asset_permission.py:70 #: rbac/tree.py:37 msgid "Accounts" msgstr "アカウント" -#: assets/models/automations/base.py:20 assets/serializers/domain.py:29 +#: assets/models/automations/base.py:21 assets/serializers/domain.py:29 #: ops/models/base.py:17 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/change_auth_plan/models/asset.py:40 msgid "Assets" msgstr "資産" -#: assets/models/automations/base.py:68 assets/models/automations/base.py:75 +#: assets/models/automations/base.py:76 assets/models/automations/base.py:83 #, fuzzy #| msgid "Automatic managed" msgid "Automation task" msgstr "自動管理" -#: assets/models/automations/base.py:79 assets/models/backup.py:77 +#: assets/models/automations/base.py:87 assets/models/backup.py:77 #: audits/models.py:44 ops/models/base.py:54 -#: perms/models/asset_permission.py:76 terminal/models/session.py:43 +#: perms/models/asset_permission.py:76 terminal/models/session/session.py:43 #: tickets/models/ticket/apply_application.py:28 #: tickets/models/ticket/apply_asset.py:21 #: xpack/plugins/change_auth_plan/models/base.py:108 @@ -727,63 +736,63 @@ msgstr "自動管理" msgid "Date start" msgstr "開始日" -#: assets/models/automations/base.py:80 -#: assets/models/automations/change_secret.py:67 ops/models/base.py:55 +#: assets/models/automations/base.py:88 +#: assets/models/automations/change_secret.py:59 ops/models/base.py:55 msgid "Date finished" msgstr "終了日" -#: assets/models/automations/base.py:82 +#: assets/models/automations/base.py:90 #, fuzzy #| msgid "Relation snapshot" msgid "Automation snapshot" msgstr "製造オーダスナップショット" -#: assets/models/automations/base.py:86 assets/models/backup.py:88 +#: assets/models/automations/base.py:94 assets/models/backup.py:88 #: assets/serializers/account/backup.py:36 #: xpack/plugins/change_auth_plan/models/base.py:121 #: xpack/plugins/change_auth_plan/serializers/base.py:78 msgid "Trigger mode" msgstr "トリガーモード" -#: assets/models/automations/base.py:90 +#: assets/models/automations/base.py:98 #, fuzzy #| msgid "Command execution" msgid "Automation task execution" msgstr "コマンド実行" -#: assets/models/automations/change_secret.py:17 assets/models/base.py:62 +#: assets/models/automations/change_secret.py:16 assets/models/base.py:62 #, fuzzy #| msgid "Secret key" msgid "Secret type" msgstr "秘密キー" -#: assets/models/automations/change_secret.py:21 +#: assets/models/automations/change_secret.py:20 #, fuzzy #| msgid "SSH Key strategy" msgid "Secret strategy" msgstr "SSHキー戦略" -#: assets/models/automations/change_secret.py:23 -#: assets/models/automations/change_secret.py:65 assets/models/base.py:64 -#: assets/serializers/account/base.py:17 authentication/models.py:73 -#: authentication/models.py:249 +#: assets/models/automations/change_secret.py:22 +#: assets/models/automations/change_secret.py:57 assets/models/base.py:64 +#: assets/serializers/account/base.py:17 authentication/models.py:66 +#: authentication/models.py:246 #: authentication/templates/authentication/_access_key_modal.html:31 #: settings/serializers/auth/radius.py:17 msgid "Secret" msgstr "ひみつ" -#: assets/models/automations/change_secret.py:24 +#: assets/models/automations/change_secret.py:23 #: xpack/plugins/change_auth_plan/models/base.py:39 msgid "Password rules" msgstr "パスワードルール" -#: assets/models/automations/change_secret.py:27 +#: assets/models/automations/change_secret.py:26 #, fuzzy #| msgid "SSH Key strategy" msgid "SSH key change strategy" msgstr "SSHキー戦略" -#: assets/models/automations/change_secret.py:29 assets/models/backup.py:28 +#: assets/models/automations/change_secret.py:28 assets/models/backup.py:28 #: assets/serializers/account/backup.py:28 #: xpack/plugins/change_auth_plan/models/app.py:40 #: xpack/plugins/change_auth_plan/models/asset.py:63 @@ -791,31 +800,31 @@ msgstr "SSHキー戦略" msgid "Recipient" msgstr "受信者" -#: assets/models/automations/change_secret.py:36 +#: assets/models/automations/change_secret.py:35 #, fuzzy #| msgid "Change auth" msgid "Change secret automation" msgstr "秘密を改める" -#: assets/models/automations/change_secret.py:64 +#: assets/models/automations/change_secret.py:56 #, fuzzy #| msgid "Secret" msgid "Old secret" msgstr "ひみつ" -#: assets/models/automations/change_secret.py:66 +#: assets/models/automations/change_secret.py:58 #, fuzzy #| msgid "Date start" msgid "Date started" msgstr "開始日" -#: assets/models/automations/change_secret.py:69 +#: assets/models/automations/change_secret.py:61 #, fuzzy #| msgid "WeCom Error" msgid "Error" msgstr "企業微信エラー" -#: assets/models/automations/change_secret.py:72 +#: assets/models/automations/change_secret.py:64 #, fuzzy #| msgid "Change auth" msgid "Change secret record" @@ -827,7 +836,7 @@ msgstr "秘密を改める" msgid "Discovery account automation" msgstr "パスワード/キーの確認" -#: assets/models/automations/gather_facts.py:11 +#: assets/models/automations/gather_facts.py:15 #, fuzzy #| msgid "Gather assets users" msgid "Gather asset facts" @@ -863,7 +872,7 @@ msgid "Account backup snapshot" msgstr "アカウントのバックアップスナップショット" #: assets/models/backup.py:91 audits/models.py:127 -#: terminal/models/sharing.py:108 +#: terminal/models/session/sharing.py:108 #: xpack/plugins/change_auth_plan/models/base.py:197 #: xpack/plugins/change_auth_plan/serializers/asset.py:171 #: xpack/plugins/cloud/models.py:175 @@ -884,7 +893,7 @@ msgstr "アカウントバックアップの実行" msgid "Connectivity" msgstr "接続性" -#: assets/models/base.py:32 authentication/models.py:251 +#: assets/models/base.py:32 authentication/models.py:248 msgid "Date verified" msgstr "確認済みの日付" @@ -906,7 +915,7 @@ msgid "Regex" msgstr "正規情報" #: assets/models/cmd_filter.py:60 terminal/backends/command/serializers.py:15 -#: terminal/models/session.py:41 +#: terminal/models/session/session.py:41 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 msgid "Command" @@ -1203,7 +1212,7 @@ msgstr "ひみつ" msgid "Account template not found" msgstr "" -#: assets/serializers/account/backup.py:27 ops/mixin.py:104 +#: assets/serializers/account/backup.py:27 ops/mixin.py:102 #: settings/serializers/auth/ldap.py:65 #: xpack/plugins/change_auth_plan/serializers/base.py:43 msgid "Periodic perform" @@ -1237,13 +1246,13 @@ msgstr "プロトコル" msgid "Address" msgstr "アドレス" -#: assets/serializers/asset/common.py:136 +#: assets/serializers/asset/common.py:138 #, fuzzy #| msgid "Application not exists" msgid "Platform not exist" msgstr "アプリが存在しません" -#: assets/serializers/asset/common.py:152 +#: assets/serializers/asset/common.py:154 #, fuzzy #| msgid "Protocol duplicate: {}" msgid "Protocol is required: {}" @@ -1506,7 +1515,7 @@ msgid "Symlink" msgstr "Symlink" #: audits/models.py:38 audits/models.py:66 audits/models.py:89 -#: terminal/models/session.py:37 terminal/models/sharing.py:96 +#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:96 msgid "Remote addr" msgstr "リモートaddr" @@ -1518,8 +1527,8 @@ msgstr "操作" msgid "Filename" msgstr "ファイル名" -#: audits/models.py:43 audits/models.py:117 terminal/models/sharing.py:104 -#: tickets/views/approve.py:114 +#: audits/models.py:43 audits/models.py:117 +#: terminal/models/session/sharing.py:104 tickets/views/approve.py:114 #: xpack/plugins/change_auth_plan/serializers/asset.py:189 msgid "Success" msgstr "成功" @@ -1597,7 +1606,9 @@ msgstr "ユーザーエージェント" msgid "MFA" msgstr "MFA" -#: audits/models.py:128 ops/models/base.py:48 terminal/models/status.py:33 +#: audits/models.py:128 ops/models/base.py:48 +#: terminal/models/applet/applet.py:61 terminal/models/applet/host.py:15 +#: terminal/models/applet/host.py:27 terminal/models/component/status.py:33 #: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171 #: xpack/plugins/cloud/models.py:223 msgid "Status" @@ -1661,7 +1672,7 @@ msgstr "本を飛ばす" msgid "DingTalk" msgstr "DingTalk" -#: audits/signal_handlers.py:56 authentication/models.py:255 +#: audits/signal_handlers.py:56 authentication/models.py:252 msgid "Temporary token" msgstr "仮パスワード" @@ -1814,7 +1825,7 @@ msgstr "" msgid "Invalid token or cache refreshed." msgstr "無効なトークンまたはキャッシュの更新。" -#: authentication/backends/oauth2/backends.py:155 authentication/models.py:146 +#: authentication/backends/oauth2/backends.py:155 authentication/models.py:143 msgid "User invalid, disabled or expired" msgstr "ユーザーが無効、無効、または期限切れです" @@ -2089,70 +2100,76 @@ msgstr "期限切れ" msgid "SSO token" msgstr "SSO token" -#: authentication/models.py:75 authentication/models.py:252 +#: authentication/models.py:68 authentication/models.py:249 #: perms/models/asset_permission.py:79 #: tickets/models/ticket/apply_application.py:29 #: tickets/models/ticket/apply_asset.py:22 users/models/user.py:707 msgid "Date expired" msgstr "期限切れの日付" -#: authentication/models.py:82 rbac/serializers/rolebinding.py:21 +#: authentication/models.py:75 rbac/serializers/rolebinding.py:21 msgid "User display" msgstr "ユーザー表示" -#: authentication/models.py:87 +#: authentication/models.py:80 msgid "Asset display" msgstr "アセット名" -#: authentication/models.py:92 +#: authentication/models.py:85 +#, fuzzy +#| msgid "Action display" +msgid "Account display" +msgstr "アクション表示" + +#: authentication/models.py:89 msgid "Connection token" msgstr "接続トークン" -#: authentication/models.py:94 +#: authentication/models.py:91 msgid "Can view connection token secret" msgstr "接続トークンの秘密を表示できます" -#: authentication/models.py:137 +#: authentication/models.py:134 msgid "Connection token expired at: {}" msgstr "接続トークンの有効期限: {}" -#: authentication/models.py:142 +#: authentication/models.py:139 msgid "User not exists" msgstr "ユーザーは存在しません" -#: authentication/models.py:151 +#: authentication/models.py:148 msgid "System user not exists" msgstr "システムユーザーが存在しません" -#: authentication/models.py:157 +#: authentication/models.py:154 msgid "Asset not exists" msgstr "アセットが存在しません" -#: authentication/models.py:161 +#: authentication/models.py:158 msgid "Asset inactive" msgstr "アセットがアクティブ化されていません" -#: authentication/models.py:168 +#: authentication/models.py:165 msgid "User has no permission to access asset or permission expired" msgstr "" "ユーザーがアセットにアクセスする権限を持っていないか、権限の有効期限が切れて" "います" -#: authentication/models.py:176 +#: authentication/models.py:173 msgid "Application not exists" msgstr "アプリが存在しません" -#: authentication/models.py:183 +#: authentication/models.py:180 msgid "User has no permission to access application or permission expired" msgstr "" "ユーザーがアプリにアクセスする権限を持っていないか、権限の有効期限が切れてい" "ます" -#: authentication/models.py:250 +#: authentication/models.py:247 msgid "Verified" msgstr "確認済み" -#: authentication/models.py:271 +#: authentication/models.py:268 msgid "Super connection token" msgstr "スーパー接続トークン" @@ -2818,19 +2835,19 @@ msgstr "メール" msgid "Site message" msgstr "サイトメッセージ" -#: ops/ansible/inventory.py:76 +#: ops/ansible/inventory.py:75 #, fuzzy #| msgid "Account unavailable" msgid "No account available" msgstr "利用できないアカウント" -#: ops/ansible/inventory.py:171 +#: ops/ansible/inventory.py:173 #, fuzzy #| msgid "User disabled." msgid "Ansible disabled" msgstr "ユーザーが無効になりました。" -#: ops/ansible/inventory.py:186 +#: ops/ansible/inventory.py:189 msgid "Skip hosts below:" msgstr "" @@ -2866,28 +2883,28 @@ msgstr "パスワードの変更" msgid "Custom password" msgstr "カスタムパスワード" -#: ops/mixin.py:27 ops/mixin.py:90 settings/serializers/auth/ldap.py:72 +#: ops/mixin.py:25 ops/mixin.py:88 settings/serializers/auth/ldap.py:72 msgid "Cycle perform" msgstr "サイクル実行" -#: ops/mixin.py:31 ops/mixin.py:88 ops/mixin.py:107 +#: ops/mixin.py:29 ops/mixin.py:86 ops/mixin.py:105 #: settings/serializers/auth/ldap.py:69 msgid "Regularly perform" msgstr "定期的に実行する" -#: ops/mixin.py:110 +#: ops/mixin.py:108 msgid "Interval" msgstr "間隔" -#: ops/mixin.py:120 +#: ops/mixin.py:118 msgid "* Please enter a valid crontab expression" msgstr "* 有効なcrontab式を入力してください" -#: ops/mixin.py:127 +#: ops/mixin.py:125 msgid "Range {} to {}" msgstr "{} から {} までの範囲" -#: ops/mixin.py:138 +#: ops/mixin.py:136 msgid "Require periodic or regularly perform setting" msgstr "定期的または定期的に設定を行う必要があります" @@ -2899,7 +2916,8 @@ msgstr "パターン" msgid "Module" msgstr "" -#: ops/models/adhoc.py:20 ops/models/celery.py:15 terminal/models/task.py:17 +#: ops/models/adhoc.py:20 ops/models/celery.py:15 +#: terminal/models/component/task.py:17 msgid "Args" msgstr "アルグ" @@ -2917,7 +2935,8 @@ msgstr "" msgid "AdHoc execution" msgstr "アドホックエキューション" -#: ops/models/base.py:16 ops/models/base.py:52 terminal/models/sharing.py:24 +#: ops/models/base.py:16 ops/models/base.py:52 +#: terminal/models/session/sharing.py:24 msgid "Creator" msgstr "作成者" @@ -2941,7 +2960,7 @@ msgstr "結果" msgid "Summary" msgstr "" -#: ops/models/celery.py:16 terminal/models/task.py:18 +#: ops/models/celery.py:16 terminal/models/component/task.py:18 msgid "Kwargs" msgstr "クワーグ" @@ -2950,8 +2969,8 @@ msgstr "クワーグ" msgid "State" msgstr "状態" -#: ops/models/celery.py:18 terminal/models/sharing.py:111 tickets/const.py:25 -#: xpack/plugins/change_auth_plan/models/base.py:188 +#: ops/models/celery.py:18 terminal/models/session/sharing.py:111 +#: tickets/const.py:25 xpack/plugins/change_auth_plan/models/base.py:188 msgid "Finished" msgstr "終了" @@ -2975,7 +2994,7 @@ msgstr "" msgid "Template" msgstr "テンプレート" -#: ops/models/playbook.py:38 terminal/models/task.py:26 +#: ops/models/playbook.py:38 terminal/models/component/task.py:26 #: xpack/plugins/gathered_user/models.py:68 msgid "Task" msgstr "タスク" @@ -3366,7 +3385,7 @@ msgstr "パーマ" msgid "Scope display" msgstr "スコープ表示" -#: rbac/serializers/role.py:27 +#: rbac/serializers/role.py:27 terminal/models/applet/applet.py:26 msgid "Display name" msgstr "表示名" @@ -4630,8 +4649,8 @@ msgstr "期限切れです。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" @@ -4652,34 +4671,34 @@ msgid "" " " msgstr "" "\n" -" クリックしてください リンク パスワードの更新\n" +" クリックしてください リンク パスワードの更新\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" +" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" +" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -4743,62 +4762,62 @@ msgstr "" msgid "Offline video player" msgstr "オフラインビデオプレーヤー" -#: terminal/api/endpoint.py:33 +#: terminal/api/component/endpoint.py:33 msgid "Not found protocol query params" msgstr "プロトコルクエリパラメータが見つかりません" -#: terminal/api/session.py:216 -msgid "Session does not exist: {}" -msgstr "セッションが存在しません: {}" - -#: terminal/api/session.py:219 -msgid "Session is finished or the protocol not supported" -msgstr "セッションが終了したか、プロトコルがサポートされていません" - -#: terminal/api/session.py:224 -msgid "User does not exist: {}" -msgstr "ユーザーが存在しない: {}" - -#: terminal/api/session.py:232 -msgid "User does not have permission" -msgstr "ユーザーに権限がありません" - -#: terminal/api/sharing.py:30 -msgid "Secure session sharing settings is disabled" -msgstr "安全なセッション共有設定が無効になっています" - -#: terminal/api/storage.py:28 +#: terminal/api/component/storage.py:28 msgid "Deleting the default storage is not allowed" msgstr "デフォルトのストレージの削除は許可されていません" -#: terminal/api/storage.py:31 +#: terminal/api/component/storage.py:31 msgid "Cannot delete storage that is being used" msgstr "使用中のストレージを削除できません" -#: terminal/api/storage.py:72 terminal/api/storage.py:73 +#: terminal/api/component/storage.py:72 terminal/api/component/storage.py:73 msgid "Command storages" msgstr "コマンドストア" -#: terminal/api/storage.py:79 +#: terminal/api/component/storage.py:79 msgid "Invalid" msgstr "無効" -#: terminal/api/storage.py:119 +#: terminal/api/component/storage.py:119 msgid "Test failure: {}" msgstr "テスト失敗: {}" -#: terminal/api/storage.py:122 +#: terminal/api/component/storage.py:122 msgid "Test successful" msgstr "テスト成功" -#: terminal/api/storage.py:124 +#: terminal/api/component/storage.py:124 msgid "Test failure: Account invalid" msgstr "テスト失敗: アカウントが無効" -#: terminal/api/terminal.py:39 +#: terminal/api/component/terminal.py:39 msgid "Have online sessions" msgstr "オンラインセッションを持つ" +#: terminal/api/session/session.py:217 +msgid "Session does not exist: {}" +msgstr "セッションが存在しません: {}" + +#: terminal/api/session/session.py:220 +msgid "Session is finished or the protocol not supported" +msgstr "セッションが終了したか、プロトコルがサポートされていません" + +#: terminal/api/session/session.py:225 +msgid "User does not exist: {}" +msgstr "ユーザーが存在しない: {}" + +#: terminal/api/session/session.py:233 +msgid "User does not have permission" +msgstr "ユーザーに権限がありません" + +#: terminal/api/session/sharing.py:29 +msgid "Secure session sharing settings is disabled" +msgstr "安全なセッション共有設定が無効になっています" + #: terminal/apps.py:9 msgid "Terminals" msgstr "ターミナル管理" @@ -4828,8 +4847,8 @@ msgstr "入力" msgid "Output" msgstr "出力" -#: terminal/backends/command/models.py:25 terminal/models/replay.py:9 -#: terminal/models/sharing.py:19 terminal/models/sharing.py:78 +#: terminal/backends/command/models.py:25 terminal/models/session/replay.py:9 +#: terminal/models/session/sharing.py:19 terminal/models/session/sharing.py:78 #: terminal/templates/terminal/_msg_command_alert.html:10 #: tickets/models/ticket/command_confirm.py:17 msgid "Session" @@ -4852,7 +4871,8 @@ msgstr "リスクレベル表示" msgid "Timestamp" msgstr "タイムスタンプ" -#: terminal/backends/command/serializers.py:41 terminal/models/terminal.py:105 +#: terminal/backends/command/serializers.py:41 +#: terminal/models/component/terminal.py:105 msgid "Remote Address" msgstr "リモートアドレス" @@ -4880,209 +4900,264 @@ msgstr "一括作成非サポート" msgid "Storage is invalid" msgstr "ストレージが無効です" -#: terminal/models/command.py:66 -msgid "Command record" -msgstr "コマンドレコード" +#: terminal/models/applet/applet.py:21 +#, fuzzy +#| msgid "Manually input" +msgid "Manual" +msgstr "手動入力" -#: terminal/models/endpoint.py:13 +#: terminal/models/applet/applet.py:22 +msgid "Git" +msgstr "" + +#: terminal/models/applet/applet.py:23 +#, fuzzy +#| msgid "Remote app" +msgid "Remote gzip" +msgstr "リモートアプリ" + +#: terminal/models/applet/applet.py:28 +#, fuzzy +#| msgid "Auth url" +msgid "Author" +msgstr "認証アドレス" + +#: terminal/models/applet/applet.py:32 +msgid "Tags" +msgstr "" + +#: terminal/models/applet/applet.py:59 terminal/models/applet/host.py:17 +#, fuzzy +#| msgid "Apply assets" +msgid "Applet" +msgstr "資産の適用" + +#: terminal/models/applet/host.py:13 +#, fuzzy +#| msgid "Verify auth" +msgid "Account automation" +msgstr "パスワード/キーの確認" + +#: terminal/models/applet/host.py:14 +#, fuzzy +#| msgid "Date sync" +msgid "Date synced" +msgstr "日付の同期" + +#: terminal/models/applet/host.py:26 +#, fuzzy +#| msgid "Host" +msgid "Hosting" +msgstr "ホスト" + +#: terminal/models/component/endpoint.py:14 msgid "HTTPS Port" msgstr "HTTPS ポート" -#: terminal/models/endpoint.py:14 terminal/models/terminal.py:107 +#: terminal/models/component/endpoint.py:15 +#: terminal/models/component/terminal.py:107 msgid "HTTP Port" msgstr "HTTP ポート" -#: terminal/models/endpoint.py:15 terminal/models/terminal.py:106 +#: terminal/models/component/endpoint.py:16 +#: terminal/models/component/terminal.py:106 msgid "SSH Port" msgstr "SSH ポート" -#: terminal/models/endpoint.py:16 +#: terminal/models/component/endpoint.py:17 msgid "RDP Port" msgstr "RDP ポート" -#: terminal/models/endpoint.py:17 +#: terminal/models/component/endpoint.py:18 msgid "MySQL Port" msgstr "MySQL ポート" -#: terminal/models/endpoint.py:18 +#: terminal/models/component/endpoint.py:19 msgid "MariaDB Port" msgstr "MariaDB ポート" -#: terminal/models/endpoint.py:19 +#: terminal/models/component/endpoint.py:20 msgid "PostgreSQL Port" msgstr "PostgreSQL ポート" -#: terminal/models/endpoint.py:20 +#: terminal/models/component/endpoint.py:21 msgid "Redis Port" msgstr "Redis ポート" -#: terminal/models/endpoint.py:21 +#: terminal/models/component/endpoint.py:22 msgid "Oracle 11g Port" msgstr "Oracle 11g ポート" -#: terminal/models/endpoint.py:22 +#: terminal/models/component/endpoint.py:23 msgid "Oracle 12c Port" msgstr "Oracle 12c ポート" -#: terminal/models/endpoint.py:28 terminal/models/endpoint.py:94 -#: terminal/serializers/endpoint.py:57 terminal/serializers/storage.py:38 -#: terminal/serializers/storage.py:50 terminal/serializers/storage.py:80 -#: terminal/serializers/storage.py:90 terminal/serializers/storage.py:98 +#: terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:95 terminal/serializers/endpoint.py:57 +#: terminal/serializers/storage.py:38 terminal/serializers/storage.py:50 +#: terminal/serializers/storage.py:80 terminal/serializers/storage.py:90 +#: terminal/serializers/storage.py:98 msgid "Endpoint" msgstr "エンドポイント" -#: terminal/models/endpoint.py:87 +#: terminal/models/component/endpoint.py:88 msgid "IP group" msgstr "IP グループ" -#: terminal/models/endpoint.py:99 +#: terminal/models/component/endpoint.py:100 msgid "Endpoint rule" msgstr "エンドポイントルール" -#: terminal/models/replay.py:12 -msgid "Session replay" -msgstr "セッション再生" - -#: terminal/models/replay.py:14 -msgid "Can upload session replay" -msgstr "セッションのリプレイをアップロードできます" - -#: terminal/models/replay.py:15 -msgid "Can download session replay" -msgstr "セッション再生をダウンロードできます" - -#: terminal/models/session.py:36 terminal/models/sharing.py:101 -msgid "Login from" -msgstr "ログイン元" - -#: terminal/models/session.py:40 -msgid "Replay" -msgstr "リプレイ" - -#: terminal/models/session.py:44 -msgid "Date end" -msgstr "終了日" - -#: terminal/models/session.py:236 -msgid "Session record" -msgstr "セッション記録" - -#: terminal/models/session.py:238 -msgid "Can monitor session" -msgstr "セッションを監視できます" - -#: terminal/models/session.py:239 -msgid "Can share session" -msgstr "セッションを共有できます" - -#: terminal/models/session.py:240 -msgid "Can terminate session" -msgstr "セッションを終了できます" - -#: terminal/models/session.py:241 -msgid "Can validate session action perm" -msgstr "セッションアクションのパーマを検証できます" - -#: terminal/models/sharing.py:26 terminal/models/sharing.py:80 -msgid "Verify code" -msgstr "コードの確認" - -#: terminal/models/sharing.py:31 -msgid "Expired time (min)" -msgstr "期限切れ時間 (分)" - -#: terminal/models/sharing.py:37 terminal/models/sharing.py:83 -msgid "Session sharing" -msgstr "セッション共有" - -#: terminal/models/sharing.py:39 -msgid "Can add super session sharing" -msgstr "スーパーセッション共有を追加できます" - -#: terminal/models/sharing.py:66 -msgid "Link not active" -msgstr "リンクがアクティブでない" - -#: terminal/models/sharing.py:68 -msgid "Link expired" -msgstr "リンク期限切れ" - -#: terminal/models/sharing.py:70 -msgid "User not allowed to join" -msgstr "ユーザーはセッションに参加できません" - -#: terminal/models/sharing.py:87 terminal/serializers/sharing.py:59 -msgid "Joiner" -msgstr "ジョイナー" - -#: terminal/models/sharing.py:90 -msgid "Date joined" -msgstr "参加日" - -#: terminal/models/sharing.py:93 -msgid "Date left" -msgstr "日付が残っています" - -#: terminal/models/sharing.py:116 -msgid "Session join record" -msgstr "セッション参加記録" - -#: terminal/models/sharing.py:132 -msgid "Invalid verification code" -msgstr "検証コードが無効" - -#: terminal/models/status.py:18 +#: terminal/models/component/status.py:18 msgid "Session Online" msgstr "セッションオンライン" -#: terminal/models/status.py:19 +#: terminal/models/component/status.py:19 msgid "CPU Load" msgstr "CPUロード" -#: terminal/models/status.py:20 +#: terminal/models/component/status.py:20 msgid "Memory Used" msgstr "使用メモリ" -#: terminal/models/status.py:21 +#: terminal/models/component/status.py:21 msgid "Disk Used" msgstr "使用済みディスク" -#: terminal/models/status.py:22 +#: terminal/models/component/status.py:22 msgid "Connections" msgstr "接続" -#: terminal/models/status.py:23 +#: terminal/models/component/status.py:23 msgid "Threads" msgstr "スレッド" -#: terminal/models/status.py:24 +#: terminal/models/component/status.py:24 msgid "Boot Time" msgstr "ブート時間" -#: terminal/models/storage.py:28 +#: terminal/models/component/storage.py:27 msgid "Default storage" msgstr "デフォルトのストレージ" -#: terminal/models/storage.py:137 terminal/models/terminal.py:108 +#: terminal/models/component/storage.py:136 +#: terminal/models/component/terminal.py:108 msgid "Command storage" msgstr "コマンドストレージ" -#: terminal/models/storage.py:197 terminal/models/terminal.py:109 +#: terminal/models/component/storage.py:196 +#: terminal/models/component/terminal.py:109 msgid "Replay storage" msgstr "再生ストレージ" -#: terminal/models/terminal.py:103 +#: terminal/models/component/terminal.py:103 msgid "type" msgstr "タイプ" -#: terminal/models/terminal.py:183 +#: terminal/models/component/terminal.py:183 msgid "Terminal" msgstr "ターミナル" -#: terminal/models/terminal.py:185 +#: terminal/models/component/terminal.py:185 msgid "Can view terminal config" msgstr "ターミナル構成を表示できます" +#: terminal/models/session/command.py:66 +msgid "Command record" +msgstr "コマンドレコード" + +#: terminal/models/session/replay.py:12 +msgid "Session replay" +msgstr "セッション再生" + +#: terminal/models/session/replay.py:14 +msgid "Can upload session replay" +msgstr "セッションのリプレイをアップロードできます" + +#: terminal/models/session/replay.py:15 +msgid "Can download session replay" +msgstr "セッション再生をダウンロードできます" + +#: terminal/models/session/session.py:36 terminal/models/session/sharing.py:101 +msgid "Login from" +msgstr "ログイン元" + +#: terminal/models/session/session.py:40 +msgid "Replay" +msgstr "リプレイ" + +#: terminal/models/session/session.py:44 +msgid "Date end" +msgstr "終了日" + +#: terminal/models/session/session.py:236 +msgid "Session record" +msgstr "セッション記録" + +#: terminal/models/session/session.py:238 +msgid "Can monitor session" +msgstr "セッションを監視できます" + +#: terminal/models/session/session.py:239 +msgid "Can share session" +msgstr "セッションを共有できます" + +#: terminal/models/session/session.py:240 +msgid "Can terminate session" +msgstr "セッションを終了できます" + +#: terminal/models/session/session.py:241 +msgid "Can validate session action perm" +msgstr "セッションアクションのパーマを検証できます" + +#: terminal/models/session/sharing.py:26 terminal/models/session/sharing.py:80 +msgid "Verify code" +msgstr "コードの確認" + +#: terminal/models/session/sharing.py:31 +msgid "Expired time (min)" +msgstr "期限切れ時間 (分)" + +#: terminal/models/session/sharing.py:37 terminal/models/session/sharing.py:83 +msgid "Session sharing" +msgstr "セッション共有" + +#: terminal/models/session/sharing.py:39 +msgid "Can add super session sharing" +msgstr "スーパーセッション共有を追加できます" + +#: terminal/models/session/sharing.py:66 +msgid "Link not active" +msgstr "リンクがアクティブでない" + +#: terminal/models/session/sharing.py:68 +msgid "Link expired" +msgstr "リンク期限切れ" + +#: terminal/models/session/sharing.py:70 +msgid "User not allowed to join" +msgstr "ユーザーはセッションに参加できません" + +#: terminal/models/session/sharing.py:87 terminal/serializers/sharing.py:59 +msgid "Joiner" +msgstr "ジョイナー" + +#: terminal/models/session/sharing.py:90 +msgid "Date joined" +msgstr "参加日" + +#: terminal/models/session/sharing.py:93 +msgid "Date left" +msgstr "日付が残っています" + +#: terminal/models/session/sharing.py:116 +msgid "Session join record" +msgstr "セッション参加記録" + +#: terminal/models/session/sharing.py:132 +msgid "Invalid verification code" +msgstr "検証コードが無効" + #: terminal/notifications.py:22 msgid "Sessions" msgstr "セッション" @@ -5099,6 +5174,10 @@ msgstr "レベル" msgid "Batch danger command alert" msgstr "一括危険コマンド警告" +#: terminal/serializers/applet.py:19 +msgid "Icon" +msgstr "" + #: terminal/serializers/endpoint.py:12 msgid "Oracle port" msgstr "" @@ -6925,9 +7004,6 @@ msgstr "コミュニティ版" #~ msgid "Unsupported protocols: {}" #~ msgstr "サポートされていないプロトコル: {}" -#~ msgid "Remote app" -#~ msgstr "リモートアプリ" - #~ msgid "Custom" #~ msgstr "カスタム" @@ -7040,9 +7116,6 @@ msgstr "コミュニティ版" #~ msgid "CPU info" #~ msgstr "CPU情報" -#~ msgid "Action display" -#~ msgstr "アクション表示" - #~ msgid "Applications amount" #~ msgstr "申し込み金額" diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 2c51cf456..59384abe0 100644 --- a/apps/locale/zh/LC_MESSAGES/django.mo +++ b/apps/locale/zh/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab1c609cc4c83a223835be0eab2a5a5b9050c853b66ccd2b2fa480073c8fc763 -size 103346 +oid sha256:5d945fc6151d6f6354052a0a09706a52e7a2fa2f9e02254965cf26b134d78c3a +size 103377 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index d5c183d17..06af10e1f 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-10-20 20:21+0800\n" +"POT-Creation-Date: 2022-10-26 16:41+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -28,36 +28,37 @@ msgstr "访问控制" #: assets/models/domain.py:24 assets/models/group.py:20 #: assets/models/label.py:17 assets/models/platform.py:22 #: assets/models/platform.py:68 assets/serializers/asset/common.py:86 -#: assets/serializers/platform.py:104 ops/mixin.py:22 ops/models/playbook.py:9 +#: assets/serializers/platform.py:104 ops/mixin.py:20 ops/models/playbook.py:9 #: orgs/models.py:70 perms/models/asset_permission.py:56 rbac/models/role.py:29 #: settings/models.py:33 settings/serializers/sms.py:6 -#: terminal/models/endpoint.py:10 terminal/models/endpoint.py:86 -#: terminal/models/storage.py:26 terminal/models/task.py:16 -#: terminal/models/terminal.py:100 users/forms/profile.py:33 +#: terminal/models/applet/applet.py:25 terminal/models/component/endpoint.py:11 +#: terminal/models/component/endpoint.py:87 +#: terminal/models/component/storage.py:25 terminal/models/component/task.py:16 +#: terminal/models/component/terminal.py:100 users/forms/profile.py:33 #: users/models/group.py:15 users/models/user.py:665 #: xpack/plugins/cloud/models.py:30 msgid "Name" msgstr "名称" #: acls/models/base.py:27 assets/models/_user.py:47 -#: assets/models/cmd_filter.py:76 terminal/models/endpoint.py:89 +#: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:90 msgid "Priority" msgstr "优先级" #: acls/models/base.py:28 assets/models/_user.py:47 -#: assets/models/cmd_filter.py:76 terminal/models/endpoint.py:90 +#: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:91 msgid "1-100, the lower the value will be match first" msgstr "优先级可选范围为 1-100 (数值越小越优先)" #: acls/models/base.py:31 authentication/models.py:22 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:74 terminal/models/sharing.py:28 +#: perms/models/asset_permission.py:74 terminal/models/session/sharing.py:28 #: tickets/const.py:38 msgid "Active" msgstr "激活中" #: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40 -#: assets/models/asset/common.py:101 assets/models/automations/base.py:24 +#: assets/models/asset/common.py:100 assets/models/automations/base.py:25 #: assets/models/backup.py:30 assets/models/base.py:66 #: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88 #: assets/models/domain.py:25 assets/models/domain.py:69 @@ -65,9 +66,12 @@ msgstr "激活中" #: assets/models/platform.py:73 ops/models/playbook.py:11 #: ops/models/playbook.py:25 orgs/models.py:73 #: perms/models/asset_permission.py:84 rbac/models/role.py:37 -#: settings/models.py:38 terminal/models/endpoint.py:23 -#: terminal/models/endpoint.py:96 terminal/models/storage.py:29 -#: terminal/models/terminal.py:114 tickets/models/comment.py:32 +#: settings/models.py:38 terminal/models/applet/applet.py:33 +#: terminal/models/applet/applet.py:62 terminal/models/applet/host.py:12 +#: terminal/models/applet/host.py:28 terminal/models/component/endpoint.py:24 +#: terminal/models/component/endpoint.py:97 +#: terminal/models/component/storage.py:28 +#: terminal/models/component/terminal.py:114 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:288 users/models/group.py:16 #: users/models/user.py:702 xpack/plugins/change_auth_plan/models/base.py:44 #: xpack/plugins/cloud/models.py:37 xpack/plugins/cloud/models.py:118 @@ -92,14 +96,14 @@ msgstr "登录复核" #: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20 #: assets/models/cmd_filter.py:28 assets/models/label.py:15 audits/models.py:37 #: audits/models.py:62 audits/models.py:87 authentication/models.py:55 -#: authentication/models.py:79 perms/models/asset_permission.py:58 +#: authentication/models.py:72 perms/models/asset_permission.py:58 #: rbac/builtin.py:120 rbac/models/rolebinding.py:41 #: terminal/backends/command/models.py:20 -#: terminal/backends/command/serializers.py:13 terminal/models/session.py:30 -#: terminal/models/sharing.py:33 terminal/notifications.py:91 -#: terminal/notifications.py:139 tickets/models/comment.py:21 users/const.py:14 -#: users/models/user.py:895 users/models/user.py:926 -#: users/serializers/group.py:19 +#: terminal/backends/command/serializers.py:13 +#: terminal/models/session/session.py:30 terminal/models/session/sharing.py:33 +#: terminal/notifications.py:91 terminal/notifications.py:139 +#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:895 +#: users/models/user.py:926 users/serializers/group.py:19 msgid "User" msgstr "用户" @@ -124,8 +128,8 @@ msgid "Login acl" msgstr "登录访问控制" #: acls/models/login_asset_acl.py:21 assets/models/account.py:57 -#: authentication/models.py:88 ops/models/base.py:18 -#: terminal/models/session.py:34 xpack/plugins/cloud/models.py:87 +#: authentication/models.py:82 ops/models/base.py:18 +#: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87 #: xpack/plugins/cloud/serializers/task.py:65 msgid "Account" msgstr "账号" @@ -134,10 +138,10 @@ msgstr "账号" #: 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/serializers/account/account.py:58 assets/serializers/label.py:30 -#: audits/models.py:39 authentication/models.py:67 authentication/models.py:84 +#: audits/models.py:39 authentication/models.py:77 #: perms/models/asset_permission.py:64 terminal/backends/command/models.py:21 -#: terminal/backends/command/serializers.py:14 terminal/models/session.py:32 -#: terminal/notifications.py:90 +#: terminal/backends/command/serializers.py:14 +#: terminal/models/session/session.py:32 terminal/notifications.py:90 #: xpack/plugins/change_auth_plan/models/asset.py:200 #: xpack/plugins/change_auth_plan/serializers/asset.py:172 #: xpack/plugins/cloud/models.py:219 @@ -160,7 +164,7 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. " #: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34 #: assets/models/base.py:60 assets/models/gathered_user.py:15 #: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27 -#: authentication/models.py:248 +#: authentication/models.py:245 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: users/forms/profile.py:32 users/models/user.py:663 @@ -241,10 +245,11 @@ msgid "Category" msgstr "类别" #: applications/models.py:15 assets/models/_user.py:46 -#: assets/models/automations/base.py:22 assets/models/cmd_filter.py:74 +#: assets/models/automations/base.py:23 assets/models/cmd_filter.py:74 #: assets/models/platform.py:70 assets/serializers/asset/common.py:63 -#: assets/serializers/platform.py:75 authentication/models.py:71 -#: terminal/models/storage.py:58 terminal/models/storage.py:143 +#: assets/serializers/platform.py:75 terminal/models/applet/applet.py:29 +#: terminal/models/component/storage.py:57 +#: terminal/models/component/storage.py:142 terminal/serializers/applet.py:20 #: tickets/models/comment.py:26 tickets/models/flow.py:57 #: tickets/models/ticket/apply_application.py:17 #: tickets/models/ticket/general.py:273 @@ -258,7 +263,7 @@ msgstr "类型" msgid "Attrs" msgstr "属性" -#: applications/models.py:23 authentication/models.py:68 +#: applications/models.py:23 msgid "Application" msgstr "应用程序" @@ -392,7 +397,8 @@ msgid "Replace (The key generated by JumpServer) " msgstr "替换 (由 JumpServer 生成的密钥)" #: assets/const/category.py:11 settings/serializers/auth/radius.py:14 -#: settings/serializers/auth/sms.py:56 terminal/models/endpoint.py:11 +#: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:60 +#: terminal/models/applet/host.py:11 terminal/models/component/endpoint.py:12 #: xpack/plugins/cloud/serializers/account_attrs.py:72 msgid "Host" msgstr "主机" @@ -411,11 +417,12 @@ msgstr "数据库" msgid "Cloud service" msgstr "云服务" -#: assets/const/category.py:15 +#: assets/const/category.py:15 terminal/models/applet/applet.py:18 msgid "Web" msgstr "Web" -#: assets/const/device.py:7 tickets/const.py:8 +#: assets/const/device.py:7 terminal/models/applet/applet.py:17 +#: tickets/const.py:8 msgid "General" msgstr "通用" @@ -466,7 +473,7 @@ msgstr "SSH 密钥" msgid "SSH public key" msgstr "SSH 公钥" -#: assets/models/_user.py:41 assets/models/automations/base.py:78 +#: assets/models/_user.py:41 assets/models/automations/base.py:86 #: assets/models/base.py:67 assets/models/domain.py:26 #: assets/models/gathered_user.py:19 assets/models/group.py:22 #: common/db/models.py:76 common/mixins/models.py:50 ops/models/base.py:53 @@ -495,8 +502,8 @@ msgid "Username same with user" msgstr "用户名与用户相同" #: assets/models/_user.py:48 assets/models/domain.py:67 -#: terminal/serializers/session.py:18 terminal/serializers/session.py:32 -#: terminal/serializers/storage.py:68 +#: terminal/models/applet/applet.py:31 terminal/serializers/session.py:18 +#: terminal/serializers/session.py:32 terminal/serializers/storage.py:68 msgid "Protocol" msgstr "协议" @@ -553,6 +560,7 @@ msgid "Su from" msgstr "切换自" #: assets/models/account.py:53 settings/serializers/auth/cas.py:18 +#: terminal/models/applet/applet.py:27 msgid "Version" msgstr "版本" @@ -583,32 +591,33 @@ msgstr "账号模版" msgid "Port" msgstr "端口" -#: assets/models/asset/common.py:94 assets/models/platform.py:104 +#: assets/models/asset/common.py:93 assets/models/platform.py:104 #: assets/serializers/asset/common.py:65 #: perms/serializers/user_permission.py:21 #: xpack/plugins/cloud/serializers/account_attrs.py:172 msgid "Platform" msgstr "资产平台" -#: assets/models/asset/common.py:96 assets/models/domain.py:29 +#: assets/models/asset/common.py:95 assets/models/domain.py:29 #: assets/models/domain.py:68 assets/serializers/asset/common.py:64 msgid "Domain" msgstr "网域" -#: assets/models/asset/common.py:98 assets/models/automations/base.py:17 +#: assets/models/asset/common.py:97 assets/models/automations/base.py:18 #: assets/serializers/asset/common.py:66 perms/models/asset_permission.py:67 #: xpack/plugins/change_auth_plan/models/asset.py:44 #: xpack/plugins/gathered_user/models.py:24 msgid "Nodes" msgstr "节点" -#: assets/models/asset/common.py:99 assets/models/automations/base.py:23 +#: assets/models/asset/common.py:98 assets/models/automations/base.py:24 #: assets/models/cmd_filter.py:39 assets/models/domain.py:70 -#: assets/models/label.py:21 users/serializers/user.py:147 +#: assets/models/label.py:21 terminal/models/applet/applet.py:30 +#: users/serializers/user.py:147 msgid "Is active" msgstr "激活" -#: assets/models/asset/common.py:100 assets/serializers/asset/common.py:67 +#: assets/models/asset/common.py:99 assets/serializers/asset/common.py:67 msgid "Labels" msgstr "标签管理" @@ -666,26 +675,26 @@ msgstr "密码选择器" msgid "Submit selector" msgstr "提交按钮选择器" -#: assets/models/automations/base.py:15 assets/models/cmd_filter.py:38 +#: assets/models/automations/base.py:16 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:68 perms/models/asset_permission.py:70 #: rbac/tree.py:37 msgid "Accounts" msgstr "账号管理" -#: assets/models/automations/base.py:20 assets/serializers/domain.py:29 +#: assets/models/automations/base.py:21 assets/serializers/domain.py:29 #: ops/models/base.py:17 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/change_auth_plan/models/asset.py:40 msgid "Assets" msgstr "资产" -#: assets/models/automations/base.py:68 assets/models/automations/base.py:75 +#: assets/models/automations/base.py:76 assets/models/automations/base.py:83 msgid "Automation task" msgstr "自动化任务" -#: assets/models/automations/base.py:79 assets/models/backup.py:77 +#: assets/models/automations/base.py:87 assets/models/backup.py:77 #: audits/models.py:44 ops/models/base.py:54 -#: perms/models/asset_permission.py:76 terminal/models/session.py:43 +#: perms/models/asset_permission.py:76 terminal/models/session/session.py:43 #: tickets/models/ticket/apply_application.py:28 #: tickets/models/ticket/apply_asset.py:21 #: xpack/plugins/change_auth_plan/models/base.py:108 @@ -694,53 +703,53 @@ msgstr "自动化任务" msgid "Date start" msgstr "开始日期" -#: assets/models/automations/base.py:80 -#: assets/models/automations/change_secret.py:67 ops/models/base.py:55 +#: assets/models/automations/base.py:88 +#: assets/models/automations/change_secret.py:59 ops/models/base.py:55 msgid "Date finished" msgstr "结束日期" -#: assets/models/automations/base.py:82 +#: assets/models/automations/base.py:90 msgid "Automation snapshot" msgstr "自动化快照" -#: assets/models/automations/base.py:86 assets/models/backup.py:88 +#: assets/models/automations/base.py:94 assets/models/backup.py:88 #: assets/serializers/account/backup.py:36 #: xpack/plugins/change_auth_plan/models/base.py:121 #: xpack/plugins/change_auth_plan/serializers/base.py:78 msgid "Trigger mode" msgstr "触发模式" -#: assets/models/automations/base.py:90 +#: assets/models/automations/base.py:98 msgid "Automation task execution" msgstr "自动化任务执行" -#: assets/models/automations/change_secret.py:17 assets/models/base.py:62 +#: assets/models/automations/change_secret.py:16 assets/models/base.py:62 msgid "Secret type" msgstr "密文类型" -#: assets/models/automations/change_secret.py:21 +#: assets/models/automations/change_secret.py:20 msgid "Secret strategy" msgstr "密钥策略" -#: assets/models/automations/change_secret.py:23 -#: assets/models/automations/change_secret.py:65 assets/models/base.py:64 -#: assets/serializers/account/base.py:17 authentication/models.py:73 -#: authentication/models.py:249 +#: assets/models/automations/change_secret.py:22 +#: assets/models/automations/change_secret.py:57 assets/models/base.py:64 +#: assets/serializers/account/base.py:17 authentication/models.py:66 +#: authentication/models.py:246 #: authentication/templates/authentication/_access_key_modal.html:31 #: settings/serializers/auth/radius.py:17 msgid "Secret" msgstr "密钥" -#: assets/models/automations/change_secret.py:24 +#: assets/models/automations/change_secret.py:23 #: xpack/plugins/change_auth_plan/models/base.py:39 msgid "Password rules" msgstr "密码规则" -#: assets/models/automations/change_secret.py:27 +#: assets/models/automations/change_secret.py:26 msgid "SSH key change strategy" msgstr "SSH 密钥策略" -#: assets/models/automations/change_secret.py:29 assets/models/backup.py:28 +#: assets/models/automations/change_secret.py:28 assets/models/backup.py:28 #: assets/serializers/account/backup.py:28 #: xpack/plugins/change_auth_plan/models/app.py:40 #: xpack/plugins/change_auth_plan/models/asset.py:63 @@ -748,23 +757,23 @@ msgstr "SSH 密钥策略" msgid "Recipient" msgstr "收件人" -#: assets/models/automations/change_secret.py:36 +#: assets/models/automations/change_secret.py:35 msgid "Change secret automation" msgstr "自动化改密" -#: assets/models/automations/change_secret.py:64 +#: assets/models/automations/change_secret.py:56 msgid "Old secret" msgstr "原来密码" -#: assets/models/automations/change_secret.py:66 +#: assets/models/automations/change_secret.py:58 msgid "Date started" msgstr "开始日期" -#: assets/models/automations/change_secret.py:69 +#: assets/models/automations/change_secret.py:61 msgid "Error" msgstr "错误" -#: assets/models/automations/change_secret.py:72 +#: assets/models/automations/change_secret.py:64 msgid "Change secret record" msgstr "改密记录" @@ -772,7 +781,7 @@ msgstr "改密记录" msgid "Discovery account automation" msgstr "自动化账号发现" -#: assets/models/automations/gather_facts.py:11 +#: assets/models/automations/gather_facts.py:15 msgid "Gather asset facts" msgstr "收集资产信息" @@ -802,7 +811,7 @@ msgid "Account backup snapshot" msgstr "账号备份快照" #: assets/models/backup.py:91 audits/models.py:127 -#: terminal/models/sharing.py:108 +#: terminal/models/session/sharing.py:108 #: xpack/plugins/change_auth_plan/models/base.py:197 #: xpack/plugins/change_auth_plan/serializers/asset.py:171 #: xpack/plugins/cloud/models.py:175 @@ -823,7 +832,7 @@ msgstr "账号备份执行" msgid "Connectivity" msgstr "可连接性" -#: assets/models/base.py:32 authentication/models.py:251 +#: assets/models/base.py:32 authentication/models.py:248 msgid "Date verified" msgstr "校验日期" @@ -845,7 +854,7 @@ msgid "Regex" msgstr "正则表达式" #: assets/models/cmd_filter.py:60 terminal/backends/command/serializers.py:15 -#: terminal/models/session.py:41 +#: terminal/models/session/session.py:41 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 msgid "Command" @@ -1108,7 +1117,7 @@ msgstr "存在密码" msgid "Account template not found" msgstr "账号模版没有发现" -#: assets/serializers/account/backup.py:27 ops/mixin.py:104 +#: assets/serializers/account/backup.py:27 ops/mixin.py:102 #: settings/serializers/auth/ldap.py:65 #: xpack/plugins/change_auth_plan/serializers/base.py:43 msgid "Periodic perform" @@ -1142,11 +1151,11 @@ msgstr "协议组" msgid "Address" msgstr "地址" -#: assets/serializers/asset/common.py:136 +#: assets/serializers/asset/common.py:138 msgid "Platform not exist" msgstr "平台不存在" -#: assets/serializers/asset/common.py:152 +#: assets/serializers/asset/common.py:154 msgid "Protocol is required: {}" msgstr "协议是必须的: {}" @@ -1393,7 +1402,7 @@ msgid "Symlink" msgstr "建立软链接" #: audits/models.py:38 audits/models.py:66 audits/models.py:89 -#: terminal/models/session.py:37 terminal/models/sharing.py:96 +#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:96 msgid "Remote addr" msgstr "远端地址" @@ -1405,8 +1414,8 @@ msgstr "操作" msgid "Filename" msgstr "文件名" -#: audits/models.py:43 audits/models.py:117 terminal/models/sharing.py:104 -#: tickets/views/approve.py:114 +#: audits/models.py:43 audits/models.py:117 +#: terminal/models/session/sharing.py:104 tickets/views/approve.py:114 #: xpack/plugins/change_auth_plan/serializers/asset.py:189 msgid "Success" msgstr "成功" @@ -1484,7 +1493,9 @@ msgstr "用户代理" msgid "MFA" msgstr "MFA" -#: audits/models.py:128 ops/models/base.py:48 terminal/models/status.py:33 +#: audits/models.py:128 ops/models/base.py:48 +#: terminal/models/applet/applet.py:61 terminal/models/applet/host.py:15 +#: terminal/models/applet/host.py:27 terminal/models/component/status.py:33 #: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171 #: xpack/plugins/cloud/models.py:223 msgid "Status" @@ -1548,7 +1559,7 @@ msgstr "飞书" msgid "DingTalk" msgstr "钉钉" -#: audits/signal_handlers.py:56 authentication/models.py:255 +#: audits/signal_handlers.py:56 authentication/models.py:252 msgid "Temporary token" msgstr "临时密码" @@ -1699,7 +1710,7 @@ msgstr "无效的令牌头。符号字符串不应包含无效字符。" msgid "Invalid token or cache refreshed." msgstr "刷新的令牌或缓存无效。" -#: authentication/backends/oauth2/backends.py:155 authentication/models.py:146 +#: authentication/backends/oauth2/backends.py:155 authentication/models.py:143 msgid "User invalid, disabled or expired" msgstr "用户无效,已禁用或已过期" @@ -1963,66 +1974,72 @@ msgstr "过期时间" msgid "SSO token" msgstr "SSO token" -#: authentication/models.py:75 authentication/models.py:252 +#: authentication/models.py:68 authentication/models.py:249 #: perms/models/asset_permission.py:79 #: tickets/models/ticket/apply_application.py:29 #: tickets/models/ticket/apply_asset.py:22 users/models/user.py:707 msgid "Date expired" msgstr "失效日期" -#: authentication/models.py:82 rbac/serializers/rolebinding.py:21 +#: authentication/models.py:75 rbac/serializers/rolebinding.py:21 msgid "User display" msgstr "用户名称" -#: authentication/models.py:87 +#: authentication/models.py:80 msgid "Asset display" msgstr "资产名称" -#: authentication/models.py:92 +#: authentication/models.py:85 +#, fuzzy +#| msgid "Action display" +msgid "Account display" +msgstr "动作名称" + +#: authentication/models.py:89 msgid "Connection token" msgstr "连接令牌" -#: authentication/models.py:94 +#: authentication/models.py:91 msgid "Can view connection token secret" msgstr "可以查看连接令牌密文" -#: authentication/models.py:137 +#: authentication/models.py:134 msgid "Connection token expired at: {}" msgstr "连接令牌过期: {}" -#: authentication/models.py:142 +#: authentication/models.py:139 msgid "User not exists" msgstr "用户不存在" -#: authentication/models.py:151 +#: authentication/models.py:148 msgid "System user not exists" msgstr "系统用户不存在" -#: authentication/models.py:157 +#: authentication/models.py:154 msgid "Asset not exists" msgstr "资产不存在" -#: authentication/models.py:161 +#: authentication/models.py:158 msgid "Asset inactive" msgstr "资产未激活" -#: authentication/models.py:168 +#: authentication/models.py:165 msgid "User has no permission to access asset or permission expired" msgstr "用户没有权限访问资产或权限已过期" -#: authentication/models.py:176 +#: authentication/models.py:173 msgid "Application not exists" msgstr "应用不存在" -#: authentication/models.py:183 +#: authentication/models.py:180 msgid "User has no permission to access application or permission expired" msgstr "用户没有权限访问应用或权限已过期" -#: authentication/models.py:250 +#: authentication/models.py:247 msgid "Verified" msgstr "已校验" -#: authentication/models.py:271 +#: authentication/models.py:268 msgid "Super connection token" msgstr "超级连接令牌" @@ -2671,15 +2688,15 @@ msgstr "邮件" msgid "Site message" msgstr "站内信" -#: ops/ansible/inventory.py:76 +#: ops/ansible/inventory.py:75 msgid "No account available" msgstr "没有账号可以使用" -#: ops/ansible/inventory.py:171 +#: ops/ansible/inventory.py:173 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:186 +#: ops/ansible/inventory.py:189 msgid "Skip hosts below:" msgstr "跳过一下主机:" @@ -2711,28 +2728,28 @@ msgstr "更改密码" msgid "Custom password" msgstr "自定义密码" -#: ops/mixin.py:27 ops/mixin.py:90 settings/serializers/auth/ldap.py:72 +#: ops/mixin.py:25 ops/mixin.py:88 settings/serializers/auth/ldap.py:72 msgid "Cycle perform" msgstr "周期执行" -#: ops/mixin.py:31 ops/mixin.py:88 ops/mixin.py:107 +#: ops/mixin.py:29 ops/mixin.py:86 ops/mixin.py:105 #: settings/serializers/auth/ldap.py:69 msgid "Regularly perform" msgstr "定期执行" -#: ops/mixin.py:110 +#: ops/mixin.py:108 msgid "Interval" msgstr "间隔" -#: ops/mixin.py:120 +#: ops/mixin.py:118 msgid "* Please enter a valid crontab expression" msgstr "* 请输入有效的 crontab 表达式" -#: ops/mixin.py:127 +#: ops/mixin.py:125 msgid "Range {} to {}" msgstr "输入在 {} - {} 范围之间" -#: ops/mixin.py:138 +#: ops/mixin.py:136 msgid "Require periodic or regularly perform setting" msgstr "需要周期或定期设置" @@ -2744,7 +2761,8 @@ msgstr "模式" msgid "Module" msgstr "" -#: ops/models/adhoc.py:20 ops/models/celery.py:15 terminal/models/task.py:17 +#: ops/models/adhoc.py:20 ops/models/celery.py:15 +#: terminal/models/component/task.py:17 msgid "Args" msgstr "参数" @@ -2760,7 +2778,8 @@ msgstr "" msgid "AdHoc execution" msgstr "任务执行" -#: ops/models/base.py:16 ops/models/base.py:52 terminal/models/sharing.py:24 +#: ops/models/base.py:16 ops/models/base.py:52 +#: terminal/models/session/sharing.py:24 msgid "Creator" msgstr "创建者" @@ -2780,7 +2799,7 @@ msgstr "结果" msgid "Summary" msgstr "汇总" -#: ops/models/celery.py:16 terminal/models/task.py:18 +#: ops/models/celery.py:16 terminal/models/component/task.py:18 msgid "Kwargs" msgstr "其它参数" @@ -2789,8 +2808,8 @@ msgstr "其它参数" msgid "State" msgstr "状态" -#: ops/models/celery.py:18 terminal/models/sharing.py:111 tickets/const.py:25 -#: xpack/plugins/change_auth_plan/models/base.py:188 +#: ops/models/celery.py:18 terminal/models/session/sharing.py:111 +#: tickets/const.py:25 xpack/plugins/change_auth_plan/models/base.py:188 msgid "Finished" msgstr "结束" @@ -2814,7 +2833,7 @@ msgstr "Owner" msgid "Template" msgstr "模板" -#: ops/models/playbook.py:38 terminal/models/task.py:26 +#: ops/models/playbook.py:38 terminal/models/component/task.py:26 #: xpack/plugins/gathered_user/models.py:68 msgid "Task" msgstr "任务" @@ -3197,7 +3216,7 @@ msgstr "权限" msgid "Scope display" msgstr "范围名称" -#: rbac/serializers/role.py:27 +#: rbac/serializers/role.py:27 terminal/models/applet/applet.py:26 msgid "Display name" msgstr "显示名称" @@ -4432,13 +4451,13 @@ msgstr "过期。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" 您的密码已经过期,请点击 链接 更新密码\n" +" 您的密码已经过期,请点击 链接 更新密码\n" " " #: templates/_message.html:30 @@ -4462,8 +4481,8 @@ msgstr "" #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" @@ -4475,13 +4494,13 @@ msgstr "" #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" 您的SSH密钥没有设置或已失效,请点击 链接 更新\n" +" 您的SSH密钥没有设置或已失效,请点击 链接 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -4540,62 +4559,62 @@ msgstr "Jmservisor 是在 windows 远程应用发布服务器中用来拉起远 msgid "Offline video player" msgstr "离线录像播放器" -#: terminal/api/endpoint.py:33 +#: terminal/api/component/endpoint.py:33 msgid "Not found protocol query params" msgstr "" -#: terminal/api/session.py:216 -msgid "Session does not exist: {}" -msgstr "会话不存在: {}" - -#: terminal/api/session.py:219 -msgid "Session is finished or the protocol not supported" -msgstr "会话已经完成或协议不支持" - -#: terminal/api/session.py:224 -msgid "User does not exist: {}" -msgstr "用户不存在: {}" - -#: terminal/api/session.py:232 -msgid "User does not have permission" -msgstr "用户没有权限" - -#: terminal/api/sharing.py:30 -msgid "Secure session sharing settings is disabled" -msgstr "未开启会话共享" - -#: terminal/api/storage.py:28 +#: terminal/api/component/storage.py:28 msgid "Deleting the default storage is not allowed" msgstr "不允许删除默认存储配置" -#: terminal/api/storage.py:31 +#: terminal/api/component/storage.py:31 msgid "Cannot delete storage that is being used" msgstr "不允许删除正在使用的存储配置" -#: terminal/api/storage.py:72 terminal/api/storage.py:73 +#: terminal/api/component/storage.py:72 terminal/api/component/storage.py:73 msgid "Command storages" msgstr "命令存储" -#: terminal/api/storage.py:79 +#: terminal/api/component/storage.py:79 msgid "Invalid" msgstr "无效" -#: terminal/api/storage.py:119 +#: terminal/api/component/storage.py:119 msgid "Test failure: {}" msgstr "测试失败: {}" -#: terminal/api/storage.py:122 +#: terminal/api/component/storage.py:122 msgid "Test successful" msgstr "测试成功" -#: terminal/api/storage.py:124 +#: terminal/api/component/storage.py:124 msgid "Test failure: Account invalid" msgstr "测试失败: 账号无效" -#: terminal/api/terminal.py:39 +#: terminal/api/component/terminal.py:39 msgid "Have online sessions" msgstr "有在线会话" +#: terminal/api/session/session.py:217 +msgid "Session does not exist: {}" +msgstr "会话不存在: {}" + +#: terminal/api/session/session.py:220 +msgid "Session is finished or the protocol not supported" +msgstr "会话已经完成或协议不支持" + +#: terminal/api/session/session.py:225 +msgid "User does not exist: {}" +msgstr "用户不存在: {}" + +#: terminal/api/session/session.py:233 +msgid "User does not have permission" +msgstr "用户没有权限" + +#: terminal/api/session/sharing.py:29 +msgid "Secure session sharing settings is disabled" +msgstr "未开启会话共享" + #: terminal/apps.py:9 msgid "Terminals" msgstr "终端管理" @@ -4625,8 +4644,8 @@ msgstr "输入" msgid "Output" msgstr "输出" -#: terminal/backends/command/models.py:25 terminal/models/replay.py:9 -#: terminal/models/sharing.py:19 terminal/models/sharing.py:78 +#: terminal/backends/command/models.py:25 terminal/models/session/replay.py:9 +#: terminal/models/session/sharing.py:19 terminal/models/session/sharing.py:78 #: terminal/templates/terminal/_msg_command_alert.html:10 #: tickets/models/ticket/command_confirm.py:17 msgid "Session" @@ -4649,7 +4668,8 @@ msgstr "风险等级名称" msgid "Timestamp" msgstr "时间戳" -#: terminal/backends/command/serializers.py:41 terminal/models/terminal.py:105 +#: terminal/backends/command/serializers.py:41 +#: terminal/models/component/terminal.py:105 msgid "Remote Address" msgstr "远端地址" @@ -4677,209 +4697,264 @@ msgstr "不支持批量创建" msgid "Storage is invalid" msgstr "存储无效" -#: terminal/models/command.py:66 -msgid "Command record" -msgstr "命令记录" +#: terminal/models/applet/applet.py:21 +#, fuzzy +#| msgid "Manually input" +msgid "Manual" +msgstr "手动输入" -#: terminal/models/endpoint.py:13 +#: terminal/models/applet/applet.py:22 +msgid "Git" +msgstr "" + +#: terminal/models/applet/applet.py:23 +#, fuzzy +#| msgid "Remote app" +msgid "Remote gzip" +msgstr "远程应用" + +#: terminal/models/applet/applet.py:28 +#, fuzzy +#| msgid "Auth url" +msgid "Author" +msgstr "认证地址" + +#: terminal/models/applet/applet.py:32 +msgid "Tags" +msgstr "" + +#: terminal/models/applet/applet.py:59 terminal/models/applet/host.py:17 +#, fuzzy +#| msgid "Apply assets" +msgid "Applet" +msgstr "申请资产" + +#: terminal/models/applet/host.py:13 +#, fuzzy +#| msgid "Verify account automation" +msgid "Account automation" +msgstr "账号校验自动化" + +#: terminal/models/applet/host.py:14 +#, fuzzy +#| msgid "Date sync" +msgid "Date synced" +msgstr "同步日期" + +#: terminal/models/applet/host.py:26 +#, fuzzy +#| msgid "Host" +msgid "Hosting" +msgstr "主机" + +#: terminal/models/component/endpoint.py:14 msgid "HTTPS Port" msgstr "HTTPS 端口" -#: terminal/models/endpoint.py:14 terminal/models/terminal.py:107 +#: terminal/models/component/endpoint.py:15 +#: terminal/models/component/terminal.py:107 msgid "HTTP Port" msgstr "HTTP 端口" -#: terminal/models/endpoint.py:15 terminal/models/terminal.py:106 +#: terminal/models/component/endpoint.py:16 +#: terminal/models/component/terminal.py:106 msgid "SSH Port" msgstr "SSH 端口" -#: terminal/models/endpoint.py:16 +#: terminal/models/component/endpoint.py:17 msgid "RDP Port" msgstr "RDP 端口" -#: terminal/models/endpoint.py:17 +#: terminal/models/component/endpoint.py:18 msgid "MySQL Port" msgstr "MySQL 端口" -#: terminal/models/endpoint.py:18 +#: terminal/models/component/endpoint.py:19 msgid "MariaDB Port" msgstr "MariaDB 端口" -#: terminal/models/endpoint.py:19 +#: terminal/models/component/endpoint.py:20 msgid "PostgreSQL Port" msgstr "PostgreSQL 端口" -#: terminal/models/endpoint.py:20 +#: terminal/models/component/endpoint.py:21 msgid "Redis Port" msgstr "Redis 端口" -#: terminal/models/endpoint.py:21 +#: terminal/models/component/endpoint.py:22 msgid "Oracle 11g Port" msgstr "Oracle 11g 端口" -#: terminal/models/endpoint.py:22 +#: terminal/models/component/endpoint.py:23 msgid "Oracle 12c Port" msgstr "Oracle 12c 端口" -#: terminal/models/endpoint.py:28 terminal/models/endpoint.py:94 -#: terminal/serializers/endpoint.py:57 terminal/serializers/storage.py:38 -#: terminal/serializers/storage.py:50 terminal/serializers/storage.py:80 -#: terminal/serializers/storage.py:90 terminal/serializers/storage.py:98 +#: terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:95 terminal/serializers/endpoint.py:57 +#: terminal/serializers/storage.py:38 terminal/serializers/storage.py:50 +#: terminal/serializers/storage.py:80 terminal/serializers/storage.py:90 +#: terminal/serializers/storage.py:98 msgid "Endpoint" msgstr "端点" -#: terminal/models/endpoint.py:87 +#: terminal/models/component/endpoint.py:88 msgid "IP group" msgstr "IP 组" -#: terminal/models/endpoint.py:99 +#: terminal/models/component/endpoint.py:100 msgid "Endpoint rule" msgstr "端点规则" -#: terminal/models/replay.py:12 -msgid "Session replay" -msgstr "会话录像" - -#: terminal/models/replay.py:14 -msgid "Can upload session replay" -msgstr "可以上传会话录像" - -#: terminal/models/replay.py:15 -msgid "Can download session replay" -msgstr "可以下载会话录像" - -#: terminal/models/session.py:36 terminal/models/sharing.py:101 -msgid "Login from" -msgstr "登录来源" - -#: terminal/models/session.py:40 -msgid "Replay" -msgstr "回放" - -#: terminal/models/session.py:44 -msgid "Date end" -msgstr "结束日期" - -#: terminal/models/session.py:236 -msgid "Session record" -msgstr "会话记录" - -#: terminal/models/session.py:238 -msgid "Can monitor session" -msgstr "可以监控会话" - -#: terminal/models/session.py:239 -msgid "Can share session" -msgstr "可以分享会话" - -#: terminal/models/session.py:240 -msgid "Can terminate session" -msgstr "可以终断会话" - -#: terminal/models/session.py:241 -msgid "Can validate session action perm" -msgstr "可以验证会话动作权限" - -#: terminal/models/sharing.py:26 terminal/models/sharing.py:80 -msgid "Verify code" -msgstr "验证码" - -#: terminal/models/sharing.py:31 -msgid "Expired time (min)" -msgstr "过期时间 (分)" - -#: terminal/models/sharing.py:37 terminal/models/sharing.py:83 -msgid "Session sharing" -msgstr "会话分享" - -#: terminal/models/sharing.py:39 -msgid "Can add super session sharing" -msgstr "可以创建超级会话分享" - -#: terminal/models/sharing.py:66 -msgid "Link not active" -msgstr "链接失效" - -#: terminal/models/sharing.py:68 -msgid "Link expired" -msgstr "链接过期" - -#: terminal/models/sharing.py:70 -msgid "User not allowed to join" -msgstr "该用户无权加入会话" - -#: terminal/models/sharing.py:87 terminal/serializers/sharing.py:59 -msgid "Joiner" -msgstr "加入者" - -#: terminal/models/sharing.py:90 -msgid "Date joined" -msgstr "加入日期" - -#: terminal/models/sharing.py:93 -msgid "Date left" -msgstr "结束日期" - -#: terminal/models/sharing.py:116 -msgid "Session join record" -msgstr "会话加入记录" - -#: terminal/models/sharing.py:132 -msgid "Invalid verification code" -msgstr "验证码不正确" - -#: terminal/models/status.py:18 +#: terminal/models/component/status.py:18 msgid "Session Online" msgstr "在线会话" -#: terminal/models/status.py:19 +#: terminal/models/component/status.py:19 msgid "CPU Load" msgstr "CPU负载" -#: terminal/models/status.py:20 +#: terminal/models/component/status.py:20 msgid "Memory Used" msgstr "内存使用" -#: terminal/models/status.py:21 +#: terminal/models/component/status.py:21 msgid "Disk Used" msgstr "磁盘使用" -#: terminal/models/status.py:22 +#: terminal/models/component/status.py:22 msgid "Connections" msgstr "连接数" -#: terminal/models/status.py:23 +#: terminal/models/component/status.py:23 msgid "Threads" msgstr "线程数" -#: terminal/models/status.py:24 +#: terminal/models/component/status.py:24 msgid "Boot Time" msgstr "运行时间" -#: terminal/models/storage.py:28 +#: terminal/models/component/storage.py:27 msgid "Default storage" msgstr "默认存储" -#: terminal/models/storage.py:137 terminal/models/terminal.py:108 +#: terminal/models/component/storage.py:136 +#: terminal/models/component/terminal.py:108 msgid "Command storage" msgstr "命令存储" -#: terminal/models/storage.py:197 terminal/models/terminal.py:109 +#: terminal/models/component/storage.py:196 +#: terminal/models/component/terminal.py:109 msgid "Replay storage" msgstr "录像存储" -#: terminal/models/terminal.py:103 +#: terminal/models/component/terminal.py:103 msgid "type" msgstr "类型" -#: terminal/models/terminal.py:183 +#: terminal/models/component/terminal.py:183 msgid "Terminal" msgstr "终端" -#: terminal/models/terminal.py:185 +#: terminal/models/component/terminal.py:185 msgid "Can view terminal config" msgstr "可以查看终端配置" +#: terminal/models/session/command.py:66 +msgid "Command record" +msgstr "命令记录" + +#: terminal/models/session/replay.py:12 +msgid "Session replay" +msgstr "会话录像" + +#: terminal/models/session/replay.py:14 +msgid "Can upload session replay" +msgstr "可以上传会话录像" + +#: terminal/models/session/replay.py:15 +msgid "Can download session replay" +msgstr "可以下载会话录像" + +#: terminal/models/session/session.py:36 terminal/models/session/sharing.py:101 +msgid "Login from" +msgstr "登录来源" + +#: terminal/models/session/session.py:40 +msgid "Replay" +msgstr "回放" + +#: terminal/models/session/session.py:44 +msgid "Date end" +msgstr "结束日期" + +#: terminal/models/session/session.py:236 +msgid "Session record" +msgstr "会话记录" + +#: terminal/models/session/session.py:238 +msgid "Can monitor session" +msgstr "可以监控会话" + +#: terminal/models/session/session.py:239 +msgid "Can share session" +msgstr "可以分享会话" + +#: terminal/models/session/session.py:240 +msgid "Can terminate session" +msgstr "可以终断会话" + +#: terminal/models/session/session.py:241 +msgid "Can validate session action perm" +msgstr "可以验证会话动作权限" + +#: terminal/models/session/sharing.py:26 terminal/models/session/sharing.py:80 +msgid "Verify code" +msgstr "验证码" + +#: terminal/models/session/sharing.py:31 +msgid "Expired time (min)" +msgstr "过期时间 (分)" + +#: terminal/models/session/sharing.py:37 terminal/models/session/sharing.py:83 +msgid "Session sharing" +msgstr "会话分享" + +#: terminal/models/session/sharing.py:39 +msgid "Can add super session sharing" +msgstr "可以创建超级会话分享" + +#: terminal/models/session/sharing.py:66 +msgid "Link not active" +msgstr "链接失效" + +#: terminal/models/session/sharing.py:68 +msgid "Link expired" +msgstr "链接过期" + +#: terminal/models/session/sharing.py:70 +msgid "User not allowed to join" +msgstr "该用户无权加入会话" + +#: terminal/models/session/sharing.py:87 terminal/serializers/sharing.py:59 +msgid "Joiner" +msgstr "加入者" + +#: terminal/models/session/sharing.py:90 +msgid "Date joined" +msgstr "加入日期" + +#: terminal/models/session/sharing.py:93 +msgid "Date left" +msgstr "结束日期" + +#: terminal/models/session/sharing.py:116 +msgid "Session join record" +msgstr "会话加入记录" + +#: terminal/models/session/sharing.py:132 +msgid "Invalid verification code" +msgstr "验证码不正确" + #: terminal/notifications.py:22 msgid "Sessions" msgstr "会话管理" @@ -4896,6 +4971,10 @@ msgstr "级别" msgid "Batch danger command alert" msgstr "批量危险命令告警" +#: terminal/serializers/applet.py:19 +msgid "Icon" +msgstr "图标" + #: terminal/serializers/endpoint.py:12 msgid "Oracle port" msgstr "" @@ -6690,9 +6769,6 @@ msgstr "社区版" #~ msgid "Unsupported protocols: {}" #~ msgstr "不支持的协议: {}" -#~ msgid "Remote app" -#~ msgstr "远程应用" - #~ msgid "Custom" #~ msgstr "自定义" @@ -6804,9 +6880,6 @@ msgstr "社区版" #~ msgid "CPU info" #~ msgstr "CPU信息" -#~ msgid "Action display" -#~ msgstr "动作名称" - #~ msgid "Applications amount" #~ msgstr "应用数量" diff --git a/apps/ops/api/adhoc.py b/apps/ops/api/adhoc.py index 8644ac5d2..71e818fbb 100644 --- a/apps/ops/api/adhoc.py +++ b/apps/ops/api/adhoc.py @@ -5,7 +5,7 @@ from django.shortcuts import get_object_or_404 from rest_framework import viewsets, generics from rest_framework.views import Response -from common.drf.serializers import CeleryTaskSerializer +from common.drf.serializers import CeleryTaskExecutionSerializer from ..models import AdHoc, AdHocExecution from ..serializers import ( AdHocSerializer, diff --git a/apps/ops/api/celery.py b/apps/ops/api/celery.py index cd452c471..61d13db17 100644 --- a/apps/ops/api/celery.py +++ b/apps/ops/api/celery.py @@ -4,6 +4,7 @@ import os import re +from django.shortcuts import get_object_or_404 from django.utils.translation import ugettext as _ from rest_framework import viewsets from celery.result import AsyncResult @@ -12,20 +13,21 @@ from django_celery_beat.models import PeriodicTask from common.permissions import IsValidUser from common.api import LogTailApi -from ..models import CeleryTask +from ..models import CeleryTaskExecution, CeleryTask from ..serializers import CeleryResultSerializer, CeleryPeriodTaskSerializer from ..celery.utils import get_celery_task_log_path from ..ansible.utils import get_ansible_task_log_path from common.mixins.api import CommonApiMixin - __all__ = [ - 'CeleryTaskLogApi', 'CeleryResultApi', 'CeleryPeriodTaskViewSet', - 'AnsibleTaskLogApi', + 'CeleryTaskExecutionLogApi', 'CeleryResultApi', 'CeleryPeriodTaskViewSet', + 'AnsibleTaskLogApi', 'CeleryTaskViewSet', 'CeleryTaskExecutionViewSet' ] +from ..serializers.celery import CeleryTaskSerializer, CeleryTaskExecutionSerializer -class CeleryTaskLogApi(LogTailApi): + +class CeleryTaskExecutionLogApi(LogTailApi): permission_classes = (IsValidUser,) task = None task_id = '' @@ -46,8 +48,8 @@ class CeleryTaskLogApi(LogTailApi): if new_path and os.path.isfile(new_path): return new_path try: - task = CeleryTask.objects.get(id=self.task_id) - except CeleryTask.DoesNotExist: + task = CeleryTaskExecution.objects.get(id=self.task_id) + except CeleryTaskExecution.DoesNotExist: return None return task.full_log_path @@ -94,3 +96,22 @@ class CeleryPeriodTaskViewSet(CommonApiMixin, viewsets.ModelViewSet): queryset = super().get_queryset() queryset = queryset.exclude(description='') return queryset + + +class CeleryTaskViewSet(CommonApiMixin, viewsets.ReadOnlyModelViewSet): + queryset = CeleryTask.objects.all() + serializer_class = CeleryTaskSerializer + http_method_names = ('get', 'head', 'options',) + + +class CeleryTaskExecutionViewSet(CommonApiMixin, viewsets.ReadOnlyModelViewSet): + serializer_class = CeleryTaskExecutionSerializer + http_method_names = ('get', 'head', 'options',) + + def get_queryset(self): + task_id = self.kwargs.get("task_pk") + if task_id: + task = CeleryTask.objects.get(pk=task_id) + return CeleryTaskExecution.objects.filter(name=task.name) + else: + return CeleryTaskExecution.objects.none() diff --git a/apps/ops/migrations/0027_auto_20221024_1709.py b/apps/ops/migrations/0027_auto_20221024_1709.py new file mode 100644 index 000000000..34e244363 --- /dev/null +++ b/apps/ops/migrations/0027_auto_20221024_1709.py @@ -0,0 +1,36 @@ +# Generated by Django 3.2.14 on 2022-10-24 09:09 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('ops', '0026_auto_20221009_2050'), + ] + + operations = [ + migrations.DeleteModel(name='CeleryTask'), + migrations.CreateModel( + name='CeleryTask', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=1024)), + ] + ), + migrations.CreateModel( + name='CeleryTaskExecution', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=1024)), + ('args', models.JSONField(verbose_name='Args')), + ('kwargs', models.JSONField(verbose_name='Kwargs')), + ('state', models.CharField(max_length=16, verbose_name='State')), + ('is_finished', models.BooleanField(default=False, verbose_name='Finished')), + ('date_published', models.DateTimeField(auto_now_add=True)), + ('date_start', models.DateTimeField(null=True)), + ('date_finished', models.DateTimeField(null=True)), + ], + ), + ] diff --git a/apps/ops/models/celery.py b/apps/ops/models/celery.py index 2291eb6f1..6ea4e2641 100644 --- a/apps/ops/models/celery.py +++ b/apps/ops/models/celery.py @@ -7,8 +7,27 @@ from django.utils.translation import gettext_lazy as _ from django.conf import settings from django.db import models +from ops.celery import app + class CeleryTask(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4) + name = models.CharField(max_length=1024) + + @property + def verbose_name(self): + task = app.tasks.get(self.name, None) + if task: + return getattr(task, 'verbose_name', None) + + @property + def description(self): + task = app.tasks.get(self.name, None) + if task: + return getattr(task, 'description', None) + + +class CeleryTaskExecution(models.Model): LOG_DIR = os.path.join(settings.PROJECT_DIR, 'data', 'celery') id = models.UUIDField(primary_key=True, default=uuid.uuid4) name = models.CharField(max_length=1024) diff --git a/apps/ops/serializers/celery.py b/apps/ops/serializers/celery.py index 8015c2482..b2aa6eb7a 100644 --- a/apps/ops/serializers/celery.py +++ b/apps/ops/serializers/celery.py @@ -5,10 +5,12 @@ from rest_framework import serializers from django_celery_beat.models import PeriodicTask __all__ = [ - 'CeleryResultSerializer', 'CeleryTaskSerializer', - 'CeleryPeriodTaskSerializer' + 'CeleryResultSerializer', 'CeleryTaskExecutionSerializer', + 'CeleryPeriodTaskSerializer', 'CeleryTaskSerializer' ] +from ops.models import CeleryTask, CeleryTaskExecution + class CeleryResultSerializer(serializers.Serializer): id = serializers.UUIDField() @@ -16,10 +18,6 @@ class CeleryResultSerializer(serializers.Serializer): state = serializers.CharField(max_length=16) -class CeleryTaskSerializer(serializers.Serializer): - pass - - class CeleryPeriodTaskSerializer(serializers.ModelSerializer): class Meta: model = PeriodicTask @@ -27,3 +25,19 @@ class CeleryPeriodTaskSerializer(serializers.ModelSerializer): 'name', 'task', 'enabled', 'description', 'last_run_at', 'total_run_count' ] + + +class CeleryTaskSerializer(serializers.ModelSerializer): + class Meta: + model = CeleryTask + fields = [ + 'id', 'name', 'verbose_name', 'description', + ] + + +class CeleryTaskExecutionSerializer(serializers.ModelSerializer): + class Meta: + model = CeleryTaskExecution + fields = [ + "id", "name", "args", "kwargs", "state", "is_finished", "date_published", "date_start", "date_finished" + ] diff --git a/apps/ops/signal_handlers.py b/apps/ops/signal_handlers.py index e48802d84..a444558bc 100644 --- a/apps/ops/signal_handlers.py +++ b/apps/ops/signal_handlers.py @@ -1,12 +1,15 @@ import ast +from django.db import transaction +from django.dispatch import receiver from django.utils import translation, timezone from django.core.cache import cache -from celery import signals +from celery import signals, current_app from common.db.utils import close_old_connections, get_logger -from .models import CeleryTask - +from common.signals import django_ready +from .celery import app +from .models import CeleryTaskExecution, CeleryTask logger = get_logger(__name__) @@ -14,6 +17,22 @@ TASK_LANG_CACHE_KEY = 'TASK_LANG_{}' TASK_LANG_CACHE_TTL = 1800 +@receiver(django_ready) +def sync_registered_tasks(*args, **kwargs): + with transaction.atomic(): + try: + db_tasks = CeleryTask.objects.all() + except Exception as e: + return + celery_task_names = [key for key in app.tasks] + db_task_names = db_tasks.values_list('name', flat=True) + + db_tasks.exclude(name__in=celery_task_names).delete() + not_in_db_tasks = set(celery_task_names) - set(db_task_names) + tasks_to_create = [CeleryTask(name=name) for name in not_in_db_tasks] + CeleryTask.objects.bulk_create(tasks_to_create) + + @signals.before_task_publish.connect def before_task_publish(headers=None, **kwargs): task_id = headers.get('id') @@ -25,7 +44,7 @@ def before_task_publish(headers=None, **kwargs): @signals.task_prerun.connect def on_celery_task_pre_run(task_id='', **kwargs): # 更新状态 - CeleryTask.objects.filter(id=task_id).update(state='RUNNING', date_start=timezone.now()) + CeleryTaskExecution.objects.filter(id=task_id).update(state='RUNNING', date_start=timezone.now()) # 关闭之前的数据库连接 close_old_connections() @@ -41,7 +60,7 @@ def on_celery_task_post_run(task_id='', state='', **kwargs): close_old_connections() print("Task post run: ", task_id, state) - CeleryTask.objects.filter(id=task_id).update( + CeleryTaskExecution.objects.filter(id=task_id).update( state=state, date_finished=timezone.now(), is_finished=True ) @@ -72,4 +91,4 @@ def task_sent_handler(headers=None, body=None, **kwargs): 'args': args, 'kwargs': kwargs } - CeleryTask.objects.create(**data) + CeleryTaskExecution.objects.create(**data) diff --git a/apps/ops/tasks.py b/apps/ops/tasks.py index e9ba28eb7..dc3ac6e68 100644 --- a/apps/ops/tasks.py +++ b/apps/ops/tasks.py @@ -20,7 +20,7 @@ from .celery.utils import ( create_or_update_celery_periodic_tasks, get_celery_periodic_task, disable_celery_periodic_task, delete_celery_periodic_task ) -from .models import CeleryTask, AdHoc, Playbook +from .models import CeleryTaskExecution, AdHoc, Playbook from .notifications import ServerPerformanceCheckUtil logger = get_logger(__file__) @@ -94,9 +94,9 @@ def clean_celery_tasks_period(): logger.debug("Start clean celery task history") expire_days = get_log_keep_day('TASK_LOG_KEEP_DAYS') days_ago = timezone.now() - timezone.timedelta(days=expire_days) - tasks = CeleryTask.objects.filter(date_start__lt=days_ago) + tasks = CeleryTaskExecution.objects.filter(date_start__lt=days_ago) tasks.delete() - tasks = CeleryTask.objects.filter(date_start__isnull=True) + tasks = CeleryTaskExecution.objects.filter(date_start__isnull=True) tasks.delete() command = "find %s -mtime +%s -name '*.log' -type f -exec rm -f {} \\;" % ( settings.CELERY_LOG_DIR, expire_days diff --git a/apps/ops/urls/api_urls.py b/apps/ops/urls/api_urls.py index 49038b9b1..1edbd16e7 100644 --- a/apps/ops/urls/api_urls.py +++ b/apps/ops/urls/api_urls.py @@ -4,8 +4,9 @@ from __future__ import unicode_literals from django.urls import path from rest_framework.routers import DefaultRouter from rest_framework_bulk.routes import BulkRouter -from .. import api +from rest_framework_nested import routers +from .. import api app_name = "ops" @@ -16,12 +17,19 @@ router.register(r'adhoc', api.AdHocViewSet, 'adhoc') router.register(r'adhoc-executions', api.AdHocExecutionViewSet, 'execution') router.register(r'celery/period-tasks', api.CeleryPeriodTaskViewSet, 'celery-period-task') -urlpatterns = [ - path('celery/task//log/', api.CeleryTaskLogApi.as_view(), name='celery-task-log'), - path('celery/task//result/', api.CeleryResultApi.as_view(), name='celery-result'), +router.register(r'tasks', api.CeleryTaskViewSet, 'task') - path('ansible/task//log/', api.AnsibleTaskLogApi.as_view(), name='ansible-task-log'), +task_router = routers.NestedDefaultRouter(router, r'tasks', lookup='task') +task_router.register(r'executions', api.CeleryTaskExecutionViewSet, 'task-execution') + +urlpatterns = [ + + path('celery/task//task-execution//log/', api.CeleryTaskExecutionLogApi.as_view(), + name='celery-task-execution-log'), + path('celery/task//task-execution//result/', api.CeleryResultApi.as_view(), + name='celery-task-execution-result'), + + path('ansible/task-execution//log/', api.AnsibleTaskLogApi.as_view(), name='ansible-task-log'), ] -urlpatterns += router.urls -urlpatterns += bulk_router.urls +urlpatterns += (router.urls + bulk_router.urls + task_router.urls) diff --git a/apps/orgs/migrations/0014_organization_builtin.py b/apps/orgs/migrations/0014_organization_builtin.py new file mode 100644 index 000000000..6541fe1a7 --- /dev/null +++ b/apps/orgs/migrations/0014_organization_builtin.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.14 on 2022-10-26 09:07 + +from django.db import migrations, models + + +def update_builtin_org(apps, schema_editor): + org_model = apps.get_model('orgs', 'Organization') + org_model.objects.create( + id='00000000-0000-0000-0000-000000000004', + name='SYSTEM', builtin=True + ) + + # 更新 Default + org_model.objects.filter(name='DEFAULT').update(builtin=True) + + +class Migration(migrations.Migration): + + dependencies = [ + ('orgs', '0013_alter_organization_options'), + ] + + operations = [ + migrations.AddField( + model_name='organization', + name='builtin', + field=models.BooleanField(default=False, verbose_name='Builtin'), + ), + migrations.RunPython(update_builtin_org), + ] diff --git a/apps/orgs/models.py b/apps/orgs/models.py index 7c7babd76..5e78d2757 100644 --- a/apps/orgs/models.py +++ b/apps/orgs/models.py @@ -69,6 +69,7 @@ class Organization(OrgRoleMixin, models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, unique=True, verbose_name=_("Name")) created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) + builtin = models.BooleanField(default=False, verbose_name=_('Builtin')) date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created')) comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) members = models.ManyToManyField( @@ -139,13 +140,13 @@ class Organization(OrgRoleMixin, models.Model): @classmethod def default(cls): defaults = dict(id=cls.DEFAULT_ID, name=cls.DEFAULT_NAME) - obj, created = cls.objects.get_or_create(defaults=defaults, id=cls.DEFAULT_ID) + obj, created = cls.objects.get_or_create(defaults=defaults, id=cls.DEFAULT_ID, builtin=True) return obj @classmethod def root(cls): name = settings.GLOBAL_ORG_DISPLAY_NAME or cls.ROOT_NAME - return cls(id=cls.ROOT_ID, name=name) + return cls(id=cls.ROOT_ID, name=name, builtin=True) def is_root(self): return self.id == self.ROOT_ID diff --git a/apps/orgs/signal_handlers/common.py b/apps/orgs/signal_handlers/common.py index a4e1c7085..2136b28a0 100644 --- a/apps/orgs/signal_handlers/common.py +++ b/apps/orgs/signal_handlers/common.py @@ -4,6 +4,7 @@ import threading from collections import defaultdict from functools import partial +import django.db.utils from django.dispatch import receiver from django.conf import settings from django.utils.functional import LazyObject @@ -45,7 +46,10 @@ def expire_orgs_mapping_for_memory(org_id): def subscribe_orgs_mapping_expire(sender, **kwargs): logger.debug("Start subscribe for expire orgs mapping from memory") if settings.DEBUG: - set_to_default_org() + try: + set_to_default_org() + except django.db.utils.OperationalError: + pass def keep_subscribe_org_mapping(): orgs_mapping_for_memory_pub_sub.subscribe( diff --git a/apps/terminal/automations/__init__.py b/apps/terminal/automations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/terminal/automations/deploy_applet_host/manager.py b/apps/terminal/automations/deploy_applet_host/manager.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/terminal/automations/deploy_applet_host/playbook.yml b/apps/terminal/automations/deploy_applet_host/playbook.yml new file mode 100644 index 000000000..17016328d --- /dev/null +++ b/apps/terminal/automations/deploy_applet_host/playbook.yml @@ -0,0 +1,56 @@ +--- +- hosts: windows + vars: + - DownloadHost: https://demo.jumpserver.org/download + - RDS_Licensing: enabled + - RDS_LicenseServer: 127.0.0.1 + - RDS_LicensingMode: 4 + - RDS_fSingleSessionPerUser: 0 + - RDS_MaxDisconnectionTime: 60000 + - RDS_RemoteAppLogoffTimeLimit: 0 + tasks: + - name: Install RDS-Licensing (RDS) + ansible.windows.win_feature: + name: RDS-Licensing + state: present + include_management_tools: yes + when: RDS_Licensing == "enabled" + - name: Install RDS-RD-Server (RDS) + ansible.windows.win_feature: + name: RDS-RD-Server + state: present + include_management_tools: yes + register: win_feature + - name: Reboot if installing RDS feature requires it + ansible.windows.win_reboot: + when: win_feature.reboot_required + - name: Set RDS LicenseServer (regedit) + ansible.windows.win_regedit: + path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services + name: LicenseServers + data: "{{ RDS_LicenseServer }}" + type: string + - name: Set RDS LicensingMode (regedit) + ansible.windows.win_regedit: + path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services + name: LicensingMode + data: "{{ RDS_LicensingMode }}" + type: dword + - name: Set RDS fSingleSessionPerUser (regedit) + ansible.windows.win_regedit: + path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services + name: fSingleSessionPerUser + data: "{{ RDS_fSingleSessionPerUser }}" + type: dword + - name: Set RDS MaxDisconnectionTime (regedit) + ansible.windows.win_regedit: + path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services + name: MaxDisconnectionTime + data: "{{ RDS_MaxDisconnectionTime }}" + type: dword + when: RDS_MaxDisconnectionTime >= 60000 + - name: Set RDS RemoteAppLogoffTimeLimit (regedit) + ansible.windows.win_regedit: + path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services + name: RemoteAppLogoffTimeLimit + data: "{{ RDS_RemoteAppLogoffTime }}" diff --git a/apps/terminal/migrations/0055_auto_20221026_1631.py b/apps/terminal/migrations/0055_auto_20221026_1631.py new file mode 100644 index 000000000..cbfe73256 --- /dev/null +++ b/apps/terminal/migrations/0055_auto_20221026_1631.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.14 on 2022-10-26 08:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('terminal', '0054_auto_20221024_1452'), + ] + + operations = [ + migrations.RemoveField( + model_name='applet', + name='vcs_type', + ), + migrations.RemoveField( + model_name='applet', + name='vcs_url', + ), + migrations.AddField( + model_name='applet', + name='is_active', + field=models.BooleanField(default=True, verbose_name='Is active'), + ), + ] diff --git a/apps/terminal/models/applet/applet.py b/apps/terminal/models/applet/applet.py index 3e06a5fe9..25e3a2784 100644 --- a/apps/terminal/models/applet/applet.py +++ b/apps/terminal/models/applet/applet.py @@ -27,8 +27,7 @@ class Applet(JMSBaseModel): version = models.CharField(max_length=16, verbose_name=_('Version')) author = models.CharField(max_length=128, verbose_name=_('Author')) type = models.CharField(max_length=16, verbose_name=_('Type'), default='general', choices=Type.choices) - vcs_type = models.CharField(max_length=16, verbose_name=_('VCS type'), null=True) - vcs_url = models.CharField(max_length=256, verbose_name=_('URL'), null=True) + is_active = models.BooleanField(default=True, verbose_name=_('Is active')) protocols = models.JSONField(default=list, verbose_name=_('Protocol')) tags = models.JSONField(default=list, verbose_name=_('Tags')) comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))