mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-12-15 08:32:48 +00:00
Compare commits
49 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8eb7cccb1 | ||
|
|
001828fb2b | ||
|
|
d0e355a86d | ||
|
|
4a5f327498 | ||
|
|
04761a9373 | ||
|
|
077731a4b4 | ||
|
|
75e79efa5f | ||
|
|
ca5ffb6278 | ||
|
|
c7e149f15d | ||
|
|
60ac5ddaf2 | ||
|
|
244407b212 | ||
|
|
f08f01fe49 | ||
|
|
b2f11bbbf3 | ||
|
|
6108a09089 | ||
|
|
93cf58ca76 | ||
|
|
587c49082f | ||
|
|
50090c5310 | ||
|
|
b4182a0d1c | ||
|
|
8a2d7b69fa | ||
|
|
84821e97f4 | ||
|
|
e0f20ce047 | ||
|
|
375f60fef8 | ||
|
|
ced79ea6c9 | ||
|
|
2d4b9ff5a8 | ||
|
|
0a5467886a | ||
|
|
9809415f78 | ||
|
|
02fc045370 | ||
|
|
e4ac73896f | ||
|
|
1518f792d6 | ||
|
|
67277dd622 | ||
|
|
82e7f020ea | ||
|
|
f20b9e01ab | ||
|
|
8cf8a3701b | ||
|
|
7ba24293d1 | ||
|
|
f10114c9ed | ||
|
|
cf31cbfb07 | ||
|
|
0edad24d5d | ||
|
|
1f1c1a9157 | ||
|
|
6c9d271ae1 | ||
|
|
6ff852e225 | ||
|
|
baa75dc735 | ||
|
|
8a9f0436b8 | ||
|
|
a9620a3cbe | ||
|
|
769e7dc8a0 | ||
|
|
2a70449411 | ||
|
|
8df720f19e | ||
|
|
dabbb45f6e | ||
|
|
ce24c1c3fd | ||
|
|
3c54c82ce9 |
12
Dockerfile
12
Dockerfile
@@ -1,4 +1,4 @@
|
||||
FROM debian:bullseye-slim as stage-1
|
||||
FROM debian:bullseye-slim AS stage-1
|
||||
ARG TARGETARCH
|
||||
|
||||
ARG DEPENDENCIES=" \
|
||||
@@ -27,14 +27,6 @@ RUN set -ex \
|
||||
&& chmod 755 /usr/local/bin/check \
|
||||
&& rm -f check-${CHECK_VERSION}-linux-${TARGETARCH}.tar.gz
|
||||
|
||||
ARG RECEPTOR_VERSION=v1.4.5
|
||||
RUN set -ex \
|
||||
&& wget -O /opt/receptor.tar.gz https://github.com/ansible/receptor/releases/download/${RECEPTOR_VERSION}/receptor_${RECEPTOR_VERSION/v/}_linux_${TARGETARCH}.tar.gz \
|
||||
&& tar -xf /opt/receptor.tar.gz -C /usr/local/bin/ \
|
||||
&& chown root:root /usr/local/bin/receptor \
|
||||
&& chmod 755 /usr/local/bin/receptor \
|
||||
&& rm -f /opt/receptor.tar.gz
|
||||
|
||||
ARG VERSION
|
||||
|
||||
WORKDIR /opt/jumpserver
|
||||
@@ -45,7 +37,7 @@ RUN echo > /opt/jumpserver/config.yml \
|
||||
sed -i "s@VERSION = .*@VERSION = '${VERSION}'@g" apps/jumpserver/const.py; \
|
||||
fi
|
||||
|
||||
FROM python:3.11-slim-bullseye as stage-2
|
||||
FROM python:3.11-slim-bullseye AS stage-2
|
||||
ARG TARGETARCH
|
||||
|
||||
ARG BUILD_DEPENDENCIES=" \
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
ARG VERSION
|
||||
|
||||
FROM registry.fit2cloud.com/jumpserver/xpack:${VERSION} as build-xpack
|
||||
FROM python:3.11-slim-bullseye as build-core
|
||||
FROM registry.fit2cloud.com/jumpserver/xpack:${VERSION} AS build-xpack
|
||||
FROM python:3.11-slim-bullseye AS build-core
|
||||
ARG BUILD_DEPENDENCIES=" \
|
||||
g++"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ from django.utils.translation import gettext_lazy as _
|
||||
from xlsxwriter import Workbook
|
||||
|
||||
from accounts.const import AutomationTypes, SecretType, SSHKeyStrategy, SecretStrategy, ChangeSecretRecordStatusChoice
|
||||
from accounts.models import ChangeSecretRecord
|
||||
from accounts.models import ChangeSecretRecord, BaseAccountQuerySet
|
||||
from accounts.notifications import ChangeSecretExecutionTaskMsg, ChangeSecretFailedMsg
|
||||
from accounts.serializers import ChangeSecretRecordBackUpSerializer
|
||||
from assets.const import HostTypes
|
||||
@@ -68,10 +68,10 @@ class ChangeSecretManager(AccountBasePlaybookManager):
|
||||
else:
|
||||
return self.secret_generator(secret_type).get_secret()
|
||||
|
||||
def get_accounts(self, privilege_account):
|
||||
def get_accounts(self, privilege_account) -> BaseAccountQuerySet | None:
|
||||
if not privilege_account:
|
||||
print(f'not privilege account')
|
||||
return []
|
||||
print('Not privilege account')
|
||||
return
|
||||
|
||||
asset = privilege_account.asset
|
||||
accounts = asset.accounts.all()
|
||||
@@ -108,6 +108,9 @@ class ChangeSecretManager(AccountBasePlaybookManager):
|
||||
print(f'Windows {asset} does not support ssh key push')
|
||||
return inventory_hosts
|
||||
|
||||
if asset.type == HostTypes.WINDOWS:
|
||||
accounts = accounts.filter(secret_type=SecretType.PASSWORD)
|
||||
|
||||
host['ssh_params'] = {}
|
||||
for account in accounts:
|
||||
h = deepcopy(host)
|
||||
@@ -226,6 +229,9 @@ class ChangeSecretManager(AccountBasePlaybookManager):
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
if self.secret_type and not self.check_secret():
|
||||
self.execution.status = 'success'
|
||||
self.execution.date_finished = timezone.now()
|
||||
self.execution.save()
|
||||
return
|
||||
super().run(*args, **kwargs)
|
||||
recorders = list(self.name_recorder_mapper.values())
|
||||
|
||||
@@ -185,5 +185,6 @@ class Migration(migrations.Migration):
|
||||
('alias', models.CharField(choices=[('@INPUT', 'Manual input'), ('@USER', 'Dynamic user'), ('@ANON', 'Anonymous account'), ('@SPEC', 'Specified account')], max_length=128, verbose_name='Alias')),
|
||||
('secret_from_login', models.BooleanField(default=None, null=True, verbose_name='Secret from login')),
|
||||
],
|
||||
options={'verbose_name': 'Virtual account'},
|
||||
),
|
||||
]
|
||||
|
||||
@@ -117,5 +117,6 @@ class DatabaseTypes(BaseType):
|
||||
@classmethod
|
||||
def get_community_types(cls):
|
||||
return [
|
||||
cls.MYSQL, cls.MARIADB, cls.MONGODB, cls.REDIS
|
||||
cls.MYSQL, cls.MARIADB, cls.POSTGRESQL,
|
||||
cls.MONGODB, cls.REDIS,
|
||||
]
|
||||
|
||||
@@ -171,12 +171,9 @@ class AllTypes(ChoicesMixin):
|
||||
(Category.DEVICE, DeviceTypes),
|
||||
(Category.DATABASE, DatabaseTypes),
|
||||
(Category.WEB, WebTypes),
|
||||
(Category.CLOUD, CloudTypes),
|
||||
(Category.CUSTOM, CustomTypes),
|
||||
]
|
||||
if settings.XPACK_ENABLED:
|
||||
types.extend([
|
||||
(Category.CLOUD, CloudTypes),
|
||||
(Category.CUSTOM, CustomTypes),
|
||||
])
|
||||
return types
|
||||
|
||||
@classmethod
|
||||
|
||||
28
apps/assets/migrations/0004_auto_20240709_1819.py
Normal file
28
apps/assets/migrations/0004_auto_20240709_1819.py
Normal file
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 4.1.13 on 2024-07-09 10:19
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
def migrate_platform_protocol_primary(apps, schema_editor):
|
||||
platform_model = apps.get_model('assets', 'Platform')
|
||||
platforms = platform_model.objects.all()
|
||||
|
||||
for platform in platforms:
|
||||
p = platform.protocols.filter(primary=True).first()
|
||||
if p:
|
||||
continue
|
||||
p = platform.protocols.first()
|
||||
if not p:
|
||||
continue
|
||||
p.primary = True
|
||||
p.save()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
('assets', '0003_auto_20180109_2331'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(migrate_platform_protocol_primary)
|
||||
]
|
||||
@@ -36,6 +36,7 @@ class BaseAutomationSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSe
|
||||
|
||||
class AutomationExecutionSerializer(serializers.ModelSerializer):
|
||||
snapshot = serializers.SerializerMethodField(label=_('Automation snapshot'))
|
||||
status = serializers.SerializerMethodField(label=_("Status"))
|
||||
trigger = LabeledChoiceField(choices=Trigger.choices, read_only=True, label=_("Trigger mode"))
|
||||
|
||||
class Meta:
|
||||
@@ -45,6 +46,14 @@ class AutomationExecutionSerializer(serializers.ModelSerializer):
|
||||
]
|
||||
fields = ['id', 'automation'] + read_only_fields
|
||||
|
||||
@staticmethod
|
||||
def get_status(obj):
|
||||
if obj.status == 'success':
|
||||
return _("Success")
|
||||
elif obj.status == 'pending':
|
||||
return _("Pending")
|
||||
return obj.status
|
||||
|
||||
@staticmethod
|
||||
def get_snapshot(obj):
|
||||
from assets.const import AutomationTypes as AssetTypes
|
||||
|
||||
@@ -55,14 +55,14 @@ class UserSessionApi(generics.RetrieveDestroyAPIView):
|
||||
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
if isinstance(request.user, AnonymousUser):
|
||||
return Response(status=status.HTTP_200_OK)
|
||||
return Response(status=status.HTTP_403_FORBIDDEN)
|
||||
|
||||
UserSessionManager(request).connect()
|
||||
return Response(status=status.HTTP_200_OK)
|
||||
return Response(status=status.HTTP_200_OK, data={'ok': True})
|
||||
|
||||
def destroy(self, request, *args, **kwargs):
|
||||
if isinstance(request.user, AnonymousUser):
|
||||
return Response(status=status.HTTP_200_OK)
|
||||
return Response(status=status.HTTP_403_FORBIDDEN)
|
||||
|
||||
UserSessionManager(request).disconnect()
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
return Response(status=status.HTTP_200_OK, data={'ok': True})
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import copy
|
||||
|
||||
from urllib import parse
|
||||
|
||||
from django.views import View
|
||||
from django.contrib import auth
|
||||
from django.urls import reverse
|
||||
from django.conf import settings
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from django.contrib import auth
|
||||
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseServerError
|
||||
|
||||
from django.urls import reverse
|
||||
from django.views import View
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from onelogin.saml2.auth import OneLogin_Saml2_Auth
|
||||
from onelogin.saml2.errors import OneLogin_Saml2_Error
|
||||
from onelogin.saml2.idp_metadata_parser import (
|
||||
@@ -16,23 +14,29 @@ from onelogin.saml2.idp_metadata_parser import (
|
||||
dict_deep_merge
|
||||
)
|
||||
|
||||
from .settings import JmsSaml2Settings
|
||||
|
||||
from common.utils import get_logger
|
||||
from .settings import JmsSaml2Settings
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
||||
class PrepareRequestMixin:
|
||||
@staticmethod
|
||||
def is_secure():
|
||||
url_result = parse.urlparse(settings.SITE_URL)
|
||||
return 'on' if url_result.scheme == 'https' else 'off'
|
||||
|
||||
@property
|
||||
def parsed_url(self):
|
||||
return parse.urlparse(settings.SITE_URL)
|
||||
|
||||
def is_secure(self):
|
||||
return 'on' if self.parsed_url.scheme == 'https' else 'off'
|
||||
|
||||
def http_host(self):
|
||||
return f"{self.parsed_url.hostname}:{self.parsed_url.port}" \
|
||||
if self.parsed_url.port else self.parsed_url.hostname
|
||||
|
||||
def prepare_django_request(self, request):
|
||||
result = {
|
||||
'https': self.is_secure(),
|
||||
'http_host': request.META['HTTP_HOST'],
|
||||
'http_host': self.http_host(),
|
||||
'script_name': request.META['PATH_INFO'],
|
||||
'get_data': request.GET.copy(),
|
||||
'post_data': request.POST.copy()
|
||||
@@ -275,7 +279,7 @@ class Saml2AuthCallbackView(View, PrepareRequestMixin):
|
||||
logger.debug(log_prompt.format('Redirect'))
|
||||
redir = post_data.get('RelayState')
|
||||
if not redir or len(redir) == 0:
|
||||
redir = "/"
|
||||
redir = "/"
|
||||
next_url = saml_instance.redirect_to(redir)
|
||||
return HttpResponseRedirect(next_url)
|
||||
|
||||
|
||||
@@ -3,3 +3,4 @@ from .connection_token import *
|
||||
from .private_token import *
|
||||
from .sso_token import *
|
||||
from .temp_token import *
|
||||
from ..backends.passkey.models import *
|
||||
@@ -37,6 +37,7 @@ class ConnectionTokenSerializer(CommonModelSerializer):
|
||||
]
|
||||
fields = fields_small + read_only_fields
|
||||
extra_kwargs = {
|
||||
'org_name': {'label': _('Org name')},
|
||||
'from_ticket': {'read_only': True},
|
||||
'value': {'read_only': True},
|
||||
'is_expired': {'read_only': True, 'label': _('Is expired')},
|
||||
|
||||
@@ -151,11 +151,9 @@ class BaseBindCallbackView(FlashMessageMixin, IMClientMixin, View):
|
||||
setattr(user, f'{self.auth_type}_id', auth_user_id)
|
||||
user.save()
|
||||
except IntegrityError as e:
|
||||
if e.args[0] == 1062:
|
||||
msg = _('The %s is already bound to another user') % self.auth_type_label
|
||||
response = self.get_failed_response(redirect_url, msg, msg)
|
||||
return response
|
||||
raise e
|
||||
msg = _('The %s is already bound to another user') % self.auth_type_label
|
||||
response = self.get_failed_response(redirect_url, msg, msg)
|
||||
return response
|
||||
|
||||
ip = get_request_ip(request)
|
||||
OAuthBindMessage(user, ip, self.auth_type_label, auth_user_id).publish_async()
|
||||
|
||||
@@ -47,15 +47,7 @@ class DingTalkBaseMixin(UserConfirmRequiredExceptionMixin, PermissionsMixin, Fla
|
||||
)
|
||||
|
||||
def verify_state(self):
|
||||
state = self.request.GET.get('state')
|
||||
session_state = self.request.session.get(DINGTALK_STATE_SESSION_KEY)
|
||||
if state != session_state:
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_verify_state_failed_response(self, redirect_uri):
|
||||
msg = _("The system configuration is incorrect. Please contact your administrator")
|
||||
return self.get_failed_response(redirect_uri, msg, msg)
|
||||
return self.verify_state_with_session_key(DINGTALK_STATE_SESSION_KEY)
|
||||
|
||||
def get_already_bound_response(self, redirect_url):
|
||||
msg = _('DingTalk is already bound')
|
||||
|
||||
@@ -58,15 +58,7 @@ class FeiShuQRMixin(UserConfirmRequiredExceptionMixin, PermissionsMixin, FlashMe
|
||||
)
|
||||
|
||||
def verify_state(self):
|
||||
state = self.request.GET.get('state')
|
||||
session_state = self.request.session.get(self.state_session_key)
|
||||
if state != session_state:
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_verify_state_failed_response(self, redirect_uri):
|
||||
msg = _("The system configuration is incorrect. Please contact your administrator")
|
||||
return self.get_failed_response(redirect_uri, msg, msg)
|
||||
return self.verify_state_with_session_key(self.state_session_key)
|
||||
|
||||
def get_qr_url(self, redirect_uri):
|
||||
state = random_string(16)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from common.utils import FlashMessageUtil
|
||||
|
||||
|
||||
@@ -32,3 +33,12 @@ class FlashMessageMixin:
|
||||
|
||||
def get_failed_response(self, redirect_url, title, msg, interval=10):
|
||||
return self.get_response(redirect_url, title, msg, 'error', interval)
|
||||
|
||||
def get_verify_state_failed_response(self, redirect_uri):
|
||||
msg = _(
|
||||
"For your safety, automatic redirection login is not supported on the client."
|
||||
" If you need to open it in the client, please log in again")
|
||||
return self.get_failed_response(redirect_uri, msg, msg)
|
||||
|
||||
def verify_state_with_session_key(self, session_key):
|
||||
return self.request.GET.get('state') == self.request.session.get(session_key)
|
||||
|
||||
@@ -37,15 +37,7 @@ class SlackMixin(UserConfirmRequiredExceptionMixin, PermissionsMixin, FlashMessa
|
||||
)
|
||||
|
||||
def verify_state(self):
|
||||
state = self.request.GET.get('state')
|
||||
session_state = self.request.session.get(SLACK_STATE_SESSION_KEY)
|
||||
if state != session_state:
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_verify_state_failed_response(self, redirect_uri):
|
||||
msg = _("The system configuration is incorrect. Please contact your administrator")
|
||||
return self.get_failed_response(redirect_uri, msg, msg)
|
||||
return self.verify_state_with_session_key(SLACK_STATE_SESSION_KEY)
|
||||
|
||||
def get_qr_url(self, redirect_uri):
|
||||
state = random_string(16)
|
||||
|
||||
@@ -45,15 +45,7 @@ class WeComBaseMixin(UserConfirmRequiredExceptionMixin, PermissionsMixin, FlashM
|
||||
)
|
||||
|
||||
def verify_state(self):
|
||||
state = self.request.GET.get('state')
|
||||
session_state = self.request.session.get(WECOM_STATE_SESSION_KEY)
|
||||
if state != session_state:
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_verify_state_failed_response(self, redirect_uri):
|
||||
msg = _("The system configuration is incorrect. Please contact your administrator")
|
||||
return self.get_failed_response(redirect_uri, msg, msg)
|
||||
return self.verify_state_with_session_key(WECOM_STATE_SESSION_KEY)
|
||||
|
||||
def get_already_bound_response(self, redirect_url):
|
||||
msg = _('WeCom is already bound')
|
||||
|
||||
@@ -34,6 +34,10 @@ def parse_to_url(url):
|
||||
url = url.replace('(?P<format>[a-z0-9]+)', '')
|
||||
url = url.replace('((?P<terminal>[/.]{36})/)?', uid + '/')
|
||||
url = url.replace('(?P<pk>[/.]+)', uid)
|
||||
url = url.replace('(?P<label>.*)', uid)
|
||||
url = url.replace('(?P<res_type>.*)', '1')
|
||||
url = url.replace('(?P<name>[\\w.@]+)', '')
|
||||
url = url.replace('<str:name>', 'zh-hans')
|
||||
url = url.replace('\.', '')
|
||||
url = url.replace('//', '/')
|
||||
url = url.strip('$')
|
||||
@@ -70,7 +74,9 @@ known_unauth_urls = [
|
||||
"/api/v1/authentication/login-confirm-ticket/status/",
|
||||
"/api/v1/authentication/mfa/select/",
|
||||
"/api/v1/authentication/mfa/send-code/",
|
||||
"/api/v1/authentication/sso/login/"
|
||||
"/api/v1/authentication/sso/login/",
|
||||
"/api/v1/authentication/user-session/",
|
||||
"/api/v1/settings/i18n/zh-hans/"
|
||||
]
|
||||
|
||||
known_error_urls = [
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
"SaveSucceed": "保存成功",
|
||||
"SelectSQL": "选择 SQL",
|
||||
"SessionClosedBy": "会话被 %s 关闭",
|
||||
"SessionFinished": "会员已结束",
|
||||
"SessionFinished": "会话已结束",
|
||||
"SessionLockedError": "当前会话已被锁定,无法继续执行命令",
|
||||
"SessionLockedMessage": "此会话已被 %s 锁定,无法继续执行命令",
|
||||
"SessionUnlockedMessage": "此会话已被 %s 解锁,可以继续执行命令",
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-07-03 16:39+0800\n"
|
||||
"POT-Creation-Date: 2024-07-16 18:58+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -64,7 +64,8 @@ msgstr ""
|
||||
|
||||
#: accounts/automations/backup_account/handlers.py:219
|
||||
#: accounts/const/automation.py:110
|
||||
#: accounts/serializers/automations/change_secret.py:166 audits/const.py:64
|
||||
#: accounts/serializers/automations/change_secret.py:166
|
||||
#: assets/serializers/automations/base.py:52 audits/const.py:64
|
||||
#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
|
||||
#: common/const/choices.py:18 ops/const.py:74 ops/serializers/celery.py:48
|
||||
#: terminal/const.py:78 terminal/models/session/sharing.py:121
|
||||
@@ -303,8 +304,9 @@ msgstr ""
|
||||
msgid "SFTP"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/const/automation.py:111 common/const/choices.py:16
|
||||
#: terminal/const.py:77 tickets/const.py:29 tickets/const.py:38
|
||||
#: accounts/const/automation.py:111 assets/serializers/automations/base.py:54
|
||||
#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:29
|
||||
#: tickets/const.py:38
|
||||
msgid "Pending"
|
||||
msgstr ""
|
||||
|
||||
@@ -393,7 +395,7 @@ msgstr ""
|
||||
#: terminal/templates/terminal/_msg_command_warning.html:8
|
||||
#: terminal/templates/terminal/_msg_session_sharing.html:8
|
||||
#: tickets/models/ticket/command_confirm.py:13
|
||||
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:38
|
||||
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:37
|
||||
msgid "Account"
|
||||
msgstr ""
|
||||
|
||||
@@ -482,7 +484,7 @@ msgstr ""
|
||||
#: accounts/serializers/account/backup.py:48
|
||||
#: accounts/serializers/automations/base.py:56
|
||||
#: assets/models/automations/base.py:122
|
||||
#: assets/serializers/automations/base.py:39
|
||||
#: assets/serializers/automations/base.py:40
|
||||
msgid "Trigger mode"
|
||||
msgstr ""
|
||||
|
||||
@@ -575,7 +577,8 @@ msgid "Date finished"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/models/automations/change_secret.py:44
|
||||
#: assets/models/automations/base.py:113 audits/models.py:208
|
||||
#: assets/models/automations/base.py:113
|
||||
#: assets/serializers/automations/base.py:39 audits/models.py:208
|
||||
#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:234
|
||||
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
|
||||
#: terminal/models/component/status.py:30
|
||||
@@ -707,9 +710,9 @@ msgstr ""
|
||||
#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28
|
||||
#: ops/serializers/job.py:18 orgs/models.py:82
|
||||
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
|
||||
#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:86
|
||||
#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
|
||||
#: terminal/models/component/endpoint.py:12
|
||||
#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183
|
||||
#: settings/serializers/msg.py:86 settings/serializers/terminal.py:9
|
||||
#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
|
||||
#: terminal/models/component/endpoint.py:109
|
||||
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
|
||||
#: terminal/models/component/terminal.py:85
|
||||
@@ -1232,7 +1235,8 @@ msgstr ""
|
||||
#: authentication/templates/authentication/_access_key_modal.html:32
|
||||
#: perms/models/asset_permission.py:82
|
||||
#: terminal/models/component/endpoint.py:120
|
||||
#: terminal/models/session/sharing.py:29 tickets/const.py:36
|
||||
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
|
||||
#: tickets/const.py:36
|
||||
msgid "Active"
|
||||
msgstr "Active"
|
||||
|
||||
@@ -1755,7 +1759,7 @@ msgstr ""
|
||||
msgid "API mode"
|
||||
msgstr ""
|
||||
|
||||
#: assets/const/types.py:251
|
||||
#: assets/const/types.py:248
|
||||
msgid "All types"
|
||||
msgstr ""
|
||||
|
||||
@@ -3350,7 +3354,12 @@ msgstr ""
|
||||
msgid "Actions"
|
||||
msgstr ""
|
||||
|
||||
#: authentication/serializers/connection_token.py:42
|
||||
#: authentication/serializers/connection_token.py:40
|
||||
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
|
||||
msgid "Org name"
|
||||
msgstr "Organization"
|
||||
|
||||
#: authentication/serializers/connection_token.py:43
|
||||
#: perms/serializers/permission.py:44 perms/serializers/permission.py:65
|
||||
#: users/serializers/user.py:127 users/serializers/user.py:273
|
||||
msgid "Is expired"
|
||||
@@ -3621,10 +3630,10 @@ msgstr ""
|
||||
msgid "DingTalk Error"
|
||||
msgstr ""
|
||||
|
||||
#: authentication/views/dingtalk.py:57 authentication/views/feishu.py:68
|
||||
#: authentication/views/slack.py:47 authentication/views/wecom.py:55
|
||||
#: authentication/views/mixins.py:39
|
||||
msgid ""
|
||||
"The system configuration is incorrect. Please contact your administrator"
|
||||
"For your safety, automatic redirection login is not supported on the client. "
|
||||
"If you need to open it in the client, please log in again"
|
||||
msgstr ""
|
||||
|
||||
#: authentication/views/dingtalk.py:61
|
||||
@@ -3769,7 +3778,7 @@ msgstr ""
|
||||
msgid "Canceled"
|
||||
msgstr ""
|
||||
|
||||
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:409
|
||||
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
|
||||
#, python-format
|
||||
msgid "%(name)s was created successfully"
|
||||
msgstr ""
|
||||
@@ -3884,7 +3893,7 @@ msgid ""
|
||||
"information -> file encryption password to set the encryption password"
|
||||
msgstr ""
|
||||
|
||||
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:38
|
||||
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
|
||||
#, python-format
|
||||
msgid "%s object does not exist."
|
||||
msgstr ""
|
||||
@@ -4231,27 +4240,27 @@ msgstr ""
|
||||
msgid "Currently playbook is being used in a job"
|
||||
msgstr ""
|
||||
|
||||
#: ops/api/playbook.py:96
|
||||
#: ops/api/playbook.py:97
|
||||
msgid "Unsupported file content"
|
||||
msgstr ""
|
||||
|
||||
#: ops/api/playbook.py:98 ops/api/playbook.py:144 ops/api/playbook.py:192
|
||||
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
|
||||
msgid "Invalid file path"
|
||||
msgstr ""
|
||||
|
||||
#: ops/api/playbook.py:170
|
||||
#: ops/api/playbook.py:171
|
||||
msgid "This file can not be rename"
|
||||
msgstr ""
|
||||
|
||||
#: ops/api/playbook.py:189
|
||||
#: ops/api/playbook.py:190
|
||||
msgid "File already exists"
|
||||
msgstr ""
|
||||
|
||||
#: ops/api/playbook.py:207
|
||||
#: ops/api/playbook.py:208
|
||||
msgid "File key is required"
|
||||
msgstr ""
|
||||
|
||||
#: ops/api/playbook.py:210
|
||||
#: ops/api/playbook.py:211
|
||||
msgid "This file can not be delete"
|
||||
msgstr ""
|
||||
|
||||
@@ -4472,7 +4481,8 @@ msgstr ""
|
||||
msgid "Run as policy"
|
||||
msgstr ""
|
||||
|
||||
#: ops/models/job.py:222 terminal/notifications.py:174
|
||||
#: ops/models/job.py:222 ops/serializers/job.py:92
|
||||
#: terminal/notifications.py:174
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
|
||||
@@ -4484,7 +4494,7 @@ msgstr ""
|
||||
msgid "Material Type"
|
||||
msgstr ""
|
||||
|
||||
#: ops/models/job.py:545
|
||||
#: ops/models/job.py:548
|
||||
msgid "Job Execution"
|
||||
msgstr ""
|
||||
|
||||
@@ -4548,7 +4558,11 @@ msgstr ""
|
||||
msgid "Is finished"
|
||||
msgstr "Finished"
|
||||
|
||||
#: ops/serializers/job.py:90
|
||||
#: ops/serializers/job.py:89
|
||||
msgid "Task id"
|
||||
msgstr ""
|
||||
|
||||
#: ops/serializers/job.py:98
|
||||
msgid "You do not have permission for the current job."
|
||||
msgstr ""
|
||||
|
||||
@@ -4651,10 +4665,6 @@ msgstr "請選擇一個組織後再保存"
|
||||
msgid "Organization"
|
||||
msgstr ""
|
||||
|
||||
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
|
||||
msgid "Org name"
|
||||
msgstr "Organization"
|
||||
|
||||
#: orgs/models.py:14
|
||||
msgid "GLOBAL"
|
||||
msgstr ""
|
||||
@@ -4959,11 +4969,6 @@ msgstr ""
|
||||
msgid "Perms"
|
||||
msgstr ""
|
||||
|
||||
#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
|
||||
#: terminal/models/virtualapp/virtualapp.py:20
|
||||
msgid "Display name"
|
||||
msgstr ""
|
||||
|
||||
#: rbac/serializers/rolebinding.py:60
|
||||
msgid "Has bound this role"
|
||||
msgstr ""
|
||||
@@ -5240,7 +5245,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: settings/serializers/auth/base.py:35
|
||||
msgid "Forgot Password"
|
||||
msgid "Forgot Password URL"
|
||||
msgstr ""
|
||||
|
||||
#: settings/serializers/auth/base.py:36
|
||||
@@ -5829,7 +5834,7 @@ msgid "Chat AI"
|
||||
msgstr ""
|
||||
|
||||
#: settings/serializers/feature.py:80
|
||||
msgid "Base URL"
|
||||
msgid "GPT Base URL"
|
||||
msgstr ""
|
||||
|
||||
#: settings/serializers/feature.py:81
|
||||
@@ -6846,6 +6851,11 @@ msgstr ""
|
||||
msgid "Enterprise"
|
||||
msgstr ""
|
||||
|
||||
#: terminal/models/applet/applet.py:34
|
||||
#: terminal/models/virtualapp/virtualapp.py:20
|
||||
msgid "Display name"
|
||||
msgstr ""
|
||||
|
||||
#: terminal/models/applet/applet.py:36
|
||||
#: terminal/models/virtualapp/virtualapp.py:22
|
||||
msgid "Author"
|
||||
@@ -8935,49 +8945,49 @@ msgstr ""
|
||||
msgid "Failed to synchronize the instance \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:334
|
||||
#: xpack/plugins/cloud/manager.py:337
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The updated platform of asset \"%s\" is inconsistent with the original "
|
||||
"platform type. Skip platform and protocol updates"
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:390
|
||||
#: xpack/plugins/cloud/manager.py:393
|
||||
#, python-format
|
||||
msgid "The asset \"%s\" already exists"
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:392
|
||||
#: xpack/plugins/cloud/manager.py:395
|
||||
#, python-format
|
||||
msgid "Update asset \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:395
|
||||
#: xpack/plugins/cloud/manager.py:398
|
||||
#, python-format
|
||||
msgid "Asset \"%s\" has been updated"
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:405
|
||||
#: xpack/plugins/cloud/manager.py:408
|
||||
#, python-format
|
||||
msgid "Prepare to create asset \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:426
|
||||
#: xpack/plugins/cloud/manager.py:429
|
||||
#, python-format
|
||||
msgid "Set nodes \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:452
|
||||
#: xpack/plugins/cloud/manager.py:455
|
||||
#, python-format
|
||||
msgid "Set accounts \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:468
|
||||
#: xpack/plugins/cloud/manager.py:471
|
||||
#, python-format
|
||||
msgid "Set protocols \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:482 xpack/plugins/cloud/tasks.py:27
|
||||
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:27
|
||||
msgid "Run sync instance task"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-07-03 16:39+0800\n"
|
||||
"POT-Creation-Date: 2024-07-16 18:58+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -64,7 +64,8 @@ msgstr "仕上げ"
|
||||
|
||||
#: accounts/automations/backup_account/handlers.py:219
|
||||
#: accounts/const/automation.py:110
|
||||
#: accounts/serializers/automations/change_secret.py:166 audits/const.py:64
|
||||
#: accounts/serializers/automations/change_secret.py:166
|
||||
#: assets/serializers/automations/base.py:52 audits/const.py:64
|
||||
#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
|
||||
#: common/const/choices.py:18 ops/const.py:74 ops/serializers/celery.py:48
|
||||
#: terminal/const.py:78 terminal/models/session/sharing.py:121
|
||||
@@ -303,8 +304,9 @@ msgstr "メール"
|
||||
msgid "SFTP"
|
||||
msgstr "SFTP"
|
||||
|
||||
#: accounts/const/automation.py:111 common/const/choices.py:16
|
||||
#: terminal/const.py:77 tickets/const.py:29 tickets/const.py:38
|
||||
#: accounts/const/automation.py:111 assets/serializers/automations/base.py:54
|
||||
#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:29
|
||||
#: tickets/const.py:38
|
||||
msgid "Pending"
|
||||
msgstr "未定"
|
||||
|
||||
@@ -393,7 +395,7 @@ msgstr "ソース ID"
|
||||
#: terminal/templates/terminal/_msg_command_warning.html:8
|
||||
#: terminal/templates/terminal/_msg_session_sharing.html:8
|
||||
#: tickets/models/ticket/command_confirm.py:13
|
||||
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:38
|
||||
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:37
|
||||
msgid "Account"
|
||||
msgstr "アカウント"
|
||||
|
||||
@@ -482,7 +484,7 @@ msgstr "アカウントのバックアップスナップショット"
|
||||
#: accounts/serializers/account/backup.py:48
|
||||
#: accounts/serializers/automations/base.py:56
|
||||
#: assets/models/automations/base.py:122
|
||||
#: assets/serializers/automations/base.py:39
|
||||
#: assets/serializers/automations/base.py:40
|
||||
msgid "Trigger mode"
|
||||
msgstr "トリガーモード"
|
||||
|
||||
@@ -575,7 +577,8 @@ msgid "Date finished"
|
||||
msgstr "終了日"
|
||||
|
||||
#: accounts/models/automations/change_secret.py:44
|
||||
#: assets/models/automations/base.py:113 audits/models.py:208
|
||||
#: assets/models/automations/base.py:113
|
||||
#: assets/serializers/automations/base.py:39 audits/models.py:208
|
||||
#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:234
|
||||
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
|
||||
#: terminal/models/component/status.py:30
|
||||
@@ -680,7 +683,7 @@ msgstr "鍵の種類"
|
||||
#: authentication/templates/authentication/_access_key_modal.html:31
|
||||
#: settings/serializers/auth/radius.py:19
|
||||
msgid "Secret"
|
||||
msgstr "ひみつ"
|
||||
msgstr "秘文"
|
||||
|
||||
#: accounts/models/base.py:42
|
||||
#: accounts/serializers/automations/change_secret.py:41
|
||||
@@ -707,9 +710,9 @@ msgstr "パスワードルール"
|
||||
#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28
|
||||
#: ops/serializers/job.py:18 orgs/models.py:82
|
||||
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
|
||||
#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:86
|
||||
#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
|
||||
#: terminal/models/component/endpoint.py:12
|
||||
#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183
|
||||
#: settings/serializers/msg.py:86 settings/serializers/terminal.py:9
|
||||
#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
|
||||
#: terminal/models/component/endpoint.py:109
|
||||
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
|
||||
#: terminal/models/component/terminal.py:85
|
||||
@@ -982,7 +985,7 @@ msgstr "資産タイプ"
|
||||
|
||||
#: accounts/serializers/account/base.py:33 terminal/serializers/storage.py:149
|
||||
msgid "Passphrase"
|
||||
msgstr "パスワード"
|
||||
msgstr "キーパスワード"
|
||||
|
||||
#: accounts/serializers/account/base.py:96
|
||||
msgid ""
|
||||
@@ -1083,13 +1086,14 @@ msgstr "SSHキー戦略"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:57
|
||||
msgid "Please enter your account username"
|
||||
msgstr "MFAコードを入力してください"
|
||||
msgstr "アカウントのユーザー名を入力してください"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:62
|
||||
msgid ""
|
||||
"Secret parameter settings, currently only effective for assets of the host "
|
||||
"type."
|
||||
msgstr "暗号化パラメータの設定は現在、ホストタイプのリソースにのみ有効です。"
|
||||
msgstr ""
|
||||
"パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:84
|
||||
msgid "* Please enter the correct password length"
|
||||
@@ -1249,7 +1253,8 @@ msgstr "レビュー担当者"
|
||||
#: authentication/templates/authentication/_access_key_modal.html:32
|
||||
#: perms/models/asset_permission.py:82
|
||||
#: terminal/models/component/endpoint.py:120
|
||||
#: terminal/models/session/sharing.py:29 tickets/const.py:36
|
||||
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
|
||||
#: tickets/const.py:36
|
||||
msgid "Active"
|
||||
msgstr "アクティブ"
|
||||
|
||||
@@ -1787,7 +1792,7 @@ msgstr "ボタンセレクターを確認する"
|
||||
msgid "API mode"
|
||||
msgstr "APIモード"
|
||||
|
||||
#: assets/const/types.py:251
|
||||
#: assets/const/types.py:248
|
||||
msgid "All types"
|
||||
msgstr "いろんなタイプ"
|
||||
|
||||
@@ -3416,7 +3421,12 @@ msgstr "作業指示情報"
|
||||
msgid "Actions"
|
||||
msgstr "アクション"
|
||||
|
||||
#: authentication/serializers/connection_token.py:42
|
||||
#: authentication/serializers/connection_token.py:40
|
||||
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
|
||||
msgid "Org name"
|
||||
msgstr "組織名"
|
||||
|
||||
#: authentication/serializers/connection_token.py:43
|
||||
#: perms/serializers/permission.py:44 perms/serializers/permission.py:65
|
||||
#: users/serializers/user.py:127 users/serializers/user.py:273
|
||||
msgid "Is expired"
|
||||
@@ -3699,11 +3709,14 @@ msgstr "DingTalkエラー、システム管理者に連絡してください"
|
||||
msgid "DingTalk Error"
|
||||
msgstr "DingTalkエラー"
|
||||
|
||||
#: authentication/views/dingtalk.py:57 authentication/views/feishu.py:68
|
||||
#: authentication/views/slack.py:47 authentication/views/wecom.py:55
|
||||
#: authentication/views/mixins.py:39
|
||||
msgid ""
|
||||
"The system configuration is incorrect. Please contact your administrator"
|
||||
msgstr "システム設定が正しくありません。管理者に連絡してください"
|
||||
"For your safety, automatic redirection login is not supported on the client. "
|
||||
"If you need to open it in the client, please log in again"
|
||||
msgstr ""
|
||||
"安全のため、クライアントでの自動リダイレクトログインはサポートされていませ"
|
||||
"ん。クライアントで開く必要がある場合は、再度ログインしてください"
|
||||
|
||||
|
||||
#: authentication/views/dingtalk.py:61
|
||||
msgid "DingTalk is already bound"
|
||||
@@ -3849,7 +3862,7 @@ msgstr "ランニング"
|
||||
msgid "Canceled"
|
||||
msgstr "キャンセル"
|
||||
|
||||
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:409
|
||||
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
|
||||
#, python-format
|
||||
msgid "%(name)s was created successfully"
|
||||
msgstr "%(name)s が正常に作成されました"
|
||||
@@ -3969,7 +3982,7 @@ msgstr ""
|
||||
"{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワード"
|
||||
"に暗号化パスワードを設定してください"
|
||||
|
||||
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:38
|
||||
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
|
||||
#, python-format
|
||||
msgid "%s object does not exist."
|
||||
msgstr "%s オブジェクトは存在しません。"
|
||||
@@ -4333,27 +4346,27 @@ msgstr "タスクを作成中で、中断できません。後でもう一度お
|
||||
msgid "Currently playbook is being used in a job"
|
||||
msgstr "現在プレイブックは1つのジョブで使用されています"
|
||||
|
||||
#: ops/api/playbook.py:96
|
||||
#: ops/api/playbook.py:97
|
||||
msgid "Unsupported file content"
|
||||
msgstr "サポートされていないファイルの内容"
|
||||
|
||||
#: ops/api/playbook.py:98 ops/api/playbook.py:144 ops/api/playbook.py:192
|
||||
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
|
||||
msgid "Invalid file path"
|
||||
msgstr "無効なファイルパス"
|
||||
|
||||
#: ops/api/playbook.py:170
|
||||
#: ops/api/playbook.py:171
|
||||
msgid "This file can not be rename"
|
||||
msgstr "ファイル名を変更することはできません"
|
||||
|
||||
#: ops/api/playbook.py:189
|
||||
#: ops/api/playbook.py:190
|
||||
msgid "File already exists"
|
||||
msgstr "ファイルは既に存在します。"
|
||||
|
||||
#: ops/api/playbook.py:207
|
||||
#: ops/api/playbook.py:208
|
||||
msgid "File key is required"
|
||||
msgstr "ファイルキーこのフィールドは必須です"
|
||||
|
||||
#: ops/api/playbook.py:210
|
||||
#: ops/api/playbook.py:211
|
||||
msgid "This file can not be delete"
|
||||
msgstr "このファイルを削除できません"
|
||||
|
||||
@@ -4574,7 +4587,8 @@ msgstr "ユーザーとして実行"
|
||||
msgid "Run as policy"
|
||||
msgstr "ユーザー ポリシー"
|
||||
|
||||
#: ops/models/job.py:222 terminal/notifications.py:174
|
||||
#: ops/models/job.py:222 ops/serializers/job.py:92
|
||||
#: terminal/notifications.py:174
|
||||
msgid "Job"
|
||||
msgstr "ジョブ#ジョブ#"
|
||||
|
||||
@@ -4586,7 +4600,7 @@ msgstr "Material"
|
||||
msgid "Material Type"
|
||||
msgstr "Material を選択してオプションを設定します。"
|
||||
|
||||
#: ops/models/job.py:545
|
||||
#: ops/models/job.py:548
|
||||
msgid "Job Execution"
|
||||
msgstr "ジョブ実行"
|
||||
|
||||
@@ -4650,7 +4664,11 @@ msgstr "タスクの種類"
|
||||
msgid "Is finished"
|
||||
msgstr "終了しました"
|
||||
|
||||
#: ops/serializers/job.py:90
|
||||
#: ops/serializers/job.py:89
|
||||
msgid "Task id"
|
||||
msgstr "タスク ID"
|
||||
|
||||
#: ops/serializers/job.py:98
|
||||
msgid "You do not have permission for the current job."
|
||||
msgstr "あなたは現在のジョブの権限を持っていません。"
|
||||
|
||||
@@ -4754,10 +4772,6 @@ msgstr "組織を選択してから保存してください"
|
||||
msgid "Organization"
|
||||
msgstr "組織"
|
||||
|
||||
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
|
||||
msgid "Org name"
|
||||
msgstr "組織名"
|
||||
|
||||
#: orgs/models.py:14
|
||||
msgid "GLOBAL"
|
||||
msgstr "グローバル組織"
|
||||
@@ -5066,11 +5080,6 @@ msgstr "システムロールバインディング"
|
||||
msgid "Perms"
|
||||
msgstr "パーマ"
|
||||
|
||||
#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
|
||||
#: terminal/models/virtualapp/virtualapp.py:20
|
||||
msgid "Display name"
|
||||
msgstr "表示名"
|
||||
|
||||
#: rbac/serializers/rolebinding.py:60
|
||||
msgid "Has bound this role"
|
||||
msgstr "この役割をバインドしました"
|
||||
@@ -5352,8 +5361,8 @@ msgstr ""
|
||||
"スでユーザーを作成します"
|
||||
|
||||
#: settings/serializers/auth/base.py:35
|
||||
msgid "Forgot Password"
|
||||
msgstr "パスワードを忘れた"
|
||||
msgid "Forgot Password URL"
|
||||
msgstr "パスワードを忘れた場合のURL"
|
||||
|
||||
#: settings/serializers/auth/base.py:36
|
||||
msgid "The URL for Forgotten Password on the user login page"
|
||||
@@ -5450,15 +5459,15 @@ msgstr "DN のバインド"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:47
|
||||
msgid "Binding Distinguished Name"
|
||||
msgstr "専有名のバインド"
|
||||
msgstr "バインドディレクトリ管理者"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:51
|
||||
msgid "Binding password"
|
||||
msgstr "古いパスワード"
|
||||
msgstr "バインドパスワード"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:54
|
||||
msgid "Search OU"
|
||||
msgstr "システムアーキテクチャ"
|
||||
msgstr "ユーザーOU"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:56
|
||||
msgid ""
|
||||
@@ -5626,7 +5635,7 @@ msgstr "レルム名"
|
||||
|
||||
#: settings/serializers/auth/oidc.py:70
|
||||
msgid "OpenID Connect"
|
||||
msgstr "接続"
|
||||
msgstr "OpenID 接続する"
|
||||
|
||||
#: settings/serializers/auth/oidc.py:73
|
||||
msgid "Provider endpoint"
|
||||
@@ -5754,7 +5763,7 @@ msgstr "認証コード長"
|
||||
|
||||
#: settings/serializers/auth/sms.py:26
|
||||
msgid "Length of the sent verification code"
|
||||
msgstr "確認コードを送信"
|
||||
msgstr "送信された認証コードの長さ"
|
||||
|
||||
#: settings/serializers/auth/sms.py:31 settings/serializers/auth/sms.py:54
|
||||
#: settings/serializers/auth/sms.py:62 settings/serializers/auth/sms.py:71
|
||||
@@ -5980,8 +5989,8 @@ msgid "Chat AI"
|
||||
msgstr "チャットAI"
|
||||
|
||||
#: settings/serializers/feature.py:80
|
||||
msgid "Base URL"
|
||||
msgstr "ベースサイトのアドレス"
|
||||
msgid "GPT Base URL"
|
||||
msgstr "GPTアドレス"
|
||||
|
||||
#: settings/serializers/feature.py:81
|
||||
msgid "The base URL of the GPT service. For example: https://api.openai.com/v1"
|
||||
@@ -6074,15 +6083,15 @@ msgstr ""
|
||||
|
||||
#: settings/serializers/msg.py:33
|
||||
msgid "The user to be used for email server authentication"
|
||||
msgstr "これは、SSO認証中にメールが返されない場合にデフォルトで使用されます。"
|
||||
msgstr ""
|
||||
"メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアド"
|
||||
"レスです"
|
||||
|
||||
#: settings/serializers/msg.py:37
|
||||
msgid ""
|
||||
"Password to use for the email server. It is used in conjunction with `User` "
|
||||
"when authenticating to the email server"
|
||||
msgstr ""
|
||||
"メールサーバーに対するパスワード。メールサーバーに対する認証時に、これがユー"
|
||||
"ザーとともに使用されます"
|
||||
msgstr "メールサーバーにログインするためのパスワード"
|
||||
|
||||
#: settings/serializers/msg.py:40
|
||||
msgid "Sender"
|
||||
@@ -7090,6 +7099,11 @@ msgstr "コミュニティ版"
|
||||
msgid "Enterprise"
|
||||
msgstr "エンタープライズ版"
|
||||
|
||||
#: terminal/models/applet/applet.py:34
|
||||
#: terminal/models/virtualapp/virtualapp.py:20
|
||||
msgid "Display name"
|
||||
msgstr "表示名"
|
||||
|
||||
#: terminal/models/applet/applet.py:36
|
||||
#: terminal/models/virtualapp/virtualapp.py:22
|
||||
msgid "Author"
|
||||
@@ -9247,7 +9261,7 @@ msgstr "タスク実行完了"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:97
|
||||
msgid "Synchronization regions"
|
||||
msgstr "同期地域"
|
||||
msgstr "地域を同期する"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:115
|
||||
#, python-format
|
||||
@@ -9259,7 +9273,7 @@ msgstr "地域 \"%s\" のインスタンスを取得できませんでした、
|
||||
msgid "Failed to synchronize the instance \"%s\""
|
||||
msgstr "インスタンス \"%s\" の同期に失敗しました"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:334
|
||||
#: xpack/plugins/cloud/manager.py:337
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The updated platform of asset \"%s\" is inconsistent with the original "
|
||||
@@ -9268,42 +9282,42 @@ msgstr ""
|
||||
"更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プ"
|
||||
"ラットフォームとプロトコルの更新をスキップ"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:390
|
||||
#: xpack/plugins/cloud/manager.py:393
|
||||
#, python-format
|
||||
msgid "The asset \"%s\" already exists"
|
||||
msgstr "資産 \"%s\" はすでに存在します"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:392
|
||||
#: xpack/plugins/cloud/manager.py:395
|
||||
#, python-format
|
||||
msgid "Update asset \"%s\""
|
||||
msgstr "資産の更新 \"%s\""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:395
|
||||
#: xpack/plugins/cloud/manager.py:398
|
||||
#, python-format
|
||||
msgid "Asset \"%s\" has been updated"
|
||||
msgstr "資産 \"%s\" が更新されました"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:405
|
||||
#: xpack/plugins/cloud/manager.py:408
|
||||
#, python-format
|
||||
msgid "Prepare to create asset \"%s\""
|
||||
msgstr "資産 \"%s\" の作成準備"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:426
|
||||
#: xpack/plugins/cloud/manager.py:429
|
||||
#, python-format
|
||||
msgid "Set nodes \"%s\""
|
||||
msgstr "ノード \"%s\" の設定"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:452
|
||||
#: xpack/plugins/cloud/manager.py:455
|
||||
#, python-format
|
||||
msgid "Set accounts \"%s\""
|
||||
msgstr "アカウント \"%s\" の設定"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:468
|
||||
#: xpack/plugins/cloud/manager.py:471
|
||||
#, python-format
|
||||
msgid "Set protocols \"%s\""
|
||||
msgstr "プロトコル \"%s\" の設定"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:482 xpack/plugins/cloud/tasks.py:27
|
||||
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:27
|
||||
msgid "Run sync instance task"
|
||||
msgstr "同期インスタンス タスクを実行する"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: JumpServer 0.3.3\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-07-03 16:39+0800\n"
|
||||
"POT-Creation-Date: 2024-07-16 18:58+0800\n"
|
||||
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
|
||||
"Last-Translator: ibuler <ibuler@qq.com>\n"
|
||||
"Language-Team: JumpServer team<ibuler@qq.com>\n"
|
||||
@@ -63,7 +63,8 @@ msgstr "完成"
|
||||
|
||||
#: accounts/automations/backup_account/handlers.py:219
|
||||
#: accounts/const/automation.py:110
|
||||
#: accounts/serializers/automations/change_secret.py:166 audits/const.py:64
|
||||
#: accounts/serializers/automations/change_secret.py:166
|
||||
#: assets/serializers/automations/base.py:52 audits/const.py:64
|
||||
#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
|
||||
#: common/const/choices.py:18 ops/const.py:74 ops/serializers/celery.py:48
|
||||
#: terminal/const.py:78 terminal/models/session/sharing.py:121
|
||||
@@ -302,8 +303,9 @@ msgstr "邮箱"
|
||||
msgid "SFTP"
|
||||
msgstr "SFTP"
|
||||
|
||||
#: accounts/const/automation.py:111 common/const/choices.py:16
|
||||
#: terminal/const.py:77 tickets/const.py:29 tickets/const.py:38
|
||||
#: accounts/const/automation.py:111 assets/serializers/automations/base.py:54
|
||||
#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:29
|
||||
#: tickets/const.py:38
|
||||
msgid "Pending"
|
||||
msgstr "待定的"
|
||||
|
||||
@@ -392,7 +394,7 @@ msgstr "来源 ID"
|
||||
#: terminal/templates/terminal/_msg_command_warning.html:8
|
||||
#: terminal/templates/terminal/_msg_session_sharing.html:8
|
||||
#: tickets/models/ticket/command_confirm.py:13
|
||||
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:38
|
||||
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:37
|
||||
msgid "Account"
|
||||
msgstr "账号"
|
||||
|
||||
@@ -481,7 +483,7 @@ msgstr "账号备份快照"
|
||||
#: accounts/serializers/account/backup.py:48
|
||||
#: accounts/serializers/automations/base.py:56
|
||||
#: assets/models/automations/base.py:122
|
||||
#: assets/serializers/automations/base.py:39
|
||||
#: assets/serializers/automations/base.py:40
|
||||
msgid "Trigger mode"
|
||||
msgstr "触发模式"
|
||||
|
||||
@@ -574,7 +576,8 @@ msgid "Date finished"
|
||||
msgstr "结束日期"
|
||||
|
||||
#: accounts/models/automations/change_secret.py:44
|
||||
#: assets/models/automations/base.py:113 audits/models.py:208
|
||||
#: assets/models/automations/base.py:113
|
||||
#: assets/serializers/automations/base.py:39 audits/models.py:208
|
||||
#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:234
|
||||
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
|
||||
#: terminal/models/component/status.py:30
|
||||
@@ -679,7 +682,7 @@ msgstr "密文类型"
|
||||
#: authentication/templates/authentication/_access_key_modal.html:31
|
||||
#: settings/serializers/auth/radius.py:19
|
||||
msgid "Secret"
|
||||
msgstr "密钥"
|
||||
msgstr "密文"
|
||||
|
||||
#: accounts/models/base.py:42
|
||||
#: accounts/serializers/automations/change_secret.py:41
|
||||
@@ -706,9 +709,9 @@ msgstr "密码规则"
|
||||
#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28
|
||||
#: ops/serializers/job.py:18 orgs/models.py:82
|
||||
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
|
||||
#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:86
|
||||
#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
|
||||
#: terminal/models/component/endpoint.py:12
|
||||
#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183
|
||||
#: settings/serializers/msg.py:86 settings/serializers/terminal.py:9
|
||||
#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
|
||||
#: terminal/models/component/endpoint.py:109
|
||||
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
|
||||
#: terminal/models/component/terminal.py:85
|
||||
@@ -980,7 +983,7 @@ msgstr "资产类型"
|
||||
|
||||
#: accounts/serializers/account/base.py:33 terminal/serializers/storage.py:149
|
||||
msgid "Passphrase"
|
||||
msgstr "密码"
|
||||
msgstr "密钥密码"
|
||||
|
||||
#: accounts/serializers/account/base.py:96
|
||||
msgid ""
|
||||
@@ -1080,13 +1083,13 @@ msgstr "SSH 密钥更改方式"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:57
|
||||
msgid "Please enter your account username"
|
||||
msgstr "请输入 MFA 验证码"
|
||||
msgstr "请输入您的账户用户名"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:62
|
||||
msgid ""
|
||||
"Secret parameter settings, currently only effective for assets of the host "
|
||||
"type."
|
||||
msgstr "秘文参数设置,目前只对宿主类型的资产有效。"
|
||||
msgstr "参数设置当前仅对 AIX LINUX UNIX 类型资产有效"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:84
|
||||
msgid "* Please enter the correct password length"
|
||||
@@ -1243,7 +1246,8 @@ msgstr "审批人"
|
||||
#: authentication/templates/authentication/_access_key_modal.html:32
|
||||
#: perms/models/asset_permission.py:82
|
||||
#: terminal/models/component/endpoint.py:120
|
||||
#: terminal/models/session/sharing.py:29 tickets/const.py:36
|
||||
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
|
||||
#: tickets/const.py:36
|
||||
msgid "Active"
|
||||
msgstr "激活中"
|
||||
|
||||
@@ -1775,7 +1779,7 @@ msgstr "确认按钮选择器"
|
||||
msgid "API mode"
|
||||
msgstr "API 模式"
|
||||
|
||||
#: assets/const/types.py:251
|
||||
#: assets/const/types.py:248
|
||||
msgid "All types"
|
||||
msgstr "所有类型"
|
||||
|
||||
@@ -2715,7 +2719,7 @@ msgstr "原因描述"
|
||||
|
||||
#: audits/serializers.py:70 audits/serializers.py:184
|
||||
msgid "Auth backend display"
|
||||
msgstr "没有匹配到认证后端"
|
||||
msgstr "认证方式"
|
||||
|
||||
#: audits/serializers.py:134
|
||||
#, python-format
|
||||
@@ -3379,7 +3383,12 @@ msgstr "工单信息"
|
||||
msgid "Actions"
|
||||
msgstr "动作"
|
||||
|
||||
#: authentication/serializers/connection_token.py:42
|
||||
#: authentication/serializers/connection_token.py:40
|
||||
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
|
||||
msgid "Org name"
|
||||
msgstr "组织名称"
|
||||
|
||||
#: authentication/serializers/connection_token.py:43
|
||||
#: perms/serializers/permission.py:44 perms/serializers/permission.py:65
|
||||
#: users/serializers/user.py:127 users/serializers/user.py:273
|
||||
msgid "Is expired"
|
||||
@@ -3650,11 +3659,12 @@ msgstr "钉钉错误,请联系系统管理员"
|
||||
msgid "DingTalk Error"
|
||||
msgstr "钉钉错误"
|
||||
|
||||
#: authentication/views/dingtalk.py:57 authentication/views/feishu.py:68
|
||||
#: authentication/views/slack.py:47 authentication/views/wecom.py:55
|
||||
#: authentication/views/mixins.py:39
|
||||
msgid ""
|
||||
"The system configuration is incorrect. Please contact your administrator"
|
||||
msgstr "企业配置错误,请联系系统管理员"
|
||||
"For your safety, automatic redirection login is not supported on the client. "
|
||||
"If you need to open it in the client, please log in again"
|
||||
msgstr ""
|
||||
"为了您的安全,客户端不支持自动跳转登录。如果需要在客户端中打开,请重新登录"
|
||||
|
||||
#: authentication/views/dingtalk.py:61
|
||||
msgid "DingTalk is already bound"
|
||||
@@ -3800,7 +3810,7 @@ msgstr "运行中"
|
||||
msgid "Canceled"
|
||||
msgstr "取消"
|
||||
|
||||
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:409
|
||||
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
|
||||
#, python-format
|
||||
msgid "%(name)s was created successfully"
|
||||
msgstr "%(name)s 创建成功"
|
||||
@@ -3918,7 +3928,7 @@ msgid ""
|
||||
"information -> file encryption password to set the encryption password"
|
||||
msgstr "{} - 未设置加密密码 - 请前往个人信息 -> 文件加密密码中设置加密密码"
|
||||
|
||||
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:38
|
||||
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
|
||||
#, python-format
|
||||
msgid "%s object does not exist."
|
||||
msgstr "%s对象不存在"
|
||||
@@ -4272,27 +4282,27 @@ msgstr "正在创建任务,无法中断,请稍后重试。"
|
||||
msgid "Currently playbook is being used in a job"
|
||||
msgstr "当前 playbook 正在作业中使用"
|
||||
|
||||
#: ops/api/playbook.py:96
|
||||
#: ops/api/playbook.py:97
|
||||
msgid "Unsupported file content"
|
||||
msgstr "不支持的文件内容"
|
||||
|
||||
#: ops/api/playbook.py:98 ops/api/playbook.py:144 ops/api/playbook.py:192
|
||||
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
|
||||
msgid "Invalid file path"
|
||||
msgstr "无效的文件路径"
|
||||
|
||||
#: ops/api/playbook.py:170
|
||||
#: ops/api/playbook.py:171
|
||||
msgid "This file can not be rename"
|
||||
msgstr "该文件不能重命名"
|
||||
|
||||
#: ops/api/playbook.py:189
|
||||
#: ops/api/playbook.py:190
|
||||
msgid "File already exists"
|
||||
msgstr "文件已存在"
|
||||
|
||||
#: ops/api/playbook.py:207
|
||||
#: ops/api/playbook.py:208
|
||||
msgid "File key is required"
|
||||
msgstr "文件密钥该字段是必填项。"
|
||||
|
||||
#: ops/api/playbook.py:210
|
||||
#: ops/api/playbook.py:211
|
||||
msgid "This file can not be delete"
|
||||
msgstr "无法删除此文件"
|
||||
|
||||
@@ -4513,7 +4523,8 @@ msgstr "运行用户"
|
||||
msgid "Run as policy"
|
||||
msgstr "用户策略"
|
||||
|
||||
#: ops/models/job.py:222 terminal/notifications.py:174
|
||||
#: ops/models/job.py:222 ops/serializers/job.py:92
|
||||
#: terminal/notifications.py:174
|
||||
msgid "Job"
|
||||
msgstr "作业"
|
||||
|
||||
@@ -4525,7 +4536,7 @@ msgstr "Material"
|
||||
msgid "Material Type"
|
||||
msgstr "Material 类型"
|
||||
|
||||
#: ops/models/job.py:545
|
||||
#: ops/models/job.py:548
|
||||
msgid "Job Execution"
|
||||
msgstr "作业执行"
|
||||
|
||||
@@ -4589,7 +4600,11 @@ msgstr "任务类型"
|
||||
msgid "Is finished"
|
||||
msgstr "是否完成"
|
||||
|
||||
#: ops/serializers/job.py:90
|
||||
#: ops/serializers/job.py:89
|
||||
msgid "Task id"
|
||||
msgstr "任务 ID"
|
||||
|
||||
#: ops/serializers/job.py:98
|
||||
msgid "You do not have permission for the current job."
|
||||
msgstr "你没有当前作业的权限。"
|
||||
|
||||
@@ -4692,10 +4707,6 @@ msgstr "请选择一个组织后再保存"
|
||||
msgid "Organization"
|
||||
msgstr "组织"
|
||||
|
||||
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
|
||||
msgid "Org name"
|
||||
msgstr "组织名称"
|
||||
|
||||
#: orgs/models.py:14
|
||||
msgid "GLOBAL"
|
||||
msgstr "全局组织"
|
||||
@@ -5003,11 +5014,6 @@ msgstr "系统角色绑定"
|
||||
msgid "Perms"
|
||||
msgstr "权限"
|
||||
|
||||
#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
|
||||
#: terminal/models/virtualapp/virtualapp.py:20
|
||||
msgid "Display name"
|
||||
msgstr "显示名称"
|
||||
|
||||
#: rbac/serializers/rolebinding.py:60
|
||||
msgid "Has bound this role"
|
||||
msgstr "已经绑定"
|
||||
@@ -5286,8 +5292,8 @@ msgstr ""
|
||||
"以此邮箱后缀创建用户"
|
||||
|
||||
#: settings/serializers/auth/base.py:35
|
||||
msgid "Forgot Password"
|
||||
msgstr "忘记密码"
|
||||
msgid "Forgot Password URL"
|
||||
msgstr "忘记密码的 URL"
|
||||
|
||||
#: settings/serializers/auth/base.py:36
|
||||
msgid "The URL for Forgotten Password on the user login page"
|
||||
@@ -5382,15 +5388,15 @@ msgstr "绑定 DN"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:47
|
||||
msgid "Binding Distinguished Name"
|
||||
msgstr "绑定专有名称"
|
||||
msgstr "绑定目录管理员"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:51
|
||||
msgid "Binding password"
|
||||
msgstr "原来密码"
|
||||
msgstr "绑定密码"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:54
|
||||
msgid "Search OU"
|
||||
msgstr "系统架构"
|
||||
msgstr "用户 OU"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:56
|
||||
msgid ""
|
||||
@@ -5555,7 +5561,7 @@ msgstr "域"
|
||||
|
||||
#: settings/serializers/auth/oidc.py:70
|
||||
msgid "OpenID Connect"
|
||||
msgstr "连接"
|
||||
msgstr "OpenID 连接"
|
||||
|
||||
#: settings/serializers/auth/oidc.py:73
|
||||
msgid "Provider endpoint"
|
||||
@@ -5680,7 +5686,7 @@ msgstr "验证码长度"
|
||||
|
||||
#: settings/serializers/auth/sms.py:26
|
||||
msgid "Length of the sent verification code"
|
||||
msgstr "发送验证码"
|
||||
msgstr "发送验证码的长度"
|
||||
|
||||
#: settings/serializers/auth/sms.py:31 settings/serializers/auth/sms.py:54
|
||||
#: settings/serializers/auth/sms.py:62 settings/serializers/auth/sms.py:71
|
||||
@@ -5897,8 +5903,8 @@ msgid "Chat AI"
|
||||
msgstr "聊天 AI"
|
||||
|
||||
#: settings/serializers/feature.py:80
|
||||
msgid "Base URL"
|
||||
msgstr "JumpServer 地址"
|
||||
msgid "GPT Base URL"
|
||||
msgstr "GPT 地址"
|
||||
|
||||
#: settings/serializers/feature.py:81
|
||||
msgid "The base URL of the GPT service. For example: https://api.openai.com/v1"
|
||||
@@ -5987,7 +5993,7 @@ msgstr ""
|
||||
|
||||
#: settings/serializers/msg.py:33
|
||||
msgid "The user to be used for email server authentication"
|
||||
msgstr "SSO认证时,如果没有返回邮件地址,将使用该后缀"
|
||||
msgstr "登录到邮件服务器的用户名。这通常是你的邮件地址"
|
||||
|
||||
#: settings/serializers/msg.py:37
|
||||
msgid ""
|
||||
@@ -6960,6 +6966,11 @@ msgstr "社区版"
|
||||
msgid "Enterprise"
|
||||
msgstr "企业版"
|
||||
|
||||
#: terminal/models/applet/applet.py:34
|
||||
#: terminal/models/virtualapp/virtualapp.py:20
|
||||
msgid "Display name"
|
||||
msgstr "显示名称"
|
||||
|
||||
#: terminal/models/applet/applet.py:36
|
||||
#: terminal/models/virtualapp/virtualapp.py:22
|
||||
msgid "Author"
|
||||
@@ -8553,7 +8564,7 @@ msgstr "组织管理员"
|
||||
|
||||
#: users/serializers/user.py:140
|
||||
msgid "Can public key authentication"
|
||||
msgstr "可以公钥认证吗"
|
||||
msgstr "可以使用公钥认证"
|
||||
|
||||
#: users/serializers/user.py:242
|
||||
msgid "Full name"
|
||||
@@ -9076,7 +9087,7 @@ msgstr "任务执行 ID"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:97
|
||||
msgid "Synchronization regions"
|
||||
msgstr "没有用户需要同步"
|
||||
msgstr "同步地区"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:115
|
||||
#, python-format
|
||||
@@ -9088,49 +9099,49 @@ msgstr "获取区域 \"%s\" 的实例错误,错误:%s"
|
||||
msgid "Failed to synchronize the instance \"%s\""
|
||||
msgstr "无法同步实例 %s"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:334
|
||||
#: xpack/plugins/cloud/manager.py:337
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The updated platform of asset \"%s\" is inconsistent with the original "
|
||||
"platform type. Skip platform and protocol updates"
|
||||
msgstr "资产“%s”的更新平台与原平台类型不一致。跳过平台和协议更新"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:390
|
||||
#: xpack/plugins/cloud/manager.py:393
|
||||
#, python-format
|
||||
msgid "The asset \"%s\" already exists"
|
||||
msgstr "资产 \"%s\" 已存在"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:392
|
||||
#: xpack/plugins/cloud/manager.py:395
|
||||
#, python-format
|
||||
msgid "Update asset \"%s\""
|
||||
msgstr "更新资产 \"%s\""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:395
|
||||
#: xpack/plugins/cloud/manager.py:398
|
||||
#, python-format
|
||||
msgid "Asset \"%s\" has been updated"
|
||||
msgstr "资产 \"%s\" 已更新"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:405
|
||||
#: xpack/plugins/cloud/manager.py:408
|
||||
#, python-format
|
||||
msgid "Prepare to create asset \"%s\""
|
||||
msgstr "准备创建资产 %s"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:426
|
||||
#: xpack/plugins/cloud/manager.py:429
|
||||
#, python-format
|
||||
msgid "Set nodes \"%s\""
|
||||
msgstr "删除节点: \"%s\""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:452
|
||||
#: xpack/plugins/cloud/manager.py:455
|
||||
#, python-format
|
||||
msgid "Set accounts \"%s\""
|
||||
msgstr "删除账号: %s"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:468
|
||||
#: xpack/plugins/cloud/manager.py:471
|
||||
#, python-format
|
||||
msgid "Set protocols \"%s\""
|
||||
msgstr "设置协议 \"%s\""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:482 xpack/plugins/cloud/tasks.py:27
|
||||
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:27
|
||||
msgid "Run sync instance task"
|
||||
msgstr "执行同步实例任务"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: JumpServer 0.3.3\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-07-03 16:39+0800\n"
|
||||
"POT-Creation-Date: 2024-07-16 18:58+0800\n"
|
||||
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
|
||||
"Last-Translator: ibuler <ibuler@qq.com>\n"
|
||||
"Language-Team: JumpServer team<ibuler@qq.com>\n"
|
||||
@@ -65,7 +65,8 @@ msgstr "完成"
|
||||
|
||||
#: accounts/automations/backup_account/handlers.py:219
|
||||
#: accounts/const/automation.py:110
|
||||
#: accounts/serializers/automations/change_secret.py:166 audits/const.py:64
|
||||
#: accounts/serializers/automations/change_secret.py:166
|
||||
#: assets/serializers/automations/base.py:52 audits/const.py:64
|
||||
#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
|
||||
#: common/const/choices.py:18 ops/const.py:74 ops/serializers/celery.py:48
|
||||
#: terminal/const.py:78 terminal/models/session/sharing.py:121
|
||||
@@ -304,8 +305,9 @@ msgstr "信箱"
|
||||
msgid "SFTP"
|
||||
msgstr "SFTP"
|
||||
|
||||
#: accounts/const/automation.py:111 common/const/choices.py:16
|
||||
#: terminal/const.py:77 tickets/const.py:29 tickets/const.py:38
|
||||
#: accounts/const/automation.py:111 assets/serializers/automations/base.py:54
|
||||
#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:29
|
||||
#: tickets/const.py:38
|
||||
msgid "Pending"
|
||||
msgstr "待定的"
|
||||
|
||||
@@ -394,7 +396,7 @@ msgstr "來源 ID"
|
||||
#: terminal/templates/terminal/_msg_command_warning.html:8
|
||||
#: terminal/templates/terminal/_msg_session_sharing.html:8
|
||||
#: tickets/models/ticket/command_confirm.py:13
|
||||
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:38
|
||||
#: xpack/plugins/cloud/models.py:100 xpack/plugins/cloud/ws.py:37
|
||||
msgid "Account"
|
||||
msgstr "帳號"
|
||||
|
||||
@@ -483,7 +485,7 @@ msgstr "帳號備份快照"
|
||||
#: accounts/serializers/account/backup.py:48
|
||||
#: accounts/serializers/automations/base.py:56
|
||||
#: assets/models/automations/base.py:122
|
||||
#: assets/serializers/automations/base.py:39
|
||||
#: assets/serializers/automations/base.py:40
|
||||
msgid "Trigger mode"
|
||||
msgstr "觸發模式"
|
||||
|
||||
@@ -576,7 +578,8 @@ msgid "Date finished"
|
||||
msgstr "結束日期"
|
||||
|
||||
#: accounts/models/automations/change_secret.py:44
|
||||
#: assets/models/automations/base.py:113 audits/models.py:208
|
||||
#: assets/models/automations/base.py:113
|
||||
#: assets/serializers/automations/base.py:39 audits/models.py:208
|
||||
#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:234
|
||||
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
|
||||
#: terminal/models/component/status.py:30
|
||||
@@ -681,7 +684,7 @@ msgstr "密文類型"
|
||||
#: authentication/templates/authentication/_access_key_modal.html:31
|
||||
#: settings/serializers/auth/radius.py:19
|
||||
msgid "Secret"
|
||||
msgstr "金鑰"
|
||||
msgstr "飛文"
|
||||
|
||||
#: accounts/models/base.py:42
|
||||
#: accounts/serializers/automations/change_secret.py:41
|
||||
@@ -708,9 +711,9 @@ msgstr "密碼規則"
|
||||
#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28
|
||||
#: ops/serializers/job.py:18 orgs/models.py:82
|
||||
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
|
||||
#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:86
|
||||
#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
|
||||
#: terminal/models/component/endpoint.py:12
|
||||
#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183
|
||||
#: settings/serializers/msg.py:86 settings/serializers/terminal.py:9
|
||||
#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
|
||||
#: terminal/models/component/endpoint.py:109
|
||||
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
|
||||
#: terminal/models/component/terminal.py:85
|
||||
@@ -768,10 +771,8 @@ msgid "Secret from login"
|
||||
msgstr "與用戶登錄時相同"
|
||||
|
||||
#: accounts/models/virtual.py:18
|
||||
#, fuzzy
|
||||
#| msgid "Email account"
|
||||
msgid "Virtual account"
|
||||
msgstr "信箱帳號"
|
||||
msgstr "虛擬帳號"
|
||||
|
||||
#: accounts/models/virtual.py:28
|
||||
msgid "Same with user"
|
||||
@@ -984,7 +985,7 @@ msgstr "資產類型"
|
||||
|
||||
#: accounts/serializers/account/base.py:33 terminal/serializers/storage.py:149
|
||||
msgid "Passphrase"
|
||||
msgstr "密碼"
|
||||
msgstr "密鑰密碼"
|
||||
|
||||
#: accounts/serializers/account/base.py:96
|
||||
msgid ""
|
||||
@@ -1084,13 +1085,13 @@ msgstr "SSH 金鑰更改方式"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:57
|
||||
msgid "Please enter your account username"
|
||||
msgstr "請輸入 MFA 驗證碼"
|
||||
msgstr "請輸入您的帳戶使用者名稱"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:62
|
||||
msgid ""
|
||||
"Secret parameter settings, currently only effective for assets of the host "
|
||||
"type."
|
||||
msgstr "密文參數設定, 目前只對宿主型的資產有效。"
|
||||
msgstr "參數設置,目前只對 AIX LINUX UNIX 類型的資產有效。"
|
||||
|
||||
#: accounts/serializers/automations/change_secret.py:84
|
||||
msgid "* Please enter the correct password length"
|
||||
@@ -1247,7 +1248,8 @@ msgstr "審批人"
|
||||
#: authentication/templates/authentication/_access_key_modal.html:32
|
||||
#: perms/models/asset_permission.py:82
|
||||
#: terminal/models/component/endpoint.py:120
|
||||
#: terminal/models/session/sharing.py:29 tickets/const.py:36
|
||||
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
|
||||
#: tickets/const.py:36
|
||||
msgid "Active"
|
||||
msgstr "啟用中"
|
||||
|
||||
@@ -1779,7 +1781,7 @@ msgstr "確認按鈕選擇器"
|
||||
msgid "API mode"
|
||||
msgstr "API 模式"
|
||||
|
||||
#: assets/const/types.py:251
|
||||
#: assets/const/types.py:248
|
||||
msgid "All types"
|
||||
msgstr "所有類型"
|
||||
|
||||
@@ -2719,7 +2721,7 @@ msgstr "原因描述"
|
||||
|
||||
#: audits/serializers.py:70 audits/serializers.py:184
|
||||
msgid "Auth backend display"
|
||||
msgstr "没有匹配到认证后端"
|
||||
msgstr "認證方式"
|
||||
|
||||
#: audits/serializers.py:134
|
||||
#, python-format
|
||||
@@ -3383,7 +3385,12 @@ msgstr "工單資訊"
|
||||
msgid "Actions"
|
||||
msgstr "動作"
|
||||
|
||||
#: authentication/serializers/connection_token.py:42
|
||||
#: authentication/serializers/connection_token.py:40
|
||||
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
|
||||
msgid "Org name"
|
||||
msgstr "組織名稱"
|
||||
|
||||
#: authentication/serializers/connection_token.py:43
|
||||
#: perms/serializers/permission.py:44 perms/serializers/permission.py:65
|
||||
#: users/serializers/user.py:127 users/serializers/user.py:273
|
||||
msgid "Is expired"
|
||||
@@ -3654,11 +3661,12 @@ msgstr "釘釘錯誤,請聯絡系統管理員"
|
||||
msgid "DingTalk Error"
|
||||
msgstr "釘釘錯誤"
|
||||
|
||||
#: authentication/views/dingtalk.py:57 authentication/views/feishu.py:68
|
||||
#: authentication/views/slack.py:47 authentication/views/wecom.py:55
|
||||
#: authentication/views/mixins.py:39
|
||||
msgid ""
|
||||
"The system configuration is incorrect. Please contact your administrator"
|
||||
msgstr "企業配置錯誤,請聯絡系統管理員"
|
||||
"For your safety, automatic redirection login is not supported on the client. "
|
||||
"If you need to open it in the client, please log in again"
|
||||
msgstr ""
|
||||
"為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄"
|
||||
|
||||
#: authentication/views/dingtalk.py:61
|
||||
msgid "DingTalk is already bound"
|
||||
@@ -3804,7 +3812,7 @@ msgstr "運行中"
|
||||
msgid "Canceled"
|
||||
msgstr "取消"
|
||||
|
||||
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:409
|
||||
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
|
||||
#, python-format
|
||||
msgid "%(name)s was created successfully"
|
||||
msgstr "%(name)s 創建成功"
|
||||
@@ -3922,7 +3930,7 @@ msgid ""
|
||||
"information -> file encryption password to set the encryption password"
|
||||
msgstr "{} - 未設置加密密碼 - 請前往個人資訊 -> 文件加密密碼中設置加密密碼"
|
||||
|
||||
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:38
|
||||
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
|
||||
#, python-format
|
||||
msgid "%s object does not exist."
|
||||
msgstr "%s對象不存在"
|
||||
@@ -4275,27 +4283,27 @@ msgstr "正在創建任務,無法中斷,請稍後重試。"
|
||||
msgid "Currently playbook is being used in a job"
|
||||
msgstr "當前 playbook 正在作業中使用"
|
||||
|
||||
#: ops/api/playbook.py:96
|
||||
#: ops/api/playbook.py:97
|
||||
msgid "Unsupported file content"
|
||||
msgstr "不支持的文件內容"
|
||||
|
||||
#: ops/api/playbook.py:98 ops/api/playbook.py:144 ops/api/playbook.py:192
|
||||
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
|
||||
msgid "Invalid file path"
|
||||
msgstr "無效的文件路徑"
|
||||
|
||||
#: ops/api/playbook.py:170
|
||||
#: ops/api/playbook.py:171
|
||||
msgid "This file can not be rename"
|
||||
msgstr "該文件不能重命名"
|
||||
|
||||
#: ops/api/playbook.py:189
|
||||
#: ops/api/playbook.py:190
|
||||
msgid "File already exists"
|
||||
msgstr "文件已存在"
|
||||
|
||||
#: ops/api/playbook.py:207
|
||||
#: ops/api/playbook.py:208
|
||||
msgid "File key is required"
|
||||
msgstr "文件金鑰該欄位是必填項。"
|
||||
|
||||
#: ops/api/playbook.py:210
|
||||
#: ops/api/playbook.py:211
|
||||
msgid "This file can not be delete"
|
||||
msgstr "無法刪除此文件"
|
||||
|
||||
@@ -4518,7 +4526,8 @@ msgstr "執行使用者"
|
||||
msgid "Run as policy"
|
||||
msgstr "使用者策略"
|
||||
|
||||
#: ops/models/job.py:222 terminal/notifications.py:174
|
||||
#: ops/models/job.py:222 ops/serializers/job.py:92
|
||||
#: terminal/notifications.py:174
|
||||
msgid "Job"
|
||||
msgstr "作業"
|
||||
|
||||
@@ -4530,7 +4539,7 @@ msgstr "Material"
|
||||
msgid "Material Type"
|
||||
msgstr "Material 類型"
|
||||
|
||||
#: ops/models/job.py:545
|
||||
#: ops/models/job.py:548
|
||||
msgid "Job Execution"
|
||||
msgstr "作業執行"
|
||||
|
||||
@@ -4594,7 +4603,11 @@ msgstr "任務類型"
|
||||
msgid "Is finished"
|
||||
msgstr "是否完成"
|
||||
|
||||
#: ops/serializers/job.py:90
|
||||
#: ops/serializers/job.py:89
|
||||
msgid "Task id"
|
||||
msgstr "任務 ID"
|
||||
|
||||
#: ops/serializers/job.py:98
|
||||
msgid "You do not have permission for the current job."
|
||||
msgstr "你沒有當前作業的權限。"
|
||||
|
||||
@@ -4697,10 +4710,6 @@ msgstr "請選擇一個組織後再保存"
|
||||
msgid "Organization"
|
||||
msgstr "組織"
|
||||
|
||||
#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
|
||||
msgid "Org name"
|
||||
msgstr "組織名稱"
|
||||
|
||||
#: orgs/models.py:14
|
||||
msgid "GLOBAL"
|
||||
msgstr "全局組織"
|
||||
@@ -5010,11 +5019,6 @@ msgstr "系統角色綁定"
|
||||
msgid "Perms"
|
||||
msgstr "權限"
|
||||
|
||||
#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
|
||||
#: terminal/models/virtualapp/virtualapp.py:20
|
||||
msgid "Display name"
|
||||
msgstr "顯示名稱"
|
||||
|
||||
#: rbac/serializers/rolebinding.py:60
|
||||
msgid "Has bound this role"
|
||||
msgstr "已經綁定"
|
||||
@@ -5293,8 +5297,8 @@ msgstr ""
|
||||
"統將自動以此電子信箱後綴建立使用者"
|
||||
|
||||
#: settings/serializers/auth/base.py:35
|
||||
msgid "Forgot Password"
|
||||
msgstr "忘記密碼"
|
||||
msgid "Forgot Password URL"
|
||||
msgstr "忘記密碼連結"
|
||||
|
||||
#: settings/serializers/auth/base.py:36
|
||||
msgid "The URL for Forgotten Password on the user login page"
|
||||
@@ -5389,15 +5393,15 @@ msgstr "綁定 DN"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:47
|
||||
msgid "Binding Distinguished Name"
|
||||
msgstr "綁定專有名稱"
|
||||
msgstr "綁定目錄管理員"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:51
|
||||
msgid "Binding password"
|
||||
msgstr "原來的密碼"
|
||||
msgstr "綁定密碼"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:54
|
||||
msgid "Search OU"
|
||||
msgstr "系統架構"
|
||||
msgstr "使用者 OU"
|
||||
|
||||
#: settings/serializers/auth/ldap.py:56
|
||||
msgid ""
|
||||
@@ -5562,7 +5566,7 @@ msgstr "域"
|
||||
|
||||
#: settings/serializers/auth/oidc.py:70
|
||||
msgid "OpenID Connect"
|
||||
msgstr "Connect"
|
||||
msgstr "OpenID 連接"
|
||||
|
||||
#: settings/serializers/auth/oidc.py:73
|
||||
msgid "Provider endpoint"
|
||||
@@ -5687,7 +5691,7 @@ msgstr "驗證碼長度"
|
||||
|
||||
#: settings/serializers/auth/sms.py:26
|
||||
msgid "Length of the sent verification code"
|
||||
msgstr "發送驗證碼"
|
||||
msgstr "發送的驗證碼長度"
|
||||
|
||||
#: settings/serializers/auth/sms.py:31 settings/serializers/auth/sms.py:54
|
||||
#: settings/serializers/auth/sms.py:62 settings/serializers/auth/sms.py:71
|
||||
@@ -5904,8 +5908,8 @@ msgid "Chat AI"
|
||||
msgstr "聊天 AI"
|
||||
|
||||
#: settings/serializers/feature.py:80
|
||||
msgid "Base URL"
|
||||
msgstr "JumpServer 地址"
|
||||
msgid "GPT Base URL"
|
||||
msgstr "GPT 地址"
|
||||
|
||||
#: settings/serializers/feature.py:81
|
||||
msgid "The base URL of the GPT service. For example: https://api.openai.com/v1"
|
||||
@@ -5994,15 +5998,13 @@ msgstr ""
|
||||
|
||||
#: settings/serializers/msg.py:33
|
||||
msgid "The user to be used for email server authentication"
|
||||
msgstr "SSO認證時,如果沒有返回郵件地址,將使用該後綴"
|
||||
msgstr "登入郵件伺服器的使用者名稱。這通常是你的郵件地址"
|
||||
|
||||
#: settings/serializers/msg.py:37
|
||||
msgid ""
|
||||
"Password to use for the email server. It is used in conjunction with `User` "
|
||||
"when authenticating to the email server"
|
||||
msgstr ""
|
||||
"用於電子郵件伺服器的密碼。在向電子郵件伺服器進行身份驗證時,它與使用者一起使"
|
||||
"用"
|
||||
msgstr "登入郵件伺服器的密碼"
|
||||
|
||||
#: settings/serializers/msg.py:40
|
||||
msgid "Sender"
|
||||
@@ -6968,6 +6970,11 @@ msgstr "社區版"
|
||||
msgid "Enterprise"
|
||||
msgstr "企業版"
|
||||
|
||||
#: terminal/models/applet/applet.py:34
|
||||
#: terminal/models/virtualapp/virtualapp.py:20
|
||||
msgid "Display name"
|
||||
msgstr "顯示名稱"
|
||||
|
||||
#: terminal/models/applet/applet.py:36
|
||||
#: terminal/models/virtualapp/virtualapp.py:22
|
||||
msgid "Author"
|
||||
@@ -9094,7 +9101,7 @@ msgstr "Action 執行 ID"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:97
|
||||
msgid "Synchronization regions"
|
||||
msgstr "沒有需要同步的使用者"
|
||||
msgstr "同步地區"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:115
|
||||
#, python-format
|
||||
@@ -9107,7 +9114,7 @@ msgstr ""
|
||||
msgid "Failed to synchronize the instance \"%s\""
|
||||
msgstr "Unable to synchronize instance %s"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:334
|
||||
#: xpack/plugins/cloud/manager.py:337
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The updated platform of asset \"%s\" is inconsistent with the original "
|
||||
@@ -9116,42 +9123,42 @@ msgstr ""
|
||||
"The update platform of asset \"%s\" is not consistent with the original "
|
||||
"platform type. Skip platform and protocol updates"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:390
|
||||
#: xpack/plugins/cloud/manager.py:393
|
||||
#, python-format
|
||||
msgid "The asset \"%s\" already exists"
|
||||
msgstr "\"資產 \"%s\" 已存在"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:392
|
||||
#: xpack/plugins/cloud/manager.py:395
|
||||
#, python-format
|
||||
msgid "Update asset \"%s\""
|
||||
msgstr "更新資產 \"%s\""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:395
|
||||
#: xpack/plugins/cloud/manager.py:398
|
||||
#, python-format
|
||||
msgid "Asset \"%s\" has been updated"
|
||||
msgstr "資產 \"%s\" 已更新"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:405
|
||||
#: xpack/plugins/cloud/manager.py:408
|
||||
#, python-format
|
||||
msgid "Prepare to create asset \"%s\""
|
||||
msgstr "Preparing to create asset %s"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:426
|
||||
#: xpack/plugins/cloud/manager.py:429
|
||||
#, python-format
|
||||
msgid "Set nodes \"%s\""
|
||||
msgstr "Delete Node: \"%s\""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:452
|
||||
#: xpack/plugins/cloud/manager.py:455
|
||||
#, python-format
|
||||
msgid "Set accounts \"%s\""
|
||||
msgstr "刪除帳號: %s"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:468
|
||||
#: xpack/plugins/cloud/manager.py:471
|
||||
#, python-format
|
||||
msgid "Set protocols \"%s\""
|
||||
msgstr "設定協議 \"%s\""
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:482 xpack/plugins/cloud/tasks.py:27
|
||||
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:27
|
||||
msgid "Run sync instance task"
|
||||
msgstr "執行同步實例任務"
|
||||
|
||||
|
||||
@@ -924,7 +924,7 @@
|
||||
"RecentSession": "Recent sessions",
|
||||
"RecentlyUsed": "Recently",
|
||||
"Recipient": "Recipient",
|
||||
"RecipientHelpText": "If both recipient a and b are set, the account's key will be split into two parts",
|
||||
"RecipientHelpText": "If both recipients A and B are set, the account's ciphertext will be split into two parts; if only one recipient is set, the key will not be split.",
|
||||
"RecipientServer": "Receiving server",
|
||||
"Reconnect": "Reconnect",
|
||||
"Refresh": "Refresh",
|
||||
@@ -963,7 +963,7 @@
|
||||
"RequiredAssetOrNode": "Please select at least one asset or node",
|
||||
"RequiredContent": "Please input command",
|
||||
"RequiredEntryFile": "This file acts as the entry point for running and must be present",
|
||||
"RequiredRunas": "Please enter the execution user",
|
||||
"RequiredRunas": "Enter exec user",
|
||||
"RequiredSystemUserErrMsg": "Please select account",
|
||||
"RequiredUploadFile": "Please upload the file!",
|
||||
"Reset": "Reset",
|
||||
@@ -1101,7 +1101,6 @@
|
||||
"Setting": "Setting",
|
||||
"SettingInEndpointHelpText": "Configure service address and port in system settings / component settings / server endpoints",
|
||||
"Settings": "System settings",
|
||||
"Settings...": "Settings...",
|
||||
"Show": "Display",
|
||||
"ShowAssetAllChildrenNode": "Show all sub-nodes assets",
|
||||
"ShowAssetOnlyCurrentNode": "Only show current node assets",
|
||||
@@ -1384,5 +1383,10 @@
|
||||
"ZoneList": "Zones",
|
||||
"ZoneUpdate": "Update the zone",
|
||||
"forceEnableMFAHelpText": "If force enable, user can not disable by themselves",
|
||||
"removeWarningMsg": "Are you sure you want to remove"
|
||||
"removeWarningMsg": "Are you sure you want to remove",
|
||||
"RetrySelected": "Retry selected",
|
||||
"ApproveSelected": "Approve selected",
|
||||
"Running": "Running",
|
||||
"AdhocCreate": "Create the command",
|
||||
"UploadHelpText": "Please upload a .zip file containing the following sample directory structure"
|
||||
}
|
||||
@@ -699,7 +699,7 @@
|
||||
"LoginAssetToday": "本日のアクティブな資産数",
|
||||
"LoginAssets": "アクティブな資産",
|
||||
"LoginConfirm": "ログインレビュー",
|
||||
"LoginConfirmUser": "確認方法",
|
||||
"LoginConfirmUser": "ログインレビュー担当者",
|
||||
"LoginCount": "ログイン回数",
|
||||
"LoginDate": "ログイン日",
|
||||
"LoginFailed": "ログイン失敗",
|
||||
@@ -957,7 +957,7 @@
|
||||
"RecentSession": "最近の会話",
|
||||
"RecentlyUsed": "最近使用",
|
||||
"Recipient": "受取人",
|
||||
"RecipientHelpText": "A B受信者が設定されている場合、アカウントの鍵は前後二つに分割されます",
|
||||
"RecipientHelpText": "受信者 A と B が同時に設定されている場合、アカウントの暗号文は 2 つの部分に分割されます。受信者が 1 つだけ設定されている場合、キーは分割されません。",
|
||||
"RecipientServer": "受信サーバー",
|
||||
"Reconnect": "再接続",
|
||||
"Refresh": "更新",
|
||||
@@ -996,7 +996,7 @@
|
||||
"RequiredAssetOrNode": "少なくとも一つの資産またはノードを選択してください",
|
||||
"RequiredContent": "コマンドを入力してください",
|
||||
"RequiredEntryFile": "このファイルは実行のエントリポイントとして存在する必要があります",
|
||||
"RequiredRunas": "実行ユーザーを入力してください",
|
||||
"RequiredRunas": "実行ユーザーを入力",
|
||||
"RequiredSystemUserErrMsg": "アカウントを選択してください",
|
||||
"RequiredUploadFile": "ファイルをアップロードしてください!",
|
||||
"Reset": "復元",
|
||||
@@ -1135,7 +1135,6 @@
|
||||
"Setting": "設定",
|
||||
"SettingInEndpointHelpText": "システム設定/コンポーネント設定/サーバーエンドポイントでサービスのアドレスとポートを設定してください",
|
||||
"Settings": "システム設定",
|
||||
"Settings...": "設定...",
|
||||
"Show": "表示",
|
||||
"ShowAssetAllChildrenNode": "すべての子ノードの資産を表示",
|
||||
"ShowAssetOnlyCurrentNode": "現在のノードアセットのみを表示",
|
||||
@@ -1423,5 +1422,7 @@
|
||||
"ZoneList": "地域リスト",
|
||||
"ZoneUpdate": "更新エリア",
|
||||
"forceEnableMFAHelpText": "強制的に有効化すると、ユーザーは自分で無効化することができません。",
|
||||
"removeWarningMsg": "削除してもよろしいですか"
|
||||
"removeWarningMsg": "削除してもよろしいですか",
|
||||
"AdhocCreate": "アドホックコマンドを作成",
|
||||
"UploadHelpText": "次のサンプル構造ディレクトリを含む .zip ファイルをアップロードしてください。"
|
||||
}
|
||||
@@ -246,7 +246,7 @@
|
||||
"CeleryTaskLog": "Celery任务日志",
|
||||
"Certificate": "证书",
|
||||
"CertificateKey": "客户端密钥",
|
||||
"ChangeCredentials": "改密",
|
||||
"ChangeCredentials": "账号改密",
|
||||
"ChangeCredentialsHelpText": "定时修改账号密钥密码。账号随机生成密码,并同步到目标资产,如果同步成功,更新该账号的密码",
|
||||
"ChangeField": "变更字段",
|
||||
"ChangeOrganization": "更改组织",
|
||||
@@ -508,7 +508,7 @@
|
||||
"FeiShuOAuth": "飞书认证",
|
||||
"FeiShuTest": "测试",
|
||||
"FieldRequiredError": "此字段是必填项",
|
||||
"FileExplorer": "文件浏览",
|
||||
"FileExplorer": "文件管理",
|
||||
"FileManagement": "文件管理",
|
||||
"FileNameTooLong": "文件名太长",
|
||||
"FileSizeExceedsLimit": "文件大小超出限制",
|
||||
@@ -676,7 +676,7 @@
|
||||
"LoginAssetToday": "今日活跃资产数",
|
||||
"LoginAssets": "活跃资产",
|
||||
"LoginConfirm": "登录复核",
|
||||
"LoginConfirmUser": "确认方式",
|
||||
"LoginConfirmUser": "登录复核 受理人",
|
||||
"LoginCount": "登录次数",
|
||||
"LoginDate": "登录日期",
|
||||
"LoginFailed": "登录失败",
|
||||
@@ -926,7 +926,7 @@
|
||||
"RecentSession": "最近会话",
|
||||
"RecentlyUsed": "最近使用",
|
||||
"Recipient": "接收人",
|
||||
"RecipientHelpText": "若收件人 A B 都设置,账号的密钥将被拆分成前后两部分",
|
||||
"RecipientHelpText": "如果同时设置了收件人A和B,账号的密文将被拆分为两部分;如果只设置了一个收件人,密钥则不会被拆分。",
|
||||
"RecipientServer": "接收服务器",
|
||||
"Reconnect": "重新连接",
|
||||
"Refresh": "刷新",
|
||||
@@ -1103,7 +1103,6 @@
|
||||
"Setting": "设置",
|
||||
"SettingInEndpointHelpText": "在 系统设置 / 组件设置 / 服务端点 中配置服务地址和端口",
|
||||
"Settings": "系统设置",
|
||||
"Settings...": "设置...",
|
||||
"Show": "显示",
|
||||
"ShowAssetAllChildrenNode": "显示所有子节点资产",
|
||||
"ShowAssetOnlyCurrentNode": "仅显示当前节点资产",
|
||||
@@ -1385,5 +1384,11 @@
|
||||
"ZoneList": "网域列表",
|
||||
"ZoneUpdate": "更新网域",
|
||||
"forceEnableMFAHelpText": "如果强制启用,用户无法自行禁用",
|
||||
"removeWarningMsg": "你确定要移除"
|
||||
"removeWarningMsg": "你确定要移除",
|
||||
"VaultHCPMountPoint": "Vault 服务器的挂载点,默认为 jumpserver",
|
||||
"RetrySelected": "重试所选",
|
||||
"ApproveSelected": "审批所选",
|
||||
"Running": "运行中",
|
||||
"AdhocCreate": "创建命令",
|
||||
"UploadHelpText": "请上传包含以下示例结构目录的 .zip 压缩文件"
|
||||
}
|
||||
@@ -903,7 +903,7 @@
|
||||
"LoginCity": "登入城市",
|
||||
"LoginConfig": "登入配置",
|
||||
"LoginConfirm": "登入覆核",
|
||||
"LoginConfirmUser": "確認方式",
|
||||
"LoginConfirmUser": "登錄複核 受理人",
|
||||
"LoginCount": "登入次數",
|
||||
"LoginDate": "登入日期",
|
||||
"LoginFailed": "登入失敗",
|
||||
@@ -1239,7 +1239,7 @@
|
||||
"RecentSession": "最近會話",
|
||||
"RecentlyUsed": "最近使用",
|
||||
"Recipient": "接收人",
|
||||
"RecipientHelpText": "若收件人 A B 都設置,帳號的金鑰將被拆分成前後兩部分。如用戶未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密碼",
|
||||
"RecipientHelpText": "如果同時設定了收件人A和B,帳號的密文將被拆分為兩部分;如果只設定了一個收件人,密鑰則不會被拆分。",
|
||||
"RecipientServer": "接收伺服器",
|
||||
"Reconnect": "重新連接",
|
||||
"Refresh": "刷新",
|
||||
@@ -1459,7 +1459,6 @@
|
||||
"Setting": "設置",
|
||||
"SettingInEndpointHelpText": "在 系統設置 / 組件設置 / 服務端點 中配置服務地址和埠",
|
||||
"Settings": "系統設置",
|
||||
"Settings...": " Settings...",
|
||||
"Show": "顯示",
|
||||
"ShowAssetAllChildrenNode": "顯示所有子節點資產",
|
||||
"ShowAssetOnlyCurrentNode": "僅顯示當前節點資產",
|
||||
@@ -1909,7 +1908,7 @@
|
||||
"consult": "諮詢",
|
||||
"containerName": "容器名稱",
|
||||
"contents": "內容",
|
||||
"createAdhoc": "創建命令",
|
||||
"AdhocCreate": "創建命令",
|
||||
"createBy": "創建者",
|
||||
"createErrorMsg": "創建失敗",
|
||||
"createSuccessMsg": "導入創建成功,總共:{count}",
|
||||
@@ -2268,5 +2267,6 @@
|
||||
"weComTest": "測試",
|
||||
"week": "周",
|
||||
"weekOf": "周的星期",
|
||||
"wildcardsAllowed": "允許的通配符"
|
||||
"wildcardsAllowed": "允許的通配符",
|
||||
"UploadHelpText": "請上傳包含以下範例結構目錄的 .zip 壓縮文件"
|
||||
}
|
||||
@@ -209,6 +209,9 @@
|
||||
"asset": "asset",
|
||||
"cols": "cols",
|
||||
"confirm": "confirm",
|
||||
"connectDisabledTipsNoAccount": "Tips: No valid authorization account found, current resource cannot be connected. Please contact the administrator for assistance",
|
||||
"connectDisabledTipsNoConnectMethod": "Tips: No valid connection method found, current resource cannot be connected. Please contact the administrator for assistance",
|
||||
"connectDisabledTipsMethodDisabled": "Tips: No valid remote application deployment machine found, current resource cannot be connected. Please contact the administrator for assistance",
|
||||
"connect info": "connect info",
|
||||
"download": "download",
|
||||
"rows": "rows",
|
||||
|
||||
@@ -207,6 +207,9 @@
|
||||
"asset": "资产",
|
||||
"cols": "列数",
|
||||
"confirm": "确认",
|
||||
"connectDisabledTipsNoAccount": "提示:未找到有效的授权账号,当前资源无法连接,请联系管理员进行处理",
|
||||
"connectDisabledTipsNoConnectMethod": "提示:未找到有效的连接方式,当前资源无法连接,请联系管理员进行处理",
|
||||
"connectDisabledTipsMethodDisabled": "提示:未找到有效的远程应用发布机,当前资源无法连接,请联系管理员进行处理",
|
||||
"connect info": "连接信息",
|
||||
"download": "下载",
|
||||
"rows": "行数",
|
||||
|
||||
@@ -106,7 +106,7 @@ class DateTimeMixin:
|
||||
|
||||
@lazyproperty
|
||||
def user_login_logs_on_the_system_queryset(self):
|
||||
qs = UserLoginLog.objects.all()
|
||||
qs = UserLoginLog.objects.filter(status=LoginStatusChoices.success)
|
||||
qs = self.get_logs_queryset_filter(qs, 'datetime')
|
||||
queryset = qs.filter(username__in=construct_userlogin_usernames(self.users))
|
||||
return queryset
|
||||
|
||||
@@ -19,7 +19,7 @@ def kill_ansible_ssh_process(pid):
|
||||
|
||||
for child in process.children(recursive=True):
|
||||
if not _should_kill(child):
|
||||
return
|
||||
continue
|
||||
try:
|
||||
child.kill()
|
||||
except Exception as e:
|
||||
|
||||
@@ -105,7 +105,7 @@ class PlaybookRunner:
|
||||
shutil.rmtree(private_env)
|
||||
|
||||
kwargs = dict(kwargs)
|
||||
if self.isolate and not is_macos:
|
||||
if self.isolate and not is_macos():
|
||||
kwargs['process_isolation'] = True
|
||||
kwargs['process_isolation_executable'] = 'bwrap'
|
||||
|
||||
|
||||
@@ -270,7 +270,10 @@ class JobExecutionTaskDetail(APIView):
|
||||
execution = get_object_or_404(JobExecution, pk=task_id, creator=request.user)
|
||||
|
||||
return Response(data={
|
||||
'status': execution.status,
|
||||
'status': {
|
||||
'value': execution.status,
|
||||
'label': execution.get_status_display()
|
||||
},
|
||||
'is_finished': execution.is_finished,
|
||||
'is_success': execution.is_success,
|
||||
'time_cost': execution.time_cost,
|
||||
|
||||
@@ -248,6 +248,9 @@ class JobExecution(JMSOrgBaseModel):
|
||||
|
||||
# clean up zombie execution
|
||||
|
||||
def get_status_display(self):
|
||||
return dict(JobStatus.choices).get(self.status, self.status)
|
||||
|
||||
@classmethod
|
||||
def clean_unexpected_execution(cls):
|
||||
for execution in cls.objects.filter(status__in=[JobStatus.running]).all():
|
||||
@@ -420,6 +423,7 @@ class JobExecution(JMSOrgBaseModel):
|
||||
this.result.update(cb.result)
|
||||
else:
|
||||
this.result = cb.result
|
||||
this.result = json.loads(json.dumps(this.result).replace('\\u0000', ''))
|
||||
this.finish_task()
|
||||
|
||||
def finish_task(self):
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from django.conf import settings
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils.translation import gettext
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
@@ -134,9 +135,10 @@ class ServerPerformanceCheckUtil(object):
|
||||
|
||||
def initial_terminals(self):
|
||||
terminals = []
|
||||
for terminal in Terminal.objects.filter(is_deleted=False).exclude(
|
||||
type__in=[TerminalType.core, TerminalType.celery]
|
||||
):
|
||||
exclude_types = [TerminalType.core, TerminalType.celery, TerminalType.kael]
|
||||
if not settings.XPACK_LICENSE_IS_VALID:
|
||||
exclude_types.append(TerminalType.magnus)
|
||||
for terminal in Terminal.objects.filter(is_deleted=False).exclude(type__in=exclude_types):
|
||||
if not terminal.is_active:
|
||||
continue
|
||||
terminal.stat = Status.get_terminal_latest_stat(terminal)
|
||||
|
||||
@@ -84,6 +84,14 @@ class JobExecutionSerializer(BulkOrgResourceModelSerializer):
|
||||
fields = read_only_fields + [
|
||||
"job", "parameters", "creator"
|
||||
]
|
||||
extra_kwargs = {
|
||||
"task_id": {
|
||||
"label": _("Task id"),
|
||||
},
|
||||
"job": {
|
||||
"label": _("Job"),
|
||||
}
|
||||
}
|
||||
|
||||
def validate_job(self, job_obj):
|
||||
if job_obj.creator != self.context['request'].user:
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# Generated by Django 4.1.13 on 2024-05-09 03:16
|
||||
|
||||
import uuid
|
||||
|
||||
import django.contrib.auth.models
|
||||
import django.contrib.contenttypes.models
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import uuid
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
@@ -54,6 +55,7 @@ class Migration(migrations.Migration):
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
'verbose_name': 'ContentType'
|
||||
},
|
||||
bases=('contenttypes.contenttype',),
|
||||
managers=[
|
||||
|
||||
@@ -25,7 +25,7 @@ class RoleSerializer(serializers.ModelSerializer):
|
||||
extra_kwargs = {
|
||||
'permissions': {'write_only': True},
|
||||
'users_amount': {'label': _('Users amount')},
|
||||
'display_name': {'label': _('Display name')}
|
||||
'display_name': {'label': _('Name')}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ class AuthSettingSerializer(serializers.Serializer):
|
||||
)
|
||||
FORGOT_PASSWORD_URL = serializers.CharField(
|
||||
required=False, allow_blank=True, max_length=1024,
|
||||
label=_("Forgot Password"),
|
||||
label=_("Forgot Password URL"),
|
||||
help_text=_("The URL for Forgotten Password on the user login page")
|
||||
)
|
||||
LOGIN_REDIRECT_MSG_ENABLED = serializers.BooleanField(
|
||||
|
||||
@@ -77,7 +77,7 @@ class ChatAISettingSerializer(serializers.Serializer):
|
||||
required=False, label=_('Chat AI')
|
||||
)
|
||||
GPT_BASE_URL = serializers.CharField(
|
||||
allow_blank=True, required=False, label=_('Base URL'),
|
||||
allow_blank=True, required=False, label=_('GPT Base URL'),
|
||||
help_text=_('The base URL of the GPT service. For example: https://api.openai.com/v1')
|
||||
)
|
||||
GPT_API_KEY = EncryptedField(
|
||||
|
||||
@@ -14,8 +14,11 @@
|
||||
RDS_fSingleSessionPerUser: 1
|
||||
RDS_MaxDisconnectionTime: 60000
|
||||
RDS_RemoteAppLogoffTimeLimit: 0
|
||||
TinkerInstaller: Tinker_Installer.exe
|
||||
INSTALL_APPLETS: true
|
||||
PYTHON_VERSION: 3.11.6
|
||||
CHROME_VERSION: 118.0.5993.118
|
||||
CHROME_DRIVER_VERSION: 118.0.5993.70
|
||||
TINKER_VERSION: v0.1.6
|
||||
|
||||
tasks:
|
||||
- block:
|
||||
@@ -25,9 +28,11 @@
|
||||
method: GET
|
||||
follow_redirects: none
|
||||
status_code: [200, 301, 302, 303, 307, 308]
|
||||
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
|
||||
register: core_host_redirects
|
||||
|
||||
- fail:
|
||||
- name: Check failed
|
||||
fail:
|
||||
msg: "CORE_HOST {{ CORE_HOST }} is redirecting to {{ core_host_redirects.location }}, please use the final url"
|
||||
when: core_host_redirects.status_code >= 300 and core_host_redirects.status_code < 400
|
||||
|
||||
@@ -38,7 +43,7 @@
|
||||
include_management_tools: yes
|
||||
register: rds_install
|
||||
|
||||
- name: Stop Tinker before install (jumpserver)
|
||||
- name: Stop Tinker before install
|
||||
ansible.windows.win_powershell:
|
||||
script: |
|
||||
if (Get-Process -Name 'tinker' -ErrorAction SilentlyContinue) {
|
||||
@@ -48,36 +53,36 @@
|
||||
$Ansible.Changed = $false
|
||||
}
|
||||
|
||||
- name: Download JumpServer Tinker installer (jumpserver)
|
||||
- name: Download JumpServer Tinker installer
|
||||
ansible.windows.win_get_url:
|
||||
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/{{ TinkerInstaller }}"
|
||||
dest: "{{ ansible_env.TEMP }}\\{{ TinkerInstaller }}"
|
||||
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/Tinker_Installer_{{ TINKER_VERSION }}.exe"
|
||||
dest: "{{ ansible_env.TEMP }}\\Tinker_Installer_{{ TINKER_VERSION }}.exe"
|
||||
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
|
||||
|
||||
- name: Install JumpServer Tinker (jumpserver)
|
||||
- name: Install JumpServer Tinker
|
||||
ansible.windows.win_package:
|
||||
path: "{{ ansible_env.TEMP }}\\{{ TinkerInstaller }}"
|
||||
path: "{{ ansible_env.TEMP }}\\Tinker_Installer_{{ TINKER_VERSION }}.exe"
|
||||
arguments:
|
||||
- /VERYSILENT
|
||||
- /SUPPRESSMSGBOXES
|
||||
- /NORESTART
|
||||
state: present
|
||||
|
||||
- name: Set Tinkerd on the global system path (jumpserver)
|
||||
- name: Set Tinkerd on the global system path
|
||||
ansible.windows.win_path:
|
||||
elements:
|
||||
- '%USERPROFILE%\AppData\Local\Programs\Tinker\'
|
||||
scope: user
|
||||
|
||||
- name: Download python-3.11.6
|
||||
- name: Download python-{{ PYTHON_VERSION }}
|
||||
ansible.windows.win_get_url:
|
||||
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/python-3.11.6-amd64.exe"
|
||||
dest: "{{ ansible_env.TEMP }}\\python-3.11.6-amd64.exe"
|
||||
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/python-{{ PYTHON_VERSION }}-amd64.exe"
|
||||
dest: "{{ ansible_env.TEMP }}\\python-{{ PYTHON_VERSION }}-amd64.exe"
|
||||
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
|
||||
|
||||
- name: Install the python-3.11.6
|
||||
- name: Install the python-{{ PYTHON_VERSION }}
|
||||
ansible.windows.win_package:
|
||||
path: "{{ ansible_env.TEMP }}\\python-3.11.6-amd64.exe"
|
||||
path: "{{ ansible_env.TEMP }}\\python-{{ PYTHON_VERSION }}-amd64.exe"
|
||||
arguments:
|
||||
- /quiet
|
||||
- InstallAllUsers=1
|
||||
@@ -160,7 +165,7 @@
|
||||
script: |
|
||||
pip install -r '{{ ansible_env.TEMP }}\pip_packages\pip_packages\requirements.txt' --no-index --find-links='{{ ansible_env.TEMP }}\pip_packages\pip_packages'
|
||||
|
||||
- name: Stop chromedriver before install (jumpserver)
|
||||
- name: Stop chromedriver before install
|
||||
ansible.windows.win_powershell:
|
||||
script: |
|
||||
if (Get-Process -Name 'chromedriver' -ErrorAction SilentlyContinue) {
|
||||
@@ -170,12 +175,6 @@
|
||||
$Ansible.Changed = $false
|
||||
}
|
||||
|
||||
- name: Download chromedriver (Chrome)
|
||||
ansible.windows.win_get_url:
|
||||
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chromedriver-win64.zip"
|
||||
dest: "{{ ansible_env.TEMP }}\\chromedriver-win64.zip"
|
||||
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
|
||||
|
||||
- name: Remove old chromedriver (Chrome)
|
||||
ansible.windows.win_file:
|
||||
path: "{{ item }}"
|
||||
@@ -186,12 +185,24 @@
|
||||
- C:\Program Files\JumpServer\drivers\chromedriver-win64
|
||||
- C:\Program Files\JumpServer\drivers\chromedriver_win64
|
||||
|
||||
- name: Download chromedriver (Chrome)
|
||||
ansible.windows.win_get_url:
|
||||
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chromedriver-{{ CHROME_DRIVER_VERSION }}-win64.zip"
|
||||
dest: "{{ ansible_env.TEMP }}\\chromedriver-{{ CHROME_DRIVER_VERSION }}-win64.zip"
|
||||
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
|
||||
|
||||
- name: Unzip chromedriver (Chrome)
|
||||
community.windows.win_unzip:
|
||||
src: "{{ ansible_env.TEMP }}\\chromedriver-win64.zip"
|
||||
src: "{{ ansible_env.TEMP }}\\chromedriver-{{ CHROME_DRIVER_VERSION }}-win64.zip"
|
||||
dest: C:\Program Files\JumpServer\drivers
|
||||
|
||||
- name: Stop Chrome before install (jumpserver)
|
||||
- name: Download Chrome zip package (Chrome)
|
||||
ansible.windows.win_get_url:
|
||||
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chrome-{{ CHROME_VERSION }}-win.zip"
|
||||
dest: "{{ ansible_env.TEMP }}\\chrome-{{ CHROME_VERSION }}-win.zip"
|
||||
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
|
||||
|
||||
- name: Stop Chrome before install
|
||||
ansible.windows.win_powershell:
|
||||
script: |
|
||||
if (Get-Process -Name 'chrome' -ErrorAction SilentlyContinue) {
|
||||
@@ -201,12 +212,6 @@
|
||||
$Ansible.Changed = $false
|
||||
}
|
||||
|
||||
- name: Download Chrome zip package (Chrome)
|
||||
ansible.windows.win_get_url:
|
||||
url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chrome-win.zip"
|
||||
dest: "{{ ansible_env.TEMP }}\\chrome-win.zip"
|
||||
validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
|
||||
|
||||
- name: Remove old Chrome (Chrome)
|
||||
ansible.windows.win_file:
|
||||
path: "{{ item }}"
|
||||
@@ -219,7 +224,7 @@
|
||||
|
||||
- name: Unzip Chrome (Chrome)
|
||||
community.windows.win_unzip:
|
||||
src: "{{ ansible_env.TEMP }}\\chrome-win.zip"
|
||||
src: "{{ ansible_env.TEMP }}\\chrome-{{ CHROME_VERSION }}-win.zip"
|
||||
dest: C:\Program Files\JumpServer\applications
|
||||
|
||||
- name: Check and Clean global system path (Chrome)
|
||||
|
||||
@@ -242,7 +242,8 @@ class ConnectMethodUtil:
|
||||
'razor': 'TERMINAL_RAZOR_ENABLED',
|
||||
'magnus': 'TERMINAL_MAGNUS_ENABLED',
|
||||
}
|
||||
disabled_component = [comp for comp, attr in component_setting.items() if not getattr(settings, attr)]
|
||||
disabled_component = [comp for comp, attr in component_setting.items() if
|
||||
not (getattr(settings, attr) and settings.XPACK_LICENSE_IS_VALID)]
|
||||
if not disabled_component:
|
||||
return methods
|
||||
|
||||
|
||||
@@ -9,7 +9,14 @@ __all__ = ['IsSessionAssignee']
|
||||
|
||||
class IsSessionAssignee(permissions.IsAuthenticated):
|
||||
def has_permission(self, request, view):
|
||||
return True
|
||||
if not request.user:
|
||||
return False
|
||||
if request.user.is_anonymous:
|
||||
return False
|
||||
if view.action == 'retrieve':
|
||||
# Why return True? please refer to the issue: #11678
|
||||
return True
|
||||
return False
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
try:
|
||||
|
||||
@@ -41,7 +41,7 @@ class TerminalSmallSerializer(serializers.ModelSerializer):
|
||||
class TerminalSerializer(BulkModelSerializer):
|
||||
session_online = serializers.ReadOnlyField(source='get_online_session_count', label=_('Online sessions'))
|
||||
is_alive = serializers.BooleanField(read_only=True, label=_('Is alive'))
|
||||
is_active = serializers.BooleanField(read_only=True, label='Is active')
|
||||
is_active = serializers.BooleanField(read_only=True, label=_('Active'))
|
||||
load = LabeledChoiceField(
|
||||
read_only=True, choices=const.ComponentLoad.choices,
|
||||
label=_('Load status')
|
||||
|
||||
@@ -227,7 +227,7 @@ class MFABlockUtils(BlockUtilBase):
|
||||
|
||||
class LoginIpBlockUtil(BlockGlobalIpUtilBase):
|
||||
LIMIT_KEY_TMPL = "_LOGIN_LIMIT_{}"
|
||||
BLOCK_KEY_TMPL = "_LOGIN_BLOCK_{}"
|
||||
BLOCK_KEY_TMPL = "_LOGIN_BLOCK_IP_{}"
|
||||
|
||||
|
||||
def validate_emails(emails):
|
||||
|
||||
Reference in New Issue
Block a user