Merge branch 'v3' of github.com:jumpserver/jumpserver into v3

This commit is contained in:
Jiangjie.Bai 2022-11-01 19:55:59 +08:00
commit 792686d7ae
29 changed files with 789 additions and 629 deletions

View File

@ -1,6 +1,6 @@
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.generics import CreateAPIView, get_object_or_404 from rest_framework.generics import CreateAPIView, ListAPIView
from orgs.mixins.api import OrgBulkModelViewSet from orgs.mixins.api import OrgBulkModelViewSet
from rbac.permissions import RBACPermission from rbac.permissions import RBACPermission
@ -13,7 +13,7 @@ from assets.filters import AccountFilterSet
from assets.tasks.account_connectivity import test_accounts_connectivity_manual from assets.tasks.account_connectivity import test_accounts_connectivity_manual
from assets import serializers from assets import serializers
__all__ = ['AccountViewSet', 'AccountSecretsViewSet', 'AccountTaskCreateAPI'] __all__ = ['AccountViewSet', 'AccountSecretsViewSet', 'AccountTaskCreateAPI', 'AccountHistoriesSecretAPI']
class AccountViewSet(OrgBulkModelViewSet): class AccountViewSet(OrgBulkModelViewSet):
@ -42,7 +42,6 @@ class AccountSecretsViewSet(RecordViewLogMixin, AccountViewSet):
""" """
serializer_classes = { serializer_classes = {
'default': serializers.AccountSecretSerializer, 'default': serializers.AccountSecretSerializer,
'histories': serializers.AccountHistorySerializer,
} }
http_method_names = ['get', 'options'] http_method_names = ['get', 'options']
# Todo: 记得打开 # Todo: 记得打开
@ -50,14 +49,21 @@ class AccountSecretsViewSet(RecordViewLogMixin, AccountViewSet):
rbac_perms = { rbac_perms = {
'list': 'assets.view_accountsecret', 'list': 'assets.view_accountsecret',
'retrieve': 'assets.view_accountsecret', 'retrieve': 'assets.view_accountsecret',
'histories': ['assets.view_accountsecret'],
} }
@action(methods=['get'], detail=True, url_path='histories')
def histories(self, request, *args, **kwargs): class AccountHistoriesSecretAPI(RecordViewLogMixin, ListAPIView):
account = get_object_or_404(self.get_queryset(), **kwargs) model = Account.history.model
self.queryset = account.history.all() serializer_class = serializers.AccountHistorySerializer
return super().list(request, *args, **kwargs) http_method_names = ['get', 'options']
# Todo: 记得打开
# permission_classes = [RBACPermission, UserConfirmation.require(ConfirmType.MFA)]
rbac_perms = {
'list': 'assets.view_accountsecret',
}
def get_queryset(self):
return self.model.objects.filter(id=self.kwargs.get('pk'))
class AccountTaskCreateAPI(CreateAPIView): class AccountTaskCreateAPI(CreateAPIView):

View File

@ -12,7 +12,8 @@ from orgs.mixins import generics
from assets import serializers from assets import serializers
from assets.models import Asset, Gateway from assets.models import Asset, Gateway
from assets.tasks import ( from assets.tasks import (
update_assets_hardware_info_manual, test_assets_connectivity_manual, test_assets_connectivity_manual,
update_assets_hardware_info_manual,
) )
from assets.filters import NodeFilterBackend, LabelFilterBackend, IpInFilterBackend from assets.filters import NodeFilterBackend, LabelFilterBackend, IpInFilterBackend
from ..mixin import NodeFilterMixin from ..mixin import NodeFilterMixin
@ -78,12 +79,10 @@ class AssetViewSet(SuggestionMixin, NodeFilterMixin, OrgBulkModelViewSet):
class AssetsTaskMixin: class AssetsTaskMixin:
def perform_assets_task(self, serializer): def perform_assets_task(self, serializer):
data = serializer.validated_data data = serializer.validated_data
action = data['action']
assets = data.get('assets', []) assets = data.get('assets', [])
if action == "refresh": if data['action'] == "refresh":
task = update_assets_hardware_info_manual.delay(assets) task = update_assets_hardware_info_manual.delay(assets)
else: else:
# action == 'test':
task = test_assets_connectivity_manual.delay(assets) task = test_assets_connectivity_manual.delay(assets)
return task return task

View File

@ -4,11 +4,11 @@ from collections import namedtuple, defaultdict
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from rest_framework import status from rest_framework import status
from rest_framework.generics import get_object_or_404
from rest_framework.serializers import ValidationError from rest_framework.serializers import ValidationError
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.decorators import action from rest_framework.decorators import action
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.shortcuts import get_object_or_404, Http404
from django.db.models.signals import m2m_changed from django.db.models.signals import m2m_changed
from common.const.http import POST from common.const.http import POST
@ -16,7 +16,7 @@ from common.exceptions import SomeoneIsDoingThis
from common.const.signals import PRE_REMOVE, POST_REMOVE from common.const.signals import PRE_REMOVE, POST_REMOVE
from common.mixins.api import SuggestionMixin from common.mixins.api import SuggestionMixin
from assets.models import Asset from assets.models import Asset
from common.utils import get_logger, get_object_or_none from common.utils import get_logger
from common.tree import TreeNodeSerializer from common.tree import TreeNodeSerializer
from orgs.mixins.api import OrgBulkModelViewSet from orgs.mixins.api import OrgBulkModelViewSet
from orgs.mixins import generics from orgs.mixins import generics
@ -339,7 +339,7 @@ class NodeTaskCreateApi(generics.CreateAPIView):
def get_object(self): def get_object(self):
node_id = self.kwargs.get('pk') node_id = self.kwargs.get('pk')
node = get_object_or_none(self.model, id=node_id) node = get_object_or_404(self.model, id=node_id)
return node return node
@staticmethod @staticmethod
@ -361,8 +361,6 @@ class NodeTaskCreateApi(generics.CreateAPIView):
task = self.refresh_nodes_cache() task = self.refresh_nodes_cache()
self.set_serializer_data(serializer, task) self.set_serializer_data(serializer, task)
return return
if node is None:
raise Http404()
if action == "refresh": if action == "refresh":
task = update_node_assets_hardware_info_manual.delay(node) task = update_node_assets_hardware_info_manual.delay(node)
else: else:

View File

@ -1,5 +1,5 @@
from common.utils import get_logger from common.utils import get_logger
from assets.const import AutomationTypes from assets.const import AutomationTypes, Connectivity
from ..base.manager import BasePlaybookManager from ..base.manager import BasePlaybookManager
logger = get_logger(__name__) logger = get_logger(__name__)
@ -8,13 +8,27 @@ logger = get_logger(__name__)
class PingManager(BasePlaybookManager): class PingManager(BasePlaybookManager):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.host_asset_mapper = {} self.host_asset_and_account_mapper = {}
@classmethod @classmethod
def method_type(cls): def method_type(cls):
return AutomationTypes.ping return AutomationTypes.ping
def host_callback(self, host, asset=None, **kwargs): def host_callback(self, host, asset=None, account=None, **kwargs):
super().host_callback(host, asset=asset, **kwargs) super().host_callback(host, asset=asset, account=account, **kwargs)
self.host_asset_mapper[host['name']] = asset self.host_asset_and_account_mapper[host['name']] = (asset, account)
return host return host
def on_host_success(self, host, result):
asset, account = self.host_asset_and_account_mapper.get(host)
asset.set_connectivity(Connectivity.ok)
if not account:
return
account.set_connectivity(Connectivity.ok)
def on_host_error(self, host, error, result):
asset, account = self.host_asset_and_account_mapper.get(host)
asset.set_connectivity(Connectivity.failed)
if not account:
return
account.set_connectivity(Connectivity.failed)

View File

@ -26,4 +26,16 @@ class Migration(migrations.Migration):
name='type', name='type',
field=models.CharField(choices=[('ping', 'Ping'), ('gather_facts', 'Gather facts'), ('push_account', 'Create account'), ('change_secret', 'Change secret'), ('verify_account', 'Verify account'), ('gather_accounts', 'Gather accounts')], max_length=16, verbose_name='Type'), field=models.CharField(choices=[('ping', 'Ping'), ('gather_facts', 'Gather facts'), ('push_account', 'Create account'), ('change_secret', 'Change secret'), ('verify_account', 'Verify account'), ('gather_accounts', 'Gather accounts')], max_length=16, verbose_name='Type'),
), ),
migrations.CreateModel(
name='PingAutomation',
fields=[
('baseautomation_ptr',
models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
primary_key=True, serialize=False, to='assets.baseautomation')),
],
options={
'verbose_name': 'Ping asset',
},
bases=('assets.baseautomation',),
),
] ]

View File

@ -71,7 +71,7 @@ class Account(AbsConnectivity, BaseAccount):
return self.asset.platform return self.asset.platform
def __str__(self): def __str__(self):
return '{}@{}'.format(self.username, self.asset.name) return '{}'.format(self.username)
@classmethod @classmethod
def get_input_account(cls): def get_input_account(cls):

View File

@ -4,3 +4,4 @@ from .push_account import *
from .gather_facts import * from .gather_facts import *
from .gather_accounts import * from .gather_accounts import *
from .verify_account import * from .verify_account import *
from .ping import *

View File

@ -28,6 +28,15 @@ class BaseAutomation(CommonModelMixin, PeriodTaskModelMixin, OrgModelMixin):
def __str__(self): def __str__(self):
return self.name + '@' + str(self.created_by) return self.name + '@' + str(self.created_by)
@classmethod
def generate_unique_name(cls, name):
while True:
name = name + str(uuid.uuid4())[:8]
try:
cls.objects.get(name=name)
except cls.DoesNotExist:
return name
def get_all_assets(self): def get_all_assets(self):
nodes = self.nodes.all() nodes = self.nodes.all()
node_asset_ids = Node.get_nodes_all_assets(*nodes).values_list('id', flat=True) node_asset_ids = Node.get_nodes_all_assets(*nodes).values_list('id', flat=True)

View File

@ -0,0 +1,15 @@
from django.utils.translation import ugettext_lazy as _
from assets.const import AutomationTypes
from .base import BaseAutomation
__all__ = ['PingAutomation']
class PingAutomation(BaseAutomation):
def save(self, *args, **kwargs):
self.type = AutomationTypes.ping
super().save(*args, **kwargs)
class Meta:
verbose_name = _("Ping asset")

View File

@ -19,14 +19,12 @@ logger = get_logger(__file__)
def update_asset_hardware_info_on_created(asset): def update_asset_hardware_info_on_created(asset):
logger.debug("Update asset `{}` hardware info".format(asset)) logger.debug("Update asset `{}` hardware info".format(asset))
# Todo: update_assets_hardware_info_util.delay([asset])
# update_assets_hardware_info_util.delay([asset])
def test_asset_conn_on_created(asset): def test_asset_conn_on_created(asset):
logger.debug("Test asset `{}` connectivity".format(asset)) logger.debug("Test asset `{}` connectivity".format(asset))
# Todo: test_asset_connectivity_util.delay([asset])
# test_asset_connectivity_util.delay([asset])
@receiver(pre_save, sender=Node) @receiver(pre_save, sender=Node)

View File

@ -1,124 +1,50 @@
# ~*~ coding: utf-8 ~*~ # ~*~ coding: utf-8 ~*~
from itertools import groupby
from collections import defaultdict
from celery import shared_task from celery import shared_task
from django.utils.translation import gettext_noop from django.utils.translation import gettext_noop
from common.utils import get_logger from common.utils import get_logger
from orgs.utils import org_aware_func, tmp_to_root_org from orgs.utils import org_aware_func, tmp_to_root_org
from ..models import Asset, Connectivity, Account, Node
from . import const
from .utils import clean_ansible_task_hosts, group_asset_by_platform
logger = get_logger(__file__) logger = get_logger(__file__)
__all__ = [ __all__ = [
'test_asset_connectivity_util', 'test_asset_connectivity_manual', 'test_asset_connectivity_util',
'test_node_assets_connectivity_manual', 'test_assets_connectivity_manual', 'test_assets_connectivity_manual',
'test_node_assets_connectivity_manual',
] ]
# Todo: 这里可能有问题了
def set_assets_accounts_connectivity(assets, results_summary):
asset_ids_ok = set()
asset_ids_failed = set()
asset_hostnames_ok = results_summary.get('contacted', {}).keys()
for asset in assets:
if asset.name in asset_hostnames_ok:
asset_ids_ok.add(asset.id)
else:
asset_ids_failed.add(asset.id)
Asset.bulk_set_connectivity(asset_ids_ok, Connectivity.ok)
Asset.bulk_set_connectivity(asset_ids_failed, Connectivity.failed)
accounts_ok = Account.objects.filter(asset_id__in=asset_ids_ok,)
accounts_failed = Account.objects.filter(asset_id__in=asset_ids_faile)
Account.bulk_set_connectivity(accounts_ok, Connectivity.ok)
Account.bulk_set_connectivity(accounts_failed, Connectivity.failed)
@org_aware_func('assets') @org_aware_func('assets')
def test_asset_connectivity_util(assets, task_name=None): def test_asset_connectivity_util(assets, task_name=None):
from ops.utils import update_or_create_ansible_task from assets.models import PingAutomation
if task_name is None: if task_name is None:
task_name = gettext_noop("Test assets connectivity. ") task_name = gettext_noop("Test assets connectivity. ")
hosts = clean_ansible_task_hosts(assets) task_name = PingAutomation.generate_unique_name(task_name)
if not hosts: data = {
return {} 'name': task_name,
platform_hosts_map = {} 'comment': ', '.join([str(i) for i in assets])
hosts_sorted = sorted(hosts, key=group_asset_by_platform)
platform_hosts = groupby(hosts_sorted, key=group_asset_by_platform)
for i in platform_hosts:
platform_hosts_map[i[0]] = list(i[1])
platform_tasks_map = {
"unixlike": const.PING_UNIXLIKE_TASKS,
"windows": const.PING_WINDOWS_TASKS
} }
results_summary = dict( instance = PingAutomation.objects.create(**data)
contacted=defaultdict(dict), dark=defaultdict(dict), success=True instance.assets.add(*assets)
) instance.execute()
for platform, _hosts in platform_hosts_map.items():
if not _hosts:
continue
logger.debug("System user not has special auth")
tasks = platform_tasks_map.get(platform)
task, created = update_or_create_ansible_task(
task_name=task_name, hosts=_hosts, tasks=tasks,
pattern='all', options=const.TASK_OPTIONS, run_as_admin=True,
)
raw, summary = task.run()
success = summary.get('success', False)
contacted = summary.get('contacted', {})
dark = summary.get('dark', {})
results_summary['success'] &= success
results_summary['contacted'].update(contacted)
results_summary['dark'].update(dark)
continue
set_assets_accounts_connectivity(assets, results_summary)
return results_summary
@shared_task(queue="ansible")
def test_asset_connectivity_manual(asset_id):
asset = Asset.objects.filter(id=asset_id).first()
if not asset:
return
task_name = gettext_noop("Test assets connectivity: ") + str(asset)
summary = test_asset_connectivity_util([asset], task_name=task_name)
if summary.get('dark'):
return False, summary['dark']
else:
return True, ""
@shared_task(queue="ansible") @shared_task(queue="ansible")
def test_assets_connectivity_manual(asset_ids): def test_assets_connectivity_manual(asset_ids):
from assets.models import Asset
with tmp_to_root_org(): with tmp_to_root_org():
assets = Asset.objects.filter(id__in=asset_ids) assets = Asset.objects.filter(id__in=asset_ids)
task_name = gettext_noop("Test assets connectivity: ") + str([asset.name for asset in assets])
summary = test_asset_connectivity_util(assets, task_name=task_name)
if summary.get('dark'): task_name = gettext_noop("Test assets connectivity: ")
return False, summary['dark'] test_asset_connectivity_util(assets, task_name=task_name)
else:
return True, ""
@shared_task(queue="ansible") @shared_task(queue="ansible")
def test_node_assets_connectivity_manual(node_id): def test_node_assets_connectivity_manual(node_id):
from assets.models import Node
with tmp_to_root_org(): with tmp_to_root_org():
node = Node.objects.get(id=node_id) node = Node.objects.get(id=node_id)
task_name = gettext_noop("Test if the assets under the node are connectable: ") + node.name task_name = gettext_noop("Test if the assets under the node are connectable: ")
assets = node.get_all_assets() assets = node.get_all_assets()
result = test_asset_connectivity_util(assets, task_name=task_name) test_asset_connectivity_util(assets, task_name=task_name)
return result

View File

@ -1,149 +1,50 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import json
import re
from celery import shared_task from celery import shared_task
from django.utils.translation import ugettext as _, gettext_noop from django.utils.translation import gettext_noop
from common.utils import ( from common.utils import get_logger
capacity_convert, sum_capacity, get_logger
)
from orgs.utils import org_aware_func, tmp_to_root_org from orgs.utils import org_aware_func, tmp_to_root_org
from . import const
from ..models import Asset, Node
from .utils import clean_ansible_task_hosts
logger = get_logger(__file__) logger = get_logger(__file__)
disk_pattern = re.compile(r'^hd|sd|xvd|vd|nv')
__all__ = [ __all__ = [
'update_assets_hardware_info_util', 'update_asset_hardware_info_manual', 'update_assets_hardware_info_util',
'update_assets_hardware_info_period', 'update_node_assets_hardware_info_manual', 'update_node_assets_hardware_info_manual',
'update_assets_hardware_info_manual', 'update_assets_hardware_info_manual',
] ]
def set_assets_hardware_info(assets, result, **kwargs):
"""
Using ops task run result, to update asset info
be a celery task also
:param assets:
:param result:
:param kwargs: {task_name: ""}
:return:
"""
result_raw = result[0]
assets_updated = []
success_result = result_raw.get('ok', {})
for asset in assets:
hostname = asset.name
info = success_result.get(hostname, {})
info = info.get('setup', {}).get('ansible_facts', {})
if not info:
logger.error(_("Get asset info failed: {}").format(hostname))
continue
___vendor = info.get('ansible_system_vendor', 'Unknown')
___model = info.get('ansible_product_name', 'Unknown')
___sn = info.get('ansible_product_serial', 'Unknown')
for ___cpu_model in info.get('ansible_processor', []):
if ___cpu_model.endswith('GHz') or ___cpu_model.startswith("Intel"):
break
else:
___cpu_model = 'Unknown'
___cpu_model = ___cpu_model[:48]
___cpu_count = info.get('ansible_processor_count', 0)
___cpu_cores = info.get('ansible_processor_cores', None) or \
len(info.get('ansible_processor', []))
___cpu_vcpus = info.get('ansible_processor_vcpus', 0)
___memory = '%s %s' % capacity_convert(
'{} MB'.format(info.get('ansible_memtotal_mb'))
)
disk_info = {}
for dev, dev_info in info.get('ansible_devices', {}).items():
if disk_pattern.match(dev) and dev_info['removable'] == '0':
disk_info[dev] = dev_info['size']
___disk_total = '%.1f %s' % sum_capacity(disk_info.values())
___disk_info = json.dumps(disk_info)
# ___platform = info.get('ansible_system', 'Unknown')
___os = info.get('ansible_distribution', 'Unknown')
___os_version = info.get('ansible_distribution_version', 'Unknown')
___os_arch = info.get('ansible_architecture', 'Unknown')
___hostname_raw = info.get('ansible_hostname', 'Unknown')
for k, v in locals().items():
if k.startswith('___'):
setattr(asset, k.strip('_'), v)
asset.save()
assets_updated.append(asset)
return assets_updated
@org_aware_func('assets') @org_aware_func('assets')
def update_assets_hardware_info_util(assets, task_name=None): def update_assets_hardware_info_util(assets, task_name=None):
""" from assets.models import GatherFactsAutomation
Using ansible api to update asset hardware info
:param asset_ids: asset seq
:param task_name: task_name running
:return: result summary ['contacted': {}, 'dark': {}]
"""
from ops.utils import update_or_create_ansible_task
if task_name is None: if task_name is None:
task_name = gettext_noop("Update some assets hardware info. ") task_name = gettext_noop("Update some assets hardware info. ")
tasks = const.UPDATE_ASSETS_HARDWARE_TASKS
hosts = clean_ansible_task_hosts(assets)
if not hosts:
return {}
task, created = update_or_create_ansible_task(
task_name, hosts=hosts, tasks=tasks,
pattern='all', options=const.TASK_OPTIONS,
run_as_admin=True,
)
result = task.run()
set_assets_hardware_info(assets, result)
return True
task_name = GatherFactsAutomation.generate_unique_name(task_name)
@shared_task(queue="ansible") data = {
def update_asset_hardware_info_manual(asset_id): 'name': task_name,
with tmp_to_root_org(): 'comment': ', '.join([str(i) for i in assets])
asset = Asset.objects.filter(id=asset_id).first() }
if not asset: instance = GatherFactsAutomation.objects.create(**data)
return instance.assets.add(*assets)
task_name = gettext_noop("Update asset hardware info: ") + str(asset.name) instance.execute()
update_assets_hardware_info_util([asset], task_name=task_name)
@shared_task(queue="ansible") @shared_task(queue="ansible")
def update_assets_hardware_info_manual(asset_ids): def update_assets_hardware_info_manual(asset_ids):
task_name = gettext_noop("Update assets hardware info: ") + str([asset.name for asset in assets]) from assets.models import Asset
update_assets_hardware_info_util(asset_ids, task_name=task_name) with tmp_to_root_org():
assets = Asset.objects.filter(id__in=asset_ids)
task_name = gettext_noop("Update assets hardware info: ")
@shared_task(queue="ansible") update_assets_hardware_info_util(assets, task_name=task_name)
def update_assets_hardware_info_period():
"""
Update asset hardware period task
:return:
"""
if not const.PERIOD_TASK_ENABLED:
logger.debug("Period task disabled, update assets hardware info pass")
return
@shared_task(queue="ansible") @shared_task(queue="ansible")
def update_node_assets_hardware_info_manual(node_id): def update_node_assets_hardware_info_manual(node_id):
from assets.models import Node
with tmp_to_root_org(): with tmp_to_root_org():
node = Node.objects.filter(id=node_id).first() node = Node.objects.get(id=node_id)
if not node:
return
task_name = gettext_noop("Update node asset hardware information: ") + str(node.name) task_name = gettext_noop("Update node asset hardware information: ")
assets = node.get_all_assets() assets = node.get_all_assets()
result = update_assets_hardware_info_util(assets, task_name=task_name) update_assets_hardware_info_util(assets, task_name=task_name)
return result

View File

@ -37,6 +37,7 @@ urlpatterns = [
path('assets/<uuid:pk>/perm-user-groups/<uuid:perm_user_group_id>/permissions/', api.AssetPermUserGroupPermissionsListApi.as_view(), name='asset-perm-user-group-permission-list'), path('assets/<uuid:pk>/perm-user-groups/<uuid:perm_user_group_id>/permissions/', api.AssetPermUserGroupPermissionsListApi.as_view(), name='asset-perm-user-group-permission-list'),
path('accounts/tasks/', api.AccountTaskCreateAPI.as_view(), name='account-task-create'), path('accounts/tasks/', api.AccountTaskCreateAPI.as_view(), name='account-task-create'),
path('account-secrets/<uuid:pk>/histories/', api.AccountHistoriesSecretAPI.as_view(), name='account-secret-history'),
path('nodes/category/tree/', api.CategoryTreeApi.as_view(), name='asset-category-tree'), path('nodes/category/tree/', api.CategoryTreeApi.as_view(), name='asset-category-tree'),
path('nodes/tree/', api.NodeListAsTreeApi.as_view(), name='node-tree'), path('nodes/tree/', api.NodeListAsTreeApi.as_view(), name='node-tree'),

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e0070188de11b8ace3a23cdf03ac803b50bf98beccef49b94bcfd0131fea8604 oid sha256:c4c889e251a4de3161f462e042882ba3c4ab40eaf34799e2d49d4788ad961586
size 119875 size 119171

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-26 16:41+0800\n" "POT-Creation-Date: 2022-11-01 15:30+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -32,7 +32,7 @@ msgstr "Acls"
#: assets/serializers/platform.py:104 ops/mixin.py:20 ops/models/playbook.py:9 #: assets/serializers/platform.py:104 ops/mixin.py:20 ops/models/playbook.py:9
#: orgs/models.py:70 perms/models/asset_permission.py:56 rbac/models/role.py:29 #: orgs/models.py:70 perms/models/asset_permission.py:56 rbac/models/role.py:29
#: settings/models.py:33 settings/serializers/sms.py:6 #: settings/models.py:33 settings/serializers/sms.py:6
#: terminal/models/applet/applet.py:25 terminal/models/component/endpoint.py:11 #: terminal/models/applet/applet.py:20 terminal/models/component/endpoint.py:11
#: terminal/models/component/endpoint.py:87 #: terminal/models/component/endpoint.py:87
#: terminal/models/component/storage.py:25 terminal/models/component/task.py:16 #: terminal/models/component/storage.py:25 terminal/models/component/task.py:16
#: terminal/models/component/terminal.py:100 users/forms/profile.py:33 #: terminal/models/component/terminal.py:100 users/forms/profile.py:33
@ -51,7 +51,7 @@ msgstr "優先順位"
msgid "1-100, the lower the value will be match first" msgid "1-100, the lower the value will be match first"
msgstr "1-100、低い値は最初に一致します" msgstr "1-100、低い値は最初に一致します"
#: acls/models/base.py:31 authentication/models.py:22 #: acls/models/base.py:31 authentication/models/access_key.py:15
#: authentication/templates/authentication/_access_key_modal.html:32 #: authentication/templates/authentication/_access_key_modal.html:32
#: perms/models/asset_permission.py:74 terminal/models/session/sharing.py:28 #: perms/models/asset_permission.py:74 terminal/models/session/sharing.py:28
#: tickets/const.py:38 #: tickets/const.py:38
@ -59,17 +59,17 @@ msgid "Active"
msgstr "アクティブ" msgstr "アクティブ"
#: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40 #: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40
#: assets/models/asset/common.py:100 assets/models/automations/base.py:25 #: assets/models/asset/common.py:100 assets/models/automations/base.py:26
#: assets/models/backup.py:30 assets/models/base.py:66 #: assets/models/backup.py:30 assets/models/base.py:66
#: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88 #: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88
#: assets/models/domain.py:25 assets/models/domain.py:69 #: assets/models/domain.py:25 assets/models/domain.py:69
#: assets/models/group.py:23 assets/models/label.py:22 #: assets/models/group.py:23 assets/models/label.py:22
#: assets/models/platform.py:73 ops/models/playbook.py:11 #: assets/models/platform.py:73 ops/models/playbook.py:11
#: ops/models/playbook.py:25 orgs/models.py:73 #: ops/models/playbook.py:25 orgs/models.py:74
#: perms/models/asset_permission.py:84 rbac/models/role.py:37 #: perms/models/asset_permission.py:84 rbac/models/role.py:37
#: settings/models.py:38 terminal/models/applet/applet.py:33 #: settings/models.py:38 terminal/models/applet/applet.py:28
#: terminal/models/applet/applet.py:62 terminal/models/applet/host.py:12 #: terminal/models/applet/applet.py:58 terminal/models/applet/host.py:34
#: terminal/models/applet/host.py:28 terminal/models/component/endpoint.py:24 #: terminal/models/component/endpoint.py:24
#: terminal/models/component/endpoint.py:97 #: terminal/models/component/endpoint.py:97
#: terminal/models/component/storage.py:28 #: terminal/models/component/storage.py:28
#: terminal/models/component/terminal.py:114 tickets/models/comment.py:32 #: terminal/models/component/terminal.py:114 tickets/models/comment.py:32
@ -96,8 +96,9 @@ msgstr "ログイン確認"
#: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20 #: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20
#: assets/models/cmd_filter.py:28 assets/models/label.py:15 audits/models.py:37 #: assets/models/cmd_filter.py:28 assets/models/label.py:15 audits/models.py:37
#: audits/models.py:62 audits/models.py:87 authentication/models.py:55 #: audits/models.py:62 audits/models.py:87
#: authentication/models.py:72 perms/models/asset_permission.py:58 #: authentication/models/connection_token.py:22
#: authentication/models/sso_token.py:15 perms/models/asset_permission.py:58
#: rbac/builtin.py:120 rbac/models/rolebinding.py:41 #: rbac/builtin.py:120 rbac/models/rolebinding.py:41
#: terminal/backends/command/models.py:20 #: terminal/backends/command/models.py:20
#: terminal/backends/command/serializers.py:13 #: terminal/backends/command/serializers.py:13
@ -129,7 +130,7 @@ msgid "Login acl"
msgstr "ログインacl" msgstr "ログインacl"
#: acls/models/login_asset_acl.py:21 assets/models/account.py:57 #: acls/models/login_asset_acl.py:21 assets/models/account.py:57
#: authentication/models.py:82 ops/models/base.py:18 #: authentication/models/connection_token.py:33 ops/models/base.py:18
#: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87 #: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87
#: xpack/plugins/cloud/serializers/task.py:65 #: xpack/plugins/cloud/serializers/task.py:65
msgid "Account" msgid "Account"
@ -139,7 +140,7 @@ msgstr "アカウント"
#: assets/models/asset/common.py:83 assets/models/asset/common.py:227 #: assets/models/asset/common.py:83 assets/models/asset/common.py:227
#: assets/models/cmd_filter.py:36 assets/models/gathered_user.py:14 #: assets/models/cmd_filter.py:36 assets/models/gathered_user.py:14
#: assets/serializers/account/account.py:58 assets/serializers/label.py:30 #: assets/serializers/account/account.py:58 assets/serializers/label.py:30
#: audits/models.py:39 authentication/models.py:77 #: audits/models.py:39 authentication/models/connection_token.py:26
#: perms/models/asset_permission.py:64 terminal/backends/command/models.py:21 #: perms/models/asset_permission.py:64 terminal/backends/command/models.py:21
#: terminal/backends/command/serializers.py:14 #: terminal/backends/command/serializers.py:14
#: terminal/models/session/session.py:32 terminal/notifications.py:90 #: terminal/models/session/session.py:32 terminal/notifications.py:90
@ -165,7 +166,7 @@ msgstr "コンマ区切り文字列の形式。* はすべて一致すること
#: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34 #: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34
#: assets/models/base.py:60 assets/models/gathered_user.py:15 #: assets/models/base.py:60 assets/models/gathered_user.py:15
#: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27 #: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27
#: authentication/models.py:245 #: authentication/models/temp_token.py:9
#: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_different_city.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9
#: users/forms/profile.py:32 users/models/user.py:663 #: users/forms/profile.py:32 users/models/user.py:663
@ -250,9 +251,9 @@ msgid "Category"
msgstr "カテゴリ" msgstr "カテゴリ"
#: applications/models.py:15 assets/models/_user.py:46 #: applications/models.py:15 assets/models/_user.py:46
#: assets/models/automations/base.py:23 assets/models/cmd_filter.py:74 #: assets/models/automations/base.py:24 assets/models/cmd_filter.py:74
#: assets/models/platform.py:70 assets/serializers/asset/common.py:63 #: assets/models/platform.py:70 assets/serializers/asset/common.py:63
#: assets/serializers/platform.py:75 terminal/models/applet/applet.py:29 #: assets/serializers/platform.py:75 terminal/models/applet/applet.py:24
#: terminal/models/component/storage.py:57 #: terminal/models/component/storage.py:57
#: terminal/models/component/storage.py:142 terminal/serializers/applet.py:20 #: terminal/models/component/storage.py:142 terminal/serializers/applet.py:20
#: tickets/models/comment.py:26 tickets/models/flow.py:57 #: tickets/models/comment.py:26 tickets/models/flow.py:57
@ -296,7 +297,7 @@ msgstr "削除に失敗し、ノードにアセットが含まれています。
msgid "App assets" msgid "App assets"
msgstr "アプリ資産" msgstr "アプリ資産"
#: assets/automations/base/manager.py:74 #: assets/automations/base/manager.py:122
#, fuzzy #, fuzzy
#| msgid "Disabled" #| msgid "Disabled"
msgid "{} disabled" msgid "{} disabled"
@ -312,7 +313,7 @@ msgstr "不明"
msgid "Ok" msgid "Ok"
msgstr "OK" msgstr "OK"
#: assets/const/account.py:8 audits/models.py:118 #: assets/const/account.py:8 audits/models.py:118 common/const/choices.py:18
#: xpack/plugins/change_auth_plan/serializers/asset.py:190 #: xpack/plugins/change_auth_plan/serializers/asset.py:190
#: xpack/plugins/cloud/const.py:33 #: xpack/plugins/cloud/const.py:33
msgid "Failed" msgid "Failed"
@ -343,12 +344,12 @@ msgid "SSH key"
msgstr "SSHキー" msgstr "SSHキー"
#: assets/const/account.py:14 assets/models/base.py:55 #: assets/const/account.py:14 assets/models/base.py:55
#: authentication/models.py:38 #: authentication/models/access_key.py:31
msgid "Access key" msgid "Access key"
msgstr "アクセスキー" msgstr "アクセスキー"
#: assets/const/account.py:15 assets/models/_user.py:38 #: assets/const/account.py:15 assets/models/_user.py:38
#: assets/models/base.py:56 authentication/models.py:53 #: assets/models/base.py:56 authentication/models/sso_token.py:13
msgid "Token" msgid "Token"
msgstr "トークン" msgstr "トークン"
@ -380,8 +381,10 @@ msgstr "秘密を改める"
msgid "Verify account" msgid "Verify account"
msgstr "パスワード/キーの確認" msgstr "パスワード/キーの確認"
#: assets/const/automation.py:18 rbac/tree.py:53 #: assets/const/automation.py:18
msgid "Gather account" #, fuzzy
#| msgid "Gather account"
msgid "Gather accounts"
msgstr "アカウントを集める" msgstr "アカウントを集める"
#: assets/const/automation.py:22 #: assets/const/automation.py:22
@ -414,8 +417,8 @@ msgid "Replace (The key generated by JumpServer) "
msgstr "置換(JumpServerによって生成された鍵)" msgstr "置換(JumpServerによって生成された鍵)"
#: assets/const/category.py:11 settings/serializers/auth/radius.py:14 #: assets/const/category.py:11 settings/serializers/auth/radius.py:14
#: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:60 #: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:56
#: terminal/models/applet/host.py:11 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:12
#: xpack/plugins/cloud/serializers/account_attrs.py:72 #: xpack/plugins/cloud/serializers/account_attrs.py:72
msgid "Host" msgid "Host"
msgstr "ホスト" msgstr "ホスト"
@ -496,11 +499,11 @@ msgstr "SSH秘密鍵"
msgid "SSH public key" msgid "SSH public key"
msgstr "SSHパブリックキー" msgstr "SSHパブリックキー"
#: assets/models/_user.py:41 assets/models/automations/base.py:86 #: assets/models/_user.py:41 assets/models/automations/base.py:87
#: assets/models/base.py:67 assets/models/domain.py:26 #: assets/models/base.py:67 assets/models/domain.py:26
#: assets/models/gathered_user.py:19 assets/models/group.py:22 #: assets/models/gathered_user.py:19 assets/models/group.py:22
#: common/db/models.py:76 common/mixins/models.py:50 ops/models/base.py:53 #: common/db/models.py:76 common/mixins/models.py:50 ops/models/base.py:53
#: orgs/models.py:72 perms/models/asset_permission.py:82 #: orgs/models.py:73 perms/models/asset_permission.py:82
#: users/models/group.py:18 users/models/user.py:927 #: users/models/group.py:18 users/models/user.py:927
msgid "Date created" msgid "Date created"
msgstr "作成された日付" msgstr "作成された日付"
@ -525,7 +528,8 @@ msgid "Username same with user"
msgstr "ユーザーと同じユーザー名" msgstr "ユーザーと同じユーザー名"
#: assets/models/_user.py:48 assets/models/domain.py:67 #: assets/models/_user.py:48 assets/models/domain.py:67
#: terminal/models/applet/applet.py:31 terminal/serializers/session.py:18 #: authentication/models/connection_token.py:29
#: terminal/models/applet/applet.py:26 terminal/serializers/session.py:18
#: terminal/serializers/session.py:32 terminal/serializers/storage.py:68 #: terminal/serializers/session.py:32 terminal/serializers/storage.py:68
msgid "Protocol" msgid "Protocol"
msgstr "プロトコル" msgstr "プロトコル"
@ -585,7 +589,7 @@ msgid "Su from"
msgstr "から切り替え" msgstr "から切り替え"
#: assets/models/account.py:53 settings/serializers/auth/cas.py:18 #: assets/models/account.py:53 settings/serializers/auth/cas.py:18
#: terminal/models/applet/applet.py:27 #: terminal/models/applet/applet.py:22
msgid "Version" msgid "Version"
msgstr "バージョン" msgstr "バージョン"
@ -630,16 +634,16 @@ msgstr "プラットフォーム"
msgid "Domain" msgid "Domain"
msgstr "ドメイン" msgstr "ドメイン"
#: assets/models/asset/common.py:97 assets/models/automations/base.py:18 #: assets/models/asset/common.py:97 assets/models/automations/base.py:19
#: assets/serializers/asset/common.py:66 perms/models/asset_permission.py:67 #: assets/serializers/asset/common.py:66 perms/models/asset_permission.py:67
#: xpack/plugins/change_auth_plan/models/asset.py:44 #: xpack/plugins/change_auth_plan/models/asset.py:44
#: xpack/plugins/gathered_user/models.py:24 #: xpack/plugins/gathered_user/models.py:24
msgid "Nodes" msgid "Nodes"
msgstr "ノード" msgstr "ノード"
#: assets/models/asset/common.py:98 assets/models/automations/base.py:24 #: assets/models/asset/common.py:98 assets/models/automations/base.py:25
#: assets/models/cmd_filter.py:39 assets/models/domain.py:70 #: assets/models/cmd_filter.py:39 assets/models/domain.py:70
#: assets/models/label.py:21 terminal/models/applet/applet.py:30 #: assets/models/label.py:21 terminal/models/applet/applet.py:25
#: users/serializers/user.py:147 #: users/serializers/user.py:147
msgid "Is active" msgid "Is active"
msgstr "アクティブです。" msgstr "アクティブです。"
@ -706,28 +710,29 @@ msgstr "パスワードルール"
msgid "Submit selector" msgid "Submit selector"
msgstr "" msgstr ""
#: assets/models/automations/base.py:16 assets/models/cmd_filter.py:38 #: assets/models/automations/base.py:17 assets/models/cmd_filter.py:38
#: assets/serializers/asset/common.py:68 perms/models/asset_permission.py:70 #: assets/serializers/asset/common.py:68 perms/models/asset_permission.py:70
#: rbac/tree.py:37 #: rbac/tree.py:37
msgid "Accounts" msgid "Accounts"
msgstr "アカウント" msgstr "アカウント"
#: assets/models/automations/base.py:21 assets/serializers/domain.py:29 #: assets/models/automations/base.py:22 assets/serializers/domain.py:29
#: ops/models/base.py:17 #: ops/models/base.py:17
#: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/change_auth_plan/models/asset.py:40 #: xpack/plugins/change_auth_plan/models/asset.py:40
msgid "Assets" msgid "Assets"
msgstr "資産" msgstr "資産"
#: assets/models/automations/base.py:76 assets/models/automations/base.py:83 #: assets/models/automations/base.py:77 assets/models/automations/base.py:84
#, fuzzy #, fuzzy
#| msgid "Automatic managed" #| msgid "Automatic managed"
msgid "Automation task" msgid "Automation task"
msgstr "自動管理" msgstr "自動管理"
#: assets/models/automations/base.py:87 assets/models/backup.py:77 #: assets/models/automations/base.py:88 assets/models/backup.py:77
#: audits/models.py:44 ops/models/base.py:54 #: audits/models.py:44 ops/models/base.py:54
#: perms/models/asset_permission.py:76 terminal/models/session/session.py:43 #: perms/models/asset_permission.py:76 terminal/models/applet/host.py:32
#: terminal/models/session/session.py:43
#: tickets/models/ticket/apply_application.py:28 #: tickets/models/ticket/apply_application.py:28
#: tickets/models/ticket/apply_asset.py:21 #: tickets/models/ticket/apply_asset.py:21
#: xpack/plugins/change_auth_plan/models/base.py:108 #: xpack/plugins/change_auth_plan/models/base.py:108
@ -736,63 +741,65 @@ msgstr "自動管理"
msgid "Date start" msgid "Date start"
msgstr "開始日" msgstr "開始日"
#: assets/models/automations/base.py:88 #: assets/models/automations/base.py:89
#: assets/models/automations/change_secret.py:59 ops/models/base.py:55 #: assets/models/automations/change_secret.py:58 ops/models/base.py:55
#: terminal/models/applet/host.py:33
msgid "Date finished" msgid "Date finished"
msgstr "終了日" msgstr "終了日"
#: assets/models/automations/base.py:90 #: assets/models/automations/base.py:91
#, fuzzy #, fuzzy
#| msgid "Relation snapshot" #| msgid "Relation snapshot"
msgid "Automation snapshot" msgid "Automation snapshot"
msgstr "製造オーダスナップショット" msgstr "製造オーダスナップショット"
#: assets/models/automations/base.py:94 assets/models/backup.py:88 #: assets/models/automations/base.py:95 assets/models/backup.py:88
#: assets/serializers/account/backup.py:36 #: assets/serializers/account/backup.py:36
#: xpack/plugins/change_auth_plan/models/base.py:121 #: xpack/plugins/change_auth_plan/models/base.py:121
#: xpack/plugins/change_auth_plan/serializers/base.py:78 #: xpack/plugins/change_auth_plan/serializers/base.py:78
msgid "Trigger mode" msgid "Trigger mode"
msgstr "トリガーモード" msgstr "トリガーモード"
#: assets/models/automations/base.py:98 #: assets/models/automations/base.py:99
#, fuzzy #, fuzzy
#| msgid "Command execution" #| msgid "Command execution"
msgid "Automation task execution" msgid "Automation task execution"
msgstr "コマンド実行" msgstr "コマンド実行"
#: assets/models/automations/change_secret.py:16 assets/models/base.py:62 #: assets/models/automations/change_secret.py:15 assets/models/base.py:62
#, fuzzy #, fuzzy
#| msgid "Secret key" #| msgid "Secret key"
msgid "Secret type" msgid "Secret type"
msgstr "秘密キー" msgstr "秘密キー"
#: assets/models/automations/change_secret.py:20 #: assets/models/automations/change_secret.py:19
#, fuzzy #, fuzzy
#| msgid "SSH Key strategy" #| msgid "SSH Key strategy"
msgid "Secret strategy" msgid "Secret strategy"
msgstr "SSHキー戦略" msgstr "SSHキー戦略"
#: assets/models/automations/change_secret.py:22 #: assets/models/automations/change_secret.py:21
#: assets/models/automations/change_secret.py:57 assets/models/base.py:64 #: assets/models/automations/change_secret.py:56 assets/models/base.py:64
#: assets/serializers/account/base.py:17 authentication/models.py:66 #: assets/serializers/account/base.py:17
#: authentication/models.py:246 #: authentication/models/connection_token.py:34
#: authentication/models/temp_token.py:10
#: authentication/templates/authentication/_access_key_modal.html:31 #: authentication/templates/authentication/_access_key_modal.html:31
#: settings/serializers/auth/radius.py:17 #: settings/serializers/auth/radius.py:17
msgid "Secret" msgid "Secret"
msgstr "ひみつ" msgstr "ひみつ"
#: assets/models/automations/change_secret.py:23 #: assets/models/automations/change_secret.py:22
#: xpack/plugins/change_auth_plan/models/base.py:39 #: xpack/plugins/change_auth_plan/models/base.py:39
msgid "Password rules" msgid "Password rules"
msgstr "パスワードルール" msgstr "パスワードルール"
#: assets/models/automations/change_secret.py:26 #: assets/models/automations/change_secret.py:25
#, fuzzy #, fuzzy
#| msgid "SSH Key strategy" #| msgid "SSH Key strategy"
msgid "SSH key change strategy" msgid "SSH key change strategy"
msgstr "SSHキー戦略" msgstr "SSHキー戦略"
#: assets/models/automations/change_secret.py:28 assets/models/backup.py:28 #: assets/models/automations/change_secret.py:27 assets/models/backup.py:28
#: assets/serializers/account/backup.py:28 #: assets/serializers/account/backup.py:28
#: xpack/plugins/change_auth_plan/models/app.py:40 #: xpack/plugins/change_auth_plan/models/app.py:40
#: xpack/plugins/change_auth_plan/models/asset.py:63 #: xpack/plugins/change_auth_plan/models/asset.py:63
@ -800,31 +807,31 @@ msgstr "SSHキー戦略"
msgid "Recipient" msgid "Recipient"
msgstr "受信者" msgstr "受信者"
#: assets/models/automations/change_secret.py:35 #: assets/models/automations/change_secret.py:34
#, fuzzy #, fuzzy
#| msgid "Change auth" #| msgid "Change auth"
msgid "Change secret automation" msgid "Change secret automation"
msgstr "秘密を改める" msgstr "秘密を改める"
#: assets/models/automations/change_secret.py:56 #: assets/models/automations/change_secret.py:55
#, fuzzy #, fuzzy
#| msgid "Secret" #| msgid "Secret"
msgid "Old secret" msgid "Old secret"
msgstr "ひみつ" msgstr "ひみつ"
#: assets/models/automations/change_secret.py:58 #: assets/models/automations/change_secret.py:57
#, fuzzy #, fuzzy
#| msgid "Date start" #| msgid "Date start"
msgid "Date started" msgid "Date started"
msgstr "開始日" msgstr "開始日"
#: assets/models/automations/change_secret.py:61 #: assets/models/automations/change_secret.py:60 common/const/choices.py:19
#, fuzzy #, fuzzy
#| msgid "WeCom Error" #| msgid "WeCom Error"
msgid "Error" msgid "Error"
msgstr "企業微信エラー" msgstr "企業微信エラー"
#: assets/models/automations/change_secret.py:64 #: assets/models/automations/change_secret.py:63
#, fuzzy #, fuzzy
#| msgid "Change auth" #| msgid "Change auth"
msgid "Change secret record" msgid "Change secret record"
@ -836,22 +843,28 @@ msgstr "秘密を改める"
msgid "Discovery account automation" msgid "Discovery account automation"
msgstr "パスワード/キーの確認" msgstr "パスワード/キーの確認"
#: assets/models/automations/gather_accounts.py:15
#, fuzzy
#| msgid "Gather assets users"
msgid "Gather asset accounts"
msgstr "資産ユーザーの収集"
#: assets/models/automations/gather_facts.py:15 #: assets/models/automations/gather_facts.py:15
#, fuzzy #, fuzzy
#| msgid "Gather assets users" #| msgid "Gather assets users"
msgid "Gather asset facts" msgid "Gather asset facts"
msgstr "資産ユーザーの収集" msgstr "資産ユーザーの収集"
#: assets/models/automations/push_account.py:8 #: assets/models/automations/push_account.py:16
#, fuzzy #, fuzzy
#| msgid "Automatic managed" #| msgid "Is service account"
msgid "Push automation" msgid "Push asset account"
msgstr "自動管理" msgstr "サービスアカウントです"
#: assets/models/automations/verify_secret.py:8 #: assets/models/automations/verify_account.py:15
#, fuzzy #, fuzzy
#| msgid "Verify auth" #| msgid "Verify auth"
msgid "Verify account automation" msgid "Verify asset account"
msgstr "パスワード/キーの確認" msgstr "パスワード/キーの確認"
#: assets/models/backup.py:38 assets/models/backup.py:96 #: assets/models/backup.py:38 assets/models/backup.py:96
@ -893,7 +906,7 @@ msgstr "アカウントバックアップの実行"
msgid "Connectivity" msgid "Connectivity"
msgstr "接続性" msgstr "接続性"
#: assets/models/base.py:32 authentication/models.py:248 #: assets/models/base.py:32 authentication/models/temp_token.py:12
msgid "Date verified" msgid "Date verified"
msgstr "確認済みの日付" msgstr "確認済みの日付"
@ -1352,7 +1365,6 @@ msgid "Category display"
msgstr "カテゴリ表示" msgstr "カテゴリ表示"
#: assets/serializers/mixin.py:10 audits/serializers.py:27 #: assets/serializers/mixin.py:10 audits/serializers.py:27
#: authentication/serializers/connection_token.py:20
#: tickets/serializers/flow.py:49 tickets/serializers/ticket/ticket.py:17 #: tickets/serializers/flow.py:49 tickets/serializers/ticket/ticket.py:17
msgid "Type display" msgid "Type display"
msgstr "タイプ表示" msgstr "タイプ表示"
@ -1527,7 +1539,7 @@ msgstr "操作"
msgid "Filename" msgid "Filename"
msgstr "ファイル名" msgstr "ファイル名"
#: audits/models.py:43 audits/models.py:117 #: audits/models.py:43 audits/models.py:117 common/const/choices.py:17
#: terminal/models/session/sharing.py:104 tickets/views/approve.py:114 #: terminal/models/session/sharing.py:104 tickets/views/approve.py:114
#: xpack/plugins/change_auth_plan/serializers/asset.py:189 #: xpack/plugins/change_auth_plan/serializers/asset.py:189
msgid "Success" msgid "Success"
@ -1607,8 +1619,8 @@ msgid "MFA"
msgstr "MFA" msgstr "MFA"
#: audits/models.py:128 ops/models/base.py:48 #: audits/models.py:128 ops/models/base.py:48
#: terminal/models/applet/applet.py:61 terminal/models/applet/host.py:15 #: terminal/models/applet/applet.py:57 terminal/models/applet/host.py:19
#: terminal/models/applet/host.py:27 terminal/models/component/status.py:33 #: terminal/models/applet/host.py:31 terminal/models/component/status.py:33
#: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171 #: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171
#: xpack/plugins/cloud/models.py:223 #: xpack/plugins/cloud/models.py:223
msgid "Status" msgid "Status"
@ -1672,7 +1684,7 @@ msgstr "本を飛ばす"
msgid "DingTalk" msgid "DingTalk"
msgstr "DingTalk" msgstr "DingTalk"
#: audits/signal_handlers.py:56 authentication/models.py:252 #: audits/signal_handlers.py:56 authentication/models/temp_token.py:16
msgid "Temporary token" msgid "Temporary token"
msgstr "仮パスワード" msgstr "仮パスワード"
@ -1825,7 +1837,7 @@ msgstr ""
msgid "Invalid token or cache refreshed." msgid "Invalid token or cache refreshed."
msgstr "無効なトークンまたはキャッシュの更新。" msgstr "無効なトークンまたはキャッシュの更新。"
#: authentication/backends/oauth2/backends.py:155 authentication/models.py:143 #: authentication/backends/oauth2/backends.py:155
msgid "User invalid, disabled or expired" msgid "User invalid, disabled or expired"
msgstr "ユーザーが無効、無効、または期限切れです" msgstr "ユーザーが無効、無効、または期限切れです"
@ -2088,91 +2100,76 @@ msgstr "MFAタイプ ({}) が有効になっていない"
msgid "Please change your password" msgid "Please change your password"
msgstr "パスワードを変更してください" msgstr "パスワードを変更してください"
#: authentication/models.py:45 #: authentication/models/connection_token.py:31
msgid "Private Token" #: rbac/serializers/rolebinding.py:21
msgstr "プライベートトークン" msgid "User display"
msgstr "ユーザー表示"
#: authentication/models.py:54 #: authentication/models/connection_token.py:32
msgid "Expired" msgid "Asset display"
msgstr "期限切れ" msgstr "アセット名"
#: authentication/models.py:58 #: authentication/models/connection_token.py:36
msgid "SSO token" #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:79
msgstr "SSO token"
#: authentication/models.py:68 authentication/models.py:249
#: perms/models/asset_permission.py:79
#: tickets/models/ticket/apply_application.py:29 #: tickets/models/ticket/apply_application.py:29
#: tickets/models/ticket/apply_asset.py:22 users/models/user.py:707 #: tickets/models/ticket/apply_asset.py:22 users/models/user.py:707
msgid "Date expired" msgid "Date expired"
msgstr "期限切れの日付" msgstr "期限切れの日付"
#: authentication/models.py:75 rbac/serializers/rolebinding.py:21 #: authentication/models/connection_token.py:41
msgid "User display"
msgstr "ユーザー表示"
#: authentication/models.py:80
msgid "Asset display"
msgstr "アセット名"
#: authentication/models.py:85
#, fuzzy
#| msgid "Action display"
msgid "Account display"
msgstr "アクション表示"
#: authentication/models.py:89
msgid "Connection token" msgid "Connection token"
msgstr "接続トークン" msgstr "接続トークン"
#: authentication/models.py:91 #: authentication/models/connection_token.py:43
msgid "Can view connection token secret" msgid "Can view connection token secret"
msgstr "接続トークンの秘密を表示できます" msgstr "接続トークンの秘密を表示できます"
#: authentication/models.py:134 #: authentication/models/connection_token.py:82
msgid "Connection token expired at: {}" msgid "Connection token expired at: {}"
msgstr "接続トークンの有効期限: {}" msgstr "接続トークンの有効期限: {}"
#: authentication/models.py:139 #: authentication/models/connection_token.py:86
msgid "User not exists" msgid "No user or invalid user"
msgstr "ユーザーは存在しません" msgstr ""
#: authentication/models.py:148 #: authentication/models/connection_token.py:90
msgid "System user not exists" #, fuzzy
msgstr "システムユーザーが存在しません" #| msgid "Asset inactive"
msgid "No asset or inactive asset"
#: authentication/models.py:154
msgid "Asset not exists"
msgstr "アセットが存在しません"
#: authentication/models.py:158
msgid "Asset inactive"
msgstr "アセットがアクティブ化されていません" msgstr "アセットがアクティブ化されていません"
#: authentication/models.py:165 #: authentication/models/connection_token.py:94
#, fuzzy
#| msgid "Login acl"
msgid "No account"
msgstr "ログインacl"
#: authentication/models/connection_token.py:103
msgid "User has no permission to access asset or permission expired" msgid "User has no permission to access asset or permission expired"
msgstr "" msgstr ""
"ユーザーがアセットにアクセスする権限を持っていないか、権限の有効期限が切れて" "ユーザーがアセットにアクセスする権限を持っていないか、権限の有効期限が切れて"
"います" "います"
#: authentication/models.py:173 #: authentication/models/connection_token.py:145
msgid "Application not exists"
msgstr "アプリが存在しません"
#: authentication/models.py:180
msgid "User has no permission to access application or permission expired"
msgstr ""
"ユーザーがアプリにアクセスする権限を持っていないか、権限の有効期限が切れてい"
"ます"
#: authentication/models.py:247
msgid "Verified"
msgstr "確認済み"
#: authentication/models.py:268
msgid "Super connection token" msgid "Super connection token"
msgstr "スーパー接続トークン" msgstr "スーパー接続トークン"
#: authentication/models/private_token.py:9
msgid "Private Token"
msgstr "プライベートトークン"
#: authentication/models/sso_token.py:14
msgid "Expired"
msgstr "期限切れ"
#: authentication/models/sso_token.py:18
msgid "SSO token"
msgstr "SSO token"
#: authentication/models/temp_token.py:11
msgid "Verified"
msgstr "確認済み"
#: authentication/notifications.py:19 #: authentication/notifications.py:19
msgid "Different city login reminder" msgid "Different city login reminder"
msgstr "異なる都市ログインのリマインダー" msgstr "異なる都市ログインのリマインダー"
@ -2181,19 +2178,15 @@ msgstr "異なる都市ログインのリマインダー"
msgid "binding reminder" msgid "binding reminder"
msgstr "バインディングリマインダー" msgstr "バインディングリマインダー"
#: authentication/serializers/connection_token.py:21 #: authentication/serializers/connection_token.py:20
#: xpack/plugins/cloud/models.py:36 #: xpack/plugins/cloud/models.py:36
msgid "Validity" msgid "Validity"
msgstr "有効性" msgstr "有効性"
#: authentication/serializers/connection_token.py:22 #: authentication/serializers/connection_token.py:21
msgid "Expired time" msgid "Expired time"
msgstr "期限切れ時間" msgstr "期限切れ時間"
#: authentication/serializers/connection_token.py:68
msgid "Asset or application required"
msgstr "アセットまたはアプリが必要"
#: authentication/serializers/token.py:79 perms/serializers/permission.py:60 #: authentication/serializers/token.py:79 perms/serializers/permission.py:60
#: perms/serializers/permission.py:87 users/serializers/user.py:148 #: perms/serializers/permission.py:87 users/serializers/user.py:148
msgid "Is valid" msgid "Is valid"
@ -2282,7 +2275,7 @@ msgstr "コードエラー"
#: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3
#: authentication/templates/authentication/_msg_rest_password_success.html:2 #: authentication/templates/authentication/_msg_rest_password_success.html:2
#: authentication/templates/authentication/_msg_rest_public_key_success.html:2 #: authentication/templates/authentication/_msg_rest_public_key_success.html:2
#: jumpserver/conf.py:390 ops/tasks.py:146 ops/tasks.py:152 ops/tasks.py:155 #: jumpserver/conf.py:390 ops/tasks.py:147 ops/tasks.py:153 ops/tasks.py:156
#: perms/templates/perms/_msg_item_permissions_expire.html:3 #: perms/templates/perms/_msg_item_permissions_expire.html:3
#: perms/templates/perms/_msg_permed_items_expire.html:3 #: perms/templates/perms/_msg_permed_items_expire.html:3
#: tickets/templates/tickets/approve_check_password.html:33 #: tickets/templates/tickets/approve_check_password.html:33
@ -2583,6 +2576,20 @@ msgstr "手動トリガー"
msgid "Timing trigger" msgid "Timing trigger"
msgstr "タイミングトリガー" msgstr "タイミングトリガー"
#: common/const/choices.py:15 tickets/const.py:29 tickets/const.py:37
msgid "Pending"
msgstr "未定"
#: common/const/choices.py:16
msgid "Running"
msgstr ""
#: common/const/choices.py:20
#, fuzzy
#| msgid "Cancel"
msgid "Canceled"
msgstr "キャンセル"
#: common/db/encoder.py:11 #: common/db/encoder.py:11
msgid "ugettext_lazy" msgid "ugettext_lazy"
msgstr "ugettext_lazy" msgstr "ugettext_lazy"
@ -2841,17 +2848,17 @@ msgstr "サイトメッセージ"
msgid "No account available" msgid "No account available"
msgstr "利用できないアカウント" msgstr "利用できないアカウント"
#: ops/ansible/inventory.py:173 #: ops/ansible/inventory.py:175
#, fuzzy #, fuzzy
#| msgid "User disabled." #| msgid "User disabled."
msgid "Ansible disabled" msgid "Ansible disabled"
msgstr "ユーザーが無効になりました。" msgstr "ユーザーが無効になりました。"
#: ops/ansible/inventory.py:189 #: ops/ansible/inventory.py:191
msgid "Skip hosts below:" msgid "Skip hosts below:"
msgstr "" msgstr ""
#: ops/api/celery.py:61 ops/api/celery.py:76 #: ops/api/celery.py:63 ops/api/celery.py:78
msgid "Waiting task start" msgid "Waiting task start"
msgstr "タスク開始待ち" msgstr "タスク開始待ち"
@ -2916,7 +2923,7 @@ msgstr "パターン"
msgid "Module" msgid "Module"
msgstr "" msgstr ""
#: ops/models/adhoc.py:20 ops/models/celery.py:15 #: ops/models/adhoc.py:20 ops/models/celery.py:45
#: terminal/models/component/task.py:17 #: terminal/models/component/task.py:17
msgid "Args" msgid "Args"
msgstr "アルグ" msgstr "アルグ"
@ -2960,16 +2967,16 @@ msgstr "結果"
msgid "Summary" msgid "Summary"
msgstr "" msgstr ""
#: ops/models/celery.py:16 terminal/models/component/task.py:18 #: ops/models/celery.py:46 terminal/models/component/task.py:18
msgid "Kwargs" msgid "Kwargs"
msgstr "クワーグ" msgstr "クワーグ"
#: ops/models/celery.py:17 tickets/models/comment.py:13 #: ops/models/celery.py:47 tickets/models/comment.py:13
#: tickets/models/ticket/general.py:41 tickets/models/ticket/general.py:277 #: tickets/models/ticket/general.py:41 tickets/models/ticket/general.py:277
msgid "State" msgid "State"
msgstr "状態" msgstr "状態"
#: ops/models/celery.py:18 terminal/models/session/sharing.py:111 #: ops/models/celery.py:48 terminal/models/session/sharing.py:111
#: tickets/const.py:25 xpack/plugins/change_auth_plan/models/base.py:188 #: tickets/const.py:25 xpack/plugins/change_auth_plan/models/base.py:188
msgid "Finished" msgid "Finished"
msgstr "終了" msgstr "終了"
@ -2994,7 +3001,8 @@ msgstr ""
msgid "Template" msgid "Template"
msgstr "テンプレート" msgstr "テンプレート"
#: ops/models/playbook.py:38 terminal/models/component/task.py:26 #: ops/models/playbook.py:38 ops/signal_handlers.py:63
#: terminal/models/component/task.py:26
#: xpack/plugins/gathered_user/models.py:68 #: xpack/plugins/gathered_user/models.py:68
msgid "Task" msgid "Task"
msgstr "タスク" msgstr "タスク"
@ -3033,23 +3041,23 @@ msgstr "{max_threshold}%: => {value} を超える使用メモリ"
msgid "CPU load more than {max_threshold}: => {value}" msgid "CPU load more than {max_threshold}: => {value}"
msgstr "{max_threshold} を超えるCPUロード: => {value}" msgstr "{max_threshold} を超えるCPUロード: => {value}"
#: ops/tasks.py:33 #: ops/tasks.py:34
#, fuzzy #, fuzzy
#| msgid "Run asset" #| msgid "Run asset"
msgid "Run ansible task" msgid "Run ansible task"
msgstr "アセットの実行" msgstr "アセットの実行"
#: ops/tasks.py:57 #: ops/tasks.py:58
#, fuzzy #, fuzzy
#| msgid "Run command" #| msgid "Run command"
msgid "Run ansible command" msgid "Run ansible command"
msgstr "実行コマンド" msgstr "実行コマンド"
#: ops/tasks.py:79 #: ops/tasks.py:80
msgid "Clean task history period" msgid "Clean task history period"
msgstr "クリーンなタスク履歴期間" msgstr "クリーンなタスク履歴期間"
#: ops/tasks.py:92 #: ops/tasks.py:93
msgid "Clean celery log period" msgid "Clean celery log period"
msgstr "きれいなセロリログ期間" msgstr "きれいなセロリログ期間"
@ -3080,7 +3088,7 @@ msgstr "組織のリソース ({}) は削除できません"
msgid "App organizations" msgid "App organizations"
msgstr "アプリ組織" msgstr "アプリ組織"
#: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:87 #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:88
#: rbac/const.py:7 rbac/models/rolebinding.py:48 #: rbac/const.py:7 rbac/models/rolebinding.py:48
#: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:62 #: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:62
#: tickets/models/ticket/general.py:300 tickets/serializers/ticket/ticket.py:71 #: tickets/models/ticket/general.py:300 tickets/serializers/ticket/ticket.py:71
@ -3091,23 +3099,29 @@ msgstr "組織"
msgid "Org name" msgid "Org name"
msgstr "組織名" msgstr "組織名"
#: orgs/models.py:79 #: orgs/models.py:72
#, fuzzy
#| msgid "Built-in"
msgid "Builtin"
msgstr "内蔵"
#: orgs/models.py:80
msgid "GLOBAL" msgid "GLOBAL"
msgstr "グローバル組織" msgstr "グローバル組織"
#: orgs/models.py:81 #: orgs/models.py:82
msgid "DEFAULT" msgid "DEFAULT"
msgstr "" msgstr ""
#: orgs/models.py:83 #: orgs/models.py:84
msgid "SYSTEM" msgid "SYSTEM"
msgstr "" msgstr ""
#: orgs/models.py:89 #: orgs/models.py:90
msgid "Can view root org" msgid "Can view root org"
msgstr "グローバル組織を表示できます" msgstr "グローバル組織を表示できます"
#: orgs/models.py:90 #: orgs/models.py:91
msgid "Can view all joined org" msgid "Can view all joined org"
msgstr "参加しているすべての組織を表示できます" msgstr "参加しているすべての組織を表示できます"
@ -3385,7 +3399,7 @@ msgstr "パーマ"
msgid "Scope display" msgid "Scope display"
msgstr "スコープ表示" msgstr "スコープ表示"
#: rbac/serializers/role.py:27 terminal/models/applet/applet.py:26 #: rbac/serializers/role.py:27 terminal/models/applet/applet.py:21
msgid "Display name" msgid "Display name"
msgstr "表示名" msgstr "表示名"
@ -3433,6 +3447,10 @@ msgstr "クラウドインポート"
msgid "Backup account" msgid "Backup account"
msgstr "バックアップアカウント" msgstr "バックアップアカウント"
#: rbac/tree.py:53
msgid "Gather account"
msgstr "アカウントを集める"
#: rbac/tree.py:54 #: rbac/tree.py:54
msgid "App change auth" msgid "App change auth"
msgstr "応用改密" msgstr "応用改密"
@ -4900,51 +4918,55 @@ msgstr "一括作成非サポート"
msgid "Storage is invalid" msgid "Storage is invalid"
msgstr "ストレージが無効です" msgstr "ストレージが無効です"
#: terminal/models/applet/applet.py:21
#, fuzzy
#| msgid "Manually input"
msgid "Manual"
msgstr "手動入力"
#: terminal/models/applet/applet.py:22
msgid "Git"
msgstr ""
#: terminal/models/applet/applet.py:23 #: terminal/models/applet/applet.py:23
#, fuzzy #, fuzzy
#| msgid "Remote app"
msgid "Remote gzip"
msgstr "リモートアプリ"
#: terminal/models/applet/applet.py:28
#, fuzzy
#| msgid "Auth url" #| msgid "Auth url"
msgid "Author" msgid "Author"
msgstr "認証アドレス" msgstr "認証アドレス"
#: terminal/models/applet/applet.py:32 #: terminal/models/applet/applet.py:27
msgid "Tags" msgid "Tags"
msgstr "" msgstr ""
#: terminal/models/applet/applet.py:59 terminal/models/applet/host.py:17 #: terminal/models/applet/applet.py:29 terminal/serializers/storage.py:157
msgid "Hosts"
msgstr "ホスト"
#: terminal/models/applet/applet.py:55 terminal/models/applet/host.py:21
#, fuzzy #, fuzzy
#| msgid "Apply assets" #| msgid "Apply assets"
msgid "Applet" msgid "Applet"
msgstr "資産の適用" msgstr "資産の適用"
#: terminal/models/applet/host.py:13 #: terminal/models/applet/host.py:14
#, fuzzy #, fuzzy
#| msgid "Verify auth" #| msgid "Verify auth"
msgid "Account automation" msgid "Account automation"
msgstr "パスワード/キーの確認" msgstr "パスワード/キーの確認"
#: terminal/models/applet/host.py:14 #: terminal/models/applet/host.py:15 terminal/serializers/applet.py:66
#, fuzzy
#| msgid "More login options"
msgid "Deploy options"
msgstr "その他のログインオプション"
#: terminal/models/applet/host.py:16
msgid "Inited"
msgstr ""
#: terminal/models/applet/host.py:17
#, fuzzy
#| msgid "Date finished"
msgid "Date inited"
msgstr "終了日"
#: terminal/models/applet/host.py:18
#, fuzzy #, fuzzy
#| msgid "Date sync" #| msgid "Date sync"
msgid "Date synced" msgid "Date synced"
msgstr "日付の同期" msgstr "日付の同期"
#: terminal/models/applet/host.py:26 #: terminal/models/applet/host.py:30
#, fuzzy #, fuzzy
#| msgid "Host" #| msgid "Host"
msgid "Hosting" msgid "Hosting"
@ -5178,6 +5200,48 @@ msgstr "一括危険コマンド警告"
msgid "Icon" msgid "Icon"
msgstr "" msgstr ""
#: terminal/serializers/applet.py:53
#, fuzzy
#| msgid "Phone not set"
msgid "Not set"
msgstr "電話が設定されていない"
#: terminal/serializers/applet.py:54
#, fuzzy
#| msgid "Session"
msgid "Per Session"
msgstr "セッション"
#: terminal/serializers/applet.py:55
msgid "Per Device"
msgstr ""
#: terminal/serializers/applet.py:57
#, fuzzy
#| msgid "License"
msgid "RDS Licensing"
msgstr "ライセンス"
#: terminal/serializers/applet.py:58
msgid "RDS License Server"
msgstr ""
#: terminal/serializers/applet.py:59
msgid "RDS Licensing Mode"
msgstr ""
#: terminal/serializers/applet.py:60
msgid "RDS fSingleSessionPerUser"
msgstr ""
#: terminal/serializers/applet.py:61
msgid "RDS Max Disconnection Time"
msgstr ""
#: terminal/serializers/applet.py:62
msgid "RDS Remote App Logoff Time Limit"
msgstr ""
#: terminal/serializers/endpoint.py:12 #: terminal/serializers/endpoint.py:12
msgid "Oracle port" msgid "Oracle port"
msgstr "" msgstr ""
@ -5279,10 +5343,6 @@ msgstr "ホスト無効"
msgid "Port invalid" msgid "Port invalid"
msgstr "ポートが無効" msgstr "ポートが無効"
#: terminal/serializers/storage.py:157
msgid "Hosts"
msgstr "ホスト"
#: terminal/serializers/storage.py:160 #: terminal/serializers/storage.py:160
msgid "Index by date" msgid "Index by date"
msgstr "日付による索引付け" msgstr "日付による索引付け"
@ -5339,10 +5399,6 @@ msgstr "拒否"
msgid "Reopen" msgid "Reopen"
msgstr "" msgstr ""
#: tickets/const.py:29 tickets/const.py:37
msgid "Pending"
msgstr "未定"
#: tickets/const.py:32 tickets/const.py:39 #: tickets/const.py:32 tickets/const.py:39
msgid "Closed" msgid "Closed"
msgstr "クローズ" msgstr "クローズ"
@ -6963,6 +7019,51 @@ msgstr "究極のエディション"
msgid "Community edition" msgid "Community edition"
msgstr "コミュニティ版" msgstr "コミュニティ版"
#, fuzzy
#~| msgid "Automatic managed"
#~ msgid "Push automation"
#~ msgstr "自動管理"
#, fuzzy
#~| msgid "Verify auth"
#~ msgid "Verify account automation"
#~ msgstr "パスワード/キーの確認"
#, fuzzy
#~| msgid "Action display"
#~ msgid "Account display"
#~ msgstr "アクション表示"
#~ msgid "User not exists"
#~ msgstr "ユーザーは存在しません"
#~ msgid "System user not exists"
#~ msgstr "システムユーザーが存在しません"
#~ msgid "Asset not exists"
#~ msgstr "アセットが存在しません"
#~ msgid "Application not exists"
#~ msgstr "アプリが存在しません"
#~ msgid "User has no permission to access application or permission expired"
#~ msgstr ""
#~ "ユーザーがアプリにアクセスする権限を持っていないか、権限の有効期限が切れて"
#~ "います"
#~ msgid "Asset or application required"
#~ msgstr "アセットまたはアプリが必要"
#, fuzzy
#~| msgid "Manually input"
#~ msgid "Manual"
#~ msgstr "手動入力"
#, fuzzy
#~| msgid "Remote app"
#~ msgid "Remote gzip"
#~ msgstr "リモートアプリ"
#, fuzzy #, fuzzy
#~| msgid "Verify code" #~| msgid "Verify code"
#~ msgid "Verify secret" #~ msgid "Verify secret"
@ -6973,11 +7074,6 @@ msgstr "コミュニティ版"
#~ msgid "Secret types" #~ msgid "Secret types"
#~ msgstr "秘密キー" #~ msgstr "秘密キー"
#, fuzzy
#~| msgid "Gather account"
#~ msgid "Gather accounts"
#~ msgstr "アカウントを集める"
#, fuzzy #, fuzzy
#~| msgid "Hostname strategy" #~| msgid "Hostname strategy"
#~ msgid "Automation strategy" #~ msgid "Automation strategy"

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:97b2aa050b5846dd3399d45286d34f282acb55dca3e2b18a79c16b9d34ec938f oid sha256:08529907ac3879f60c2026f91e7ba3f48a3a7d288f7b29cd35c0f73bc3999c21
size 103818 size 103630

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-26 16:41+0800\n" "POT-Creation-Date: 2022-11-01 15:30+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -31,7 +31,7 @@ msgstr "访问控制"
#: assets/serializers/platform.py:104 ops/mixin.py:20 ops/models/playbook.py:9 #: assets/serializers/platform.py:104 ops/mixin.py:20 ops/models/playbook.py:9
#: orgs/models.py:70 perms/models/asset_permission.py:56 rbac/models/role.py:29 #: orgs/models.py:70 perms/models/asset_permission.py:56 rbac/models/role.py:29
#: settings/models.py:33 settings/serializers/sms.py:6 #: settings/models.py:33 settings/serializers/sms.py:6
#: terminal/models/applet/applet.py:25 terminal/models/component/endpoint.py:11 #: terminal/models/applet/applet.py:20 terminal/models/component/endpoint.py:11
#: terminal/models/component/endpoint.py:87 #: terminal/models/component/endpoint.py:87
#: terminal/models/component/storage.py:25 terminal/models/component/task.py:16 #: terminal/models/component/storage.py:25 terminal/models/component/task.py:16
#: terminal/models/component/terminal.py:100 users/forms/profile.py:33 #: terminal/models/component/terminal.py:100 users/forms/profile.py:33
@ -50,7 +50,7 @@ msgstr "优先级"
msgid "1-100, the lower the value will be match first" msgid "1-100, the lower the value will be match first"
msgstr "优先级可选范围为 1-100 (数值越小越优先)" msgstr "优先级可选范围为 1-100 (数值越小越优先)"
#: acls/models/base.py:31 authentication/models.py:22 #: acls/models/base.py:31 authentication/models/access_key.py:15
#: authentication/templates/authentication/_access_key_modal.html:32 #: authentication/templates/authentication/_access_key_modal.html:32
#: perms/models/asset_permission.py:74 terminal/models/session/sharing.py:28 #: perms/models/asset_permission.py:74 terminal/models/session/sharing.py:28
#: tickets/const.py:38 #: tickets/const.py:38
@ -58,17 +58,17 @@ msgid "Active"
msgstr "激活中" msgstr "激活中"
#: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40 #: acls/models/base.py:32 applications/models.py:19 assets/models/_user.py:40
#: assets/models/asset/common.py:100 assets/models/automations/base.py:25 #: assets/models/asset/common.py:100 assets/models/automations/base.py:26
#: assets/models/backup.py:30 assets/models/base.py:66 #: assets/models/backup.py:30 assets/models/base.py:66
#: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88 #: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88
#: assets/models/domain.py:25 assets/models/domain.py:69 #: assets/models/domain.py:25 assets/models/domain.py:69
#: assets/models/group.py:23 assets/models/label.py:22 #: assets/models/group.py:23 assets/models/label.py:22
#: assets/models/platform.py:73 ops/models/playbook.py:11 #: assets/models/platform.py:73 ops/models/playbook.py:11
#: ops/models/playbook.py:25 orgs/models.py:73 #: ops/models/playbook.py:25 orgs/models.py:74
#: perms/models/asset_permission.py:84 rbac/models/role.py:37 #: perms/models/asset_permission.py:84 rbac/models/role.py:37
#: settings/models.py:38 terminal/models/applet/applet.py:33 #: settings/models.py:38 terminal/models/applet/applet.py:28
#: terminal/models/applet/applet.py:62 terminal/models/applet/host.py:12 #: terminal/models/applet/applet.py:58 terminal/models/applet/host.py:34
#: terminal/models/applet/host.py:28 terminal/models/component/endpoint.py:24 #: terminal/models/component/endpoint.py:24
#: terminal/models/component/endpoint.py:97 #: terminal/models/component/endpoint.py:97
#: terminal/models/component/storage.py:28 #: terminal/models/component/storage.py:28
#: terminal/models/component/terminal.py:114 tickets/models/comment.py:32 #: terminal/models/component/terminal.py:114 tickets/models/comment.py:32
@ -95,8 +95,9 @@ msgstr "登录复核"
#: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20 #: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20
#: assets/models/cmd_filter.py:28 assets/models/label.py:15 audits/models.py:37 #: assets/models/cmd_filter.py:28 assets/models/label.py:15 audits/models.py:37
#: audits/models.py:62 audits/models.py:87 authentication/models.py:55 #: audits/models.py:62 audits/models.py:87
#: authentication/models.py:72 perms/models/asset_permission.py:58 #: authentication/models/connection_token.py:22
#: authentication/models/sso_token.py:15 perms/models/asset_permission.py:58
#: rbac/builtin.py:120 rbac/models/rolebinding.py:41 #: rbac/builtin.py:120 rbac/models/rolebinding.py:41
#: terminal/backends/command/models.py:20 #: terminal/backends/command/models.py:20
#: terminal/backends/command/serializers.py:13 #: terminal/backends/command/serializers.py:13
@ -128,7 +129,7 @@ msgid "Login acl"
msgstr "登录访问控制" msgstr "登录访问控制"
#: acls/models/login_asset_acl.py:21 assets/models/account.py:57 #: acls/models/login_asset_acl.py:21 assets/models/account.py:57
#: authentication/models.py:82 ops/models/base.py:18 #: authentication/models/connection_token.py:33 ops/models/base.py:18
#: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87 #: terminal/models/session/session.py:34 xpack/plugins/cloud/models.py:87
#: xpack/plugins/cloud/serializers/task.py:65 #: xpack/plugins/cloud/serializers/task.py:65
msgid "Account" msgid "Account"
@ -138,7 +139,7 @@ msgstr "账号"
#: assets/models/asset/common.py:83 assets/models/asset/common.py:227 #: assets/models/asset/common.py:83 assets/models/asset/common.py:227
#: assets/models/cmd_filter.py:36 assets/models/gathered_user.py:14 #: assets/models/cmd_filter.py:36 assets/models/gathered_user.py:14
#: assets/serializers/account/account.py:58 assets/serializers/label.py:30 #: assets/serializers/account/account.py:58 assets/serializers/label.py:30
#: audits/models.py:39 authentication/models.py:77 #: audits/models.py:39 authentication/models/connection_token.py:26
#: perms/models/asset_permission.py:64 terminal/backends/command/models.py:21 #: perms/models/asset_permission.py:64 terminal/backends/command/models.py:21
#: terminal/backends/command/serializers.py:14 #: terminal/backends/command/serializers.py:14
#: terminal/models/session/session.py:32 terminal/notifications.py:90 #: terminal/models/session/session.py:32 terminal/notifications.py:90
@ -164,7 +165,7 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. "
#: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34 #: acls/serializers/login_asset_acl.py:52 assets/models/_user.py:34
#: assets/models/base.py:60 assets/models/gathered_user.py:15 #: assets/models/base.py:60 assets/models/gathered_user.py:15
#: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27 #: audits/models.py:121 authentication/forms.py:25 authentication/forms.py:27
#: authentication/models.py:245 #: authentication/models/temp_token.py:9
#: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_different_city.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9
#: users/forms/profile.py:32 users/models/user.py:663 #: users/forms/profile.py:32 users/models/user.py:663
@ -245,9 +246,9 @@ msgid "Category"
msgstr "类别" msgstr "类别"
#: applications/models.py:15 assets/models/_user.py:46 #: applications/models.py:15 assets/models/_user.py:46
#: assets/models/automations/base.py:23 assets/models/cmd_filter.py:74 #: assets/models/automations/base.py:24 assets/models/cmd_filter.py:74
#: assets/models/platform.py:70 assets/serializers/asset/common.py:63 #: assets/models/platform.py:70 assets/serializers/asset/common.py:63
#: assets/serializers/platform.py:75 terminal/models/applet/applet.py:29 #: assets/serializers/platform.py:75 terminal/models/applet/applet.py:24
#: terminal/models/component/storage.py:57 #: terminal/models/component/storage.py:57
#: terminal/models/component/storage.py:142 terminal/serializers/applet.py:20 #: terminal/models/component/storage.py:142 terminal/serializers/applet.py:20
#: tickets/models/comment.py:26 tickets/models/flow.py:57 #: tickets/models/comment.py:26 tickets/models/flow.py:57
@ -291,7 +292,7 @@ msgstr "删除失败,节点包含资产"
msgid "App assets" msgid "App assets"
msgstr "资产管理" msgstr "资产管理"
#: assets/automations/base/manager.py:74 #: assets/automations/base/manager.py:122
msgid "{} disabled" msgid "{} disabled"
msgstr "{} 已禁用" msgstr "{} 已禁用"
@ -305,7 +306,7 @@ msgstr "未知"
msgid "Ok" msgid "Ok"
msgstr "成功" msgstr "成功"
#: assets/const/account.py:8 audits/models.py:118 #: assets/const/account.py:8 audits/models.py:118 common/const/choices.py:18
#: xpack/plugins/change_auth_plan/serializers/asset.py:190 #: xpack/plugins/change_auth_plan/serializers/asset.py:190
#: xpack/plugins/cloud/const.py:33 #: xpack/plugins/cloud/const.py:33
msgid "Failed" msgid "Failed"
@ -334,12 +335,12 @@ msgid "SSH key"
msgstr "SSH 密钥" msgstr "SSH 密钥"
#: assets/const/account.py:14 assets/models/base.py:55 #: assets/const/account.py:14 assets/models/base.py:55
#: authentication/models.py:38 #: authentication/models/access_key.py:31
msgid "Access key" msgid "Access key"
msgstr "Access key" msgstr "Access key"
#: assets/const/account.py:15 assets/models/_user.py:38 #: assets/const/account.py:15 assets/models/_user.py:38
#: assets/models/base.py:56 authentication/models.py:53 #: assets/models/base.py:56 authentication/models/sso_token.py:13
msgid "Token" msgid "Token"
msgstr "Token" msgstr "Token"
@ -363,8 +364,8 @@ msgstr "改密"
msgid "Verify account" msgid "Verify account"
msgstr "验证密钥" msgstr "验证密钥"
#: assets/const/automation.py:18 rbac/tree.py:53 #: assets/const/automation.py:18
msgid "Gather account" msgid "Gather accounts"
msgstr "收集账号" msgstr "收集账号"
#: assets/const/automation.py:22 #: assets/const/automation.py:22
@ -397,8 +398,8 @@ msgid "Replace (The key generated by JumpServer) "
msgstr "替换 (由 JumpServer 生成的密钥)" msgstr "替换 (由 JumpServer 生成的密钥)"
#: assets/const/category.py:11 settings/serializers/auth/radius.py:14 #: assets/const/category.py:11 settings/serializers/auth/radius.py:14
#: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:60 #: settings/serializers/auth/sms.py:56 terminal/models/applet/applet.py:56
#: terminal/models/applet/host.py:11 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:12
#: xpack/plugins/cloud/serializers/account_attrs.py:72 #: xpack/plugins/cloud/serializers/account_attrs.py:72
msgid "Host" msgid "Host"
msgstr "主机" msgstr "主机"
@ -473,11 +474,11 @@ msgstr "SSH 密钥"
msgid "SSH public key" msgid "SSH public key"
msgstr "SSH 公钥" msgstr "SSH 公钥"
#: assets/models/_user.py:41 assets/models/automations/base.py:86 #: assets/models/_user.py:41 assets/models/automations/base.py:87
#: assets/models/base.py:67 assets/models/domain.py:26 #: assets/models/base.py:67 assets/models/domain.py:26
#: assets/models/gathered_user.py:19 assets/models/group.py:22 #: assets/models/gathered_user.py:19 assets/models/group.py:22
#: common/db/models.py:76 common/mixins/models.py:50 ops/models/base.py:53 #: common/db/models.py:76 common/mixins/models.py:50 ops/models/base.py:53
#: orgs/models.py:72 perms/models/asset_permission.py:82 #: orgs/models.py:73 perms/models/asset_permission.py:82
#: users/models/group.py:18 users/models/user.py:927 #: users/models/group.py:18 users/models/user.py:927
msgid "Date created" msgid "Date created"
msgstr "创建日期" msgstr "创建日期"
@ -502,7 +503,8 @@ msgid "Username same with user"
msgstr "用户名与用户相同" msgstr "用户名与用户相同"
#: assets/models/_user.py:48 assets/models/domain.py:67 #: assets/models/_user.py:48 assets/models/domain.py:67
#: terminal/models/applet/applet.py:31 terminal/serializers/session.py:18 #: authentication/models/connection_token.py:29
#: terminal/models/applet/applet.py:26 terminal/serializers/session.py:18
#: terminal/serializers/session.py:32 terminal/serializers/storage.py:68 #: terminal/serializers/session.py:32 terminal/serializers/storage.py:68
msgid "Protocol" msgid "Protocol"
msgstr "协议" msgstr "协议"
@ -560,7 +562,7 @@ msgid "Su from"
msgstr "切换自" msgstr "切换自"
#: assets/models/account.py:53 settings/serializers/auth/cas.py:18 #: assets/models/account.py:53 settings/serializers/auth/cas.py:18
#: terminal/models/applet/applet.py:27 #: terminal/models/applet/applet.py:22
msgid "Version" msgid "Version"
msgstr "版本" msgstr "版本"
@ -603,16 +605,16 @@ msgstr "资产平台"
msgid "Domain" msgid "Domain"
msgstr "网域" msgstr "网域"
#: assets/models/asset/common.py:97 assets/models/automations/base.py:18 #: assets/models/asset/common.py:97 assets/models/automations/base.py:19
#: assets/serializers/asset/common.py:66 perms/models/asset_permission.py:67 #: assets/serializers/asset/common.py:66 perms/models/asset_permission.py:67
#: xpack/plugins/change_auth_plan/models/asset.py:44 #: xpack/plugins/change_auth_plan/models/asset.py:44
#: xpack/plugins/gathered_user/models.py:24 #: xpack/plugins/gathered_user/models.py:24
msgid "Nodes" msgid "Nodes"
msgstr "节点" msgstr "节点"
#: assets/models/asset/common.py:98 assets/models/automations/base.py:24 #: assets/models/asset/common.py:98 assets/models/automations/base.py:25
#: assets/models/cmd_filter.py:39 assets/models/domain.py:70 #: assets/models/cmd_filter.py:39 assets/models/domain.py:70
#: assets/models/label.py:21 terminal/models/applet/applet.py:30 #: assets/models/label.py:21 terminal/models/applet/applet.py:25
#: users/serializers/user.py:147 #: users/serializers/user.py:147
msgid "Is active" msgid "Is active"
msgstr "激活" msgstr "激活"
@ -673,26 +675,27 @@ msgstr "密码选择器"
msgid "Submit selector" msgid "Submit selector"
msgstr "提交按钮选择器" msgstr "提交按钮选择器"
#: assets/models/automations/base.py:16 assets/models/cmd_filter.py:38 #: assets/models/automations/base.py:17 assets/models/cmd_filter.py:38
#: assets/serializers/asset/common.py:68 perms/models/asset_permission.py:70 #: assets/serializers/asset/common.py:68 perms/models/asset_permission.py:70
#: rbac/tree.py:37 #: rbac/tree.py:37
msgid "Accounts" msgid "Accounts"
msgstr "账号管理" msgstr "账号管理"
#: assets/models/automations/base.py:21 assets/serializers/domain.py:29 #: assets/models/automations/base.py:22 assets/serializers/domain.py:29
#: ops/models/base.py:17 #: ops/models/base.py:17
#: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/change_auth_plan/models/asset.py:40 #: xpack/plugins/change_auth_plan/models/asset.py:40
msgid "Assets" msgid "Assets"
msgstr "资产" msgstr "资产"
#: assets/models/automations/base.py:76 assets/models/automations/base.py:83 #: assets/models/automations/base.py:77 assets/models/automations/base.py:84
msgid "Automation task" msgid "Automation task"
msgstr "自动化任务" msgstr "自动化任务"
#: assets/models/automations/base.py:87 assets/models/backup.py:77 #: assets/models/automations/base.py:88 assets/models/backup.py:77
#: audits/models.py:44 ops/models/base.py:54 #: audits/models.py:44 ops/models/base.py:54
#: perms/models/asset_permission.py:76 terminal/models/session/session.py:43 #: perms/models/asset_permission.py:76 terminal/models/applet/host.py:32
#: terminal/models/session/session.py:43
#: tickets/models/ticket/apply_application.py:28 #: tickets/models/ticket/apply_application.py:28
#: tickets/models/ticket/apply_asset.py:21 #: tickets/models/ticket/apply_asset.py:21
#: xpack/plugins/change_auth_plan/models/base.py:108 #: xpack/plugins/change_auth_plan/models/base.py:108
@ -701,53 +704,55 @@ msgstr "自动化任务"
msgid "Date start" msgid "Date start"
msgstr "开始日期" msgstr "开始日期"
#: assets/models/automations/base.py:88 #: assets/models/automations/base.py:89
#: assets/models/automations/change_secret.py:59 ops/models/base.py:55 #: assets/models/automations/change_secret.py:58 ops/models/base.py:55
#: terminal/models/applet/host.py:33
msgid "Date finished" msgid "Date finished"
msgstr "结束日期" msgstr "结束日期"
#: assets/models/automations/base.py:90 #: assets/models/automations/base.py:91
msgid "Automation snapshot" msgid "Automation snapshot"
msgstr "自动化快照" msgstr "自动化快照"
#: assets/models/automations/base.py:94 assets/models/backup.py:88 #: assets/models/automations/base.py:95 assets/models/backup.py:88
#: assets/serializers/account/backup.py:36 #: assets/serializers/account/backup.py:36
#: xpack/plugins/change_auth_plan/models/base.py:121 #: xpack/plugins/change_auth_plan/models/base.py:121
#: xpack/plugins/change_auth_plan/serializers/base.py:78 #: xpack/plugins/change_auth_plan/serializers/base.py:78
msgid "Trigger mode" msgid "Trigger mode"
msgstr "触发模式" msgstr "触发模式"
#: assets/models/automations/base.py:98 #: assets/models/automations/base.py:99
msgid "Automation task execution" msgid "Automation task execution"
msgstr "自动化任务执行" msgstr "自动化任务执行"
#: assets/models/automations/change_secret.py:16 assets/models/base.py:62 #: assets/models/automations/change_secret.py:15 assets/models/base.py:62
msgid "Secret type" msgid "Secret type"
msgstr "密文类型" msgstr "密文类型"
#: assets/models/automations/change_secret.py:20 #: assets/models/automations/change_secret.py:19
msgid "Secret strategy" msgid "Secret strategy"
msgstr "密钥策略" msgstr "密钥策略"
#: assets/models/automations/change_secret.py:22 #: assets/models/automations/change_secret.py:21
#: assets/models/automations/change_secret.py:57 assets/models/base.py:64 #: assets/models/automations/change_secret.py:56 assets/models/base.py:64
#: assets/serializers/account/base.py:17 authentication/models.py:66 #: assets/serializers/account/base.py:17
#: authentication/models.py:246 #: authentication/models/connection_token.py:34
#: authentication/models/temp_token.py:10
#: authentication/templates/authentication/_access_key_modal.html:31 #: authentication/templates/authentication/_access_key_modal.html:31
#: settings/serializers/auth/radius.py:17 #: settings/serializers/auth/radius.py:17
msgid "Secret" msgid "Secret"
msgstr "密钥" msgstr "密钥"
#: assets/models/automations/change_secret.py:23 #: assets/models/automations/change_secret.py:22
#: xpack/plugins/change_auth_plan/models/base.py:39 #: xpack/plugins/change_auth_plan/models/base.py:39
msgid "Password rules" msgid "Password rules"
msgstr "密码规则" msgstr "密码规则"
#: assets/models/automations/change_secret.py:26 #: assets/models/automations/change_secret.py:25
msgid "SSH key change strategy" msgid "SSH key change strategy"
msgstr "SSH 密钥策略" msgstr "SSH 密钥策略"
#: assets/models/automations/change_secret.py:28 assets/models/backup.py:28 #: assets/models/automations/change_secret.py:27 assets/models/backup.py:28
#: assets/serializers/account/backup.py:28 #: assets/serializers/account/backup.py:28
#: xpack/plugins/change_auth_plan/models/app.py:40 #: xpack/plugins/change_auth_plan/models/app.py:40
#: xpack/plugins/change_auth_plan/models/asset.py:63 #: xpack/plugins/change_auth_plan/models/asset.py:63
@ -755,23 +760,23 @@ msgstr "SSH 密钥策略"
msgid "Recipient" msgid "Recipient"
msgstr "收件人" msgstr "收件人"
#: assets/models/automations/change_secret.py:35 #: assets/models/automations/change_secret.py:34
msgid "Change secret automation" msgid "Change secret automation"
msgstr "自动化改密" msgstr "自动化改密"
#: assets/models/automations/change_secret.py:56 #: assets/models/automations/change_secret.py:55
msgid "Old secret" msgid "Old secret"
msgstr "原来密码" msgstr "原来密码"
#: assets/models/automations/change_secret.py:58 #: assets/models/automations/change_secret.py:57
msgid "Date started" msgid "Date started"
msgstr "开始日期" msgstr "开始日期"
#: assets/models/automations/change_secret.py:61 #: assets/models/automations/change_secret.py:60 common/const/choices.py:19
msgid "Error" msgid "Error"
msgstr "错误" msgstr "错误"
#: assets/models/automations/change_secret.py:64 #: assets/models/automations/change_secret.py:63
msgid "Change secret record" msgid "Change secret record"
msgstr "改密记录" msgstr "改密记录"
@ -779,17 +784,27 @@ msgstr "改密记录"
msgid "Discovery account automation" msgid "Discovery account automation"
msgstr "自动化账号发现" msgstr "自动化账号发现"
#: assets/models/automations/gather_accounts.py:15
#, fuzzy
#| msgid "Gather asset facts"
msgid "Gather asset accounts"
msgstr "收集资产信息"
#: assets/models/automations/gather_facts.py:15 #: assets/models/automations/gather_facts.py:15
msgid "Gather asset facts" msgid "Gather asset facts"
msgstr "收集资产信息" msgstr "收集资产信息"
#: assets/models/automations/push_account.py:8 #: assets/models/automations/push_account.py:16
msgid "Push automation" #, fuzzy
msgstr "自动化推送" #| msgid "Is service account"
msgid "Push asset account"
msgstr "服务账号"
#: assets/models/automations/verify_secret.py:8 #: assets/models/automations/verify_account.py:15
msgid "Verify account automation" #, fuzzy
msgstr "账号校验自动化" #| msgid "Verify account"
msgid "Verify asset account"
msgstr "验证密钥"
#: assets/models/backup.py:38 assets/models/backup.py:96 #: assets/models/backup.py:38 assets/models/backup.py:96
msgid "Account backup plan" msgid "Account backup plan"
@ -830,7 +845,7 @@ msgstr "账号备份执行"
msgid "Connectivity" msgid "Connectivity"
msgstr "可连接性" msgstr "可连接性"
#: assets/models/base.py:32 authentication/models.py:248 #: assets/models/base.py:32 authentication/models/temp_token.py:12
msgid "Date verified" msgid "Date verified"
msgstr "校验日期" msgstr "校验日期"
@ -1247,7 +1262,6 @@ msgid "Category display"
msgstr "类别名称" msgstr "类别名称"
#: assets/serializers/mixin.py:10 audits/serializers.py:27 #: assets/serializers/mixin.py:10 audits/serializers.py:27
#: authentication/serializers/connection_token.py:20
#: tickets/serializers/flow.py:49 tickets/serializers/ticket/ticket.py:17 #: tickets/serializers/flow.py:49 tickets/serializers/ticket/ticket.py:17
msgid "Type display" msgid "Type display"
msgstr "类型名称" msgstr "类型名称"
@ -1412,7 +1426,7 @@ msgstr "操作"
msgid "Filename" msgid "Filename"
msgstr "文件名" msgstr "文件名"
#: audits/models.py:43 audits/models.py:117 #: audits/models.py:43 audits/models.py:117 common/const/choices.py:17
#: terminal/models/session/sharing.py:104 tickets/views/approve.py:114 #: terminal/models/session/sharing.py:104 tickets/views/approve.py:114
#: xpack/plugins/change_auth_plan/serializers/asset.py:189 #: xpack/plugins/change_auth_plan/serializers/asset.py:189
msgid "Success" msgid "Success"
@ -1492,8 +1506,8 @@ msgid "MFA"
msgstr "MFA" msgstr "MFA"
#: audits/models.py:128 ops/models/base.py:48 #: audits/models.py:128 ops/models/base.py:48
#: terminal/models/applet/applet.py:61 terminal/models/applet/host.py:15 #: terminal/models/applet/applet.py:57 terminal/models/applet/host.py:19
#: terminal/models/applet/host.py:27 terminal/models/component/status.py:33 #: terminal/models/applet/host.py:31 terminal/models/component/status.py:33
#: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171 #: tickets/models/ticket/general.py:281 xpack/plugins/cloud/models.py:171
#: xpack/plugins/cloud/models.py:223 #: xpack/plugins/cloud/models.py:223
msgid "Status" msgid "Status"
@ -1557,7 +1571,7 @@ msgstr "飞书"
msgid "DingTalk" msgid "DingTalk"
msgstr "钉钉" msgstr "钉钉"
#: audits/signal_handlers.py:56 authentication/models.py:252 #: audits/signal_handlers.py:56 authentication/models/temp_token.py:16
msgid "Temporary token" msgid "Temporary token"
msgstr "临时密码" msgstr "临时密码"
@ -1708,7 +1722,7 @@ msgstr "无效的令牌头。符号字符串不应包含无效字符。"
msgid "Invalid token or cache refreshed." msgid "Invalid token or cache refreshed."
msgstr "刷新的令牌或缓存无效。" msgstr "刷新的令牌或缓存无效。"
#: authentication/backends/oauth2/backends.py:155 authentication/models.py:143 #: authentication/backends/oauth2/backends.py:155
msgid "User invalid, disabled or expired" msgid "User invalid, disabled or expired"
msgstr "用户无效,已禁用或已过期" msgstr "用户无效,已禁用或已过期"
@ -1960,85 +1974,74 @@ msgstr "该 MFA ({}) 方式没有启用"
msgid "Please change your password" msgid "Please change your password"
msgstr "请修改密码" msgstr "请修改密码"
#: authentication/models.py:45 #: authentication/models/connection_token.py:31
msgid "Private Token" #: rbac/serializers/rolebinding.py:21
msgstr "SSH 密钥" msgid "User display"
msgstr "用户名称"
#: authentication/models.py:54 #: authentication/models/connection_token.py:32
msgid "Expired" msgid "Asset display"
msgstr "过期时间" msgstr "资产名称"
#: authentication/models.py:58 #: authentication/models/connection_token.py:36
msgid "SSO token" #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:79
msgstr "SSO token"
#: authentication/models.py:68 authentication/models.py:249
#: perms/models/asset_permission.py:79
#: tickets/models/ticket/apply_application.py:29 #: tickets/models/ticket/apply_application.py:29
#: tickets/models/ticket/apply_asset.py:22 users/models/user.py:707 #: tickets/models/ticket/apply_asset.py:22 users/models/user.py:707
msgid "Date expired" msgid "Date expired"
msgstr "失效日期" msgstr "失效日期"
#: authentication/models.py:75 rbac/serializers/rolebinding.py:21 #: authentication/models/connection_token.py:41
msgid "User display"
msgstr "用户名称"
#: authentication/models.py:80
msgid "Asset display"
msgstr "资产名称"
#: authentication/models.py:85
msgid "Account display"
msgstr "账号显示"
#: authentication/models.py:89
msgid "Connection token" msgid "Connection token"
msgstr "连接令牌" msgstr "连接令牌"
#: authentication/models.py:91 #: authentication/models/connection_token.py:43
msgid "Can view connection token secret" msgid "Can view connection token secret"
msgstr "可以查看连接令牌密文" msgstr "可以查看连接令牌密文"
#: authentication/models.py:134 #: authentication/models/connection_token.py:82
msgid "Connection token expired at: {}" msgid "Connection token expired at: {}"
msgstr "连接令牌过期: {}" msgstr "连接令牌过期: {}"
#: authentication/models.py:139 #: authentication/models/connection_token.py:86
msgid "User not exists" msgid "No user or invalid user"
msgstr "用户不存在" msgstr ""
#: authentication/models.py:148 #: authentication/models/connection_token.py:90
msgid "System user not exists" #, fuzzy
msgstr "系统用户不存在" #| msgid "Asset inactive"
msgid "No asset or inactive asset"
#: authentication/models.py:154
msgid "Asset not exists"
msgstr "资产不存在"
#: authentication/models.py:158
msgid "Asset inactive"
msgstr "资产未激活" msgstr "资产未激活"
#: authentication/models.py:165 #: authentication/models/connection_token.py:94
#, fuzzy
#| msgid "Login account"
msgid "No account"
msgstr "登录账号"
#: authentication/models/connection_token.py:103
msgid "User has no permission to access asset or permission expired" msgid "User has no permission to access asset or permission expired"
msgstr "用户没有权限访问资产或权限已过期" msgstr "用户没有权限访问资产或权限已过期"
#: authentication/models.py:173 #: authentication/models/connection_token.py:145
msgid "Application not exists"
msgstr "应用不存在"
#: authentication/models.py:180
msgid "User has no permission to access application or permission expired"
msgstr "用户没有权限访问应用或权限已过期"
#: authentication/models.py:247
msgid "Verified"
msgstr "已校验"
#: authentication/models.py:268
msgid "Super connection token" msgid "Super connection token"
msgstr "超级连接令牌" msgstr "超级连接令牌"
#: authentication/models/private_token.py:9
msgid "Private Token"
msgstr "SSH 密钥"
#: authentication/models/sso_token.py:14
msgid "Expired"
msgstr "过期时间"
#: authentication/models/sso_token.py:18
msgid "SSO token"
msgstr "SSO token"
#: authentication/models/temp_token.py:11
msgid "Verified"
msgstr "已校验"
#: authentication/notifications.py:19 #: authentication/notifications.py:19
msgid "Different city login reminder" msgid "Different city login reminder"
msgstr "异地登录提醒" msgstr "异地登录提醒"
@ -2047,19 +2050,15 @@ msgstr "异地登录提醒"
msgid "binding reminder" msgid "binding reminder"
msgstr "绑定提醒" msgstr "绑定提醒"
#: authentication/serializers/connection_token.py:21 #: authentication/serializers/connection_token.py:20
#: xpack/plugins/cloud/models.py:36 #: xpack/plugins/cloud/models.py:36
msgid "Validity" msgid "Validity"
msgstr "有效" msgstr "有效"
#: authentication/serializers/connection_token.py:22 #: authentication/serializers/connection_token.py:21
msgid "Expired time" msgid "Expired time"
msgstr "过期时间" msgstr "过期时间"
#: authentication/serializers/connection_token.py:68
msgid "Asset or application required"
msgstr "资产或应用必填"
#: authentication/serializers/token.py:79 perms/serializers/permission.py:60 #: authentication/serializers/token.py:79 perms/serializers/permission.py:60
#: perms/serializers/permission.py:87 users/serializers/user.py:148 #: perms/serializers/permission.py:87 users/serializers/user.py:148
msgid "Is valid" msgid "Is valid"
@ -2148,7 +2147,7 @@ msgstr "代码错误"
#: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3
#: authentication/templates/authentication/_msg_rest_password_success.html:2 #: authentication/templates/authentication/_msg_rest_password_success.html:2
#: authentication/templates/authentication/_msg_rest_public_key_success.html:2 #: authentication/templates/authentication/_msg_rest_public_key_success.html:2
#: jumpserver/conf.py:390 ops/tasks.py:146 ops/tasks.py:152 ops/tasks.py:155 #: jumpserver/conf.py:390 ops/tasks.py:147 ops/tasks.py:153 ops/tasks.py:156
#: perms/templates/perms/_msg_item_permissions_expire.html:3 #: perms/templates/perms/_msg_item_permissions_expire.html:3
#: perms/templates/perms/_msg_permed_items_expire.html:3 #: perms/templates/perms/_msg_permed_items_expire.html:3
#: tickets/templates/tickets/approve_check_password.html:33 #: tickets/templates/tickets/approve_check_password.html:33
@ -2440,6 +2439,20 @@ msgstr "手动触发"
msgid "Timing trigger" msgid "Timing trigger"
msgstr "定时触发" msgstr "定时触发"
#: common/const/choices.py:15 tickets/const.py:29 tickets/const.py:37
msgid "Pending"
msgstr "待定的"
#: common/const/choices.py:16
msgid "Running"
msgstr ""
#: common/const/choices.py:20
#, fuzzy
#| msgid "Cancel"
msgid "Canceled"
msgstr "取消"
#: common/db/encoder.py:11 #: common/db/encoder.py:11
msgid "ugettext_lazy" msgid "ugettext_lazy"
msgstr "ugettext_lazy" msgstr "ugettext_lazy"
@ -2688,15 +2701,15 @@ msgstr "站内信"
msgid "No account available" msgid "No account available"
msgstr "没有账号可以使用" msgstr "没有账号可以使用"
#: ops/ansible/inventory.py:173 #: ops/ansible/inventory.py:175
msgid "Ansible disabled" msgid "Ansible disabled"
msgstr "Ansible 已禁用" msgstr "Ansible 已禁用"
#: ops/ansible/inventory.py:189 #: ops/ansible/inventory.py:191
msgid "Skip hosts below:" msgid "Skip hosts below:"
msgstr "跳过一下主机:" msgstr "跳过一下主机:"
#: ops/api/celery.py:61 ops/api/celery.py:76 #: ops/api/celery.py:63 ops/api/celery.py:78
msgid "Waiting task start" msgid "Waiting task start"
msgstr "等待任务开始" msgstr "等待任务开始"
@ -2757,7 +2770,7 @@ msgstr "模式"
msgid "Module" msgid "Module"
msgstr "" msgstr ""
#: ops/models/adhoc.py:20 ops/models/celery.py:15 #: ops/models/adhoc.py:20 ops/models/celery.py:45
#: terminal/models/component/task.py:17 #: terminal/models/component/task.py:17
msgid "Args" msgid "Args"
msgstr "参数" msgstr "参数"
@ -2795,16 +2808,16 @@ msgstr "结果"
msgid "Summary" msgid "Summary"
msgstr "汇总" msgstr "汇总"
#: ops/models/celery.py:16 terminal/models/component/task.py:18 #: ops/models/celery.py:46 terminal/models/component/task.py:18
msgid "Kwargs" msgid "Kwargs"
msgstr "其它参数" msgstr "其它参数"
#: ops/models/celery.py:17 tickets/models/comment.py:13 #: ops/models/celery.py:47 tickets/models/comment.py:13
#: tickets/models/ticket/general.py:41 tickets/models/ticket/general.py:277 #: tickets/models/ticket/general.py:41 tickets/models/ticket/general.py:277
msgid "State" msgid "State"
msgstr "状态" msgstr "状态"
#: ops/models/celery.py:18 terminal/models/session/sharing.py:111 #: ops/models/celery.py:48 terminal/models/session/sharing.py:111
#: tickets/const.py:25 xpack/plugins/change_auth_plan/models/base.py:188 #: tickets/const.py:25 xpack/plugins/change_auth_plan/models/base.py:188
msgid "Finished" msgid "Finished"
msgstr "结束" msgstr "结束"
@ -2829,7 +2842,8 @@ msgstr "Owner"
msgid "Template" msgid "Template"
msgstr "模板" msgstr "模板"
#: ops/models/playbook.py:38 terminal/models/component/task.py:26 #: ops/models/playbook.py:38 ops/signal_handlers.py:63
#: terminal/models/component/task.py:26
#: xpack/plugins/gathered_user/models.py:68 #: xpack/plugins/gathered_user/models.py:68
msgid "Task" msgid "Task"
msgstr "任务" msgstr "任务"
@ -2866,19 +2880,19 @@ msgstr "内存使用率超过 {max_threshold}%: => {value}"
msgid "CPU load more than {max_threshold}: => {value}" msgid "CPU load more than {max_threshold}: => {value}"
msgstr "CPU 使用率超过 {max_threshold}: => {value}" msgstr "CPU 使用率超过 {max_threshold}: => {value}"
#: ops/tasks.py:33 #: ops/tasks.py:34
msgid "Run ansible task" msgid "Run ansible task"
msgstr "运行 ansible 任务" msgstr "运行 ansible 任务"
#: ops/tasks.py:57 #: ops/tasks.py:58
msgid "Run ansible command" msgid "Run ansible command"
msgstr "运行 ansible 命令" msgstr "运行 ansible 命令"
#: ops/tasks.py:79 #: ops/tasks.py:80
msgid "Clean task history period" msgid "Clean task history period"
msgstr "定期清除任务历史" msgstr "定期清除任务历史"
#: ops/tasks.py:92 #: ops/tasks.py:93
msgid "Clean celery log period" msgid "Clean celery log period"
msgstr "定期清除Celery日志" msgstr "定期清除Celery日志"
@ -2908,7 +2922,7 @@ msgstr "组织存在资源 ({}) 不能被删除"
msgid "App organizations" msgid "App organizations"
msgstr "组织管理" msgstr "组织管理"
#: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:87 #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:88
#: rbac/const.py:7 rbac/models/rolebinding.py:48 #: rbac/const.py:7 rbac/models/rolebinding.py:48
#: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:62 #: rbac/serializers/rolebinding.py:40 settings/serializers/auth/ldap.py:62
#: tickets/models/ticket/general.py:300 tickets/serializers/ticket/ticket.py:71 #: tickets/models/ticket/general.py:300 tickets/serializers/ticket/ticket.py:71
@ -2919,23 +2933,29 @@ msgstr "组织"
msgid "Org name" msgid "Org name"
msgstr "组织名称" msgstr "组织名称"
#: orgs/models.py:79 #: orgs/models.py:72
#, fuzzy
#| msgid "Built-in"
msgid "Builtin"
msgstr "内置"
#: orgs/models.py:80
msgid "GLOBAL" msgid "GLOBAL"
msgstr "全局组织" msgstr "全局组织"
#: orgs/models.py:81 #: orgs/models.py:82
msgid "DEFAULT" msgid "DEFAULT"
msgstr "" msgstr ""
#: orgs/models.py:83 #: orgs/models.py:84
msgid "SYSTEM" msgid "SYSTEM"
msgstr "" msgstr ""
#: orgs/models.py:89 #: orgs/models.py:90
msgid "Can view root org" msgid "Can view root org"
msgstr "可以查看全局组织" msgstr "可以查看全局组织"
#: orgs/models.py:90 #: orgs/models.py:91
msgid "Can view all joined org" msgid "Can view all joined org"
msgstr "可以查看所有加入的组织" msgstr "可以查看所有加入的组织"
@ -3212,7 +3232,7 @@ msgstr "权限"
msgid "Scope display" msgid "Scope display"
msgstr "范围名称" msgstr "范围名称"
#: rbac/serializers/role.py:27 terminal/models/applet/applet.py:26 #: rbac/serializers/role.py:27 terminal/models/applet/applet.py:21
msgid "Display name" msgid "Display name"
msgstr "显示名称" msgstr "显示名称"
@ -3260,6 +3280,10 @@ msgstr "云同步"
msgid "Backup account" msgid "Backup account"
msgstr "备份账号" msgstr "备份账号"
#: rbac/tree.py:53
msgid "Gather account"
msgstr "收集账号"
#: rbac/tree.py:54 #: rbac/tree.py:54
msgid "App change auth" msgid "App change auth"
msgstr "应用改密" msgstr "应用改密"
@ -4693,39 +4717,47 @@ msgstr "不支持批量创建"
msgid "Storage is invalid" msgid "Storage is invalid"
msgstr "存储无效" msgstr "存储无效"
#: terminal/models/applet/applet.py:21
msgid "Manual"
msgstr "手动"
#: terminal/models/applet/applet.py:22
msgid "Git"
msgstr ""
#: terminal/models/applet/applet.py:23 #: terminal/models/applet/applet.py:23
msgid "Remote gzip"
msgstr "远程应用"
#: terminal/models/applet/applet.py:28
msgid "Author" msgid "Author"
msgstr "作者" msgstr "作者"
#: terminal/models/applet/applet.py:32 #: terminal/models/applet/applet.py:27
msgid "Tags" msgid "Tags"
msgstr "标签" msgstr "标签"
#: terminal/models/applet/applet.py:59 terminal/models/applet/host.py:17 #: terminal/models/applet/applet.py:29 terminal/serializers/storage.py:157
msgid "Hosts"
msgstr "主机"
#: terminal/models/applet/applet.py:55 terminal/models/applet/host.py:21
msgid "Applet" msgid "Applet"
msgstr "远程应用" msgstr "远程应用"
#: terminal/models/applet/host.py:13 #: terminal/models/applet/host.py:14
msgid "Account automation" msgid "Account automation"
msgstr "账号自动化" msgstr "账号自动化"
#: terminal/models/applet/host.py:14 #: terminal/models/applet/host.py:15 terminal/serializers/applet.py:66
#, fuzzy
#| msgid "More login options"
msgid "Deploy options"
msgstr "其他方式登录"
#: terminal/models/applet/host.py:16
msgid "Inited"
msgstr ""
#: terminal/models/applet/host.py:17
#, fuzzy
#| msgid "Date finished"
msgid "Date inited"
msgstr "结束日期"
#: terminal/models/applet/host.py:18
msgid "Date synced" msgid "Date synced"
msgstr "最后同步日期" msgstr "最后同步日期"
#: terminal/models/applet/host.py:26 #: terminal/models/applet/host.py:30
msgid "Hosting" msgid "Hosting"
msgstr "主机" msgstr "主机"
@ -4957,6 +4989,42 @@ msgstr "批量危险命令告警"
msgid "Icon" msgid "Icon"
msgstr "图标" msgstr "图标"
#: terminal/serializers/applet.py:53
msgid "Not set"
msgstr "不设置"
#: terminal/serializers/applet.py:54
msgid "Per Session"
msgstr "按会话"
#: terminal/serializers/applet.py:55
msgid "Per Device"
msgstr "按设备"
#: terminal/serializers/applet.py:57
msgid "RDS Licensing"
msgstr "部署 RDS 许可服务"
#: terminal/serializers/applet.py:58
msgid "RDS License Server"
msgstr "RDS 许可服务主机"
#: terminal/serializers/applet.py:59
msgid "RDS Licensing Mode"
msgstr "RDS 许可模式"
#: terminal/serializers/applet.py:60
msgid "RDS fSingleSessionPerUser"
msgstr "RDS 会话用户数"
#: terminal/serializers/applet.py:61
msgid "RDS Max Disconnection Time"
msgstr "RDS 会话断开时间"
#: terminal/serializers/applet.py:62
msgid "RDS Remote App Logoff Time Limit"
msgstr "RDS 远程应用注销时间"
#: terminal/serializers/endpoint.py:12 #: terminal/serializers/endpoint.py:12
msgid "Oracle port" msgid "Oracle port"
msgstr "" msgstr ""
@ -5056,10 +5124,6 @@ msgstr "主机无效"
msgid "Port invalid" msgid "Port invalid"
msgstr "端口无效" msgstr "端口无效"
#: terminal/serializers/storage.py:157
msgid "Hosts"
msgstr "主机"
#: terminal/serializers/storage.py:160 #: terminal/serializers/storage.py:160
msgid "Index by date" msgid "Index by date"
msgstr "按日期建索引" msgstr "按日期建索引"
@ -5116,10 +5180,6 @@ msgstr "已拒绝"
msgid "Reopen" msgid "Reopen"
msgstr "" msgstr ""
#: tickets/const.py:29 tickets/const.py:37
msgid "Pending"
msgstr "待定的"
#: tickets/const.py:32 tickets/const.py:39 #: tickets/const.py:32 tickets/const.py:39
msgid "Closed" msgid "Closed"
msgstr "关闭的" msgstr "关闭的"
@ -6715,6 +6775,39 @@ msgstr "旗舰版"
msgid "Community edition" msgid "Community edition"
msgstr "社区版" msgstr "社区版"
#~ msgid "Push automation"
#~ msgstr "自动化推送"
#~ msgid "Verify account automation"
#~ msgstr "账号校验自动化"
#~ msgid "Account display"
#~ msgstr "账号显示"
#~ msgid "User not exists"
#~ msgstr "用户不存在"
#~ msgid "System user not exists"
#~ msgstr "系统用户不存在"
#~ msgid "Asset not exists"
#~ msgstr "资产不存在"
#~ msgid "Application not exists"
#~ msgstr "应用不存在"
#~ msgid "User has no permission to access application or permission expired"
#~ msgstr "用户没有权限访问应用或权限已过期"
#~ msgid "Asset or application required"
#~ msgstr "资产或应用必填"
#~ msgid "Manual"
#~ msgstr "手动"
#~ msgid "Remote gzip"
#~ msgstr "远程应用"
#~ msgid "Verify secret" #~ msgid "Verify secret"
#~ msgstr "校验密码" #~ msgstr "校验密码"
@ -6726,9 +6819,6 @@ msgstr "社区版"
#~ msgid "Verify secret automation" #~ msgid "Verify secret automation"
#~ msgstr "自动化验证" #~ msgstr "自动化验证"
#~ msgid "Gather accounts"
#~ msgstr "收集账号"
#, fuzzy #, fuzzy
#~| msgid "Hostname strategy" #~| msgid "Hostname strategy"
#~ msgid "Automation strategy" #~ msgid "Automation strategy"

View File

@ -3,6 +3,7 @@ import ast
from django.db import transaction from django.db import transaction
from django.dispatch import receiver from django.dispatch import receiver
from django.utils import translation, timezone from django.utils import translation, timezone
from django.utils.translation import gettext as _
from django.core.cache import cache from django.core.cache import cache
from celery import signals, current_app from celery import signals, current_app
@ -44,7 +45,8 @@ def before_task_publish(headers=None, **kwargs):
@signals.task_prerun.connect @signals.task_prerun.connect
def on_celery_task_pre_run(task_id='', **kwargs): def on_celery_task_pre_run(task_id='', **kwargs):
# 更新状态 # 更新状态
CeleryTaskExecution.objects.filter(id=task_id).update(state='RUNNING', date_start=timezone.now()) CeleryTaskExecution.objects.filter(id=task_id)\
.update(state='RUNNING', date_start=timezone.now())
# 关闭之前的数据库连接 # 关闭之前的数据库连接
close_old_connections() close_old_connections()
@ -58,7 +60,7 @@ def on_celery_task_pre_run(task_id='', **kwargs):
@signals.task_postrun.connect @signals.task_postrun.connect
def on_celery_task_post_run(task_id='', state='', **kwargs): def on_celery_task_post_run(task_id='', state='', **kwargs):
close_old_connections() close_old_connections()
print("Task post run: ", task_id, state) print(_("Task") + ": {} {}".format(task_id, state))
CeleryTaskExecution.objects.filter(id=task_id).update( CeleryTaskExecution.objects.filter(id=task_id).update(
state=state, date_finished=timezone.now(), is_finished=True state=state, date_finished=timezone.now(), is_finished=True

View File

@ -60,7 +60,7 @@ class OrgModelMixin(models.Model):
sep = '@' sep = '@'
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
locking_org = getattr(self, 'locking_org', None) locking_org = getattr(self, 'LOCKING_ORG', None)
if locking_org: if locking_org:
org = Organization.get_instance(locking_org) org = Organization.get_instance(locking_org)
else: else:

View File

@ -105,14 +105,11 @@ def tmp_to_builtin_org(system=0, default=0):
def filter_org_queryset(queryset): def filter_org_queryset(queryset):
locking_org = getattr(queryset.model, 'LOCKING_ORG', None) locking_org = getattr(queryset.model, 'LOCKING_ORG', None)
if locking_org:
org = Organization.get_instance(locking_org)
else:
org = get_current_org() org = get_current_org()
if org is None: if locking_org:
kwargs = {} kwargs = {'org_id': locking_org}
elif org.is_root(): elif org is None or org.is_root():
kwargs = {} kwargs = {}
else: else:
kwargs = {'org_id': org.id} kwargs = {'org_id': org.id}

View File

@ -5,6 +5,7 @@ import os.path
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from rest_framework import viewsets from rest_framework import viewsets
from django.http import HttpResponse
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.serializers import ValidationError from rest_framework.serializers import ValidationError
@ -22,6 +23,7 @@ class AppletViewSet(viewsets.ModelViewSet):
serializer_class = serializers.AppletSerializer serializer_class = serializers.AppletSerializer
rbac_perms = { rbac_perms = {
'upload': 'terminal.add_applet', 'upload': 'terminal.add_applet',
'download': 'terminal.view_applet',
} }
def perform_destroy(self, instance): def perform_destroy(self, instance):
@ -52,7 +54,7 @@ class AppletViewSet(viewsets.ModelViewSet):
zp.extractall(extract_to) zp.extractall(extract_to)
tmp_dir = os.path.join(extract_to, file.name.replace('.zip', '')) tmp_dir = os.path.join(extract_to, file.name.replace('.zip', ''))
files = ['manifest.yml', 'icon.png', 'i18n.yml'] files = ['manifest.yml', 'icon.png', 'i18n.yml', 'setup.yml']
for name in files: for name in files:
path = os.path.join(tmp_dir, name) path = os.path.join(tmp_dir, name)
if not os.path.exists(path): if not os.path.exists(path):
@ -84,6 +86,16 @@ class AppletViewSet(viewsets.ModelViewSet):
serializer.save() serializer.save()
return Response(serializer.data, status=201) return Response(serializer.data, status=201)
@action(detail=True, methods=['get'])
def download(self, request, *args, **kwargs):
instance = super().get_object()
path = default_storage.path('applets/{}'.format(instance.name))
zip_path = shutil.make_archive(path, 'zip', path)
with open(zip_path, 'rb') as f:
response = HttpResponse(f.read(), status=200, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename*=UTF-8\'\'{}.zip'.format(instance.name)
return response
class AppletPublicationViewSet(viewsets.ModelViewSet): class AppletPublicationViewSet(viewsets.ModelViewSet):
queryset = AppletPublication.objects.all() queryset = AppletPublication.objects.all()

View File

@ -2,6 +2,7 @@ import os
import datetime import datetime
import shutil import shutil
import yaml
from django.utils import timezone from django.utils import timezone
from django.conf import settings from django.conf import settings
@ -26,10 +27,20 @@ class DeployAppletHostManager:
def generate_playbook(self): def generate_playbook(self):
playbook_src = os.path.join(CURRENT_DIR, 'playbook.yml') playbook_src = os.path.join(CURRENT_DIR, 'playbook.yml')
with open(playbook_src) as f:
plays = yaml.safe_load(f)
for play in plays:
play['vars'].update(self.deployment.host.deploy_options)
play['vars']['DownloadHost'] = settings.BASE_URL + '/download/'
play['vars']['CORE_HOST'] = settings.BASE_URL
play['vars']['BOOTSTRAP_TOKEN'] = settings.BOOSTRAP_TOKEN
play['vars']['HOST_NAME'] = self.deployment.host.name
playbook_dir = os.path.join(self.run_dir, 'playbook') playbook_dir = os.path.join(self.run_dir, 'playbook')
playbook_dst = os.path.join(playbook_dir, 'main.yml') playbook_dst = os.path.join(playbook_dir, 'main.yml')
os.makedirs(playbook_dir, exist_ok=True) os.makedirs(playbook_dir, exist_ok=True)
shutil.copy(playbook_src, playbook_dst) with open(playbook_dst, 'w') as f:
yaml.safe_dump(plays, f)
return playbook_dst return playbook_dst
def generate_inventory(self): def generate_inventory(self):

View File

@ -2,13 +2,17 @@
- hosts: all - hosts: all
vars: vars:
- DownloadHost: https://demo.jumpserver.org/download DownloadHost: https://demo.jumpserver.org/download
- RDS_Licensing: enabled Initial: 0
- RDS_LicenseServer: 127.0.0.1 HOST_NAME: test
- RDS_LicensingMode: 4 CORE_HOST: https://demo.jumpserver.org
- RDS_fSingleSessionPerUser: 1 BOOTSTRAP_TOKEN: PleaseChangeMe
- RDS_MaxDisconnectionTime: 60000 RDS_Licensing: true
- RDS_RemoteAppLogoffTimeLimit: 0 RDS_LicenseServer: 127.0.0.1
RDS_LicensingMode: 4
RDS_fSingleSessionPerUser: 1
RDS_MaxDisconnectionTime: 60000
RDS_RemoteAppLogoffTimeLimit: 0
tasks: tasks:
- name: Install RDS-Licensing (RDS) - name: Install RDS-Licensing (RDS)
@ -16,7 +20,7 @@
name: RDS-Licensing name: RDS-Licensing
state: present state: present
include_management_tools: yes include_management_tools: yes
when: RDS_Licensing == "enabled" when: RDS_Licensing
- name: Install RDS-RD-Server (RDS) - name: Install RDS-RD-Server (RDS)
ansible.windows.win_feature: ansible.windows.win_feature:
@ -136,3 +140,12 @@
state: present state: present
arguments: arguments:
- /quiet - /quiet
- name: Generate component config
ansible.windows.win_shell: >
echo "Todo: Set config"
- name: Sync all remote applets
ansible.windows.win_shell: >
echo "TODO: Sync all remote applets"
when: Initial

View File

@ -56,7 +56,7 @@ class Migration(migrations.Migration):
('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('status', models.CharField(max_length=16, verbose_name='Status')), ('status', models.CharField(default='', max_length=16, verbose_name='Status')),
('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
('applet', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='terminal.applet', verbose_name='Applet')), ('applet', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='terminal.applet', verbose_name='Applet')),
('host', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='terminal.applethost', verbose_name='Host')), ('host', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='terminal.applethost', verbose_name='Host')),

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.14 on 2022-11-01 05:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('terminal', '0055_auto_20221031_1848'),
]
operations = [
migrations.AddField(
model_name='applethost',
name='deploy_options',
field=models.JSONField(default=dict, verbose_name='Deploy options'),
),
migrations.AddField(
model_name='applethostdeployment',
name='initial',
field=models.BooleanField(default=False, verbose_name='Initial'),
),
]

View File

@ -54,8 +54,7 @@ class Applet(JMSBaseModel):
class AppletPublication(JMSBaseModel): class AppletPublication(JMSBaseModel):
applet = models.ForeignKey('Applet', on_delete=models.PROTECT, related_name='publications', verbose_name=_('Applet')) applet = models.ForeignKey('Applet', on_delete=models.PROTECT, related_name='publications', verbose_name=_('Applet'))
host = models.ForeignKey('AppletHost', on_delete=models.PROTECT, related_name='publications', verbose_name=_('Host')) host = models.ForeignKey('AppletHost', on_delete=models.PROTECT, related_name='publications', verbose_name=_('Host'))
status = models.CharField(max_length=16, verbose_name=_('Status')) status = models.CharField(max_length=16, default='', verbose_name=_('Status'))
published = models.BooleanField(default=False, verbose_name=_('Published'))
comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
class Meta: class Meta:

View File

@ -9,9 +9,10 @@ __all__ = ['AppletHost', 'AppletHostDeployment']
class AppletHost(Host): class AppletHost(Host):
LOCKING_ORG = 'SYSTEM' LOCKING_ORG = '00000000-0000-0000-0000-000000000004'
account_automation = models.BooleanField(default=False, verbose_name=_('Account automation')) account_automation = models.BooleanField(default=False, verbose_name=_('Account automation'))
deploy_options = models.JSONField(default=dict, verbose_name=_('Deploy options'))
inited = models.BooleanField(default=False, verbose_name=_('Inited')) inited = models.BooleanField(default=False, verbose_name=_('Inited'))
date_inited = models.DateTimeField(null=True, blank=True, verbose_name=_('Date inited')) date_inited = models.DateTimeField(null=True, blank=True, verbose_name=_('Date inited'))
date_synced = models.DateTimeField(null=True, blank=True, verbose_name=_('Date synced')) date_synced = models.DateTimeField(null=True, blank=True, verbose_name=_('Date synced'))
@ -27,6 +28,7 @@ class AppletHost(Host):
class AppletHostDeployment(JMSBaseModel): class AppletHostDeployment(JMSBaseModel):
host = models.ForeignKey('AppletHost', on_delete=models.CASCADE, verbose_name=_('Hosting')) host = models.ForeignKey('AppletHost', on_delete=models.CASCADE, verbose_name=_('Hosting'))
initial = models.BooleanField(default=False, verbose_name=_('Initial'))
status = models.CharField(max_length=16, default='', verbose_name=_('Status')) status = models.CharField(max_length=16, default='', verbose_name=_('Status'))
date_start = models.DateTimeField(null=True, verbose_name=_('Date start'), db_index=True) date_start = models.DateTimeField(null=True, verbose_name=_('Date start'), db_index=True)
date_finished = models.DateTimeField(null=True, verbose_name=_("Date finished")) date_finished = models.DateTimeField(null=True, verbose_name=_("Date finished"))

View File

@ -48,11 +48,30 @@ class AppletPublicationSerializer(serializers.ModelSerializer):
] + read_only_fields ] + read_only_fields
class DeployOptionsSerializer(serializers.Serializer):
LICENSE_MODE_CHOICES = (
(4, _('Per Session')),
(2, _('Per Device')),
)
SESSION_PER_USER = (
(1, _("Disabled")),
(0, _("Enabled")),
)
RDS_Licensing = serializers.BooleanField(default=False, label=_("RDS Licensing"))
RDS_LicenseServer = serializers.CharField(default='127.0.0.1', label=_('RDS License Server'), max_length=1024)
RDS_LicensingMode = serializers.ChoiceField(choices=LICENSE_MODE_CHOICES, default=4, label=_('RDS Licensing Mode'))
RDS_fSingleSessionPerUser = serializers.ChoiceField(choices=SESSION_PER_USER, default=1, label=_("RDS fSingleSessionPerUser"))
RDS_MaxDisconnectionTime = serializers.IntegerField(default=60000, label=_("RDS Max Disconnection Time"))
RDS_RemoteAppLogoffTimeLimit = serializers.IntegerField(default=0, label=_("RDS Remote App Logoff Time Limit"))
class AppletHostSerializer(HostSerializer): class AppletHostSerializer(HostSerializer):
deploy_options = DeployOptionsSerializer(required=False, label=_("Deploy options"))
class Meta(HostSerializer.Meta): class Meta(HostSerializer.Meta):
model = AppletHost model = AppletHost
fields = HostSerializer.Meta.fields + [ fields = HostSerializer.Meta.fields + [
'account_automation', 'status', 'date_synced' 'account_automation', 'status', 'date_synced', 'deploy_options'
] ]
extra_kwargs = { extra_kwargs = {
'status': {'read_only': True}, 'status': {'read_only': True},

View File

@ -1,2 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Applet, AppletHost
@receiver(post_save, sender=AppletHost)
def on_applet_host_create(sender, instance, created=False, **kwargs):
pass
@receiver(post_save, sender=Applet)
def on_applet_create(sender, instance, created=False, **kwargs):
pass