diff --git a/apps/audits/api.py b/apps/audits/api.py index fd977ab23..955d356bf 100644 --- a/apps/audits/api.py +++ b/apps/audits/api.py @@ -5,22 +5,22 @@ from importlib import import_module from django.conf import settings from django.db.models import F, Value, CharField from rest_framework import generics -from rest_framework.permissions import IsAuthenticated from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin +from rest_framework.permissions import IsAuthenticated -from ops.models.job import JobAuditLog from common.api import JMSGenericViewSet from common.drf.filters import DatetimeRangeFilter from common.plugins.es import QuerySet as ESQuerySet -from orgs.utils import current_org, tmp_to_root_org +from ops.models.job import JobAuditLog from orgs.mixins.api import OrgGenericViewSet, OrgBulkModelViewSet +from orgs.utils import current_org, tmp_to_root_org from .backends import TYPE_ENGINE_MAPPING from .const import ActivityChoices from .models import FTPLog, UserLoginLog, OperateLog, PasswordChangeLog, ActivityLog from .serializers import FTPLogSerializer, UserLoginLogSerializer, JobAuditLogSerializer from .serializers import ( OperateLogSerializer, OperateLogActionDetailSerializer, - PasswordChangeLogSerializer, ActivityOperatorLogSerializer, + PasswordChangeLogSerializer, ActivityUnionLogSerializer, ) @@ -79,7 +79,7 @@ class MyLoginLogAPIView(UserLoginCommonMixin, generics.ListAPIView): class ResourceActivityAPIView(generics.ListAPIView): - serializer_class = ActivityOperatorLogSerializer + serializer_class = ActivityUnionLogSerializer rbac_perms = { 'GET': 'audits.view_activitylog', } @@ -96,10 +96,10 @@ class ResourceActivityAPIView(generics.ListAPIView): @staticmethod def get_activity_log_qs(fields, limit=30, **filters): queryset = ActivityLog.objects.filter(**filters).annotate( - r_type=F('type'), r_detail_id=F('detail_id'), - r_detail=F('detail'), r_user=Value(None, CharField()), - r_action=Value(None, CharField()), - ).values(*fields)[:limit] + r_type=F('type'), r_detail_id=F('detail_id'), + r_detail=F('detail'), r_user=Value(None, CharField()), + r_action=Value(None, CharField()), + ).values(*fields)[:limit] return queryset def get_queryset(self): @@ -113,7 +113,7 @@ class ResourceActivityAPIView(generics.ListAPIView): qs1 = self.get_operate_log_qs(fields, resource_id=resource_id) qs2 = self.get_activity_log_qs(fields, resource_id=resource_id) queryset = qs2.union(qs1) - return queryset[:limit] + return queryset.order_by('-datetime')[:limit] class OperateLogViewSet(RetrieveModelMixin, ListModelMixin, OrgGenericViewSet): @@ -163,54 +163,3 @@ class PasswordChangeLogViewSet(ListModelMixin, JMSGenericViewSet): user__in=[str(user) for user in users] ) return queryset - -# Todo: 看看怎么搞 -# class CommandExecutionViewSet(ListModelMixin, OrgGenericViewSet): -# model = CommandExecution -# serializer_class = CommandExecutionSerializer -# extra_filter_backends = [DatetimeRangeFilter] -# date_range_filter_fields = [ -# ('date_start', ('date_from', 'date_to')) -# ] -# filterset_fields = [ -# 'user__name', 'user__username', 'command', -# 'account', 'is_finished' -# ] -# search_fields = [ -# 'command', 'user__name', 'user__username', -# 'account__username', -# ] -# ordering = ['-date_created'] -# -# def get_queryset(self): -# queryset = super().get_queryset() -# if getattr(self, 'swagger_fake_view', False): -# return queryset.model.objects.none() -# if current_org.is_root(): -# return queryset -# # queryset = queryset.filter(run_as__org_id=current_org.org_id()) -# return queryset -# -# -# class CommandExecutionHostRelationViewSet(OrgRelationMixin, OrgBulkModelViewSet): -# serializer_class = CommandExecutionHostsRelationSerializer -# m2m_field = CommandExecution.hosts.field -# filterset_fields = [ -# 'id', 'asset', 'commandexecution' -# ] -# search_fields = ('asset__name', ) -# http_method_names = ['options', 'get'] -# rbac_perms = { -# 'GET': 'ops.view_commandexecution', -# 'list': 'ops.view_commandexecution', -# } -# -# def get_queryset(self): -# queryset = super().get_queryset() -# queryset = queryset.annotate( -# asset_display=Concat( -# F('asset__name'), Value('('), -# F('asset__address'), Value(')') -# ) -# ) -# return queryset diff --git a/apps/audits/migrations/0018_operatelog_resource_id.py b/apps/audits/migrations/0018_operatelog_resource_id.py index 44953cae3..9e99e1e3f 100644 --- a/apps/audits/migrations/0018_operatelog_resource_id.py +++ b/apps/audits/migrations/0018_operatelog_resource_id.py @@ -15,4 +15,8 @@ class Migration(migrations.Migration): name='resource_id', field=models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Resource'), ), + migrations.AlterModelOptions( + name='operatelog', + options={'ordering': ('-datetime',), 'verbose_name': 'Operate log'}, + ), ] diff --git a/apps/audits/migrations/0019_alter_operatelog_options.py b/apps/audits/migrations/0019_alter_operatelog_options.py index c6ebcb76c..2039fb221 100644 --- a/apps/audits/migrations/0019_alter_operatelog_options.py +++ b/apps/audits/migrations/0019_alter_operatelog_options.py @@ -10,8 +10,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AlterModelOptions( - name='operatelog', - options={'ordering': ('-datetime',), 'verbose_name': 'Operate log'}, - ), ] diff --git a/apps/audits/migrations/0020_auto_20230117_1004.py b/apps/audits/migrations/0020_auto_20230117_1004.py index 4261bd635..4270b0642 100644 --- a/apps/audits/migrations/0020_auto_20230117_1004.py +++ b/apps/audits/migrations/0020_auto_20230117_1004.py @@ -39,11 +39,6 @@ class Migration(migrations.Migration): name='diff', field=models.JSONField(default=dict, encoder=common.db.encoder.ModelJSONFieldEncoder, null=True), ), - migrations.AddField( - model_name='operatelog', - name='detail', - field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Detail'), - ), migrations.RunPython(migrate_operate_log_after_before), migrations.RemoveField(model_name='operatelog', name='after', ), migrations.RemoveField(model_name='operatelog', name='before', ), diff --git a/apps/audits/serializers.py b/apps/audits/serializers.py index bc260dbb7..7c81834b7 100644 --- a/apps/audits/serializers.py +++ b/apps/audits/serializers.py @@ -5,7 +5,7 @@ from rest_framework import serializers from audits.backends.db import OperateLogStore from common.serializers.fields import LabeledChoiceField -from common.utils import reverse +from common.utils import reverse, i18n_trans from common.utils.timezone import as_current_tz from ops.models.job import JobAuditLog from ops.serializers.job import JobExecutionSerializer @@ -106,7 +106,7 @@ class SessionAuditSerializer(serializers.ModelSerializer): fields = "__all__" -class ActivityOperatorLogSerializer(serializers.Serializer): +class ActivityUnionLogSerializer(serializers.Serializer): timestamp = serializers.SerializerMethodField() detail_url = serializers.SerializerMethodField() content = serializers.SerializerMethodField() @@ -119,9 +119,9 @@ class ActivityOperatorLogSerializer(serializers.Serializer): def get_content(obj): if not obj['r_detail']: action = obj['r_action'].replace('_', ' ').capitalize() - ctn = _('User {} {} this resource.').format(obj['r_user'], _(action)) + ctn = _('User {} {} this resource').format(obj['r_user'], _(action)) else: - ctn = obj['r_detail'] + ctn = i18n_trans(obj['r_detail']) return ctn @staticmethod diff --git a/apps/audits/signal_handlers/activity_log.py b/apps/audits/signal_handlers/activity_log.py index 8254dce93..fe0553ce8 100644 --- a/apps/audits/signal_handlers/activity_log.py +++ b/apps/audits/signal_handlers/activity_log.py @@ -2,13 +2,13 @@ # from celery import signals from django.db.models.signals import post_save -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, gettext_noop from accounts.const import AutomationTypes from accounts.models import AccountBackupAutomation from assets.models import Asset, Node from audits.models import ActivityLog -from common.utils import get_object_or_none +from common.utils import get_object_or_none, i18n_fmt from jumpserver.utils import current_request from ops.celery import app from orgs.utils import tmp_to_root_org @@ -108,21 +108,21 @@ class ActivityLogHandler(object): @staticmethod def session_for_activity(obj): - detail = _( - '{} used account[{}], login method[{}] login the asset.' - ).format( - obj.user, obj.account, obj.login_from_display + detail = i18n_fmt( + gettext_noop('User %s use account %s login asset %s'), + obj.user, obj.account, obj.asset ) - return obj.asset_id, detail, ActivityChoices.session_log + return [obj.asset_id, obj.user_id, obj.account_id], detail, ActivityChoices.session_log @staticmethod def login_log_for_activity(obj): - login_status = _('Success') if obj.status else _('Failed') - detail = _('User {} login this system {}').format( - obj.username, login_status - ) + login_status = gettext_noop('Success') if obj.status else gettext_noop('Failed') + detail = i18n_fmt(gettext_noop('User %s login system %s'), obj.username, login_status) user_id = User.objects.filter(username=obj.username).values('id').first() - return user_id['id'], detail, ActivityChoices.login_log + resource_list = [] + if user_id: + resource_list = [user_id['id']] + return resource_list, detail, ActivityChoices.login_log activity_handler = ActivityLogHandler() @@ -135,18 +135,20 @@ def before_task_publish_for_activity_log(headers=None, **kwargs): task_display, resource_ids = activity_handler.get_celery_task_info( task_name, args, **kwargs ) - activities = [] - detail = _('User %s performs a task(%s) for this resource.') % ( - getattr(current_request, 'user', None), task_display - ) - for resource_id in resource_ids: - activities.append( - ActivityLog( - resource_id=resource_id, type=ActivityChoices.task, detail=detail - ) - ) - ActivityLog.objects.bulk_create(activities) + if not current_request: + user = 'System' + else: + user = str(current_request.user) + detail = i18n_fmt( + gettext_noop('User %s perform a task (%s) for this resource'), + user, task_display + ) + activities = [ + ActivityLog(resource_id=resource_id, type=ActivityChoices.task, detail=detail) + for resource_id in resource_ids + ] + ActivityLog.objects.bulk_create(activities) activity_info = { 'activity_ids': [a.id for a in activities] } @@ -167,9 +169,7 @@ def on_celery_task_pre_run_for_activity_log(task_id='', **kwargs): ActivityLog.objects.bulk_update(activities, ('detail_id',)) -def on_session_or_login_log_created( - sender, instance=None, created=False, **kwargs -): +def on_session_or_login_log_created(sender, instance=None, created=False, **kwargs): handler_mapping = { 'Session': activity_handler.session_for_activity, 'UserLoginLog': activity_handler.login_log_for_activity @@ -178,13 +178,13 @@ def on_session_or_login_log_created( if not created or model_name not in handler_mapping: return - resource_id, detail, act_type = handler_mapping[model_name](instance) - - ActivityLog.objects.create( - resource_id=resource_id, type=act_type, - detail=detail, detail_id=instance.id - ) + resource_ids, detail, act_type = handler_mapping[model_name](instance) + activities = [ + ActivityLog(resource_id=i, type=act_type, detail=detail, detail_id=instance.id) + for i in resource_ids + ] + ActivityLog.objects.bulk_create(activities) -for sender in [Session, UserLoginLog]: - post_save.connect(on_session_or_login_log_created, sender=sender) +for sd in [Session, UserLoginLog]: + post_save.connect(on_session_or_login_log_created, sender=sd) diff --git a/apps/audits/signal_handlers/login_log.py b/apps/audits/signal_handlers/login_log.py index 34e8665ac..a73482b20 100644 --- a/apps/audits/signal_handlers/login_log.py +++ b/apps/audits/signal_handlers/login_log.py @@ -1,21 +1,19 @@ # -*- coding: utf-8 -*- # -from django.utils.functional import LazyObject -from django.utils.translation import ugettext_lazy as _ from django.conf import settings from django.contrib.auth import BACKEND_SESSION_KEY from django.dispatch import receiver from django.utils import timezone, translation +from django.utils.functional import LazyObject +from django.utils.translation import ugettext_lazy as _ from rest_framework.request import Request from authentication.signals import post_auth_failed, post_auth_success from authentication.utils import check_different_city_login_if_need from common.utils import get_request_ip, get_logger from users.models import User - from ..utils import write_login_log - logger = get_logger(__name__) diff --git a/apps/common/utils/__init__.py b/apps/common/utils/__init__.py index 87d36595b..d34592a3a 100644 --- a/apps/common/utils/__init__.py +++ b/apps/common/utils/__init__.py @@ -2,10 +2,11 @@ # from .common import * +from .crypto import * from .django import * from .encode import * from .http import * -from .crypto import * -from .random import * -from .jumpserver import * from .ip import * +from .jumpserver import * +from .random import * +from .translate import * diff --git a/apps/common/utils/translate.py b/apps/common/utils/translate.py index dc1f5c90b..2a9a74ca8 100644 --- a/apps/common/utils/translate.py +++ b/apps/common/utils/translate.py @@ -1,4 +1,4 @@ -from django.utils.translation import gettext +from django.utils.translation import gettext, gettext_noop def translate_value(value): @@ -12,3 +12,32 @@ def translate_value(value): tpl, data = value.split(sp, 1) return gettext(tpl + sp) + data + + +def i18n_fmt(tpl, *args): + if '%' not in tpl: + raise ValueError('Invalid template, should contains %') + if not args: + return tpl + + args = [str(arg) for arg in args] + + try: + tpl % tuple(args) + except TypeError: + raise ValueError('Invalid template, args not match: {} {}'.format(tpl, args)) + return tpl + ' % ' + ', '.join(args) + + +def i18n_trans(s): + if ' % ' not in s: + return gettext(s) + tpl, args = s.split(' % ', 1) + args = args.split(', ') + args = [gettext(arg) for arg in args] + return gettext(tpl) % tuple(args) + + +def hello(): + log = i18n_fmt(gettext_noop('Hello %s'), 'world') + print(i18n_trans(log)) diff --git a/apps/locale/ja/LC_MESSAGES/django.mo b/apps/locale/ja/LC_MESSAGES/django.mo index c4aed5cf6..8fef7cefd 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:6a677ea531b36752e5d3cbfde37bd2667539390e12281b7a4c595fa4d65c1a8a -size 135351 +oid sha256:441239d12ee3ba50b36b3e5b31246993601414d4d119c2c784e56b54208a5a96 +size 135089 diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po index 8af4ed63e..9aeb6bbaa 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-14 15:32+0800\n" +"POT-Creation-Date: 2023-02-14 19: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/login_log.py:30 +#: assets/models/_user.py:24 audits/signal_handlers/login_log.py:28 #: 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 @@ -171,7 +171,7 @@ msgstr "作成のみ" #: 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:212 +#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:220 msgid "Asset" msgstr "資産" @@ -245,7 +245,7 @@ msgstr "アカウントバックアップ計画" #: assets/models/automations/base.py:106 audits/models.py:43 #: 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 +#: terminal/models/session/session.py:44 #: tickets/models/ticket/apply_application.py:30 #: tickets/models/ticket/apply_asset.py:19 msgid "Date start" @@ -270,7 +270,7 @@ msgid "Trigger mode" msgstr "トリガーモード" #: accounts/models/automations/backup_account.py:91 audits/models.py:158 -#: terminal/models/session/sharing.py:107 xpack/plugins/cloud/models.py:168 +#: terminal/models/session/sharing.py:107 xpack/plugins/cloud/models.py:176 msgid "Reason" msgstr "理由" @@ -425,7 +425,7 @@ msgstr "アカウントの確認" #: 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:63 assets/serializers/asset/common.py:137 -#: assets/serializers/platform.py:128 +#: assets/serializers/platform.py:131 #: authentication/serializers/connect_token_secret.py:103 ops/mixin.py:20 #: 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 @@ -527,7 +527,7 @@ msgstr "エスクローされたパスワード" #: 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 +#: assets/serializers/platform.py:93 assets/serializers/platform.py:132 #: perms/serializers/user_permission.py:25 settings/models.py:35 #: tickets/models/ticket/apply_application.py:13 msgid "Category" @@ -538,7 +538,7 @@ msgstr "カテゴリ" #: 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 +#: assets/serializers/asset/common.py:117 assets/serializers/platform.py:92 #: 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 @@ -625,7 +625,7 @@ msgid "Automation task execution" msgstr "自動タスク実行履歴" #: accounts/serializers/automations/change_secret.py:150 audits/const.py:52 -#: audits/models.py:42 audits/signal_handlers/activity_log.py:120 +#: audits/models.py:42 audits/signal_handlers/activity_log.py:119 #: 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 @@ -633,7 +633,7 @@ msgid "Success" msgstr "成功" #: accounts/serializers/automations/change_secret.py:151 audits/const.py:53 -#: audits/signal_handlers/activity_log.py:120 common/const/choices.py:19 +#: audits/signal_handlers/activity_log.py:119 common/const/choices.py:19 #: ops/const.py:58 terminal/const.py:60 xpack/plugins/cloud/const.py:41 msgid "Failed" msgstr "失敗しました" @@ -738,7 +738,7 @@ msgid "User" msgstr "ユーザー" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: ops/serializers/job.py:63 terminal/models/session/session.py:41 +#: ops/serializers/job.py:63 terminal/models/session/session.py:42 #: 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 @@ -1061,9 +1061,9 @@ msgstr "SSHパブリックキー" #: 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 +#: terminal/models/session/session.py:46 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:297 users/models/user.py:756 -#: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:111 +#: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:119 msgid "Comment" msgstr "コメント" @@ -1164,7 +1164,7 @@ 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:182 +#: xpack/plugins/cloud/serializers/account_attrs.py:179 msgid "Platform" msgstr "プラットフォーム" @@ -1270,8 +1270,8 @@ msgstr "アセットの自動化タスク" #: 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:164 -#: xpack/plugins/cloud/models.py:216 +#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:172 +#: xpack/plugins/cloud/models.py:224 msgid "Status" msgstr "ステータス" @@ -1408,45 +1408,45 @@ msgstr "有効化" msgid "Ansible config" msgstr "Ansible 構成" -#: assets/models/platform.py:43 assets/serializers/platform.py:57 +#: assets/models/platform.py:43 assets/serializers/platform.py:60 msgid "Ping enabled" msgstr "アセット ディスカバリを有効にする" -#: assets/models/platform.py:44 assets/serializers/platform.py:58 +#: assets/models/platform.py:44 assets/serializers/platform.py:61 msgid "Ping method" msgstr "資産検出方法" #: assets/models/platform.py:45 assets/models/platform.py:58 -#: assets/serializers/platform.py:59 +#: assets/serializers/platform.py:62 msgid "Gather facts enabled" msgstr "資産情報の収集を有効にする" #: assets/models/platform.py:46 assets/models/platform.py:60 -#: assets/serializers/platform.py:60 +#: assets/serializers/platform.py:63 msgid "Gather facts method" msgstr "情報収集の方法" -#: assets/models/platform.py:47 assets/serializers/platform.py:63 +#: assets/models/platform.py:47 assets/serializers/platform.py:66 msgid "Change secret enabled" msgstr "パスワードの変更が有効" -#: assets/models/platform.py:49 assets/serializers/platform.py:64 +#: assets/models/platform.py:49 assets/serializers/platform.py:67 msgid "Change secret method" msgstr "パスワード変更モード" -#: assets/models/platform.py:51 assets/serializers/platform.py:65 +#: assets/models/platform.py:51 assets/serializers/platform.py:68 msgid "Push account enabled" msgstr "アカウントのプッシュを有効にする" -#: assets/models/platform.py:53 assets/serializers/platform.py:66 +#: assets/models/platform.py:53 assets/serializers/platform.py:69 msgid "Push account method" msgstr "アカウントプッシュ方式" -#: assets/models/platform.py:55 assets/serializers/platform.py:61 +#: assets/models/platform.py:55 assets/serializers/platform.py:64 msgid "Verify account enabled" msgstr "アカウントの確認をオンにする" -#: assets/models/platform.py:57 assets/serializers/platform.py:62 +#: assets/models/platform.py:57 assets/serializers/platform.py:65 msgid "Verify account method" msgstr "アカウント認証方法" @@ -1458,23 +1458,23 @@ msgstr "メタ" msgid "Internal" msgstr "ビルトイン" -#: assets/models/platform.py:82 assets/serializers/platform.py:87 +#: assets/models/platform.py:82 assets/serializers/platform.py:90 msgid "Charset" msgstr "シャーセット" -#: assets/models/platform.py:84 assets/serializers/platform.py:114 +#: assets/models/platform.py:84 assets/serializers/platform.py:117 msgid "Domain enabled" msgstr "ドメインを有効にする" -#: assets/models/platform.py:86 assets/serializers/platform.py:113 +#: assets/models/platform.py:86 assets/serializers/platform.py:116 msgid "Su enabled" msgstr "アカウントの切り替えを有効にする" -#: assets/models/platform.py:87 assets/serializers/platform.py:97 +#: assets/models/platform.py:87 assets/serializers/platform.py:100 msgid "Su method" msgstr "アカウントの切り替え方法" -#: assets/models/platform.py:89 assets/serializers/platform.py:94 +#: assets/models/platform.py:89 assets/serializers/platform.py:97 msgid "Automation" msgstr "オートメーション" @@ -1487,10 +1487,11 @@ msgstr "%(value)s は偶数ではありません" msgid "Auto fill" msgstr "自動充填" -#: assets/serializers/asset/common.py:119 assets/serializers/platform.py:92 +#: assets/serializers/asset/common.py:119 assets/serializers/platform.py:95 #: 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:99 +#: perms/serializers/user_permission.py:24 xpack/plugins/cloud/models.py:107 +#: xpack/plugins/cloud/serializers/task.py:38 msgid "Protocols" msgstr "プロトコル" @@ -1517,7 +1518,6 @@ 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 "このフィールドは必須です。" @@ -1606,19 +1606,25 @@ msgstr "SFTP が有効" msgid "SFTP home" msgstr "SFTP ルート パス" -#: assets/serializers/platform.py:67 +#: assets/serializers/platform.py:42 +#, fuzzy +#| msgid "Input username" +msgid "Auth with username" +msgstr "カスタム ユーザー名" + +#: assets/serializers/platform.py:70 msgid "Gather accounts enabled" msgstr "アカウント収集を有効にする" -#: assets/serializers/platform.py:68 +#: assets/serializers/platform.py:71 msgid "Gather accounts method" msgstr "アカウントの収集方法" -#: assets/serializers/platform.py:74 +#: assets/serializers/platform.py:77 msgid "Primary" msgstr "主要" -#: assets/serializers/platform.py:115 +#: assets/serializers/platform.py:118 msgid "Default Domain" msgstr "デフォルト ドメイン" @@ -1802,21 +1808,7 @@ msgid "No" msgstr "否" #: audits/models.py:34 audits/models.py:61 audits/models.py:130 -#: 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 this system.[{}]" -msgstr "ユーザー {} がサービスにログインしました。[{}]" - -#: audits/models.py:32 audits/models.py:59 audits/models.py:101 -#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:95 +#: terminal/models/session/session.py:38 terminal/models/session/sharing.py:95 msgid "Remote addr" msgstr "リモートaddr" @@ -1915,55 +1907,60 @@ msgid "Reason display" msgstr "理由表示" #: audits/serializers.py:122 -msgid "User {} {} this resource." +#, fuzzy +#| msgid "User {} {} this resource." +msgid "User {} {} this resource" msgstr "ユーザー {} {} が現在のリソースをサブスクライブしました。" #: audits/signal_handlers/activity_log.py:112 -msgid "{} used account[{}], login method[{}] login the asset." -msgstr "" -"{} トムはアカウント[{}]、ログイン方法[{}]を使ってこの資産を登録しました" +#, fuzzy, python-format +#| msgid "Push accounts to assets" +msgid "User %s use account %s login asset %s" +msgstr "アカウントをアセットにプッシュ:" -#: audits/signal_handlers/activity_log.py:121 -msgid "User {} login into this service.[{}]" +#: audits/signal_handlers/activity_log.py:120 +#, fuzzy, python-format +#| msgid "User [{}] login this system.[{}]" +msgid "User %s login system %s" msgstr "ユーザー {} がサービスにログインしました。[{}]" -#: audits/signal_handlers/activity_log.py:139 +#: audits/signal_handlers/activity_log.py:140 #, python-format -msgid "User %s performs a task(%s) for this resource." +msgid "User %s perform a task (%s) for this resource" msgstr "" -#: audits/signal_handlers/login_log.py:29 +#: audits/signal_handlers/login_log.py:27 msgid "SSH Key" msgstr "SSHキー" -#: audits/signal_handlers/login_log.py:31 settings/serializers/auth/sso.py:10 +#: audits/signal_handlers/login_log.py:29 settings/serializers/auth/sso.py:10 msgid "SSO" msgstr "SSO" -#: audits/signal_handlers/login_log.py:32 +#: audits/signal_handlers/login_log.py:30 msgid "Auth Token" msgstr "認証トークン" -#: audits/signal_handlers/login_log.py:33 authentication/notifications.py:73 +#: audits/signal_handlers/login_log.py:31 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:778 msgid "WeCom" msgstr "企業微信" -#: audits/signal_handlers/login_log.py:34 authentication/views/feishu.py:144 +#: audits/signal_handlers/login_log.py:32 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:780 msgid "FeiShu" msgstr "本を飛ばす" -#: audits/signal_handlers/login_log.py:35 authentication/views/dingtalk.py:179 +#: audits/signal_handlers/login_log.py:33 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:779 msgid "DingTalk" msgstr "DingTalk" -#: audits/signal_handlers/login_log.py:36 +#: audits/signal_handlers/login_log.py:34 #: authentication/models/temp_token.py:16 msgid "Temporary token" msgstr "仮パスワード" @@ -3113,6 +3110,12 @@ msgstr "無効な IP" msgid "Invalid address" msgstr "無効なアドレス。" +#: common/utils/translate.py:33 +#, fuzzy, python-format +#| msgid "Hello" +msgid "Hello %s" +msgstr "こんにちは" + #: common/validators.py:14 msgid "Special char not allowed" msgstr "特別なcharは許可されていません" @@ -3359,7 +3362,7 @@ msgid "Date last run" msgstr "最終実行日" #: ops/models/base.py:51 ops/models/job.py:110 -#: xpack/plugins/cloud/models.py:162 +#: xpack/plugins/cloud/models.py:170 msgid "Result" msgstr "結果" @@ -4415,7 +4418,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:179 +#: xpack/plugins/cloud/serializers/account_attrs.py:176 msgid "Unit: second" msgstr "単位: 秒" @@ -5606,35 +5609,41 @@ msgstr "セッションのリプレイをアップロードできます" msgid "Can download session replay" msgstr "セッション再生をダウンロードできます" -#: terminal/models/session/session.py:35 terminal/models/session/sharing.py:100 +#: terminal/models/session/session.py:34 +#, fuzzy +#| msgid "Account " +msgid "Account id" +msgstr "アカウント" + +#: terminal/models/session/session.py:36 terminal/models/session/sharing.py:100 msgid "Login from" msgstr "ログイン元" -#: terminal/models/session/session.py:40 +#: terminal/models/session/session.py:41 msgid "Replay" msgstr "リプレイ" -#: terminal/models/session/session.py:44 +#: terminal/models/session/session.py:45 msgid "Date end" msgstr "終了日" -#: terminal/models/session/session.py:234 +#: terminal/models/session/session.py:235 msgid "Session record" msgstr "セッション記録" -#: terminal/models/session/session.py:236 +#: terminal/models/session/session.py:237 msgid "Can monitor session" msgstr "セッションを監視できます" -#: terminal/models/session/session.py:237 +#: terminal/models/session/session.py:238 msgid "Can share session" msgstr "セッションを共有できます" -#: terminal/models/session/session.py:238 +#: terminal/models/session/session.py:239 msgid "Can terminate session" msgstr "セッションを終了できます" -#: terminal/models/session/session.py:239 +#: terminal/models/session/session.py:240 msgid "Can validate session action perm" msgstr "セッションアクションのパーマを検証できます" @@ -5835,7 +5844,7 @@ msgstr "アクセスキー" msgid "Access key secret" msgstr "アクセスキーシークレット" -#: terminal/serializers/storage.py:65 xpack/plugins/cloud/models.py:209 +#: terminal/serializers/storage.py:65 xpack/plugins/cloud/models.py:217 msgid "Region" msgstr "リージョン" @@ -6978,47 +6987,55 @@ msgstr "リージョン" msgid "Hostname strategy" msgstr "ホスト名戦略" -#: xpack/plugins/cloud/models.py:102 xpack/plugins/cloud/serializers/task.py:40 +#: 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 msgid "IP network segment group" msgstr "IPネットワークセグメントグループ" -#: xpack/plugins/cloud/models.py:105 xpack/plugins/cloud/serializers/task.py:45 +#: xpack/plugins/cloud/models.py:113 xpack/plugins/cloud/serializers/task.py:46 msgid "Sync IP type" msgstr "同期IPタイプ" -#: xpack/plugins/cloud/models.py:108 xpack/plugins/cloud/serializers/task.py:62 +#: xpack/plugins/cloud/models.py:116 xpack/plugins/cloud/serializers/task.py:64 msgid "Always update" msgstr "常に更新" -#: xpack/plugins/cloud/models.py:114 +#: xpack/plugins/cloud/models.py:122 msgid "Date last sync" msgstr "最終同期日" -#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/models.py:160 +#: xpack/plugins/cloud/models.py:127 xpack/plugins/cloud/models.py:168 msgid "Sync instance task" msgstr "インスタンスの同期タスク" -#: xpack/plugins/cloud/models.py:171 xpack/plugins/cloud/models.py:219 +#: xpack/plugins/cloud/models.py:179 xpack/plugins/cloud/models.py:227 msgid "Date sync" msgstr "日付の同期" -#: xpack/plugins/cloud/models.py:175 +#: xpack/plugins/cloud/models.py:183 msgid "Sync instance task execution" msgstr "インスタンスタスクの同期実行" -#: xpack/plugins/cloud/models.py:199 +#: xpack/plugins/cloud/models.py:207 msgid "Sync task" msgstr "同期タスク" -#: xpack/plugins/cloud/models.py:203 +#: xpack/plugins/cloud/models.py:211 msgid "Sync instance task history" msgstr "インスタンスタスク履歴の同期" -#: xpack/plugins/cloud/models.py:206 +#: xpack/plugins/cloud/models.py:214 msgid "Instance" msgstr "インスタンス" -#: xpack/plugins/cloud/models.py:223 +#: xpack/plugins/cloud/models.py:231 msgid "Sync instance detail" msgstr "同期インスタンスの詳細" @@ -7232,52 +7249,52 @@ msgstr "テナントID" msgid "Subscription ID" msgstr "サブスクリプションID" -#: 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 +#: 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 msgid "API Endpoint" msgstr "APIエンドポイント" -#: xpack/plugins/cloud/serializers/account_attrs.py:109 +#: xpack/plugins/cloud/serializers/account_attrs.py:106 msgid "Auth url" msgstr "認証アドレス" -#: xpack/plugins/cloud/serializers/account_attrs.py:110 +#: xpack/plugins/cloud/serializers/account_attrs.py:107 msgid "eg: http://openstack.example.com:5000/v3" msgstr "例えば: http://openstack.example.com:5000/v3" -#: xpack/plugins/cloud/serializers/account_attrs.py:113 +#: xpack/plugins/cloud/serializers/account_attrs.py:110 msgid "User domain" msgstr "ユーザードメイン" -#: xpack/plugins/cloud/serializers/account_attrs.py:120 +#: xpack/plugins/cloud/serializers/account_attrs.py:117 msgid "Cert File" msgstr "証明書ファイル" -#: xpack/plugins/cloud/serializers/account_attrs.py:121 +#: xpack/plugins/cloud/serializers/account_attrs.py:118 msgid "Key File" msgstr "キーファイル" -#: xpack/plugins/cloud/serializers/account_attrs.py:137 +#: xpack/plugins/cloud/serializers/account_attrs.py:134 msgid "Service account key" msgstr "サービスアカウントキー" -#: xpack/plugins/cloud/serializers/account_attrs.py:138 +#: xpack/plugins/cloud/serializers/account_attrs.py:135 msgid "The file is in JSON format" msgstr "ファイルはJSON形式です。" -#: xpack/plugins/cloud/serializers/account_attrs.py:151 +#: xpack/plugins/cloud/serializers/account_attrs.py:148 msgid "IP address invalid `{}`, {}" msgstr "IPアドレスが無効: '{}', {}" -#: xpack/plugins/cloud/serializers/account_attrs.py:157 +#: xpack/plugins/cloud/serializers/account_attrs.py:154 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:161 +#: xpack/plugins/cloud/serializers/account_attrs.py:158 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 " @@ -7287,19 +7304,19 @@ msgstr "" "実行されると、有効な IP アドレスのみが同期されます。
ポートが0の場合、す" "べてのIPアドレスが有効です。" -#: xpack/plugins/cloud/serializers/account_attrs.py:169 +#: xpack/plugins/cloud/serializers/account_attrs.py:166 msgid "Hostname prefix" msgstr "ホスト名プレフィックス" -#: xpack/plugins/cloud/serializers/account_attrs.py:172 +#: xpack/plugins/cloud/serializers/account_attrs.py:169 msgid "IP segment" msgstr "IP セグメント" -#: xpack/plugins/cloud/serializers/account_attrs.py:176 +#: xpack/plugins/cloud/serializers/account_attrs.py:173 msgid "Test port" msgstr "テストポート" -#: xpack/plugins/cloud/serializers/account_attrs.py:179 +#: xpack/plugins/cloud/serializers/account_attrs.py:176 msgid "Test timeout" msgstr "テストタイムアウト" @@ -7325,6 +7342,10 @@ 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 "利用できないアカウント" @@ -7393,6 +7414,21 @@ msgstr "究極のエディション" msgid "Community edition" msgstr "コミュニティ版" +#~ msgid "{} used account[{}], login method[{}] login the asset." +#~ msgstr "" +#~ "{} トムはアカウント[{}]、ログイン方法[{}]を使ってこの資産を登録しました" + +#, fuzzy +#~| msgid "Hello" +#~ msgid "Hello {}" +#~ msgstr "こんにちは" + +#~ msgid "User {} has executed change auth plan for this account.({})" +#~ msgstr "ユーザー {} はこのアカウントのために改密計画を実行しました。({})" + +#~ msgid "User {} login into this service.[{}]" +#~ msgstr "ユーザー {} がサービスにログインしました。[{}]" + #~ msgid "Update some assets hardware info. " #~ msgstr "一部の資産ハードウェア情報を更新します。" @@ -7407,15 +7443,3 @@ 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 29a2d498d..025f8860b 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:3ea4776e6efd07b7d818b5f64d68b14d0c1cbf089766582bd4c2b43e1b183bf8 -size 111254 +oid sha256:bef1d490ea8a2c381a929d8c214e6be9126efcacc98bc0ea09344bef46369d9e +size 111567 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index a434160b5..8a980ef1f 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-14 15:32+0800\n" +"POT-Creation-Date: 2023-02-14 19: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/login_log.py:30 +#: assets/models/_user.py:24 audits/signal_handlers/login_log.py:28 #: 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 @@ -170,7 +170,7 @@ msgstr "仅创建" #: 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:212 +#: tickets/models/ticket/apply_asset.py:16 xpack/plugins/cloud/models.py:220 msgid "Asset" msgstr "资产" @@ -244,7 +244,7 @@ msgstr "账号备份计划" #: assets/models/automations/base.py:106 audits/models.py:43 #: 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 +#: terminal/models/session/session.py:44 #: tickets/models/ticket/apply_application.py:30 #: tickets/models/ticket/apply_asset.py:19 msgid "Date start" @@ -269,7 +269,7 @@ msgid "Trigger mode" msgstr "触发模式" #: accounts/models/automations/backup_account.py:91 audits/models.py:158 -#: terminal/models/session/sharing.py:107 xpack/plugins/cloud/models.py:168 +#: terminal/models/session/sharing.py:107 xpack/plugins/cloud/models.py:176 msgid "Reason" msgstr "原因" @@ -424,7 +424,7 @@ msgstr "账号验证" #: 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:63 assets/serializers/asset/common.py:137 -#: assets/serializers/platform.py:128 +#: assets/serializers/platform.py:131 #: authentication/serializers/connect_token_secret.py:103 ops/mixin.py:20 #: 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 @@ -523,7 +523,7 @@ msgstr "已托管密码" #: 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 +#: assets/serializers/platform.py:93 assets/serializers/platform.py:132 #: perms/serializers/user_permission.py:25 settings/models.py:35 #: tickets/models/ticket/apply_application.py:13 msgid "Category" @@ -534,7 +534,7 @@ msgstr "类别" #: 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 +#: assets/serializers/asset/common.py:117 assets/serializers/platform.py:92 #: 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 @@ -621,7 +621,7 @@ msgid "Automation task execution" msgstr "自动化任务执行历史" #: accounts/serializers/automations/change_secret.py:150 audits/const.py:52 -#: audits/models.py:42 audits/signal_handlers/activity_log.py:120 +#: audits/models.py:42 audits/signal_handlers/activity_log.py:119 #: 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 @@ -629,7 +629,7 @@ msgid "Success" msgstr "成功" #: accounts/serializers/automations/change_secret.py:151 audits/const.py:53 -#: audits/signal_handlers/activity_log.py:120 common/const/choices.py:19 +#: audits/signal_handlers/activity_log.py:119 common/const/choices.py:19 #: ops/const.py:58 terminal/const.py:60 xpack/plugins/cloud/const.py:41 msgid "Failed" msgstr "失败" @@ -734,7 +734,7 @@ msgid "User" msgstr "用户" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: ops/serializers/job.py:63 terminal/models/session/session.py:41 +#: ops/serializers/job.py:63 terminal/models/session/session.py:42 #: 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 @@ -1051,9 +1051,9 @@ msgstr "SSH公钥" #: 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 +#: terminal/models/session/session.py:46 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:297 users/models/user.py:756 -#: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:111 +#: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:119 msgid "Comment" msgstr "备注" @@ -1154,7 +1154,7 @@ 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:182 +#: xpack/plugins/cloud/serializers/account_attrs.py:179 msgid "Platform" msgstr "系统平台" @@ -1260,8 +1260,8 @@ msgstr "资产自动化任务" #: 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:164 -#: xpack/plugins/cloud/models.py:216 +#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:172 +#: xpack/plugins/cloud/models.py:224 msgid "Status" msgstr "状态" @@ -1398,45 +1398,45 @@ msgstr "启用" msgid "Ansible config" msgstr "Ansible 配置" -#: assets/models/platform.py:43 assets/serializers/platform.py:57 +#: assets/models/platform.py:43 assets/serializers/platform.py:60 msgid "Ping enabled" msgstr "启用资产探活" -#: assets/models/platform.py:44 assets/serializers/platform.py:58 +#: assets/models/platform.py:44 assets/serializers/platform.py:61 msgid "Ping method" msgstr "资产探活方式" #: assets/models/platform.py:45 assets/models/platform.py:58 -#: assets/serializers/platform.py:59 +#: assets/serializers/platform.py:62 msgid "Gather facts enabled" msgstr "启用收集资产信息" #: assets/models/platform.py:46 assets/models/platform.py:60 -#: assets/serializers/platform.py:60 +#: assets/serializers/platform.py:63 msgid "Gather facts method" msgstr "收集信息方式" -#: assets/models/platform.py:47 assets/serializers/platform.py:63 +#: assets/models/platform.py:47 assets/serializers/platform.py:66 msgid "Change secret enabled" msgstr "启用改密" -#: assets/models/platform.py:49 assets/serializers/platform.py:64 +#: assets/models/platform.py:49 assets/serializers/platform.py:67 msgid "Change secret method" msgstr "改密方式" -#: assets/models/platform.py:51 assets/serializers/platform.py:65 +#: assets/models/platform.py:51 assets/serializers/platform.py:68 msgid "Push account enabled" msgstr "启用账号推送" -#: assets/models/platform.py:53 assets/serializers/platform.py:66 +#: assets/models/platform.py:53 assets/serializers/platform.py:69 msgid "Push account method" msgstr "账号推送方式" -#: assets/models/platform.py:55 assets/serializers/platform.py:61 +#: assets/models/platform.py:55 assets/serializers/platform.py:64 msgid "Verify account enabled" msgstr "开启账号验证" -#: assets/models/platform.py:57 assets/serializers/platform.py:62 +#: assets/models/platform.py:57 assets/serializers/platform.py:65 msgid "Verify account method" msgstr "账号验证方式" @@ -1448,23 +1448,23 @@ msgstr "元数据" msgid "Internal" msgstr "内置" -#: assets/models/platform.py:82 assets/serializers/platform.py:87 +#: assets/models/platform.py:82 assets/serializers/platform.py:90 msgid "Charset" msgstr "编码" -#: assets/models/platform.py:84 assets/serializers/platform.py:114 +#: assets/models/platform.py:84 assets/serializers/platform.py:117 msgid "Domain enabled" msgstr "启用网域" -#: assets/models/platform.py:86 assets/serializers/platform.py:113 +#: assets/models/platform.py:86 assets/serializers/platform.py:116 msgid "Su enabled" msgstr "启用账号切换" -#: assets/models/platform.py:87 assets/serializers/platform.py:97 +#: assets/models/platform.py:87 assets/serializers/platform.py:100 msgid "Su method" msgstr "账号切换方式" -#: assets/models/platform.py:89 assets/serializers/platform.py:94 +#: assets/models/platform.py:89 assets/serializers/platform.py:97 msgid "Automation" msgstr "自动化" @@ -1477,10 +1477,11 @@ msgstr "%(value)s is not an even number" msgid "Auto fill" msgstr "自动代填" -#: assets/serializers/asset/common.py:119 assets/serializers/platform.py:92 +#: assets/serializers/asset/common.py:119 assets/serializers/platform.py:95 #: 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:99 +#: perms/serializers/user_permission.py:24 xpack/plugins/cloud/models.py:107 +#: xpack/plugins/cloud/serializers/task.py:38 msgid "Protocols" msgstr "协议组" @@ -1507,7 +1508,6 @@ 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 "该字段是必填项。" @@ -1596,19 +1596,25 @@ msgstr "SFTP 已启用" msgid "SFTP home" msgstr "SFTP 根路径" -#: assets/serializers/platform.py:67 +#: assets/serializers/platform.py:42 +#, fuzzy +#| msgid "Input username" +msgid "Auth with username" +msgstr "自定义用户名" + +#: assets/serializers/platform.py:70 msgid "Gather accounts enabled" msgstr "启用账号收集" -#: assets/serializers/platform.py:68 +#: assets/serializers/platform.py:71 msgid "Gather accounts method" msgstr "收集账号方式" -#: assets/serializers/platform.py:74 +#: assets/serializers/platform.py:77 msgid "Primary" msgstr "主要的" -#: assets/serializers/platform.py:115 +#: assets/serializers/platform.py:118 msgid "Default Domain" msgstr "默认网域" @@ -1789,20 +1795,8 @@ 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 this system.[{}]" -msgstr "用户 {} 登录了服务.[{}]" - -#: audits/models.py:32 audits/models.py:59 audits/models.py:101 -#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:95 +#: audits/models.py:34 audits/models.py:61 audits/models.py:130 +#: terminal/models/session/session.py:38 terminal/models/session/sharing.py:95 msgid "Remote addr" msgstr "远端地址" @@ -1901,54 +1895,56 @@ msgid "Reason display" msgstr "原因描述" #: audits/serializers.py:122 -msgid "User {} {} this resource." -msgstr "用户 {} {} 了当前资源." +msgid "User {} {} this resource" +msgstr "用户 {} {} 了当前资源" #: 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 "" +msgid "User %s use account %s login asset %s" +msgstr "用户 %s 使用账号 %s 登录资产 %s" -#: audits/signal_handlers/login_log.py:29 +#: audits/signal_handlers/activity_log.py:120 +#, python-format +msgid "User %s login system %s" +msgstr "用户 %s 登录系统 %s" + +#: audits/signal_handlers/activity_log.py:140 +#, python-format +msgid "User %s perform a task (%s) for this resource" +msgstr "用户 %s 在当前资源, 执行了任务 (%s)" + +#: audits/signal_handlers/login_log.py:27 msgid "SSH Key" msgstr "SSH 密钥" -#: audits/signal_handlers/login_log.py:31 settings/serializers/auth/sso.py:10 +#: audits/signal_handlers/login_log.py:29 settings/serializers/auth/sso.py:10 msgid "SSO" msgstr "SSO" -#: audits/signal_handlers/login_log.py:32 +#: audits/signal_handlers/login_log.py:30 msgid "Auth Token" msgstr "认证令牌" -#: audits/signal_handlers/login_log.py:33 authentication/notifications.py:73 +#: audits/signal_handlers/login_log.py:31 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:778 msgid "WeCom" msgstr "企业微信" -#: audits/signal_handlers/login_log.py:34 authentication/views/feishu.py:144 +#: audits/signal_handlers/login_log.py:32 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:780 msgid "FeiShu" msgstr "飞书" -#: audits/signal_handlers/login_log.py:35 authentication/views/dingtalk.py:179 +#: audits/signal_handlers/login_log.py:33 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:779 msgid "DingTalk" msgstr "钉钉" -#: audits/signal_handlers/login_log.py:36 +#: audits/signal_handlers/login_log.py:34 #: authentication/models/temp_token.py:16 msgid "Temporary token" msgstr "临时密码" @@ -3078,6 +3074,11 @@ msgstr "无效 IP" msgid "Invalid address" msgstr "无效地址" +#: common/utils/translate.py:33 +#, python-format +msgid "Hello %s" +msgstr "你好 %s" + #: common/validators.py:14 msgid "Special char not allowed" msgstr "不能包含特殊字符" @@ -3319,7 +3320,7 @@ msgid "Date last run" msgstr "最后运行日期" #: ops/models/base.py:51 ops/models/job.py:110 -#: xpack/plugins/cloud/models.py:162 +#: xpack/plugins/cloud/models.py:170 msgid "Result" msgstr "结果" @@ -4371,7 +4372,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:179 +#: xpack/plugins/cloud/serializers/account_attrs.py:176 msgid "Unit: second" msgstr "单位: 秒" @@ -5528,35 +5529,41 @@ msgstr "可以上传会话录像" msgid "Can download session replay" msgstr "可以下载会话录像" -#: terminal/models/session/session.py:35 terminal/models/session/sharing.py:100 +#: terminal/models/session/session.py:34 +#, fuzzy +#| msgid "Account " +msgid "Account id" +msgstr "账号" + +#: terminal/models/session/session.py:36 terminal/models/session/sharing.py:100 msgid "Login from" msgstr "登录来源" -#: terminal/models/session/session.py:40 +#: terminal/models/session/session.py:41 msgid "Replay" msgstr "回放" -#: terminal/models/session/session.py:44 +#: terminal/models/session/session.py:45 msgid "Date end" msgstr "结束日期" -#: terminal/models/session/session.py:234 +#: terminal/models/session/session.py:235 msgid "Session record" msgstr "会话记录" -#: terminal/models/session/session.py:236 +#: terminal/models/session/session.py:237 msgid "Can monitor session" msgstr "可以监控会话" -#: terminal/models/session/session.py:237 +#: terminal/models/session/session.py:238 msgid "Can share session" msgstr "可以分享会话" -#: terminal/models/session/session.py:238 +#: terminal/models/session/session.py:239 msgid "Can terminate session" msgstr "可以终断会话" -#: terminal/models/session/session.py:239 +#: terminal/models/session/session.py:240 msgid "Can validate session action perm" msgstr "可以验证会话动作权限" @@ -5755,7 +5762,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:209 +#: terminal/serializers/storage.py:65 xpack/plugins/cloud/models.py:217 msgid "Region" msgstr "地域" @@ -6880,47 +6887,55 @@ msgstr "地域" msgid "Hostname strategy" msgstr "主机名策略" -#: xpack/plugins/cloud/models.py:102 xpack/plugins/cloud/serializers/task.py:40 +#: 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 msgid "IP network segment group" msgstr "IP网段组" -#: xpack/plugins/cloud/models.py:105 xpack/plugins/cloud/serializers/task.py:45 +#: xpack/plugins/cloud/models.py:113 xpack/plugins/cloud/serializers/task.py:46 msgid "Sync IP type" msgstr "同步IP类型" -#: xpack/plugins/cloud/models.py:108 xpack/plugins/cloud/serializers/task.py:62 +#: xpack/plugins/cloud/models.py:116 xpack/plugins/cloud/serializers/task.py:64 msgid "Always update" msgstr "总是更新" -#: xpack/plugins/cloud/models.py:114 +#: xpack/plugins/cloud/models.py:122 msgid "Date last sync" msgstr "最后同步日期" -#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/models.py:160 +#: xpack/plugins/cloud/models.py:127 xpack/plugins/cloud/models.py:168 msgid "Sync instance task" msgstr "同步实例任务" -#: xpack/plugins/cloud/models.py:171 xpack/plugins/cloud/models.py:219 +#: xpack/plugins/cloud/models.py:179 xpack/plugins/cloud/models.py:227 msgid "Date sync" msgstr "同步日期" -#: xpack/plugins/cloud/models.py:175 +#: xpack/plugins/cloud/models.py:183 msgid "Sync instance task execution" msgstr "同步实例任务执行" -#: xpack/plugins/cloud/models.py:199 +#: xpack/plugins/cloud/models.py:207 msgid "Sync task" msgstr "同步任务" -#: xpack/plugins/cloud/models.py:203 +#: xpack/plugins/cloud/models.py:211 msgid "Sync instance task history" msgstr "同步实例任务历史" -#: xpack/plugins/cloud/models.py:206 +#: xpack/plugins/cloud/models.py:214 msgid "Instance" msgstr "实例" -#: xpack/plugins/cloud/models.py:223 +#: xpack/plugins/cloud/models.py:231 msgid "Sync instance detail" msgstr "同步实例详情" @@ -7134,52 +7149,52 @@ msgstr "租户 ID" msgid "Subscription ID" msgstr "订阅 ID" -#: 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 +#: 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 msgid "API Endpoint" msgstr "API 端点" -#: xpack/plugins/cloud/serializers/account_attrs.py:109 +#: xpack/plugins/cloud/serializers/account_attrs.py:106 msgid "Auth url" msgstr "认证地址" -#: xpack/plugins/cloud/serializers/account_attrs.py:110 +#: xpack/plugins/cloud/serializers/account_attrs.py:107 msgid "eg: http://openstack.example.com:5000/v3" msgstr "如: http://openstack.example.com:5000/v3" -#: xpack/plugins/cloud/serializers/account_attrs.py:113 +#: xpack/plugins/cloud/serializers/account_attrs.py:110 msgid "User domain" msgstr "用户域" -#: xpack/plugins/cloud/serializers/account_attrs.py:120 +#: xpack/plugins/cloud/serializers/account_attrs.py:117 msgid "Cert File" msgstr "证书文件" -#: xpack/plugins/cloud/serializers/account_attrs.py:121 +#: xpack/plugins/cloud/serializers/account_attrs.py:118 msgid "Key File" msgstr "密钥文件" -#: xpack/plugins/cloud/serializers/account_attrs.py:137 +#: xpack/plugins/cloud/serializers/account_attrs.py:134 msgid "Service account key" msgstr "服务账号密钥" -#: xpack/plugins/cloud/serializers/account_attrs.py:138 +#: xpack/plugins/cloud/serializers/account_attrs.py:135 msgid "The file is in JSON format" msgstr "JSON 格式的文件" -#: xpack/plugins/cloud/serializers/account_attrs.py:151 +#: xpack/plugins/cloud/serializers/account_attrs.py:148 msgid "IP address invalid `{}`, {}" msgstr "IP 地址无效: `{}`, {}" -#: xpack/plugins/cloud/serializers/account_attrs.py:157 +#: xpack/plugins/cloud/serializers/account_attrs.py:154 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:161 +#: xpack/plugins/cloud/serializers/account_attrs.py:158 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 " @@ -7188,19 +7203,19 @@ msgstr "" "端口用来检测 IP 地址的有效性,在同步任务执行时,只会同步有效的 IP 地址。
" "如果端口为 0,则表示所有 IP 地址均有效。" -#: xpack/plugins/cloud/serializers/account_attrs.py:169 +#: xpack/plugins/cloud/serializers/account_attrs.py:166 msgid "Hostname prefix" msgstr "主机名前缀" -#: xpack/plugins/cloud/serializers/account_attrs.py:172 +#: xpack/plugins/cloud/serializers/account_attrs.py:169 msgid "IP segment" msgstr "IP 网段" -#: xpack/plugins/cloud/serializers/account_attrs.py:176 +#: xpack/plugins/cloud/serializers/account_attrs.py:173 msgid "Test port" msgstr "测试端口" -#: xpack/plugins/cloud/serializers/account_attrs.py:179 +#: xpack/plugins/cloud/serializers/account_attrs.py:176 msgid "Test timeout" msgstr "测试超时时间" @@ -7224,6 +7239,10 @@ 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 "账号无效" @@ -7292,6 +7311,15 @@ msgstr "旗舰版" msgid "Community edition" msgstr "社区版" +#~ msgid "{} used account[{}], login method[{}] login the asset." +#~ msgstr "{} 使用账户[{}], 登录方式[{}]登录了这个资产." + +#~ msgid "User {} has executed change auth plan for this account.({})" +#~ msgstr "用户 {} 为这个账号执行了改密计划.({})" + +#~ msgid "User {} login into this service.[{}]" +#~ msgstr "用户 {} 登录了服务.[{}]" + #~ msgid "Update some assets hardware info. " #~ msgstr "更新资产硬件信息. " @@ -7307,18 +7335,6 @@ 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 "硬盘信息" diff --git a/apps/terminal/migrations/0059_session_account_id.py b/apps/terminal/migrations/0059_session_account_id.py new file mode 100644 index 000000000..52168b775 --- /dev/null +++ b/apps/terminal/migrations/0059_session_account_id.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.14 on 2023-02-14 10:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('terminal', '0058_auto_20230110_1445'), + ] + + operations = [ + migrations.AddField( + model_name='session', + name='account_id', + field=models.CharField(db_index=True, default='', max_length=128, verbose_name='Account id'), + preserve_default=False, + ), + ] diff --git a/apps/terminal/models/session/session.py b/apps/terminal/models/session/session.py index 70513753d..fd5b2b243 100644 --- a/apps/terminal/models/session/session.py +++ b/apps/terminal/models/session/session.py @@ -31,6 +31,7 @@ class Session(OrgModelMixin): asset = models.CharField(max_length=128, verbose_name=_("Asset"), db_index=True) asset_id = models.CharField(blank=True, default='', max_length=36, db_index=True) account = models.CharField(max_length=128, verbose_name=_("Account"), db_index=True) + account_id = models.CharField(max_length=128, verbose_name=_("Account id"), db_index=True) protocol = models.CharField(default='ssh', max_length=16, db_index=True) login_from = models.CharField(max_length=2, choices=LOGIN_FROM.choices, default="ST", verbose_name=_("Login from")) type = models.CharField(max_length=16, default='normal', db_index=True)