From 29c5fd11916897901356bfb7b2571f0fac7bc0de Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 13 Feb 2023 14:36:17 +0800 Subject: [PATCH 01/20] =?UTF-8?q?perf:=20=E4=BF=AE=E5=A4=8D=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=20smtp=20=E7=9A=84subject=20prefix=20=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/settings/api/email.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/settings/api/email.py b/apps/settings/api/email.py index 495e4a15c..2116b969d 100644 --- a/apps/settings/api/email.py +++ b/apps/settings/api/email.py @@ -2,13 +2,14 @@ # from smtplib import SMTPSenderRefused -from rest_framework.views import Response, APIView + +from django.conf import settings from django.core.mail import send_mail, get_connection from django.utils.translation import ugettext_lazy as _ +from rest_framework.views import Response, APIView from common.utils import get_logger from .. import serializers -from django.conf import settings logger = get_logger(__file__) @@ -41,7 +42,7 @@ class MailTestingAPI(APIView): # if k.startswith('EMAIL'): # setattr(settings, k, v) try: - subject = "Test" + subject = settings.EMAIL_SUBJECT_PREFIX + "Test" message = "Test smtp setting" email_from = email_from or email_host_user email_recipient = email_recipient or email_from @@ -68,4 +69,4 @@ class MailTestingAPI(APIView): except Exception as e: logger.error(e) return Response({"error": str(e)}, status=400) - return Response({"msg": self.success_message.format(email_recipient)}) \ No newline at end of file + return Response({"msg": self.success_message.format(email_recipient)}) From 7f21e6cb6ede6d7fcc1b82e14d22040466973356 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 13 Feb 2023 14:44:17 +0800 Subject: [PATCH 02/20] perf: terminal command ordering (#9517) Co-authored-by: feng <1304903146@qq.com> --- apps/terminal/api/session/command.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/terminal/api/session/command.py b/apps/terminal/api/session/command.py index 86d56b026..b855181b8 100644 --- a/apps/terminal/api/session/command.py +++ b/apps/terminal/api/session/command.py @@ -103,9 +103,9 @@ class CommandViewSet(JMSBulkModelViewSet): command_store = get_command_storage() serializer_class = SessionCommandSerializer filterset_class = CommandFilter - search_fields = ('input',) model = Command - ordering_fields = ('timestamp',) + search_fields = ('input',) + ordering_fields = ('timestamp', 'risk_level') def merge_all_storage_list(self, request, *args, **kwargs): merged_commands = [] From cd866532daa10265be1e5742dd4d1a26ece6c317 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 13 Feb 2023 15:04:45 +0800 Subject: [PATCH 03/20] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E8=8A=82=E7=82=B9=E5=8F=AF=E8=BF=9E=E6=8E=A5=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/node.py | 16 ++++++++-------- apps/assets/tasks/ping.py | 2 +- apps/ops/ansible/inventory.py | 5 ++++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/apps/assets/api/node.py b/apps/assets/api/node.py index bb81a3b45..e690b8ebf 100644 --- a/apps/assets/api/node.py +++ b/apps/assets/api/node.py @@ -1,24 +1,24 @@ # ~*~ coding: utf-8 ~*~ -from functools import partial from collections import namedtuple, defaultdict +from functools import partial from django.db.models.signals import m2m_changed from django.utils.translation import ugettext_lazy as _ from rest_framework import status -from rest_framework.response import Response from rest_framework.decorators import action from rest_framework.generics import get_object_or_404 +from rest_framework.response import Response from rest_framework.serializers import ValidationError from assets.models import Asset -from common.const.http import POST -from common.utils import get_logger from common.api import SuggestionMixin -from common.exceptions import SomeoneIsDoingThis +from common.const.http import POST from common.const.signals import PRE_REMOVE, POST_REMOVE +from common.exceptions import SomeoneIsDoingThis +from common.utils import get_logger from orgs.mixins import generics -from orgs.utils import current_org from orgs.mixins.api import OrgBulkModelViewSet +from orgs.utils import current_org from .. import serializers from ..models import Node from ..tasks import ( @@ -210,7 +210,7 @@ class NodeTaskCreateApi(generics.CreateAPIView): return if action == "refresh": - task = update_node_assets_hardware_info_manual.delay(node.id) + task = update_node_assets_hardware_info_manual(node.id) else: - task = test_node_assets_connectivity_manual.delay(node.id) + task = test_node_assets_connectivity_manual(node.id) self.set_serializer_data(serializer, task) diff --git a/apps/assets/tasks/ping.py b/apps/assets/tasks/ping.py index 882f5e5ef..973085db3 100644 --- a/apps/assets/tasks/ping.py +++ b/apps/assets/tasks/ping.py @@ -40,4 +40,4 @@ def test_node_assets_connectivity_manual(node_id): node = Node.objects.get(id=node_id) task_name = gettext_noop("Test if the assets under the node are connectable ") assets = node.get_all_assets() - return test_assets_connectivity_task.delay(*assets, task_name) + return test_assets_connectivity_task.delay(assets, task_name) diff --git a/apps/ops/ansible/inventory.py b/apps/ops/ansible/inventory.py index e83f50c41..da9e8b599 100644 --- a/apps/ops/ansible/inventory.py +++ b/apps/ops/ansible/inventory.py @@ -117,7 +117,10 @@ class JMSInventory: if host['jms_account'] and asset.platform.type == 'oracle': host['jms_account']['mode'] = 'sysdba' if account.privileged else None - ansible_config = dict(automation.ansible_config) + try: + ansible_config = dict(automation.ansible_config) + except Exception as e: + ansible_config = {} ansible_connection = ansible_config.get('ansible_connection', 'ssh') host.update(ansible_config) From 16922c4918d0d450bd721edb20a6d6abc24c0eed Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 13 Feb 2023 15:05:31 +0800 Subject: [PATCH 04/20] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B8=AD=E5=BF=83=E5=94=AF=E4=B8=80=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=20(#9518)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 增加作业中心唯一校验 * fix: 增加迁移文件 --------- Co-authored-by: Aaron3S --- .../ops/migrations/0028_auto_20230213_1503.py | 31 +++++++++++++++++++ apps/ops/models/adhoc.py | 2 +- apps/ops/models/job.py | 1 + apps/ops/models/playbook.py | 4 +++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 apps/ops/migrations/0028_auto_20230213_1503.py diff --git a/apps/ops/migrations/0028_auto_20230213_1503.py b/apps/ops/migrations/0028_auto_20230213_1503.py new file mode 100644 index 000000000..dbb6c3b90 --- /dev/null +++ b/apps/ops/migrations/0028_auto_20230213_1503.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.16 on 2023-02-13 07:03 + +from django.conf import settings +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('ops', '0027_auto_20230206_1927'), + ] + + operations = [ + migrations.AlterModelOptions( + name='playbook', + options={'ordering': ['date_created']}, + ), + migrations.AlterUniqueTogether( + name='adhoc', + unique_together={('name', 'org_id', 'creator')}, + ), + migrations.AlterUniqueTogether( + name='job', + unique_together={('name', 'org_id', 'creator')}, + ), + migrations.AlterUniqueTogether( + name='playbook', + unique_together={('name', 'org_id', 'creator')}, + ), + ] diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index b6c84183d..5718252e3 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -17,7 +17,6 @@ logger = get_logger(__file__) class AdHoc(JMSOrgBaseModel): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, verbose_name=_('Name')) pattern = models.CharField(max_length=1024, verbose_name=_("Pattern"), default='all') @@ -42,4 +41,5 @@ class AdHoc(JMSOrgBaseModel): return "{}: {}".format(self.module, self.args) class Meta: + unique_together = [('name', 'org_id', 'creator')] verbose_name = _("AdHoc") diff --git a/apps/ops/models/job.py b/apps/ops/models/job.py index ebc6b6dca..c0e45529b 100644 --- a/apps/ops/models/job.py +++ b/apps/ops/models/job.py @@ -96,6 +96,7 @@ class Job(JMSOrgBaseModel, PeriodTaskModelMixin): class Meta: verbose_name = _("Job") + unique_together = [('name', 'org_id', 'creator')] ordering = ['date_created'] diff --git a/apps/ops/models/playbook.py b/apps/ops/models/playbook.py index 0e649532e..efcd87730 100644 --- a/apps/ops/models/playbook.py +++ b/apps/ops/models/playbook.py @@ -33,3 +33,7 @@ class Playbook(JMSOrgBaseModel): def work_dir(self): work_dir = os.path.join(settings.DATA_DIR, "ops", "playbook", self.id.__str__()) return work_dir + + class Meta: + unique_together = [('name', 'org_id', 'creator')] + ordering = ['date_created'] From 439d3ddf47865495fdc8cd92eee15c85d4d44cc5 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 13 Feb 2023 15:29:48 +0800 Subject: [PATCH 05/20] =?UTF-8?q?perf:=20=E7=BF=BB=E8=AF=91=20(#9520)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: feng <1304903146@qq.com> --- apps/locale/ja/LC_MESSAGES/django.mo | 4 +- apps/locale/ja/LC_MESSAGES/django.po | 912 +++++++++++++++------------ apps/locale/zh/LC_MESSAGES/django.mo | 4 +- apps/locale/zh/LC_MESSAGES/django.po | 910 ++++++++++++++------------ 4 files changed, 987 insertions(+), 843 deletions(-) diff --git a/apps/locale/ja/LC_MESSAGES/django.mo b/apps/locale/ja/LC_MESSAGES/django.mo index dcece3719..6ec8b8639 100644 --- a/apps/locale/ja/LC_MESSAGES/django.mo +++ b/apps/locale/ja/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7e35d73f8576a0ea30a0da3886b24033f61f1019f6e15466d7b5904b5dd15ef9 -size 136075 +oid sha256:99adbe0952fdda576b1c80cf6d2b225afe44e3c9eb0acceff4cc118aee99059e +size 135275 diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po index 4819919d4..cb15dc780 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: 2023-02-06 13:10+0800\n" +"POT-Creation-Date: 2023-02-13 15:27+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -24,7 +24,7 @@ msgstr "パラメータ 'action' は [{}] でなければなりません。" #: accounts/const/account.py:6 #: accounts/serializers/automations/change_secret.py:33 -#: assets/models/_user.py:24 audits/signal_handlers.py:50 +#: assets/models/_user.py:24 audits/signal_handlers/login_log.py:30 #: authentication/confirm/password.py:9 authentication/forms.py:32 #: authentication/templates/authentication/login.html:288 #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 @@ -62,7 +62,7 @@ msgstr "手動入力" msgid "Dynamic user" msgstr "動的コード" -#: accounts/const/account.py:19 users/models/user.py:631 +#: accounts/const/account.py:19 users/models/user.py:673 msgid "Local" msgstr "ローカル" @@ -158,33 +158,35 @@ msgstr "作成してプッシュ" msgid "Only create" msgstr "作成のみ" -#: accounts/models/account.py:47 accounts/serializers/account/account.py:81 +#: accounts/models/account.py:47 accounts/models/gathered_account.py:14 +#: accounts/serializers/account/account.py:95 +#: accounts/serializers/account/gathered_account.py:10 #: accounts/serializers/automations/change_secret.py:107 #: accounts/serializers/automations/change_secret.py:127 #: acls/models/base.py:100 acls/serializers/base.py:56 #: assets/models/asset/common.py:97 assets/models/asset/common.py:282 #: assets/models/cmd_filter.py:36 assets/serializers/domain.py:19 -#: assets/serializers/label.py:27 audits/models.py:34 -#: authentication/models/connection_token.py:32 +#: assets/serializers/label.py:27 audits/models.py:36 +#: authentication/models/connection_token.py:33 #: perms/models/asset_permission.py:64 perms/serializers/permission.py:27 #: terminal/backends/command/models.py:21 terminal/models/session/session.py:31 #: terminal/notifications.py:95 terminal/serializers/command.py:16 -#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:220 +#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:212 msgid "Asset" msgstr "資産" -#: accounts/models/account.py:51 accounts/serializers/account/account.py:85 +#: accounts/models/account.py:51 accounts/serializers/account/account.py:99 #: authentication/serializers/connect_token_secret.py:50 msgid "Su from" msgstr "から切り替え" #: accounts/models/account.py:53 settings/serializers/auth/cas.py:20 -#: terminal/models/applet/applet.py:26 +#: terminal/models/applet/applet.py:28 msgid "Version" msgstr "バージョン" -#: accounts/models/account.py:55 accounts/serializers/account/account.py:82 -#: users/models/user.py:726 +#: accounts/models/account.py:55 accounts/serializers/account/account.py:96 +#: users/models/user.py:768 msgid "Source" msgstr "ソース" @@ -192,8 +194,8 @@ msgstr "ソース" #: accounts/serializers/automations/change_secret.py:108 #: accounts/serializers/automations/change_secret.py:128 #: acls/models/base.py:102 acls/serializers/base.py:57 -#: assets/serializers/asset/common.py:112 assets/serializers/gateway.py:30 -#: audits/models.py:35 ops/models/base.py:18 +#: assets/serializers/asset/common.py:120 assets/serializers/gateway.py:30 +#: audits/models.py:37 ops/models/base.py:18 #: terminal/backends/command/models.py:22 terminal/models/session/session.py:33 #: tickets/models/ticket/command_confirm.py:13 xpack/plugins/cloud/models.py:85 msgid "Account" @@ -240,8 +242,8 @@ msgid "Account backup plan" msgstr "アカウントバックアップ計画" #: accounts/models/automations/backup_account.py:77 -#: assets/models/automations/base.py:106 audits/models.py:41 -#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:106 +#: assets/models/automations/base.py:106 audits/models.py:43 +#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:113 #: perms/models/asset_permission.py:72 terminal/models/applet/host.py:108 #: terminal/models/session/session.py:43 #: tickets/models/ticket/apply_application.py:30 @@ -267,8 +269,8 @@ msgstr "アカウントのバックアップスナップショット" msgid "Trigger mode" msgstr "トリガーモード" -#: accounts/models/automations/backup_account.py:91 audits/models.py:129 -#: terminal/models/session/sharing.py:107 xpack/plugins/cloud/models.py:176 +#: accounts/models/automations/backup_account.py:91 audits/models.py:158 +#: terminal/models/session/sharing.py:107 xpack/plugins/cloud/models.py:168 msgid "Reason" msgstr "理由" @@ -320,7 +322,7 @@ msgid "Can add push account execution" msgstr "プッシュ アカウントの作成の実行" #: accounts/models/automations/change_secret.py:17 accounts/models/base.py:36 -#: accounts/serializers/account/account.py:118 +#: accounts/serializers/account/account.py:132 #: accounts/serializers/account/base.py:16 #: accounts/serializers/automations/change_secret.py:46 #: authentication/serializers/connect_token_secret.py:41 @@ -363,7 +365,7 @@ msgstr "開始日" #: accounts/models/automations/change_secret.py:74 #: assets/models/automations/base.py:107 ops/models/base.py:56 -#: ops/models/celery.py:64 ops/models/job.py:107 +#: ops/models/celery.py:64 ops/models/job.py:114 #: terminal/models/applet/host.py:109 msgid "Date finished" msgstr "終了日" @@ -387,20 +389,21 @@ msgid "Triggers" msgstr "トリガー方式" #: accounts/models/automations/push_account.py:14 accounts/models/base.py:34 -#: acls/serializers/base.py:18 acls/serializers/base.py:49 -#: assets/models/_user.py:23 audits/models.py:114 authentication/forms.py:25 -#: authentication/forms.py:27 authentication/models/temp_token.py:9 +#: accounts/models/gathered_account.py:15 acls/serializers/base.py:18 +#: acls/serializers/base.py:49 assets/models/_user.py:23 audits/models.py:143 +#: authentication/forms.py:25 authentication/forms.py:27 +#: authentication/models/temp_token.py:9 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: users/forms/profile.py:32 users/forms/profile.py:112 -#: users/models/user.py:673 users/templates/users/_msg_user_created.html:12 +#: users/models/user.py:715 users/templates/users/_msg_user_created.html:12 #: xpack/plugins/cloud/serializers/account_attrs.py:26 msgid "Username" msgstr "ユーザー名" #: accounts/models/automations/push_account.py:15 acls/models/base.py:81 -#: acls/serializers/base.py:81 assets/models/cmd_filter.py:81 -#: audits/models.py:51 audits/serializers.py:82 +#: acls/serializers/base.py:81 acls/serializers/login_acl.py:25 +#: assets/models/cmd_filter.py:81 audits/models.py:53 audits/serializers.py:83 #: authentication/serializers/connect_token_secret.py:109 #: authentication/templates/authentication/_access_key_modal.html:34 msgid "Action" @@ -421,18 +424,18 @@ msgstr "アカウントの確認" #: assets/models/cmd_filter.py:21 assets/models/domain.py:18 #: assets/models/group.py:20 assets/models/label.py:18 #: assets/models/platform.py:20 assets/models/platform.py:74 -#: assets/serializers/asset/common.py:61 assets/serializers/asset/common.py:129 -#: assets/serializers/platform.py:126 +#: assets/serializers/asset/common.py:63 assets/serializers/asset/common.py:137 +#: assets/serializers/platform.py:128 #: authentication/serializers/connect_token_secret.py:103 ops/mixin.py:20 #: ops/models/adhoc.py:22 ops/models/celery.py:15 ops/models/celery.py:57 #: ops/models/job.py:24 ops/models/playbook.py:15 orgs/models.py:69 #: perms/models/asset_permission.py:56 rbac/models/role.py:29 #: settings/models.py:33 settings/serializers/sms.py:6 -#: terminal/models/applet/applet.py:24 terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:26 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:90 #: terminal/models/component/storage.py:26 terminal/models/component/task.py:15 #: terminal/models/component/terminal.py:79 users/forms/profile.py:33 -#: users/models/group.py:13 users/models/user.py:675 +#: users/models/group.py:13 users/models/user.py:717 #: xpack/plugins/cloud/models.py:28 msgid "Name" msgstr "名前" @@ -445,10 +448,26 @@ msgstr "特権アカウント" #: assets/models/automations/base.py:21 assets/models/cmd_filter.py:39 #: assets/models/label.py:22 #: authentication/serializers/connect_token_secret.py:107 -#: terminal/models/applet/applet.py:29 users/serializers/user.py:159 +#: terminal/models/applet/applet.py:31 users/serializers/user.py:159 msgid "Is active" msgstr "アクティブです。" +#: accounts/models/gathered_account.py:12 +msgid "Present" +msgstr "存在する" + +#: accounts/models/gathered_account.py:13 +msgid "Date last login" +msgstr "最終ログイン日" + +#: accounts/models/gathered_account.py:16 +msgid "Address last login" +msgstr "最終ログインアドレス" + +#: accounts/models/gathered_account.py:23 rbac/tree.py:50 +msgid "Gather account" +msgstr "アカウントを集める" + #: accounts/notifications.py:8 msgid "Notification of account backup route task results" msgstr "アカウントバックアップルートタスクの結果の通知" @@ -490,22 +509,50 @@ msgstr "" "{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人" "情報にアクセスしてください-> ファイル暗号化パスワードを設定してください" -#: accounts/serializers/account/account.py:53 -#: assets/serializers/asset/common.py:59 settings/serializers/auth/sms.py:75 +#: accounts/serializers/account/account.py:65 +#: assets/serializers/asset/common.py:61 settings/serializers/auth/sms.py:75 msgid "Template" msgstr "テンプレート" -#: accounts/serializers/account/account.py:56 -#: assets/serializers/asset/common.py:56 +#: accounts/serializers/account/account.py:68 +#: assets/serializers/asset/common.py:58 msgid "Push now" msgstr "今すぐプッシュ" -#: accounts/serializers/account/account.py:58 +#: accounts/serializers/account/account.py:70 #: accounts/serializers/account/base.py:64 msgid "Has secret" msgstr "エスクローされたパスワード" -#: accounts/serializers/account/account.py:77 +#: accounts/serializers/account/account.py:75 applications/models.py:11 +#: assets/models/label.py:21 assets/models/platform.py:75 +#: assets/serializers/asset/common.py:116 assets/serializers/cagegory.py:8 +#: assets/serializers/platform.py:90 assets/serializers/platform.py:129 +#: perms/serializers/user_permission.py:25 settings/models.py:35 +#: tickets/models/ticket/apply_application.py:13 +msgid "Category" +msgstr "カテゴリ" + +#: accounts/serializers/account/account.py:76 +#: accounts/serializers/automations/base.py:43 acls/models/command_acl.py:24 +#: acls/serializers/command_acl.py:18 applications/models.py:14 +#: assets/models/_user.py:50 assets/models/automations/base.py:20 +#: assets/models/cmd_filter.py:74 assets/models/platform.py:76 +#: assets/serializers/asset/common.py:117 assets/serializers/platform.py:89 +#: audits/serializers.py:49 +#: authentication/serializers/connect_token_secret.py:116 ops/models/job.py:32 +#: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:30 +#: terminal/models/component/storage.py:57 +#: terminal/models/component/storage.py:146 terminal/serializers/applet.py:28 +#: terminal/serializers/session.py:26 terminal/serializers/storage.py:181 +#: tickets/models/comment.py:26 tickets/models/flow.py:56 +#: tickets/models/ticket/apply_application.py:16 +#: tickets/models/ticket/general.py:275 tickets/serializers/flow.py:53 +#: tickets/serializers/ticket/ticket.py:19 +msgid "Type" +msgstr "タイプ" + +#: accounts/serializers/account/account.py:91 msgid "Asset not found" msgstr "資産が存在しません" @@ -535,7 +582,7 @@ msgid "Key password" msgstr "キーパスワード" #: accounts/serializers/account/base.py:80 -#: assets/serializers/asset/common.py:262 +#: assets/serializers/asset/common.py:280 msgid "Spec info" msgstr "特別情報" @@ -560,24 +607,6 @@ msgstr "ノード" msgid "Automation snapshot" msgstr "自動スナップショット" -#: accounts/serializers/automations/base.py:43 acls/models/command_acl.py:24 -#: acls/serializers/command_acl.py:18 applications/models.py:14 -#: assets/models/_user.py:50 assets/models/automations/base.py:20 -#: assets/models/cmd_filter.py:74 assets/models/platform.py:76 -#: assets/serializers/asset/common.py:109 assets/serializers/platform.py:87 -#: audits/serializers.py:48 -#: authentication/serializers/connect_token_secret.py:116 ops/models/job.py:32 -#: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:28 -#: terminal/models/component/storage.py:57 -#: terminal/models/component/storage.py:146 terminal/serializers/applet.py:28 -#: terminal/serializers/session.py:26 terminal/serializers/storage.py:181 -#: tickets/models/comment.py:26 tickets/models/flow.py:56 -#: tickets/models/ticket/apply_application.py:16 -#: tickets/models/ticket/general.py:275 tickets/serializers/flow.py:53 -#: tickets/serializers/ticket/ticket.py:19 -msgid "Type" -msgstr "タイプ" - #: accounts/serializers/automations/change_secret.py:43 msgid "SSH Key strategy" msgstr "SSHキー戦略" @@ -595,16 +624,17 @@ msgstr "* パスワードの長さの範囲6-30ビット" msgid "Automation task execution" msgstr "自動タスク実行履歴" -#: accounts/serializers/automations/change_secret.py:150 audits/const.py:45 -#: audits/handler.py:167 audits/models.py:40 common/const/choices.py:18 -#: ops/const.py:56 ops/serializers/celery.py:39 terminal/const.py:59 -#: terminal/models/session/sharing.py:103 tickets/views/approve.py:114 +#: accounts/serializers/automations/change_secret.py:150 audits/const.py:52 +#: audits/models.py:42 audits/signal_handlers/activity_log.py:120 +#: common/const/choices.py:18 ops/const.py:56 ops/serializers/celery.py:39 +#: terminal/const.py:59 terminal/models/session/sharing.py:103 +#: tickets/views/approve.py:114 msgid "Success" msgstr "成功" -#: accounts/serializers/automations/change_secret.py:151 audits/const.py:46 -#: audits/handler.py:167 common/const/choices.py:19 ops/const.py:58 -#: terminal/const.py:60 xpack/plugins/cloud/const.py:41 +#: accounts/serializers/automations/change_secret.py:151 audits/const.py:53 +#: audits/signal_handlers/activity_log.py:120 common/const/choices.py:19 +#: ops/const.py:58 terminal/const.py:60 xpack/plugins/cloud/const.py:41 msgid "Failed" msgstr "失敗しました" @@ -632,19 +662,19 @@ msgstr "アセット アカウントの可用性を確認する" msgid "Verify accounts connectivity" msgstr "アカウント接続のテスト" -#: accounts/utils.py:42 +#: accounts/utils.py:43 msgid "Password can not contains `{{` " msgstr "パスワードには '{{' を含まない" -#: accounts/utils.py:45 +#: accounts/utils.py:46 msgid "Password can not contains `'` " msgstr "パスワードには `'` を含まない" -#: accounts/utils.py:47 +#: accounts/utils.py:48 msgid "Password can not contains `\"` " msgstr "パスワードには `\"` を含まない" -#: accounts/utils.py:53 +#: accounts/utils.py:54 msgid "private key invalid or passphrase error" msgstr "秘密鍵が無効またはpassphraseエラー" @@ -682,7 +712,7 @@ msgid "Reviewers" msgstr "レビュー担当者" #: acls/models/base.py:83 authentication/models/access_key.py:17 -#: authentication/models/connection_token.py:47 +#: authentication/models/connection_token.py:48 #: authentication/templates/authentication/_access_key_modal.html:32 #: perms/models/asset_permission.py:76 terminal/models/session/sharing.py:27 #: tickets/const.py:37 @@ -691,18 +721,18 @@ msgstr "アクティブ" #: acls/models/base.py:98 acls/models/login_acl.py:13 #: acls/serializers/base.py:55 acls/serializers/login_acl.py:21 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:30 -#: audits/models.py:49 audits/models.py:98 -#: authentication/models/connection_token.py:28 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:32 +#: audits/models.py:51 audits/models.py:127 +#: authentication/models/connection_token.py:29 #: authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:58 #: perms/serializers/permission.py:23 rbac/builtin.py:119 -#: rbac/models/rolebinding.py:41 terminal/backends/command/models.py:20 +#: rbac/models/rolebinding.py:49 terminal/backends/command/models.py:20 #: terminal/models/session/session.py:29 terminal/models/session/sharing.py:32 #: terminal/notifications.py:96 terminal/notifications.py:144 #: terminal/serializers/command.py:15 tickets/models/comment.py:21 -#: users/const.py:14 users/models/user.py:900 users/models/user.py:931 +#: users/const.py:14 users/models/user.py:911 users/models/user.py:942 #: users/serializers/group.py:19 msgid "User" msgstr "ユーザー" @@ -835,7 +865,7 @@ msgstr "" "192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:" "db8:1a:1110::/64" -#: acls/serializers/rules/rules.py:33 assets/models/asset/common.py:108 +#: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 @@ -851,14 +881,6 @@ msgstr "期間" msgid "Applications" msgstr "アプリケーション" -#: applications/models.py:11 assets/models/label.py:21 -#: assets/models/platform.py:75 assets/serializers/asset/common.py:108 -#: assets/serializers/cagegory.py:8 assets/serializers/platform.py:88 -#: assets/serializers/platform.py:127 perms/serializers/user_permission.py:25 -#: settings/models.py:35 tickets/models/ticket/apply_application.py:13 -msgid "Category" -msgstr "カテゴリ" - #: applications/models.py:16 xpack/plugins/cloud/models.py:33 #: xpack/plugins/cloud/serializers/account.py:62 msgid "Attrs" @@ -887,7 +909,7 @@ msgstr "" "デフォルトポートは9000で、HTTPインタフェースとネイティブインタフェースは異な" "るポートを使用する" -#: assets/api/asset/asset.py:115 +#: assets/api/asset/asset.py:136 msgid "Cannot create asset directly, you should create a host or other" msgstr "" "資産を直接作成することはできません。ホストまたはその他を作成する必要がありま" @@ -913,12 +935,12 @@ msgstr "削除に失敗し、ノードにアセットが含まれています。 msgid "App assets" msgstr "アプリ資産" -#: assets/automations/base/manager.py:103 +#: assets/automations/base/manager.py:104 msgid "{} disabled" msgstr "{} 無効" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:113 +#: authentication/models/connection_token.py:114 msgid "No account" msgstr "アカウントなし" @@ -928,7 +950,7 @@ msgid "Unable to connect to port {port} on {address}" msgstr "{port} のポート {address} に接続できません" #: assets/automations/ping_gateway/manager.py:58 -#: authentication/middleware.py:76 xpack/plugins/cloud/providers/fc.py:48 +#: authentication/middleware.py:87 xpack/plugins/cloud/providers/fc.py:48 msgid "Authentication failed" msgstr "認証に失敗しました" @@ -938,8 +960,8 @@ msgid "Connect failed" msgstr "接続に失敗しました" #: assets/const/automation.py:6 audits/const.py:6 audits/const.py:35 -#: common/utils/ip/geoip/utils.py:31 common/utils/ip/geoip/utils.py:37 -#: common/utils/ip/utils.py:84 +#: audits/signal_handlers/activity_log.py:91 common/utils/ip/geoip/utils.py:31 +#: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:84 msgid "Unknown" msgstr "不明" @@ -970,7 +992,7 @@ msgid "Device" msgstr "インターネット機器" #: assets/const/category.py:13 assets/models/asset/database.py:9 -#: assets/models/asset/database.py:24 assets/serializers/asset/common.py:96 +#: assets/models/asset/database.py:24 assets/serializers/asset/common.py:104 msgid "Database" msgstr "データベース" @@ -979,11 +1001,11 @@ msgid "Cloud service" msgstr "クラウド サービス" #: assets/const/category.py:15 audits/const.py:33 -#: terminal/models/applet/applet.py:22 +#: terminal/models/applet/applet.py:24 msgid "Web" msgstr "Web" -#: assets/const/device.py:7 terminal/models/applet/applet.py:21 +#: assets/const/device.py:7 terminal/models/applet/applet.py:23 #: tickets/const.py:8 msgid "General" msgstr "一般" @@ -1004,10 +1026,25 @@ msgstr "ファイアウォール" msgid "All types" msgstr "いろんなタイプ" -#: assets/const/web.py:7 +#: assets/const/web.py:8 msgid "Website" msgstr "Webサイト" +#: assets/const/web.py:59 audits/const.py:46 +#: terminal/serializers/applet_host.py:28 +msgid "Disabled" +msgstr "無効" + +#: assets/const/web.py:60 settings/serializers/auth/base.py:10 +#: settings/serializers/basic.py:27 +msgid "Basic" +msgstr "基本" + +#: assets/const/web.py:61 assets/models/asset/web.py:13 +#: assets/serializers/asset/common.py:112 assets/serializers/platform.py:39 +msgid "Script" +msgstr "脚本" + #: assets/models/_user.py:25 msgid "SSH private key" msgstr "SSH秘密鍵" @@ -1020,31 +1057,31 @@ msgstr "SSHパブリックキー" #: assets/models/cmd_filter.py:88 assets/models/group.py:23 #: assets/models/platform.py:79 common/db/models.py:37 ops/models/adhoc.py:28 #: ops/models/job.py:40 ops/models/playbook.py:18 rbac/models/role.py:37 -#: settings/models.py:38 terminal/models/applet/applet.py:33 -#: terminal/models/applet/applet.py:146 terminal/models/applet/host.py:110 +#: settings/models.py:38 terminal/models/applet/applet.py:35 +#: terminal/models/applet/applet.py:151 terminal/models/applet/host.py:110 #: terminal/models/component/endpoint.py:24 #: terminal/models/component/endpoint.py:100 #: terminal/models/session/session.py:45 tickets/models/comment.py:32 -#: tickets/models/ticket/general.py:297 users/models/user.py:714 -#: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:119 +#: tickets/models/ticket/general.py:297 users/models/user.py:756 +#: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:111 msgid "Comment" msgstr "コメント" #: assets/models/_user.py:28 assets/models/automations/base.py:105 #: assets/models/cmd_filter.py:41 assets/models/group.py:22 -#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:105 -#: users/models/user.py:932 +#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:112 +#: users/models/user.py:943 msgid "Date created" msgstr "作成された日付" #: assets/models/_user.py:29 assets/models/cmd_filter.py:42 -#: common/db/models.py:36 users/models/user.py:735 +#: common/db/models.py:36 users/models/user.py:777 msgid "Date updated" msgstr "更新日" #: assets/models/_user.py:30 assets/models/cmd_filter.py:44 #: assets/models/cmd_filter.py:91 assets/models/group.py:21 -#: common/db/models.py:33 users/models/user.py:721 +#: common/db/models.py:33 users/models/user.py:763 #: users/serializers/group.py:33 msgid "Created by" msgstr "によって作成された" @@ -1069,9 +1106,9 @@ msgstr "管理ユーザー" msgid "Username same with user" msgstr "ユーザーと同じユーザー名" -#: assets/models/_user.py:52 authentication/models/connection_token.py:37 +#: assets/models/_user.py:52 authentication/models/connection_token.py:38 #: authentication/serializers/connect_token_secret.py:104 -#: terminal/models/applet/applet.py:31 terminal/serializers/session.py:24 +#: terminal/models/applet/applet.py:33 terminal/serializers/session.py:24 #: terminal/serializers/session.py:45 terminal/serializers/storage.py:68 msgid "Protocol" msgstr "プロトコル" @@ -1120,10 +1157,14 @@ msgstr "システムユーザー" msgid "Can match system user" msgstr "システムユーザーに一致できます" +#: assets/models/asset/common.py:108 assets/serializers/asset/common.py:138 +msgid "Address" +msgstr "アドレス" + #: assets/models/asset/common.py:109 assets/models/platform.py:111 #: authentication/serializers/connect_token_secret.py:108 #: perms/serializers/user_permission.py:23 -#: xpack/plugins/cloud/serializers/account_attrs.py:179 +#: xpack/plugins/cloud/serializers/account_attrs.py:182 msgid "Platform" msgstr "プラットフォーム" @@ -1165,7 +1206,7 @@ msgstr "ノードにアセットを追加する" msgid "Move asset to node" msgstr "アセットをノードに移動する" -#: assets/models/asset/database.py:10 assets/serializers/asset/common.py:97 +#: assets/models/asset/database.py:10 assets/serializers/asset/common.py:105 #: settings/serializers/email.py:37 msgid "Use SSL" msgstr "SSLの使用" @@ -1182,46 +1223,31 @@ msgstr "クライアント証明書" msgid "Client key" msgstr "クライアントキー" -#: assets/models/asset/database.py:14 assets/serializers/asset/common.py:98 +#: assets/models/asset/database.py:14 assets/serializers/asset/common.py:106 msgid "Allow invalid cert" msgstr "証明書チェックを無視" -#: assets/models/asset/web.py:9 audits/const.py:39 -#: terminal/serializers/applet_host.py:28 -msgid "Disabled" -msgstr "無効" - -#: assets/models/asset/web.py:10 settings/serializers/auth/base.py:10 -#: settings/serializers/basic.py:27 -msgid "Basic" -msgstr "基本" - -#: assets/models/asset/web.py:11 assets/models/asset/web.py:17 -#: assets/serializers/asset/common.py:104 -msgid "Script" -msgstr "脚本" - -#: assets/models/asset/web.py:13 assets/serializers/platform.py:28 +#: assets/models/asset/web.py:9 assets/serializers/platform.py:29 msgid "Autofill" msgstr "自動充填" -#: assets/models/asset/web.py:14 assets/serializers/asset/common.py:101 -#: assets/serializers/platform.py:30 +#: assets/models/asset/web.py:10 assets/serializers/asset/common.py:109 +#: assets/serializers/platform.py:31 msgid "Username selector" msgstr "ユーザー名ピッカー" -#: assets/models/asset/web.py:15 assets/serializers/asset/common.py:102 -#: assets/serializers/platform.py:33 +#: assets/models/asset/web.py:11 assets/serializers/asset/common.py:110 +#: assets/serializers/platform.py:34 msgid "Password selector" msgstr "パスワードセレクター" -#: assets/models/asset/web.py:16 assets/serializers/asset/common.py:103 -#: assets/serializers/platform.py:36 +#: assets/models/asset/web.py:12 assets/serializers/asset/common.py:111 +#: assets/serializers/platform.py:37 msgid "Submit selector" msgstr "ボタンセレクターを確認する" #: assets/models/automations/base.py:17 assets/models/cmd_filter.py:38 -#: assets/serializers/asset/common.py:261 perms/models/asset_permission.py:70 +#: assets/serializers/asset/common.py:279 perms/models/asset_permission.py:70 #: perms/serializers/permission.py:32 rbac/tree.py:36 msgid "Accounts" msgstr "アカウント" @@ -1234,14 +1260,14 @@ msgstr "自動化されたタスク" msgid "Asset automation task" msgstr "アセットの自動化タスク" -#: assets/models/automations/base.py:104 audits/models.py:134 -#: audits/serializers.py:49 ops/models/base.py:49 ops/models/job.py:98 -#: terminal/models/applet/applet.py:145 terminal/models/applet/host.py:107 +#: assets/models/automations/base.py:104 audits/models.py:163 +#: audits/serializers.py:50 ops/models/base.py:49 ops/models/job.py:105 +#: terminal/models/applet/applet.py:150 terminal/models/applet/host.py:107 #: terminal/models/component/status.py:27 terminal/serializers/applet.py:17 #: terminal/serializers/applet_host.py:93 tickets/models/ticket/general.py:283 #: tickets/serializers/super_ticket.py:13 -#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:172 -#: xpack/plugins/cloud/models.py:224 +#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:164 +#: xpack/plugins/cloud/models.py:216 msgid "Status" msgstr "ステータス" @@ -1263,7 +1289,7 @@ msgstr "確認済みの日付" #: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:61 #: perms/serializers/permission.py:25 users/models/group.py:25 -#: users/models/user.py:681 +#: users/models/user.py:723 msgid "User group" msgstr "ユーザーグループ" @@ -1312,19 +1338,19 @@ msgstr "デフォルト" msgid "Default asset group" msgstr "デフォルトアセットグループ" -#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:917 +#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:928 msgid "System" msgstr "システム" -#: assets/models/label.py:19 assets/models/node.py:558 +#: assets/models/label.py:19 assets/models/node.py:544 #: assets/serializers/cagegory.py:7 assets/serializers/cagegory.py:14 -#: authentication/models/connection_token.py:25 +#: authentication/models/connection_token.py:26 #: authentication/serializers/connect_token_secret.py:115 #: common/serializers/common.py:80 settings/models.py:34 msgid "Value" msgstr "値" -#: assets/models/label.py:40 assets/serializers/asset/common.py:110 +#: assets/models/label.py:40 assets/serializers/asset/common.py:118 #: assets/serializers/cagegory.py:6 assets/serializers/cagegory.py:13 #: authentication/serializers/connect_token_secret.py:114 #: common/serializers/common.py:79 settings/serializers/sms.py:7 @@ -1335,28 +1361,28 @@ msgstr "ラベル" msgid "New node" msgstr "新しいノード" -#: assets/models/node.py:486 audits/backends/db.py:55 audits/backends/db.py:56 +#: assets/models/node.py:472 audits/backends/db.py:55 audits/backends/db.py:56 msgid "empty" msgstr "空" -#: assets/models/node.py:557 perms/models/perm_node.py:28 +#: assets/models/node.py:543 perms/models/perm_node.py:28 msgid "Key" msgstr "キー" -#: assets/models/node.py:559 assets/serializers/node.py:20 +#: assets/models/node.py:545 assets/serializers/node.py:20 msgid "Full value" msgstr "フルバリュー" -#: assets/models/node.py:563 perms/models/perm_node.py:30 +#: assets/models/node.py:549 perms/models/perm_node.py:30 msgid "Parent key" msgstr "親キー" -#: assets/models/node.py:572 perms/serializers/permission.py:28 +#: assets/models/node.py:558 perms/serializers/permission.py:28 #: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:96 msgid "Node" msgstr "ノード" -#: assets/models/node.py:575 +#: assets/models/node.py:561 msgid "Can match node" msgstr "ノードを一致させることができます" @@ -1369,7 +1395,7 @@ msgstr "必要" msgid "Setting" msgstr "設定" -#: assets/models/platform.py:41 audits/const.py:40 settings/models.py:37 +#: assets/models/platform.py:41 audits/const.py:47 settings/models.py:37 #: terminal/serializers/applet_host.py:29 msgid "Enabled" msgstr "有効化" @@ -1378,45 +1404,45 @@ msgstr "有効化" msgid "Ansible config" msgstr "Ansible 構成" -#: assets/models/platform.py:43 assets/serializers/platform.py:55 +#: assets/models/platform.py:43 assets/serializers/platform.py:57 msgid "Ping enabled" msgstr "アセット ディスカバリを有効にする" -#: assets/models/platform.py:44 assets/serializers/platform.py:56 +#: assets/models/platform.py:44 assets/serializers/platform.py:58 msgid "Ping method" msgstr "資産検出方法" #: assets/models/platform.py:45 assets/models/platform.py:58 -#: assets/serializers/platform.py:57 +#: assets/serializers/platform.py:59 msgid "Gather facts enabled" msgstr "資産情報の収集を有効にする" #: assets/models/platform.py:46 assets/models/platform.py:60 -#: assets/serializers/platform.py:58 +#: assets/serializers/platform.py:60 msgid "Gather facts method" msgstr "情報収集の方法" -#: assets/models/platform.py:47 assets/serializers/platform.py:61 +#: assets/models/platform.py:47 assets/serializers/platform.py:63 msgid "Change secret enabled" msgstr "パスワードの変更が有効" -#: assets/models/platform.py:49 assets/serializers/platform.py:62 +#: assets/models/platform.py:49 assets/serializers/platform.py:64 msgid "Change secret method" msgstr "パスワード変更モード" -#: assets/models/platform.py:51 assets/serializers/platform.py:63 +#: assets/models/platform.py:51 assets/serializers/platform.py:65 msgid "Push account enabled" msgstr "アカウントのプッシュを有効にする" -#: assets/models/platform.py:53 assets/serializers/platform.py:64 +#: assets/models/platform.py:53 assets/serializers/platform.py:66 msgid "Push account method" msgstr "アカウントプッシュ方式" -#: assets/models/platform.py:55 assets/serializers/platform.py:59 +#: assets/models/platform.py:55 assets/serializers/platform.py:61 msgid "Verify account enabled" msgstr "アカウントの確認をオンにする" -#: assets/models/platform.py:57 assets/serializers/platform.py:60 +#: assets/models/platform.py:57 assets/serializers/platform.py:62 msgid "Verify account method" msgstr "アカウント認証方法" @@ -1428,23 +1454,23 @@ msgstr "メタ" msgid "Internal" msgstr "ビルトイン" -#: assets/models/platform.py:82 assets/serializers/platform.py:85 +#: assets/models/platform.py:82 assets/serializers/platform.py:87 msgid "Charset" msgstr "シャーセット" -#: assets/models/platform.py:84 assets/serializers/platform.py:112 +#: assets/models/platform.py:84 assets/serializers/platform.py:114 msgid "Domain enabled" msgstr "ドメインを有効にする" -#: assets/models/platform.py:86 assets/serializers/platform.py:111 +#: assets/models/platform.py:86 assets/serializers/platform.py:113 msgid "Su enabled" msgstr "アカウントの切り替えを有効にする" -#: assets/models/platform.py:87 assets/serializers/platform.py:95 +#: assets/models/platform.py:87 assets/serializers/platform.py:97 msgid "Su method" msgstr "アカウントの切り替え方法" -#: assets/models/platform.py:89 assets/serializers/platform.py:92 +#: assets/models/platform.py:89 assets/serializers/platform.py:94 msgid "Automation" msgstr "オートメーション" @@ -1453,45 +1479,41 @@ msgstr "オートメーション" msgid "%(value)s is not an even number" msgstr "%(value)s は偶数ではありません" -#: assets/serializers/asset/common.py:100 +#: assets/serializers/asset/common.py:108 msgid "Auto fill" msgstr "自動充填" -#: assets/serializers/asset/common.py:111 assets/serializers/platform.py:90 +#: assets/serializers/asset/common.py:119 assets/serializers/platform.py:92 #: authentication/serializers/connect_token_secret.py:28 #: authentication/serializers/connect_token_secret.py:66 -#: perms/serializers/user_permission.py:24 xpack/plugins/cloud/models.py:107 -#: xpack/plugins/cloud/serializers/task.py:38 +#: perms/serializers/user_permission.py:24 xpack/plugins/cloud/models.py:99 msgid "Protocols" msgstr "プロトコル" -#: assets/serializers/asset/common.py:130 -msgid "Address" -msgstr "アドレス" - -#: assets/serializers/asset/common.py:131 +#: assets/serializers/asset/common.py:139 msgid "Node path" msgstr "ノードパスです" -#: assets/serializers/asset/common.py:204 +#: assets/serializers/asset/common.py:212 msgid "Platform not exist" msgstr "プラットフォームが存在しません" -#: assets/serializers/asset/common.py:234 +#: assets/serializers/asset/common.py:244 msgid "port out of range (1-65535)" msgstr "ポート番号が範囲外です (1-65535)" -#: assets/serializers/asset/common.py:241 +#: assets/serializers/asset/common.py:251 msgid "Protocol is required: {}" msgstr "プロトコルが必要です: {}" -#: assets/serializers/asset/common.py:263 +#: assets/serializers/asset/common.py:281 msgid "Auto info" msgstr "自動情報" #: assets/serializers/asset/database.py:24 common/serializers/fields.py:100 #: tickets/serializers/ticket/common.py:58 #: xpack/plugins/cloud/serializers/account_attrs.py:56 +#: xpack/plugins/cloud/serializers/account_attrs.py:79 msgid "This field is required." msgstr "このフィールドは必須です。" @@ -1572,51 +1594,56 @@ msgstr "含まれない:/" msgid "The same level node name cannot be the same" msgstr "同じレベルのノード名を同じにすることはできません。" -#: assets/serializers/platform.py:24 +#: assets/serializers/platform.py:25 msgid "SFTP enabled" msgstr "SFTP が有効" -#: assets/serializers/platform.py:25 +#: assets/serializers/platform.py:26 msgid "SFTP home" msgstr "SFTP ルート パス" -#: assets/serializers/platform.py:65 +#: assets/serializers/platform.py:67 msgid "Gather accounts enabled" msgstr "アカウント収集を有効にする" -#: assets/serializers/platform.py:66 +#: assets/serializers/platform.py:68 msgid "Gather accounts method" msgstr "アカウントの収集方法" -#: assets/serializers/platform.py:72 +#: assets/serializers/platform.py:74 msgid "Primary" msgstr "主要" -#: assets/serializers/platform.py:113 +#: assets/serializers/platform.py:115 msgid "Default Domain" msgstr "デフォルト ドメイン" +#: assets/signal_handlers/asset.py:25 assets/tasks/ping.py:24 +#: assets/tasks/ping.py:34 +msgid "Test assets connectivity " +msgstr "アセット接続のテスト。" + +#: assets/signal_handlers/asset.py:34 +#, fuzzy +#| msgid "Update assets hardware info: " +msgid "Gather asset hardware info" +msgstr "資産のハードウェア情報を更新する:" + #: assets/tasks/automation.py:11 msgid "Asset execute automation" msgstr "アセット実行の自動化" -#: assets/tasks/gather_facts.py:23 -msgid "Update some assets hardware info. " -msgstr "一部の資産ハードウェア情報を更新します。" +#: assets/tasks/gather_facts.py:21 assets/tasks/gather_facts.py:25 +#, fuzzy +#| msgid "Gather asset facts" +msgid "Gather assets facts" +msgstr "資産情報の収集" -#: assets/tasks/gather_facts.py:53 -msgid "Manually update the hardware information of assets" -msgstr "アセット情報を手動で更新する" - -#: assets/tasks/gather_facts.py:57 +#: assets/tasks/gather_facts.py:47 msgid "Update assets hardware info: " msgstr "資産のハードウェア情報を更新する:" -#: assets/tasks/gather_facts.py:61 -msgid "Manually update the hardware information of assets under a node" -msgstr "ノードの下の資産情報を手動で更新する" - -#: assets/tasks/gather_facts.py:65 +#: assets/tasks/gather_facts.py:54 msgid "Update node asset hardware information: " msgstr "ノード資産のハードウェア情報を更新します。" @@ -1635,19 +1662,7 @@ msgstr "" msgid "Periodic check the amount of assets under the node" msgstr "ノードの下にあるアセットの数を定期的に確認する" -#: assets/tasks/ping.py:37 assets/tasks/ping.py:54 -msgid "Test assets connectivity " -msgstr "アセット接続のテスト。" - -#: assets/tasks/ping.py:50 -msgid "Manually test the connectivity of a asset" -msgstr "アセットの接続を手動でテストする" - -#: assets/tasks/ping.py:58 -msgid "Manually test the connectivity of assets under a node" -msgstr "ノードの下のアセットの接続を手動でテストする" - -#: assets/tasks/ping.py:62 +#: assets/tasks/ping.py:41 msgid "Test if the assets under the node are connectable " msgstr "ノード配下のアセットが接続できるかテストする" @@ -1675,7 +1690,7 @@ msgstr "監査" msgid "The text content is too long. Use Elasticsearch to store operation logs" msgstr "文章の内容が長すぎる。Elasticsearchで操作履歴を保存する" -#: audits/backends/db.py:76 +#: audits/backends/db.py:81 msgid "Tips" msgstr "謎々" @@ -1743,7 +1758,28 @@ msgstr "パスワードを変更する" msgid "Terminal" msgstr "ターミナル" +#: audits/const.py:39 audits/models.py:93 +msgid "Operate log" +msgstr "ログの操作" + +#: audits/const.py:40 +#, fuzzy +#| msgid "Session" +msgid "Session log" +msgstr "セッション" + #: audits/const.py:41 +#, fuzzy +#| msgid "Login acl" +msgid "Login log" +msgstr "ログインacl" + +#: audits/const.py:42 ops/signal_handlers.py:74 +#: terminal/models/applet/host.py:111 terminal/models/component/task.py:24 +msgid "Task" +msgstr "タスク" + +#: audits/const.py:48 msgid "-" msgstr "-" @@ -1755,145 +1791,160 @@ msgstr "是" msgid "No" msgstr "否" -#: audits/handler.py:140 -msgid "{} used account[{}], login method[{}] login the asset." -msgstr "" -"{} トムはアカウント[{}]、ログイン方法[{}]を使ってこの資産を登録しました" - -#: audits/handler.py:155 -msgid "User {} has executed change auth plan for this account.({})" -msgstr "ユーザー {} はこのアカウントのために改密計画を実行しました。({})" - -#: audits/handler.py:168 -msgid "User {} login into this service.[{}]" -msgstr "ユーザー {} がサービスにログインしました。[{}]" - -#: audits/models.py:32 audits/models.py:59 audits/models.py:101 +#: audits/models.py:34 audits/models.py:61 audits/models.py:130 #: terminal/models/session/session.py:37 terminal/models/session/sharing.py:95 msgid "Remote addr" msgstr "リモートaddr" -#: audits/models.py:37 audits/serializers.py:33 +#: audits/models.py:39 audits/serializers.py:34 msgid "Operate" msgstr "操作" -#: audits/models.py:39 +#: audits/models.py:41 msgid "Filename" msgstr "ファイル名" -#: audits/models.py:44 +#: audits/models.py:46 msgid "File transfer log" msgstr "ファイル転送ログ" -#: audits/models.py:53 audits/serializers.py:93 +#: audits/models.py:55 audits/serializers.py:94 msgid "Resource Type" msgstr "リソースタイプ" -#: audits/models.py:54 audits/models.py:57 +#: audits/models.py:56 audits/models.py:59 audits/models.py:105 msgid "Resource" msgstr "リソース" -#: audits/models.py:60 audits/models.py:103 terminal/serializers/command.py:43 +#: audits/models.py:62 audits/models.py:108 audits/models.py:132 +#: terminal/serializers/command.py:43 msgid "Datetime" msgstr "時間" -#: audits/models.py:62 +#: audits/models.py:101 +#, fuzzy +#| msgid "Active" +msgid "Activity type" +msgstr "アクティブ" + +#: audits/models.py:110 msgid "Detail" msgstr "" -#: audits/models.py:92 -msgid "Operate log" -msgstr "ログの操作" +#: audits/models.py:112 +#, fuzzy +#| msgid "Terminal ID" +msgid "Detail ID" +msgstr "ターミナル ID" -#: audits/models.py:99 +#: audits/models.py:116 +msgid "Activity log" +msgstr "" + +#: audits/models.py:128 msgid "Change by" msgstr "による変更" -#: audits/models.py:109 +#: audits/models.py:138 msgid "Password change log" msgstr "パスワード変更ログ" -#: audits/models.py:116 +#: audits/models.py:145 msgid "Login type" msgstr "ログインタイプ" -#: audits/models.py:118 tickets/models/ticket/login_confirm.py:10 +#: audits/models.py:147 tickets/models/ticket/login_confirm.py:10 msgid "Login ip" msgstr "ログインIP" -#: audits/models.py:120 +#: audits/models.py:149 #: authentication/templates/authentication/_msg_different_city.html:11 #: tickets/models/ticket/login_confirm.py:11 msgid "Login city" msgstr "ログイン都市" -#: audits/models.py:123 audits/serializers.py:63 +#: audits/models.py:152 audits/serializers.py:64 msgid "User agent" msgstr "ユーザーエージェント" -#: audits/models.py:126 audits/serializers.py:47 +#: audits/models.py:155 audits/serializers.py:48 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 -#: users/forms/profile.py:65 users/models/user.py:698 -#: users/serializers/profile.py:126 +#: users/forms/profile.py:65 users/models/user.py:740 +#: users/serializers/profile.py:124 msgid "MFA" msgstr "MFA" -#: audits/models.py:136 +#: audits/models.py:165 msgid "Date login" msgstr "日付ログイン" -#: audits/models.py:138 audits/serializers.py:65 +#: audits/models.py:167 audits/serializers.py:66 msgid "Authentication backend" msgstr "認証バックエンド" -#: audits/models.py:182 +#: audits/models.py:211 msgid "User login log" msgstr "ユーザーログインログ" -#: audits/serializers.py:64 +#: audits/serializers.py:65 msgid "Reason display" msgstr "理由表示" -#: audits/serializers.py:120 +#: audits/serializers.py:122 msgid "User {} {} this resource." msgstr "ユーザー {} {} が現在のリソースをサブスクライブしました。" -#: audits/signal_handlers.py:49 +#: audits/signal_handlers/activity_log.py:112 +msgid "{} used account[{}], login method[{}] login the asset." +msgstr "" +"{} トムはアカウント[{}]、ログイン方法[{}]を使ってこの資産を登録しました" + +#: audits/signal_handlers/activity_log.py:121 +msgid "User {} login into this service.[{}]" +msgstr "ユーザー {} がサービスにログインしました。[{}]" + +#: audits/signal_handlers/activity_log.py:139 +#, python-format +msgid "User %s performs a task(%s) for this resource." +msgstr "" + +#: audits/signal_handlers/login_log.py:29 msgid "SSH Key" msgstr "SSHキー" -#: audits/signal_handlers.py:51 settings/serializers/auth/sso.py:10 +#: audits/signal_handlers/login_log.py:31 settings/serializers/auth/sso.py:10 msgid "SSO" msgstr "SSO" -#: audits/signal_handlers.py:52 +#: audits/signal_handlers/login_log.py:32 msgid "Auth Token" msgstr "認証トークン" -#: audits/signal_handlers.py:53 authentication/notifications.py:73 +#: audits/signal_handlers/login_log.py:33 authentication/notifications.py:73 #: authentication/views/login.py:73 authentication/views/wecom.py:177 #: notifications/backends/__init__.py:11 settings/serializers/auth/wecom.py:10 -#: users/models/user.py:736 +#: users/models/user.py:778 msgid "WeCom" msgstr "企業微信" -#: audits/signal_handlers.py:54 authentication/views/feishu.py:144 +#: audits/signal_handlers/login_log.py:34 authentication/views/feishu.py:144 #: authentication/views/login.py:85 notifications/backends/__init__.py:14 -#: settings/serializers/auth/feishu.py:10 users/models/user.py:738 +#: settings/serializers/auth/feishu.py:10 users/models/user.py:780 msgid "FeiShu" msgstr "本を飛ばす" -#: audits/signal_handlers.py:55 authentication/views/dingtalk.py:179 +#: audits/signal_handlers/login_log.py:35 authentication/views/dingtalk.py:179 #: authentication/views/login.py:79 notifications/backends/__init__.py:12 -#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:737 +#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:779 msgid "DingTalk" msgstr "DingTalk" -#: audits/signal_handlers.py:56 authentication/models/temp_token.py:16 +#: audits/signal_handlers/login_log.py:36 +#: authentication/models/temp_token.py:16 msgid "Temporary token" msgstr "仮パスワード" -#: audits/tasks.py:37 +#: audits/tasks.py:44 msgid "Clean audits log" msgstr "監査ログのクリーンアップ" @@ -1901,19 +1952,19 @@ msgstr "監査ログのクリーンアップ" msgid "This action require verify your MFA" msgstr "この操作には、MFAを検証する必要があります" -#: authentication/api/connection_token.py:264 +#: authentication/api/connection_token.py:269 msgid "Account not found" msgstr "アカウントが見つかりません" -#: authentication/api/connection_token.py:267 +#: authentication/api/connection_token.py:272 msgid "Permission expired" msgstr "承認の有効期限が切れています" -#: authentication/api/connection_token.py:279 +#: authentication/api/connection_token.py:284 msgid "ACL action is reject" msgstr "ACL アクションは拒否です" -#: authentication/api/connection_token.py:283 +#: authentication/api/connection_token.py:288 msgid "ACL action is review" msgstr "ACL アクションはレビューです" @@ -2279,7 +2330,7 @@ msgstr "電話番号を設定して有効にする" msgid "Clear phone number to disable" msgstr "無効にする電話番号をクリアする" -#: authentication/middleware.py:77 settings/utils/ldap.py:652 +#: authentication/middleware.py:88 settings/utils/ldap.py:652 msgid "Authentication failed (before login check failed): {}" msgstr "認証に失敗しました (ログインチェックが失敗する前): {}" @@ -2291,66 +2342,66 @@ msgstr "MFAタイプ ({}) が有効になっていない" msgid "Please change your password" msgstr "パスワードを変更してください" -#: authentication/models/connection_token.py:34 +#: authentication/models/connection_token.py:35 #: terminal/serializers/storage.py:111 msgid "Account name" msgstr "アカウント名" -#: authentication/models/connection_token.py:35 +#: authentication/models/connection_token.py:36 msgid "Input username" msgstr "カスタム ユーザー名" -#: authentication/models/connection_token.py:36 -#: authentication/serializers/connection_token.py:16 +#: authentication/models/connection_token.py:37 +#: authentication/serializers/connection_token.py:17 msgid "Input secret" msgstr "カスタムパスワード" -#: authentication/models/connection_token.py:38 +#: authentication/models/connection_token.py:39 msgid "Connect method" msgstr "接続方法" -#: authentication/models/connection_token.py:39 +#: authentication/models/connection_token.py:40 #: rbac/serializers/rolebinding.py:21 msgid "User display" msgstr "ユーザー表示" -#: authentication/models/connection_token.py:40 +#: authentication/models/connection_token.py:41 msgid "Asset display" msgstr "アセット名" -#: authentication/models/connection_token.py:41 +#: authentication/models/connection_token.py:42 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:74 #: tickets/models/ticket/apply_application.py:31 -#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:719 +#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:761 msgid "Date expired" msgstr "期限切れの日付" -#: authentication/models/connection_token.py:45 +#: authentication/models/connection_token.py:46 #: perms/models/asset_permission.py:77 msgid "From ticket" msgstr "チケットから" -#: authentication/models/connection_token.py:51 +#: authentication/models/connection_token.py:52 msgid "Connection token" msgstr "接続トークン" -#: authentication/models/connection_token.py:53 +#: authentication/models/connection_token.py:54 msgid "Can view connection token secret" msgstr "接続トークンの秘密を表示できます" -#: authentication/models/connection_token.py:100 +#: authentication/models/connection_token.py:101 msgid "Connection token inactive" msgstr "接続トークンがアクティブ化されていません" -#: authentication/models/connection_token.py:103 +#: authentication/models/connection_token.py:104 msgid "Connection token expired at: {}" msgstr "接続トークンの有効期限: {}" -#: authentication/models/connection_token.py:106 +#: authentication/models/connection_token.py:107 msgid "No user or invalid user" msgstr "ユーザーなしまたは期限切れのユーザー" -#: authentication/models/connection_token.py:110 +#: authentication/models/connection_token.py:111 msgid "No asset or inactive asset" msgstr "アセットがないか、有効化されていないアセット" @@ -2404,19 +2455,27 @@ msgstr "すぐに期限切れ" msgid "ID" msgstr "ID" -#: authentication/serializers/connection_token.py:14 +#: authentication/serializers/connection_token.py:15 msgid "Expired time" msgstr "期限切れ時間" -#: authentication/serializers/connection_token.py:18 +#: authentication/serializers/connection_token.py:19 msgid "Ticket info" msgstr "作業指示情報" +#: authentication/serializers/connection_token.py:20 +#: perms/models/asset_permission.py:71 perms/serializers/permission.py:29 +#: perms/serializers/permission.py:60 +#: tickets/models/ticket/apply_application.py:28 +#: tickets/models/ticket/apply_asset.py:18 +msgid "Actions" +msgstr "アクション" + #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/email.py:19 #: settings/serializers/email.py:50 users/forms/profile.py:102 -#: users/forms/profile.py:106 users/models/user.py:677 +#: users/forms/profile.py:106 users/models/user.py:719 #: users/templates/users/forgot_password.html:116 #: users/views/profile/reset.py:73 msgid "Email" @@ -2458,14 +2517,14 @@ msgid "Show" msgstr "表示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: settings/serializers/security.py:39 users/models/user.py:559 -#: users/serializers/profile.py:116 users/templates/users/mfa_setting.html:61 +#: settings/serializers/security.py:39 users/models/user.py:601 +#: users/serializers/profile.py:115 users/templates/users/mfa_setting.html:61 #: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "無効化" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/models/user.py:560 users/serializers/profile.py:117 +#: users/models/user.py:602 users/serializers/profile.py:116 #: users/templates/users/mfa_setting.html:26 #: users/templates/users/mfa_setting.html:68 msgid "Enable" @@ -2796,16 +2855,6 @@ msgstr "パスワードでログインしてからWeComをバインドしてく msgid "Request file format may be wrong" msgstr "リクエストファイルの形式が間違っている可能性があります" -#: common/const/__init__.py:6 -#, python-format -msgid "%(name)s was created successfully" -msgstr "%(name)s が正常に作成されました" - -#: common/const/__init__.py:7 -#, python-format -msgid "%(name)s was updated successfully" -msgstr "%(name)s は正常に更新されました" - #: common/const/choices.py:10 msgid "Manual trigger" msgstr "手動トリガー" @@ -2831,6 +2880,16 @@ msgstr "" msgid "Canceled" msgstr "キャンセル" +#: common/const/common.py:3 +#, python-format +msgid "%(name)s was created successfully" +msgstr "%(name)s が正常に作成されました" + +#: common/const/common.py:4 +#, python-format +msgid "%(name)s was updated successfully" +msgstr "%(name)s は正常に更新されました" + #: common/db/encoder.py:11 msgid "ugettext_lazy" msgstr "ugettext_lazy" @@ -2871,7 +2930,7 @@ msgstr "は破棄されます" msgid "discard time" msgstr "時間を捨てる" -#: common/db/models.py:34 users/models/user.py:722 +#: common/db/models.py:34 users/models/user.py:764 msgid "Updated by" msgstr "によって更新" @@ -3131,15 +3190,15 @@ msgstr "投稿サイトニュース" msgid "No account available" msgstr "利用可能なアカウントがありません" -#: ops/ansible/inventory.py:180 +#: ops/ansible/inventory.py:182 msgid "Ansible disabled" msgstr "Ansible 無効" -#: ops/ansible/inventory.py:196 +#: ops/ansible/inventory.py:198 msgid "Skip hosts below:" msgstr "次のホストをスキップします: " -#: ops/api/celery.py:58 ops/api/celery.py:73 +#: ops/api/celery.py:61 ops/api/celery.py:76 msgid "Waiting task start" msgstr "タスク開始待ち" @@ -3254,7 +3313,7 @@ msgid "Args" msgstr "アルグ" #: ops/models/adhoc.py:27 ops/models/base.py:16 ops/models/base.py:53 -#: ops/models/job.py:33 ops/models/job.py:104 ops/models/playbook.py:17 +#: ops/models/job.py:33 ops/models/job.py:111 ops/models/playbook.py:17 #: terminal/models/session/sharing.py:23 msgid "Creator" msgstr "作成者" @@ -3275,12 +3334,12 @@ msgstr "最後の実行" msgid "Date last run" msgstr "最終実行日" -#: ops/models/base.py:51 ops/models/job.py:102 -#: xpack/plugins/cloud/models.py:170 +#: ops/models/base.py:51 ops/models/job.py:109 +#: xpack/plugins/cloud/models.py:162 msgid "Result" msgstr "結果" -#: ops/models/base.py:52 ops/models/job.py:103 +#: ops/models/base.py:52 ops/models/job.py:110 msgid "Summary" msgstr "概要" @@ -3344,14 +3403,22 @@ msgstr "パラメータ定義を使用する" msgid "Parameters define" msgstr "パラメータ定義" -#: ops/models/job.py:91 +#: ops/models/job.py:98 msgid "Job" msgstr "ジョブ#ジョブ#" -#: ops/models/job.py:101 +#: ops/models/job.py:108 msgid "Parameters" msgstr "パラメータ" +#: ops/models/job.py:116 +msgid "Material" +msgstr "" + +#: ops/models/job.py:118 +msgid "Material Type" +msgstr "" + #: ops/models/job.py:311 msgid "Job Execution" msgstr "ジョブ実行" @@ -3412,36 +3479,31 @@ msgstr "終了しました" msgid "Time cost" msgstr "時を過ごす" -#: ops/signal_handlers.py:74 terminal/models/applet/host.py:111 -#: terminal/models/component/task.py:24 -msgid "Task" -msgstr "タスク" - #: ops/tasks.py:27 msgid "Run ansible task" msgstr "Ansible タスクを実行する" -#: ops/tasks.py:43 +#: ops/tasks.py:44 msgid "Run ansible task execution" msgstr "Ansible タスクの実行を開始する" -#: ops/tasks.py:57 +#: ops/tasks.py:58 msgid "Periodic clear celery tasks" msgstr "定期的にCeleryタスクをクリア" -#: ops/tasks.py:59 +#: ops/tasks.py:60 msgid "Clean celery log period" msgstr "きれいなセロリログ期間" -#: ops/tasks.py:76 +#: ops/tasks.py:77 msgid "Clear celery periodic tasks" msgstr "タスクログを定期的にクリアする" -#: ops/tasks.py:99 +#: ops/tasks.py:100 msgid "Create or update periodic tasks" msgstr "定期的なタスクの作成または更新" -#: ops/tasks.py:107 +#: ops/tasks.py:108 msgid "Periodic check service performance" msgstr "サービスのパフォーマンスを定期的に確認する" @@ -3505,7 +3567,7 @@ msgid "App organizations" msgstr "アプリ組織" #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:84 -#: rbac/const.py:7 rbac/models/rolebinding.py:48 +#: rbac/const.py:7 rbac/models/rolebinding.py:56 #: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:63 #: tickets/models/ticket/general.py:302 tickets/serializers/ticket/ticket.py:60 msgid "Organization" @@ -3515,7 +3577,7 @@ msgstr "組織" msgid "Org name" msgstr "組織名" -#: orgs/models.py:70 rbac/models/role.py:36 terminal/models/applet/applet.py:30 +#: orgs/models.py:70 rbac/models/role.py:36 terminal/models/applet/applet.py:32 msgid "Builtin" msgstr "ビルトイン" @@ -3563,13 +3625,6 @@ msgstr "転送" msgid "Clipboard" msgstr "クリップボード" -#: perms/models/asset_permission.py:71 perms/serializers/permission.py:29 -#: perms/serializers/permission.py:60 -#: tickets/models/ticket/apply_application.py:28 -#: tickets/models/ticket/apply_asset.py:18 -msgid "Actions" -msgstr "アクション" - #: perms/models/asset_permission.py:83 msgid "Asset permission" msgstr "資産権限" @@ -3651,15 +3706,15 @@ msgstr "" msgid "If you have any question, please contact the administrator" msgstr "質問があったら、管理者に連絡して下さい" -#: rbac/api/role.py:34 +#: rbac/api/role.py:35 msgid "Internal role, can't be destroy" msgstr "内部の役割は、破壊することはできません" -#: rbac/api/role.py:38 +#: rbac/api/role.py:40 msgid "The role has been bound to users, can't be destroy" msgstr "ロールはユーザーにバインドされており、破壊することはできません" -#: rbac/api/role.py:60 +#: rbac/api/role.py:80 msgid "Internal role, can't be update" msgstr "内部ロール、更新できません" @@ -3723,13 +3778,13 @@ msgstr "ファイルマネージャを表示できます" msgid "Permissions" msgstr "権限" -#: rbac/models/role.py:31 rbac/models/rolebinding.py:38 +#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 #: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:36 msgid "Scope" msgstr "スコープ" -#: rbac/models/role.py:46 rbac/models/rolebinding.py:44 -#: users/models/user.py:685 +#: rbac/models/role.py:46 rbac/models/rolebinding.py:52 +#: users/models/user.py:727 msgid "Role" msgstr "ロール" @@ -3741,30 +3796,30 @@ msgstr "システムの役割" msgid "Organization role" msgstr "組織の役割" -#: rbac/models/rolebinding.py:53 +#: rbac/models/rolebinding.py:61 msgid "Role binding" msgstr "ロールバインディング" -#: rbac/models/rolebinding.py:137 +#: rbac/models/rolebinding.py:145 msgid "All organizations" msgstr "全ての組織" -#: rbac/models/rolebinding.py:166 +#: rbac/models/rolebinding.py:174 msgid "" "User last role in org, can not be delete, you can remove user from org " "instead" msgstr "" "ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" -#: rbac/models/rolebinding.py:173 +#: rbac/models/rolebinding.py:181 msgid "Organization role binding" msgstr "組織の役割バインディング" -#: rbac/models/rolebinding.py:188 +#: rbac/models/rolebinding.py:196 msgid "System role binding" msgstr "システムロールバインディング" -#: rbac/serializers/permission.py:26 users/serializers/profile.py:132 +#: rbac/serializers/permission.py:26 users/serializers/profile.py:130 msgid "Perms" msgstr "パーマ" @@ -3772,7 +3827,7 @@ msgstr "パーマ" msgid "Users amount" msgstr "ユーザー数" -#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:25 +#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:27 msgid "Display name" msgstr "表示名" @@ -3820,10 +3875,6 @@ msgstr "クラウドインポート" msgid "Backup account" msgstr "バックアップアカウント" -#: rbac/tree.py:50 -msgid "Gather account" -msgstr "アカウントを集める" - #: rbac/tree.py:52 msgid "Asset change auth" msgstr "資産の改ざん" @@ -3840,8 +3891,8 @@ msgstr "タスクセンター" msgid "My assets" msgstr "私の資産" -#: rbac/tree.py:57 terminal/models/applet/applet.py:40 -#: terminal/models/applet/applet.py:142 terminal/models/applet/host.py:27 +#: rbac/tree.py:57 terminal/models/applet/applet.py:42 +#: terminal/models/applet/applet.py:147 terminal/models/applet/host.py:27 msgid "Applet" msgstr "リモートアプリケーション" @@ -4340,7 +4391,7 @@ msgid "SSO auth key TTL" msgstr "Token有効期間" #: settings/serializers/auth/sso.py:17 settings/serializers/security.py:117 -#: xpack/plugins/cloud/serializers/account_attrs.py:176 +#: xpack/plugins/cloud/serializers/account_attrs.py:179 msgid "Unit: second" msgstr "単位: 秒" @@ -4410,7 +4461,7 @@ msgstr "ログインログは日数を保持します" #: settings/serializers/cleaning.py:12 settings/serializers/cleaning.py:16 #: settings/serializers/cleaning.py:20 settings/serializers/cleaning.py:24 -#: settings/serializers/cleaning.py:28 +#: settings/serializers/cleaning.py:28 settings/serializers/cleaning.py:36 msgid "Unit: day" msgstr "単位: 日" @@ -4442,6 +4493,12 @@ msgstr "" "単位:日。セッション、録画、コマンドレコードがそれを超えると削除されます(デー" "タベースストレージにのみ影響します。ossなどは影響しません」影響を受ける)" +#: settings/serializers/cleaning.py:36 +#, fuzzy +#| msgid "Login log keep days" +msgid "Activity log keep days" +msgstr "ログインログは日数を保持します" + #: settings/serializers/email.py:21 msgid "SMTP host" msgstr "SMTPホスト" @@ -5244,7 +5301,7 @@ msgstr "オフラインビデオプレーヤー" msgid "Invalid zip file" msgstr "zip ファイルが無効です" -#: terminal/api/component/endpoint.py:31 +#: terminal/api/component/endpoint.py:32 msgid "Not found protocol query params" msgstr "プロトコルクエリパラメータが見つかりません" @@ -5362,23 +5419,23 @@ msgstr "一括作成非サポート" msgid "Storage is invalid" msgstr "ストレージが無効です" -#: terminal/models/applet/applet.py:27 +#: terminal/models/applet/applet.py:29 msgid "Author" msgstr "著者" -#: terminal/models/applet/applet.py:32 +#: terminal/models/applet/applet.py:34 msgid "Tags" msgstr "ラベル" -#: terminal/models/applet/applet.py:36 terminal/serializers/storage.py:157 +#: terminal/models/applet/applet.py:38 terminal/serializers/storage.py:157 msgid "Hosts" msgstr "ホスト" -#: terminal/models/applet/applet.py:81 +#: terminal/models/applet/applet.py:83 msgid "Applet pkg not valid, Missing file {}" msgstr "無効なアプレット パッケージ、ファイル {} がありません" -#: terminal/models/applet/applet.py:144 terminal/models/applet/host.py:33 +#: terminal/models/applet/applet.py:149 terminal/models/applet/host.py:33 #: terminal/models/applet/host.py:105 msgid "Hosting" msgstr "ホスト マシン" @@ -5537,23 +5594,23 @@ msgstr "リプレイ" msgid "Date end" msgstr "終了日" -#: terminal/models/session/session.py:237 +#: terminal/models/session/session.py:234 msgid "Session record" msgstr "セッション記録" -#: terminal/models/session/session.py:239 +#: terminal/models/session/session.py:236 msgid "Can monitor session" msgstr "セッションを監視できます" -#: terminal/models/session/session.py:240 +#: terminal/models/session/session.py:237 msgid "Can share session" msgstr "セッションを共有できます" -#: terminal/models/session/session.py:241 +#: terminal/models/session/session.py:238 msgid "Can terminate session" msgstr "セッションを終了できます" -#: terminal/models/session/session.py:242 +#: terminal/models/session/session.py:239 msgid "Can validate session action perm" msgstr "セッションアクションのパーマを検証できます" @@ -5754,7 +5811,7 @@ msgstr "アクセスキー" msgid "Access key secret" msgstr "アクセスキーシークレット" -#: terminal/serializers/storage.py:65 xpack/plugins/cloud/models.py:217 +#: terminal/serializers/storage.py:65 xpack/plugins/cloud/models.py:209 msgid "Region" msgstr "リージョン" @@ -6192,7 +6249,7 @@ msgstr "無効な承認アクション" msgid "This user is not authorized to approve this ticket" msgstr "このユーザーはこの作業指示を承認する権限がありません" -#: users/api/user.py:183 +#: users/api/user.py:178 msgid "Could not reset self otp, use profile reset instead" msgstr "自己otpをリセットできませんでした、代わりにプロファイルリセットを使用" @@ -6298,81 +6355,81 @@ msgstr "ここにid_rsa.pubを貼り付けます。" msgid "Public key should not be the same as your old one." msgstr "公開鍵は古いものと同じであってはなりません。" -#: users/forms/profile.py:159 users/serializers/profile.py:100 -#: users/serializers/profile.py:183 users/serializers/profile.py:210 +#: users/forms/profile.py:159 users/serializers/profile.py:99 +#: users/serializers/profile.py:181 users/serializers/profile.py:208 msgid "Not a valid ssh public key" msgstr "有効なssh公開鍵ではありません" -#: users/forms/profile.py:170 users/models/user.py:708 +#: users/forms/profile.py:170 users/models/user.py:750 msgid "Public key" msgstr "公開キー" -#: users/models/user.py:561 +#: users/models/user.py:603 msgid "Force enable" msgstr "強制有効" -#: users/models/user.py:687 users/serializers/user.py:161 +#: users/models/user.py:729 users/serializers/user.py:161 msgid "Is service account" msgstr "サービスアカウントです" -#: users/models/user.py:689 +#: users/models/user.py:731 msgid "Avatar" msgstr "アバター" -#: users/models/user.py:692 +#: users/models/user.py:734 msgid "Wechat" msgstr "微信" -#: users/models/user.py:695 +#: users/models/user.py:737 msgid "Phone" msgstr "電話" -#: users/models/user.py:701 +#: users/models/user.py:743 msgid "OTP secret key" msgstr "OTP 秘密" -#: users/models/user.py:705 +#: users/models/user.py:747 msgid "Private key" msgstr "ssh秘密鍵" -#: users/models/user.py:711 +#: users/models/user.py:753 msgid "Secret key" msgstr "秘密キー" -#: users/models/user.py:716 users/serializers/profile.py:149 +#: users/models/user.py:758 users/serializers/profile.py:147 #: users/serializers/user.py:158 msgid "Is first login" msgstr "最初のログインです" -#: users/models/user.py:730 +#: users/models/user.py:772 msgid "Date password last updated" msgstr "最終更新日パスワード" -#: users/models/user.py:733 +#: users/models/user.py:775 msgid "Need update password" msgstr "更新パスワードが必要" -#: users/models/user.py:902 +#: users/models/user.py:913 msgid "Can invite user" msgstr "ユーザーを招待できます" -#: users/models/user.py:903 +#: users/models/user.py:914 msgid "Can remove user" msgstr "ユーザーを削除できます" -#: users/models/user.py:904 +#: users/models/user.py:915 msgid "Can match user" msgstr "ユーザーに一致できます" -#: users/models/user.py:913 +#: users/models/user.py:924 msgid "Administrator" msgstr "管理者" -#: users/models/user.py:916 +#: users/models/user.py:927 msgid "Administrator is the super user of system" msgstr "管理者はシステムのスーパーユーザーです" -#: users/models/user.py:941 +#: users/models/user.py:952 msgid "User password history" msgstr "ユーザーパスワード履歴" @@ -6407,19 +6464,19 @@ msgstr "SSHキーのリセット" msgid "Reset MFA" msgstr "MFAのリセット" -#: users/serializers/profile.py:30 +#: users/serializers/profile.py:29 msgid "The old password is incorrect" msgstr "古いパスワードが正しくありません" -#: users/serializers/profile.py:37 users/serializers/profile.py:197 +#: users/serializers/profile.py:36 users/serializers/profile.py:195 msgid "Password does not match security rules" msgstr "パスワードがセキュリティルールと一致しない" -#: users/serializers/profile.py:41 +#: users/serializers/profile.py:40 msgid "The new password cannot be the last {} passwords" msgstr "新しいパスワードを最後の {} 個のパスワードにすることはできません" -#: users/serializers/profile.py:49 users/serializers/profile.py:71 +#: users/serializers/profile.py:48 users/serializers/profile.py:70 msgid "The newly set password is inconsistent" msgstr "新しく設定されたパスワードが一致しない" @@ -6897,55 +6954,47 @@ msgstr "リージョン" msgid "Hostname strategy" msgstr "ホスト名戦略" -#: xpack/plugins/cloud/models.py:100 -msgid "Unix admin user" -msgstr "Unix adminユーザー" - -#: xpack/plugins/cloud/models.py:104 -msgid "Windows admin user" -msgstr "Windows管理者" - -#: xpack/plugins/cloud/models.py:110 xpack/plugins/cloud/serializers/task.py:41 +#: xpack/plugins/cloud/models.py:102 xpack/plugins/cloud/serializers/task.py:40 msgid "IP network segment group" msgstr "IPネットワークセグメントグループ" -#: xpack/plugins/cloud/models.py:113 xpack/plugins/cloud/serializers/task.py:46 +#: xpack/plugins/cloud/models.py:105 xpack/plugins/cloud/serializers/task.py:45 msgid "Sync IP type" msgstr "同期IPタイプ" -#: xpack/plugins/cloud/models.py:116 xpack/plugins/cloud/serializers/task.py:64 +#: xpack/plugins/cloud/models.py:108 xpack/plugins/cloud/serializers/task.py:62 msgid "Always update" msgstr "常に更新" -#: xpack/plugins/cloud/models.py:122 +#: xpack/plugins/cloud/models.py:114 msgid "Date last sync" msgstr "最終同期日" -#: xpack/plugins/cloud/models.py:127 xpack/plugins/cloud/models.py:168 +#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/models.py:160 msgid "Sync instance task" msgstr "インスタンスの同期タスク" -#: xpack/plugins/cloud/models.py:179 xpack/plugins/cloud/models.py:227 +#: xpack/plugins/cloud/models.py:171 xpack/plugins/cloud/models.py:219 msgid "Date sync" msgstr "日付の同期" -#: xpack/plugins/cloud/models.py:183 +#: xpack/plugins/cloud/models.py:175 msgid "Sync instance task execution" msgstr "インスタンスタスクの同期実行" -#: xpack/plugins/cloud/models.py:207 +#: xpack/plugins/cloud/models.py:199 msgid "Sync task" msgstr "同期タスク" -#: xpack/plugins/cloud/models.py:211 +#: xpack/plugins/cloud/models.py:203 msgid "Sync instance task history" msgstr "インスタンスタスク履歴の同期" -#: xpack/plugins/cloud/models.py:214 +#: xpack/plugins/cloud/models.py:206 msgid "Instance" msgstr "インスタンス" -#: xpack/plugins/cloud/models.py:231 +#: xpack/plugins/cloud/models.py:223 msgid "Sync instance detail" msgstr "同期インスタンスの詳細" @@ -7159,52 +7208,52 @@ msgstr "テナントID" msgid "Subscription ID" msgstr "サブスクリプションID" -#: xpack/plugins/cloud/serializers/account_attrs.py:95 -#: xpack/plugins/cloud/serializers/account_attrs.py:100 -#: xpack/plugins/cloud/serializers/account_attrs.py:116 -#: xpack/plugins/cloud/serializers/account_attrs.py:141 +#: xpack/plugins/cloud/serializers/account_attrs.py:98 +#: xpack/plugins/cloud/serializers/account_attrs.py:103 +#: xpack/plugins/cloud/serializers/account_attrs.py:119 +#: xpack/plugins/cloud/serializers/account_attrs.py:144 msgid "API Endpoint" msgstr "APIエンドポイント" -#: xpack/plugins/cloud/serializers/account_attrs.py:106 +#: xpack/plugins/cloud/serializers/account_attrs.py:109 msgid "Auth url" msgstr "認証アドレス" -#: xpack/plugins/cloud/serializers/account_attrs.py:107 +#: xpack/plugins/cloud/serializers/account_attrs.py:110 msgid "eg: http://openstack.example.com:5000/v3" msgstr "例えば: http://openstack.example.com:5000/v3" -#: xpack/plugins/cloud/serializers/account_attrs.py:110 +#: xpack/plugins/cloud/serializers/account_attrs.py:113 msgid "User domain" msgstr "ユーザードメイン" -#: xpack/plugins/cloud/serializers/account_attrs.py:117 +#: xpack/plugins/cloud/serializers/account_attrs.py:120 msgid "Cert File" msgstr "証明書ファイル" -#: xpack/plugins/cloud/serializers/account_attrs.py:118 +#: xpack/plugins/cloud/serializers/account_attrs.py:121 msgid "Key File" msgstr "キーファイル" -#: xpack/plugins/cloud/serializers/account_attrs.py:134 +#: xpack/plugins/cloud/serializers/account_attrs.py:137 msgid "Service account key" msgstr "サービスアカウントキー" -#: xpack/plugins/cloud/serializers/account_attrs.py:135 +#: xpack/plugins/cloud/serializers/account_attrs.py:138 msgid "The file is in JSON format" msgstr "ファイルはJSON形式です。" -#: xpack/plugins/cloud/serializers/account_attrs.py:148 +#: xpack/plugins/cloud/serializers/account_attrs.py:151 msgid "IP address invalid `{}`, {}" msgstr "IPアドレスが無効: '{}', {}" -#: xpack/plugins/cloud/serializers/account_attrs.py:154 +#: xpack/plugins/cloud/serializers/account_attrs.py:157 msgid "" "Format for comma-delimited string,Such as: 192.168.1.0/24, " "10.0.0.0-10.0.0.255" msgstr "形式はコンマ区切りの文字列です,例:192.168.1.0/24,10.0.0.0-10.0.0.255" -#: xpack/plugins/cloud/serializers/account_attrs.py:158 +#: xpack/plugins/cloud/serializers/account_attrs.py:161 msgid "" "The port is used to detect the validity of the IP address. When the " "synchronization task is executed, only the valid IP address will be " @@ -7214,19 +7263,19 @@ msgstr "" "実行されると、有効な IP アドレスのみが同期されます。
ポートが0の場合、す" "べてのIPアドレスが有効です。" -#: xpack/plugins/cloud/serializers/account_attrs.py:166 +#: xpack/plugins/cloud/serializers/account_attrs.py:169 msgid "Hostname prefix" msgstr "ホスト名プレフィックス" -#: xpack/plugins/cloud/serializers/account_attrs.py:169 +#: xpack/plugins/cloud/serializers/account_attrs.py:172 msgid "IP segment" msgstr "IP セグメント" -#: xpack/plugins/cloud/serializers/account_attrs.py:173 +#: xpack/plugins/cloud/serializers/account_attrs.py:176 msgid "Test port" msgstr "テストポート" -#: xpack/plugins/cloud/serializers/account_attrs.py:176 +#: xpack/plugins/cloud/serializers/account_attrs.py:179 msgid "Test timeout" msgstr "テストタイムアウト" @@ -7252,10 +7301,6 @@ msgstr "実行回数" msgid "Instance count" msgstr "インスタンス数" -#: xpack/plugins/cloud/serializers/task.py:63 -msgid "Linux admin user" -msgstr "Linux管理者" - #: xpack/plugins/cloud/utils.py:69 msgid "Account unavailable" msgstr "利用できないアカウント" @@ -7323,3 +7368,30 @@ msgstr "究極のエディション" #: xpack/plugins/license/models.py:85 msgid "Community edition" msgstr "コミュニティ版" + +#~ msgid "Update some assets hardware info. " +#~ msgstr "一部の資産ハードウェア情報を更新します。" + +#~ msgid "Manually update the hardware information of assets" +#~ msgstr "アセット情報を手動で更新する" + +#~ msgid "Manually update the hardware information of assets under a node" +#~ msgstr "ノードの下の資産情報を手動で更新する" + +#~ msgid "Manually test the connectivity of a asset" +#~ msgstr "アセットの接続を手動でテストする" + +#~ msgid "Manually test the connectivity of assets under a node" +#~ msgstr "ノードの下のアセットの接続を手動でテストする" + +#~ msgid "User {} has executed change auth plan for this account.({})" +#~ msgstr "ユーザー {} はこのアカウントのために改密計画を実行しました。({})" + +#~ msgid "Unix admin user" +#~ msgstr "Unix adminユーザー" + +#~ msgid "Windows admin user" +#~ msgstr "Windows管理者" + +#~ msgid "Linux admin user" +#~ msgstr "Linux管理者" diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 08386beda..fc1bc66c3 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:1d3093d239e72a1ab35464fcdebd157330dbde7ae1cfd0f89a7d75c52eade900 -size 111883 +oid sha256:6a44c3375cf46c5740eb617e0ce1828a10ee82924cdd06075cc3c71d1d5075e9 +size 111193 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index e84e4b3ec..147f02f03 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: 2023-02-06 13:10+0800\n" +"POT-Creation-Date: 2023-02-13 15:27+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -23,7 +23,7 @@ msgstr "参数 'action' 必须是 [{}]" #: accounts/const/account.py:6 #: accounts/serializers/automations/change_secret.py:33 -#: assets/models/_user.py:24 audits/signal_handlers.py:50 +#: assets/models/_user.py:24 audits/signal_handlers/login_log.py:30 #: authentication/confirm/password.py:9 authentication/forms.py:32 #: authentication/templates/authentication/login.html:288 #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 @@ -61,7 +61,7 @@ msgstr "手动输入" msgid "Dynamic user" msgstr "同名账号" -#: accounts/const/account.py:19 users/models/user.py:631 +#: accounts/const/account.py:19 users/models/user.py:673 msgid "Local" msgstr "数据库" @@ -157,33 +157,35 @@ msgstr "创建并推送" msgid "Only create" msgstr "仅创建" -#: accounts/models/account.py:47 accounts/serializers/account/account.py:81 +#: accounts/models/account.py:47 accounts/models/gathered_account.py:14 +#: accounts/serializers/account/account.py:95 +#: accounts/serializers/account/gathered_account.py:10 #: accounts/serializers/automations/change_secret.py:107 #: accounts/serializers/automations/change_secret.py:127 #: acls/models/base.py:100 acls/serializers/base.py:56 #: assets/models/asset/common.py:97 assets/models/asset/common.py:282 #: assets/models/cmd_filter.py:36 assets/serializers/domain.py:19 -#: assets/serializers/label.py:27 audits/models.py:34 -#: authentication/models/connection_token.py:32 +#: assets/serializers/label.py:27 audits/models.py:36 +#: authentication/models/connection_token.py:33 #: perms/models/asset_permission.py:64 perms/serializers/permission.py:27 #: terminal/backends/command/models.py:21 terminal/models/session/session.py:31 #: terminal/notifications.py:95 terminal/serializers/command.py:16 -#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:220 +#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:212 msgid "Asset" msgstr "资产" -#: accounts/models/account.py:51 accounts/serializers/account/account.py:85 +#: accounts/models/account.py:51 accounts/serializers/account/account.py:99 #: authentication/serializers/connect_token_secret.py:50 msgid "Su from" msgstr "切换自" #: accounts/models/account.py:53 settings/serializers/auth/cas.py:20 -#: terminal/models/applet/applet.py:26 +#: terminal/models/applet/applet.py:28 msgid "Version" msgstr "版本" -#: accounts/models/account.py:55 accounts/serializers/account/account.py:82 -#: users/models/user.py:726 +#: accounts/models/account.py:55 accounts/serializers/account/account.py:96 +#: users/models/user.py:768 msgid "Source" msgstr "来源" @@ -191,8 +193,8 @@ msgstr "来源" #: accounts/serializers/automations/change_secret.py:108 #: accounts/serializers/automations/change_secret.py:128 #: acls/models/base.py:102 acls/serializers/base.py:57 -#: assets/serializers/asset/common.py:112 assets/serializers/gateway.py:30 -#: audits/models.py:35 ops/models/base.py:18 +#: assets/serializers/asset/common.py:120 assets/serializers/gateway.py:30 +#: audits/models.py:37 ops/models/base.py:18 #: terminal/backends/command/models.py:22 terminal/models/session/session.py:33 #: tickets/models/ticket/command_confirm.py:13 xpack/plugins/cloud/models.py:85 msgid "Account" @@ -239,8 +241,8 @@ msgid "Account backup plan" msgstr "账号备份计划" #: accounts/models/automations/backup_account.py:77 -#: assets/models/automations/base.py:106 audits/models.py:41 -#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:106 +#: assets/models/automations/base.py:106 audits/models.py:43 +#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:113 #: perms/models/asset_permission.py:72 terminal/models/applet/host.py:108 #: terminal/models/session/session.py:43 #: tickets/models/ticket/apply_application.py:30 @@ -266,8 +268,8 @@ msgstr "账号备份快照" msgid "Trigger mode" msgstr "触发模式" -#: accounts/models/automations/backup_account.py:91 audits/models.py:129 -#: terminal/models/session/sharing.py:107 xpack/plugins/cloud/models.py:176 +#: accounts/models/automations/backup_account.py:91 audits/models.py:158 +#: terminal/models/session/sharing.py:107 xpack/plugins/cloud/models.py:168 msgid "Reason" msgstr "原因" @@ -319,7 +321,7 @@ msgid "Can add push account execution" msgstr "创建推送账号执行" #: accounts/models/automations/change_secret.py:17 accounts/models/base.py:36 -#: accounts/serializers/account/account.py:118 +#: accounts/serializers/account/account.py:132 #: accounts/serializers/account/base.py:16 #: accounts/serializers/automations/change_secret.py:46 #: authentication/serializers/connect_token_secret.py:41 @@ -362,7 +364,7 @@ msgstr "开始日期" #: accounts/models/automations/change_secret.py:74 #: assets/models/automations/base.py:107 ops/models/base.py:56 -#: ops/models/celery.py:64 ops/models/job.py:107 +#: ops/models/celery.py:64 ops/models/job.py:114 #: terminal/models/applet/host.py:109 msgid "Date finished" msgstr "结束日期" @@ -386,20 +388,21 @@ msgid "Triggers" msgstr "触发方式" #: accounts/models/automations/push_account.py:14 accounts/models/base.py:34 -#: acls/serializers/base.py:18 acls/serializers/base.py:49 -#: assets/models/_user.py:23 audits/models.py:114 authentication/forms.py:25 -#: authentication/forms.py:27 authentication/models/temp_token.py:9 +#: accounts/models/gathered_account.py:15 acls/serializers/base.py:18 +#: acls/serializers/base.py:49 assets/models/_user.py:23 audits/models.py:143 +#: authentication/forms.py:25 authentication/forms.py:27 +#: authentication/models/temp_token.py:9 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: users/forms/profile.py:32 users/forms/profile.py:112 -#: users/models/user.py:673 users/templates/users/_msg_user_created.html:12 +#: users/models/user.py:715 users/templates/users/_msg_user_created.html:12 #: xpack/plugins/cloud/serializers/account_attrs.py:26 msgid "Username" msgstr "用户名" #: accounts/models/automations/push_account.py:15 acls/models/base.py:81 -#: acls/serializers/base.py:81 assets/models/cmd_filter.py:81 -#: audits/models.py:51 audits/serializers.py:82 +#: acls/serializers/base.py:81 acls/serializers/login_acl.py:25 +#: assets/models/cmd_filter.py:81 audits/models.py:53 audits/serializers.py:83 #: authentication/serializers/connect_token_secret.py:109 #: authentication/templates/authentication/_access_key_modal.html:34 msgid "Action" @@ -420,18 +423,18 @@ msgstr "账号验证" #: assets/models/cmd_filter.py:21 assets/models/domain.py:18 #: assets/models/group.py:20 assets/models/label.py:18 #: assets/models/platform.py:20 assets/models/platform.py:74 -#: assets/serializers/asset/common.py:61 assets/serializers/asset/common.py:129 -#: assets/serializers/platform.py:126 +#: assets/serializers/asset/common.py:63 assets/serializers/asset/common.py:137 +#: assets/serializers/platform.py:128 #: authentication/serializers/connect_token_secret.py:103 ops/mixin.py:20 #: ops/models/adhoc.py:22 ops/models/celery.py:15 ops/models/celery.py:57 #: ops/models/job.py:24 ops/models/playbook.py:15 orgs/models.py:69 #: perms/models/asset_permission.py:56 rbac/models/role.py:29 #: settings/models.py:33 settings/serializers/sms.py:6 -#: terminal/models/applet/applet.py:24 terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:26 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:90 #: terminal/models/component/storage.py:26 terminal/models/component/task.py:15 #: terminal/models/component/terminal.py:79 users/forms/profile.py:33 -#: users/models/group.py:13 users/models/user.py:675 +#: users/models/group.py:13 users/models/user.py:717 #: xpack/plugins/cloud/models.py:28 msgid "Name" msgstr "名称" @@ -444,10 +447,26 @@ msgstr "特权账号" #: assets/models/automations/base.py:21 assets/models/cmd_filter.py:39 #: assets/models/label.py:22 #: authentication/serializers/connect_token_secret.py:107 -#: terminal/models/applet/applet.py:29 users/serializers/user.py:159 +#: terminal/models/applet/applet.py:31 users/serializers/user.py:159 msgid "Is active" msgstr "激活" +#: accounts/models/gathered_account.py:12 +msgid "Present" +msgstr "存在" + +#: accounts/models/gathered_account.py:13 +msgid "Date last login" +msgstr "最后登录日期" + +#: accounts/models/gathered_account.py:16 +msgid "Address last login" +msgstr "首次登录地址" + +#: accounts/models/gathered_account.py:23 rbac/tree.py:50 +msgid "Gather account" +msgstr "收集账号" + #: accounts/notifications.py:8 msgid "Notification of account backup route task results" msgstr "账号备份任务结果通知" @@ -486,22 +505,50 @@ msgstr "" "{} - 改密任务已完成: 未设置加密密码 - 请前往个人信息 -> 文件加密密码中设置加" "密密码" -#: accounts/serializers/account/account.py:53 -#: assets/serializers/asset/common.py:59 settings/serializers/auth/sms.py:75 +#: accounts/serializers/account/account.py:65 +#: assets/serializers/asset/common.py:61 settings/serializers/auth/sms.py:75 msgid "Template" msgstr "模板" -#: accounts/serializers/account/account.py:56 -#: assets/serializers/asset/common.py:56 +#: accounts/serializers/account/account.py:68 +#: assets/serializers/asset/common.py:58 msgid "Push now" msgstr "立即推送" -#: accounts/serializers/account/account.py:58 +#: accounts/serializers/account/account.py:70 #: accounts/serializers/account/base.py:64 msgid "Has secret" msgstr "已托管密码" -#: accounts/serializers/account/account.py:77 +#: accounts/serializers/account/account.py:75 applications/models.py:11 +#: assets/models/label.py:21 assets/models/platform.py:75 +#: assets/serializers/asset/common.py:116 assets/serializers/cagegory.py:8 +#: assets/serializers/platform.py:90 assets/serializers/platform.py:129 +#: perms/serializers/user_permission.py:25 settings/models.py:35 +#: tickets/models/ticket/apply_application.py:13 +msgid "Category" +msgstr "类别" + +#: accounts/serializers/account/account.py:76 +#: accounts/serializers/automations/base.py:43 acls/models/command_acl.py:24 +#: acls/serializers/command_acl.py:18 applications/models.py:14 +#: assets/models/_user.py:50 assets/models/automations/base.py:20 +#: assets/models/cmd_filter.py:74 assets/models/platform.py:76 +#: assets/serializers/asset/common.py:117 assets/serializers/platform.py:89 +#: audits/serializers.py:49 +#: authentication/serializers/connect_token_secret.py:116 ops/models/job.py:32 +#: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:30 +#: terminal/models/component/storage.py:57 +#: terminal/models/component/storage.py:146 terminal/serializers/applet.py:28 +#: terminal/serializers/session.py:26 terminal/serializers/storage.py:181 +#: tickets/models/comment.py:26 tickets/models/flow.py:56 +#: tickets/models/ticket/apply_application.py:16 +#: tickets/models/ticket/general.py:275 tickets/serializers/flow.py:53 +#: tickets/serializers/ticket/ticket.py:19 +msgid "Type" +msgstr "类型" + +#: accounts/serializers/account/account.py:91 msgid "Asset not found" msgstr "资产不存在" @@ -531,7 +578,7 @@ msgid "Key password" msgstr "密钥密码" #: accounts/serializers/account/base.py:80 -#: assets/serializers/asset/common.py:262 +#: assets/serializers/asset/common.py:280 msgid "Spec info" msgstr "特殊信息" @@ -556,24 +603,6 @@ msgstr "节点" msgid "Automation snapshot" msgstr "自动化快照" -#: accounts/serializers/automations/base.py:43 acls/models/command_acl.py:24 -#: acls/serializers/command_acl.py:18 applications/models.py:14 -#: assets/models/_user.py:50 assets/models/automations/base.py:20 -#: assets/models/cmd_filter.py:74 assets/models/platform.py:76 -#: assets/serializers/asset/common.py:109 assets/serializers/platform.py:87 -#: audits/serializers.py:48 -#: authentication/serializers/connect_token_secret.py:116 ops/models/job.py:32 -#: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:28 -#: terminal/models/component/storage.py:57 -#: terminal/models/component/storage.py:146 terminal/serializers/applet.py:28 -#: terminal/serializers/session.py:26 terminal/serializers/storage.py:181 -#: tickets/models/comment.py:26 tickets/models/flow.py:56 -#: tickets/models/ticket/apply_application.py:16 -#: tickets/models/ticket/general.py:275 tickets/serializers/flow.py:53 -#: tickets/serializers/ticket/ticket.py:19 -msgid "Type" -msgstr "类型" - #: accounts/serializers/automations/change_secret.py:43 msgid "SSH Key strategy" msgstr "SSH 密钥更改方式" @@ -591,16 +620,17 @@ msgstr "* 密码长度范围 6-30 位" msgid "Automation task execution" msgstr "自动化任务执行历史" -#: accounts/serializers/automations/change_secret.py:150 audits/const.py:45 -#: audits/handler.py:167 audits/models.py:40 common/const/choices.py:18 -#: ops/const.py:56 ops/serializers/celery.py:39 terminal/const.py:59 -#: terminal/models/session/sharing.py:103 tickets/views/approve.py:114 +#: accounts/serializers/automations/change_secret.py:150 audits/const.py:52 +#: audits/models.py:42 audits/signal_handlers/activity_log.py:120 +#: common/const/choices.py:18 ops/const.py:56 ops/serializers/celery.py:39 +#: terminal/const.py:59 terminal/models/session/sharing.py:103 +#: tickets/views/approve.py:114 msgid "Success" msgstr "成功" -#: accounts/serializers/automations/change_secret.py:151 audits/const.py:46 -#: audits/handler.py:167 common/const/choices.py:19 ops/const.py:58 -#: terminal/const.py:60 xpack/plugins/cloud/const.py:41 +#: accounts/serializers/automations/change_secret.py:151 audits/const.py:53 +#: audits/signal_handlers/activity_log.py:120 common/const/choices.py:19 +#: ops/const.py:58 terminal/const.py:60 xpack/plugins/cloud/const.py:41 msgid "Failed" msgstr "失败" @@ -628,19 +658,19 @@ msgstr "验证资产账号可用性" msgid "Verify accounts connectivity" msgstr "测试账号可连接性" -#: accounts/utils.py:42 +#: accounts/utils.py:43 msgid "Password can not contains `{{` " msgstr "密码不能包含 `{{` 字符" -#: accounts/utils.py:45 +#: accounts/utils.py:46 msgid "Password can not contains `'` " msgstr "密码不能包含 `'` 字符" -#: accounts/utils.py:47 +#: accounts/utils.py:48 msgid "Password can not contains `\"` " msgstr "密码不能包含 `\"` 字符" -#: accounts/utils.py:53 +#: accounts/utils.py:54 msgid "private key invalid or passphrase error" msgstr "密钥不合法或密钥密码错误" @@ -678,7 +708,7 @@ msgid "Reviewers" msgstr "审批人" #: acls/models/base.py:83 authentication/models/access_key.py:17 -#: authentication/models/connection_token.py:47 +#: authentication/models/connection_token.py:48 #: authentication/templates/authentication/_access_key_modal.html:32 #: perms/models/asset_permission.py:76 terminal/models/session/sharing.py:27 #: tickets/const.py:37 @@ -687,18 +717,18 @@ msgstr "激活中" #: acls/models/base.py:98 acls/models/login_acl.py:13 #: acls/serializers/base.py:55 acls/serializers/login_acl.py:21 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:30 -#: audits/models.py:49 audits/models.py:98 -#: authentication/models/connection_token.py:28 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:32 +#: audits/models.py:51 audits/models.py:127 +#: authentication/models/connection_token.py:29 #: authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:58 #: perms/serializers/permission.py:23 rbac/builtin.py:119 -#: rbac/models/rolebinding.py:41 terminal/backends/command/models.py:20 +#: rbac/models/rolebinding.py:49 terminal/backends/command/models.py:20 #: terminal/models/session/session.py:29 terminal/models/session/sharing.py:32 #: terminal/notifications.py:96 terminal/notifications.py:144 #: terminal/serializers/command.py:15 tickets/models/comment.py:21 -#: users/const.py:14 users/models/user.py:900 users/models/user.py:931 +#: users/const.py:14 users/models/user.py:911 users/models/user.py:942 #: users/serializers/group.py:19 msgid "User" msgstr "用户" @@ -829,7 +859,7 @@ msgstr "" "格式为逗号分隔的字符串, * 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64" -#: acls/serializers/rules/rules.py:33 assets/models/asset/common.py:108 +#: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 @@ -845,14 +875,6 @@ msgstr "时段" msgid "Applications" msgstr "应用管理" -#: applications/models.py:11 assets/models/label.py:21 -#: assets/models/platform.py:75 assets/serializers/asset/common.py:108 -#: assets/serializers/cagegory.py:8 assets/serializers/platform.py:88 -#: assets/serializers/platform.py:127 perms/serializers/user_permission.py:25 -#: settings/models.py:35 tickets/models/ticket/apply_application.py:13 -msgid "Category" -msgstr "类别" - #: applications/models.py:16 xpack/plugins/cloud/models.py:33 #: xpack/plugins/cloud/serializers/account.py:62 msgid "Attrs" @@ -879,7 +901,7 @@ msgid "" "different ports" msgstr "默认端口为9000, HTTP接口和本机接口使用不同的端口" -#: assets/api/asset/asset.py:115 +#: assets/api/asset/asset.py:136 msgid "Cannot create asset directly, you should create a host or other" msgstr "不能直接创建资产, 你应该创建主机或其他资产" @@ -903,12 +925,12 @@ msgstr "删除失败,节点包含资产" msgid "App assets" msgstr "资产管理" -#: assets/automations/base/manager.py:103 +#: assets/automations/base/manager.py:104 msgid "{} disabled" msgstr "{} 已禁用" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:113 +#: authentication/models/connection_token.py:114 msgid "No account" msgstr "没有账号" @@ -918,7 +940,7 @@ msgid "Unable to connect to port {port} on {address}" msgstr "无法连接到 {port} 上的端口 {address}" #: assets/automations/ping_gateway/manager.py:58 -#: authentication/middleware.py:76 xpack/plugins/cloud/providers/fc.py:48 +#: authentication/middleware.py:87 xpack/plugins/cloud/providers/fc.py:48 msgid "Authentication failed" msgstr "认证失败" @@ -928,8 +950,8 @@ msgid "Connect failed" msgstr "连接失败" #: assets/const/automation.py:6 audits/const.py:6 audits/const.py:35 -#: common/utils/ip/geoip/utils.py:31 common/utils/ip/geoip/utils.py:37 -#: common/utils/ip/utils.py:84 +#: audits/signal_handlers/activity_log.py:91 common/utils/ip/geoip/utils.py:31 +#: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:84 msgid "Unknown" msgstr "未知" @@ -960,7 +982,7 @@ msgid "Device" msgstr "网络设备" #: assets/const/category.py:13 assets/models/asset/database.py:9 -#: assets/models/asset/database.py:24 assets/serializers/asset/common.py:96 +#: assets/models/asset/database.py:24 assets/serializers/asset/common.py:104 msgid "Database" msgstr "数据库" @@ -969,11 +991,11 @@ msgid "Cloud service" msgstr "云服务" #: assets/const/category.py:15 audits/const.py:33 -#: terminal/models/applet/applet.py:22 +#: terminal/models/applet/applet.py:24 msgid "Web" msgstr "Web" -#: assets/const/device.py:7 terminal/models/applet/applet.py:21 +#: assets/const/device.py:7 terminal/models/applet/applet.py:23 #: tickets/const.py:8 msgid "General" msgstr "一般" @@ -994,10 +1016,25 @@ msgstr "防火墙" msgid "All types" msgstr "所有类型" -#: assets/const/web.py:7 +#: assets/const/web.py:8 msgid "Website" msgstr "网站" +#: assets/const/web.py:59 audits/const.py:46 +#: terminal/serializers/applet_host.py:28 +msgid "Disabled" +msgstr "禁用" + +#: assets/const/web.py:60 settings/serializers/auth/base.py:10 +#: settings/serializers/basic.py:27 +msgid "Basic" +msgstr "基本" + +#: assets/const/web.py:61 assets/models/asset/web.py:13 +#: assets/serializers/asset/common.py:112 assets/serializers/platform.py:39 +msgid "Script" +msgstr "脚本" + #: assets/models/_user.py:25 msgid "SSH private key" msgstr "SSH密钥" @@ -1010,31 +1047,31 @@ msgstr "SSH公钥" #: assets/models/cmd_filter.py:88 assets/models/group.py:23 #: assets/models/platform.py:79 common/db/models.py:37 ops/models/adhoc.py:28 #: ops/models/job.py:40 ops/models/playbook.py:18 rbac/models/role.py:37 -#: settings/models.py:38 terminal/models/applet/applet.py:33 -#: terminal/models/applet/applet.py:146 terminal/models/applet/host.py:110 +#: settings/models.py:38 terminal/models/applet/applet.py:35 +#: terminal/models/applet/applet.py:151 terminal/models/applet/host.py:110 #: terminal/models/component/endpoint.py:24 #: terminal/models/component/endpoint.py:100 #: terminal/models/session/session.py:45 tickets/models/comment.py:32 -#: tickets/models/ticket/general.py:297 users/models/user.py:714 -#: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:119 +#: tickets/models/ticket/general.py:297 users/models/user.py:756 +#: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:111 msgid "Comment" msgstr "备注" #: assets/models/_user.py:28 assets/models/automations/base.py:105 #: assets/models/cmd_filter.py:41 assets/models/group.py:22 -#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:105 -#: users/models/user.py:932 +#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:112 +#: users/models/user.py:943 msgid "Date created" msgstr "创建日期" #: assets/models/_user.py:29 assets/models/cmd_filter.py:42 -#: common/db/models.py:36 users/models/user.py:735 +#: common/db/models.py:36 users/models/user.py:777 msgid "Date updated" msgstr "更新日期" #: assets/models/_user.py:30 assets/models/cmd_filter.py:44 #: assets/models/cmd_filter.py:91 assets/models/group.py:21 -#: common/db/models.py:33 users/models/user.py:721 +#: common/db/models.py:33 users/models/user.py:763 #: users/serializers/group.py:33 msgid "Created by" msgstr "创建者" @@ -1059,9 +1096,9 @@ msgstr "特权用户" msgid "Username same with user" msgstr "用户名与用户相同" -#: assets/models/_user.py:52 authentication/models/connection_token.py:37 +#: assets/models/_user.py:52 authentication/models/connection_token.py:38 #: authentication/serializers/connect_token_secret.py:104 -#: terminal/models/applet/applet.py:31 terminal/serializers/session.py:24 +#: terminal/models/applet/applet.py:33 terminal/serializers/session.py:24 #: terminal/serializers/session.py:45 terminal/serializers/storage.py:68 msgid "Protocol" msgstr "协议" @@ -1110,10 +1147,14 @@ msgstr "系统用户" msgid "Can match system user" msgstr "可以匹配系统用户" +#: assets/models/asset/common.py:108 assets/serializers/asset/common.py:138 +msgid "Address" +msgstr "地址" + #: assets/models/asset/common.py:109 assets/models/platform.py:111 #: authentication/serializers/connect_token_secret.py:108 #: perms/serializers/user_permission.py:23 -#: xpack/plugins/cloud/serializers/account_attrs.py:179 +#: xpack/plugins/cloud/serializers/account_attrs.py:182 msgid "Platform" msgstr "系统平台" @@ -1155,7 +1196,7 @@ msgstr "添加资产到节点" msgid "Move asset to node" msgstr "移动资产到节点" -#: assets/models/asset/database.py:10 assets/serializers/asset/common.py:97 +#: assets/models/asset/database.py:10 assets/serializers/asset/common.py:105 #: settings/serializers/email.py:37 msgid "Use SSL" msgstr "使用 SSL" @@ -1172,46 +1213,31 @@ msgstr "客户端证书" msgid "Client key" msgstr "客户端密钥" -#: assets/models/asset/database.py:14 assets/serializers/asset/common.py:98 +#: assets/models/asset/database.py:14 assets/serializers/asset/common.py:106 msgid "Allow invalid cert" msgstr "忽略证书校验" -#: assets/models/asset/web.py:9 audits/const.py:39 -#: terminal/serializers/applet_host.py:28 -msgid "Disabled" -msgstr "禁用" - -#: assets/models/asset/web.py:10 settings/serializers/auth/base.py:10 -#: settings/serializers/basic.py:27 -msgid "Basic" -msgstr "基本" - -#: assets/models/asset/web.py:11 assets/models/asset/web.py:17 -#: assets/serializers/asset/common.py:104 -msgid "Script" -msgstr "脚本" - -#: assets/models/asset/web.py:13 assets/serializers/platform.py:28 +#: assets/models/asset/web.py:9 assets/serializers/platform.py:29 msgid "Autofill" msgstr "自动代填" -#: assets/models/asset/web.py:14 assets/serializers/asset/common.py:101 -#: assets/serializers/platform.py:30 +#: assets/models/asset/web.py:10 assets/serializers/asset/common.py:109 +#: assets/serializers/platform.py:31 msgid "Username selector" msgstr "用户名选择器" -#: assets/models/asset/web.py:15 assets/serializers/asset/common.py:102 -#: assets/serializers/platform.py:33 +#: assets/models/asset/web.py:11 assets/serializers/asset/common.py:110 +#: assets/serializers/platform.py:34 msgid "Password selector" msgstr "密码选择器" -#: assets/models/asset/web.py:16 assets/serializers/asset/common.py:103 -#: assets/serializers/platform.py:36 +#: assets/models/asset/web.py:12 assets/serializers/asset/common.py:111 +#: assets/serializers/platform.py:37 msgid "Submit selector" msgstr "确认按钮选择器" #: assets/models/automations/base.py:17 assets/models/cmd_filter.py:38 -#: assets/serializers/asset/common.py:261 perms/models/asset_permission.py:70 +#: assets/serializers/asset/common.py:279 perms/models/asset_permission.py:70 #: perms/serializers/permission.py:32 rbac/tree.py:36 msgid "Accounts" msgstr "账号管理" @@ -1224,14 +1250,14 @@ msgstr "自动化任务" msgid "Asset automation task" msgstr "资产自动化任务" -#: assets/models/automations/base.py:104 audits/models.py:134 -#: audits/serializers.py:49 ops/models/base.py:49 ops/models/job.py:98 -#: terminal/models/applet/applet.py:145 terminal/models/applet/host.py:107 +#: assets/models/automations/base.py:104 audits/models.py:163 +#: audits/serializers.py:50 ops/models/base.py:49 ops/models/job.py:105 +#: terminal/models/applet/applet.py:150 terminal/models/applet/host.py:107 #: terminal/models/component/status.py:27 terminal/serializers/applet.py:17 #: terminal/serializers/applet_host.py:93 tickets/models/ticket/general.py:283 #: tickets/serializers/super_ticket.py:13 -#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:172 -#: xpack/plugins/cloud/models.py:224 +#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:164 +#: xpack/plugins/cloud/models.py:216 msgid "Status" msgstr "状态" @@ -1253,7 +1279,7 @@ msgstr "校验日期" #: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:61 #: perms/serializers/permission.py:25 users/models/group.py:25 -#: users/models/user.py:681 +#: users/models/user.py:723 msgid "User group" msgstr "用户组" @@ -1302,19 +1328,19 @@ msgstr "默认" msgid "Default asset group" msgstr "默认资产组" -#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:917 +#: assets/models/label.py:15 rbac/const.py:6 users/models/user.py:928 msgid "System" msgstr "系统" -#: assets/models/label.py:19 assets/models/node.py:558 +#: assets/models/label.py:19 assets/models/node.py:544 #: assets/serializers/cagegory.py:7 assets/serializers/cagegory.py:14 -#: authentication/models/connection_token.py:25 +#: authentication/models/connection_token.py:26 #: authentication/serializers/connect_token_secret.py:115 #: common/serializers/common.py:80 settings/models.py:34 msgid "Value" msgstr "值" -#: assets/models/label.py:40 assets/serializers/asset/common.py:110 +#: assets/models/label.py:40 assets/serializers/asset/common.py:118 #: assets/serializers/cagegory.py:6 assets/serializers/cagegory.py:13 #: authentication/serializers/connect_token_secret.py:114 #: common/serializers/common.py:79 settings/serializers/sms.py:7 @@ -1325,28 +1351,28 @@ msgstr "标签" msgid "New node" msgstr "新节点" -#: assets/models/node.py:486 audits/backends/db.py:55 audits/backends/db.py:56 +#: assets/models/node.py:472 audits/backends/db.py:55 audits/backends/db.py:56 msgid "empty" msgstr "空" -#: assets/models/node.py:557 perms/models/perm_node.py:28 +#: assets/models/node.py:543 perms/models/perm_node.py:28 msgid "Key" msgstr "键" -#: assets/models/node.py:559 assets/serializers/node.py:20 +#: assets/models/node.py:545 assets/serializers/node.py:20 msgid "Full value" msgstr "全称" -#: assets/models/node.py:563 perms/models/perm_node.py:30 +#: assets/models/node.py:549 perms/models/perm_node.py:30 msgid "Parent key" msgstr "ssh私钥" -#: assets/models/node.py:572 perms/serializers/permission.py:28 +#: assets/models/node.py:558 perms/serializers/permission.py:28 #: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:96 msgid "Node" msgstr "节点" -#: assets/models/node.py:575 +#: assets/models/node.py:561 msgid "Can match node" msgstr "可以匹配节点" @@ -1359,7 +1385,7 @@ msgstr "必须的" msgid "Setting" msgstr "设置" -#: assets/models/platform.py:41 audits/const.py:40 settings/models.py:37 +#: assets/models/platform.py:41 audits/const.py:47 settings/models.py:37 #: terminal/serializers/applet_host.py:29 msgid "Enabled" msgstr "启用" @@ -1368,45 +1394,45 @@ msgstr "启用" msgid "Ansible config" msgstr "Ansible 配置" -#: assets/models/platform.py:43 assets/serializers/platform.py:55 +#: assets/models/platform.py:43 assets/serializers/platform.py:57 msgid "Ping enabled" msgstr "启用资产探活" -#: assets/models/platform.py:44 assets/serializers/platform.py:56 +#: assets/models/platform.py:44 assets/serializers/platform.py:58 msgid "Ping method" msgstr "资产探活方式" #: assets/models/platform.py:45 assets/models/platform.py:58 -#: assets/serializers/platform.py:57 +#: assets/serializers/platform.py:59 msgid "Gather facts enabled" msgstr "启用收集资产信息" #: assets/models/platform.py:46 assets/models/platform.py:60 -#: assets/serializers/platform.py:58 +#: assets/serializers/platform.py:60 msgid "Gather facts method" msgstr "收集信息方式" -#: assets/models/platform.py:47 assets/serializers/platform.py:61 +#: assets/models/platform.py:47 assets/serializers/platform.py:63 msgid "Change secret enabled" msgstr "启用改密" -#: assets/models/platform.py:49 assets/serializers/platform.py:62 +#: assets/models/platform.py:49 assets/serializers/platform.py:64 msgid "Change secret method" msgstr "改密方式" -#: assets/models/platform.py:51 assets/serializers/platform.py:63 +#: assets/models/platform.py:51 assets/serializers/platform.py:65 msgid "Push account enabled" msgstr "启用账号推送" -#: assets/models/platform.py:53 assets/serializers/platform.py:64 +#: assets/models/platform.py:53 assets/serializers/platform.py:66 msgid "Push account method" msgstr "账号推送方式" -#: assets/models/platform.py:55 assets/serializers/platform.py:59 +#: assets/models/platform.py:55 assets/serializers/platform.py:61 msgid "Verify account enabled" msgstr "开启账号验证" -#: assets/models/platform.py:57 assets/serializers/platform.py:60 +#: assets/models/platform.py:57 assets/serializers/platform.py:62 msgid "Verify account method" msgstr "账号验证方式" @@ -1418,23 +1444,23 @@ msgstr "元数据" msgid "Internal" msgstr "内置" -#: assets/models/platform.py:82 assets/serializers/platform.py:85 +#: assets/models/platform.py:82 assets/serializers/platform.py:87 msgid "Charset" msgstr "编码" -#: assets/models/platform.py:84 assets/serializers/platform.py:112 +#: assets/models/platform.py:84 assets/serializers/platform.py:114 msgid "Domain enabled" msgstr "启用网域" -#: assets/models/platform.py:86 assets/serializers/platform.py:111 +#: assets/models/platform.py:86 assets/serializers/platform.py:113 msgid "Su enabled" msgstr "启用账号切换" -#: assets/models/platform.py:87 assets/serializers/platform.py:95 +#: assets/models/platform.py:87 assets/serializers/platform.py:97 msgid "Su method" msgstr "账号切换方式" -#: assets/models/platform.py:89 assets/serializers/platform.py:92 +#: assets/models/platform.py:89 assets/serializers/platform.py:94 msgid "Automation" msgstr "自动化" @@ -1443,45 +1469,41 @@ msgstr "自动化" msgid "%(value)s is not an even number" msgstr "%(value)s is not an even number" -#: assets/serializers/asset/common.py:100 +#: assets/serializers/asset/common.py:108 msgid "Auto fill" msgstr "自动代填" -#: assets/serializers/asset/common.py:111 assets/serializers/platform.py:90 +#: assets/serializers/asset/common.py:119 assets/serializers/platform.py:92 #: authentication/serializers/connect_token_secret.py:28 #: authentication/serializers/connect_token_secret.py:66 -#: perms/serializers/user_permission.py:24 xpack/plugins/cloud/models.py:107 -#: xpack/plugins/cloud/serializers/task.py:38 +#: perms/serializers/user_permission.py:24 xpack/plugins/cloud/models.py:99 msgid "Protocols" msgstr "协议组" -#: assets/serializers/asset/common.py:130 -msgid "Address" -msgstr "地址" - -#: assets/serializers/asset/common.py:131 +#: assets/serializers/asset/common.py:139 msgid "Node path" msgstr "节点路径" -#: assets/serializers/asset/common.py:204 +#: assets/serializers/asset/common.py:212 msgid "Platform not exist" msgstr "平台不存在" -#: assets/serializers/asset/common.py:234 +#: assets/serializers/asset/common.py:244 msgid "port out of range (1-65535)" msgstr "端口超出范围 (1-65535)" -#: assets/serializers/asset/common.py:241 +#: assets/serializers/asset/common.py:251 msgid "Protocol is required: {}" msgstr "协议是必填的: {}" -#: assets/serializers/asset/common.py:263 +#: assets/serializers/asset/common.py:281 msgid "Auto info" msgstr "自动化信息" #: assets/serializers/asset/database.py:24 common/serializers/fields.py:100 #: tickets/serializers/ticket/common.py:58 #: xpack/plugins/cloud/serializers/account_attrs.py:56 +#: xpack/plugins/cloud/serializers/account_attrs.py:79 msgid "This field is required." msgstr "该字段是必填项。" @@ -1562,51 +1584,56 @@ msgstr "不能包含: /" msgid "The same level node name cannot be the same" msgstr "同级别节点名字不能重复" -#: assets/serializers/platform.py:24 +#: assets/serializers/platform.py:25 msgid "SFTP enabled" msgstr "SFTP 已启用" -#: assets/serializers/platform.py:25 +#: assets/serializers/platform.py:26 msgid "SFTP home" msgstr "SFTP 根路径" -#: assets/serializers/platform.py:65 +#: assets/serializers/platform.py:67 msgid "Gather accounts enabled" msgstr "启用账号收集" -#: assets/serializers/platform.py:66 +#: assets/serializers/platform.py:68 msgid "Gather accounts method" msgstr "收集账号方式" -#: assets/serializers/platform.py:72 +#: assets/serializers/platform.py:74 msgid "Primary" msgstr "主要的" -#: assets/serializers/platform.py:113 +#: assets/serializers/platform.py:115 msgid "Default Domain" msgstr "默认网域" +#: assets/signal_handlers/asset.py:25 assets/tasks/ping.py:24 +#: assets/tasks/ping.py:34 +msgid "Test assets connectivity " +msgstr "测试资产可连接性" + +#: assets/signal_handlers/asset.py:34 +#, fuzzy +#| msgid "Update assets hardware info: " +msgid "Gather asset hardware info" +msgstr "更新资产硬件信息" + #: assets/tasks/automation.py:11 msgid "Asset execute automation" msgstr "资产执行自动化" -#: assets/tasks/gather_facts.py:23 -msgid "Update some assets hardware info. " -msgstr "更新资产硬件信息. " +#: assets/tasks/gather_facts.py:21 assets/tasks/gather_facts.py:25 +#, fuzzy +#| msgid "Gather asset facts" +msgid "Gather assets facts" +msgstr "收集资产信息" -#: assets/tasks/gather_facts.py:53 -msgid "Manually update the hardware information of assets" -msgstr "手动更新资产信息" - -#: assets/tasks/gather_facts.py:57 +#: assets/tasks/gather_facts.py:47 msgid "Update assets hardware info: " msgstr "更新资产硬件信息" -#: assets/tasks/gather_facts.py:61 -msgid "Manually update the hardware information of assets under a node" -msgstr "手动更新节点下资产信息" - -#: assets/tasks/gather_facts.py:65 +#: assets/tasks/gather_facts.py:54 msgid "Update node asset hardware information: " msgstr "更新节点资产硬件信息: " @@ -1623,19 +1650,7 @@ msgstr "自检程序已经在运行,不能重复启动" msgid "Periodic check the amount of assets under the node" msgstr "周期性检查节点下资产数量" -#: assets/tasks/ping.py:37 assets/tasks/ping.py:54 -msgid "Test assets connectivity " -msgstr "测试资产可连接性" - -#: assets/tasks/ping.py:50 -msgid "Manually test the connectivity of a asset" -msgstr "手动测试资产连接性" - -#: assets/tasks/ping.py:58 -msgid "Manually test the connectivity of assets under a node" -msgstr "手动测试节点下资产连接性" - -#: assets/tasks/ping.py:62 +#: assets/tasks/ping.py:41 msgid "Test if the assets under the node are connectable " msgstr "测试节点下资产是否可连接" @@ -1663,7 +1678,7 @@ msgstr "日志审计" msgid "The text content is too long. Use Elasticsearch to store operation logs" msgstr "文字内容太长。请使用 Elasticsearch 存储操作日志" -#: audits/backends/db.py:76 +#: audits/backends/db.py:81 msgid "Tips" msgstr "提示" @@ -1731,7 +1746,28 @@ msgstr "改密" msgid "Terminal" msgstr "终端" +#: audits/const.py:39 audits/models.py:93 +msgid "Operate log" +msgstr "操作日志" + +#: audits/const.py:40 +#, fuzzy +#| msgid "Session" +msgid "Session log" +msgstr "会话" + #: audits/const.py:41 +#, fuzzy +#| msgid "Login acl" +msgid "Login log" +msgstr "登录访问控制" + +#: audits/const.py:42 ops/signal_handlers.py:74 +#: terminal/models/applet/host.py:111 terminal/models/component/task.py:24 +msgid "Task" +msgstr "任务" + +#: audits/const.py:48 msgid "-" msgstr "-" @@ -1743,144 +1779,159 @@ msgstr "是" msgid "No" msgstr "否" -#: audits/handler.py:140 -msgid "{} used account[{}], login method[{}] login the asset." -msgstr "{} 使用账户[{}], 登录方式[{}]登录了这个资产." - -#: audits/handler.py:155 -msgid "User {} has executed change auth plan for this account.({})" -msgstr "用户 {} 为这个账号执行了改密计划.({})" - -#: audits/handler.py:168 -msgid "User {} login into this service.[{}]" -msgstr "用户 {} 登录了服务.[{}]" - -#: audits/models.py:32 audits/models.py:59 audits/models.py:101 +#: audits/models.py:34 audits/models.py:61 audits/models.py:130 #: terminal/models/session/session.py:37 terminal/models/session/sharing.py:95 msgid "Remote addr" msgstr "远端地址" -#: audits/models.py:37 audits/serializers.py:33 +#: audits/models.py:39 audits/serializers.py:34 msgid "Operate" msgstr "操作" -#: audits/models.py:39 +#: audits/models.py:41 msgid "Filename" msgstr "文件名" -#: audits/models.py:44 +#: audits/models.py:46 msgid "File transfer log" msgstr "文件管理" -#: audits/models.py:53 audits/serializers.py:93 +#: audits/models.py:55 audits/serializers.py:94 msgid "Resource Type" msgstr "资源类型" -#: audits/models.py:54 audits/models.py:57 +#: audits/models.py:56 audits/models.py:59 audits/models.py:105 msgid "Resource" msgstr "资源" -#: audits/models.py:60 audits/models.py:103 terminal/serializers/command.py:43 +#: audits/models.py:62 audits/models.py:108 audits/models.py:132 +#: terminal/serializers/command.py:43 msgid "Datetime" msgstr "日期" -#: audits/models.py:62 +#: audits/models.py:101 +#, fuzzy +#| msgid "Active" +msgid "Activity type" +msgstr "激活中" + +#: audits/models.py:110 msgid "Detail" msgstr "" -#: audits/models.py:92 -msgid "Operate log" -msgstr "操作日志" +#: audits/models.py:112 +#, fuzzy +#| msgid "Terminal ID" +msgid "Detail ID" +msgstr "终端 ID" -#: audits/models.py:99 +#: audits/models.py:116 +msgid "Activity log" +msgstr "" + +#: audits/models.py:128 msgid "Change by" msgstr "修改者" -#: audits/models.py:109 +#: audits/models.py:138 msgid "Password change log" msgstr "改密日志" -#: audits/models.py:116 +#: audits/models.py:145 msgid "Login type" msgstr "登录方式" -#: audits/models.py:118 tickets/models/ticket/login_confirm.py:10 +#: audits/models.py:147 tickets/models/ticket/login_confirm.py:10 msgid "Login ip" msgstr "登录IP" -#: audits/models.py:120 +#: audits/models.py:149 #: authentication/templates/authentication/_msg_different_city.html:11 #: tickets/models/ticket/login_confirm.py:11 msgid "Login city" msgstr "登录城市" -#: audits/models.py:123 audits/serializers.py:63 +#: audits/models.py:152 audits/serializers.py:64 msgid "User agent" msgstr "用户代理" -#: audits/models.py:126 audits/serializers.py:47 +#: audits/models.py:155 audits/serializers.py:48 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 -#: users/forms/profile.py:65 users/models/user.py:698 -#: users/serializers/profile.py:126 +#: users/forms/profile.py:65 users/models/user.py:740 +#: users/serializers/profile.py:124 msgid "MFA" msgstr "MFA" -#: audits/models.py:136 +#: audits/models.py:165 msgid "Date login" msgstr "登录日期" -#: audits/models.py:138 audits/serializers.py:65 +#: audits/models.py:167 audits/serializers.py:66 msgid "Authentication backend" msgstr "认证方式" -#: audits/models.py:182 +#: audits/models.py:211 msgid "User login log" msgstr "用户登录日志" -#: audits/serializers.py:64 +#: audits/serializers.py:65 msgid "Reason display" msgstr "原因描述" -#: audits/serializers.py:120 +#: audits/serializers.py:122 msgid "User {} {} this resource." msgstr "用户 {} {} 了当前资源." -#: audits/signal_handlers.py:49 +#: audits/signal_handlers/activity_log.py:112 +msgid "{} used account[{}], login method[{}] login the asset." +msgstr "{} 使用账户[{}], 登录方式[{}]登录了这个资产." + +#: audits/signal_handlers/activity_log.py:121 +msgid "User {} login into this service.[{}]" +msgstr "用户 {} 登录了服务.[{}]" + +#: audits/signal_handlers/activity_log.py:139 +#, python-format +msgid "User %s performs a task(%s) for this resource." +msgstr "" + +#: audits/signal_handlers/login_log.py:29 msgid "SSH Key" msgstr "SSH 密钥" -#: audits/signal_handlers.py:51 settings/serializers/auth/sso.py:10 +#: audits/signal_handlers/login_log.py:31 settings/serializers/auth/sso.py:10 msgid "SSO" msgstr "SSO" -#: audits/signal_handlers.py:52 +#: audits/signal_handlers/login_log.py:32 msgid "Auth Token" msgstr "认证令牌" -#: audits/signal_handlers.py:53 authentication/notifications.py:73 +#: audits/signal_handlers/login_log.py:33 authentication/notifications.py:73 #: authentication/views/login.py:73 authentication/views/wecom.py:177 #: notifications/backends/__init__.py:11 settings/serializers/auth/wecom.py:10 -#: users/models/user.py:736 +#: users/models/user.py:778 msgid "WeCom" msgstr "企业微信" -#: audits/signal_handlers.py:54 authentication/views/feishu.py:144 +#: audits/signal_handlers/login_log.py:34 authentication/views/feishu.py:144 #: authentication/views/login.py:85 notifications/backends/__init__.py:14 -#: settings/serializers/auth/feishu.py:10 users/models/user.py:738 +#: settings/serializers/auth/feishu.py:10 users/models/user.py:780 msgid "FeiShu" msgstr "飞书" -#: audits/signal_handlers.py:55 authentication/views/dingtalk.py:179 +#: audits/signal_handlers/login_log.py:35 authentication/views/dingtalk.py:179 #: authentication/views/login.py:79 notifications/backends/__init__.py:12 -#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:737 +#: settings/serializers/auth/dingtalk.py:10 users/models/user.py:779 msgid "DingTalk" msgstr "钉钉" -#: audits/signal_handlers.py:56 authentication/models/temp_token.py:16 +#: audits/signal_handlers/login_log.py:36 +#: authentication/models/temp_token.py:16 msgid "Temporary token" msgstr "临时密码" -#: audits/tasks.py:37 +#: audits/tasks.py:44 msgid "Clean audits log" msgstr "清理审计日志" @@ -1888,19 +1939,19 @@ msgstr "清理审计日志" msgid "This action require verify your MFA" msgstr "此操作需要验证您的 MFA" -#: authentication/api/connection_token.py:264 +#: authentication/api/connection_token.py:269 msgid "Account not found" msgstr "账号未找到" -#: authentication/api/connection_token.py:267 +#: authentication/api/connection_token.py:272 msgid "Permission expired" msgstr "授权已过期" -#: authentication/api/connection_token.py:279 +#: authentication/api/connection_token.py:284 msgid "ACL action is reject" msgstr "ACL 动作是拒绝" -#: authentication/api/connection_token.py:283 +#: authentication/api/connection_token.py:288 msgid "ACL action is review" msgstr "ACL 动作是复核" @@ -2254,7 +2305,7 @@ msgstr "设置手机号码启用" msgid "Clear phone number to disable" msgstr "清空手机号码禁用" -#: authentication/middleware.py:77 settings/utils/ldap.py:652 +#: authentication/middleware.py:88 settings/utils/ldap.py:652 msgid "Authentication failed (before login check failed): {}" msgstr "认证失败(登录前检查失败): {}" @@ -2266,66 +2317,66 @@ msgstr "该 MFA ({}) 方式没有启用" msgid "Please change your password" msgstr "请修改密码" -#: authentication/models/connection_token.py:34 +#: authentication/models/connection_token.py:35 #: terminal/serializers/storage.py:111 msgid "Account name" msgstr "账号名称" -#: authentication/models/connection_token.py:35 +#: authentication/models/connection_token.py:36 msgid "Input username" msgstr "自定义用户名" -#: authentication/models/connection_token.py:36 -#: authentication/serializers/connection_token.py:16 +#: authentication/models/connection_token.py:37 +#: authentication/serializers/connection_token.py:17 msgid "Input secret" msgstr "自定义密码" -#: authentication/models/connection_token.py:38 +#: authentication/models/connection_token.py:39 msgid "Connect method" msgstr "连接方式" -#: authentication/models/connection_token.py:39 +#: authentication/models/connection_token.py:40 #: rbac/serializers/rolebinding.py:21 msgid "User display" msgstr "用户名称" -#: authentication/models/connection_token.py:40 +#: authentication/models/connection_token.py:41 msgid "Asset display" msgstr "资产名称" -#: authentication/models/connection_token.py:41 +#: authentication/models/connection_token.py:42 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:74 #: tickets/models/ticket/apply_application.py:31 -#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:719 +#: tickets/models/ticket/apply_asset.py:20 users/models/user.py:761 msgid "Date expired" msgstr "失效日期" -#: authentication/models/connection_token.py:45 +#: authentication/models/connection_token.py:46 #: perms/models/asset_permission.py:77 msgid "From ticket" msgstr "来自工单" -#: authentication/models/connection_token.py:51 +#: authentication/models/connection_token.py:52 msgid "Connection token" msgstr "连接令牌" -#: authentication/models/connection_token.py:53 +#: authentication/models/connection_token.py:54 msgid "Can view connection token secret" msgstr "可以查看连接令牌密文" -#: authentication/models/connection_token.py:100 +#: authentication/models/connection_token.py:101 msgid "Connection token inactive" msgstr "连接令牌未激活" -#: authentication/models/connection_token.py:103 +#: authentication/models/connection_token.py:104 msgid "Connection token expired at: {}" msgstr "连接令牌过期: {}" -#: authentication/models/connection_token.py:106 +#: authentication/models/connection_token.py:107 msgid "No user or invalid user" msgstr "没有用户或用户失效" -#: authentication/models/connection_token.py:110 +#: authentication/models/connection_token.py:111 msgid "No asset or inactive asset" msgstr "没有资产或资产未激活" @@ -2379,19 +2430,27 @@ msgstr "立刻过期" msgid "ID" msgstr "ID" -#: authentication/serializers/connection_token.py:14 +#: authentication/serializers/connection_token.py:15 msgid "Expired time" msgstr "过期时间" -#: authentication/serializers/connection_token.py:18 +#: authentication/serializers/connection_token.py:19 msgid "Ticket info" msgstr "工单信息" +#: authentication/serializers/connection_token.py:20 +#: perms/models/asset_permission.py:71 perms/serializers/permission.py:29 +#: perms/serializers/permission.py:60 +#: tickets/models/ticket/apply_application.py:28 +#: tickets/models/ticket/apply_asset.py:18 +msgid "Actions" +msgstr "动作" + #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/email.py:19 #: settings/serializers/email.py:50 users/forms/profile.py:102 -#: users/forms/profile.py:106 users/models/user.py:677 +#: users/forms/profile.py:106 users/models/user.py:719 #: users/templates/users/forgot_password.html:116 #: users/views/profile/reset.py:73 msgid "Email" @@ -2433,14 +2492,14 @@ msgid "Show" msgstr "显示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: settings/serializers/security.py:39 users/models/user.py:559 -#: users/serializers/profile.py:116 users/templates/users/mfa_setting.html:61 +#: settings/serializers/security.py:39 users/models/user.py:601 +#: users/serializers/profile.py:115 users/templates/users/mfa_setting.html:61 #: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/models/user.py:560 users/serializers/profile.py:117 +#: users/models/user.py:602 users/serializers/profile.py:116 #: users/templates/users/mfa_setting.html:26 #: users/templates/users/mfa_setting.html:68 msgid "Enable" @@ -2763,16 +2822,6 @@ msgstr "请使用密码登录,然后绑定企业微信" msgid "Request file format may be wrong" msgstr "上传的文件格式错误 或 其它类型资源的文件" -#: common/const/__init__.py:6 -#, python-format -msgid "%(name)s was created successfully" -msgstr "%(name)s 创建成功" - -#: common/const/__init__.py:7 -#, python-format -msgid "%(name)s was updated successfully" -msgstr "%(name)s 更新成功" - #: common/const/choices.py:10 msgid "Manual trigger" msgstr "手动触发" @@ -2798,6 +2847,16 @@ msgstr "运行中" msgid "Canceled" msgstr "取消" +#: common/const/common.py:3 +#, python-format +msgid "%(name)s was created successfully" +msgstr "%(name)s 创建成功" + +#: common/const/common.py:4 +#, python-format +msgid "%(name)s was updated successfully" +msgstr "%(name)s 更新成功" + #: common/db/encoder.py:11 msgid "ugettext_lazy" msgstr "ugettext_lazy" @@ -2838,7 +2897,7 @@ msgstr "忽略的" msgid "discard time" msgstr "忽略时间" -#: common/db/models.py:34 users/models/user.py:722 +#: common/db/models.py:34 users/models/user.py:764 msgid "Updated by" msgstr "最后更新者" @@ -3093,15 +3152,15 @@ msgstr "发布站内消息" msgid "No account available" msgstr "无可用账号" -#: ops/ansible/inventory.py:180 +#: ops/ansible/inventory.py:182 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:196 +#: ops/ansible/inventory.py:198 msgid "Skip hosts below:" msgstr "跳过以下主机: " -#: ops/api/celery.py:58 ops/api/celery.py:73 +#: ops/api/celery.py:61 ops/api/celery.py:76 msgid "Waiting task start" msgstr "等待任务开始" @@ -3216,7 +3275,7 @@ msgid "Args" msgstr "参数" #: ops/models/adhoc.py:27 ops/models/base.py:16 ops/models/base.py:53 -#: ops/models/job.py:33 ops/models/job.py:104 ops/models/playbook.py:17 +#: ops/models/job.py:33 ops/models/job.py:111 ops/models/playbook.py:17 #: terminal/models/session/sharing.py:23 msgid "Creator" msgstr "创建者" @@ -3237,12 +3296,12 @@ msgstr "最后执行" msgid "Date last run" msgstr "最后运行日期" -#: ops/models/base.py:51 ops/models/job.py:102 -#: xpack/plugins/cloud/models.py:170 +#: ops/models/base.py:51 ops/models/job.py:109 +#: xpack/plugins/cloud/models.py:162 msgid "Result" msgstr "结果" -#: ops/models/base.py:52 ops/models/job.py:103 +#: ops/models/base.py:52 ops/models/job.py:110 msgid "Summary" msgstr "汇总" @@ -3306,14 +3365,22 @@ msgstr "使用参数定义" msgid "Parameters define" msgstr "参数定义" -#: ops/models/job.py:91 +#: ops/models/job.py:98 msgid "Job" msgstr "作业" -#: ops/models/job.py:101 +#: ops/models/job.py:108 msgid "Parameters" msgstr "参数" +#: ops/models/job.py:116 +msgid "Material" +msgstr "" + +#: ops/models/job.py:118 +msgid "Material Type" +msgstr "" + #: ops/models/job.py:311 msgid "Job Execution" msgstr "作业执行" @@ -3374,36 +3441,31 @@ msgstr "是否完成" msgid "Time cost" msgstr "花费时间" -#: ops/signal_handlers.py:74 terminal/models/applet/host.py:111 -#: terminal/models/component/task.py:24 -msgid "Task" -msgstr "任务" - #: ops/tasks.py:27 msgid "Run ansible task" msgstr "运行 Ansible 任务" -#: ops/tasks.py:43 +#: ops/tasks.py:44 msgid "Run ansible task execution" msgstr "开始执行 Ansible 任务" -#: ops/tasks.py:57 +#: ops/tasks.py:58 msgid "Periodic clear celery tasks" msgstr "周期清理不可用任务" -#: ops/tasks.py:59 +#: ops/tasks.py:60 msgid "Clean celery log period" msgstr "定期清除任务日志" -#: ops/tasks.py:76 +#: ops/tasks.py:77 msgid "Clear celery periodic tasks" msgstr "清理周期任务" -#: ops/tasks.py:99 +#: ops/tasks.py:100 msgid "Create or update periodic tasks" msgstr "创建或更新周期任务" -#: ops/tasks.py:107 +#: ops/tasks.py:108 msgid "Periodic check service performance" msgstr "周期检测服务性能" @@ -3466,7 +3528,7 @@ msgid "App organizations" msgstr "组织管理" #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:84 -#: rbac/const.py:7 rbac/models/rolebinding.py:48 +#: rbac/const.py:7 rbac/models/rolebinding.py:56 #: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:63 #: tickets/models/ticket/general.py:302 tickets/serializers/ticket/ticket.py:60 msgid "Organization" @@ -3476,7 +3538,7 @@ msgstr "组织" msgid "Org name" msgstr "组织名称" -#: orgs/models.py:70 rbac/models/role.py:36 terminal/models/applet/applet.py:30 +#: orgs/models.py:70 rbac/models/role.py:36 terminal/models/applet/applet.py:32 msgid "Builtin" msgstr "内置的" @@ -3524,13 +3586,6 @@ msgstr "文件传输" msgid "Clipboard" msgstr "剪贴板" -#: perms/models/asset_permission.py:71 perms/serializers/permission.py:29 -#: perms/serializers/permission.py:60 -#: tickets/models/ticket/apply_application.py:28 -#: tickets/models/ticket/apply_asset.py:18 -msgid "Actions" -msgstr "动作" - #: perms/models/asset_permission.py:83 msgid "Asset permission" msgstr "资产授权" @@ -3612,15 +3667,15 @@ msgstr "" msgid "If you have any question, please contact the administrator" msgstr "如果有疑问或需求,请联系系统管理员" -#: rbac/api/role.py:34 +#: rbac/api/role.py:35 msgid "Internal role, can't be destroy" msgstr "内部角色,不能删除" -#: rbac/api/role.py:38 +#: rbac/api/role.py:40 msgid "The role has been bound to users, can't be destroy" msgstr "角色已绑定用户,不能删除" -#: rbac/api/role.py:60 +#: rbac/api/role.py:80 msgid "Internal role, can't be update" msgstr "内部角色,不能更新" @@ -3684,13 +3739,13 @@ msgstr "文件管理" msgid "Permissions" msgstr "授权" -#: rbac/models/role.py:31 rbac/models/rolebinding.py:38 +#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 #: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:36 msgid "Scope" msgstr "范围" -#: rbac/models/role.py:46 rbac/models/rolebinding.py:44 -#: users/models/user.py:685 +#: rbac/models/role.py:46 rbac/models/rolebinding.py:52 +#: users/models/user.py:727 msgid "Role" msgstr "角色" @@ -3702,29 +3757,29 @@ msgstr "系统角色" msgid "Organization role" msgstr "组织角色" -#: rbac/models/rolebinding.py:53 +#: rbac/models/rolebinding.py:61 msgid "Role binding" msgstr "角色绑定" -#: rbac/models/rolebinding.py:137 +#: rbac/models/rolebinding.py:145 msgid "All organizations" msgstr "所有组织" -#: rbac/models/rolebinding.py:166 +#: rbac/models/rolebinding.py:174 msgid "" "User last role in org, can not be delete, you can remove user from org " "instead" msgstr "用户最后一个角色,不能删除,你可以将用户从组织移除" -#: rbac/models/rolebinding.py:173 +#: rbac/models/rolebinding.py:181 msgid "Organization role binding" msgstr "组织角色绑定" -#: rbac/models/rolebinding.py:188 +#: rbac/models/rolebinding.py:196 msgid "System role binding" msgstr "系统角色绑定" -#: rbac/serializers/permission.py:26 users/serializers/profile.py:132 +#: rbac/serializers/permission.py:26 users/serializers/profile.py:130 msgid "Perms" msgstr "权限" @@ -3732,7 +3787,7 @@ msgstr "权限" msgid "Users amount" msgstr "用户数量" -#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:25 +#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:27 msgid "Display name" msgstr "显示名称" @@ -3780,10 +3835,6 @@ msgstr "云同步" msgid "Backup account" msgstr "备份账号" -#: rbac/tree.py:50 -msgid "Gather account" -msgstr "收集账号" - #: rbac/tree.py:52 msgid "Asset change auth" msgstr "资产改密" @@ -3800,8 +3851,8 @@ msgstr "任务中心" msgid "My assets" msgstr "我的资产" -#: rbac/tree.py:57 terminal/models/applet/applet.py:40 -#: terminal/models/applet/applet.py:142 terminal/models/applet/host.py:27 +#: rbac/tree.py:57 terminal/models/applet/applet.py:42 +#: terminal/models/applet/applet.py:147 terminal/models/applet/host.py:27 msgid "Applet" msgstr "远程应用" @@ -4298,7 +4349,7 @@ msgid "SSO auth key TTL" msgstr "令牌有效期" #: settings/serializers/auth/sso.py:17 settings/serializers/security.py:117 -#: xpack/plugins/cloud/serializers/account_attrs.py:176 +#: xpack/plugins/cloud/serializers/account_attrs.py:179 msgid "Unit: second" msgstr "单位: 秒" @@ -4368,7 +4419,7 @@ msgstr "登录日志" #: settings/serializers/cleaning.py:12 settings/serializers/cleaning.py:16 #: settings/serializers/cleaning.py:20 settings/serializers/cleaning.py:24 -#: settings/serializers/cleaning.py:28 +#: settings/serializers/cleaning.py:28 settings/serializers/cleaning.py:36 msgid "Unit: day" msgstr "单位: 天" @@ -4400,6 +4451,12 @@ msgstr "" "单位:天。 会话、录像、命令记录超过该时长将会被删除(仅影响数据库存储, oss等不" "受影响)" +#: settings/serializers/cleaning.py:36 +#, fuzzy +#| msgid "Login log keep days" +msgid "Activity log keep days" +msgstr "登录日志" + #: settings/serializers/email.py:21 msgid "SMTP host" msgstr "SMTP 主机" @@ -5168,7 +5225,7 @@ msgstr "离线录像播放器" msgid "Invalid zip file" msgstr "无效的 zip 文件" -#: terminal/api/component/endpoint.py:31 +#: terminal/api/component/endpoint.py:32 msgid "Not found protocol query params" msgstr "未发现 protocol 查询参数" @@ -5286,23 +5343,23 @@ msgstr "不支持批量创建" msgid "Storage is invalid" msgstr "存储无效" -#: terminal/models/applet/applet.py:27 +#: terminal/models/applet/applet.py:29 msgid "Author" msgstr "作者" -#: terminal/models/applet/applet.py:32 +#: terminal/models/applet/applet.py:34 msgid "Tags" msgstr "标签" -#: terminal/models/applet/applet.py:36 terminal/serializers/storage.py:157 +#: terminal/models/applet/applet.py:38 terminal/serializers/storage.py:157 msgid "Hosts" msgstr "主机" -#: terminal/models/applet/applet.py:81 +#: terminal/models/applet/applet.py:83 msgid "Applet pkg not valid, Missing file {}" msgstr "Applet pkg 无效,缺少文件 {}" -#: terminal/models/applet/applet.py:144 terminal/models/applet/host.py:33 +#: terminal/models/applet/applet.py:149 terminal/models/applet/host.py:33 #: terminal/models/applet/host.py:105 msgid "Hosting" msgstr "宿主机" @@ -5461,23 +5518,23 @@ msgstr "回放" msgid "Date end" msgstr "结束日期" -#: terminal/models/session/session.py:237 +#: terminal/models/session/session.py:234 msgid "Session record" msgstr "会话记录" -#: terminal/models/session/session.py:239 +#: terminal/models/session/session.py:236 msgid "Can monitor session" msgstr "可以监控会话" -#: terminal/models/session/session.py:240 +#: terminal/models/session/session.py:237 msgid "Can share session" msgstr "可以分享会话" -#: terminal/models/session/session.py:241 +#: terminal/models/session/session.py:238 msgid "Can terminate session" msgstr "可以终断会话" -#: terminal/models/session/session.py:242 +#: terminal/models/session/session.py:239 msgid "Can validate session action perm" msgstr "可以验证会话动作权限" @@ -5676,7 +5733,7 @@ msgstr "Access key ID(AK)" msgid "Access key secret" msgstr "Access key secret(SK)" -#: terminal/serializers/storage.py:65 xpack/plugins/cloud/models.py:217 +#: terminal/serializers/storage.py:65 xpack/plugins/cloud/models.py:209 msgid "Region" msgstr "地域" @@ -6108,7 +6165,7 @@ msgstr "无效的审批动作" msgid "This user is not authorized to approve this ticket" msgstr "此用户无权审批此工单" -#: users/api/user.py:183 +#: users/api/user.py:178 msgid "Could not reset self otp, use profile reset instead" msgstr "不能在该页面重置 MFA 多因子认证, 请去个人信息页面重置" @@ -6214,81 +6271,81 @@ msgstr "复制你的公钥到这里" msgid "Public key should not be the same as your old one." msgstr "不能和原来的密钥相同" -#: users/forms/profile.py:159 users/serializers/profile.py:100 -#: users/serializers/profile.py:183 users/serializers/profile.py:210 +#: users/forms/profile.py:159 users/serializers/profile.py:99 +#: users/serializers/profile.py:181 users/serializers/profile.py:208 msgid "Not a valid ssh public key" msgstr "SSH密钥不合法" -#: users/forms/profile.py:170 users/models/user.py:708 +#: users/forms/profile.py:170 users/models/user.py:750 msgid "Public key" msgstr "SSH公钥" -#: users/models/user.py:561 +#: users/models/user.py:603 msgid "Force enable" msgstr "强制启用" -#: users/models/user.py:687 users/serializers/user.py:161 +#: users/models/user.py:729 users/serializers/user.py:161 msgid "Is service account" msgstr "服务账号" -#: users/models/user.py:689 +#: users/models/user.py:731 msgid "Avatar" msgstr "头像" -#: users/models/user.py:692 +#: users/models/user.py:734 msgid "Wechat" msgstr "微信" -#: users/models/user.py:695 +#: users/models/user.py:737 msgid "Phone" msgstr "手机" -#: users/models/user.py:701 +#: users/models/user.py:743 msgid "OTP secret key" msgstr "OTP 密钥" -#: users/models/user.py:705 +#: users/models/user.py:747 msgid "Private key" msgstr "ssh私钥" -#: users/models/user.py:711 +#: users/models/user.py:753 msgid "Secret key" msgstr "Secret key" -#: users/models/user.py:716 users/serializers/profile.py:149 +#: users/models/user.py:758 users/serializers/profile.py:147 #: users/serializers/user.py:158 msgid "Is first login" msgstr "首次登录" -#: users/models/user.py:730 +#: users/models/user.py:772 msgid "Date password last updated" msgstr "最后更新密码日期" -#: users/models/user.py:733 +#: users/models/user.py:775 msgid "Need update password" msgstr "需要更新密码" -#: users/models/user.py:902 +#: users/models/user.py:913 msgid "Can invite user" msgstr "可以邀请用户" -#: users/models/user.py:903 +#: users/models/user.py:914 msgid "Can remove user" msgstr "可以移除用户" -#: users/models/user.py:904 +#: users/models/user.py:915 msgid "Can match user" msgstr "可以匹配用户" -#: users/models/user.py:913 +#: users/models/user.py:924 msgid "Administrator" msgstr "管理员" -#: users/models/user.py:916 +#: users/models/user.py:927 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" -#: users/models/user.py:941 +#: users/models/user.py:952 msgid "User password history" msgstr "用户密码历史" @@ -6323,19 +6380,19 @@ msgstr "重置 SSH 密钥" msgid "Reset MFA" msgstr "重置 MFA" -#: users/serializers/profile.py:30 +#: users/serializers/profile.py:29 msgid "The old password is incorrect" msgstr "旧密码错误" -#: users/serializers/profile.py:37 users/serializers/profile.py:197 +#: users/serializers/profile.py:36 users/serializers/profile.py:195 msgid "Password does not match security rules" msgstr "密码不满足安全规则" -#: users/serializers/profile.py:41 +#: users/serializers/profile.py:40 msgid "The new password cannot be the last {} passwords" msgstr "新密码不能是最近 {} 次的密码" -#: users/serializers/profile.py:49 users/serializers/profile.py:71 +#: users/serializers/profile.py:48 users/serializers/profile.py:70 msgid "The newly set password is inconsistent" msgstr "两次密码不一致" @@ -6801,55 +6858,47 @@ msgstr "地域" msgid "Hostname strategy" msgstr "主机名策略" -#: xpack/plugins/cloud/models.py:100 -msgid "Unix admin user" -msgstr "Unix 管理员" - -#: xpack/plugins/cloud/models.py:104 -msgid "Windows admin user" -msgstr "Windows 管理员" - -#: xpack/plugins/cloud/models.py:110 xpack/plugins/cloud/serializers/task.py:41 +#: xpack/plugins/cloud/models.py:102 xpack/plugins/cloud/serializers/task.py:40 msgid "IP network segment group" msgstr "IP网段组" -#: xpack/plugins/cloud/models.py:113 xpack/plugins/cloud/serializers/task.py:46 +#: xpack/plugins/cloud/models.py:105 xpack/plugins/cloud/serializers/task.py:45 msgid "Sync IP type" msgstr "同步IP类型" -#: xpack/plugins/cloud/models.py:116 xpack/plugins/cloud/serializers/task.py:64 +#: xpack/plugins/cloud/models.py:108 xpack/plugins/cloud/serializers/task.py:62 msgid "Always update" msgstr "总是更新" -#: xpack/plugins/cloud/models.py:122 +#: xpack/plugins/cloud/models.py:114 msgid "Date last sync" msgstr "最后同步日期" -#: xpack/plugins/cloud/models.py:127 xpack/plugins/cloud/models.py:168 +#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/models.py:160 msgid "Sync instance task" msgstr "同步实例任务" -#: xpack/plugins/cloud/models.py:179 xpack/plugins/cloud/models.py:227 +#: xpack/plugins/cloud/models.py:171 xpack/plugins/cloud/models.py:219 msgid "Date sync" msgstr "同步日期" -#: xpack/plugins/cloud/models.py:183 +#: xpack/plugins/cloud/models.py:175 msgid "Sync instance task execution" msgstr "同步实例任务执行" -#: xpack/plugins/cloud/models.py:207 +#: xpack/plugins/cloud/models.py:199 msgid "Sync task" msgstr "同步任务" -#: xpack/plugins/cloud/models.py:211 +#: xpack/plugins/cloud/models.py:203 msgid "Sync instance task history" msgstr "同步实例任务历史" -#: xpack/plugins/cloud/models.py:214 +#: xpack/plugins/cloud/models.py:206 msgid "Instance" msgstr "实例" -#: xpack/plugins/cloud/models.py:231 +#: xpack/plugins/cloud/models.py:223 msgid "Sync instance detail" msgstr "同步实例详情" @@ -7063,52 +7112,52 @@ msgstr "租户 ID" msgid "Subscription ID" msgstr "订阅 ID" -#: xpack/plugins/cloud/serializers/account_attrs.py:95 -#: xpack/plugins/cloud/serializers/account_attrs.py:100 -#: xpack/plugins/cloud/serializers/account_attrs.py:116 -#: xpack/plugins/cloud/serializers/account_attrs.py:141 +#: xpack/plugins/cloud/serializers/account_attrs.py:98 +#: xpack/plugins/cloud/serializers/account_attrs.py:103 +#: xpack/plugins/cloud/serializers/account_attrs.py:119 +#: xpack/plugins/cloud/serializers/account_attrs.py:144 msgid "API Endpoint" msgstr "API 端点" -#: xpack/plugins/cloud/serializers/account_attrs.py:106 +#: xpack/plugins/cloud/serializers/account_attrs.py:109 msgid "Auth url" msgstr "认证地址" -#: xpack/plugins/cloud/serializers/account_attrs.py:107 +#: xpack/plugins/cloud/serializers/account_attrs.py:110 msgid "eg: http://openstack.example.com:5000/v3" msgstr "如: http://openstack.example.com:5000/v3" -#: xpack/plugins/cloud/serializers/account_attrs.py:110 +#: xpack/plugins/cloud/serializers/account_attrs.py:113 msgid "User domain" msgstr "用户域" -#: xpack/plugins/cloud/serializers/account_attrs.py:117 +#: xpack/plugins/cloud/serializers/account_attrs.py:120 msgid "Cert File" msgstr "证书文件" -#: xpack/plugins/cloud/serializers/account_attrs.py:118 +#: xpack/plugins/cloud/serializers/account_attrs.py:121 msgid "Key File" msgstr "密钥文件" -#: xpack/plugins/cloud/serializers/account_attrs.py:134 +#: xpack/plugins/cloud/serializers/account_attrs.py:137 msgid "Service account key" msgstr "服务账号密钥" -#: xpack/plugins/cloud/serializers/account_attrs.py:135 +#: xpack/plugins/cloud/serializers/account_attrs.py:138 msgid "The file is in JSON format" msgstr "JSON 格式的文件" -#: xpack/plugins/cloud/serializers/account_attrs.py:148 +#: xpack/plugins/cloud/serializers/account_attrs.py:151 msgid "IP address invalid `{}`, {}" msgstr "IP 地址无效: `{}`, {}" -#: xpack/plugins/cloud/serializers/account_attrs.py:154 +#: xpack/plugins/cloud/serializers/account_attrs.py:157 msgid "" "Format for comma-delimited string,Such as: 192.168.1.0/24, " "10.0.0.0-10.0.0.255" msgstr "格式为逗号分隔的字符串,如:192.168.1.0/24,10.0.0.0-10.0.0.255" -#: xpack/plugins/cloud/serializers/account_attrs.py:158 +#: xpack/plugins/cloud/serializers/account_attrs.py:161 msgid "" "The port is used to detect the validity of the IP address. When the " "synchronization task is executed, only the valid IP address will be " @@ -7117,19 +7166,19 @@ msgstr "" "端口用来检测 IP 地址的有效性,在同步任务执行时,只会同步有效的 IP 地址。
" "如果端口为 0,则表示所有 IP 地址均有效。" -#: xpack/plugins/cloud/serializers/account_attrs.py:166 +#: xpack/plugins/cloud/serializers/account_attrs.py:169 msgid "Hostname prefix" msgstr "主机名前缀" -#: xpack/plugins/cloud/serializers/account_attrs.py:169 +#: xpack/plugins/cloud/serializers/account_attrs.py:172 msgid "IP segment" msgstr "IP 网段" -#: xpack/plugins/cloud/serializers/account_attrs.py:173 +#: xpack/plugins/cloud/serializers/account_attrs.py:176 msgid "Test port" msgstr "测试端口" -#: xpack/plugins/cloud/serializers/account_attrs.py:176 +#: xpack/plugins/cloud/serializers/account_attrs.py:179 msgid "Test timeout" msgstr "测试超时时间" @@ -7153,10 +7202,6 @@ msgstr "执行次数" msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/serializers/task.py:63 -msgid "Linux admin user" -msgstr "Linux 管理员" - #: xpack/plugins/cloud/utils.py:69 msgid "Account unavailable" msgstr "账号无效" @@ -7225,6 +7270,33 @@ msgstr "旗舰版" msgid "Community edition" msgstr "社区版" +#~ msgid "Update some assets hardware info. " +#~ msgstr "更新资产硬件信息. " + +#~ msgid "Manually update the hardware information of assets" +#~ msgstr "手动更新资产信息" + +#~ msgid "Manually update the hardware information of assets under a node" +#~ msgstr "手动更新节点下资产信息" + +#~ msgid "Manually test the connectivity of a asset" +#~ msgstr "手动测试资产连接性" + +#~ msgid "Manually test the connectivity of assets under a node" +#~ msgstr "手动测试节点下资产连接性" + +#~ msgid "User {} has executed change auth plan for this account.({})" +#~ msgstr "用户 {} 为这个账号执行了改密计划.({})" + +#~ msgid "Unix admin user" +#~ msgstr "Unix 管理员" + +#~ msgid "Windows admin user" +#~ msgstr "Windows 管理员" + +#~ msgid "Linux admin user" +#~ msgstr "Linux 管理员" + #~ msgid "Disk info" #~ msgstr "硬盘信息" From eaad297c9cf9a48279fa8f803eb780e894a4f17d Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 13 Feb 2023 15:39:29 +0800 Subject: [PATCH 06/20] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20playbook=20?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=99=A8=20main=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BF=AE=E6=94=B9=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#9521)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复 playbook 编辑器 main 文件无法修改的问题 * perf: 优化代码 --------- Co-authored-by: Aaron3S --- apps/ops/api/playbook.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/ops/api/playbook.py b/apps/ops/api/playbook.py index 41edb0405..ea856df37 100644 --- a/apps/ops/api/playbook.py +++ b/apps/ops/api/playbook.py @@ -4,6 +4,7 @@ import zipfile from django.conf import settings from django.shortcuts import get_object_or_404 +from rest_framework import status from orgs.mixins.api import OrgBulkModelViewSet from ..exception import PlaybookNoValidEntry @@ -129,25 +130,25 @@ class PlaybookFileBrowserAPIView(APIView): work_path = playbook.work_dir file_key = request.data.get('key', '') + new_name = request.data.get('new_name', '') - if file_key in self.protected_files: - return Response({'msg': '{} can not be modified'.format(file_key)}, status=400) + if file_key in self.protected_files and new_name: + return Response({'msg': '{} can not be rename'.format(file_key)}, status=status.HTTP_400_BAD_REQUEST) if os.path.dirname(file_key) == 'root': file_key = os.path.basename(file_key) - new_name = request.data.get('new_name', '') content = request.data.get('content', '') is_directory = request.data.get('is_directory', False) if not file_key or file_key == 'root': - return Response(status=400) + return Response(status=status.HTTP_400_BAD_REQUEST) file_path = os.path.join(work_path, file_key) if new_name: new_file_path = os.path.join(os.path.dirname(file_path), new_name) if os.path.exists(new_file_path): - return Response({'msg': '{} already exists'.format(new_name)}, status=400) + return Response({'msg': '{} already exists'.format(new_name)}, status=status.HTTP_400_BAD_REQUEST) os.rename(file_path, new_file_path) file_path = new_file_path @@ -162,9 +163,9 @@ class PlaybookFileBrowserAPIView(APIView): work_path = playbook.work_dir file_key = request.query_params.get('key', '') if not file_key: - return Response({'msg': 'key is required'}, status=400) + return Response({'msg': 'key is required'}, status=status.HTTP_400_BAD_REQUEST) if file_key in self.protected_files: - return Response({'msg': ' {} can not be delete'.format(file_key)}, status=400) + return Response({'msg': ' {} can not be delete'.format(file_key)}, status=status.HTTP_400_BAD_REQUEST) file_path = os.path.join(work_path, file_key) if os.path.isdir(file_path): shutil.rmtree(file_path) From fcad5c637a7b357179954ebdfb380b327e7b2441 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 13 Feb 2023 15:32:31 +0800 Subject: [PATCH 07/20] =?UTF-8?q?perf:=20chrome=20https=E7=BD=91=E7=AB=99?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/terminal/applets/chrome/app.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/terminal/applets/chrome/app.py b/apps/terminal/applets/chrome/app.py index 8fbe0241f..6a2f678b5 100644 --- a/apps/terminal/applets/chrome/app.py +++ b/apps/terminal/applets/chrome/app.py @@ -162,6 +162,12 @@ def default_chrome_driver_options(): options.add_argument("start-maximized") # 禁用 扩展 options.add_argument("--disable-extensions") + # 忽略证书错误相关 + options.add_argument('--ignore-ssl-errors') + options.add_argument('--ignore-certificate-errors') + options.add_argument('--ignore-certificate-errors-spki-list') + options.add_argument('--allow-running-insecure-content') + # 禁用开发者工具 options.add_argument("--disable-dev-tools") # 禁用 密码管理器弹窗 From 66b248db7738646d600213a815096786343bcc35 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 13 Feb 2023 17:11:43 +0800 Subject: [PATCH 08/20] =?UTF-8?q?perf:=20=E5=8E=BB=E9=99=A4=20applet=20?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E7=9A=84=E9=80=80=E5=87=BA=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=20(#9525)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eric --- apps/terminal/applets/chrome/common.py | 6 +++--- apps/terminal/applets/navicat/common.py | 9 +++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/apps/terminal/applets/chrome/common.py b/apps/terminal/applets/chrome/common.py index 3c527f615..06d23f9fd 100644 --- a/apps/terminal/applets/chrome/common.py +++ b/apps/terminal/applets/chrome/common.py @@ -59,12 +59,12 @@ def check_pid_alive(pid) -> bool: content = decode_content(csv_ret) content_list = content.strip().split("\r\n") if len(content_list) != 2: - notify_err_message(content) + print("check pid {} ret invalid: {}".format(pid, content)) return False ret_pid = content_list[1].split(",")[1].strip('"') return str(pid) == ret_pid except Exception as e: - notify_err_message(e) + print("check pid {} err: {}".format(pid, e)) return False @@ -73,7 +73,7 @@ def wait_pid(pid): time.sleep(5) ok = check_pid_alive(pid) if not ok: - notify_err_message("程序退出") + print("pid {} is not alive".format(pid)) break diff --git a/apps/terminal/applets/navicat/common.py b/apps/terminal/applets/navicat/common.py index 1802c8d86..010347fe0 100644 --- a/apps/terminal/applets/navicat/common.py +++ b/apps/terminal/applets/navicat/common.py @@ -59,14 +59,12 @@ def check_pid_alive(pid) -> bool: content = decode_content(csv_ret) content_list = content.strip().split("\r\n") if len(content_list) != 2: - notify_err_message(content) - time.sleep(2) + print("check pid {} ret invalid: {}".format(pid, content)) return False ret_pid = content_list[1].split(",")[1].strip('"') return str(pid) == ret_pid except Exception as e: - notify_err_message(e) - time.sleep(2) + print("check pid {} err: {}".format(pid, e)) return False @@ -75,8 +73,7 @@ def wait_pid(pid): time.sleep(5) ok = check_pid_alive(pid) if not ok: - notify_err_message("程序退出") - time.sleep(2) + print("pid {} is not alive".format(pid)) break From 9cd780eb06b3544df3380c46fcf16f9331dc1aed Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 13 Feb 2023 19:14:00 +0800 Subject: [PATCH 09/20] =?UTF-8?q?perf:=20=E6=94=B9=E9=80=A0=20merge=5Fdela?= =?UTF-8?q?y=5Ffunc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/signal_handlers/asset.py | 12 +-- .../signal_handlers/node_assets_amount.py | 4 +- .../signal_handlers/node_assets_mapping.py | 8 +- apps/common/decorators.py | 83 ++++++++++++------- .../management/commands/expire_caches.py | 4 +- apps/orgs/signal_handlers/cache.py | 2 +- 6 files changed, 70 insertions(+), 43 deletions(-) diff --git a/apps/assets/signal_handlers/asset.py b/apps/assets/signal_handlers/asset.py index 94aa86ff2..88ebab11e 100644 --- a/apps/assets/signal_handlers/asset.py +++ b/apps/assets/signal_handlers/asset.py @@ -21,13 +21,13 @@ def on_node_pre_save(sender, instance: Node, **kwargs): @merge_delay_run(ttl=5, key=key_by_org) -def test_assets_connectivity_handler(*assets): +def test_assets_connectivity_handler(assets=()): task_name = gettext_noop("Test assets connectivity ") test_assets_connectivity_task.delay(assets, task_name) @merge_delay_run(ttl=5, key=key_by_org) -def gather_assets_facts_handler(*assets): +def gather_assets_facts_handler(assets=()): if not assets: logger.info("No assets to update hardware info") return @@ -36,7 +36,7 @@ def gather_assets_facts_handler(*assets): @merge_delay_run(ttl=5, key=key_by_org) -def ensure_asset_has_node(*assets): +def ensure_asset_has_node(assets=()): asset_ids = [asset.id for asset in assets] has_ids = Asset.nodes.through.objects \ .filter(asset_id__in=asset_ids) \ @@ -60,16 +60,16 @@ def on_asset_create(sender, instance=None, created=False, **kwargs): return logger.info("Asset create signal recv: {}".format(instance)) - ensure_asset_has_node(instance) + ensure_asset_has_node(assets=(instance,)) # 获取资产硬件信息 auto_info = instance.auto_info if auto_info.get('ping_enabled'): logger.debug('Asset {} ping enabled, test connectivity'.format(instance.name)) - test_assets_connectivity_handler(instance) + test_assets_connectivity_handler(assets=(instance,)) if auto_info.get('gather_facts_enabled'): logger.debug('Asset {} gather facts enabled, gather facts'.format(instance.name)) - gather_assets_facts_handler(instance) + gather_assets_facts_handler(assets=(instance,)) RELATED_NODE_IDS = '_related_node_ids' diff --git a/apps/assets/signal_handlers/node_assets_amount.py b/apps/assets/signal_handlers/node_assets_amount.py index 314171a71..cc1c50b84 100644 --- a/apps/assets/signal_handlers/node_assets_amount.py +++ b/apps/assets/signal_handlers/node_assets_amount.py @@ -34,11 +34,11 @@ def on_node_asset_change(sender, action, instance, reverse, pk_set, **kwargs): node_ids = [instance.id] else: node_ids = pk_set - update_nodes_assets_amount(*node_ids) + update_nodes_assets_amount(node_ids=node_ids) @merge_delay_run(ttl=5) -def update_nodes_assets_amount(*node_ids): +def update_nodes_assets_amount(node_ids=()): nodes = list(Node.objects.filter(id__in=node_ids)) logger.info('Update nodes assets amount: {} nodes'.format(len(node_ids))) diff --git a/apps/assets/signal_handlers/node_assets_mapping.py b/apps/assets/signal_handlers/node_assets_mapping.py index 54855a29a..b84474033 100644 --- a/apps/assets/signal_handlers/node_assets_mapping.py +++ b/apps/assets/signal_handlers/node_assets_mapping.py @@ -22,7 +22,7 @@ node_assets_mapping_pub_sub = lazy(lambda: RedisPubSub('fm.node_asset_mapping'), @merge_delay_run(ttl=5) -def expire_node_assets_mapping(*org_ids): +def expire_node_assets_mapping(org_ids=()): # 所有进程清除(自己的 memory 数据) root_org_id = Organization.ROOT_ID Node.expire_node_all_asset_ids_cache_mapping(root_org_id) @@ -43,18 +43,18 @@ def on_node_post_create(sender, instance, created, update_fields, **kwargs): need_expire = False if need_expire: - expire_node_assets_mapping(instance.org_id) + expire_node_assets_mapping(org_ids=(instance.org_id,)) @receiver(post_delete, sender=Node) def on_node_post_delete(sender, instance, **kwargs): - expire_node_assets_mapping(instance.org_id) + expire_node_assets_mapping(org_ids=(instance.org_id,)) @receiver(m2m_changed, sender=Asset.nodes.through) def on_node_asset_change(sender, instance, **kwargs): logger.debug("Recv asset nodes changed signal, expire memery node asset mapping") - expire_node_assets_mapping(instance.org_id) + expire_node_assets_mapping(org_ids=(instance.org_id,)) @receiver(django_ready) diff --git a/apps/common/decorators.py b/apps/common/decorators.py index bdc541a9a..4e31ac0e5 100644 --- a/apps/common/decorators.py +++ b/apps/common/decorators.py @@ -41,7 +41,10 @@ def default_suffix_key(*args, **kwargs): def key_by_org(*args, **kwargs): - return args[0].org_id + values = list(kwargs.values()) + if not values: + return 'default' + return values[0].org_id class EventLoopThread(threading.Thread): @@ -79,6 +82,15 @@ def cancel_or_remove_debouncer_task(cache_key): task.cancel() +def run_debouncer_func(cache_key, org, ttl, func, *args, **kwargs): + cancel_or_remove_debouncer_task(cache_key) + run_func_partial = functools.partial(_run_func_with_org, cache_key, org, func) + loop = _loop_thread.get_loop() + _debouncer = Debouncer(run_func_partial, lambda: True, ttl, loop=loop, executor=executor) + task = asyncio.run_coroutine_threadsafe(_debouncer(*args, **kwargs), loop=loop) + _loop_debouncer_func_task_cache[cache_key] = task + + class Debouncer(object): def __init__(self, callback, check, delay, loop=None, executor=None): self.callback = callback @@ -113,12 +125,36 @@ def _run_func_with_org(key, org, func, *args, **kwargs): _loop_debouncer_func_args_cache.pop(key, None) -def delay_run(ttl=5, key=None, merge_args=False): +def delay_run(ttl=5, key=None): """ 延迟执行函数, 在 ttl 秒内, 只执行最后一次 :param ttl: :param key: 是否合并参数, 一个 callback - :param merge_args: 是否合并之前的参数, bool + :return: + """ + + def inner(func): + suffix_key_func = key if key else default_suffix_key + + @functools.wraps(func) + def wrapper(*args, **kwargs): + from orgs.utils import get_current_org + org = get_current_org() + func_name = f'{func.__module__}_{func.__name__}' + key_suffix = suffix_key_func(*args) + cache_key = f'DELAY_RUN_{func_name}_{key_suffix}' + run_debouncer_func(cache_key, org, ttl, func, *args, **kwargs) + + return wrapper + + return inner + + +def merge_delay_run(ttl=5, key=None): + """ + 延迟执行函数, 在 ttl 秒内, 只执行最后一次, 并且合并参数 + :param ttl: + :param key: 是否合并参数, 一个 callback :return: """ @@ -127,48 +163,39 @@ def delay_run(ttl=5, key=None, merge_args=False): if len(sigs.parameters) != 1: raise ValueError('func must have one arguments: %s' % func.__name__) param = list(sigs.parameters.values())[0] - if not str(param).startswith('*') or param.kind == param.VAR_KEYWORD: - raise ValueError('func args must be startswith *: %s and not have **kwargs ' % func.__name__) + if not isinstance(param.default, tuple): + raise ValueError('func default must be tuple: %s' % param.default) suffix_key_func = key if key else default_suffix_key @functools.wraps(func) - def wrapper(*args): + def wrapper(*args, **kwargs): from orgs.utils import get_current_org org = get_current_org() func_name = f'{func.__module__}_{func.__name__}' - key_suffix = suffix_key_func(*args) - cache_key = f'DELAY_RUN_{func_name}_{key_suffix}' - new_arg = args - if merge_args: - values = _loop_debouncer_func_args_cache.get(cache_key, []) - new_arg = [*values, *args] - _loop_debouncer_func_args_cache[cache_key] = new_arg - - cancel_or_remove_debouncer_task(cache_key) - - run_func_partial = functools.partial(_run_func_with_org, cache_key, org, func) - loop = _loop_thread.get_loop() - _debouncer = Debouncer(run_func_partial, lambda: True, ttl, - loop=loop, executor=executor) - task = asyncio.run_coroutine_threadsafe(_debouncer(*new_arg), - loop=loop) - _loop_debouncer_func_task_cache[cache_key] = task + key_suffix = suffix_key_func(*args, **kwargs) + cache_key = f'MERGE_DELAY_RUN_{func_name}_{key_suffix}' + cache_kwargs = _loop_debouncer_func_args_cache.get(cache_key, {}) + for k, v in kwargs.items(): + if not isinstance(v, tuple): + raise ValueError('func kwargs value must be list or tuple: %s' % func.__name__) + if k not in cache_kwargs: + cache_kwargs[k] = v + else: + cache_kwargs[k] += v + run_debouncer_func(cache_key, org, ttl, func, *args, **cache_kwargs) return wrapper return inner -merge_delay_run = functools.partial(delay_run, merge_args=True) - - @delay_run(ttl=5) def test_delay_run(*username): print("Hello, %s, now is %s" % (username, time.time())) -@delay_run(ttl=5, key=lambda *users: users[0][0], merge_args=True) -def test_merge_delay_run(*users): +@merge_delay_run(ttl=5, key=lambda *users: users[0][0]) +def test_merge_delay_run(users=()): name = ','.join(users) time.sleep(2) print("Hello, %s, now is %s" % (name, time.time())) diff --git a/apps/common/management/commands/expire_caches.py b/apps/common/management/commands/expire_caches.py index d83b995b0..38749ee3d 100644 --- a/apps/common/management/commands/expire_caches.py +++ b/apps/common/management/commands/expire_caches.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand -from assets.signal_handlers.node_assets_mapping import expire_node_assets_mapping +from assets.signal_handlers.node_assets_mapping import expire_node_assets_mapping as _expire_node_assets_mapping from orgs.caches import OrgResourceStatisticsCache from orgs.models import Organization @@ -10,7 +10,7 @@ def expire_node_assets_mapping(): org_ids = [*org_ids, '00000000-0000-0000-0000-000000000000'] for org_id in org_ids: - expire_node_assets_mapping(org_id) + _expire_node_assets_mapping(org_ids=(org_id,)) def expire_org_resource_statistics_cache(): diff --git a/apps/orgs/signal_handlers/cache.py b/apps/orgs/signal_handlers/cache.py index 3eb1bd7e0..48a67149d 100644 --- a/apps/orgs/signal_handlers/cache.py +++ b/apps/orgs/signal_handlers/cache.py @@ -76,7 +76,7 @@ model_cache_field_mapper = { class OrgResourceStatisticsRefreshUtil: @staticmethod @merge_delay_run(ttl=5) - def refresh_org_fields(*org_fields): + def refresh_org_fields(org_fields=()): for org, cache_field_name in org_fields: OrgResourceStatisticsCache(org).expire(*cache_field_name) OrgResourceStatisticsCache(Organization.root()).expire(*cache_field_name) From 011535a02a6fbd84f30ae382d5d6f575931829dc Mon Sep 17 00:00:00 2001 From: Aaron3S Date: Mon, 13 Feb 2023 19:22:52 +0800 Subject: [PATCH 10/20] =?UTF-8?q?fix:=20=E8=BF=87=E6=BB=A4=20localhost=20?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/ansible/inventory.py | 5 ++++- apps/ops/models/job.py | 10 ++++++++++ apps/ops/models/playbook.py | 28 ++++++++++++++++++++++++++++ apps/ops/serializers/job.py | 10 ++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/apps/ops/ansible/inventory.py b/apps/ops/ansible/inventory.py index da9e8b599..4f108c13b 100644 --- a/apps/ops/ansible/inventory.py +++ b/apps/ops/ansible/inventory.py @@ -10,7 +10,7 @@ __all__ = ['JMSInventory'] class JMSInventory: def __init__(self, assets, account_policy='privileged_first', - account_prefer='root,Administrator', host_callback=None): + account_prefer='root,Administrator', host_callback=None, exclude_localhost=False): """ :param assets: :param account_prefer: account username name if not set use account_policy @@ -21,6 +21,7 @@ class JMSInventory: self.account_policy = account_policy self.host_callback = host_callback self.exclude_hosts = {} + self.exclude_localhost = exclude_localhost @staticmethod def clean_assets(assets): @@ -207,6 +208,8 @@ class JMSInventory: for host in hosts: name = host.pop('name') data['all']['hosts'][name] = host + if self.exclude_localhost and data['all']['hosts'].__contains__('localhost'): + data['all']['hosts'].update({'localhost': {'ansible_host': '255.255.255.255'}}) return data def write_to_file(self, path): diff --git a/apps/ops/models/job.py b/apps/ops/models/job.py index c0e45529b..d3f669fbc 100644 --- a/apps/ops/models/job.py +++ b/apps/ops/models/job.py @@ -295,10 +295,20 @@ class JobExecution(JMSOrgBaseModel): task_id = current_task.request.root_id self.task_id = task_id + def check_danger_keywords(self): + lines = self.job.playbook.check_dangerous_keywords() + if len(lines) > 0: + for line in lines: + print('\033[31mThe {} line of the file \'{}\' contains the ' + 'dangerous keyword \'{}\'\033[0m'.format(line['line'], line['file'], line['keyword'])) + raise Exception("Playbook contains dangerous keywords") + def start(self, **kwargs): self.date_start = timezone.now() self.set_celery_id() self.save() + if self.job.type == 'playbook': + self.check_danger_keywords() runner = self.get_runner() try: cb = runner.run(**kwargs) diff --git a/apps/ops/models/playbook.py b/apps/ops/models/playbook.py index efcd87730..2bef76741 100644 --- a/apps/ops/models/playbook.py +++ b/apps/ops/models/playbook.py @@ -9,6 +9,13 @@ from ops.const import CreateMethods from ops.exception import PlaybookNoValidEntry from orgs.mixins.models import JMSOrgBaseModel +dangerous_keywords = ( + 'delegate_to:localhost', + 'delegate_to:127.0.0.1', + 'local_action', + 'connection:local', +) + class Playbook(JMSOrgBaseModel): id = models.UUIDField(default=uuid.uuid4, primary_key=True) @@ -20,6 +27,27 @@ class Playbook(JMSOrgBaseModel): verbose_name=_('CreateMethod')) vcs_url = models.CharField(max_length=1024, default='', verbose_name=_('VCS URL'), null=True, blank=True) + def check_dangerous_keywords(self): + result = [] + for root, dirs, files in os.walk(self.work_dir): + for f in files: + if str(f).endswith('.yml') or str(f).endswith('.yaml'): + lines = self.search_keywords(os.path.join(root, f)) + if len(lines) > 0: + for line in lines: + result.append({'file': f, 'line': line[0], 'keyword': line[1]}) + return result + + @staticmethod + def search_keywords(file): + result = [] + with open(file, 'r') as f: + for line_num, line in enumerate(f): + for keyword in dangerous_keywords: + if keyword in line.replace(' ', ''): + result.append((line_num, keyword)) + return result + @property def entry(self): work_dir = self.work_dir diff --git a/apps/ops/serializers/job.py b/apps/ops/serializers/job.py index 13afe6d6c..792a23acd 100644 --- a/apps/ops/serializers/job.py +++ b/apps/ops/serializers/job.py @@ -1,3 +1,5 @@ +import uuid + from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -14,6 +16,14 @@ class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin): run_after_save = serializers.BooleanField(label=_("Run after save"), default=False, required=False) nodes = serializers.ListField(required=False, child=serializers.CharField()) date_last_run = serializers.DateTimeField(label=_('Date last run'), read_only=True) + name = serializers.CharField(label=_('Name'), max_length=128, allow_blank=True, required=False) + + def to_internal_value(self, data): + instant = data.get('instant', False) + if instant: + _uid = str(uuid.uuid4()).split('-')[-1] + data['name'] = f'job-{_uid}' + return super().to_internal_value(data) def get_request_user(self): request = self.context.get('request') From 269cf6628abf44c09e1615c6553a0525fce45b61 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 13 Feb 2023 19:52:49 +0800 Subject: [PATCH 11/20] perf: gateway auto (#9529) Co-authored-by: feng <1304903146@qq.com> --- apps/assets/api/domain.py | 4 ++-- apps/assets/tasks/__init__.py | 1 + apps/assets/tasks/ping_gateway.py | 34 +++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 apps/assets/tasks/ping_gateway.py diff --git a/apps/assets/api/domain.py b/apps/assets/api/domain.py index 280a8c40c..c2cf0da65 100644 --- a/apps/assets/api/domain.py +++ b/apps/assets/api/domain.py @@ -5,7 +5,7 @@ from rest_framework.serializers import ValidationError from rest_framework.views import APIView, Response from common.utils import get_logger -from assets.tasks import test_assets_connectivity_manual +from assets.tasks import test_gateways_connectivity_manual from orgs.mixins.api import OrgBulkModelViewSet from .. import serializers from ..models import Domain, Gateway @@ -55,5 +55,5 @@ class GatewayTestConnectionApi(SingleObjectMixin, APIView): local_port = int(local_port) except ValueError: raise ValidationError({'port': _('Number required')}) - task = test_assets_connectivity_manual.delay([gateway.id], local_port) + task = test_gateways_connectivity_manual([gateway.id], local_port) return Response({'task': task.id}) diff --git a/apps/assets/tasks/__init__.py b/apps/assets/tasks/__init__.py index cf2ccd2cd..83dd34e4e 100644 --- a/apps/assets/tasks/__init__.py +++ b/apps/assets/tasks/__init__.py @@ -6,3 +6,4 @@ from .common import * from .automation import * from .gather_facts import * from .nodes_amount import * +from .ping_gateway import * diff --git a/apps/assets/tasks/ping_gateway.py b/apps/assets/tasks/ping_gateway.py new file mode 100644 index 000000000..1af76e347 --- /dev/null +++ b/apps/assets/tasks/ping_gateway.py @@ -0,0 +1,34 @@ +# ~*~ coding: utf-8 ~*~ +from celery import shared_task +from django.utils.translation import gettext_noop + +from assets.const import AutomationTypes +from common.utils import get_logger +from orgs.utils import org_aware_func +from .common import quickstart_automation + +logger = get_logger(__file__) + +__all__ = [ + 'test_gateways_connectivity_task', + 'test_gateways_connectivity_manual', +] + + +@shared_task +@org_aware_func('assets') +def test_gateways_connectivity_task(assets, local_port, task_name=None): + from assets.models import PingAutomation + if task_name is None: + task_name = gettext_noop("Test gateways connectivity ") + + task_name = PingAutomation.generate_unique_name(task_name) + task_snapshot = {'assets': [str(asset.id) for asset in assets], 'local_port': local_port} + quickstart_automation(task_name, AutomationTypes.ping_gateway, task_snapshot) + + +def test_gateways_connectivity_manual(gateway_ids, local_port): + from assets.models import Asset + gateways = Asset.objects.filter(id__in=gateway_ids) + task_name = gettext_noop("Test gateways connectivity ") + return test_gateways_connectivity_task.delay(gateways, local_port, task_name) From 223b73c5c6e89bfaf28c0b260e6bf7e4c3b8c2d9 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 13 Feb 2023 20:04:17 +0800 Subject: [PATCH 12/20] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=20delay=20run?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/signal_handlers/node_assets_amount.py | 2 +- .../signal_handlers/node_assets_mapping.py | 2 +- apps/common/decorators.py | 16 ++++++++++------ utils/generate_fake_data/generate.py | 2 +- utils/generate_fake_data/resources/base.py | 3 ++- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/apps/assets/signal_handlers/node_assets_amount.py b/apps/assets/signal_handlers/node_assets_amount.py index cc1c50b84..361f3a176 100644 --- a/apps/assets/signal_handlers/node_assets_amount.py +++ b/apps/assets/signal_handlers/node_assets_amount.py @@ -24,7 +24,6 @@ def on_node_asset_change(sender, action, instance, reverse, pk_set, **kwargs): if action in refused: raise ValueError - logger.debug('Recv asset nodes change signal, recompute node assets amount') mapper = {PRE_ADD: add, POST_REMOVE: sub} if action not in mapper: return @@ -40,6 +39,7 @@ def on_node_asset_change(sender, action, instance, reverse, pk_set, **kwargs): @merge_delay_run(ttl=5) def update_nodes_assets_amount(node_ids=()): nodes = list(Node.objects.filter(id__in=node_ids)) + logger.debug('Recv asset nodes change signal, recompute node assets amount') logger.info('Update nodes assets amount: {} nodes'.format(len(node_ids))) if len(node_ids) > 100: diff --git a/apps/assets/signal_handlers/node_assets_mapping.py b/apps/assets/signal_handlers/node_assets_mapping.py index b84474033..34b707dab 100644 --- a/apps/assets/signal_handlers/node_assets_mapping.py +++ b/apps/assets/signal_handlers/node_assets_mapping.py @@ -23,6 +23,7 @@ node_assets_mapping_pub_sub = lazy(lambda: RedisPubSub('fm.node_asset_mapping'), @merge_delay_run(ttl=5) def expire_node_assets_mapping(org_ids=()): + logger.debug("Recv asset nodes changed signal, expire memery node asset mapping") # 所有进程清除(自己的 memory 数据) root_org_id = Organization.ROOT_ID Node.expire_node_all_asset_ids_cache_mapping(root_org_id) @@ -53,7 +54,6 @@ def on_node_post_delete(sender, instance, **kwargs): @receiver(m2m_changed, sender=Asset.nodes.through) def on_node_asset_change(sender, instance, **kwargs): - logger.debug("Recv asset nodes changed signal, expire memery node asset mapping") expire_node_assets_mapping(org_ids=(instance.org_id,)) diff --git a/apps/common/decorators.py b/apps/common/decorators.py index 4e31ac0e5..97c715d44 100644 --- a/apps/common/decorators.py +++ b/apps/common/decorators.py @@ -175,13 +175,17 @@ def merge_delay_run(ttl=5, key=None): key_suffix = suffix_key_func(*args, **kwargs) cache_key = f'MERGE_DELAY_RUN_{func_name}_{key_suffix}' cache_kwargs = _loop_debouncer_func_args_cache.get(cache_key, {}) + for k, v in kwargs.items(): - if not isinstance(v, tuple): - raise ValueError('func kwargs value must be list or tuple: %s' % func.__name__) + if not isinstance(v, (tuple, list, set)): + raise ValueError('func kwargs value must be list or tuple: %s %s' % (func.__name__, v)) if k not in cache_kwargs: cache_kwargs[k] = v + elif isinstance(v, set): + cache_kwargs[k] = cache_kwargs[k].union(v) else: cache_kwargs[k] += v + _loop_debouncer_func_args_cache[cache_key] = cache_kwargs run_debouncer_func(cache_key, org, ttl, func, *args, **cache_kwargs) return wrapper @@ -190,11 +194,11 @@ def merge_delay_run(ttl=5, key=None): @delay_run(ttl=5) -def test_delay_run(*username): +def test_delay_run(username): print("Hello, %s, now is %s" % (username, time.time())) -@merge_delay_run(ttl=5, key=lambda *users: users[0][0]) +@merge_delay_run(ttl=5, key=lambda users=(): users[0][0]) def test_merge_delay_run(users=()): name = ','.join(users) time.sleep(2) @@ -206,8 +210,8 @@ def do_test(): print("start : %s" % time.time()) for i in range(100): # test_delay_run('test', year=i) - test_merge_delay_run('test %s' % i) - test_merge_delay_run('best %s' % i) + test_merge_delay_run(users=['test %s' % i]) + test_merge_delay_run(users=['best %s' % i]) test_delay_run('test run %s' % i) end = time.time() diff --git a/utils/generate_fake_data/generate.py b/utils/generate_fake_data/generate.py index 394e27113..0931cca8f 100644 --- a/utils/generate_fake_data/generate.py +++ b/utils/generate_fake_data/generate.py @@ -40,7 +40,7 @@ def main(): default='all', help="resource to generate" ) - parser.add_argument('-c', '--count', type=int, default=10000) + parser.add_argument('-c', '--count', type=int, default=1000) parser.add_argument('-b', '--batch_size', type=int, default=100) parser.add_argument('-o', '--org', type=str, default='') args = parser.parse_args() diff --git a/utils/generate_fake_data/resources/base.py b/utils/generate_fake_data/resources/base.py index 828789dd7..39942d5f1 100644 --- a/utils/generate_fake_data/resources/base.py +++ b/utils/generate_fake_data/resources/base.py @@ -44,5 +44,6 @@ class FakeDataGenerator: using = end - start from_size = created created += len(batch) - print('Generate %s: %s-%s [{}s]' % (self.resource, from_size, created, using)) + print('Generate %s: %s-%s [%s]' % (self.resource, from_size, created, using)) self.after_generate() + time.sleep(20) From 85796acfe4924af649b15bcb460a63a9b48792b0 Mon Sep 17 00:00:00 2001 From: jiangweidong Date: Tue, 14 Feb 2023 09:52:23 +0800 Subject: [PATCH 13/20] =?UTF-8?q?fix:=20=E5=88=9B=E5=BB=BAWeb=E8=B5=84?= =?UTF-8?q?=E4=BA=A7=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/decorators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/decorators.py b/apps/common/decorators.py index 97c715d44..9c4ca3db8 100644 --- a/apps/common/decorators.py +++ b/apps/common/decorators.py @@ -44,7 +44,7 @@ def key_by_org(*args, **kwargs): values = list(kwargs.values()) if not values: return 'default' - return values[0].org_id + return values[0][0].org_id class EventLoopThread(threading.Thread): From 80903d12185c2c573385df3c6971de89e70cb3fc Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Feb 2023 11:29:04 +0800 Subject: [PATCH 14/20] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=AF=86=E9=92=A5=E6=9F=A5=E7=9C=8Brbac=E6=9D=83?= =?UTF-8?q?=E9=99=90=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/accounts/api/account/account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/accounts/api/account/account.py b/apps/accounts/api/account/account.py index 8a9556c50..91319efe7 100644 --- a/apps/accounts/api/account/account.py +++ b/apps/accounts/api/account/account.py @@ -67,8 +67,8 @@ class AccountSecretsViewSet(RecordViewLogMixin, AccountViewSet): http_method_names = ['get', 'options'] permission_classes = [RBACPermission, UserConfirmation.require(ConfirmType.MFA)] rbac_perms = { - 'list': 'assets.view_accountsecret', - 'retrieve': 'assets.view_accountsecret', + 'list': 'accounts.view_accountsecret', + 'retrieve': 'accounts.view_accountsecret', } From 10d776f7e57cecadb77bbec51cabce99495525d0 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Tue, 14 Feb 2023 11:37:18 +0800 Subject: [PATCH 15/20] perf: account name required (#9533) Co-authored-by: feng <1304903146@qq.com> --- apps/accounts/serializers/account/base.py | 1 + apps/assets/serializers/asset/common.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/accounts/serializers/account/base.py b/apps/accounts/serializers/account/base.py index 5882cb7a0..e0b0215ff 100644 --- a/apps/accounts/serializers/account/base.py +++ b/apps/accounts/serializers/account/base.py @@ -77,5 +77,6 @@ class BaseAccountSerializer(AuthValidateMixin, BulkOrgResourceModelSerializer): 'date_verified', 'created_by', 'date_created', ] extra_kwargs = { + 'name': {'required': True}, 'spec_info': {'label': _('Spec info')}, } diff --git a/apps/assets/serializers/asset/common.py b/apps/assets/serializers/asset/common.py index 35a4af460..9b6eb7f85 100644 --- a/apps/assets/serializers/asset/common.py +++ b/apps/assets/serializers/asset/common.py @@ -60,7 +60,7 @@ class AssetAccountSerializer( template = serializers.BooleanField( default=False, label=_("Template"), write_only=True ) - name = serializers.CharField(max_length=128, required=False, label=_("Name")) + name = serializers.CharField(max_length=128, required=True, label=_("Name")) class Meta: model = Account From 18286b674cf9b87b67325e944fca982c6bfd1dc3 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Feb 2023 11:37:57 +0800 Subject: [PATCH 16/20] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BA=91?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=89=A7=E8=A1=8C=E6=8A=A5=E9=94=99=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98(protocols,Asset=3D>Host)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/accounts/api/account/account.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/accounts/api/account/account.py b/apps/accounts/api/account/account.py index 91319efe7..695924122 100644 --- a/apps/accounts/api/account/account.py +++ b/apps/accounts/api/account/account.py @@ -28,9 +28,9 @@ class AccountViewSet(OrgBulkModelViewSet): 'default': serializers.AccountSerializer, } rbac_perms = { - 'verify_account': 'assets.test_account', - 'partial_update': 'assets.change_accountsecret', - 'su_from_accounts': 'assets.view_account', + 'verify_account': 'accounts.test_account', + 'partial_update': ['accounts.change_accountsecret', 'accounts.change_account'], + 'su_from_accounts': 'accounts.view_account', } @action(methods=['get'], detail=False, url_path='su-from-accounts') From eef067c9ca83c285255ef28a10ebfc6ef34fd36d Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Feb 2023 14:17:12 +0800 Subject: [PATCH 17/20] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E6=9F=A5=E7=9C=8B=E7=BB=84=E7=BB=87=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rbac/api/role.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/rbac/api/role.py b/apps/rbac/api/role.py index e2cca9bf0..97c0c76e3 100644 --- a/apps/rbac/api/role.py +++ b/apps/rbac/api/role.py @@ -89,11 +89,15 @@ class RoleViewSet(JMSModelViewSet): class SystemRoleViewSet(RoleViewSet): + perm_model = SystemRole + def get_queryset(self): return super().get_queryset().filter(scope='system') class OrgRoleViewSet(RoleViewSet): + perm_model = OrgRole + def get_queryset(self): return super().get_queryset().filter(scope='org') From 71f3fe64b47f8917a0446441d812e7ab4a4a1049 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Feb 2023 14:36:22 +0800 Subject: [PATCH 18/20] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=B5=84=E4=BA=A7=E6=8E=88=E6=9D=83=E7=9A=84=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=20API=EF=BC=8C=E8=BF=87=E6=BB=A4=E6=9C=AA=E6=BF=80?= =?UTF-8?q?=E6=B4=BB=E7=9A=84=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/perms/utils/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/perms/utils/account.py b/apps/perms/utils/account.py index 5d8180016..16e8bb344 100644 --- a/apps/perms/utils/account.py +++ b/apps/perms/utils/account.py @@ -38,7 +38,7 @@ class PermAccountUtil(AssetPermissionUtil): alias_action_bit_mapper[alias] |= perm.actions alias_expired_mapper[alias].append(perm.date_expired) - asset_accounts = asset.accounts.all() + asset_accounts = asset.accounts.all().active() username_account_mapper = {account.username: account for account in asset_accounts} cleaned_accounts_action_bit = defaultdict(int) From 770e7733e7aa8676aa65465edab6682615d3726d Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Feb 2023 15:34:01 +0800 Subject: [PATCH 19/20] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=B5=84=E4=BA=A7=E5=88=B0=E8=8A=82=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=B5=84=E4=BA=A7=E4=BB=8E=E8=8A=82=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E7=A7=BB=E5=8A=A8=E8=B5=84=E4=BA=A7=E5=88=B0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=20API=20rbac=20=E6=9D=83=E9=99=90=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/node.py | 14 +++++ apps/assets/models/asset/common.py | 1 + apps/common/decorators.py | 2 +- apps/locale/ja/LC_MESSAGES/django.po | 88 ++++++++++++++++------------ apps/locale/zh/LC_MESSAGES/django.po | 88 ++++++++++++++++------------ 5 files changed, 114 insertions(+), 79 deletions(-) diff --git a/apps/assets/api/node.py b/apps/assets/api/node.py index e690b8ebf..40d8aed97 100644 --- a/apps/assets/api/node.py +++ b/apps/assets/api/node.py @@ -11,6 +11,7 @@ from rest_framework.response import Response from rest_framework.serializers import ValidationError from assets.models import Asset +from rbac.permissions import RBACPermission from common.api import SuggestionMixin from common.const.http import POST from common.const.signals import PRE_REMOVE, POST_REMOVE @@ -27,6 +28,7 @@ from ..tasks import ( check_node_assets_amount_task ) + logger = get_logger(__file__) __all__ = [ 'NodeViewSet', 'NodeAssetsApi', 'NodeAddAssetsApi', @@ -100,6 +102,10 @@ class NodeAddAssetsApi(generics.UpdateAPIView): model = Node serializer_class = serializers.NodeAssetsSerializer instance = None + permission_classes = (RBACPermission,) + rbac_perms = { + 'PUT': 'assets.add_assettonode', + } def perform_update(self, serializer): assets = serializer.validated_data.get('assets') @@ -111,6 +117,10 @@ class NodeRemoveAssetsApi(generics.UpdateAPIView): model = Node serializer_class = serializers.NodeAssetsSerializer instance = None + permission_classes = (RBACPermission,) + rbac_perms = { + 'PUT': 'assets.remove_assetfromnode', + } def perform_update(self, serializer): assets = serializer.validated_data.get('assets') @@ -129,6 +139,10 @@ class MoveAssetsToNodeApi(generics.UpdateAPIView): model = Node serializer_class = serializers.NodeAssetsSerializer instance = None + permission_classes = (RBACPermission,) + rbac_perms = { + 'PUT': 'assets.move_assettonode', + } def perform_update(self, serializer): assets = serializer.validated_data.get('assets') diff --git a/apps/assets/models/asset/common.py b/apps/assets/models/asset/common.py index f68fb9904..fdf23f20e 100644 --- a/apps/assets/models/asset/common.py +++ b/apps/assets/models/asset/common.py @@ -289,4 +289,5 @@ class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel): ('match_asset', _('Can match asset')), ('add_assettonode', _('Add asset to node')), ('move_assettonode', _('Move asset to node')), + ('remove_assetfromnode', _('Remove asset from node')) ] diff --git a/apps/common/decorators.py b/apps/common/decorators.py index 9c4ca3db8..c100c5025 100644 --- a/apps/common/decorators.py +++ b/apps/common/decorators.py @@ -184,7 +184,7 @@ def merge_delay_run(ttl=5, key=None): elif isinstance(v, set): cache_kwargs[k] = cache_kwargs[k].union(v) else: - cache_kwargs[k] += v + cache_kwargs[k] = list(cache_kwargs[k]) + list(v) _loop_debouncer_func_args_cache[cache_key] = cache_kwargs run_debouncer_func(cache_key, org, ttl, func, *args, **cache_kwargs) diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po index cb15dc780..1f58ed035 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: 2023-02-13 15:27+0800\n" +"POT-Creation-Date: 2023-02-14 15:32+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -243,7 +243,7 @@ msgstr "アカウントバックアップ計画" #: accounts/models/automations/backup_account.py:77 #: assets/models/automations/base.py:106 audits/models.py:43 -#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:113 +#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:114 #: perms/models/asset_permission.py:72 terminal/models/applet/host.py:108 #: terminal/models/session/session.py:43 #: tickets/models/ticket/apply_application.py:30 @@ -277,7 +277,7 @@ msgstr "理由" #: accounts/models/automations/backup_account.py:93 #: accounts/serializers/automations/change_secret.py:106 #: accounts/serializers/automations/change_secret.py:129 -#: ops/serializers/job.py:54 terminal/serializers/session.py:49 +#: ops/serializers/job.py:64 terminal/serializers/session.py:49 msgid "Is success" msgstr "成功は" @@ -365,7 +365,7 @@ msgstr "開始日" #: accounts/models/automations/change_secret.py:74 #: assets/models/automations/base.py:107 ops/models/base.py:56 -#: ops/models/celery.py:64 ops/models/job.py:114 +#: ops/models/celery.py:64 ops/models/job.py:115 #: terminal/models/applet/host.py:109 msgid "Date finished" msgstr "終了日" @@ -427,9 +427,9 @@ msgstr "アカウントの確認" #: assets/serializers/asset/common.py:63 assets/serializers/asset/common.py:137 #: assets/serializers/platform.py:128 #: authentication/serializers/connect_token_secret.py:103 ops/mixin.py:20 -#: ops/models/adhoc.py:22 ops/models/celery.py:15 ops/models/celery.py:57 -#: ops/models/job.py:24 ops/models/playbook.py:15 orgs/models.py:69 -#: perms/models/asset_permission.py:56 rbac/models/role.py:29 +#: ops/models/adhoc.py:21 ops/models/celery.py:15 ops/models/celery.py:57 +#: ops/models/job.py:24 ops/models/playbook.py:22 ops/serializers/job.py:19 +#: orgs/models.py:69 perms/models/asset_permission.py:56 rbac/models/role.py:29 #: settings/models.py:33 settings/serializers/sms.py:6 #: terminal/models/applet/applet.py:26 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:90 @@ -581,7 +581,7 @@ msgstr "キー/パスワード" msgid "Key password" msgstr "キーパスワード" -#: accounts/serializers/account/base.py:80 +#: accounts/serializers/account/base.py:81 #: assets/serializers/asset/common.py:280 msgid "Spec info" msgstr "特別情報" @@ -738,7 +738,7 @@ msgid "User" msgstr "ユーザー" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: ops/serializers/job.py:53 terminal/models/session/session.py:41 +#: ops/serializers/job.py:63 terminal/models/session/session.py:41 #: terminal/serializers/command.py:17 terminal/serializers/session.py:19 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -919,15 +919,15 @@ msgstr "" msgid "Number required" msgstr "必要な数" -#: assets/api/node.py:56 +#: assets/api/node.py:58 msgid "You can't update the root node name" msgstr "ルートノード名を更新できません" -#: assets/api/node.py:63 +#: assets/api/node.py:65 msgid "You can't delete the root node ({})" msgstr "ルートノード ({}) を削除できません。" -#: assets/api/node.py:66 +#: assets/api/node.py:68 msgid "Deletion failed and the node contains assets" msgstr "削除に失敗し、ノードにアセットが含まれています。" @@ -1055,8 +1055,8 @@ msgstr "SSHパブリックキー" #: assets/models/_user.py:27 assets/models/cmd_filter.py:40 #: assets/models/cmd_filter.py:88 assets/models/group.py:23 -#: assets/models/platform.py:79 common/db/models.py:37 ops/models/adhoc.py:28 -#: ops/models/job.py:40 ops/models/playbook.py:18 rbac/models/role.py:37 +#: assets/models/platform.py:79 common/db/models.py:37 ops/models/adhoc.py:27 +#: ops/models/job.py:40 ops/models/playbook.py:25 rbac/models/role.py:37 #: settings/models.py:38 terminal/models/applet/applet.py:35 #: terminal/models/applet/applet.py:151 terminal/models/applet/host.py:110 #: terminal/models/component/endpoint.py:24 @@ -1069,7 +1069,7 @@ msgstr "コメント" #: assets/models/_user.py:28 assets/models/automations/base.py:105 #: assets/models/cmd_filter.py:41 assets/models/group.py:22 -#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:112 +#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:113 #: users/models/user.py:943 msgid "Date created" msgstr "作成された日付" @@ -1206,6 +1206,10 @@ msgstr "ノードにアセットを追加する" msgid "Move asset to node" msgstr "アセットをノードに移動する" +#: assets/models/asset/common.py:292 +msgid "Remove asset from node" +msgstr "ノードからアセットを削除" + #: assets/models/asset/database.py:10 assets/serializers/asset/common.py:105 #: settings/serializers/email.py:37 msgid "Use SSL" @@ -1261,7 +1265,7 @@ msgid "Asset automation task" msgstr "アセットの自動化タスク" #: assets/models/automations/base.py:104 audits/models.py:163 -#: audits/serializers.py:50 ops/models/base.py:49 ops/models/job.py:105 +#: audits/serializers.py:50 ops/models/base.py:49 ops/models/job.py:106 #: terminal/models/applet/applet.py:150 terminal/models/applet/host.py:107 #: terminal/models/component/status.py:27 terminal/serializers/applet.py:17 #: terminal/serializers/applet_host.py:93 tickets/models/ticket/general.py:283 @@ -1666,6 +1670,12 @@ msgstr "ノードの下にあるアセットの数を定期的に確認する" msgid "Test if the assets under the node are connectable " msgstr "ノード配下のアセットが接続できるかテストする" +#: assets/tasks/ping_gateway.py:23 assets/tasks/ping_gateway.py:33 +#, fuzzy +#| msgid "Test assets connectivity " +msgid "Test gateways connectivity " +msgstr "アセット接続のテスト。" + #: assets/tasks/utils.py:17 msgid "Asset has been disabled, skipped: {}" msgstr "資産が無効化されました。スキップ: {}" @@ -3186,15 +3196,15 @@ msgstr "システムメッセージ" msgid "Publish the station message" msgstr "投稿サイトニュース" -#: ops/ansible/inventory.py:76 +#: ops/ansible/inventory.py:77 msgid "No account available" msgstr "利用可能なアカウントがありません" -#: ops/ansible/inventory.py:182 +#: ops/ansible/inventory.py:186 msgid "Ansible disabled" msgstr "Ansible 無効" -#: ops/ansible/inventory.py:198 +#: ops/ansible/inventory.py:202 msgid "Skip hosts below:" msgstr "次のホストをスキップします: " @@ -3299,21 +3309,21 @@ msgstr "{} から {} までの範囲" msgid "Require periodic or regularly perform setting" msgstr "定期的または定期的に設定を行う必要があります" -#: ops/models/adhoc.py:23 +#: ops/models/adhoc.py:22 msgid "Pattern" msgstr "パターン" -#: ops/models/adhoc.py:25 ops/models/job.py:28 +#: ops/models/adhoc.py:24 ops/models/job.py:28 msgid "Module" msgstr "モジュール" -#: ops/models/adhoc.py:26 ops/models/celery.py:58 ops/models/job.py:26 +#: ops/models/adhoc.py:25 ops/models/celery.py:58 ops/models/job.py:26 #: terminal/models/component/task.py:16 msgid "Args" msgstr "アルグ" -#: ops/models/adhoc.py:27 ops/models/base.py:16 ops/models/base.py:53 -#: ops/models/job.py:33 ops/models/job.py:111 ops/models/playbook.py:17 +#: ops/models/adhoc.py:26 ops/models/base.py:16 ops/models/base.py:53 +#: ops/models/job.py:33 ops/models/job.py:112 ops/models/playbook.py:24 #: terminal/models/session/sharing.py:23 msgid "Creator" msgstr "作成者" @@ -3330,16 +3340,16 @@ msgstr "アカウント ポリシー" msgid "Last execution" msgstr "最後の実行" -#: ops/models/base.py:22 ops/serializers/job.py:16 +#: ops/models/base.py:22 ops/serializers/job.py:18 msgid "Date last run" msgstr "最終実行日" -#: ops/models/base.py:51 ops/models/job.py:109 +#: ops/models/base.py:51 ops/models/job.py:110 #: xpack/plugins/cloud/models.py:162 msgid "Result" msgstr "結果" -#: ops/models/base.py:52 ops/models/job.py:110 +#: ops/models/base.py:52 ops/models/job.py:111 msgid "Summary" msgstr "概要" @@ -3407,31 +3417,31 @@ msgstr "パラメータ定義" msgid "Job" msgstr "ジョブ#ジョブ#" -#: ops/models/job.py:108 +#: ops/models/job.py:109 msgid "Parameters" msgstr "パラメータ" -#: ops/models/job.py:116 +#: ops/models/job.py:117 msgid "Material" msgstr "" -#: ops/models/job.py:118 +#: ops/models/job.py:119 msgid "Material Type" msgstr "" -#: ops/models/job.py:311 +#: ops/models/job.py:322 msgid "Job Execution" msgstr "ジョブ実行" -#: ops/models/job.py:322 +#: ops/models/job.py:333 msgid "Job audit log" msgstr "ジョブ監査ログ" -#: ops/models/playbook.py:20 +#: ops/models/playbook.py:27 msgid "CreateMethod" msgstr "创建方式" -#: ops/models/playbook.py:21 +#: ops/models/playbook.py:28 msgid "VCS URL" msgstr "" @@ -3463,19 +3473,19 @@ msgstr "{max_threshold}%: => {value} を超える使用メモリ" msgid "CPU load more than {max_threshold}: => {value}" msgstr "{max_threshold} を超えるCPUロード: => {value}" -#: ops/serializers/job.py:14 +#: ops/serializers/job.py:16 msgid "Run after save" msgstr "保存後に実行" -#: ops/serializers/job.py:52 +#: ops/serializers/job.py:62 msgid "Job type" msgstr "タスクの種類" -#: ops/serializers/job.py:55 terminal/serializers/session.py:53 +#: ops/serializers/job.py:65 terminal/serializers/session.py:53 msgid "Is finished" msgstr "終了しました" -#: ops/serializers/job.py:56 +#: ops/serializers/job.py:66 msgid "Time cost" msgstr "時を過ごす" @@ -3917,7 +3927,7 @@ msgstr "権限ツリーの表示" msgid "Test success" msgstr "テストの成功" -#: settings/api/email.py:20 +#: settings/api/email.py:21 msgid "Test mail sent to {}, please check" msgstr "{}に送信されたテストメールを確認してください" diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 147f02f03..229710b0f 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: 2023-02-13 15:27+0800\n" +"POT-Creation-Date: 2023-02-14 15:32+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -242,7 +242,7 @@ msgstr "账号备份计划" #: accounts/models/automations/backup_account.py:77 #: assets/models/automations/base.py:106 audits/models.py:43 -#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:113 +#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:114 #: perms/models/asset_permission.py:72 terminal/models/applet/host.py:108 #: terminal/models/session/session.py:43 #: tickets/models/ticket/apply_application.py:30 @@ -276,7 +276,7 @@ msgstr "原因" #: accounts/models/automations/backup_account.py:93 #: accounts/serializers/automations/change_secret.py:106 #: accounts/serializers/automations/change_secret.py:129 -#: ops/serializers/job.py:54 terminal/serializers/session.py:49 +#: ops/serializers/job.py:64 terminal/serializers/session.py:49 msgid "Is success" msgstr "是否成功" @@ -364,7 +364,7 @@ msgstr "开始日期" #: accounts/models/automations/change_secret.py:74 #: assets/models/automations/base.py:107 ops/models/base.py:56 -#: ops/models/celery.py:64 ops/models/job.py:114 +#: ops/models/celery.py:64 ops/models/job.py:115 #: terminal/models/applet/host.py:109 msgid "Date finished" msgstr "结束日期" @@ -426,9 +426,9 @@ msgstr "账号验证" #: assets/serializers/asset/common.py:63 assets/serializers/asset/common.py:137 #: assets/serializers/platform.py:128 #: authentication/serializers/connect_token_secret.py:103 ops/mixin.py:20 -#: ops/models/adhoc.py:22 ops/models/celery.py:15 ops/models/celery.py:57 -#: ops/models/job.py:24 ops/models/playbook.py:15 orgs/models.py:69 -#: perms/models/asset_permission.py:56 rbac/models/role.py:29 +#: ops/models/adhoc.py:21 ops/models/celery.py:15 ops/models/celery.py:57 +#: ops/models/job.py:24 ops/models/playbook.py:22 ops/serializers/job.py:19 +#: orgs/models.py:69 perms/models/asset_permission.py:56 rbac/models/role.py:29 #: settings/models.py:33 settings/serializers/sms.py:6 #: terminal/models/applet/applet.py:26 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:90 @@ -577,7 +577,7 @@ msgstr "密钥/密码" msgid "Key password" msgstr "密钥密码" -#: accounts/serializers/account/base.py:80 +#: accounts/serializers/account/base.py:81 #: assets/serializers/asset/common.py:280 msgid "Spec info" msgstr "特殊信息" @@ -734,7 +734,7 @@ msgid "User" msgstr "用户" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: ops/serializers/job.py:53 terminal/models/session/session.py:41 +#: ops/serializers/job.py:63 terminal/models/session/session.py:41 #: terminal/serializers/command.py:17 terminal/serializers/session.py:19 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -909,15 +909,15 @@ msgstr "不能直接创建资产, 你应该创建主机或其他资产" msgid "Number required" msgstr "需要为数字" -#: assets/api/node.py:56 +#: assets/api/node.py:58 msgid "You can't update the root node name" msgstr "不能修改根节点名称" -#: assets/api/node.py:63 +#: assets/api/node.py:65 msgid "You can't delete the root node ({})" msgstr "不能删除根节点 ({})" -#: assets/api/node.py:66 +#: assets/api/node.py:68 msgid "Deletion failed and the node contains assets" msgstr "删除失败,节点包含资产" @@ -1045,8 +1045,8 @@ msgstr "SSH公钥" #: assets/models/_user.py:27 assets/models/cmd_filter.py:40 #: assets/models/cmd_filter.py:88 assets/models/group.py:23 -#: assets/models/platform.py:79 common/db/models.py:37 ops/models/adhoc.py:28 -#: ops/models/job.py:40 ops/models/playbook.py:18 rbac/models/role.py:37 +#: assets/models/platform.py:79 common/db/models.py:37 ops/models/adhoc.py:27 +#: ops/models/job.py:40 ops/models/playbook.py:25 rbac/models/role.py:37 #: settings/models.py:38 terminal/models/applet/applet.py:35 #: terminal/models/applet/applet.py:151 terminal/models/applet/host.py:110 #: terminal/models/component/endpoint.py:24 @@ -1059,7 +1059,7 @@ msgstr "备注" #: assets/models/_user.py:28 assets/models/automations/base.py:105 #: assets/models/cmd_filter.py:41 assets/models/group.py:22 -#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:112 +#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:113 #: users/models/user.py:943 msgid "Date created" msgstr "创建日期" @@ -1196,6 +1196,10 @@ msgstr "添加资产到节点" msgid "Move asset to node" msgstr "移动资产到节点" +#: assets/models/asset/common.py:292 +msgid "Remove asset from node" +msgstr "从节点移除资产" + #: assets/models/asset/database.py:10 assets/serializers/asset/common.py:105 #: settings/serializers/email.py:37 msgid "Use SSL" @@ -1251,7 +1255,7 @@ msgid "Asset automation task" msgstr "资产自动化任务" #: assets/models/automations/base.py:104 audits/models.py:163 -#: audits/serializers.py:50 ops/models/base.py:49 ops/models/job.py:105 +#: audits/serializers.py:50 ops/models/base.py:49 ops/models/job.py:106 #: terminal/models/applet/applet.py:150 terminal/models/applet/host.py:107 #: terminal/models/component/status.py:27 terminal/serializers/applet.py:17 #: terminal/serializers/applet_host.py:93 tickets/models/ticket/general.py:283 @@ -1654,6 +1658,12 @@ msgstr "周期性检查节点下资产数量" msgid "Test if the assets under the node are connectable " msgstr "测试节点下资产是否可连接" +#: assets/tasks/ping_gateway.py:23 assets/tasks/ping_gateway.py:33 +#, fuzzy +#| msgid "Test assets connectivity " +msgid "Test gateways connectivity " +msgstr "测试资产可连接性" + #: assets/tasks/utils.py:17 msgid "Asset has been disabled, skipped: {}" msgstr "资产已经被禁用, 跳过: {}" @@ -3148,15 +3158,15 @@ msgstr "系统信息" msgid "Publish the station message" msgstr "发布站内消息" -#: ops/ansible/inventory.py:76 +#: ops/ansible/inventory.py:77 msgid "No account available" msgstr "无可用账号" -#: ops/ansible/inventory.py:182 +#: ops/ansible/inventory.py:186 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:198 +#: ops/ansible/inventory.py:202 msgid "Skip hosts below:" msgstr "跳过以下主机: " @@ -3261,21 +3271,21 @@ msgstr "输入在 {} - {} 范围之间" msgid "Require periodic or regularly perform setting" msgstr "需要周期或定期设置" -#: ops/models/adhoc.py:23 +#: ops/models/adhoc.py:22 msgid "Pattern" msgstr "模式" -#: ops/models/adhoc.py:25 ops/models/job.py:28 +#: ops/models/adhoc.py:24 ops/models/job.py:28 msgid "Module" msgstr "模块" -#: ops/models/adhoc.py:26 ops/models/celery.py:58 ops/models/job.py:26 +#: ops/models/adhoc.py:25 ops/models/celery.py:58 ops/models/job.py:26 #: terminal/models/component/task.py:16 msgid "Args" msgstr "参数" -#: ops/models/adhoc.py:27 ops/models/base.py:16 ops/models/base.py:53 -#: ops/models/job.py:33 ops/models/job.py:111 ops/models/playbook.py:17 +#: ops/models/adhoc.py:26 ops/models/base.py:16 ops/models/base.py:53 +#: ops/models/job.py:33 ops/models/job.py:112 ops/models/playbook.py:24 #: terminal/models/session/sharing.py:23 msgid "Creator" msgstr "创建者" @@ -3292,16 +3302,16 @@ msgstr "账号策略" msgid "Last execution" msgstr "最后执行" -#: ops/models/base.py:22 ops/serializers/job.py:16 +#: ops/models/base.py:22 ops/serializers/job.py:18 msgid "Date last run" msgstr "最后运行日期" -#: ops/models/base.py:51 ops/models/job.py:109 +#: ops/models/base.py:51 ops/models/job.py:110 #: xpack/plugins/cloud/models.py:162 msgid "Result" msgstr "结果" -#: ops/models/base.py:52 ops/models/job.py:110 +#: ops/models/base.py:52 ops/models/job.py:111 msgid "Summary" msgstr "汇总" @@ -3369,31 +3379,31 @@ msgstr "参数定义" msgid "Job" msgstr "作业" -#: ops/models/job.py:108 +#: ops/models/job.py:109 msgid "Parameters" msgstr "参数" -#: ops/models/job.py:116 +#: ops/models/job.py:117 msgid "Material" msgstr "" -#: ops/models/job.py:118 +#: ops/models/job.py:119 msgid "Material Type" msgstr "" -#: ops/models/job.py:311 +#: ops/models/job.py:322 msgid "Job Execution" msgstr "作业执行" -#: ops/models/job.py:322 +#: ops/models/job.py:333 msgid "Job audit log" msgstr "作业审计日志" -#: ops/models/playbook.py:20 +#: ops/models/playbook.py:27 msgid "CreateMethod" msgstr "创建方式" -#: ops/models/playbook.py:21 +#: ops/models/playbook.py:28 msgid "VCS URL" msgstr "" @@ -3425,19 +3435,19 @@ msgstr "内存使用率超过 {max_threshold}%: => {value}" msgid "CPU load more than {max_threshold}: => {value}" msgstr "CPU 使用率超过 {max_threshold}: => {value}" -#: ops/serializers/job.py:14 +#: ops/serializers/job.py:16 msgid "Run after save" msgstr "保存后执行" -#: ops/serializers/job.py:52 +#: ops/serializers/job.py:62 msgid "Job type" msgstr "任务类型" -#: ops/serializers/job.py:55 terminal/serializers/session.py:53 +#: ops/serializers/job.py:65 terminal/serializers/session.py:53 msgid "Is finished" msgstr "是否完成" -#: ops/serializers/job.py:56 +#: ops/serializers/job.py:66 msgid "Time cost" msgstr "花费时间" @@ -3877,7 +3887,7 @@ msgstr "查看授权树" msgid "Test success" msgstr "测试成功" -#: settings/api/email.py:20 +#: settings/api/email.py:21 msgid "Test mail sent to {}, please check" msgstr "邮件已经发送{}, 请检查" From 5c98fbbefd1f7b1a4407d090b6b8916c1d304697 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Feb 2023 15:35:00 +0800 Subject: [PATCH 20/20] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=B5=84=E4=BA=A7=E5=88=B0=E8=8A=82=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=B5=84=E4=BA=A7=E4=BB=8E=E8=8A=82=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E7=A7=BB=E5=8A=A8=E8=B5=84=E4=BA=A7=E5=88=B0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=20API=20rbac=20=E6=9D=83=E9=99=90=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/ja/LC_MESSAGES/django.mo | 4 ++-- apps/locale/zh/LC_MESSAGES/django.mo | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/locale/ja/LC_MESSAGES/django.mo b/apps/locale/ja/LC_MESSAGES/django.mo index 6ec8b8639..c4aed5cf6 100644 --- a/apps/locale/ja/LC_MESSAGES/django.mo +++ b/apps/locale/ja/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99adbe0952fdda576b1c80cf6d2b225afe44e3c9eb0acceff4cc118aee99059e -size 135275 +oid sha256:6a677ea531b36752e5d3cbfde37bd2667539390e12281b7a4c595fa4d65c1a8a +size 135351 diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index fc1bc66c3..29a2d498d 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:6a44c3375cf46c5740eb617e0ce1828a10ee82924cdd06075cc3c71d1d5075e9 -size 111193 +oid sha256:3ea4776e6efd07b7d818b5f64d68b14d0c1cbf089766582bd4c2b43e1b183bf8 +size 111254