perf: 账号备份增加sftp方式 (#12032)

* perf: 添加sftp支持

* perf: 账号备份增加sftp方式

---------

Co-authored-by: wangruidong <940853815@qq.com>
Co-authored-by: Bryan <jiangjie.bai@fit2cloud.com>
pull/12054/head
fit2bot 2023-11-07 15:10:46 +08:00 committed by GitHub
parent 54b89f6fee
commit f01bfc44b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 601 additions and 289 deletions

View File

@ -6,11 +6,14 @@ from django.conf import settings
from openpyxl import Workbook from openpyxl import Workbook
from rest_framework import serializers from rest_framework import serializers
from accounts.notifications import AccountBackupExecutionTaskMsg from accounts.const.automation import AccountBackupType
from accounts.notifications import AccountBackupExecutionTaskMsg, AccountBackupByObjStorageExecutionTaskMsg
from accounts.serializers import AccountSecretSerializer from accounts.serializers import AccountSecretSerializer
from accounts.models.automations.backup_account import AccountBackupAutomation
from assets.const import AllTypes from assets.const import AllTypes
from common.utils.file import encrypt_and_compress_zip_file from common.utils.file import encrypt_and_compress_zip_file, zip_files
from common.utils.timezone import local_now_display from common.utils.timezone import local_now_display
from terminal.models.component.storage import ReplayStorage
from users.models import User from users.models import User
PATH = os.path.join(os.path.dirname(settings.BASE_DIR), 'tmp') PATH = os.path.join(os.path.dirname(settings.BASE_DIR), 'tmp')
@ -169,6 +172,29 @@ class AccountBackupHandler:
for file in files: for file in files:
os.remove(file) os.remove(file)
def send_backup_obj_storage(self, files, recipients, password):
if not files:
return
recipients = ReplayStorage.objects.filter(id__in=list(recipients))
print(
'\n'
'\033[32m>>> 发送备份文件到sftp服务器\033[0m'
''
)
plan_name = self.plan_name
for rec in recipients:
attachment = os.path.join(PATH, f'{plan_name}-{local_now_display()}-{time.time()}.zip')
if password:
password = password.encode('utf8')
encrypt_and_compress_zip_file(attachment, password, files)
else:
zip_files(attachment, files)
attachment_list = attachment
AccountBackupByObjStorageExecutionTaskMsg(plan_name, rec).publish(attachment_list)
print('备份文件将发送至{}({})'.format(rec.name, rec.id))
for file in files:
os.remove(file)
def step_perform_task_update(self, is_success, reason): def step_perform_task_update(self, is_success, reason):
self.execution.reason = reason[:1024] self.execution.reason = reason[:1024]
self.execution.is_success = is_success self.execution.is_success = is_success
@ -186,6 +212,47 @@ class AccountBackupHandler:
is_success = False is_success = False
error = '-' error = '-'
try: try:
backup_type = self.execution.snapshot.get('backup_type', AccountBackupType.email.value)
if backup_type == AccountBackupType.email.value:
self.backup_by_email()
elif backup_type == AccountBackupType.object_storage.value:
self.backup_by_obj_storage()
except Exception as e:
self.is_frozen = True
print('任务执行被异常中断')
print('下面打印发生异常的 Traceback 信息 : ')
print(e)
error = str(e)
else:
is_success = True
finally:
reason = error
self.step_perform_task_update(is_success, reason)
self.step_finished(is_success)
def backup_by_obj_storage(self):
object_id = self.execution.snapshot.get('id')
zip_encrypt_password = AccountBackupAutomation.objects.get(id=object_id).zip_encrypt_password
obj_recipients_part_one = self.execution.snapshot.get('obj_recipients_part_one', [])
obj_recipients_part_two = self.execution.snapshot.get('obj_recipients_part_two', [])
if not obj_recipients_part_one and not obj_recipients_part_two:
print(
'\n'
'\033[32m>>> 该备份任务未分配sftp服务器\033[0m'
''
)
if obj_recipients_part_one and obj_recipients_part_two:
files = self.create_excel(section='front')
self.send_backup_obj_storage(files, obj_recipients_part_one, zip_encrypt_password)
files = self.create_excel(section='back')
self.send_backup_obj_storage(files, obj_recipients_part_two, zip_encrypt_password)
else:
recipients = obj_recipients_part_one or obj_recipients_part_two
files = self.create_excel()
self.send_backup_obj_storage(files, recipients, zip_encrypt_password)
def backup_by_email(self):
recipients_part_one = self.execution.snapshot.get('recipients_part_one', []) recipients_part_one = self.execution.snapshot.get('recipients_part_one', [])
recipients_part_two = self.execution.snapshot.get('recipients_part_two', []) recipients_part_two = self.execution.snapshot.get('recipients_part_two', [])
if not recipients_part_one and not recipients_part_two: if not recipients_part_one and not recipients_part_two:
@ -204,18 +271,6 @@ class AccountBackupHandler:
recipients = recipients_part_one or recipients_part_two recipients = recipients_part_one or recipients_part_two
files = self.create_excel() files = self.create_excel()
self.send_backup_mail(files, recipients) self.send_backup_mail(files, recipients)
except Exception as e:
self.is_frozen = True
print('任务执行被异常中断')
print('下面打印发生异常的 Traceback 信息 : ')
print(e)
error = str(e)
else:
is_success = True
finally:
reason = error
self.step_perform_task_update(is_success, reason)
self.step_finished(is_success)
def run(self): def run(self):
print('任务开始: {}'.format(local_now_display())) print('任务开始: {}'.format(local_now_display()))

View File

@ -16,7 +16,7 @@ DEFAULT_PASSWORD_RULES = {
__all__ = [ __all__ = [
'AutomationTypes', 'SecretStrategy', 'SSHKeyStrategy', 'Connectivity', 'AutomationTypes', 'SecretStrategy', 'SSHKeyStrategy', 'Connectivity',
'DEFAULT_PASSWORD_LENGTH', 'DEFAULT_PASSWORD_RULES', 'TriggerChoice', 'DEFAULT_PASSWORD_LENGTH', 'DEFAULT_PASSWORD_RULES', 'TriggerChoice',
'PushAccountActionChoice', 'PushAccountActionChoice', 'AccountBackupType'
] ]
@ -95,3 +95,10 @@ class TriggerChoice(models.TextChoices, TreeChoices):
class PushAccountActionChoice(models.TextChoices): class PushAccountActionChoice(models.TextChoices):
create_and_push = 'create_and_push', _('Create and push') create_and_push = 'create_and_push', _('Create and push')
only_create = 'only_create', _('Only create') only_create = 'only_create', _('Only create')
class AccountBackupType(models.TextChoices):
"""Backup type"""
email = 'email', _('Email')
# 目前只支持sftp方式
object_storage = 'object_storage', _('SFTP')

View File

@ -0,0 +1,45 @@
# Generated by Django 4.1.10 on 2023-11-03 07:10
import common.db.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('terminal', '0067_alter_replaystorage_type'),
('accounts', '0017_alter_automationexecution_options'),
]
operations = [
migrations.AddField(
model_name='accountbackupautomation',
name='backup_type',
field=models.CharField(choices=[('email', 'Email'), ('object_storage', 'Object Storage')], default='email', max_length=128),
),
migrations.AddField(
model_name='accountbackupautomation',
name='is_password_divided_by_email',
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name='accountbackupautomation',
name='is_password_divided_by_obj_storage',
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name='accountbackupautomation',
name='obj_recipients_part_one',
field=models.ManyToManyField(blank=True, related_name='obj_recipient_part_one_plans', to='terminal.replaystorage', verbose_name='Object Storage Recipient part one'),
),
migrations.AddField(
model_name='accountbackupautomation',
name='obj_recipients_part_two',
field=models.ManyToManyField(blank=True, related_name='obj_recipient_part_two_plans', to='terminal.replaystorage', verbose_name='Object Storage Recipient part two'),
),
migrations.AddField(
model_name='accountbackupautomation',
name='zip_encrypt_password',
field=common.db.fields.EncryptCharField(blank=True, max_length=4096, null=True, verbose_name='Zip Encrypt Password'),
),
]

View File

@ -8,10 +8,11 @@ from django.db import models
from django.db.models import F from django.db.models import F
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from accounts.const.automation import AccountBackupType
from common.const.choices import Trigger from common.const.choices import Trigger
from common.db import fields
from common.db.encoder import ModelJSONFieldEncoder from common.db.encoder import ModelJSONFieldEncoder
from common.utils import get_logger from common.utils import get_logger, lazyproperty
from common.utils import lazyproperty
from ops.mixin import PeriodTaskModelMixin from ops.mixin import PeriodTaskModelMixin
from orgs.mixins.models import OrgModelMixin, JMSOrgBaseModel from orgs.mixins.models import OrgModelMixin, JMSOrgBaseModel
@ -22,6 +23,10 @@ logger = get_logger(__file__)
class AccountBackupAutomation(PeriodTaskModelMixin, JMSOrgBaseModel): class AccountBackupAutomation(PeriodTaskModelMixin, JMSOrgBaseModel):
types = models.JSONField(default=list) types = models.JSONField(default=list)
backup_type = models.CharField(max_length=128, choices=AccountBackupType.choices,
default=AccountBackupType.email.value, verbose_name=_('Backup Type'))
is_password_divided_by_email = models.BooleanField(default=True, verbose_name=_('Is Password Divided'))
is_password_divided_by_obj_storage = models.BooleanField(default=True, verbose_name=_('Is Password Divided'))
recipients_part_one = models.ManyToManyField( recipients_part_one = models.ManyToManyField(
'users.User', related_name='recipient_part_one_plans', blank=True, 'users.User', related_name='recipient_part_one_plans', blank=True,
verbose_name=_("Recipient part one") verbose_name=_("Recipient part one")
@ -30,6 +35,16 @@ class AccountBackupAutomation(PeriodTaskModelMixin, JMSOrgBaseModel):
'users.User', related_name='recipient_part_two_plans', blank=True, 'users.User', related_name='recipient_part_two_plans', blank=True,
verbose_name=_("Recipient part two") verbose_name=_("Recipient part two")
) )
obj_recipients_part_one = models.ManyToManyField(
'terminal.ReplayStorage', related_name='obj_recipient_part_one_plans', blank=True,
verbose_name=_("Object Storage Recipient part one")
)
obj_recipients_part_two = models.ManyToManyField(
'terminal.ReplayStorage', related_name='obj_recipient_part_two_plans', blank=True,
verbose_name=_("Object Storage Recipient part two")
)
zip_encrypt_password = fields.EncryptCharField(max_length=4096, blank=True, null=True,
verbose_name=_('Zip Encrypt Password'))
def __str__(self): def __str__(self):
return f'{self.name}({self.org_id})' return f'{self.name}({self.org_id})'
@ -49,6 +64,7 @@ class AccountBackupAutomation(PeriodTaskModelMixin, JMSOrgBaseModel):
def to_attr_json(self): def to_attr_json(self):
return { return {
'id': self.id,
'name': self.name, 'name': self.name,
'is_periodic': self.is_periodic, 'is_periodic': self.is_periodic,
'interval': self.interval, 'interval': self.interval,
@ -56,6 +72,10 @@ class AccountBackupAutomation(PeriodTaskModelMixin, JMSOrgBaseModel):
'org_id': self.org_id, 'org_id': self.org_id,
'created_by': self.created_by, 'created_by': self.created_by,
'types': self.types, 'types': self.types,
'backup_type': self.backup_type,
'is_password_divided_by_email': self.is_password_divided_by_email,
'is_password_divided_by_obj_storage': self.is_password_divided_by_obj_storage,
'zip_encrypt_password': self.zip_encrypt_password,
'recipients_part_one': { 'recipients_part_one': {
str(user.id): (str(user), bool(user.secret_key)) str(user.id): (str(user), bool(user.secret_key))
for user in self.recipients_part_one.all() for user in self.recipients_part_one.all()
@ -63,7 +83,15 @@ class AccountBackupAutomation(PeriodTaskModelMixin, JMSOrgBaseModel):
'recipients_part_two': { 'recipients_part_two': {
str(user.id): (str(user), bool(user.secret_key)) str(user.id): (str(user), bool(user.secret_key))
for user in self.recipients_part_two.all() for user in self.recipients_part_two.all()
} },
'obj_recipients_part_one': {
str(obj_storage.id): (str(obj_storage.name), str(obj_storage.type))
for obj_storage in self.obj_recipients_part_one.all()
},
'obj_recipients_part_two': {
str(obj_storage.id): (str(obj_storage.name), str(obj_storage.type))
for obj_storage in self.obj_recipients_part_two.all()
},
} }
@property @property

View File

@ -1,9 +1,10 @@
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from common.tasks import send_mail_attachment_async from common.tasks import send_mail_attachment_async, upload_backup_to_obj_storage
from notifications.notifications import UserMessage from notifications.notifications import UserMessage
from users.models import User from users.models import User
from terminal.models.component.storage import ReplayStorage
class AccountBackupExecutionTaskMsg(object): class AccountBackupExecutionTaskMsg(object):
@ -31,6 +32,25 @@ class AccountBackupExecutionTaskMsg(object):
) )
class AccountBackupByObjStorageExecutionTaskMsg(object):
subject = _('Notification of account backup route task results')
def __init__(self, name: str, obj_storage: ReplayStorage):
self.name = name
self.obj_storage = obj_storage
@property
def message(self):
name = self.name
return _('{} - The account backup passage task has been completed.'
' See the attachment for details').format(name)
def publish(self, attachment_list=None):
upload_backup_to_obj_storage(
self.obj_storage, attachment_list
)
class ChangeSecretExecutionTaskMsg(object): class ChangeSecretExecutionTaskMsg(object):
subject = _('Notification of implementation result of encryption change plan') subject = _('Notification of implementation result of encryption change plan')

View File

@ -5,7 +5,7 @@ from rest_framework import serializers
from accounts.models import AccountBackupAutomation, AccountBackupExecution from accounts.models import AccountBackupAutomation, AccountBackupExecution
from common.const.choices import Trigger from common.const.choices import Trigger
from common.serializers.fields import LabeledChoiceField from common.serializers.fields import LabeledChoiceField, EncryptedField
from common.utils import get_logger from common.utils import get_logger
from ops.mixin import PeriodTaskSerializerMixin from ops.mixin import PeriodTaskSerializerMixin
from orgs.mixins.serializers import BulkOrgResourceModelSerializer from orgs.mixins.serializers import BulkOrgResourceModelSerializer
@ -16,6 +16,11 @@ __all__ = ['AccountBackupSerializer', 'AccountBackupPlanExecutionSerializer']
class AccountBackupSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSerializer): class AccountBackupSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSerializer):
zip_encrypt_password = EncryptedField(
label=_('Zip Encrypt Password'), required=False, max_length=40960, allow_blank=True,
allow_null=True, write_only=True,
)
class Meta: class Meta:
model = AccountBackupAutomation model = AccountBackupAutomation
read_only_fields = [ read_only_fields = [
@ -24,7 +29,9 @@ class AccountBackupSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSer
] ]
fields = read_only_fields + [ fields = read_only_fields + [
'id', 'name', 'is_periodic', 'interval', 'crontab', 'id', 'name', 'is_periodic', 'interval', 'crontab',
'comment', 'types', 'recipients_part_one', 'recipients_part_two' 'comment', 'types', 'recipients_part_one', 'recipients_part_two', 'backup_type',
'is_password_divided_by_email', 'is_password_divided_by_obj_storage', 'obj_recipients_part_one',
'obj_recipients_part_two', 'zip_encrypt_password'
] ]
extra_kwargs = { extra_kwargs = {
'name': {'required': True}, 'name': {'required': True},

View File

@ -4,6 +4,7 @@ from celery import shared_task
from django.conf import settings from django.conf import settings
from django.core.mail import send_mail, EmailMultiAlternatives from django.core.mail import send_mail, EmailMultiAlternatives
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
import jms_storage
from .utils import get_logger from .utils import get_logger
@ -63,3 +64,18 @@ def send_mail_attachment_async(subject, message, recipient_list, attachment_list
return email.send() return email.send()
except Exception as e: except Exception as e:
logger.error("Sending mail attachment error: {}".format(e)) logger.error("Sending mail attachment error: {}".format(e))
@shared_task(verbose_name=_('Upload session replay to external storage'))
def upload_backup_to_obj_storage(recipient, upload_file):
logger.info(f'Start upload file : {upload_file}')
remote_path = os.path.join('account_backup', os.path.basename(upload_file))
storage = jms_storage.get_object_storage(recipient.config)
ok, err = storage.upload(src=upload_file, target=remote_path)
if not ok:
logger.error(f'upload {upload_file} failed, error: {err}')
return
try:
os.remove(upload_file)
except Exception as e:
print(f'remove upload file : {upload_file} error: {e}')

View File

@ -3,6 +3,7 @@ import csv
import pyzipper import pyzipper
import requests import requests
import zipfile
from hashlib import md5 from hashlib import md5
@ -26,6 +27,20 @@ def encrypt_and_compress_zip_file(filename, secret_password, encrypted_filenames
zf.writestr(os.path.basename(encrypted_filename), f.read()) zf.writestr(os.path.basename(encrypted_filename), f.read())
def zip_files(output_file, file_list):
"""
将多个文件打包成zip文件
Args:
output_file (str): 打包后的zip文件路径
file_list (list): 需要打包的文件列表
Returns:
None
"""
with zipfile.ZipFile(output_file, 'w') as zipf:
for file in file_list:
zipf.write(file, arcname=os.path.basename(file))
def download_file(src, path): def download_file(src, path):
with requests.get(src, stream=True) as r: with requests.get(src, stream=True) as r:
r.raise_for_status() r.raise_for_status()

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:cde05981ba0517af982f7ef197aed433c52510098589e4a6ce5101e48c26556e oid sha256:5a5207051b4a959f750ebd48c770a552c460f864547aea8d6bb62d8920e24e32
size 163803 size 164428

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-03 16:52+0800\n" "POT-Creation-Date: 2023-11-03 18:29+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -24,11 +24,12 @@ msgstr "パラメータ 'action' は [{}] でなければなりません。"
#: accounts/const/account.py:6 #: accounts/const/account.py:6
#: accounts/serializers/automations/change_secret.py:32 #: accounts/serializers/automations/change_secret.py:32
#: assets/models/_user.py:24 audits/signal_handlers/login_log.py:34 #: assets/models/_user.py:23 audits/signal_handlers/login_log.py:34
#: authentication/confirm/password.py:9 authentication/confirm/password.py:24 #: authentication/confirm/password.py:9 authentication/confirm/password.py:24
#: authentication/confirm/password.py:26 authentication/forms.py:32 #: authentication/confirm/password.py:26 authentication/forms.py:32
#: authentication/templates/authentication/login.html:330 #: authentication/templates/authentication/login.html:330
#: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47
#: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142
#: users/forms/profile.py:22 users/serializers/user.py:104 #: users/forms/profile.py:22 users/serializers/user.py:104
#: users/templates/users/_msg_user_created.html:13 #: users/templates/users/_msg_user_created.html:13
#: users/templates/users/user_password_verify.html:18 #: users/templates/users/user_password_verify.html:18
@ -38,6 +39,7 @@ msgstr "パスワード"
#: accounts/const/account.py:7 #: accounts/const/account.py:7
#: accounts/serializers/automations/change_secret.py:33 #: accounts/serializers/automations/change_secret.py:33
#: terminal/serializers/storage.py:124
msgid "SSH key" msgid "SSH key"
msgstr "SSH キー" msgstr "SSH キー"
@ -45,7 +47,7 @@ msgstr "SSH キー"
msgid "Access key" msgid "Access key"
msgstr "アクセスキー" msgstr "アクセスキー"
#: accounts/const/account.py:9 assets/models/_user.py:48 #: accounts/const/account.py:9 assets/models/_user.py:47
#: authentication/backends/passkey/models.py:16 #: authentication/backends/passkey/models.py:16
#: authentication/models/sso_token.py:14 settings/serializers/feature.py:50 #: authentication/models/sso_token.py:14 settings/serializers/feature.py:50
msgid "Token" msgid "Token"
@ -97,7 +99,7 @@ msgstr "更新"
#: accounts/const/account.py:33 #: accounts/const/account.py:33
#: accounts/serializers/automations/change_secret.py:150 audits/const.py:62 #: accounts/serializers/automations/change_secret.py:150 audits/const.py:62
#: audits/signal_handlers/activity_log.py:33 common/const/choices.py:19 #: audits/signal_handlers/activity_log.py:33 common/const/choices.py:19
#: ops/const.py:74 terminal/const.py:77 xpack/plugins/cloud/const.py:43 #: ops/const.py:74 terminal/const.py:78 xpack/plugins/cloud/const.py:43
msgid "Failed" msgid "Failed"
msgstr "失敗しました" msgstr "失敗しました"
@ -189,6 +191,21 @@ msgstr "作成してプッシュ"
msgid "Only create" msgid "Only create"
msgstr "作成のみ" msgstr "作成のみ"
#: accounts/const/automation.py:102
#: authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24
#: notifications/backends/__init__.py:10 settings/serializers/msg.py:22
#: settings/serializers/msg.py:57 users/forms/profile.py:102
#: users/forms/profile.py:109 users/models/user.py:794
#: users/templates/users/forgot_password.html:117
#: users/views/profile/reset.py:92
msgid "Email"
msgstr "メール"
#: accounts/const/automation.py:104 terminal/const.py:86
msgid "SFTP"
msgstr "SFTP"
#: accounts/const/vault.py:8 assets/const/category.py:12 #: accounts/const/vault.py:8 assets/const/category.py:12
#: assets/models/asset/database.py:9 assets/models/asset/database.py:24 #: assets/models/asset/database.py:9 assets/models/asset/database.py:24
msgid "Database" msgid "Database"
@ -295,20 +312,42 @@ msgstr "アカウントを確認できます"
msgid "Can push account" msgid "Can push account"
msgstr "アカウントをプッシュできます" msgstr "アカウントをプッシュできます"
#: accounts/models/automations/backup_account.py:27 #: accounts/models/automations/backup_account.py:28
msgid "Backup Type"
msgstr "バックアップの種類"
#: accounts/models/automations/backup_account.py:29
#: accounts/models/automations/backup_account.py:30
msgid "Is Password Divided"
msgstr "キーが 2 つの部分に分割されているかどうか"
#: accounts/models/automations/backup_account.py:33
msgid "Recipient part one" msgid "Recipient part one"
msgstr "受信者 1" msgstr "受信者 1"
#: accounts/models/automations/backup_account.py:31 #: accounts/models/automations/backup_account.py:37
msgid "Recipient part two" msgid "Recipient part two"
msgstr "受信者 2" msgstr "受信者 2"
#: accounts/models/automations/backup_account.py:40 #: accounts/models/automations/backup_account.py:41
#: accounts/models/automations/backup_account.py:110 msgid "Object Storage Recipient part one"
msgstr "受信サーバー 1"
#: accounts/models/automations/backup_account.py:45
msgid "Object Storage Recipient part two"
msgstr "受信サーバー 2"
#: accounts/models/automations/backup_account.py:48
#: accounts/serializers/account/backup.py:20
msgid "Zip Encrypt Password"
msgstr "新しいファイルの暗号化パスワード"
#: accounts/models/automations/backup_account.py:56
#: accounts/models/automations/backup_account.py:139
msgid "Account backup plan" msgid "Account backup plan"
msgstr "アカウントバックアップ計画" msgstr "アカウントバックアップ計画"
#: accounts/models/automations/backup_account.py:91 #: accounts/models/automations/backup_account.py:120
#: assets/models/automations/base.py:115 audits/models.py:64 #: assets/models/automations/base.py:115 audits/models.py:64
#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:228 #: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:228
#: ops/templates/ops/celery_task_log.html:75 #: ops/templates/ops/celery_task_log.html:75
@ -319,37 +358,37 @@ msgstr "アカウントバックアップ計画"
msgid "Date start" msgid "Date start"
msgstr "開始日" msgstr "開始日"
#: accounts/models/automations/backup_account.py:94 #: accounts/models/automations/backup_account.py:123
#: authentication/templates/authentication/_msg_oauth_bind.html:11 #: authentication/templates/authentication/_msg_oauth_bind.html:11
#: notifications/notifications.py:186 #: notifications/notifications.py:186
msgid "Time" msgid "Time"
msgstr "時間" msgstr "時間"
#: accounts/models/automations/backup_account.py:98 #: accounts/models/automations/backup_account.py:127
msgid "Account backup snapshot" msgid "Account backup snapshot"
msgstr "アカウントのバックアップスナップショット" msgstr "アカウントのバックアップスナップショット"
#: accounts/models/automations/backup_account.py:102 #: accounts/models/automations/backup_account.py:131
#: accounts/serializers/account/backup.py:42 #: accounts/serializers/account/backup.py:49
#: accounts/serializers/automations/base.py:55 #: accounts/serializers/automations/base.py:55
#: assets/models/automations/base.py:122 #: assets/models/automations/base.py:122
#: assets/serializers/automations/base.py:40 #: assets/serializers/automations/base.py:40
msgid "Trigger mode" msgid "Trigger mode"
msgstr "トリガーモード" msgstr "トリガーモード"
#: accounts/models/automations/backup_account.py:105 audits/models.py:202 #: accounts/models/automations/backup_account.py:134 audits/models.py:202
#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:205 #: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:205
msgid "Reason" msgid "Reason"
msgstr "理由" msgstr "理由"
#: accounts/models/automations/backup_account.py:107 #: accounts/models/automations/backup_account.py:136
#: accounts/serializers/automations/change_secret.py:105 #: accounts/serializers/automations/change_secret.py:105
#: accounts/serializers/automations/change_secret.py:128 #: accounts/serializers/automations/change_secret.py:128
#: ops/serializers/job.py:56 terminal/serializers/session.py:49 #: ops/serializers/job.py:56 terminal/serializers/session.py:49
msgid "Is success" msgid "Is success"
msgstr "成功は" msgstr "成功は"
#: accounts/models/automations/backup_account.py:115 #: accounts/models/automations/backup_account.py:144
msgid "Account backup execution" msgid "Account backup execution"
msgstr "アカウントバックアップの実行" msgstr "アカウントバックアップの実行"
@ -394,7 +433,7 @@ msgid "SSH key change strategy"
msgstr "SSHキープッシュ方式" msgstr "SSHキープッシュ方式"
#: accounts/models/automations/change_secret.py:15 #: accounts/models/automations/change_secret.py:15
#: accounts/serializers/account/backup.py:34 #: accounts/serializers/account/backup.py:41
#: accounts/serializers/automations/change_secret.py:56 #: accounts/serializers/automations/change_secret.py:56
msgid "Recipient" msgid "Recipient"
msgstr "受信者" msgstr "受信者"
@ -458,13 +497,14 @@ msgstr "最終ログイン日"
#: accounts/models/automations/push_account.py:15 accounts/models/base.py:65 #: accounts/models/automations/push_account.py:15 accounts/models/base.py:65
#: accounts/serializers/account/virtual.py:21 acls/serializers/base.py:19 #: accounts/serializers/account/virtual.py:21 acls/serializers/base.py:19
#: acls/serializers/base.py:50 acls/templates/acls/asset_login_reminder.html:5 #: acls/serializers/base.py:50 acls/templates/acls/asset_login_reminder.html:5
#: acls/templates/acls/user_login_reminder.html:5 assets/models/_user.py:23 #: acls/templates/acls/user_login_reminder.html:5 assets/models/_user.py:22
#: audits/models.py:187 authentication/forms.py:25 authentication/forms.py:27 #: audits/models.py:187 authentication/forms.py:25 authentication/forms.py:27
#: authentication/models/temp_token.py:9 #: authentication/models/temp_token.py:9
#: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_different_city.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9
#: users/forms/profile.py:32 users/forms/profile.py:115 #: terminal/serializers/storage.py:136 users/forms/profile.py:32
#: users/models/user.py:790 users/templates/users/_msg_user_created.html:12 #: users/forms/profile.py:115 users/models/user.py:790
#: users/templates/users/_msg_user_created.html:12
#: xpack/plugins/cloud/serializers/account_attrs.py:26 #: xpack/plugins/cloud/serializers/account_attrs.py:26
msgid "Username" msgid "Username"
msgstr "ユーザー名" msgstr "ユーザー名"
@ -512,6 +552,7 @@ msgstr "アカウントの確認"
#: accounts/serializers/automations/change_secret.py:45 #: accounts/serializers/automations/change_secret.py:45
#: authentication/serializers/connect_token_secret.py:41 #: authentication/serializers/connect_token_secret.py:41
#: authentication/serializers/connect_token_secret.py:50 #: authentication/serializers/connect_token_secret.py:50
#: terminal/serializers/storage.py:140
msgid "Secret type" msgid "Secret type"
msgstr "鍵の種類" msgstr "鍵の種類"
@ -536,7 +577,7 @@ msgstr "パスワードルール"
#: accounts/models/base.py:64 accounts/serializers/account/virtual.py:20 #: accounts/models/base.py:64 accounts/serializers/account/virtual.py:20
#: acls/models/base.py:35 acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/models/base.py:35 acls/models/base.py:96 acls/models/command_acl.py:21
#: acls/serializers/base.py:35 applications/models.py:9 #: acls/serializers/base.py:35 applications/models.py:9
#: assets/models/_user.py:22 assets/models/asset/common.py:91 #: assets/models/_user.py:21 assets/models/asset/common.py:91
#: assets/models/asset/common.py:149 assets/models/cmd_filter.py:21 #: assets/models/asset/common.py:149 assets/models/cmd_filter.py:21
#: assets/models/domain.py:18 assets/models/group.py:17 #: assets/models/domain.py:18 assets/models/group.py:17
#: assets/models/label.py:18 assets/models/platform.py:15 #: assets/models/label.py:18 assets/models/platform.py:15
@ -572,7 +613,7 @@ msgstr "特権アカウント"
msgid "Is active" msgid "Is active"
msgstr "アクティブです。" msgstr "アクティブです。"
#: accounts/models/template.py:17 assets/models/_user.py:53 #: accounts/models/template.py:17 assets/models/_user.py:54
msgid "Auto push" msgid "Auto push"
msgstr "オートプッシュ" msgstr "オートプッシュ"
@ -625,11 +666,11 @@ msgstr ""
"ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタ" "ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタ"
"イプのアセットのみをサポートします" "イプのアセットのみをサポートします"
#: accounts/notifications.py:8 #: accounts/notifications.py:9 accounts/notifications.py:34
msgid "Notification of account backup route task results" msgid "Notification of account backup route task results"
msgstr "アカウントバックアップルートタスクの結果の通知" msgstr "アカウントバックアップルートタスクの結果の通知"
#: accounts/notifications.py:18 #: accounts/notifications.py:19 accounts/notifications.py:43
msgid "" msgid ""
"{} - The account backup passage task has been completed. See the attachment " "{} - The account backup passage task has been completed. See the attachment "
"for details" "for details"
@ -637,7 +678,7 @@ msgstr ""
"{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご" "{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご"
"覧ください" "覧ください"
#: accounts/notifications.py:21 #: accounts/notifications.py:22
msgid "" msgid ""
"{} - The account backup passage task has been completed: the encryption " "{} - The account backup passage task has been completed: the encryption "
"password has not been set - please go to personal information -> file " "password has not been set - please go to personal information -> file "
@ -647,17 +688,17 @@ msgstr ""
"されていません-個人情報にアクセスしてください-> ファイル暗号化パスワードを設" "されていません-個人情報にアクセスしてください-> ファイル暗号化パスワードを設"
"定してください暗号化パスワード" "定してください暗号化パスワード"
#: accounts/notifications.py:33 #: accounts/notifications.py:53
msgid "Notification of implementation result of encryption change plan" msgid "Notification of implementation result of encryption change plan"
msgstr "暗号化変更プランの実装結果の通知" msgstr "暗号化変更プランの実装結果の通知"
#: accounts/notifications.py:43 #: accounts/notifications.py:63
msgid "" msgid ""
"{} - The encryption change task has been completed. See the attachment for " "{} - The encryption change task has been completed. See the attachment for "
"details" "details"
msgstr "{} -暗号化変更タスクが完了しました。詳細は添付ファイルをご覧ください" msgstr "{} -暗号化変更タスクが完了しました。詳細は添付ファイルをご覧ください"
#: accounts/notifications.py:46 #: accounts/notifications.py:66
msgid "" msgid ""
"{} - The encryption change task has been completed: the encryption password " "{} - The encryption change task has been completed: the encryption password "
"has not been set - please go to personal information -> file encryption " "has not been set - please go to personal information -> file encryption "
@ -686,7 +727,7 @@ msgstr "カテゴリ"
#: accounts/serializers/account/account.py:191 #: accounts/serializers/account/account.py:191
#: accounts/serializers/automations/base.py:54 acls/models/command_acl.py:24 #: accounts/serializers/automations/base.py:54 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 applications/models.py:14 #: acls/serializers/command_acl.py:19 applications/models.py:14
#: assets/models/_user.py:50 assets/models/automations/base.py:20 #: assets/models/_user.py:49 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:90 #: assets/models/cmd_filter.py:74 assets/models/platform.py:90
#: assets/serializers/asset/common.py:122 assets/serializers/platform.py:113 #: assets/serializers/asset/common.py:122 assets/serializers/platform.py:113
#: assets/serializers/platform.py:132 audits/serializers.py:50 #: assets/serializers/platform.py:132 audits/serializers.py:50
@ -695,8 +736,8 @@ msgstr "カテゴリ"
#: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:39 #: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:39
#: terminal/models/component/storage.py:57 #: terminal/models/component/storage.py:57
#: terminal/models/component/storage.py:146 terminal/serializers/applet.py:29 #: terminal/models/component/storage.py:146 terminal/serializers/applet.py:29
#: terminal/serializers/session.py:21 terminal/serializers/storage.py:228 #: terminal/serializers/session.py:21 terminal/serializers/storage.py:264
#: terminal/serializers/storage.py:240 tickets/models/comment.py:26 #: terminal/serializers/storage.py:276 tickets/models/comment.py:26
#: tickets/models/flow.py:56 tickets/models/ticket/apply_application.py:16 #: tickets/models/flow.py:56 tickets/models/ticket/apply_application.py:16
#: tickets/models/ticket/general.py:275 tickets/serializers/flow.py:53 #: tickets/models/ticket/general.py:275 tickets/serializers/flow.py:53
#: tickets/serializers/ticket/ticket.py:19 #: tickets/serializers/ticket/ticket.py:19
@ -778,28 +819,28 @@ msgstr "ユーザー"
msgid "Date" msgid "Date"
msgstr "日付" msgstr "日付"
#: accounts/serializers/account/backup.py:31 #: accounts/serializers/account/backup.py:38
#: accounts/serializers/automations/base.py:36 #: accounts/serializers/automations/base.py:36
#: assets/serializers/automations/base.py:34 ops/mixin.py:23 ops/mixin.py:104 #: assets/serializers/automations/base.py:34 ops/mixin.py:23 ops/mixin.py:104
#: settings/serializers/auth/ldap.py:66 #: settings/serializers/auth/ldap.py:66
msgid "Periodic perform" msgid "Periodic perform"
msgstr "定期的なパフォーマンス" msgstr "定期的なパフォーマンス"
#: accounts/serializers/account/backup.py:32 #: accounts/serializers/account/backup.py:39
#: accounts/serializers/automations/base.py:37 #: accounts/serializers/automations/base.py:37
msgid "Executed amount" msgid "Executed amount"
msgstr "実行回数" msgstr "実行回数"
#: accounts/serializers/account/backup.py:35 #: accounts/serializers/account/backup.py:42
#: accounts/serializers/automations/change_secret.py:57 #: accounts/serializers/automations/change_secret.py:57
msgid "Currently only mail sending is supported" msgid "Currently only mail sending is supported"
msgstr "現在、メール送信のみがサポートされています" msgstr "現在、メール送信のみがサポートされています"
#: accounts/serializers/account/backup.py:37 #: accounts/serializers/account/backup.py:44
msgid "Asset type" msgid "Asset type"
msgstr "資産タイプ" msgstr "資産タイプ"
#: accounts/serializers/account/base.py:24 #: accounts/serializers/account/base.py:24 terminal/serializers/storage.py:149
msgid "Key password" msgid "Key password"
msgstr "キーパスワード" msgstr "キーパスワード"
@ -850,7 +891,7 @@ msgid ""
"default parameters will be used" "default parameters will be used"
msgstr "关联平台,可以配置推送参数,如果不关联,则使用默认参数" msgstr "关联平台,可以配置推送参数,如果不关联,则使用默认参数"
#: accounts/serializers/account/virtual.py:19 assets/models/_user.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/_user.py:26
#: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88 #: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88
#: assets/models/group.py:20 common/db/models.py:36 ops/models/adhoc.py:26 #: assets/models/group.py:20 common/db/models.py:36 ops/models/adhoc.py:26
#: ops/models/job.py:145 ops/models/playbook.py:31 rbac/models/role.py:37 #: ops/models/job.py:145 ops/models/playbook.py:31 rbac/models/role.py:37
@ -912,7 +953,7 @@ msgstr "自動タスク実行履歴"
#: accounts/serializers/automations/change_secret.py:149 audits/const.py:61 #: accounts/serializers/automations/change_secret.py:149 audits/const.py:61
#: audits/models.py:63 audits/signal_handlers/activity_log.py:33 #: audits/models.py:63 audits/signal_handlers/activity_log.py:33
#: common/const/choices.py:18 ops/const.py:72 ops/serializers/celery.py:40 #: common/const/choices.py:18 ops/const.py:72 ops/serializers/celery.py:40
#: terminal/const.py:76 terminal/models/session/sharing.py:121 #: terminal/const.py:77 terminal/models/session/sharing.py:121
#: tickets/views/approve.py:117 #: tickets/views/approve.py:117
msgid "Success" msgid "Success"
msgstr "成功" msgstr "成功"
@ -937,8 +978,6 @@ msgid "Account execute automation"
msgstr "アカウント実行の自動化" msgstr "アカウント実行の自動化"
#: accounts/tasks/automation.py:51 accounts/tasks/automation.py:62 #: accounts/tasks/automation.py:51 accounts/tasks/automation.py:62
#, fuzzy
#| msgid "Asset execute automation"
msgid "Execute automation record" msgid "Execute automation record"
msgstr "アセット実行の自動化" msgstr "アセット実行の自動化"
@ -1015,7 +1054,7 @@ msgstr "警告"
msgid "Notifications" msgid "Notifications"
msgstr "通知" msgstr "通知"
#: acls/models/base.py:37 assets/models/_user.py:51 #: acls/models/base.py:37 assets/models/_user.py:50
#: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:97 #: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:97
#: xpack/plugins/cloud/models.py:275 #: xpack/plugins/cloud/models.py:275
msgid "Priority" msgid "Priority"
@ -1051,7 +1090,7 @@ msgid "Accounts"
msgstr "アカウント" msgstr "アカウント"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:55 terminal/const.py:84 #: ops/serializers/job.py:55 terminal/const.py:85
#: terminal/models/session/session.py:42 terminal/serializers/command.py:18 #: terminal/models/session/session.py:42 terminal/serializers/command.py:18
#: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_alert.html:12
#: terminal/templates/terminal/_msg_command_execute_alert.html:10 #: terminal/templates/terminal/_msg_command_execute_alert.html:10
@ -1305,7 +1344,7 @@ msgid "Authentication failed"
msgstr "認証に失敗しました" msgstr "認証に失敗しました"
#: assets/automations/ping_gateway/manager.py:60 #: assets/automations/ping_gateway/manager.py:60
#: assets/automations/ping_gateway/manager.py:86 terminal/const.py:100 #: assets/automations/ping_gateway/manager.py:86 terminal/const.py:101
msgid "Connect failed" msgid "Connect failed"
msgstr "接続に失敗しました" msgstr "接続に失敗しました"
@ -1541,97 +1580,97 @@ msgstr "Webサイト"
msgid "This function is not supported temporarily" msgid "This function is not supported temporarily"
msgstr "この機能は一時的にサポートされていません" msgstr "この機能は一時的にサポートされていません"
#: assets/models/_user.py:25 #: assets/models/_user.py:24
msgid "SSH private key" msgid "SSH private key"
msgstr "SSH秘密鍵" msgstr "SSH秘密鍵"
#: assets/models/_user.py:26 #: assets/models/_user.py:25
msgid "SSH public key" msgid "SSH public key"
msgstr "SSHパブリックキー" msgstr "SSHパブリックキー"
#: assets/models/_user.py:28 assets/models/automations/base.py:114 #: assets/models/_user.py:27 assets/models/automations/base.py:114
#: assets/models/cmd_filter.py:41 assets/models/group.py:19 #: assets/models/cmd_filter.py:41 assets/models/group.py:19
#: audits/models.py:266 common/db/models.py:34 ops/models/base.py:54 #: audits/models.py:266 common/db/models.py:34 ops/models/base.py:54
#: ops/models/job.py:227 users/models/user.py:1024 #: ops/models/job.py:227 users/models/user.py:1024
msgid "Date created" msgid "Date created"
msgstr "作成された日付" msgstr "作成された日付"
#: assets/models/_user.py:29 assets/models/cmd_filter.py:42 #: assets/models/_user.py:28 assets/models/cmd_filter.py:42
#: common/db/models.py:35 users/models/user.py:846 #: common/db/models.py:35 users/models/user.py:846
msgid "Date updated" msgid "Date updated"
msgstr "更新日" msgstr "更新日"
#: assets/models/_user.py:30 assets/models/cmd_filter.py:44 #: assets/models/_user.py:29 assets/models/cmd_filter.py:44
#: assets/models/cmd_filter.py:91 assets/models/group.py:18 #: assets/models/cmd_filter.py:91 assets/models/group.py:18
#: common/db/models.py:32 users/models/user.py:835 #: common/db/models.py:32 users/models/user.py:835
#: users/serializers/group.py:29 #: users/serializers/group.py:29
msgid "Created by" msgid "Created by"
msgstr "によって作成された" msgstr "によって作成された"
#: assets/models/_user.py:40 #: assets/models/_user.py:39
msgid "Automatic managed" msgid "Automatic managed"
msgstr "自動管理" msgstr "自動管理"
#: assets/models/_user.py:41 #: assets/models/_user.py:40
msgid "Manually input" msgid "Manually input"
msgstr "手動入力" msgstr "手動入力"
#: assets/models/_user.py:45 #: assets/models/_user.py:44
msgid "Common user" msgid "Common user"
msgstr "共通ユーザー" msgstr "共通ユーザー"
#: assets/models/_user.py:46 assets/models/_user.py:95 #: assets/models/_user.py:45 assets/models/_user.py:98
msgid "Admin user" msgid "Admin user"
msgstr "管理ユーザー" msgstr "管理ユーザー"
#: assets/models/_user.py:49 #: assets/models/_user.py:48
msgid "Username same with user" msgid "Username same with user"
msgstr "ユーザーと同じユーザー名" msgstr "ユーザーと同じユーザー名"
#: assets/models/_user.py:52 authentication/models/connection_token.py:41 #: assets/models/_user.py:53 authentication/models/connection_token.py:41
#: authentication/serializers/connect_token_secret.py:111 #: authentication/serializers/connect_token_secret.py:111
#: terminal/models/applet/applet.py:42 terminal/serializers/session.py:19 #: terminal/models/applet/applet.py:42 terminal/serializers/session.py:19
#: terminal/serializers/session.py:45 terminal/serializers/storage.py:70 #: terminal/serializers/session.py:45 terminal/serializers/storage.py:71
msgid "Protocol" msgid "Protocol"
msgstr "プロトコル" msgstr "プロトコル"
#: assets/models/_user.py:54 #: assets/models/_user.py:55
msgid "Sudo" msgid "Sudo"
msgstr "すど" msgstr "すど"
#: assets/models/_user.py:55 ops/const.py:49 ops/const.py:59 #: assets/models/_user.py:56 ops/const.py:49 ops/const.py:59
msgid "Shell" msgid "Shell"
msgstr "シェル" msgstr "シェル"
#: assets/models/_user.py:56 #: assets/models/_user.py:58
msgid "Login mode" msgid "Login mode"
msgstr "ログインモード" msgstr "ログインモード"
#: assets/models/_user.py:57 #: assets/models/_user.py:59 terminal/serializers/storage.py:152
msgid "SFTP Root" msgid "SFTP Root"
msgstr "SFTPルート" msgstr "SFTPルート"
#: assets/models/_user.py:58 #: assets/models/_user.py:60
msgid "Home" msgid "Home"
msgstr "ホーム" msgstr "ホーム"
#: assets/models/_user.py:59 #: assets/models/_user.py:61
msgid "System groups" msgid "System groups"
msgstr "システムグループ" msgstr "システムグループ"
#: assets/models/_user.py:62 #: assets/models/_user.py:64
msgid "User switch" msgid "User switch"
msgstr "ユーザースイッチ" msgstr "ユーザースイッチ"
#: assets/models/_user.py:63 #: assets/models/_user.py:66
msgid "Switch from" msgid "Switch from"
msgstr "から切り替え" msgstr "から切り替え"
#: assets/models/_user.py:69 #: assets/models/_user.py:72
msgid "System user" msgid "System user"
msgstr "システムユーザー" msgstr "システムユーザー"
#: assets/models/_user.py:71 #: assets/models/_user.py:74
msgid "Can match system user" msgid "Can match system user"
msgstr "システムユーザーに一致できます" msgstr "システムユーザーに一致できます"
@ -1641,6 +1680,7 @@ msgstr "クラウド サービス"
#: assets/models/asset/common.py:92 assets/models/platform.py:16 #: assets/models/asset/common.py:92 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:72 #: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:72
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:73 #: xpack/plugins/cloud/serializers/account_attrs.py:73
msgid "Port" msgid "Port"
msgstr "ポート" msgstr "ポート"
@ -2969,7 +3009,7 @@ msgid "IP group"
msgstr "IP グループ" msgstr "IP グループ"
#: authentication/models/connection_token.py:38 #: authentication/models/connection_token.py:38
#: terminal/serializers/storage.py:113 #: terminal/serializers/storage.py:114
msgid "Account name" msgid "Account name"
msgstr "アカウント名" msgstr "アカウント名"
@ -3105,24 +3145,12 @@ msgstr "アクション"
msgid "Is expired" msgid "Is expired"
msgstr "期限切れです" msgstr "期限切れです"
#: authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24
#: notifications/backends/__init__.py:10 settings/serializers/msg.py:22
#: settings/serializers/msg.py:57 users/forms/profile.py:102
#: users/forms/profile.py:109 users/models/user.py:794
#: users/templates/users/forgot_password.html:117
#: users/views/profile/reset.py:92
msgid "Email"
msgstr "メール"
#: authentication/serializers/password_mfa.py:29 #: authentication/serializers/password_mfa.py:29
#: users/templates/users/forgot_password.html:108 #: users/templates/users/forgot_password.html:108
msgid "The {} cannot be empty" msgid "The {} cannot be empty"
msgstr "{} 空にしてはならない" msgstr "{} 空にしてはならない"
#: authentication/serializers/token.py:22 #: authentication/serializers/token.py:22
#, fuzzy
#| msgid "Access key"
msgid "Access IP" msgid "Access IP"
msgstr "IPホワイトリスト" msgstr "IPホワイトリスト"
@ -3526,7 +3554,7 @@ msgstr "タイミングトリガー"
msgid "Ready" msgid "Ready"
msgstr "の準備を" msgstr "の準備を"
#: common/const/choices.py:16 terminal/const.py:75 tickets/const.py:29 #: common/const/choices.py:16 terminal/const.py:76 tickets/const.py:29
#: tickets/const.py:39 #: tickets/const.py:39
msgid "Pending" msgid "Pending"
msgstr "未定" msgstr "未定"
@ -3783,14 +3811,18 @@ msgstr "間違ったデータ タイプです。リストにする必要があ
msgid "Invalid choice: {}" msgid "Invalid choice: {}"
msgstr "無効なオプション: {}" msgstr "無効なオプション: {}"
#: common/tasks.py:20 common/utils/verify_code.py:16 #: common/tasks.py:21 common/utils/verify_code.py:16
msgid "Send email" msgid "Send email"
msgstr "メールを送る" msgstr "メールを送る"
#: common/tasks.py:47 #: common/tasks.py:48
msgid "Send email attachment" msgid "Send email attachment"
msgstr "メールの添付ファイルを送信" msgstr "メールの添付ファイルを送信"
#: common/tasks.py:69 terminal/tasks.py:62
msgid "Upload session replay to external storage"
msgstr "セッションの記録を外部ストレージにアップロードする"
#: common/utils/ip/geoip/utils.py:26 #: common/utils/ip/geoip/utils.py:26
msgid "Invalid ip" msgid "Invalid ip"
msgstr "無効な IP" msgstr "無効な IP"
@ -4520,8 +4552,6 @@ msgid "Can view file manager"
msgstr "ファイルマネージャを表示できます" msgstr "ファイルマネージャを表示できます"
#: rbac/models/menu.py:20 #: rbac/models/menu.py:20
#, fuzzy
#| msgid "Can view my assets"
msgid "Can view System Tools" msgid "Can view System Tools"
msgstr "私の資産を見ることができます" msgstr "私の資産を見ることができます"
@ -6257,64 +6287,60 @@ msgstr "確認して同意する"
msgid "Review & Cancel" msgid "Review & Cancel"
msgstr "確認してキャンセル" msgstr "確認してキャンセル"
#: terminal/const.py:44 #: terminal/const.py:45
msgid "Critical" msgid "Critical"
msgstr "クリティカル" msgstr "クリティカル"
#: terminal/const.py:45 #: terminal/const.py:46
msgid "High" msgid "High"
msgstr "高い" msgstr "高い"
#: terminal/const.py:46 terminal/const.py:82 #: terminal/const.py:47 terminal/const.py:83
#: users/templates/users/reset_password.html:50 #: users/templates/users/reset_password.html:50
msgid "Normal" msgid "Normal"
msgstr "正常" msgstr "正常"
#: terminal/const.py:47 #: terminal/const.py:48
msgid "Offline" msgid "Offline"
msgstr "オフライン" msgstr "オフライン"
#: terminal/const.py:78 #: terminal/const.py:79
msgid "Mismatch" msgid "Mismatch"
msgstr "一致しない" msgstr "一致しない"
#: terminal/const.py:83 #: terminal/const.py:84
msgid "Tunnel" msgid "Tunnel"
msgstr "ちかチャネル" msgstr "ちかチャネル"
#: terminal/const.py:85 #: terminal/const.py:90
msgid "SFTP"
msgstr "SFTP"
#: terminal/const.py:89
msgid "Read only" msgid "Read only"
msgstr "読み取り専用" msgstr "読み取り専用"
#: terminal/const.py:90 #: terminal/const.py:91
msgid "Writable" msgid "Writable"
msgstr "書き込み可能" msgstr "書き込み可能"
#: terminal/const.py:94 #: terminal/const.py:95
msgid "Kill session" msgid "Kill session"
msgstr "セッションを終了する" msgstr "セッションを終了する"
#: terminal/const.py:95 #: terminal/const.py:96
msgid "Lock session" msgid "Lock session"
msgstr "セッションをロックする" msgstr "セッションをロックする"
#: terminal/const.py:96 #: terminal/const.py:97
msgid "Unlock session" msgid "Unlock session"
msgstr "セッションのロックを解除する" msgstr "セッションのロックを解除する"
#: terminal/const.py:101 #: terminal/const.py:102
msgid "Replay create failed" msgid "Replay create failed"
msgstr "ビデオの作成に失敗しました" msgstr "ビデオの作成に失敗しました"
#: terminal/const.py:102 #: terminal/const.py:103
msgid "Replay upload failed" msgid "Replay upload failed"
msgstr "動画のアップロードに失敗しました" msgstr "動画のアップロードに失敗しました"
#: terminal/const.py:103 #: terminal/const.py:104
msgid "Replay convert failed" msgid "Replay convert failed"
msgstr "ビデオのトランスコーディングに失敗しました" msgstr "ビデオのトランスコーディングに失敗しました"
@ -6350,7 +6376,7 @@ msgstr "同時実行可能"
msgid "Tags" msgid "Tags"
msgstr "ラベル" msgstr "ラベル"
#: terminal/models/applet/applet.py:48 terminal/serializers/storage.py:161 #: terminal/models/applet/applet.py:48 terminal/serializers/storage.py:197
msgid "Hosts" msgid "Hosts"
msgstr "ホスト" msgstr "ホスト"
@ -6443,9 +6469,9 @@ msgstr "Redis ポート"
#: terminal/models/component/endpoint.py:29 #: terminal/models/component/endpoint.py:29
#: terminal/models/component/endpoint.py:102 #: terminal/models/component/endpoint.py:102
#: terminal/serializers/endpoint.py:73 terminal/serializers/storage.py:40 #: terminal/serializers/endpoint.py:73 terminal/serializers/storage.py:41
#: terminal/serializers/storage.py:52 terminal/serializers/storage.py:82 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83
#: terminal/serializers/storage.py:92 terminal/serializers/storage.py:100 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101
msgid "Endpoint" msgid "Endpoint"
msgstr "エンドポイント" msgstr "エンドポイント"
@ -6697,7 +6723,7 @@ msgstr ""
"URL を入力します。<br>例: https://172.16.10.110 または https://dev." "URL を入力します。<br>例: https://172.16.10.110 または https://dev."
"jumpserver.com" "jumpserver.com"
#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:172 #: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:208
msgid "Ignore Certificate Verification" msgid "Ignore Certificate Verification"
msgstr "証明書の検証を無視する" msgstr "証明書の検証を無視する"
@ -6860,69 +6886,78 @@ msgstr "表示からのログイン"
msgid "Terminal display" msgid "Terminal display"
msgstr "ターミナルディスプレイ" msgstr "ターミナルディスプレイ"
#: terminal/serializers/storage.py:22 #: terminal/serializers/storage.py:23
msgid "Endpoint invalid: remove path `{}`" msgid "Endpoint invalid: remove path `{}`"
msgstr "エンドポイントが無効: パス '{}' を削除" msgstr "エンドポイントが無効: パス '{}' を削除"
#: terminal/serializers/storage.py:28 #: terminal/serializers/storage.py:29
msgid "Bucket" msgid "Bucket"
msgstr "バケット" msgstr "バケット"
#: terminal/serializers/storage.py:32 #: terminal/serializers/storage.py:33
#: xpack/plugins/cloud/serializers/account_attrs.py:17 #: xpack/plugins/cloud/serializers/account_attrs.py:17
msgid "Access key id" msgid "Access key id"
msgstr "アクセスキー" msgstr "アクセスキー"
#: terminal/serializers/storage.py:36 #: terminal/serializers/storage.py:37
#: xpack/plugins/cloud/serializers/account_attrs.py:20 #: xpack/plugins/cloud/serializers/account_attrs.py:20
msgid "Access key secret" msgid "Access key secret"
msgstr "アクセスキーシークレット" msgstr "アクセスキーシークレット"
#: terminal/serializers/storage.py:67 xpack/plugins/cloud/models.py:250 #: terminal/serializers/storage.py:68 xpack/plugins/cloud/models.py:250
msgid "Region" msgid "Region"
msgstr "リージョン" msgstr "リージョン"
#: terminal/serializers/storage.py:111 #: terminal/serializers/storage.py:112
msgid "Container name" msgid "Container name"
msgstr "コンテナー名" msgstr "コンテナー名"
#: terminal/serializers/storage.py:114 #: terminal/serializers/storage.py:115
msgid "Account key" msgid "Account key"
msgstr "アカウントキー" msgstr "アカウントキー"
#: terminal/serializers/storage.py:117 #: terminal/serializers/storage.py:118
msgid "Endpoint suffix" msgid "Endpoint suffix"
msgstr "エンドポイントサフィックス" msgstr "エンドポイントサフィックス"
#: terminal/serializers/storage.py:137 #: terminal/serializers/storage.py:129
msgid "HOST"
msgstr ""
#: terminal/serializers/storage.py:146 users/models/user.py:822
#: xpack/plugins/cloud/serializers/account_attrs.py:206
msgid "Private key"
msgstr "ssh秘密鍵"
#: terminal/serializers/storage.py:173
msgid "The address cannot contain the special character `#`" msgid "The address cannot contain the special character `#`"
msgstr "アドレスには特殊文字「#」を含めることはできません" msgstr "アドレスには特殊文字「#」を含めることはできません"
#: terminal/serializers/storage.py:139 #: terminal/serializers/storage.py:175
msgid "The address format is incorrect" msgid "The address format is incorrect"
msgstr "アドレス形式が正しくありません" msgstr "アドレス形式が正しくありません"
#: terminal/serializers/storage.py:146 #: terminal/serializers/storage.py:182
msgid "Host invalid" msgid "Host invalid"
msgstr "ホスト無効" msgstr "ホスト無効"
#: terminal/serializers/storage.py:149 #: terminal/serializers/storage.py:185
msgid "Port invalid" msgid "Port invalid"
msgstr "ポートが無効" msgstr "ポートが無効"
#: terminal/serializers/storage.py:164 #: terminal/serializers/storage.py:200
msgid "Index by date" msgid "Index by date"
msgstr "日付による索引付け" msgstr "日付による索引付け"
#: terminal/serializers/storage.py:165 #: terminal/serializers/storage.py:201
msgid "Whether to create an index by date" msgid "Whether to create an index by date"
msgstr "現在の日付に基づいてインデックスを動的に作成するかどうか" msgstr "現在の日付に基づいてインデックスを動的に作成するかどうか"
#: terminal/serializers/storage.py:168 #: terminal/serializers/storage.py:204
msgid "Index" msgid "Index"
msgstr "インデックス" msgstr "インデックス"
#: terminal/serializers/storage.py:170 #: terminal/serializers/storage.py:206
msgid "Doc type" msgid "Doc type"
msgstr "Docタイプ" msgstr "Docタイプ"
@ -6942,10 +6977,6 @@ msgstr "端末の状態を定期的にクリーンアップする"
msgid "Clean orphan session" msgid "Clean orphan session"
msgstr "オフライン セッションをクリアする" msgstr "オフライン セッションをクリアする"
#: terminal/tasks.py:62
msgid "Upload session replay to external storage"
msgstr "セッションの記録を外部ストレージにアップロードする"
#: terminal/tasks.py:91 #: terminal/tasks.py:91
msgid "Run applet host deployment" msgid "Run applet host deployment"
msgstr "アプリケーション マシンの展開を実行する" msgstr "アプリケーション マシンの展開を実行する"
@ -7500,11 +7531,6 @@ msgstr "電話"
msgid "OTP secret key" msgid "OTP secret key"
msgstr "OTP 秘密" msgstr "OTP 秘密"
#: users/models/user.py:822
#: xpack/plugins/cloud/serializers/account_attrs.py:206
msgid "Private key"
msgstr "ssh秘密鍵"
#: users/models/user.py:830 users/serializers/profile.py:128 #: users/models/user.py:830 users/serializers/profile.py:128
#: users/serializers/user.py:166 #: users/serializers/user.py:166
msgid "Is first login" msgid "Is first login"
@ -8664,3 +8690,6 @@ msgstr "エンタープライズプロフェッショナル版"
#: xpack/plugins/license/models.py:86 #: xpack/plugins/license/models.py:86
msgid "Ultimate edition" msgid "Ultimate edition"
msgstr "エンタープライズ・フラッグシップ・エディション" msgstr "エンタープライズ・フラッグシップ・エディション"
#~ msgid "Object Storage"
#~ msgstr "オブジェクトストレージ"

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:73e074ad0c1d8bfec0c2df6e2c9e29a230a3acc0e8ee1c0820910e8ce769fd52 oid sha256:b9a380c7adbd9fad7af4257cb72742c0e68b50846591cc5b0124a0df539ec285
size 134072 size 134380

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-03 16:52+0800\n" "POT-Creation-Date: 2023-11-03 18:29+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -23,11 +23,12 @@ msgstr "参数 'action' 必须是 [{}]"
#: accounts/const/account.py:6 #: accounts/const/account.py:6
#: accounts/serializers/automations/change_secret.py:32 #: accounts/serializers/automations/change_secret.py:32
#: assets/models/_user.py:24 audits/signal_handlers/login_log.py:34 #: assets/models/_user.py:23 audits/signal_handlers/login_log.py:34
#: authentication/confirm/password.py:9 authentication/confirm/password.py:24 #: authentication/confirm/password.py:9 authentication/confirm/password.py:24
#: authentication/confirm/password.py:26 authentication/forms.py:32 #: authentication/confirm/password.py:26 authentication/forms.py:32
#: authentication/templates/authentication/login.html:330 #: authentication/templates/authentication/login.html:330
#: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47 #: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47
#: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142
#: users/forms/profile.py:22 users/serializers/user.py:104 #: users/forms/profile.py:22 users/serializers/user.py:104
#: users/templates/users/_msg_user_created.html:13 #: users/templates/users/_msg_user_created.html:13
#: users/templates/users/user_password_verify.html:18 #: users/templates/users/user_password_verify.html:18
@ -37,6 +38,7 @@ msgstr "密码"
#: accounts/const/account.py:7 #: accounts/const/account.py:7
#: accounts/serializers/automations/change_secret.py:33 #: accounts/serializers/automations/change_secret.py:33
#: terminal/serializers/storage.py:124
msgid "SSH key" msgid "SSH key"
msgstr "SSH 密钥" msgstr "SSH 密钥"
@ -44,7 +46,7 @@ msgstr "SSH 密钥"
msgid "Access key" msgid "Access key"
msgstr "Access key" msgstr "Access key"
#: accounts/const/account.py:9 assets/models/_user.py:48 #: accounts/const/account.py:9 assets/models/_user.py:47
#: authentication/backends/passkey/models.py:16 #: authentication/backends/passkey/models.py:16
#: authentication/models/sso_token.py:14 settings/serializers/feature.py:50 #: authentication/models/sso_token.py:14 settings/serializers/feature.py:50
msgid "Token" msgid "Token"
@ -96,7 +98,7 @@ msgstr "更新"
#: accounts/const/account.py:33 #: accounts/const/account.py:33
#: accounts/serializers/automations/change_secret.py:150 audits/const.py:62 #: accounts/serializers/automations/change_secret.py:150 audits/const.py:62
#: audits/signal_handlers/activity_log.py:33 common/const/choices.py:19 #: audits/signal_handlers/activity_log.py:33 common/const/choices.py:19
#: ops/const.py:74 terminal/const.py:77 xpack/plugins/cloud/const.py:43 #: ops/const.py:74 terminal/const.py:78 xpack/plugins/cloud/const.py:43
msgid "Failed" msgid "Failed"
msgstr "失败" msgstr "失败"
@ -188,6 +190,21 @@ msgstr "创建并推送"
msgid "Only create" msgid "Only create"
msgstr "仅创建" msgstr "仅创建"
#: accounts/const/automation.py:102
#: authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24
#: notifications/backends/__init__.py:10 settings/serializers/msg.py:22
#: settings/serializers/msg.py:57 users/forms/profile.py:102
#: users/forms/profile.py:109 users/models/user.py:794
#: users/templates/users/forgot_password.html:117
#: users/views/profile/reset.py:92
msgid "Email"
msgstr "邮箱"
#: accounts/const/automation.py:104 terminal/const.py:86
msgid "SFTP"
msgstr "SFTP"
#: accounts/const/vault.py:8 assets/const/category.py:12 #: accounts/const/vault.py:8 assets/const/category.py:12
#: assets/models/asset/database.py:9 assets/models/asset/database.py:24 #: assets/models/asset/database.py:9 assets/models/asset/database.py:24
msgid "Database" msgid "Database"
@ -294,20 +311,42 @@ msgstr "可以验证账号"
msgid "Can push account" msgid "Can push account"
msgstr "可以推送账号" msgstr "可以推送账号"
#: accounts/models/automations/backup_account.py:27 #: accounts/models/automations/backup_account.py:28
msgid "Backup Type"
msgstr "备份类型"
#: accounts/models/automations/backup_account.py:29
#: accounts/models/automations/backup_account.py:30
msgid "Is Password Divided"
msgstr "密钥是否拆分成前后两部分"
#: accounts/models/automations/backup_account.py:33
msgid "Recipient part one" msgid "Recipient part one"
msgstr "收件人部分一" msgstr "收件人部分一"
#: accounts/models/automations/backup_account.py:31 #: accounts/models/automations/backup_account.py:37
msgid "Recipient part two" msgid "Recipient part two"
msgstr "收件人部分二" msgstr "收件人部分二"
#: accounts/models/automations/backup_account.py:40 #: accounts/models/automations/backup_account.py:41
#: accounts/models/automations/backup_account.py:110 msgid "Object Storage Recipient part one"
msgstr "接收服务器一"
#: accounts/models/automations/backup_account.py:45
msgid "Object Storage Recipient part two"
msgstr "接收服务器二"
#: accounts/models/automations/backup_account.py:48
#: accounts/serializers/account/backup.py:20
msgid "Zip Encrypt Password"
msgstr "文件加密密码"
#: accounts/models/automations/backup_account.py:56
#: accounts/models/automations/backup_account.py:139
msgid "Account backup plan" msgid "Account backup plan"
msgstr "账号备份计划" msgstr "账号备份计划"
#: accounts/models/automations/backup_account.py:91 #: accounts/models/automations/backup_account.py:120
#: assets/models/automations/base.py:115 audits/models.py:64 #: assets/models/automations/base.py:115 audits/models.py:64
#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:228 #: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:228
#: ops/templates/ops/celery_task_log.html:75 #: ops/templates/ops/celery_task_log.html:75
@ -318,37 +357,37 @@ msgstr "账号备份计划"
msgid "Date start" msgid "Date start"
msgstr "开始日期" msgstr "开始日期"
#: accounts/models/automations/backup_account.py:94 #: accounts/models/automations/backup_account.py:123
#: authentication/templates/authentication/_msg_oauth_bind.html:11 #: authentication/templates/authentication/_msg_oauth_bind.html:11
#: notifications/notifications.py:186 #: notifications/notifications.py:186
msgid "Time" msgid "Time"
msgstr "时间" msgstr "时间"
#: accounts/models/automations/backup_account.py:98 #: accounts/models/automations/backup_account.py:127
msgid "Account backup snapshot" msgid "Account backup snapshot"
msgstr "账号备份快照" msgstr "账号备份快照"
#: accounts/models/automations/backup_account.py:102 #: accounts/models/automations/backup_account.py:131
#: accounts/serializers/account/backup.py:42 #: accounts/serializers/account/backup.py:49
#: accounts/serializers/automations/base.py:55 #: accounts/serializers/automations/base.py:55
#: assets/models/automations/base.py:122 #: assets/models/automations/base.py:122
#: assets/serializers/automations/base.py:40 #: assets/serializers/automations/base.py:40
msgid "Trigger mode" msgid "Trigger mode"
msgstr "触发模式" msgstr "触发模式"
#: accounts/models/automations/backup_account.py:105 audits/models.py:202 #: accounts/models/automations/backup_account.py:134 audits/models.py:202
#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:205 #: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:205
msgid "Reason" msgid "Reason"
msgstr "原因" msgstr "原因"
#: accounts/models/automations/backup_account.py:107 #: accounts/models/automations/backup_account.py:136
#: accounts/serializers/automations/change_secret.py:105 #: accounts/serializers/automations/change_secret.py:105
#: accounts/serializers/automations/change_secret.py:128 #: accounts/serializers/automations/change_secret.py:128
#: ops/serializers/job.py:56 terminal/serializers/session.py:49 #: ops/serializers/job.py:56 terminal/serializers/session.py:49
msgid "Is success" msgid "Is success"
msgstr "是否成功" msgstr "是否成功"
#: accounts/models/automations/backup_account.py:115 #: accounts/models/automations/backup_account.py:144
msgid "Account backup execution" msgid "Account backup execution"
msgstr "账号备份执行" msgstr "账号备份执行"
@ -393,7 +432,7 @@ msgid "SSH key change strategy"
msgstr "SSH 密钥推送方式" msgstr "SSH 密钥推送方式"
#: accounts/models/automations/change_secret.py:15 #: accounts/models/automations/change_secret.py:15
#: accounts/serializers/account/backup.py:34 #: accounts/serializers/account/backup.py:41
#: accounts/serializers/automations/change_secret.py:56 #: accounts/serializers/automations/change_secret.py:56
msgid "Recipient" msgid "Recipient"
msgstr "收件人" msgstr "收件人"
@ -457,13 +496,14 @@ msgstr "最后登录日期"
#: accounts/models/automations/push_account.py:15 accounts/models/base.py:65 #: accounts/models/automations/push_account.py:15 accounts/models/base.py:65
#: accounts/serializers/account/virtual.py:21 acls/serializers/base.py:19 #: accounts/serializers/account/virtual.py:21 acls/serializers/base.py:19
#: acls/serializers/base.py:50 acls/templates/acls/asset_login_reminder.html:5 #: acls/serializers/base.py:50 acls/templates/acls/asset_login_reminder.html:5
#: acls/templates/acls/user_login_reminder.html:5 assets/models/_user.py:23 #: acls/templates/acls/user_login_reminder.html:5 assets/models/_user.py:22
#: audits/models.py:187 authentication/forms.py:25 authentication/forms.py:27 #: audits/models.py:187 authentication/forms.py:25 authentication/forms.py:27
#: authentication/models/temp_token.py:9 #: authentication/models/temp_token.py:9
#: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_different_city.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9
#: users/forms/profile.py:32 users/forms/profile.py:115 #: terminal/serializers/storage.py:136 users/forms/profile.py:32
#: users/models/user.py:790 users/templates/users/_msg_user_created.html:12 #: users/forms/profile.py:115 users/models/user.py:790
#: users/templates/users/_msg_user_created.html:12
#: xpack/plugins/cloud/serializers/account_attrs.py:26 #: xpack/plugins/cloud/serializers/account_attrs.py:26
msgid "Username" msgid "Username"
msgstr "用户名" msgstr "用户名"
@ -511,6 +551,7 @@ msgstr "账号验证"
#: accounts/serializers/automations/change_secret.py:45 #: accounts/serializers/automations/change_secret.py:45
#: authentication/serializers/connect_token_secret.py:41 #: authentication/serializers/connect_token_secret.py:41
#: authentication/serializers/connect_token_secret.py:50 #: authentication/serializers/connect_token_secret.py:50
#: terminal/serializers/storage.py:140
msgid "Secret type" msgid "Secret type"
msgstr "密文类型" msgstr "密文类型"
@ -535,7 +576,7 @@ msgstr "密码规则"
#: accounts/models/base.py:64 accounts/serializers/account/virtual.py:20 #: accounts/models/base.py:64 accounts/serializers/account/virtual.py:20
#: acls/models/base.py:35 acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/models/base.py:35 acls/models/base.py:96 acls/models/command_acl.py:21
#: acls/serializers/base.py:35 applications/models.py:9 #: acls/serializers/base.py:35 applications/models.py:9
#: assets/models/_user.py:22 assets/models/asset/common.py:91 #: assets/models/_user.py:21 assets/models/asset/common.py:91
#: assets/models/asset/common.py:149 assets/models/cmd_filter.py:21 #: assets/models/asset/common.py:149 assets/models/cmd_filter.py:21
#: assets/models/domain.py:18 assets/models/group.py:17 #: assets/models/domain.py:18 assets/models/group.py:17
#: assets/models/label.py:18 assets/models/platform.py:15 #: assets/models/label.py:18 assets/models/platform.py:15
@ -571,7 +612,7 @@ msgstr "特权账号"
msgid "Is active" msgid "Is active"
msgstr "激活" msgstr "激活"
#: accounts/models/template.py:17 assets/models/_user.py:53 #: accounts/models/template.py:17 assets/models/_user.py:54
msgid "Auto push" msgid "Auto push"
msgstr "自动推送" msgstr "自动推送"
@ -626,17 +667,17 @@ msgid ""
msgstr "" msgstr ""
"连接资产时不使用用户名和密码的账号,仅支持 web类型 和 自定义类型 的资产" "连接资产时不使用用户名和密码的账号,仅支持 web类型 和 自定义类型 的资产"
#: accounts/notifications.py:8 #: accounts/notifications.py:9 accounts/notifications.py:34
msgid "Notification of account backup route task results" msgid "Notification of account backup route task results"
msgstr "账号备份任务结果通知" msgstr "账号备份任务结果通知"
#: accounts/notifications.py:18 #: accounts/notifications.py:19 accounts/notifications.py:43
msgid "" msgid ""
"{} - The account backup passage task has been completed. See the attachment " "{} - The account backup passage task has been completed. See the attachment "
"for details" "for details"
msgstr "{} - 账号备份任务已完成, 详情见附件" msgstr "{} - 账号备份任务已完成, 详情见附件"
#: accounts/notifications.py:21 #: accounts/notifications.py:22
msgid "" msgid ""
"{} - The account backup passage task has been completed: the encryption " "{} - The account backup passage task has been completed: the encryption "
"password has not been set - please go to personal information -> file " "password has not been set - please go to personal information -> file "
@ -645,17 +686,17 @@ msgstr ""
"{} - 账号备份任务已完成: 未设置加密密码 - 请前往个人信息 -> 文件加密密码中设" "{} - 账号备份任务已完成: 未设置加密密码 - 请前往个人信息 -> 文件加密密码中设"
"置加密密码" "置加密密码"
#: accounts/notifications.py:33 #: accounts/notifications.py:53
msgid "Notification of implementation result of encryption change plan" msgid "Notification of implementation result of encryption change plan"
msgstr "改密计划任务结果通知" msgstr "改密计划任务结果通知"
#: accounts/notifications.py:43 #: accounts/notifications.py:63
msgid "" msgid ""
"{} - The encryption change task has been completed. See the attachment for " "{} - The encryption change task has been completed. See the attachment for "
"details" "details"
msgstr "{} - 改密任务已完成, 详情见附件" msgstr "{} - 改密任务已完成, 详情见附件"
#: accounts/notifications.py:46 #: accounts/notifications.py:66
msgid "" msgid ""
"{} - The encryption change task has been completed: the encryption password " "{} - The encryption change task has been completed: the encryption password "
"has not been set - please go to personal information -> file encryption " "has not been set - please go to personal information -> file encryption "
@ -684,7 +725,7 @@ msgstr "类别"
#: accounts/serializers/account/account.py:191 #: accounts/serializers/account/account.py:191
#: accounts/serializers/automations/base.py:54 acls/models/command_acl.py:24 #: accounts/serializers/automations/base.py:54 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 applications/models.py:14 #: acls/serializers/command_acl.py:19 applications/models.py:14
#: assets/models/_user.py:50 assets/models/automations/base.py:20 #: assets/models/_user.py:49 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:90 #: assets/models/cmd_filter.py:74 assets/models/platform.py:90
#: assets/serializers/asset/common.py:122 assets/serializers/platform.py:113 #: assets/serializers/asset/common.py:122 assets/serializers/platform.py:113
#: assets/serializers/platform.py:132 audits/serializers.py:50 #: assets/serializers/platform.py:132 audits/serializers.py:50
@ -693,8 +734,8 @@ msgstr "类别"
#: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:39 #: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:39
#: terminal/models/component/storage.py:57 #: terminal/models/component/storage.py:57
#: terminal/models/component/storage.py:146 terminal/serializers/applet.py:29 #: terminal/models/component/storage.py:146 terminal/serializers/applet.py:29
#: terminal/serializers/session.py:21 terminal/serializers/storage.py:228 #: terminal/serializers/session.py:21 terminal/serializers/storage.py:264
#: terminal/serializers/storage.py:240 tickets/models/comment.py:26 #: terminal/serializers/storage.py:276 tickets/models/comment.py:26
#: tickets/models/flow.py:56 tickets/models/ticket/apply_application.py:16 #: tickets/models/flow.py:56 tickets/models/ticket/apply_application.py:16
#: tickets/models/ticket/general.py:275 tickets/serializers/flow.py:53 #: tickets/models/ticket/general.py:275 tickets/serializers/flow.py:53
#: tickets/serializers/ticket/ticket.py:19 #: tickets/serializers/ticket/ticket.py:19
@ -776,28 +817,28 @@ msgstr "用户"
msgid "Date" msgid "Date"
msgstr "日期" msgstr "日期"
#: accounts/serializers/account/backup.py:31 #: accounts/serializers/account/backup.py:38
#: accounts/serializers/automations/base.py:36 #: accounts/serializers/automations/base.py:36
#: assets/serializers/automations/base.py:34 ops/mixin.py:23 ops/mixin.py:104 #: assets/serializers/automations/base.py:34 ops/mixin.py:23 ops/mixin.py:104
#: settings/serializers/auth/ldap.py:66 #: settings/serializers/auth/ldap.py:66
msgid "Periodic perform" msgid "Periodic perform"
msgstr "定时执行" msgstr "定时执行"
#: accounts/serializers/account/backup.py:32 #: accounts/serializers/account/backup.py:39
#: accounts/serializers/automations/base.py:37 #: accounts/serializers/automations/base.py:37
msgid "Executed amount" msgid "Executed amount"
msgstr "执行次数" msgstr "执行次数"
#: accounts/serializers/account/backup.py:35 #: accounts/serializers/account/backup.py:42
#: accounts/serializers/automations/change_secret.py:57 #: accounts/serializers/automations/change_secret.py:57
msgid "Currently only mail sending is supported" msgid "Currently only mail sending is supported"
msgstr "当前只支持邮件发送" msgstr "当前只支持邮件发送"
#: accounts/serializers/account/backup.py:37 #: accounts/serializers/account/backup.py:44
msgid "Asset type" msgid "Asset type"
msgstr "资产类型" msgstr "资产类型"
#: accounts/serializers/account/base.py:24 #: accounts/serializers/account/base.py:24 terminal/serializers/storage.py:149
msgid "Key password" msgid "Key password"
msgstr "密钥密码" msgstr "密钥密码"
@ -848,7 +889,7 @@ msgid ""
"default parameters will be used" "default parameters will be used"
msgstr "关联平台,可配置推送参数,如果不关联,将使用默认参数" msgstr "关联平台,可配置推送参数,如果不关联,将使用默认参数"
#: accounts/serializers/account/virtual.py:19 assets/models/_user.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/_user.py:26
#: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88 #: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88
#: assets/models/group.py:20 common/db/models.py:36 ops/models/adhoc.py:26 #: assets/models/group.py:20 common/db/models.py:36 ops/models/adhoc.py:26
#: ops/models/job.py:145 ops/models/playbook.py:31 rbac/models/role.py:37 #: ops/models/job.py:145 ops/models/playbook.py:31 rbac/models/role.py:37
@ -909,7 +950,7 @@ msgstr "自动化任务执行历史"
#: accounts/serializers/automations/change_secret.py:149 audits/const.py:61 #: accounts/serializers/automations/change_secret.py:149 audits/const.py:61
#: audits/models.py:63 audits/signal_handlers/activity_log.py:33 #: audits/models.py:63 audits/signal_handlers/activity_log.py:33
#: common/const/choices.py:18 ops/const.py:72 ops/serializers/celery.py:40 #: common/const/choices.py:18 ops/const.py:72 ops/serializers/celery.py:40
#: terminal/const.py:76 terminal/models/session/sharing.py:121 #: terminal/const.py:77 terminal/models/session/sharing.py:121
#: tickets/views/approve.py:117 #: tickets/views/approve.py:117
msgid "Success" msgid "Success"
msgstr "成功" msgstr "成功"
@ -1012,7 +1053,7 @@ msgstr "告警"
msgid "Notifications" msgid "Notifications"
msgstr "通知" msgstr "通知"
#: acls/models/base.py:37 assets/models/_user.py:51 #: acls/models/base.py:37 assets/models/_user.py:50
#: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:97 #: assets/models/cmd_filter.py:76 terminal/models/component/endpoint.py:97
#: xpack/plugins/cloud/models.py:275 #: xpack/plugins/cloud/models.py:275
msgid "Priority" msgid "Priority"
@ -1048,7 +1089,7 @@ msgid "Accounts"
msgstr "账号管理" msgstr "账号管理"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:55 terminal/const.py:84 #: ops/serializers/job.py:55 terminal/const.py:85
#: terminal/models/session/session.py:42 terminal/serializers/command.py:18 #: terminal/models/session/session.py:42 terminal/serializers/command.py:18
#: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_alert.html:12
#: terminal/templates/terminal/_msg_command_execute_alert.html:10 #: terminal/templates/terminal/_msg_command_execute_alert.html:10
@ -1298,7 +1339,7 @@ msgid "Authentication failed"
msgstr "认证失败" msgstr "认证失败"
#: assets/automations/ping_gateway/manager.py:60 #: assets/automations/ping_gateway/manager.py:60
#: assets/automations/ping_gateway/manager.py:86 terminal/const.py:100 #: assets/automations/ping_gateway/manager.py:86 terminal/const.py:101
msgid "Connect failed" msgid "Connect failed"
msgstr "连接失败" msgstr "连接失败"
@ -1532,99 +1573,99 @@ msgstr "网站"
msgid "This function is not supported temporarily" msgid "This function is not supported temporarily"
msgstr "暂时不支持此功能" msgstr "暂时不支持此功能"
#: assets/models/_user.py:25 #: assets/models/_user.py:24
msgid "SSH private key" msgid "SSH private key"
msgstr "SSH密钥" msgstr "SSH密钥"
#: assets/models/_user.py:26 #: assets/models/_user.py:25
msgid "SSH public key" msgid "SSH public key"
msgstr "SSH公钥" msgstr "SSH公钥"
# msgid "Comment" # msgid "Comment"
# msgstr "备注" # msgstr "备注"
#: assets/models/_user.py:28 assets/models/automations/base.py:114 #: assets/models/_user.py:27 assets/models/automations/base.py:114
#: assets/models/cmd_filter.py:41 assets/models/group.py:19 #: assets/models/cmd_filter.py:41 assets/models/group.py:19
#: audits/models.py:266 common/db/models.py:34 ops/models/base.py:54 #: audits/models.py:266 common/db/models.py:34 ops/models/base.py:54
#: ops/models/job.py:227 users/models/user.py:1024 #: ops/models/job.py:227 users/models/user.py:1024
msgid "Date created" msgid "Date created"
msgstr "创建日期" msgstr "创建日期"
#: assets/models/_user.py:29 assets/models/cmd_filter.py:42 #: assets/models/_user.py:28 assets/models/cmd_filter.py:42
#: common/db/models.py:35 users/models/user.py:846 #: common/db/models.py:35 users/models/user.py:846
msgid "Date updated" msgid "Date updated"
msgstr "更新日期" msgstr "更新日期"
#: assets/models/_user.py:30 assets/models/cmd_filter.py:44 #: assets/models/_user.py:29 assets/models/cmd_filter.py:44
#: assets/models/cmd_filter.py:91 assets/models/group.py:18 #: assets/models/cmd_filter.py:91 assets/models/group.py:18
#: common/db/models.py:32 users/models/user.py:835 #: common/db/models.py:32 users/models/user.py:835
#: users/serializers/group.py:29 #: users/serializers/group.py:29
msgid "Created by" msgid "Created by"
msgstr "创建者" msgstr "创建者"
#: assets/models/_user.py:40 #: assets/models/_user.py:39
msgid "Automatic managed" msgid "Automatic managed"
msgstr "托管密码" msgstr "托管密码"
#: assets/models/_user.py:41 #: assets/models/_user.py:40
msgid "Manually input" msgid "Manually input"
msgstr "手动输入" msgstr "手动输入"
#: assets/models/_user.py:45 #: assets/models/_user.py:44
msgid "Common user" msgid "Common user"
msgstr "普通用户" msgstr "普通用户"
#: assets/models/_user.py:46 assets/models/_user.py:95 #: assets/models/_user.py:45 assets/models/_user.py:98
msgid "Admin user" msgid "Admin user"
msgstr "特权用户" msgstr "特权用户"
#: assets/models/_user.py:49 #: assets/models/_user.py:48
msgid "Username same with user" msgid "Username same with user"
msgstr "用户名与用户相同" msgstr "用户名与用户相同"
#: assets/models/_user.py:52 authentication/models/connection_token.py:41 #: assets/models/_user.py:53 authentication/models/connection_token.py:41
#: authentication/serializers/connect_token_secret.py:111 #: authentication/serializers/connect_token_secret.py:111
#: terminal/models/applet/applet.py:42 terminal/serializers/session.py:19 #: terminal/models/applet/applet.py:42 terminal/serializers/session.py:19
#: terminal/serializers/session.py:45 terminal/serializers/storage.py:70 #: terminal/serializers/session.py:45 terminal/serializers/storage.py:71
msgid "Protocol" msgid "Protocol"
msgstr "协议" msgstr "协议"
#: assets/models/_user.py:54 #: assets/models/_user.py:55
msgid "Sudo" msgid "Sudo"
msgstr "Sudo" msgstr "Sudo"
#: assets/models/_user.py:55 ops/const.py:49 ops/const.py:59 #: assets/models/_user.py:56 ops/const.py:49 ops/const.py:59
msgid "Shell" msgid "Shell"
msgstr "Shell" msgstr "Shell"
#: assets/models/_user.py:56 #: assets/models/_user.py:58
msgid "Login mode" msgid "Login mode"
msgstr "认证方式" msgstr "认证方式"
#: assets/models/_user.py:57 #: assets/models/_user.py:59 terminal/serializers/storage.py:152
msgid "SFTP Root" msgid "SFTP Root"
msgstr "SFTP根路径" msgstr "SFTP根路径"
#: assets/models/_user.py:58 #: assets/models/_user.py:60
msgid "Home" msgid "Home"
msgstr "家目录" msgstr "家目录"
#: assets/models/_user.py:59 #: assets/models/_user.py:61
msgid "System groups" msgid "System groups"
msgstr "用户组" msgstr "用户组"
#: assets/models/_user.py:62 #: assets/models/_user.py:64
msgid "User switch" msgid "User switch"
msgstr "用户切换" msgstr "用户切换"
#: assets/models/_user.py:63 #: assets/models/_user.py:66
msgid "Switch from" msgid "Switch from"
msgstr "切换自" msgstr "切换自"
#: assets/models/_user.py:69 #: assets/models/_user.py:72
msgid "System user" msgid "System user"
msgstr "系统用户" msgstr "系统用户"
#: assets/models/_user.py:71 #: assets/models/_user.py:74
msgid "Can match system user" msgid "Can match system user"
msgstr "可以匹配系统用户" msgstr "可以匹配系统用户"
@ -1634,6 +1675,7 @@ msgstr "云服务"
#: assets/models/asset/common.py:92 assets/models/platform.py:16 #: assets/models/asset/common.py:92 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:72 #: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:72
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:73 #: xpack/plugins/cloud/serializers/account_attrs.py:73
msgid "Port" msgid "Port"
msgstr "端口" msgstr "端口"
@ -2938,7 +2980,7 @@ msgid "IP group"
msgstr "IPグループ" msgstr "IPグループ"
#: authentication/models/connection_token.py:38 #: authentication/models/connection_token.py:38
#: terminal/serializers/storage.py:113 #: terminal/serializers/storage.py:114
msgid "Account name" msgid "Account name"
msgstr "账号名称" msgstr "账号名称"
@ -3074,16 +3116,6 @@ msgstr "动作"
msgid "Is expired" msgid "Is expired"
msgstr "已过期" msgstr "已过期"
#: authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24
#: notifications/backends/__init__.py:10 settings/serializers/msg.py:22
#: settings/serializers/msg.py:57 users/forms/profile.py:102
#: users/forms/profile.py:109 users/models/user.py:794
#: users/templates/users/forgot_password.html:117
#: users/views/profile/reset.py:92
msgid "Email"
msgstr "邮箱"
#: authentication/serializers/password_mfa.py:29 #: authentication/serializers/password_mfa.py:29
#: users/templates/users/forgot_password.html:108 #: users/templates/users/forgot_password.html:108
msgid "The {} cannot be empty" msgid "The {} cannot be empty"
@ -3481,7 +3513,7 @@ msgstr "定时触发"
msgid "Ready" msgid "Ready"
msgstr "准备" msgstr "准备"
#: common/const/choices.py:16 terminal/const.py:75 tickets/const.py:29 #: common/const/choices.py:16 terminal/const.py:76 tickets/const.py:29
#: tickets/const.py:39 #: tickets/const.py:39
msgid "Pending" msgid "Pending"
msgstr "待定的" msgstr "待定的"
@ -3736,14 +3768,18 @@ msgstr "错误的数据类型,应该是列表"
msgid "Invalid choice: {}" msgid "Invalid choice: {}"
msgstr "无效选项: {}" msgstr "无效选项: {}"
#: common/tasks.py:20 common/utils/verify_code.py:16 #: common/tasks.py:21 common/utils/verify_code.py:16
msgid "Send email" msgid "Send email"
msgstr "发件邮件" msgstr "发件邮件"
#: common/tasks.py:47 #: common/tasks.py:48
msgid "Send email attachment" msgid "Send email attachment"
msgstr "发送邮件附件" msgstr "发送邮件附件"
#: common/tasks.py:69 terminal/tasks.py:62
msgid "Upload session replay to external storage"
msgstr "上传会话录像到外部存储"
#: common/utils/ip/geoip/utils.py:26 #: common/utils/ip/geoip/utils.py:26
msgid "Invalid ip" msgid "Invalid ip"
msgstr "无效 IP" msgstr "无效 IP"
@ -6165,64 +6201,60 @@ msgstr "审批 & 接受"
msgid "Review & Cancel" msgid "Review & Cancel"
msgstr "审批 & 取消" msgstr "审批 & 取消"
#: terminal/const.py:44 #: terminal/const.py:45
msgid "Critical" msgid "Critical"
msgstr "严重" msgstr "严重"
#: terminal/const.py:45 #: terminal/const.py:46
msgid "High" msgid "High"
msgstr "较高" msgstr "较高"
#: terminal/const.py:46 terminal/const.py:82 #: terminal/const.py:47 terminal/const.py:83
#: users/templates/users/reset_password.html:50 #: users/templates/users/reset_password.html:50
msgid "Normal" msgid "Normal"
msgstr "正常" msgstr "正常"
#: terminal/const.py:47 #: terminal/const.py:48
msgid "Offline" msgid "Offline"
msgstr "离线" msgstr "离线"
#: terminal/const.py:78 #: terminal/const.py:79
msgid "Mismatch" msgid "Mismatch"
msgstr "未匹配" msgstr "未匹配"
#: terminal/const.py:83 #: terminal/const.py:84
msgid "Tunnel" msgid "Tunnel"
msgstr "隧道" msgstr "隧道"
#: terminal/const.py:85 #: terminal/const.py:90
msgid "SFTP"
msgstr "SFTP"
#: terminal/const.py:89
msgid "Read only" msgid "Read only"
msgstr "只读" msgstr "只读"
#: terminal/const.py:90 #: terminal/const.py:91
msgid "Writable" msgid "Writable"
msgstr "读写" msgstr "读写"
#: terminal/const.py:94 #: terminal/const.py:95
msgid "Kill session" msgid "Kill session"
msgstr "终断会话" msgstr "终断会话"
#: terminal/const.py:95 #: terminal/const.py:96
msgid "Lock session" msgid "Lock session"
msgstr "锁定会话" msgstr "锁定会话"
#: terminal/const.py:96 #: terminal/const.py:97
msgid "Unlock session" msgid "Unlock session"
msgstr "解锁会话" msgstr "解锁会话"
#: terminal/const.py:101 #: terminal/const.py:102
msgid "Replay create failed" msgid "Replay create failed"
msgstr "录像创建失败" msgstr "录像创建失败"
#: terminal/const.py:102 #: terminal/const.py:103
msgid "Replay upload failed" msgid "Replay upload failed"
msgstr "录像上传失败" msgstr "录像上传失败"
#: terminal/const.py:103 #: terminal/const.py:104
msgid "Replay convert failed" msgid "Replay convert failed"
msgstr "录像转码失败" msgstr "录像转码失败"
@ -6258,7 +6290,7 @@ msgstr "可以并发"
msgid "Tags" msgid "Tags"
msgstr "标签" msgstr "标签"
#: terminal/models/applet/applet.py:48 terminal/serializers/storage.py:161 #: terminal/models/applet/applet.py:48 terminal/serializers/storage.py:197
msgid "Hosts" msgid "Hosts"
msgstr "主机" msgstr "主机"
@ -6349,9 +6381,9 @@ msgstr "Redis 端口"
#: terminal/models/component/endpoint.py:29 #: terminal/models/component/endpoint.py:29
#: terminal/models/component/endpoint.py:102 #: terminal/models/component/endpoint.py:102
#: terminal/serializers/endpoint.py:73 terminal/serializers/storage.py:40 #: terminal/serializers/endpoint.py:73 terminal/serializers/storage.py:41
#: terminal/serializers/storage.py:52 terminal/serializers/storage.py:82 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83
#: terminal/serializers/storage.py:92 terminal/serializers/storage.py:100 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101
msgid "Endpoint" msgid "Endpoint"
msgstr "端点" msgstr "端点"
@ -6601,7 +6633,7 @@ msgstr ""
"建议填写内网地址,否则填写当前站点 URL<br>例如https://172.16.10.110 or " "建议填写内网地址,否则填写当前站点 URL<br>例如https://172.16.10.110 or "
"https://dev.jumpserver.com" "https://dev.jumpserver.com"
#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:172 #: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:208
msgid "Ignore Certificate Verification" msgid "Ignore Certificate Verification"
msgstr "忽略证书认证" msgstr "忽略证书认证"
@ -6759,69 +6791,78 @@ msgstr "登录来源名称"
msgid "Terminal display" msgid "Terminal display"
msgstr "终端显示" msgstr "终端显示"
#: terminal/serializers/storage.py:22 #: terminal/serializers/storage.py:23
msgid "Endpoint invalid: remove path `{}`" msgid "Endpoint invalid: remove path `{}`"
msgstr "端点无效: 移除路径 `{}`" msgstr "端点无效: 移除路径 `{}`"
#: terminal/serializers/storage.py:28 #: terminal/serializers/storage.py:29
msgid "Bucket" msgid "Bucket"
msgstr "桶名称" msgstr "桶名称"
#: terminal/serializers/storage.py:32 #: terminal/serializers/storage.py:33
#: xpack/plugins/cloud/serializers/account_attrs.py:17 #: xpack/plugins/cloud/serializers/account_attrs.py:17
msgid "Access key id" msgid "Access key id"
msgstr "Access key ID(AK)" msgstr "Access key ID(AK)"
#: terminal/serializers/storage.py:36 #: terminal/serializers/storage.py:37
#: xpack/plugins/cloud/serializers/account_attrs.py:20 #: xpack/plugins/cloud/serializers/account_attrs.py:20
msgid "Access key secret" msgid "Access key secret"
msgstr "Access key secret(SK)" msgstr "Access key secret(SK)"
#: terminal/serializers/storage.py:67 xpack/plugins/cloud/models.py:250 #: terminal/serializers/storage.py:68 xpack/plugins/cloud/models.py:250
msgid "Region" msgid "Region"
msgstr "地域" msgstr "地域"
#: terminal/serializers/storage.py:111 #: terminal/serializers/storage.py:112
msgid "Container name" msgid "Container name"
msgstr "容器名称" msgstr "容器名称"
#: terminal/serializers/storage.py:114 #: terminal/serializers/storage.py:115
msgid "Account key" msgid "Account key"
msgstr "账号密钥" msgstr "账号密钥"
#: terminal/serializers/storage.py:117 #: terminal/serializers/storage.py:118
msgid "Endpoint suffix" msgid "Endpoint suffix"
msgstr "端点后缀" msgstr "端点后缀"
#: terminal/serializers/storage.py:137 #: terminal/serializers/storage.py:129
msgid "HOST"
msgstr ""
#: terminal/serializers/storage.py:146 users/models/user.py:822
#: xpack/plugins/cloud/serializers/account_attrs.py:206
msgid "Private key"
msgstr "ssh私钥"
#: terminal/serializers/storage.py:173
msgid "The address cannot contain the special character `#`" msgid "The address cannot contain the special character `#`"
msgstr "地址中不能包含特殊字符 `#`" msgstr "地址中不能包含特殊字符 `#`"
#: terminal/serializers/storage.py:139 #: terminal/serializers/storage.py:175
msgid "The address format is incorrect" msgid "The address format is incorrect"
msgstr "地址格式不正确" msgstr "地址格式不正确"
#: terminal/serializers/storage.py:146 #: terminal/serializers/storage.py:182
msgid "Host invalid" msgid "Host invalid"
msgstr "主机无效" msgstr "主机无效"
#: terminal/serializers/storage.py:149 #: terminal/serializers/storage.py:185
msgid "Port invalid" msgid "Port invalid"
msgstr "端口无效" msgstr "端口无效"
#: terminal/serializers/storage.py:164 #: terminal/serializers/storage.py:200
msgid "Index by date" msgid "Index by date"
msgstr "按日期建索引" msgstr "按日期建索引"
#: terminal/serializers/storage.py:165 #: terminal/serializers/storage.py:201
msgid "Whether to create an index by date" msgid "Whether to create an index by date"
msgstr "是否根据日期动态建立索引" msgstr "是否根据日期动态建立索引"
#: terminal/serializers/storage.py:168 #: terminal/serializers/storage.py:204
msgid "Index" msgid "Index"
msgstr "索引" msgstr "索引"
#: terminal/serializers/storage.py:170 #: terminal/serializers/storage.py:206
msgid "Doc type" msgid "Doc type"
msgstr "文档类型" msgstr "文档类型"
@ -6841,10 +6882,6 @@ msgstr "周期清理终端状态"
msgid "Clean orphan session" msgid "Clean orphan session"
msgstr "清除离线会话" msgstr "清除离线会话"
#: terminal/tasks.py:62
msgid "Upload session replay to external storage"
msgstr "上传会话录像到外部存储"
#: terminal/tasks.py:91 #: terminal/tasks.py:91
msgid "Run applet host deployment" msgid "Run applet host deployment"
msgstr "运行应用机部署" msgstr "运行应用机部署"
@ -7393,11 +7430,6 @@ msgstr "手机"
msgid "OTP secret key" msgid "OTP secret key"
msgstr "OTP 密钥" msgstr "OTP 密钥"
#: users/models/user.py:822
#: xpack/plugins/cloud/serializers/account_attrs.py:206
msgid "Private key"
msgstr "ssh私钥"
#: users/models/user.py:830 users/serializers/profile.py:128 #: users/models/user.py:830 users/serializers/profile.py:128
#: users/serializers/user.py:166 #: users/serializers/user.py:166
msgid "Is first login" msgid "Is first login"
@ -8541,3 +8573,6 @@ msgstr "企业专业版"
#: xpack/plugins/license/models.py:86 #: xpack/plugins/license/models.py:86
msgid "Ultimate edition" msgid "Ultimate edition"
msgstr "企业旗舰版" msgstr "企业旗舰版"
#~ msgid "Object Storage"
#~ msgstr "对象存储"

View File

@ -29,6 +29,7 @@ class ReplayStorageType(TextChoices):
azure = 'azure', 'Azure' azure = 'azure', 'Azure'
obs = 'obs', 'OBS' obs = 'obs', 'OBS'
cos = 'cos', 'COS' cos = 'cos', 'COS'
sftp = 'sftp', 'SFTP'
class CommandStorageType(TextChoices): class CommandStorageType(TextChoices):

View File

@ -0,0 +1,18 @@
# Generated by Django 4.1.10 on 2023-11-02 10:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('terminal', '0066_applethost_using_same_account'),
]
operations = [
migrations.AlterField(
model_name='replaystorage',
name='type',
field=models.CharField(choices=[('null', 'Null'), ('server', 'Server'), ('s3', 'S3'), ('ceph', 'Ceph'), ('swift', 'Swift'), ('oss', 'OSS'), ('azure', 'Azure'), ('obs', 'OBS'), ('cos', 'COS'), ('sftp', 'SFTP')], default='server', max_length=16, verbose_name='Type'),
),
]

View File

@ -3,6 +3,7 @@
from urllib.parse import urlparse from urllib.parse import urlparse
from django.db.models import TextChoices from django.db.models import TextChoices
from django.core.validators import MaxValueValidator, MinValueValidator, validate_ipv46_address
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from rest_framework.validators import UniqueValidator from rest_framework.validators import UniqueValidator
@ -118,6 +119,40 @@ class ReplayStorageTypeAzureSerializer(serializers.Serializer):
) )
class SftpSecretType(TextChoices):
PASSWORD = 'password', _('Password')
SSH_KEY = 'ssh_key', _('SSH key')
class ReplayStorageTypeSFTPSerializer(serializers.Serializer):
SFTP_HOST = serializers.CharField(
required=True, max_length=1024, label=_('HOST'), validators=[validate_ipv46_address]
)
SFTP_PORT = serializers.IntegerField(
required=False, default=22, validators=[MaxValueValidator(65535), MinValueValidator(0)],
label=_('Port')
)
SFTP_USERNAME = serializers.CharField(
required=True, max_length=1024, label=_('Username')
)
STP_SECRET_TYPE = serializers.ChoiceField(choices=SftpSecretType.choices,
default=SftpSecretType.PASSWORD,
label=_('Secret type'))
SFTP_PASSWORD = EncryptedField(
allow_blank=True, allow_null=True, required=False, max_length=1024, label=_('Password')
)
STP_PRIVATE_KEY = serializers.CharField(
allow_blank=True, allow_null=True, required=False, max_length=4096,
write_only=True, label=_('Private key')
)
STP_PASSPHRASE = EncryptedField(
allow_blank=True, allow_null=True, required=False, max_length=1024, label=_('Key password')
)
SFTP_ROOT_PATH = serializers.CharField(
required=True, max_length=1024, label=_('SFTP Root')
)
# mapping # mapping
replay_storage_type_serializer_classes_mapping = { replay_storage_type_serializer_classes_mapping = {
const.ReplayStorageType.s3.value: ReplayStorageTypeS3Serializer, const.ReplayStorageType.s3.value: ReplayStorageTypeS3Serializer,
@ -126,7 +161,8 @@ replay_storage_type_serializer_classes_mapping = {
const.ReplayStorageType.oss.value: ReplayStorageTypeOSSSerializer, const.ReplayStorageType.oss.value: ReplayStorageTypeOSSSerializer,
const.ReplayStorageType.azure.value: ReplayStorageTypeAzureSerializer, const.ReplayStorageType.azure.value: ReplayStorageTypeAzureSerializer,
const.ReplayStorageType.obs.value: ReplayStorageTypeOBSSerializer, const.ReplayStorageType.obs.value: ReplayStorageTypeOBSSerializer,
const.ReplayStorageType.cos.value: ReplayStorageTypeCOSSerializer const.ReplayStorageType.cos.value: ReplayStorageTypeCOSSerializer,
const.ReplayStorageType.sftp.value: ReplayStorageTypeSFTPSerializer
} }