From 2adb2519fabab25222443ae608497288ab1fd4f5 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Fri, 16 Aug 2024 18:12:22 +0800 Subject: [PATCH 01/98] perf: Push password change and select finally use rdp to test connectivity. rdp does not support gateway --- .../change_secret/host/aix/main.yml | 4 +- .../change_secret/host/posix/main.yml | 4 +- .../host/windows_rdp_verify/main.yml | 4 +- .../push_account/host/aix/main.yml | 4 +- .../push_account/host/posix/main.yml | 4 +- .../host/windows_rdp_verify/main.yml | 4 +- .../verify_account/custom/rdp/main.yml | 1 - .../automations/ping/custom/rdp/main.yml | 1 - apps/libs/ansible/modules/rdp_ping.py | 116 +++++++++++++----- .../ansible/modules_utils/custom_common.py | 6 +- apps/ops/ansible/inventory.py | 1 + 11 files changed, 103 insertions(+), 46 deletions(-) diff --git a/apps/accounts/automations/change_secret/host/aix/main.yml b/apps/accounts/automations/change_secret/host/aix/main.yml index 761a9c2c1..afb7b0443 100644 --- a/apps/accounts/automations/change_secret/host/aix/main.yml +++ b/apps/accounts/automations/change_secret/host/aix/main.yml @@ -79,7 +79,7 @@ login_password: "{{ account.secret }}" login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" - gateway_args: "{{ jms_asset.ansible_ssh_common_args | default('') }}" + gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" become: "{{ account.become.ansible_become | default(False) }}" become_method: su become_user: "{{ account.become.ansible_user | default('') }}" @@ -95,7 +95,7 @@ login_port: "{{ jms_asset.port }}" login_user: "{{ account.username }}" login_private_key_path: "{{ account.private_key_path }}" - gateway_args: "{{ jms_asset.ansible_ssh_common_args | default('') }}" + gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" when: account.secret_type == "ssh_key" delegate_to: localhost diff --git a/apps/accounts/automations/change_secret/host/posix/main.yml b/apps/accounts/automations/change_secret/host/posix/main.yml index d166de81f..e58e8422e 100644 --- a/apps/accounts/automations/change_secret/host/posix/main.yml +++ b/apps/accounts/automations/change_secret/host/posix/main.yml @@ -79,7 +79,7 @@ login_password: "{{ account.secret }}" login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" - gateway_args: "{{ jms_asset.ansible_ssh_common_args | default('') }}" + gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" become: "{{ account.become.ansible_become | default(False) }}" become_method: su become_user: "{{ account.become.ansible_user | default('') }}" @@ -95,7 +95,7 @@ login_port: "{{ jms_asset.port }}" login_user: "{{ account.username }}" login_private_key_path: "{{ account.private_key_path }}" - gateway_args: "{{ jms_asset.ansible_ssh_common_args | default('') }}" + gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" when: account.secret_type == "ssh_key" delegate_to: localhost diff --git a/apps/accounts/automations/change_secret/host/windows_rdp_verify/main.yml b/apps/accounts/automations/change_secret/host/windows_rdp_verify/main.yml index e1ced1359..31da190ef 100644 --- a/apps/accounts/automations/change_secret/host/windows_rdp_verify/main.yml +++ b/apps/accounts/automations/change_secret/host/windows_rdp_verify/main.yml @@ -25,11 +25,11 @@ - name: Verify password (pyfreerdp) rdp_ping: - login_host: "{{ jms_asset.address }}" + login_host: "{{ jms_asset.origin_address }}" login_port: "{{ jms_asset.protocols | selectattr('name', 'equalto', 'rdp') | map(attribute='port') | first }}" login_user: "{{ account.username }}" login_password: "{{ account.secret }}" login_secret_type: "{{ account.secret_type }}" - login_private_key_path: "{{ account.private_key_path }}" + gateway_args: "{{ jms_gateway | default(None) }}" when: account.secret_type == "password" delegate_to: localhost diff --git a/apps/accounts/automations/push_account/host/aix/main.yml b/apps/accounts/automations/push_account/host/aix/main.yml index 8c03c07f3..fd33c5f8c 100644 --- a/apps/accounts/automations/push_account/host/aix/main.yml +++ b/apps/accounts/automations/push_account/host/aix/main.yml @@ -79,7 +79,7 @@ login_password: "{{ account.secret }}" login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" - gateway_args: "{{ jms_asset.ansible_ssh_common_args | default('') }}" + gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" become: "{{ account.become.ansible_become | default(False) }}" become_method: su become_user: "{{ account.become.ansible_user | default('') }}" @@ -95,7 +95,7 @@ login_port: "{{ jms_asset.port }}" login_user: "{{ account.username }}" login_private_key_path: "{{ account.private_key_path }}" - gateway_args: "{{ jms_asset.ansible_ssh_common_args | default('') }}" + gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" when: account.secret_type == "ssh_key" delegate_to: localhost diff --git a/apps/accounts/automations/push_account/host/posix/main.yml b/apps/accounts/automations/push_account/host/posix/main.yml index 8bc433f5a..83aa34206 100644 --- a/apps/accounts/automations/push_account/host/posix/main.yml +++ b/apps/accounts/automations/push_account/host/posix/main.yml @@ -79,7 +79,7 @@ login_password: "{{ account.secret }}" login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" - gateway_args: "{{ jms_asset.ansible_ssh_common_args | default('') }}" + gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" become: "{{ account.become.ansible_become | default(False) }}" become_method: su become_user: "{{ account.become.ansible_user | default('') }}" @@ -95,7 +95,7 @@ login_port: "{{ jms_asset.port }}" login_user: "{{ account.username }}" login_private_key_path: "{{ account.private_key_path }}" - gateway_args: "{{ jms_asset.ansible_ssh_common_args | default('') }}" + gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" when: account.secret_type == "ssh_key" delegate_to: localhost diff --git a/apps/accounts/automations/push_account/host/windows_rdp_verify/main.yml b/apps/accounts/automations/push_account/host/windows_rdp_verify/main.yml index 29f4fb022..e15b5889e 100644 --- a/apps/accounts/automations/push_account/host/windows_rdp_verify/main.yml +++ b/apps/accounts/automations/push_account/host/windows_rdp_verify/main.yml @@ -25,11 +25,11 @@ - name: Verify password (pyfreerdp) rdp_ping: - login_host: "{{ jms_asset.address }}" + login_host: "{{ jms_asset.origin_address }}" login_port: "{{ jms_asset.protocols | selectattr('name', 'equalto', 'rdp') | map(attribute='port') | first }}" login_user: "{{ account.username }}" login_password: "{{ account.secret }}" login_secret_type: "{{ account.secret_type }}" - login_private_key_path: "{{ account.private_key_path }}" + gateway_args: "{{ jms_gateway | default(None) }}" when: account.secret_type == "password" delegate_to: localhost diff --git a/apps/accounts/automations/verify_account/custom/rdp/main.yml b/apps/accounts/automations/verify_account/custom/rdp/main.yml index 2d8bcb883..33ee8282b 100644 --- a/apps/accounts/automations/verify_account/custom/rdp/main.yml +++ b/apps/accounts/automations/verify_account/custom/rdp/main.yml @@ -13,4 +13,3 @@ login_user: "{{ account.username }}" login_password: "{{ account.secret }}" login_secret_type: "{{ account.secret_type }}" - login_private_key_path: "{{ account.private_key_path }}" diff --git a/apps/assets/automations/ping/custom/rdp/main.yml b/apps/assets/automations/ping/custom/rdp/main.yml index c0808e976..bcf07c15c 100644 --- a/apps/assets/automations/ping/custom/rdp/main.yml +++ b/apps/assets/automations/ping/custom/rdp/main.yml @@ -13,4 +13,3 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_secret_type: "{{ jms_account.secret_type }}" - login_private_key_path: "{{ jms_account.private_key_path }}" diff --git a/apps/libs/ansible/modules/rdp_ping.py b/apps/libs/ansible/modules/rdp_ping.py index 6098f155d..bfbac2211 100644 --- a/apps/libs/ansible/modules/rdp_ping.py +++ b/apps/libs/ansible/modules/rdp_ping.py @@ -36,7 +36,8 @@ conn_err_msg: ''' import pyfreerdp -from typing import NamedTuple +import multiprocessing +from sshtunnel import SSHTunnelForwarder from ansible.module_utils.basic import AnsibleModule @@ -44,12 +45,6 @@ from ansible.module_utils.basic import AnsibleModule # Module execution. # -class Param(NamedTuple): - hostname: str - port: int - username: str - password: str - def common_argument_spec(): options = dict( @@ -58,37 +53,102 @@ def common_argument_spec(): login_user=dict(type='str', required=False, default='root'), login_password=dict(type='str', required=False, no_log=True), login_secret_type=dict(type='str', required=False, default='password'), - login_private_key_path=dict(type='str', required=False, no_log=True), + gateway_args=dict(type='dict', required=False, default=None), ) return options -def main(): - options = common_argument_spec() - module = AnsibleModule(argument_spec=options, supports_check_mode=True) - result = {'changed': False, 'is_available': False} - - secret_type = module.params['login_secret_type'] - if secret_type != 'password': - module.fail_json( - msg=f'The current ansible does not support \ - the verification method for {secret_type} types.' +class RDPConnectionManager: + + def __init__(self, module_params): + self.params = module_params + self.ssh_tunnel = None + self.connection_details = self.build_connection_details() + self.result_queue = multiprocessing.Queue() + + def build_connection_details(self): + connection_details = { + 'hostname': self.params['login_host'], + 'port': self.params['login_port'], + 'username': self.params['username'], + 'password': self.params['password'] + } + return connection_details + + def setup_ssh_tunnel(self): + gateway_args = self.params['gateway_args'] or {} + if not gateway_args: + return + + tunnel = SSHTunnelForwarder( + (gateway_args['address'], gateway_args['port']), + ssh_username=gateway_args['username'], + ssh_password=gateway_args['secret'], + ssh_pkey=gateway_args['private_key_path'], + remote_bind_address=( + self.connection_details['hostname'], + self.connection_details['port'] + ) ) - return module.exit_json(**result) - params = Param( - hostname=module.params['login_host'], - port=module.params['login_port'], - username=module.params['login_user'], - password=module.params['login_password'] - ) + tunnel.start() + self.connection_details['hostname'] = '127.0.0.1' + self.connection_details['port'] = tunnel.local_bind_port + self.ssh_tunnel = tunnel + + def close_ssh_tunnel(self): + if self.ssh_tunnel: + self.ssh_tunnel.stop() + + def prepare_connection(self): + self.setup_ssh_tunnel() + + def cleanup_connection(self): + self.close_ssh_tunnel() + + def check_rdp_connectivity(self): + connect_params = list(self.connection_details.values()) + ['', 0] + is_reachable = pyfreerdp.check_connectivity(*connect_params) + self.result_queue.put(is_reachable) + + def attempt_connection(self): + if self.params['login_secret_type'] != 'password': + error_message = f'unsupported authentication method: {self.params["login_secret_type"]}' + return False, error_message - is_available = pyfreerdp.check_connectivity(*params, '', 0) + try: + self.prepare_connection() + + connection_process = multiprocessing.Process( + target=self.check_rdp_connectivity + ) + connection_process.start() + connection_process.join() + + is_reachable = self.result_queue.get() + self.cleanup_connection() + + if not is_reachable: + return False, 'RDP connection failed' + except Exception as ex: + return False, str(ex) + return True, '' + + +def main(): + argument_spec = common_argument_spec() + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + result = {'changed': False} + module_params = module.params + rdp_manager = RDPConnectionManager(module_params) + is_available, error_message = rdp_manager.attempt_connection() result['is_available'] = is_available + if not is_available: - module.fail_json(msg='Unable to connect to asset.') + module.fail_json(msg=f'Unable to connect to asset: {error_message}') + return module.exit_json(**result) if __name__ == '__main__': - main() + main() \ No newline at end of file diff --git a/apps/libs/ansible/modules_utils/custom_common.py b/apps/libs/ansible/modules_utils/custom_common.py index f27446e9e..c70fba275 100644 --- a/apps/libs/ansible/modules_utils/custom_common.py +++ b/apps/libs/ansible/modules_utils/custom_common.py @@ -151,10 +151,8 @@ class SSHClient: gateway_server = self.gateway_server if not gateway_server: return - try: - gateway_server.stop() - except Exception: - pass + + gateway_server.stop() def before_runner_start(self): self.local_gateway_prepare() diff --git a/apps/ops/ansible/inventory.py b/apps/ops/ansible/inventory.py index fde3f290b..09bfd0f39 100644 --- a/apps/ops/ansible/inventory.py +++ b/apps/ops/ansible/inventory.py @@ -187,6 +187,7 @@ class JMSInventory: 'protocol': protocol.name, 'port': protocol.port, 'spec_info': asset.spec_info, 'secret_info': secret_info, 'protocols': [{'name': p.name, 'port': p.port} for p in protocols], + 'origin_address': asset.address }, 'jms_account': { 'id': str(account.id), 'username': account.username, From 93627e4f9dd6468c68e8d9ae218d64d1f1bf1758 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 15 Aug 2024 16:01:48 +0800 Subject: [PATCH 02/98] perf: clean site packages --- Dockerfile-base | 4 +- poetry.lock | 282 +---------------------------------- pyproject.toml | 2 - receptor | 168 --------------------- utils/clean_site_packages.sh | 36 +++++ 5 files changed, 40 insertions(+), 452 deletions(-) delete mode 100755 receptor create mode 100644 utils/clean_site_packages.sh diff --git a/Dockerfile-base b/Dockerfile-base index 067cad40e..732798d8b 100644 --- a/Dockerfile-base +++ b/Dockerfile-base @@ -46,9 +46,11 @@ ARG PIP_MIRROR=https://pypi.org/simple RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=core \ --mount=type=bind,source=poetry.lock,target=poetry.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + --mount=type=bind,source=utils/clean_site_packages.sh,target=clean_site_packages.sh \ set -ex \ && python3 -m venv /opt/py3 \ && pip install poetry -i ${PIP_MIRROR} \ && poetry config virtualenvs.create false \ && . /opt/py3/bin/activate \ - && poetry install --only main + && poetry install --only main \ + && bash clean_site_packages.sh diff --git a/poetry.lock b/poetry.lock index 04bd3f7e7..dd4ac20dc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -539,22 +539,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "appnope" -version = "0.1.4" -description = "Disable App Nap on macOS >= 10.9" -optional = false -python-versions = ">=3.6" -files = [ - {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, - {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, -] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "asgiref" version = "3.8.1" @@ -590,29 +574,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "asttokens" -version = "2.4.1" -description = "Annotate AST trees with source code positions" -optional = false -python-versions = "*" -files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, -] - -[package.dependencies] -six = ">=1.12.0" - -[package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "async-timeout" version = "4.0.3" @@ -879,22 +840,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "bce-python-sdk" version = "0.8.87" @@ -2549,25 +2494,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "executing" -version = "2.0.1" -description = "Get the currently executing AST node of a frame, and other information" -optional = false -python-versions = ">=3.5" -files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, -] - -[package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "fido2" version = "1.1.3" @@ -3349,49 +3275,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "ipython" -version = "8.14.0" -description = "IPython: Productive Interactive Computing" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ipython-8.14.0-py3-none-any.whl", hash = "sha256:248aca623f5c99a6635bc3857677b7320b9b8039f99f070ee0d20a5ca5a8e6bf"}, - {file = "ipython-8.14.0.tar.gz", hash = "sha256:1d197b907b6ba441b692c48cf2a3a2de280dc0ac91a3405b39349a50272ca0a1"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" - -[package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "iso8601" version = "2.1.0" @@ -3459,30 +3342,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "jedi" -version = "0.19.1" -description = "An autocompletion tool for Python that can be used for text editors." -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, -] - -[package.dependencies] -parso = ">=0.8.3,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "jinja2" version = "3.1.2" @@ -3972,25 +3831,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -description = "Inline Matplotlib backend for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, -] - -[package.dependencies] -traitlets = "*" - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "maxminddb" version = "2.6.2" @@ -4768,26 +4608,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "parso" -version = "0.8.4" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, -] - -[package.extras] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["docopt", "pytest"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "passlib" version = "1.7.4" @@ -4861,22 +4681,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "pillow" version = "10.0.1" @@ -5219,25 +5023,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -optional = false -python-versions = "*" -files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] - -[package.extras] -tests = ["pytest"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "pyasn1" version = "0.5.0" @@ -6429,27 +6214,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "receptorctl" -version = "1.4.8" -description = "\"Receptorctl is a front-end CLI and importable Python library that interacts with Receptor over its control socket interface.\"" -optional = false -python-versions = "*" -files = [ - {file = "receptorctl-1.4.8-py3-none-any.whl", hash = "sha256:468d949f85bb50de9fd77cf5af2c173450b346fada787e3907a16f161aff17d6"}, - {file = "receptorctl-1.4.8.tar.gz", hash = "sha256:5cf94bec214641506f8f956247c40cb8cc73e84b1a2490a125e49d35159dfa62"}, -] - -[package.dependencies] -click = "*" -python-dateutil = "*" -pyyaml = "*" - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "redis" version = "5.0.3" @@ -6968,30 +6732,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "stack-data" -version = "0.6.3" -description = "Extract data from python stack frames and tracebacks for informative displays" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, - {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "stevedore" version = "5.2.0" @@ -7115,26 +6855,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "traitlets" -version = "5.14.3" -description = "Traitlets Python configuration system" -optional = false -python-versions = ">=3.8" -files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "treelib" version = "1.6.4" @@ -7981,4 +7701,4 @@ reference = "aliyun" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "54e8ab1d59a70cc6857323145725f13f0ae48eb5f286683bb7d0c7bebb31fb45" +content-hash = "2dc429e66e78ab1e264e26da60df6a67cb8d5e501d80297332d673646bc0cf13" diff --git a/pyproject.toml b/pyproject.toml index 518609273..f0ad19047 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -135,7 +135,6 @@ pyopenssl = "23.2.0" redis = { url = "https://github.com/jumpserver-dev/redis-py/archive/refs/tags/v5.0.3.zip" } pymongo = "4.4.1" pyfreerdp = "0.0.2" -ipython = "8.14.0" forgerypy3 = "0.3.1" django-debug-toolbar = "4.1.0" pympler = "1.0.1" @@ -156,7 +155,6 @@ xlsxwriter = "^3.1.9" exchangelib = "^5.1.0" xmlsec = "^1.3.13" lxml = "5.2.1" -receptorctl = "^1.4.5" pydantic = "^2.7.4" annotated-types = "^0.6.0" httpx = "^0.27.0" diff --git a/receptor b/receptor deleted file mode 100755 index cd1e54d16..000000000 --- a/receptor +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python3 -# coding: utf-8 - -import argparse -import logging -import os -import shutil -import signal -import subprocess -import tempfile - -from apps.libs.process.ssh import kill_ansible_ssh_process - -ANSIBLE_RUNNER_COMMAND = "ansible-runner" - -PROJECT_DIR = os.path.dirname(os.path.abspath(__file__)) -APPS_DIR = os.path.join(PROJECT_DIR, 'apps') -TEMP_DIR = os.path.join(PROJECT_DIR, "tmp") - -DEFAULT_SHARE_DIR = os.path.join(PROJECT_DIR, "data", "share") -DEFAULT_ANSIBLE_MODULES_DIR = os.path.join(APPS_DIR, "libs", "ansible", "modules") -DEFAULT_CONTROL_SOCK_PATH = os.path.join(DEFAULT_SHARE_DIR, "control.sock") - -DEFAULT_TCP_LISTEN_ADDRESS = "0.0.0.0:7521" - -logger = logging.getLogger(__name__) - -os.chdir(APPS_DIR) - - -class ReceptorService: - def __init__(self): - self.pid_file = os.path.join(TEMP_DIR, "receptor.pid") - self.receptor_command = [ - 'receptor', - '--local-only', - '--node', 'id=primary', - '--log-level', 'level=Error', - '--control-service', - 'service=control', - 'tcplisten={}'.format(DEFAULT_TCP_LISTEN_ADDRESS), - '--work-command', - 'worktype={}'.format(ANSIBLE_RUNNER_COMMAND), - 'command={}'.format(ANSIBLE_RUNNER_COMMAND), - 'params=worker', - 'allowruntimeparams=true', - '--work-command', - 'worktype={}'.format("kill"), - 'command={}'.format("python"), - "params={} kill".format(os.path.join(PROJECT_DIR, "receptor")), - 'allowruntimeparams=true' - ] - - - @staticmethod - def before_start(): - os.makedirs(os.path.join(DEFAULT_SHARE_DIR), exist_ok=True) - status_dir = os.path.join(tempfile.gettempdir(), "receptor") - if os.path.exists(status_dir): - shutil.rmtree(status_dir) - - def start(self): - self.before_start() - if os.path.exists(self.pid_file): - with open(self.pid_file, 'r') as f: - pid_str = f.read() - try: - pid = int(pid_str) - os.kill(pid, 0) - print("\n- Receptor service is already running.") - return - except ProcessLookupError: - print("\n- PID file exists but process does not, starting Receptor...") - except ValueError: - print("\n- PID file is corrupted, starting Receptor...") - os.remove(self.pid_file) - - os.environ.setdefault('ANSIBLE_LIBRARY', DEFAULT_ANSIBLE_MODULES_DIR) - os.environ.update({'PYTHONPATH': APPS_DIR}) - process = subprocess.Popen(self.receptor_command) - with open(self.pid_file, 'w') as f: - f.write(str(process.pid)) - print("\n- Receptor service started successfully.") - - def exit_handler(signum, frame): - process.terminate() - process.kill() - - signal.signal(signal.SIGINT, exit_handler) - signal.signal(signal.SIGTERM, exit_handler) - process.wait() - - def stop(self): - if not os.path.exists(self.pid_file): - print("\n- Receptor service is not running.") - return - with open(self.pid_file, 'r') as f: - pid = int(f.read()) - try: - os.kill(pid, signal.SIGTERM) - os.remove(self.pid_file) - print("\n- Receptor service stopped successfully.") - except ProcessLookupError: - print("\n- Failed to stop Receptor service: Process does not exist.") - os.remove(self.pid_file) - - def restart(self): - self.stop() - self.start() - - def status(self): - if os.path.exists(self.pid_file): - with open(self.pid_file, 'r') as f: - pid_str = f.read() - try: - pid = int(pid_str) - os.kill(pid, 0) - print("\n- Receptor service is running.") - return - except ProcessLookupError: - print("\n- Receptor service is not running.") - else: - print("\n- Receptor service is not running.") - - -def handle_receptor_action(args): - action = args.action - srv = ReceptorService() - if action == "start": - srv.start() - elif action == 'stop': - srv.stop() - elif action == "restart": - srv.restart() - elif action == "status": - srv.status() - elif action == "kill": - kill_progress_tree() - - -def kill_progress_tree(pid=None): - if not pid: - try: - pid_input = input() - pid = int(pid_input) - logger.info("progress {} will be kill".format(pid)) - kill_ansible_ssh_process(pid) - except Exception as e: - logger.error(e) - return - - -if __name__ == '__main__': - parser = argparse.ArgumentParser( - description=""" - Jumpserver receptor service control tools; - """ - ) - parser.add_argument( - 'action', type=str, - choices=("start", "stop", "restart", "status", "kill"), - help="Action to run" - ) - - # parser.add_argument('--pid', type=int, default=42, help='what PID you want to kill') - - args = parser.parse_args() - handle_receptor_action(args) diff --git a/utils/clean_site_packages.sh b/utils/clean_site_packages.sh new file mode 100644 index 000000000..47f7358ba --- /dev/null +++ b/utils/clean_site_packages.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# + +lib_path="/opt/py3/lib/python3.11/site-packages" + +# 清理不需要的模块 +need_clean="jedi botocore/data" +for i in $need_clean; do + rm -rf "${lib_path}/${i}" +done + +# 清理 ansible connection 中 不需要的模块 +ansible_connection="${lib_path}/ansible_collections" +need_clean="fortinet dellemc f5networks netapp theforeman google azure cyberark ibm + netbox purestorage inspur netapp_eseries sensu check_point vyos arista" +for i in $need_clean; do + echo "rm -rf ${ansible_connection:-tmp}/${i}" + rm -rf "${ansible_connection:-tmp}/${i}" +done + +# 清理缓存文件 +cd lib_path +find . -name "*.pyc" -exec rm -f {} \; + +# 清理不需要的国际化文件 +find . -name 'locale' -o -name 'locales' -type d | while read -r dir; do + find "$dir" -mindepth 1 -maxdepth 1 -type d \ + ! -name 'zh_Hans' \ + ! -name 'zh_Hant' \ + ! -name 'zh_CN' \ + ! -name 'en' \ + ! -name 'en_US' \ + ! -name 'ja' \ + ! -name 'fr' \ + -exec rm -rf {} \; +done From 657f7f822b023c8cb9ef2d095cf6924f21cb924e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Aug 2024 08:24:45 +0000 Subject: [PATCH 03/98] perf: Update Dockerfile with new base image tag --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e487f250e..082eddeaa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM jumpserver/core-base:20240808_054051 AS stage-build +FROM jumpserver/core-base:20240815_080231 AS stage-build ARG VERSION From 828582333d10647de055000fbcc64030287e318f Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 19 Aug 2024 11:13:28 +0800 Subject: [PATCH 04/98] perf: remove ansible receptcel --- apps/ops/ansible/interface.py | 5 +- apps/ops/ansible/runners/__init__.py | 1 - apps/ops/ansible/runners/receptor.py | 100 ------------------ .../ansible/runners/receptorctl/__init__.py | 0 .../runners/receptorctl/receptorctl.py | 38 ------- apps/templates/resource_download.html | 29 +++-- 6 files changed, 16 insertions(+), 157 deletions(-) delete mode 100644 apps/ops/ansible/runners/receptor.py delete mode 100644 apps/ops/ansible/runners/receptorctl/__init__.py delete mode 100644 apps/ops/ansible/runners/receptorctl/receptorctl.py diff --git a/apps/ops/ansible/interface.py b/apps/ops/ansible/interface.py index a11df97c7..cd6124fab 100644 --- a/apps/ops/ansible/interface.py +++ b/apps/ops/ansible/interface.py @@ -1,7 +1,7 @@ from django.conf import settings from django.utils.functional import LazyObject -from ops.ansible import AnsibleReceptorRunner, AnsibleNativeRunner +from ops.ansible import AnsibleNativeRunner from ops.ansible.runners.base import BaseRunner __all__ = ['interface'] @@ -14,8 +14,7 @@ class _LazyRunnerInterface(LazyObject): @staticmethod def make_interface(): - runner_type = AnsibleReceptorRunner \ - if settings.RECEPTOR_ENABLED else AnsibleNativeRunner + runner_type = AnsibleNativeRunner gateway_host = settings.ANSIBLE_RECEPTOR_GATEWAY_PROXY_HOST \ if settings.ANSIBLE_RECEPTOR_GATEWAY_PROXY_HOST else '127.0.0.1' return RunnerInterface(runner_type=runner_type, gateway_proxy_host=gateway_host) diff --git a/apps/ops/ansible/runners/__init__.py b/apps/ops/ansible/runners/__init__.py index 155e1b8e1..78ce5ed28 100644 --- a/apps/ops/ansible/runners/__init__.py +++ b/apps/ops/ansible/runners/__init__.py @@ -1,3 +1,2 @@ from .base import * from .native import * -from .receptor import * diff --git a/apps/ops/ansible/runners/receptor.py b/apps/ops/ansible/runners/receptor.py deleted file mode 100644 index 1cc1de12c..000000000 --- a/apps/ops/ansible/runners/receptor.py +++ /dev/null @@ -1,100 +0,0 @@ -import concurrent.futures -import os -import queue -import socket - -import ansible_runner - -from ops.ansible.cleaner import cleanup_post_run -from ops.ansible.runners.receptorctl.receptorctl import ReceptorCtl -from ops.ansible.runners.base import BaseRunner - -__all__ = ['AnsibleReceptorRunner'] - -receptor_ctl = ReceptorCtl() - - -class AnsibleReceptorRunner(BaseRunner): - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.unit_id = None - self.stdout_queue = None - - @classmethod - def kill_precess(cls, pid): - return receptor_ctl.kill_process(pid) - - def write_unit_id(self): - if not self.unit_id: - return - private_dir = self.runner_params.get("private_data_dir", "") - with open(os.path.join(private_dir, "local.unitid"), "w") as f: - f.write(self.unit_id) - f.flush() - - @cleanup_post_run - def run(self): - input, output = socket.socketpair() - - with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor: - transmitter_future = executor.submit(self.transmit, input) - result = receptor_ctl.submit_work(payload=output.makefile('rb'), - node='primary', worktype='ansible-runner') - - input.close() - output.close() - - self.unit_id = result['unitid'] - self.write_unit_id() - - transmitter_future.result() - - result_file = receptor_ctl.get_work_results(self.unit_id, return_sockfile=True) - - self.stdout_queue = queue.Queue() - - with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor: - processor_future = executor.submit(self.processor, result_file) - - while not processor_future.done() or \ - not self.stdout_queue.empty(): - msg = self.stdout_queue.get() - if msg is None: - break - print(msg) - - return processor_future.result() - - def transmit(self, _socket): - try: - ansible_runner.run( - streamer='transmit', - _output=_socket.makefile('wb'), - **self.runner_params - ) - finally: - _socket.shutdown(socket.SHUT_WR) - - def get_event_handler(self): - _event_handler = super().get_event_handler() - - def _handler(data, **kwargs): - stdout = data.get('stdout', '') - if stdout: - self.stdout_queue.put(stdout) - _event_handler(data, **kwargs) - - return _handler - - def processor(self, _result_file): - try: - return ansible_runner.interface.run( - quite=True, - streamer='process', - _input=_result_file, - event_handler=self.get_event_handler(), - status_handler=self.get_status_handler(), - **self.runner_params, - ) - finally: - self.stdout_queue.put(None) diff --git a/apps/ops/ansible/runners/receptorctl/__init__.py b/apps/ops/ansible/runners/receptorctl/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/ops/ansible/runners/receptorctl/receptorctl.py b/apps/ops/ansible/runners/receptorctl/receptorctl.py deleted file mode 100644 index 0c3d44c10..000000000 --- a/apps/ops/ansible/runners/receptorctl/receptorctl.py +++ /dev/null @@ -1,38 +0,0 @@ -from django.conf import settings -from receptorctl import ReceptorControl - - -class ReceptorCtl: - @property - def ctl(self): - return ReceptorControl("tcp://{}".format(settings.ANSIBLE_RECEPTOR_TCP_LISTEN_ADDRESS)) - - def cancel(self, unit_id): - return self.ctl.simple_command("work cancel {}".format(unit_id)) - - def nodes(self): - return self.ctl.simple_command("status").get("Advertisements", None) - - def submit_work(self, - worktype, - payload, - node=None, - tlsclient=None, - ttl=None, - signwork=False, - params=None, ): - return self.ctl.submit_work(worktype, payload, node, tlsclient, ttl, signwork, params) - - def get_work_results(self, unit_id, startpos=0, return_socket=False, return_sockfile=True): - return self.ctl.get_work_results(unit_id, startpos, return_socket, return_sockfile) - - def kill_process(self, pid): - submit_result = self.submit_work(worktype="kill", node="primary", payload=str(pid)) - unit_id = submit_result["unitid"] - result_socket, result_file = self.get_work_results(unit_id=unit_id, return_sockfile=True, - return_socket=True) - while not result_socket.close(): - buf = result_file.read() - if not buf: - break - print(buf.decode('utf8')) diff --git a/apps/templates/resource_download.html b/apps/templates/resource_download.html index 808b32d59..512626d72 100644 --- a/apps/templates/resource_download.html +++ b/apps/templates/resource_download.html @@ -52,28 +52,27 @@ p { - {% endblock %} From 181eb621c01f9a1cde2a3245b40c809d5803be11 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 19 Aug 2024 16:04:00 +0800 Subject: [PATCH 05/98] perf: Remove kubernetes tree api (#13995) * perf: Remove kubernetes tree api * perf: Update Dockerfile with new base image tag --------- Co-authored-by: feng <1304903146@qq.com> Co-authored-by: github-actions[bot] Co-authored-by: feng626 <57284900+feng626@users.noreply.github.com> --- apps/assets/utils/__init__.py | 1 - apps/assets/utils/k8s.py | 177 ------------------ .../user_permission/tree/node_with_asset.py | 63 +------ apps/perms/urls/user_permission.py | 3 - poetry.lock | 33 +--- pyproject.toml | 1 - 6 files changed, 2 insertions(+), 276 deletions(-) delete mode 100644 apps/assets/utils/k8s.py diff --git a/apps/assets/utils/__init__.py b/apps/assets/utils/__init__.py index 9f588b6d2..97431995d 100644 --- a/apps/assets/utils/__init__.py +++ b/apps/assets/utils/__init__.py @@ -1,2 +1 @@ -from .k8s import * from .node import * diff --git a/apps/assets/utils/k8s.py b/apps/assets/utils/k8s.py deleted file mode 100644 index 8e1069566..000000000 --- a/apps/assets/utils/k8s.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- -from urllib.parse import urlencode, urlparse - -from kubernetes import client -from kubernetes.client import api_client -from kubernetes.client.api import core_v1_api -from sshtunnel import SSHTunnelForwarder, BaseSSHTunnelForwarderError - -from common.utils import get_logger -from ..const import CloudTypes, Category - -logger = get_logger(__file__) - - -class KubernetesClient: - def __init__(self, asset, token): - self.url = asset.address - self.token = token or '' - self.server = self.get_gateway_server(asset) - - @property - def api(self): - configuration = client.Configuration() - scheme = urlparse(self.url).scheme - if not self.server: - host = self.url - else: - host = f'{scheme}://127.0.0.1:{self.server.local_bind_port}' - configuration.host = host - configuration.verify_ssl = False - configuration.api_key = {"authorization": "Bearer " + self.token} - c = api_client.ApiClient(configuration=configuration) - api = core_v1_api.CoreV1Api(c) - return api - - def get_namespaces(self): - namespaces = [] - resp = self.api.list_namespace() - for ns in resp.items: - namespaces.append(ns.metadata.name) - return namespaces - - def get_pods(self, namespace): - pods = [] - resp = self.api.list_namespaced_pod(namespace) - for pd in resp.items: - pods.append(pd.metadata.name) - return pods - - def get_containers(self, namespace, pod_name): - containers = [] - resp = self.api.read_namespaced_pod(pod_name, namespace) - for container in resp.spec.containers: - containers.append(container.name) - return containers - - @staticmethod - def get_gateway_server(asset): - gateway = None - if not asset.is_gateway and asset.domain: - gateway = asset.domain.select_gateway() - - if not gateway: - return - - remote_bind_address = ( - urlparse(asset.address).hostname, - urlparse(asset.address).port or 443 - ) - server = SSHTunnelForwarder( - (gateway.address, gateway.port), - ssh_username=gateway.username, - ssh_password=gateway.password, - ssh_pkey=gateway.private_key_path, - remote_bind_address=remote_bind_address - ) - try: - server.start() - except BaseSSHTunnelForwarderError: - err_msg = 'Gateway is not active: %s' % asset.get('name', '') - print('\033[31m %s \033[0m\n' % err_msg) - return server - - def run(self, tp, *args): - func_name = f'get_{tp}s' - data = [] - if hasattr(self, func_name): - try: - data = getattr(self, func_name)(*args) - except Exception as e: - logger.error(f'K8S tree get {tp} error: {e}') - - if self.server: - self.server.stop() - return data - - -class KubernetesTree: - def __init__(self, asset, secret): - self.asset = asset - self.secret = secret - - def as_asset_tree_node(self): - i = str(self.asset.id) - name = str(self.asset) - node = self.create_tree_node( - i, i, name, 'asset', icon='k8s', is_open=True, - ) - return node - - def as_namespace_node(self, name, tp): - i = urlencode({'namespace': name}) - pid = str(self.asset.id) - node = self.create_tree_node(i, pid, name, tp, icon='cloud') - return node - - def as_pod_tree_node(self, namespace, name, tp): - pid = urlencode({'namespace': namespace}) - i = urlencode({'namespace': namespace, 'pod': name}) - node = self.create_tree_node(i, pid, name, tp, icon='cloud') - return node - - def as_container_tree_node(self, namespace, pod, name, tp): - pid = urlencode({'namespace': namespace, 'pod': pod}) - i = urlencode({'namespace': namespace, 'pod': pod, 'container': name}) - node = self.create_tree_node( - i, pid, name, tp, icon='cloud', is_container=True - ) - return node - - @staticmethod - def create_tree_node(id_, pid, name, identity, icon='', is_container=False, is_open=False): - node = { - 'id': id_, - 'name': name, - 'title': name, - 'pId': pid, - 'isParent': not is_container, - 'open': is_open, - 'iconSkin': icon, - 'meta': { - 'type': 'k8s', - 'data': { - 'category': Category.CLOUD, - 'type': CloudTypes.K8S, - 'identity': identity - } - } - } - return node - - def async_tree_node(self, namespace, pod): - tree = [] - k8s_client = KubernetesClient(self.asset, self.secret) - if pod: - tp = 'container' - containers = k8s_client.run( - tp, namespace, pod - ) - for container in containers: - container_node = self.as_container_tree_node( - namespace, pod, container, tp - ) - tree.append(container_node) - elif namespace: - tp = 'pod' - pods = k8s_client.run(tp, namespace) - for pod in pods: - pod_node = self.as_pod_tree_node(namespace, pod, tp) - tree.append(pod_node) - else: - tp = 'namespace' - namespaces = k8s_client.run(tp) - for namespace in namespaces: - namespace_node = self.as_namespace_node(namespace, tp) - tree.append(namespace_node) - return tree diff --git a/apps/perms/api/user_permission/tree/node_with_asset.py b/apps/perms/api/user_permission/tree/node_with_asset.py index 114c5475e..dbba179f0 100644 --- a/apps/perms/api/user_permission/tree/node_with_asset.py +++ b/apps/perms/api/user_permission/tree/node_with_asset.py @@ -1,31 +1,22 @@ import abc -from urllib.parse import parse_qsl from django.conf import settings from django.db.models import F, Value, CharField -from rest_framework.exceptions import PermissionDenied, NotFound from rest_framework.generics import ListAPIView -from rest_framework.generics import get_object_or_404 -from rest_framework.request import Request from rest_framework.response import Response -from accounts.const import AliasAccount from assets.api import SerializeToTreeNodeMixin from assets.models import Asset -from assets.utils import KubernetesTree -from authentication.models import ConnectionToken -from common.exceptions import JMSException from common.utils import get_object_or_none, lazyproperty from common.utils.common import timeit from perms.hands import Node from perms.models import PermNode -from perms.utils import PermAssetDetailUtil, UserPermNodeUtil from perms.utils import UserPermAssetUtil +from perms.utils import UserPermNodeUtil from .mixin import RebuildTreeMixin from ..mixin import SelfOrPKUserMixin __all__ = [ - 'UserGrantedK8sAsTreeApi', 'UserPermedNodesWithAssetsAsTreeApi', 'UserPermedNodeChildrenWithAssetsAsTreeApi', 'UserPermedNodeChildrenWithAssetsAsCategoryTreeApi', @@ -218,55 +209,3 @@ class UserPermedNodeChildrenWithAssetsAsCategoryTreeApi(BaseUserNodeWithAssetAsT return self.get_assets() else: return [] - - -class UserGrantedK8sAsTreeApi(SelfOrPKUserMixin, ListAPIView): - """ 用户授权的K8s树 """ - - def get_token(self): - token_id = self.request.query_params.get('token') - token = get_object_or_404(ConnectionToken, pk=token_id) - if token.is_expired: - raise PermissionDenied('Token is expired') - token.renewal() - return token - - def get_account_secret(self, token: ConnectionToken): - util = PermAssetDetailUtil(self.user, token.asset) - accounts = util.get_permed_accounts_for_user() - account_name = token.account - - if account_name in [AliasAccount.INPUT, AliasAccount.USER]: - return token.input_secret - else: - accounts = filter(lambda x: x.name == account_name, accounts) - accounts = list(accounts) - if not accounts: - raise NotFound('Account is not found') - account = accounts[0] - return account.secret - - @staticmethod - def get_namespace_and_pod(key): - namespace_and_pod = dict(parse_qsl(key)) - pod = namespace_and_pod.get('pod') - namespace = namespace_and_pod.get('namespace') - return namespace, pod - - def list(self, request: Request, *args, **kwargs): - token = self.get_token() - asset = token.asset - secret = self.get_account_secret(token) - key = self.request.query_params.get('key') - namespace, pod = self.get_namespace_and_pod(key) - - tree = [] - k8s_tree_instance = KubernetesTree(asset, secret) - if not any([namespace, pod]) and not key: - asset_node = k8s_tree_instance.as_asset_tree_node() - tree.append(asset_node) - try: - tree.extend(k8s_tree_instance.async_tree_node(namespace, pod)) - return Response(data=tree) - except Exception as e: - raise JMSException(e) diff --git a/apps/perms/urls/user_permission.py b/apps/perms/urls/user_permission.py index 0ba99087e..e17ee3218 100644 --- a/apps/perms/urls/user_permission.py +++ b/apps/perms/urls/user_permission.py @@ -47,9 +47,6 @@ user_permission_urlpatterns = [ path('/nodes/all-with-assets/tree/', api.UserPermedNodesWithAssetsAsTreeApi.as_view(), name='user-nodes-with-assets-as-tree'), - path('/nodes/children-with-k8s/tree/', - api.UserGrantedK8sAsTreeApi.as_view(), - name='user-nodes-children-with-k8s-as-tree'), ] user_group_permission_urlpatterns = [ diff --git a/poetry.lock b/poetry.lock index dd4ac20dc..051a97173 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3500,37 +3500,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "kubernetes" -version = "27.2.0" -description = "Kubernetes python client" -optional = false -python-versions = ">=3.6" -files = [ - {file = "kubernetes-27.2.0-py2.py3-none-any.whl", hash = "sha256:0f9376329c85cf07615ed6886bf9bf21eb1cbfc05e14ec7b0f74ed8153cd2815"}, - {file = "kubernetes-27.2.0.tar.gz", hash = "sha256:d479931c6f37561dbfdf28fc5f46384b1cb8b28f9db344ed4a232ce91990825a"}, -] - -[package.dependencies] -certifi = ">=14.05.14" -google-auth = ">=1.0.1" -oauthlib = ">=3.2.2" -python-dateutil = ">=2.5.3" -pyyaml = ">=5.4.1" -requests = "*" -requests-oauthlib = "*" -six = ">=1.9.0" -urllib3 = ">=1.24.2" -websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" - -[package.extras] -adal = ["adal (>=1.0.2)"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "ldap3" version = "2.9.1" @@ -7701,4 +7670,4 @@ reference = "aliyun" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "2dc429e66e78ab1e264e26da60df6a67cb8d5e501d80297332d673646bc0cf13" +content-hash = "9acfafd75bf7dbb7e0dffb54b7f11f6b09aa4ceff769d193a3906d03ae796ccc" diff --git a/pyproject.toml b/pyproject.toml index f0ad19047..9b2047f6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -126,7 +126,6 @@ django-auth-ldap = "4.4.0" boto3 = "1.28.9" botocore = "1.31.9" s3transfer = "0.6.1" -kubernetes = "27.2.0" mysqlclient = "2.2.4" pymssql = "2.2.8" django-redis = "5.3.0" From dac118dd263aac021dd6b2ef776cdeff100bce76 Mon Sep 17 00:00:00 2001 From: Bai Date: Mon, 19 Aug 2024 15:40:20 +0800 Subject: [PATCH 06/98] perf: delete organization message --- apps/i18n/lina/en.json | 4 ++-- apps/i18n/lina/ja.json | 2 +- apps/i18n/lina/zh.json | 4 ++-- apps/i18n/lina/zh_hant.json | 2 +- apps/orgs/api.py | 3 +-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index ce4363af4..51d3d35e0 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -416,8 +416,8 @@ "DeleteConfirmMessage": "Deletion is irreversible, do you wish to continue?", "DeleteErrorMsg": "Delete failed", "DeleteNode": "Delete node", - "DeleteOrgMsg": "User list, user group, asset list, network zone list, manage users, system users, tag management, asset authorization rules", - "DeleteOrgTitle": "Please ensure the following information within the organization has been deleted", + "DeleteOrgMsg": "User, User group, Asset, Node, Label, Zone, Authorization", + "DeleteOrgTitle": "Please delete the following resources within the organization first", "DeleteReleasedAssets": "Delete released assets", "DeleteSelected": "Delete selected", "DeleteSuccess": "Successfully deleted", diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json index d1527e0fa..80f2ec5a8 100644 --- a/apps/i18n/lina/ja.json +++ b/apps/i18n/lina/ja.json @@ -431,7 +431,7 @@ "DeleteConfirmMessage": "一度削除すると復元はできません、続けますか?", "DeleteErrorMsg": "削除に失敗", "DeleteNode": "ノードを削除", - "DeleteOrgMsg": "ユーザーリスト、ユーザーグループ、資産リスト、ネットワークリスト、ユーザー管理、システムユーザー、タグ管理、資産承認ルール", + "DeleteOrgMsg": "ユーザー、ユーザーグループ、アセット、ノード、ラベル、ドメイン、アセットの認可", "DeleteOrgTitle": "以下の組織内の情報が削除されたことを確認してください", "DeleteReleasedAssets": "リリースされたアセットの削除", "DeleteSelected": "選択した項目を削除する", diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index f73ba2b88..447025f7e 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -416,8 +416,8 @@ "DeleteConfirmMessage": "删除后无法恢复,是否继续?", "DeleteErrorMsg": "删除失败", "DeleteNode": "删除节点", - "DeleteOrgMsg": "用户列表、用户组、资产列表、网域列表、管理用户、系统用户、标签管理、资产授权规则", - "DeleteOrgTitle": "请确保组织内的以下信息已删除", + "DeleteOrgMsg": "用户,用户组,资产,节点,标签,网域,资产授权", + "DeleteOrgTitle": "请确保组织内的以下资源已删除", "DeleteReleasedAssets": "删除已释放资产", "DeleteSelected": "删除所选", "DeleteSuccess": "删除成功", diff --git a/apps/i18n/lina/zh_hant.json b/apps/i18n/lina/zh_hant.json index f38256e0c..f2a1fb84d 100644 --- a/apps/i18n/lina/zh_hant.json +++ b/apps/i18n/lina/zh_hant.json @@ -553,7 +553,7 @@ "DeleteErrorMsg": "刪除失敗", "DeleteFile": "刪除文件", "DeleteNode": "刪除節點", - "DeleteOrgMsg": "用戶列表、用戶組、資產列表、網域列表、管理用戶、系統用戶、標籤管理、資產授權規則", + "DeleteOrgMsg": "用戶,用戶組,資產,節點,標籤,網域,資產授權", "DeleteOrgTitle": "請確保組織內的以下資訊已刪除", "DeleteReleasedAssets": "刪除已釋放資產", "DeleteSelected": "刪除所選", diff --git a/apps/orgs/api.py b/apps/orgs/api.py index eb1a980d6..b93479c7e 100644 --- a/apps/orgs/api.py +++ b/apps/orgs/api.py @@ -24,8 +24,7 @@ logger = get_logger(__file__) # 部分 org 相关的 model,需要清空这些数据之后才能删除该组织 org_related_models = [ - User, UserGroup, Asset, Label, Domain, Node, Label, - AssetPermission, + User, UserGroup, Asset, Node, Label, Domain, AssetPermission ] From 3252db31fececbdd8c1782f346688acfeace2fe4 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Tue, 20 Aug 2024 11:28:30 +0800 Subject: [PATCH 07/98] perf: Translate --- apps/i18n/core/en/LC_MESSAGES/django.po | 2 +- apps/i18n/lina/en.json | 1 + apps/i18n/lina/ja.json | 1 + apps/i18n/lina/zh.json | 1 + apps/i18n/lina/zh_hant.json | 2 +- 5 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index 5006b894a..e44bc8d18 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -3983,7 +3983,7 @@ msgstr "" msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" -msgstr "連接失敗:使用了自簽名證書,請檢查伺服器證書配置" +msgstr "" #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index 51d3d35e0..701364796 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -446,6 +446,7 @@ "DownloadReplay": "Download recording", "DownloadUpdateTemplateMsg": "Download update template", "DragUploadFileInfo": "Drag files here, or click to upload", + "DropConfirmMsg": "Do you want to move node: {src} to {dst}?", "Duplicate": "Duplicate", "DuplicateFileExists": "Uploading a file with the same name is not allowed, please delete the file with the same name", "Duration": "Duration", diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json index 80f2ec5a8..848834c4b 100644 --- a/apps/i18n/lina/ja.json +++ b/apps/i18n/lina/ja.json @@ -461,6 +461,7 @@ "DownloadReplay": "ビデオのダウンロード", "DownloadUpdateTemplateMsg": "更新テンプレートをダウンロード", "DragUploadFileInfo": "ここにファイルをドラッグするか、ここをクリックしてアップロードしてください", + "DropConfirmMsg": "ノード: {src} を {dst} に移動しますか?", "Duplicate": "ダブリケート", "DuplicateFileExists": "同名のファイルのアップロードは許可されていません、同名のファイルを削除してください", "Duration": "時間", diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index 447025f7e..b92f37b32 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -446,6 +446,7 @@ "DownloadReplay": "下载录像", "DownloadUpdateTemplateMsg": "下载更新模板", "DragUploadFileInfo": "将文件拖到此处,或点击此处上传", + "DropConfirmMsg": "你想移动节点: {src} 到 {dst} 下吗?", "Duplicate": "副本", "DuplicateFileExists": "不允许上传同名文件,请删除同名文件", "Duration": "时长", diff --git a/apps/i18n/lina/zh_hant.json b/apps/i18n/lina/zh_hant.json index f2a1fb84d..fd2843ad7 100644 --- a/apps/i18n/lina/zh_hant.json +++ b/apps/i18n/lina/zh_hant.json @@ -595,7 +595,7 @@ "DownloadImportTemplateMsg": "下載創建模板", "DownloadReplay": "下載錄影", "DownloadUpdateTemplateMsg": "下載更新範本", - "DragUploadFileInfo": " Drag files here, or click here to upload", + "DragUploadFileInfo": " 將檔案拖曳至此處,或點擊此處上傳", "DropConfirmMsg": "你想移動節點: {src} 到 {dst} 下嗎?", "DryRun": "測試運行", "Duplicate": "Copy", From c431e96eaf38d0777b034c9d2dfd5edeaca7f882 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Wed, 21 Aug 2024 10:35:07 +0800 Subject: [PATCH 08/98] perf: View asset mini api add domain platform field --- apps/assets/serializers/asset/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/assets/serializers/asset/common.py b/apps/assets/serializers/asset/common.py index 9a6f21a11..2bbc6e451 100644 --- a/apps/assets/serializers/asset/common.py +++ b/apps/assets/serializers/asset/common.py @@ -131,9 +131,9 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa class Meta: model = Asset - fields_mini = ['id', 'name', 'address'] - fields_small = fields_mini + ['is_active', 'comment'] fields_fk = ['domain', 'platform'] + fields_mini = ['id', 'name', 'address'] + fields_fk + fields_small = fields_mini + ['is_active', 'comment'] fields_m2m = [ 'nodes', 'labels', 'protocols', 'nodes_display', 'accounts', From ecaf19563fc118917a229cfbd93f6366795ce298 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Wed, 21 Aug 2024 11:28:39 +0800 Subject: [PATCH 09/98] perf: No permission to test asset connectivity --- apps/assets/api/asset/asset.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/assets/api/asset/asset.py b/apps/assets/api/asset/asset.py index 09160b9e6..bfac3ec1c 100644 --- a/apps/assets/api/asset/asset.py +++ b/apps/assets/api/asset/asset.py @@ -298,6 +298,7 @@ class AssetsTaskCreateApi(AssetsTaskMixin, generics.CreateAPIView): def check_permissions(self, request): action_perm_require = { "refresh": "assets.refresh_assethardwareinfo", + "test": "assets.test_assetconnectivity", } _action = request.data.get("action") perm_required = action_perm_require.get(_action) From b489db8054802a3fbc809a6a376ccfda0b17554e Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 20 Aug 2024 18:08:03 +0800 Subject: [PATCH 10/98] perf: add a script activate user manually --- apps/common/apps.py | 6 +++++- utils/activate_user.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 utils/activate_user.py diff --git a/apps/common/apps.py b/apps/common/apps.py index 5fb85992a..18ed8a9a9 100644 --- a/apps/common/apps.py +++ b/apps/common/apps.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals +import os import sys from django.apps import AppConfig @@ -12,8 +13,11 @@ class CommonConfig(AppConfig): from . import signal_handlers # noqa from . import tasks # noqa from .signals import django_ready + excludes = ['migrate', 'compilemessages', 'makemigrations'] for i in excludes: if i in sys.argv: return - django_ready.send(CommonConfig) + + if not os.environ.get('DJANGO_DEBUG_SHELL'): + django_ready.send(CommonConfig) diff --git a/utils/activate_user.py b/utils/activate_user.py new file mode 100644 index 000000000..4f5170c45 --- /dev/null +++ b/utils/activate_user.py @@ -0,0 +1,42 @@ +import os +import sys + +import django + +if os.path.exists('../apps'): + sys.path.insert(0, '../apps') +elif os.path.exists('./apps'): + sys.path.insert(0, './apps') + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jumpserver.settings") +os.environ.setdefault("DJANGO_DEBUG_SHELL", "1") +django.setup() + +from users.models import User +from django.utils import timezone + + +def activate_user(username): + user = User.objects.filter(username=username).first() + if not user: + print("Not found user: ", username) + return + + print("Activate user: ", username) + user.is_active = True + + if user.is_expired: + user.date_expired = timezone.now() + timezone.timedelta(days=365) + + if user.password_has_expired: + user.date_password_last_updated = timezone.now() + + user.save() + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Usage: python activate_user.py ") + sys.exit(1) + username = sys.argv[1] + activate_user(username) From 774fd176fdf7ee2616de446235970fe548439dc4 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Tue, 27 Aug 2024 17:39:37 +0800 Subject: [PATCH 11/98] perf: Koko translate --- apps/i18n/koko/en.json | 5 ++++- apps/i18n/koko/ja.json | 5 ++++- apps/i18n/koko/zh.json | 5 ++++- apps/i18n/koko/zh_hant.json | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/i18n/koko/en.json b/apps/i18n/koko/en.json index 136efdb4b..d92a0777a 100644 --- a/apps/i18n/koko/en.json +++ b/apps/i18n/koko/en.json @@ -49,5 +49,8 @@ "User": "User", "VerifyCode": "Verify Code", "WaitFileTransfer": "Wait file transfer to finish", - "Writable": "Writable" + "Writable": "Writable", + "JoinedWithSuccess": "Successfully joined", + "KubernetesManagement": "Kubernetes management", + "WebSocketClosed": "WebSocket closed" } diff --git a/apps/i18n/koko/ja.json b/apps/i18n/koko/ja.json index 61b3438b9..8ab3c9f14 100644 --- a/apps/i18n/koko/ja.json +++ b/apps/i18n/koko/ja.json @@ -48,5 +48,8 @@ "User": "ユーザー", "VerifyCode": "認証コード", "WaitFileTransfer": "ファイル転送終了待ち", - "Writable": "書き込み可能" + "Writable": "書き込み可能", + "JoinedWithSuccess": "正常に参加しました", + "KubernetesManagement": "Kubernetes 管理", + "WebSocketClosed": "WebSocket 閉店" } \ No newline at end of file diff --git a/apps/i18n/koko/zh.json b/apps/i18n/koko/zh.json index 072b524ad..5c53c284e 100644 --- a/apps/i18n/koko/zh.json +++ b/apps/i18n/koko/zh.json @@ -49,5 +49,8 @@ "User": "用户", "VerifyCode": "验证码", "WaitFileTransfer": "等待文件传输结束", - "Writable": "读写" + "Writable": "读写", + "JoinedWithSuccess": "已成功加入", + "KubernetesManagement": "Kubernetes 管理", + "WebSocketClosed": "WebSocket 已关闭" } diff --git a/apps/i18n/koko/zh_hant.json b/apps/i18n/koko/zh_hant.json index c233ae0c7..f75f18ff1 100644 --- a/apps/i18n/koko/zh_hant.json +++ b/apps/i18n/koko/zh_hant.json @@ -48,5 +48,8 @@ "User": "用戶", "VerifyCode": "驗證碼", "WaitFileTransfer": "等待文件傳輸結束", - "Writable": "讀寫" + "Writable": "讀寫", + "JoinedWithSuccess": "已成功加入", + "KubernetesManagement": "Kubernetes 管理", + "WebSocketClosed": "WebSocket 已關閉" } \ No newline at end of file From 9554de4ea6f74d1c9140570cce4b90bb2e099261 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 28 Aug 2024 14:57:00 +0800 Subject: [PATCH 12/98] fix: User check password need reset --- apps/authentication/mixins.py | 4 ++-- apps/users/models/user/_auth.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/authentication/mixins.py b/apps/authentication/mixins.py index 99526e156..dd7713432 100644 --- a/apps/authentication/mixins.py +++ b/apps/authentication/mixins.py @@ -319,14 +319,14 @@ class AuthPostCheckMixin: @classmethod def _check_passwd_is_too_simple(cls, user: User, password): - if password == 'admin' or password == 'ChangeMe': + if user.check_passwd_too_simple(password): message = _('Your password is too simple, please change it for security') url = cls.generate_reset_password_url_with_flash_msg(user, message=message) raise errors.PasswordTooSimple(url) @classmethod def _check_passwd_need_update(cls, user: User): - if user.need_update_password: + if user.check_need_update_password(): message = _('You should to change your password before login') url = cls.generate_reset_password_url_with_flash_msg(user, message) raise errors.PasswordNeedUpdate(url) diff --git a/apps/users/models/user/_auth.py b/apps/users/models/user/_auth.py index cd38dda51..94d03c097 100644 --- a/apps/users/models/user/_auth.py +++ b/apps/users/models/user/_auth.py @@ -228,6 +228,18 @@ class AuthMixin: return True return False + def check_need_update_password(self): + if self.is_local and self.need_update_password: + return True + return False + + def check_passwd_too_simple(self, password): + backend = getattr(self, 'backend', None) + simple_passwords = ['admin', 'ChangeMe'] + if backend == settings.AUTH_BACKEND_MODEL and password in simple_passwords: + return True + return False + @staticmethod def get_public_key_md5(key): try: From 6d3d4a08aff4773636767e52039541bdcc892a03 Mon Sep 17 00:00:00 2001 From: Bryan Date: Wed, 28 Aug 2024 17:55:56 +0800 Subject: [PATCH 13/98] Update README.md (#14043) * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9c10316ed..ba092cb21 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,8 @@ Access JumpServer in your browser at `http://your-jumpserver-ip/` - Username: `admin` - Password: `ChangeMe` +[![JumpServer Quickstart](https://github.com/user-attachments/assets/0f32f52b-9935-485e-8534-336c63389612)](https://www.youtube.com/watch?v=UlGYRbKrpgY "JumpServer Quickstart") + ## Screenshots From e3bf015aa98c9652c77b26e51015e6ad55757508 Mon Sep 17 00:00:00 2001 From: Bai Date: Thu, 29 Aug 2024 14:19:55 +0800 Subject: [PATCH 14/98] fix: user role can't open page of password & ssh key --- apps/rbac/builtin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/rbac/builtin.py b/apps/rbac/builtin.py index 8498f7776..946923878 100644 --- a/apps/rbac/builtin.py +++ b/apps/rbac/builtin.py @@ -30,6 +30,7 @@ system_user_perms = ( ('authentication', 'temptoken', 'add,change,view', 'temptoken'), ('authentication', 'accesskey', '*', '*'), ('authentication', 'passkey', '*', '*'), + ('authentication', 'sshkey', '*', '*'), ('tickets', 'ticket', 'view', 'ticket'), ) system_user_perms += (user_perms + _view_all_joined_org_perms) From 25a473dc998f4b24171ffe542eb3c93d6a08c831 Mon Sep 17 00:00:00 2001 From: fit2bot Date: Wed, 28 Aug 2024 11:31:47 +0800 Subject: [PATCH 15/98] chore: update checkout action --- .github/workflows/build-base-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 1ad366a98..0c3750575 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 From b9e64747acdf55ff760e478c8f394da6a98340f8 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Tue, 27 Aug 2024 16:46:41 +0800 Subject: [PATCH 16/98] perf: View the internal message and convert the content into markdown --- .../automations/gather_accounts/manager.py | 18 ++++++------ .../accounts/asset_account_change_info.html | 29 +++++++++++++------ apps/common/utils/common.py | 12 ++++++++ apps/notifications/serializers/site_msgs.py | 8 +++++ apps/tickets/handlers/base.py | 14 ++------- 5 files changed, 52 insertions(+), 29 deletions(-) diff --git a/apps/accounts/automations/gather_accounts/manager.py b/apps/accounts/automations/gather_accounts/manager.py index f0610e331..e97d78cd0 100644 --- a/apps/accounts/automations/gather_accounts/manager.py +++ b/apps/accounts/automations/gather_accounts/manager.py @@ -95,12 +95,14 @@ class GatherAccountsManager(AccountBasePlaybookManager): return None, None users = User.objects.filter(id__in=recipients) - if not users: + if not users.exists(): return users, None asset_ids = self.asset_username_mapper.keys() - assets = Asset.objects.filter(id__in=asset_ids) + + assets = Asset.objects.filter(id__in=asset_ids).prefetch_related('accounts') gather_accounts = GatheredAccount.objects.filter(asset_id__in=asset_ids, present=True) + asset_id_map = {str(asset.id): asset for asset in assets} asset_id_username = list(assets.values_list('id', 'accounts__username')) asset_id_username.extend(list(gather_accounts.values_list('asset_id', 'username'))) @@ -109,26 +111,24 @@ class GatherAccountsManager(AccountBasePlaybookManager): for asset_id, username in asset_id_username: system_asset_username_mapper[str(asset_id)].add(username) - change_info = {} + change_info = defaultdict(dict) for asset_id, usernames in self.asset_username_mapper.items(): system_usernames = system_asset_username_mapper.get(asset_id) - if not system_usernames: continue add_usernames = usernames - system_usernames remove_usernames = system_usernames - usernames - k = f'{asset_id_map[asset_id]}[{asset_id}]' if not add_usernames and not remove_usernames: continue - change_info[k] = { - 'add_usernames': ', '.join(add_usernames), - 'remove_usernames': ', '.join(remove_usernames), + change_info[str(asset_id_map[asset_id])] = { + 'add_usernames': add_usernames, + 'remove_usernames': remove_usernames } - return users, change_info + return users, dict(change_info) @staticmethod def send_email_if_need(users, change_info): diff --git a/apps/accounts/templates/accounts/asset_account_change_info.html b/apps/accounts/templates/accounts/asset_account_change_info.html index b778b3cd3..c537dffd4 100644 --- a/apps/accounts/templates/accounts/asset_account_change_info.html +++ b/apps/accounts/templates/accounts/asset_account_change_info.html @@ -1,18 +1,29 @@ {% load i18n %} - -

{% trans 'Gather account change information' %}

-
+

+
- - - + + + {% for name, change in change_info.items %} - - - + + + {% endfor %}
{% trans 'Asset' %}{% trans 'Added account' %}{% trans 'Deleted account' %} + {% trans 'Asset' %} + + {% trans 'Added account' %} + + {% trans 'Deleted account' %} +
{{ name }}{{ change.add_usernames }}{{ change.remove_usernames }} + {{ name | safe }} + + {{ change.add_usernames | join:" " | safe }} + + {{ change.remove_usernames | join:" " | safe }} +
diff --git a/apps/common/utils/common.py b/apps/common/utils/common.py index 680e7cc1b..b2c695c74 100644 --- a/apps/common/utils/common.py +++ b/apps/common/utils/common.py @@ -13,6 +13,7 @@ from collections import OrderedDict from functools import wraps from itertools import chain +import html2text import psutil from django.conf import settings from django.templatetags.static import static @@ -421,3 +422,14 @@ def distinct(seq, key=None): def is_macos(): return platform.system() == 'Darwin' + + +def convert_html_to_markdown(html_str): + h = html2text.HTML2Text() + h.body_width = 0 + h.ignore_links = True + + markdown = h.handle(html_str) + markdown = markdown.replace('\n\n', '\n') + markdown = markdown.replace('\n ', '\n') + return markdown diff --git a/apps/notifications/serializers/site_msgs.py b/apps/notifications/serializers/site_msgs.py index 351a04eac..199e4dac8 100644 --- a/apps/notifications/serializers/site_msgs.py +++ b/apps/notifications/serializers/site_msgs.py @@ -1,6 +1,7 @@ from rest_framework import serializers from rest_framework.serializers import ModelSerializer +from common.utils import convert_html_to_markdown from ..models import MessageContent @@ -16,6 +17,8 @@ class SenderMixin(ModelSerializer): class MessageContentSerializer(SenderMixin, ModelSerializer): + message = serializers.SerializerMethodField() + class Meta: model = MessageContent fields = [ @@ -24,6 +27,11 @@ class MessageContentSerializer(SenderMixin, ModelSerializer): 'sender', ] + @staticmethod + def get_message(site_msg): + markdown = convert_html_to_markdown(site_msg.message) + return markdown + class SiteMessageSerializer(SenderMixin, ModelSerializer): content = MessageContentSerializer(read_only=True) diff --git a/apps/tickets/handlers/base.py b/apps/tickets/handlers/base.py index c74ca7a0c..702a012cd 100644 --- a/apps/tickets/handlers/base.py +++ b/apps/tickets/handlers/base.py @@ -1,8 +1,7 @@ -import html2text from django.template.loader import render_to_string from django.utils.translation import gettext as _ -from common.utils import get_logger +from common.utils import get_logger, convert_html_to_markdown from tickets.const import TicketState, TicketType from tickets.utils import ( send_ticket_processed_mail_to_applicant, @@ -97,9 +96,8 @@ class BaseHandler: approve_info = _('{} {} the ticket').format(user_display, state_display) context = self._diff_prev_approve_context(state) context.update({'approve_info': approve_info}) - body = self.safe_html_script( - render_to_string('tickets/ticket_approve_diff.html', context) - ) + html_str = render_to_string('tickets/ticket_approve_diff.html', context) + body = convert_html_to_markdown(html_str) data = { 'body': body, 'user': user, @@ -108,9 +106,3 @@ class BaseHandler: 'state': state } return self.ticket.comments.create(**data) - - @staticmethod - def safe_html_script(unsafe_html): - unsafe_html = unsafe_html.replace('\n', '') - html_str = html2text.html2text(unsafe_html) - return html_str From f866b93f96613138612db23e7439d6c6a3857209 Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 27 Aug 2024 11:32:38 +0800 Subject: [PATCH 17/98] perf: refresh oracle ports if need --- apps/terminal/utils/db_port_mapper.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/apps/terminal/utils/db_port_mapper.py b/apps/terminal/utils/db_port_mapper.py index 9878fa9ef..796632a65 100644 --- a/apps/terminal/utils/db_port_mapper.py +++ b/apps/terminal/utils/db_port_mapper.py @@ -13,7 +13,7 @@ logger = get_logger(__file__) @Singleton -class DBPortManager(object): +class DBPortManager: """ 管理端口-数据库ID的映射, Magnus 要使用 """ CACHE_KEY = 'PORT_DB_MAPPER' @@ -52,7 +52,9 @@ class DBPortManager(object): db_ids_to_pop = set(mapper.values()) - set(db_ids) mapper = self.bulk_pop(db_ids_to_pop, mapper) - self.set_mapper(mapper) + + if db_ids_to_add or db_ids_to_pop: + self.set_mapper(mapper) if settings.DEBUG: logger.debug("Oracle listen ports: {}".format(len(mapper.keys()))) @@ -63,6 +65,7 @@ class DBPortManager(object): db_ids = [str(i) for i in db_ids] mapper = dict(zip(self.all_avail_ports, list(db_ids))) self.set_mapper(mapper) + return mapper def bulk_add(self, db_ids, mapper): for db_id in db_ids: @@ -125,12 +128,20 @@ class DBPortManager(object): mapper = self.get_mapper() return sorted([int(i) for i in mapper.keys()]) + @staticmethod + def oracle_ports_setting_changed(): + oracle_ports_cache = cache.get('MAGNUS_ORACLE_PORTS') or '' + if settings.MAGNUS_ORACLE_PORTS.split('-')[0] != oracle_ports_cache.split('-')[0]: + logger.info('Oracle ports setting changed') + return True + return False + def get_mapper(self): mapper = cache.get(self.CACHE_KEY, {}) - if not mapper: + if not mapper or self.oracle_ports_setting_changed(): # redis 可能被清空,重新初始化一下 - self.init() - return cache.get(self.CACHE_KEY, {}) + mapper = self.init() + return mapper def set_mapper(self, value): """ @@ -139,6 +150,7 @@ class DBPortManager(object): } """ cache.set(self.CACHE_KEY, value, timeout=None) + cache.set('MAGNUS_ORACLE_PORTS', settings.MAGNUS_ORACLE_PORTS) db_port_manager = DBPortManager() From 7a19007aba7b447dc901e62abb83e5f4d7b9590f Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Mon, 26 Aug 2024 15:28:17 +0800 Subject: [PATCH 18/98] perf: ldap import user error msg --- apps/settings/api/ldap.py | 1 + apps/settings/const.py | 7 +++++++ apps/settings/serializers/auth/ldap.py | 1 + apps/settings/utils/ldap.py | 2 ++ apps/settings/ws.py | 15 +++++++++++++++ 5 files changed, 26 insertions(+) create mode 100644 apps/settings/const.py diff --git a/apps/settings/api/ldap.py b/apps/settings/api/ldap.py index f8b052a90..3c596cf19 100644 --- a/apps/settings/api/ldap.py +++ b/apps/settings/api/ldap.py @@ -6,6 +6,7 @@ from rest_framework.views import Response from common.utils import get_logger from users.models import User +from ..const import ImportStatus from ..models import Setting from ..serializers import LDAPUserSerializer from ..utils import ( diff --git a/apps/settings/const.py b/apps/settings/const.py new file mode 100644 index 000000000..4e4028d4f --- /dev/null +++ b/apps/settings/const.py @@ -0,0 +1,7 @@ +from django.db.models import TextChoices + + +class ImportStatus(TextChoices): + ok = 'ok', 'Ok' + pending = 'pending', 'Pending' + error = 'error', 'Error' diff --git a/apps/settings/serializers/auth/ldap.py b/apps/settings/serializers/auth/ldap.py index e0bd51389..c835cf011 100644 --- a/apps/settings/serializers/auth/ldap.py +++ b/apps/settings/serializers/auth/ldap.py @@ -33,6 +33,7 @@ class LDAPUserSerializer(serializers.Serializer): email = serializers.CharField() groups = serializers.ListField(child=serializers.CharField(), default=[]) existing = serializers.BooleanField(read_only=True) + status = serializers.JSONField(read_only=True) class LDAPSettingSerializer(serializers.Serializer): diff --git a/apps/settings/utils/ldap.py b/apps/settings/utils/ldap.py index 5699e4b20..6f0fc97de 100644 --- a/apps/settings/utils/ldap.py +++ b/apps/settings/utils/ldap.py @@ -30,6 +30,7 @@ from common.db.utils import close_old_connections from common.utils import timeit, get_logger from common.utils.http import is_true from orgs.utils import tmp_to_org +from settings.const import ImportStatus from users.models import User, UserGroup from users.utils import construct_user_email @@ -199,6 +200,7 @@ class LDAPServerUtil(object): if not isinstance(value, list): value = [] user[attr] = value.strip() if isinstance(value, str) else value + user['status'] = ImportStatus.pending return user def user_entries_to_dict(self, user_entries): diff --git a/apps/settings/ws.py b/apps/settings/ws.py index 22fcb137a..e5762e1f5 100644 --- a/apps/settings/ws.py +++ b/apps/settings/ws.py @@ -23,6 +23,7 @@ from settings.utils import ( LDAPServerUtil, LDAPCacheUtil, LDAPImportUtil, LDAPSyncUtil, LDAP_USE_CACHE_FLAGS, LDAPTestUtil ) +from .const import ImportStatus from .tools import ( verbose_ping, verbose_telnet, verbose_nmap, verbose_tcpdump, verbose_traceroute @@ -208,10 +209,24 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): msg = _('Total {}, success {}, failure {}').format( len(users), success_count, len(error_msg) ) + self.set_users_status(users, error_msg) except Exception as e: msg = str(e) return ok, msg + def set_users_status(self, import_users, errors): + util = LDAPCacheUtil() + all_users = util.get_users() + import_usernames = [u['username'] for u in import_users] + errors_mapper = {k: v for err in errors for k, v in err.items()} + for user in all_users: + username = user['username'] + if username in errors_mapper: + user['status'] = {'error': errors_mapper[username]} + elif username in import_usernames: + user['status'] = ImportStatus.ok + LDAPCacheUtil().set_users(all_users) + @staticmethod def get_orgs(org_ids): if org_ids: From 160293365a82baaf74496895c4301ba57148eacc Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:01:40 +0800 Subject: [PATCH 19/98] perf: Regularly delete useless password change push records (#14026) * perf: If the user Home page does not exist, push will fail * perf: Change secret add uid parameter * perf: Regularly delete useless password change push records --------- Co-authored-by: feng <1304903146@qq.com> --- .../change_secret/host/aix/main.yml | 52 ++++++++++++------- .../change_secret/host/aix/manifest.yml | 15 ++++++ .../change_secret/host/posix/main.yml | 52 ++++++++++++------- .../change_secret/host/posix/manifest.yml | 15 ++++++ .../automations/change_secret/manager.py | 4 +- .../push_account/host/aix/main.yml | 52 ++++++++++++------- .../push_account/host/aix/manifest.yml | 15 ++++++ .../push_account/host/posix/main.yml | 52 ++++++++++++------- .../push_account/host/posix/manifest.yml | 18 ++++++- ...ter_changesecretrecord_account_and_more.py | 30 +++++++++++ .../models/automations/change_secret.py | 11 ++-- apps/accounts/tasks/automation.py | 29 ++++++++++- apps/assets/models/asset/common.py | 14 +++-- apps/common/const/crontab.py | 1 + apps/jumpserver/conf.py | 1 + apps/jumpserver/settings/custom.py | 1 + apps/settings/serializers/cleaning.py | 5 ++ 17 files changed, 276 insertions(+), 91 deletions(-) create mode 100644 apps/accounts/migrations/0004_alter_changesecretrecord_account_and_more.py diff --git a/apps/accounts/automations/change_secret/host/aix/main.yml b/apps/accounts/automations/change_secret/host/aix/main.yml index afb7b0443..c61029d74 100644 --- a/apps/accounts/automations/change_secret/host/aix/main.yml +++ b/apps/accounts/automations/change_secret/host/aix/main.yml @@ -14,27 +14,15 @@ - name: "Add {{ account.username }} user" ansible.builtin.user: name: "{{ account.username }}" - shell: "{{ params.shell }}" - home: "{{ params.home | default('/home/' + account.username, true) }}" - groups: "{{ params.groups }}" + uid: "{{ params.uid | int if params.uid | length > 0 else omit }}" + shell: "{{ params.shell if params.shell | length > 0 else omit }}" + home: "{{ params.home if params.home | length > 0 else '/home/' + account.username }}" + groups: "{{ params.groups if params.groups | length > 0 else omit }}" + append: yes expires: -1 state: present when: user_info.failed - - name: "Add {{ account.username }} group" - ansible.builtin.group: - name: "{{ account.username }}" - state: present - when: user_info.failed - - - name: "Add {{ account.username }} user to group" - ansible.builtin.user: - name: "{{ account.username }}" - groups: "{{ params.groups }}" - when: - - user_info.failed - - params.groups - - name: "Set {{ account.username }} sudo setting" ansible.builtin.lineinfile: dest: /etc/sudoers @@ -54,14 +42,40 @@ ignore_errors: true when: account.secret_type == "password" - - name: remove jumpserver ssh key + - name: "Get home directory for {{ account.username }}" + ansible.builtin.shell: "getent passwd {{ account.username }} | cut -d: -f6" + register: home_dir + when: account.secret_type == "ssh_key" + ignore_errors: yes + + - name: "Check if home directory exists for {{ account.username }}" + ansible.builtin.stat: + path: "{{ home_dir.stdout.strip() }}" + register: home_dir_stat + when: account.secret_type == "ssh_key" + ignore_errors: yes + + - name: "Ensure {{ account.username }} home directory exists" + ansible.builtin.file: + path: "{{ home_dir.stdout.strip() }}" + state: directory + owner: "{{ account.username }}" + group: "{{ account.username }}" + mode: '0750' + when: + - account.secret_type == "ssh_key" + - home_dir_stat.stat.exists == false + ignore_errors: yes + + - name: Remove jumpserver ssh key ansible.builtin.lineinfile: - dest: "{{ ssh_params.dest }}" + dest: "{{ home_dir.stdout.strip() }}/.ssh/authorized_keys" regexp: "{{ ssh_params.regexp }}" state: absent when: - account.secret_type == "ssh_key" - ssh_params.strategy == "set_jms" + ignore_errors: yes - name: "Change {{ account.username }} SSH key" ansible.builtin.authorized_key: diff --git a/apps/accounts/automations/change_secret/host/aix/manifest.yml b/apps/accounts/automations/change_secret/host/aix/manifest.yml index 145a4bf26..0d9e6e83a 100644 --- a/apps/accounts/automations/change_secret/host/aix/manifest.yml +++ b/apps/accounts/automations/change_secret/host/aix/manifest.yml @@ -34,6 +34,12 @@ params: default: '' help_text: "{{ 'Params groups help text' | trans }}" + - name: uid + type: str + label: "{{ 'Params uid label' | trans }}" + default: '' + help_text: "{{ 'Params uid help text' | trans }}" + i18n: AIX account change secret: zh: '使用 Ansible 模块 user 执行账号改密 (DES)' @@ -60,6 +66,11 @@ i18n: ja: 'グループを入力してください。複数のグループはコンマで区切ってください(既存のグループを入力してください)' en: 'Please enter the group. Multiple groups are separated by commas (please enter the existing group)' + Params uid help text: + zh: '请输入用户ID' + ja: 'ユーザーIDを入力してください' + en: 'Please enter the user ID' + Modify sudo label: zh: '修改 sudo 权限' ja: 'sudo 権限を変更' @@ -75,3 +86,7 @@ i18n: ja: 'グループ' en: 'Groups' + Params uid label: + zh: '用户ID' + ja: 'ユーザーID' + en: 'User ID' diff --git a/apps/accounts/automations/change_secret/host/posix/main.yml b/apps/accounts/automations/change_secret/host/posix/main.yml index e58e8422e..e36ecdd33 100644 --- a/apps/accounts/automations/change_secret/host/posix/main.yml +++ b/apps/accounts/automations/change_secret/host/posix/main.yml @@ -14,27 +14,15 @@ - name: "Add {{ account.username }} user" ansible.builtin.user: name: "{{ account.username }}" - shell: "{{ params.shell }}" - home: "{{ params.home | default('/home/' + account.username, true) }}" - groups: "{{ params.groups }}" + uid: "{{ params.uid | int if params.uid | length > 0 else omit }}" + shell: "{{ params.shell if params.shell | length > 0 else omit }}" + home: "{{ params.home if params.home | length > 0 else '/home/' + account.username }}" + groups: "{{ params.groups if params.groups | length > 0 else omit }}" + append: yes expires: -1 state: present when: user_info.failed - - name: "Add {{ account.username }} group" - ansible.builtin.group: - name: "{{ account.username }}" - state: present - when: user_info.failed - - - name: "Add {{ account.username }} user to group" - ansible.builtin.user: - name: "{{ account.username }}" - groups: "{{ params.groups }}" - when: - - user_info.failed - - params.groups - - name: "Set {{ account.username }} sudo setting" ansible.builtin.lineinfile: dest: /etc/sudoers @@ -54,14 +42,40 @@ ignore_errors: true when: account.secret_type == "password" - - name: remove jumpserver ssh key + - name: "Get home directory for {{ account.username }}" + ansible.builtin.shell: "getent passwd {{ account.username }} | cut -d: -f6" + register: home_dir + when: account.secret_type == "ssh_key" + ignore_errors: yes + + - name: "Check if home directory exists for {{ account.username }}" + ansible.builtin.stat: + path: "{{ home_dir.stdout.strip() }}" + register: home_dir_stat + when: account.secret_type == "ssh_key" + ignore_errors: yes + + - name: "Ensure {{ account.username }} home directory exists" + ansible.builtin.file: + path: "{{ home_dir.stdout.strip() }}" + state: directory + owner: "{{ account.username }}" + group: "{{ account.username }}" + mode: '0750' + when: + - account.secret_type == "ssh_key" + - home_dir_stat.stat.exists == false + ignore_errors: yes + + - name: Remove jumpserver ssh key ansible.builtin.lineinfile: - dest: "{{ ssh_params.dest }}" + dest: "{{ home_dir.stdout.strip() }}/.ssh/authorized_keys" regexp: "{{ ssh_params.regexp }}" state: absent when: - account.secret_type == "ssh_key" - ssh_params.strategy == "set_jms" + ignore_errors: yes - name: "Change {{ account.username }} SSH key" ansible.builtin.authorized_key: diff --git a/apps/accounts/automations/change_secret/host/posix/manifest.yml b/apps/accounts/automations/change_secret/host/posix/manifest.yml index 9ab86cdb9..618f509b8 100644 --- a/apps/accounts/automations/change_secret/host/posix/manifest.yml +++ b/apps/accounts/automations/change_secret/host/posix/manifest.yml @@ -36,6 +36,12 @@ params: default: '' help_text: "{{ 'Params groups help text' | trans }}" + - name: uid + type: str + label: "{{ 'Params uid label' | trans }}" + default: '' + help_text: "{{ 'Params uid help text' | trans }}" + i18n: Posix account change secret: zh: '使用 Ansible 模块 user 执行账号改密 (SHA512)' @@ -62,6 +68,11 @@ i18n: ja: 'グループを入力してください。複数のグループはコンマで区切ってください(既存のグループを入力してください)' en: 'Please enter the group. Multiple groups are separated by commas (please enter the existing group)' + Params uid help text: + zh: '请输入用户ID' + ja: 'ユーザーIDを入力してください' + en: 'Please enter the user ID' + Modify sudo label: zh: '修改 sudo 权限' ja: 'sudo 権限を変更' @@ -77,3 +88,7 @@ i18n: ja: 'グループ' en: 'Groups' + Params uid label: + zh: '用户ID' + ja: 'ユーザーID' + en: 'User ID' diff --git a/apps/accounts/automations/change_secret/manager.py b/apps/accounts/automations/change_secret/manager.py index 024282d82..0b56cc5c7 100644 --- a/apps/accounts/automations/change_secret/manager.py +++ b/apps/accounts/automations/change_secret/manager.py @@ -50,9 +50,6 @@ class ChangeSecretManager(AccountBasePlaybookManager): kwargs['exclusive'] = 'yes' if kwargs['strategy'] == SSHKeyStrategy.set else 'no' if kwargs['strategy'] == SSHKeyStrategy.set_jms: - username = account.username - path = f'/{username}' if username == "root" else f'/home/{username}' - kwargs['dest'] = f'{path}/.ssh/authorized_keys' kwargs['regexp'] = '.*{}$'.format(secret.split()[2].strip()) return kwargs @@ -130,6 +127,7 @@ class ChangeSecretManager(AccountBasePlaybookManager): recorder = ChangeSecretRecord( asset=asset, account=account, execution=self.execution, old_secret=account.secret, new_secret=new_secret, + comment=f'{account.username}@{asset.address}' ) records.append(recorder) else: diff --git a/apps/accounts/automations/push_account/host/aix/main.yml b/apps/accounts/automations/push_account/host/aix/main.yml index fd33c5f8c..8e451fb83 100644 --- a/apps/accounts/automations/push_account/host/aix/main.yml +++ b/apps/accounts/automations/push_account/host/aix/main.yml @@ -14,27 +14,15 @@ - name: "Add {{ account.username }} user" ansible.builtin.user: name: "{{ account.username }}" - shell: "{{ params.shell }}" - home: "{{ params.home | default('/home/' + account.username, true) }}" - groups: "{{ params.groups }}" + uid: "{{ params.uid | int if params.uid | length > 0 else omit }}" + shell: "{{ params.shell if params.shell | length > 0 else omit }}" + home: "{{ params.home if params.home | length > 0 else '/home/' + account.username }}" + groups: "{{ params.groups if params.groups | length > 0 else omit }}" + append: yes expires: -1 state: present when: user_info.failed - - name: "Add {{ account.username }} group" - ansible.builtin.group: - name: "{{ account.username }}" - state: present - when: user_info.failed - - - name: "Add {{ account.username }} user to group" - ansible.builtin.user: - name: "{{ account.username }}" - groups: "{{ params.groups }}" - when: - - user_info.failed - - params.groups - - name: "Set {{ account.username }} sudo setting" ansible.builtin.lineinfile: dest: /etc/sudoers @@ -54,14 +42,40 @@ ignore_errors: true when: account.secret_type == "password" - - name: remove jumpserver ssh key + - name: "Get home directory for {{ account.username }}" + ansible.builtin.shell: "getent passwd {{ account.username }} | cut -d: -f6" + register: home_dir + when: account.secret_type == "ssh_key" + ignore_errors: yes + + - name: "Check if home directory exists for {{ account.username }}" + ansible.builtin.stat: + path: "{{ home_dir.stdout.strip() }}" + register: home_dir_stat + when: account.secret_type == "ssh_key" + ignore_errors: yes + + - name: "Ensure {{ account.username }} home directory exists" + ansible.builtin.file: + path: "{{ home_dir.stdout.strip() }}" + state: directory + owner: "{{ account.username }}" + group: "{{ account.username }}" + mode: '0750' + when: + - account.secret_type == "ssh_key" + - home_dir_stat.stat.exists == false + ignore_errors: yes + + - name: Remove jumpserver ssh key ansible.builtin.lineinfile: - dest: "{{ ssh_params.dest }}" + dest: "{{ home_dir.stdout.strip() }}/.ssh/authorized_keys" regexp: "{{ ssh_params.regexp }}" state: absent when: - account.secret_type == "ssh_key" - ssh_params.strategy == "set_jms" + ignore_errors: yes - name: "Change {{ account.username }} SSH key" ansible.builtin.authorized_key: diff --git a/apps/accounts/automations/push_account/host/aix/manifest.yml b/apps/accounts/automations/push_account/host/aix/manifest.yml index f00a7435d..d4ba0924c 100644 --- a/apps/accounts/automations/push_account/host/aix/manifest.yml +++ b/apps/accounts/automations/push_account/host/aix/manifest.yml @@ -34,6 +34,12 @@ params: default: '' help_text: "{{ 'Params groups help text' | trans }}" + - name: uid + type: str + label: "{{ 'Params uid label' | trans }}" + default: '' + help_text: "{{ 'Params uid help text' | trans }}" + i18n: Aix account push: zh: '使用 Ansible 模块 user 执行 Aix 账号推送 (DES)' @@ -60,6 +66,11 @@ i18n: ja: 'グループを入力してください。複数のグループはコンマで区切ってください(既存のグループを入力してください)' en: 'Please enter the group. Multiple groups are separated by commas (please enter the existing group)' + Params uid help text: + zh: '请输入用户ID' + ja: 'ユーザーIDを入力してください' + en: 'Please enter the user ID' + Modify sudo label: zh: '修改 sudo 权限' ja: 'sudo 権限を変更' @@ -75,3 +86,7 @@ i18n: ja: 'グループ' en: 'Groups' + Params uid label: + zh: '用户ID' + ja: 'ユーザーID' + en: 'User ID' diff --git a/apps/accounts/automations/push_account/host/posix/main.yml b/apps/accounts/automations/push_account/host/posix/main.yml index 83aa34206..537256a3d 100644 --- a/apps/accounts/automations/push_account/host/posix/main.yml +++ b/apps/accounts/automations/push_account/host/posix/main.yml @@ -14,27 +14,15 @@ - name: "Add {{ account.username }} user" ansible.builtin.user: name: "{{ account.username }}" - shell: "{{ params.shell }}" - home: "{{ params.home | default('/home/' + account.username, true) }}" - groups: "{{ params.groups }}" + uid: "{{ params.uid | int if params.uid | length > 0 else omit }}" + shell: "{{ params.shell if params.shell | length > 0 else omit }}" + home: "{{ params.home if params.home | length > 0 else '/home/' + account.username }}" + groups: "{{ params.groups if params.groups | length > 0 else omit }}" + append: yes expires: -1 state: present when: user_info.failed - - name: "Add {{ account.username }} group" - ansible.builtin.group: - name: "{{ account.username }}" - state: present - when: user_info.failed - - - name: "Add {{ account.username }} user to group" - ansible.builtin.user: - name: "{{ account.username }}" - groups: "{{ params.groups }}" - when: - - user_info.failed - - params.groups - - name: "Set {{ account.username }} sudo setting" ansible.builtin.lineinfile: dest: /etc/sudoers @@ -54,14 +42,40 @@ ignore_errors: true when: account.secret_type == "password" - - name: remove jumpserver ssh key + - name: "Get home directory for {{ account.username }}" + ansible.builtin.shell: "getent passwd {{ account.username }} | cut -d: -f6" + register: home_dir + when: account.secret_type == "ssh_key" + ignore_errors: yes + + - name: "Check if home directory exists for {{ account.username }}" + ansible.builtin.stat: + path: "{{ home_dir.stdout.strip() }}" + register: home_dir_stat + when: account.secret_type == "ssh_key" + ignore_errors: yes + + - name: "Ensure {{ account.username }} home directory exists" + ansible.builtin.file: + path: "{{ home_dir.stdout.strip() }}" + state: directory + owner: "{{ account.username }}" + group: "{{ account.username }}" + mode: '0750' + when: + - account.secret_type == "ssh_key" + - home_dir_stat.stat.exists == false + ignore_errors: yes + + - name: Remove jumpserver ssh key ansible.builtin.lineinfile: - dest: "{{ ssh_params.dest }}" + dest: "{{ home_dir.stdout.strip() }}/.ssh/authorized_keys" regexp: "{{ ssh_params.regexp }}" state: absent when: - account.secret_type == "ssh_key" - ssh_params.strategy == "set_jms" + ignore_errors: yes - name: "Change {{ account.username }} SSH key" ansible.builtin.authorized_key: diff --git a/apps/accounts/automations/push_account/host/posix/manifest.yml b/apps/accounts/automations/push_account/host/posix/manifest.yml index 86342b48a..9db17bd28 100644 --- a/apps/accounts/automations/push_account/host/posix/manifest.yml +++ b/apps/accounts/automations/push_account/host/posix/manifest.yml @@ -36,6 +36,12 @@ params: default: '' help_text: "{{ 'Params groups help text' | trans }}" + - name: uid + type: str + label: "{{ 'Params uid label' | trans }}" + default: '' + help_text: "{{ 'Params uid help text' | trans }}" + i18n: Posix account push: zh: '使用 Ansible 模块 user 执行账号推送 (sha512)' @@ -62,6 +68,11 @@ i18n: ja: 'グループを入力してください。複数のグループはコンマで区切ってください(既存のグループを入力してください)' en: 'Please enter the group. Multiple groups are separated by commas (please enter the existing group)' + Params uid help text: + zh: '请输入用户ID' + ja: 'ユーザーIDを入力してください' + en: 'Please enter the user ID' + Modify sudo label: zh: '修改 sudo 权限' ja: 'sudo 権限を変更' @@ -75,4 +86,9 @@ i18n: Params groups label: zh: '用户组' ja: 'グループ' - en: 'Groups' \ No newline at end of file + en: 'Groups' + + Params uid label: + zh: '用户ID' + ja: 'ユーザーID' + en: 'User ID' \ No newline at end of file diff --git a/apps/accounts/migrations/0004_alter_changesecretrecord_account_and_more.py b/apps/accounts/migrations/0004_alter_changesecretrecord_account_and_more.py new file mode 100644 index 000000000..c2df97445 --- /dev/null +++ b/apps/accounts/migrations/0004_alter_changesecretrecord_account_and_more.py @@ -0,0 +1,30 @@ +# Generated by Django 4.1.13 on 2024-08-26 09:05 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0005_myasset'), + ('accounts', '0003_automation'), + ] + + operations = [ + migrations.AlterField( + model_name='changesecretrecord', + name='account', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='accounts.account'), + ), + migrations.AlterField( + model_name='changesecretrecord', + name='asset', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.asset'), + ), + migrations.AlterField( + model_name='changesecretrecord', + name='execution', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='accounts.automationexecution'), + ), + ] diff --git a/apps/accounts/models/automations/change_secret.py b/apps/accounts/models/automations/change_secret.py index 48c0a45e1..6d1c22715 100644 --- a/apps/accounts/models/automations/change_secret.py +++ b/apps/accounts/models/automations/change_secret.py @@ -33,16 +33,15 @@ class ChangeSecretAutomation(ChangeSecretMixin, AccountBaseAutomation): class ChangeSecretRecord(JMSBaseModel): - execution = models.ForeignKey('accounts.AutomationExecution', on_delete=models.CASCADE) - asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, null=True) - account = models.ForeignKey('accounts.Account', on_delete=models.CASCADE, null=True) + execution = models.ForeignKey('accounts.AutomationExecution', on_delete=models.SET_NULL, null=True) + asset = models.ForeignKey('assets.Asset', on_delete=models.SET_NULL, null=True) + account = models.ForeignKey('accounts.Account', on_delete=models.SET_NULL, null=True) old_secret = fields.EncryptTextField(blank=True, null=True, verbose_name=_('Old secret')) new_secret = fields.EncryptTextField(blank=True, null=True, verbose_name=_('New secret')) date_started = models.DateTimeField(blank=True, null=True, verbose_name=_('Date started')) date_finished = models.DateTimeField(blank=True, null=True, verbose_name=_('Date finished')) status = models.CharField( - max_length=16, verbose_name=_('Status'), - default=ChangeSecretRecordStatusChoice.pending.value + max_length=16, verbose_name=_('Status'), default=ChangeSecretRecordStatusChoice.pending.value ) error = models.TextField(blank=True, null=True, verbose_name=_('Error')) @@ -51,4 +50,4 @@ class ChangeSecretRecord(JMSBaseModel): verbose_name = _("Change secret record") def __str__(self): - return self.account.__str__() + return f'{self.account.username}@{self.asset}' diff --git a/apps/accounts/tasks/automation.py b/apps/accounts/tasks/automation.py index f691825ef..c4fe79285 100644 --- a/apps/accounts/tasks/automation.py +++ b/apps/accounts/tasks/automation.py @@ -1,9 +1,15 @@ +import datetime + from celery import shared_task +from django.db.models import Q +from django.utils import timezone from django.utils.translation import gettext_lazy as _, gettext_noop from accounts.const import AutomationTypes from accounts.tasks.common import quickstart_automation_by_snapshot -from common.utils import get_logger, get_object_or_none +from common.const.crontab import CRONTAB_AT_AM_THREE +from common.utils import get_logger, get_object_or_none, get_log_keep_day +from ops.celery.decorator import register_as_period_task from orgs.utils import tmp_to_org, tmp_to_root_org logger = get_logger(__file__) @@ -74,3 +80,24 @@ def execute_automation_record_task(record_ids, tp): } with tmp_to_org(record.execution.org_id): quickstart_automation_by_snapshot(task_name, tp, task_snapshot) + + +@shared_task( + verbose_name=_('Clean change secret and push record period'), + description=_('Clean change secret and push record period') +) +@register_as_period_task(crontab=CRONTAB_AT_AM_THREE) +def clean_change_secret_and_push_record_period(): + from accounts.models import ChangeSecretRecord + print('Start clean change secret and push record period') + with tmp_to_root_org(): + now = timezone.now() + days = get_log_keep_day('ACCOUNT_CHANGE_SECRET_RECORD_KEEP_DAYS') + expired_day = now - datetime.timedelta(days=days) + records = ChangeSecretRecord.objects.filter( + date_updated__lt=expired_day + ).filter( + Q(execution__isnull=True) | Q(asset__isnull=True) | Q(account__isnull=True) + ) + + records.delete() diff --git a/apps/assets/models/asset/common.py b/apps/assets/models/asset/common.py index 6f7df504d..7388f27a8 100644 --- a/apps/assets/models/asset/common.py +++ b/apps/assets/models/asset/common.py @@ -158,10 +158,16 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, name = models.CharField(max_length=128, verbose_name=_('Name')) address = models.CharField(max_length=767, verbose_name=_('Address'), db_index=True) - platform = models.ForeignKey(Platform, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets') - domain = models.ForeignKey("assets.Domain", null=True, blank=True, related_name='assets', - verbose_name=_("Zone"), on_delete=models.SET_NULL) - nodes = models.ManyToManyField('assets.Node', default=default_node, related_name='assets', verbose_name=_("Nodes")) + platform = models.ForeignKey( + Platform, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets' + ) + domain = models.ForeignKey( + "assets.Domain", null=True, blank=True, related_name='assets', + verbose_name=_("Zone"), on_delete=models.SET_NULL + ) + nodes = models.ManyToManyField( + 'assets.Node', default=default_node, related_name='assets', verbose_name=_("Nodes") + ) is_active = models.BooleanField(default=True, verbose_name=_('Active')) gathered_info = models.JSONField(verbose_name=_('Gathered info'), default=dict, blank=True) # 资产的一些信息,如 硬件信息 custom_info = models.JSONField(verbose_name=_('Custom info'), default=dict) diff --git a/apps/common/const/crontab.py b/apps/common/const/crontab.py index e4de195eb..401f54eaa 100644 --- a/apps/common/const/crontab.py +++ b/apps/common/const/crontab.py @@ -1,5 +1,6 @@ CRONTAB_AT_AM_TWO = '0 2 * * *' +CRONTAB_AT_AM_THREE = '0 3 * * *' CRONTAB_AT_AM_TEN = '0 10 * * *' CRONTAB_AT_PM_TWO = '0 14 * * *' diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 2642c1da0..c352f7739 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -607,6 +607,7 @@ class Config(dict): 'CLOUD_SYNC_TASK_EXECUTION_KEEP_DAYS': 180, 'JOB_EXECUTION_KEEP_DAYS': 180, 'PASSWORD_CHANGE_LOG_KEEP_DAYS': 999, + 'ACCOUNT_CHANGE_SECRET_RECORD_KEEP_DAYS': 180, 'TICKETS_ENABLED': True, 'TICKETS_DIRECT_APPROVE': False, diff --git a/apps/jumpserver/settings/custom.py b/apps/jumpserver/settings/custom.py index 821c209e1..9161e2252 100644 --- a/apps/jumpserver/settings/custom.py +++ b/apps/jumpserver/settings/custom.py @@ -128,6 +128,7 @@ ACTIVITY_LOG_KEEP_DAYS = CONFIG.ACTIVITY_LOG_KEEP_DAYS FTP_LOG_KEEP_DAYS = CONFIG.FTP_LOG_KEEP_DAYS CLOUD_SYNC_TASK_EXECUTION_KEEP_DAYS = CONFIG.CLOUD_SYNC_TASK_EXECUTION_KEEP_DAYS JOB_EXECUTION_KEEP_DAYS = CONFIG.JOB_EXECUTION_KEEP_DAYS +ACCOUNT_CHANGE_SECRET_RECORD_KEEP_DAYS = CONFIG.ACCOUNT_CHANGE_SECRET_RECORD_KEEP_DAYS ORG_CHANGE_TO_URL = CONFIG.ORG_CHANGE_TO_URL WINDOWS_SKIP_ALL_MANUAL_PASSWORD = CONFIG.WINDOWS_SKIP_ALL_MANUAL_PASSWORD diff --git a/apps/settings/serializers/cleaning.py b/apps/settings/serializers/cleaning.py index 888559dce..2cbba678f 100644 --- a/apps/settings/serializers/cleaning.py +++ b/apps/settings/serializers/cleaning.py @@ -47,3 +47,8 @@ class CleaningSerializer(serializers.Serializer): help_text=_( 'Session, record, command will be delete if more than duration, only in database, OSS will not be affected.') ) + + ACCOUNT_CHANGE_SECRET_RECORD_KEEP_DAYS = serializers.IntegerField( + min_value=MIN_VALUE, max_value=9999, + label=_("Change secret and push record retention days (day)"), + ) From 9da507bb6268122a551f31cb1b0a6cdcdd242a7a Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Fri, 30 Aug 2024 15:16:44 +0800 Subject: [PATCH 20/98] perf: Translate --- apps/accounts/tasks/automation.py | 2 +- apps/i18n/core/en/LC_MESSAGES/django.po | 309 ++++++++++--------- apps/i18n/core/ja/LC_MESSAGES/django.po | 205 ++++++------ apps/i18n/core/zh/LC_MESSAGES/django.po | 205 ++++++------ apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 205 ++++++------ 5 files changed, 496 insertions(+), 430 deletions(-) diff --git a/apps/accounts/tasks/automation.py b/apps/accounts/tasks/automation.py index c4fe79285..c03e4cf97 100644 --- a/apps/accounts/tasks/automation.py +++ b/apps/accounts/tasks/automation.py @@ -84,7 +84,7 @@ def execute_automation_record_task(record_ids, tp): @shared_task( verbose_name=_('Clean change secret and push record period'), - description=_('Clean change secret and push record period') + description=_('Clean change secret and push record period description') ) @register_as_period_task(crontab=CRONTAB_AT_AM_THREE) def clean_change_secret_and_push_record_period(): diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index e44bc8d18..7b49ffcde 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-12 18:34+0800\n" +"POT-Creation-Date: 2024-08-30 15:08+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -109,11 +109,11 @@ msgstr "" msgid "Plan execution end" msgstr "" -#: accounts/automations/change_secret/manager.py:100 +#: accounts/automations/change_secret/manager.py:97 msgid "No pending accounts found" msgstr "" -#: accounts/automations/change_secret/manager.py:227 +#: accounts/automations/change_secret/manager.py:225 #, python-format msgid "Success: %s, Failed: %s, Total: %s" msgstr "" @@ -124,7 +124,7 @@ msgstr "" #: authentication/confirm/password.py:24 authentication/confirm/password.py:26 #: authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 -#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:51 +#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 #: settings/serializers/msg.py:37 settings/serializers/terminal.py:28 #: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142 #: users/forms/profile.py:21 users/serializers/user.py:144 @@ -347,7 +347,7 @@ msgstr "" #: accounts/templates/accounts/asset_account_change_info.html:7 #: accounts/templates/accounts/change_secret_failed_info.html:11 #: acls/serializers/base.py:123 assets/models/asset/common.py:95 -#: assets/models/asset/common.py:349 assets/models/cmd_filter.py:36 +#: assets/models/asset/common.py:355 assets/models/cmd_filter.py:36 #: audits/models.py:58 authentication/models/connection_token.py:36 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:32 terminal/notifications.py:155 @@ -485,7 +485,7 @@ msgstr "" #: accounts/serializers/automations/base.py:56 #: assets/models/automations/base.py:122 #: assets/serializers/automations/base.py:40 xpack/plugins/cloud/models.py:240 -#: xpack/plugins/cloud/serializers/task.py:237 +#: xpack/plugins/cloud/serializers/task.py:243 msgid "Trigger mode" msgstr "" @@ -550,7 +550,7 @@ msgstr "" #: accounts/models/automations/gather_account.py:58 #: accounts/serializers/account/backup.py:40 #: accounts/serializers/automations/change_secret.py:58 -#: settings/serializers/auth/ldap.py:99 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:100 settings/serializers/msg.py:45 msgid "Recipient" msgstr "Recipients" @@ -592,7 +592,7 @@ msgstr "" msgid "Status" msgstr "" -#: accounts/models/automations/change_secret.py:47 +#: accounts/models/automations/change_secret.py:46 #: accounts/serializers/account/account.py:273 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:8 @@ -603,7 +603,7 @@ msgstr "" msgid "Error" msgstr "" -#: accounts/models/automations/change_secret.py:51 +#: accounts/models/automations/change_secret.py:50 msgid "Change secret record" msgstr "" @@ -703,7 +703,7 @@ msgstr "" #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 #: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 -#: assets/serializers/platform.py:282 +#: assets/serializers/platform.py:273 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 @@ -824,7 +824,6 @@ msgid "" msgstr "" #: accounts/notifications.py:83 -#: accounts/templates/accounts/asset_account_change_info.html:3 msgid "Gather account change information" msgstr "" @@ -846,8 +845,8 @@ msgstr "" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:125 -#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:177 -#: assets/serializers/platform.py:283 perms/serializers/user_permission.py:26 +#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 +#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -858,14 +857,14 @@ msgstr "" #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 #: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 -#: assets/serializers/platform.py:176 audits/serializers.py:53 +#: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 #: terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 -#: terminal/serializers/session.py:23 terminal/serializers/storage.py:278 -#: terminal/serializers/storage.py:291 tickets/models/comment.py:26 +#: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 +#: terminal/serializers/storage.py:294 tickets/models/comment.py:26 #: tickets/models/flow.py:42 tickets/models/ticket/apply_application.py:16 #: tickets/models/ticket/general.py:276 tickets/serializers/flow.py:25 #: tickets/serializers/ticket/ticket.py:19 @@ -895,7 +894,7 @@ msgstr "" #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:19 #: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 -#: assets/serializers/platform.py:185 assets/serializers/platform.py:217 +#: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 #: perms/serializers/permission.py:35 @@ -940,7 +939,7 @@ msgstr "" #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 -#: rbac/builtin.py:124 rbac/models/rolebinding.py:49 +#: rbac/builtin.py:125 rbac/models/rolebinding.py:49 #: rbac/serializers/rolebinding.py:17 terminal/backends/command/models.py:16 #: terminal/models/session/session.py:30 terminal/models/session/sharing.py:34 #: terminal/notifications.py:156 terminal/notifications.py:205 @@ -1049,7 +1048,7 @@ msgid "" msgstr "" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "" @@ -1112,14 +1111,22 @@ msgstr "" msgid "Delete account: %s" msgstr "" -#: accounts/tasks/automation.py:25 +#: accounts/tasks/automation.py:31 msgid "Account execute automation" msgstr "" -#: accounts/tasks/automation.py:51 accounts/tasks/automation.py:56 +#: accounts/tasks/automation.py:57 accounts/tasks/automation.py:62 msgid "Execute automation record" msgstr "" +#: accounts/tasks/automation.py:86 +msgid "Clean change secret and push record period" +msgstr "" + +#: accounts/tasks/automation.py:87 +msgid "Clean change secret and push record period description" +msgstr "The system will periodically clean up unnecessary change secret records and push records, including those associated with change tasks, execution records, assets, and accounts. When any of these associated items are deleted, the corresponding change secret and push records become invalid. Therefore, to maintain a tidy and efficient database, the system automatically cleans up these invalid records every 180 days by default. This regular cleanup process helps free up storage space and improves the security and overall performance of data management." + #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" msgstr "" @@ -1156,11 +1163,11 @@ msgstr "" msgid "Verify accounts connectivity" msgstr "" -#: accounts/templates/accounts/asset_account_change_info.html:8 +#: accounts/templates/accounts/asset_account_change_info.html:10 msgid "Added account" msgstr "" -#: accounts/templates/accounts/asset_account_change_info.html:9 +#: accounts/templates/accounts/asset_account_change_info.html:13 msgid "Deleted account" msgstr "" @@ -1233,7 +1240,7 @@ msgstr "" msgid "Reviewers" msgstr "" -#: acls/models/base.py:43 assets/models/asset/common.py:165 +#: acls/models/base.py:43 assets/models/asset/common.py:171 #: authentication/models/access_key.py:25 #: authentication/models/connection_token.py:53 #: authentication/models/ssh_key.py:13 @@ -1554,7 +1561,7 @@ msgid "Gather facts" msgstr "" #: assets/const/base.py:32 audits/const.py:58 -#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31 +#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32 msgid "Disabled" msgstr "" @@ -1807,39 +1814,39 @@ msgstr "" msgid "Address" msgstr "" -#: assets/models/asset/common.py:161 assets/models/platform.py:138 +#: assets/models/asset/common.py:162 assets/models/platform.py:149 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 msgid "Platform" msgstr "" -#: assets/models/asset/common.py:163 assets/models/domain.py:22 +#: assets/models/asset/common.py:166 assets/models/domain.py:22 msgid "Zone" msgstr "" -#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "" -#: assets/models/asset/common.py:167 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:173 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "" -#: assets/models/asset/common.py:352 +#: assets/models/asset/common.py:358 msgid "Can refresh asset hardware info" msgstr "" -#: assets/models/asset/common.py:353 +#: assets/models/asset/common.py:359 msgid "Can test asset connectivity" msgstr "" -#: assets/models/asset/common.py:354 +#: assets/models/asset/common.py:360 msgid "Can match asset" msgstr "" -#: assets/models/asset/common.py:355 +#: assets/models/asset/common.py:361 msgid "Can change asset nodes" msgstr "" @@ -2041,7 +2048,7 @@ msgstr "" #: assets/models/platform.py:38 audits/const.py:59 #: authentication/backends/passkey/models.py:11 settings/models.py:38 -#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32 +#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "" @@ -2131,23 +2138,23 @@ msgstr "" msgid "Internal" msgstr "Builtin" -#: assets/models/platform.py:102 assets/serializers/platform.py:175 +#: assets/models/platform.py:102 assets/serializers/platform.py:166 msgid "Charset" msgstr "" -#: assets/models/platform.py:104 assets/serializers/platform.py:213 +#: assets/models/platform.py:104 assets/serializers/platform.py:204 msgid "Gateway enabled" msgstr "" -#: assets/models/platform.py:106 assets/serializers/platform.py:206 +#: assets/models/platform.py:106 assets/serializers/platform.py:197 msgid "Su enabled" msgstr "Switch account enabled" -#: assets/models/platform.py:107 assets/serializers/platform.py:181 +#: assets/models/platform.py:107 assets/serializers/platform.py:172 msgid "Su method" msgstr "Switch account method" -#: assets/models/platform.py:108 assets/serializers/platform.py:184 +#: assets/models/platform.py:108 assets/serializers/platform.py:175 msgid "Custom fields" msgstr "" @@ -2162,7 +2169,7 @@ msgid "" "type" msgstr "" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:178 +#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 @@ -2279,7 +2286,7 @@ msgid "" "the zone, the connection is routed through the gateway." msgstr "" -#: assets/serializers/domain.py:24 assets/serializers/platform.py:186 +#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 #: orgs/serializers.py:13 perms/serializers/permission.py:39 msgid "Assets amount" msgstr "" @@ -2368,30 +2375,30 @@ msgstr "" msgid "Choices" msgstr "" -#: assets/serializers/platform.py:179 +#: assets/serializers/platform.py:170 msgid "Automation" msgstr "" -#: assets/serializers/platform.py:208 +#: assets/serializers/platform.py:199 msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " "root" msgstr "" -#: assets/serializers/platform.py:214 +#: assets/serializers/platform.py:205 msgid "Assets can be connected using a zone gateway" msgstr "" -#: assets/serializers/platform.py:216 +#: assets/serializers/platform.py:207 msgid "Default Domain" msgstr "" -#: assets/serializers/platform.py:238 +#: assets/serializers/platform.py:229 msgid "type is required" msgstr "" -#: assets/serializers/platform.py:253 +#: assets/serializers/platform.py:244 msgid "Protocols is required" msgstr "" @@ -3050,7 +3057,7 @@ msgstr "" msgid "Please enter SMS code" msgstr "" -#: authentication/errors/failed.py:164 users/exceptions.py:15 +#: authentication/errors/failed.py:164 users/exceptions.py:14 msgid "Phone not set" msgstr "" @@ -3199,7 +3206,7 @@ msgstr "" msgid "Clear phone number to disable" msgstr "" -#: authentication/middleware.py:94 settings/utils/ldap.py:679 +#: authentication/middleware.py:94 settings/utils/ldap.py:681 msgid "Authentication failed (before login check failed): {}" msgstr "" @@ -3410,7 +3417,25 @@ msgstr "Organization" msgid "The {} cannot be empty" msgstr "" -#: authentication/serializers/ssh_key.py:43 users/forms/profile.py:161 +#: authentication/serializers/ssh_key.py:17 +msgid "Automatically Generate Key Pair" +msgstr "" + +#: authentication/serializers/ssh_key.py:19 +msgid "Import Existing Key Pair" +msgstr "" + +#: authentication/serializers/ssh_key.py:31 +msgid "Create Type" +msgstr "" + +#: authentication/serializers/ssh_key.py:33 +msgid "" +"Please download the private key after creation. Each private key can only be " +"downloaded once" +msgstr "" + +#: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 #: users/serializers/profile.py:133 users/serializers/profile.py:160 msgid "Not a valid ssh public key" msgstr "" @@ -3647,22 +3672,22 @@ msgstr "" msgid "LAN" msgstr "" -#: authentication/views/base.py:74 +#: authentication/views/base.py:71 #: perms/templates/perms/_msg_permed_items_expire.html:21 msgid "If you have any question, please contact the administrator" msgstr "" -#: authentication/views/base.py:147 +#: authentication/views/base.py:141 #, python-format msgid "%s query user failed" msgstr "" -#: authentication/views/base.py:155 +#: authentication/views/base.py:149 #, python-format msgid "The %s is already bound to another user" msgstr "" -#: authentication/views/base.py:161 +#: authentication/views/base.py:155 #, python-format msgid "Binding %s successfully" msgstr "" @@ -4237,11 +4262,11 @@ msgstr "" msgid "No account available" msgstr "" -#: ops/ansible/inventory.py:285 +#: ops/ansible/inventory.py:286 msgid "Ansible disabled" msgstr "" -#: ops/ansible/inventory.py:301 +#: ops/ansible/inventory.py:302 msgid "Skip hosts below:" msgstr "" @@ -4425,17 +4450,17 @@ msgstr "" msgid "no valid program entry found." msgstr "" -#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:72 +#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:73 msgid "Periodic run" msgstr "Periodic" #: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108 -#: settings/serializers/auth/ldap.py:79 +#: settings/serializers/auth/ldap.py:80 msgid "Interval" msgstr "" #: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105 -#: settings/serializers/auth/ldap.py:76 +#: settings/serializers/auth/ldap.py:77 msgid "Crontab" msgstr "" @@ -4623,31 +4648,31 @@ msgstr "" msgid "You do not have permission for the current job." msgstr "" -#: ops/tasks.py:38 +#: ops/tasks.py:50 msgid "Run ansible task" msgstr "" -#: ops/tasks.py:72 +#: ops/tasks.py:76 msgid "Run ansible task execution" msgstr "" -#: ops/tasks.py:94 +#: ops/tasks.py:89 msgid "Clear celery periodic tasks" msgstr "" -#: ops/tasks.py:115 +#: ops/tasks.py:110 msgid "Create or update periodic tasks" msgstr "" -#: ops/tasks.py:123 +#: ops/tasks.py:118 msgid "Periodic check service performance" msgstr "" -#: ops/tasks.py:129 +#: ops/tasks.py:124 msgid "Clean up unexpected jobs" msgstr "" -#: ops/tasks.py:136 +#: ops/tasks.py:131 msgid "Clean job_execution db record" msgstr "" @@ -4691,17 +4716,17 @@ msgstr "" msgid "Name of the job" msgstr "" -#: orgs/api.py:61 +#: orgs/api.py:60 msgid "The current organization ({}) cannot be deleted" msgstr "" -#: orgs/api.py:66 +#: orgs/api.py:65 msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" msgstr "" -#: orgs/api.py:76 +#: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" msgstr "" @@ -4922,27 +4947,27 @@ msgstr "" msgid "App RBAC" msgstr "RBAC" -#: rbac/builtin.py:115 +#: rbac/builtin.py:116 msgid "SystemAdmin" msgstr "System Admin" -#: rbac/builtin.py:118 +#: rbac/builtin.py:119 msgid "SystemAuditor" msgstr "System Auditor" -#: rbac/builtin.py:121 +#: rbac/builtin.py:122 msgid "SystemComponent" msgstr "System Component" -#: rbac/builtin.py:127 +#: rbac/builtin.py:128 msgid "OrgAdmin" msgstr "Organizational Admin" -#: rbac/builtin.py:130 +#: rbac/builtin.py:131 msgid "OrgAuditor" msgstr "Organizational Auditor" -#: rbac/builtin.py:133 +#: rbac/builtin.py:134 msgid "OrgUser" msgstr "Organizational user" @@ -5140,7 +5165,7 @@ msgstr "" msgid "Test smtp setting" msgstr "" -#: settings/api/ldap.py:89 +#: settings/api/ldap.py:90 msgid "" "Users are not synchronized, please click the user synchronization button" msgstr "" @@ -5326,7 +5351,7 @@ msgstr "" msgid "CAS" msgstr "" -#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:43 +#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 #: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "" @@ -5354,7 +5379,7 @@ msgstr "" #: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:65 settings/serializers/auth/oauth2.py:60 +#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 #: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 #: settings/serializers/auth/slack.py:18 settings/serializers/auth/wecom.py:18 msgid "User attribute" @@ -5402,60 +5427,60 @@ msgid "" "name and the `value` is the Lark service user attribute name" msgstr "" -#: settings/serializers/auth/ldap.py:40 settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" msgstr "" -#: settings/serializers/auth/ldap.py:44 +#: settings/serializers/auth/ldap.py:45 msgid "LDAP server URI" msgstr "" -#: settings/serializers/auth/ldap.py:47 +#: settings/serializers/auth/ldap.py:48 msgid "Bind DN" msgstr "" -#: settings/serializers/auth/ldap.py:48 +#: settings/serializers/auth/ldap.py:49 msgid "Binding Distinguished Name" msgstr "" -#: settings/serializers/auth/ldap.py:52 +#: settings/serializers/auth/ldap.py:53 msgid "Binding password" msgstr "" -#: settings/serializers/auth/ldap.py:55 +#: settings/serializers/auth/ldap.py:56 msgid "Search OU" msgstr "" -#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap.py:58 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "" -#: settings/serializers/auth/ldap.py:61 +#: settings/serializers/auth/ldap.py:62 msgid "Search filter" msgstr "" -#: settings/serializers/auth/ldap.py:62 +#: settings/serializers/auth/ldap.py:63 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "" -#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap.py:68 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" -#: settings/serializers/auth/ldap.py:83 +#: settings/serializers/auth/ldap.py:84 msgid "Connect timeout (s)" msgstr "" -#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap.py:89 msgid "User DN cache timeout (s)" msgstr "" -#: settings/serializers/auth/ldap.py:90 +#: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " "effectivelyimprove the speed of user authentication., 0 means no cache
If " @@ -5463,7 +5488,7 @@ msgid "" "cache" msgstr "" -#: settings/serializers/auth/ldap.py:96 +#: settings/serializers/auth/ldap.py:97 msgid "Search paged size (piece)" msgstr "" @@ -5887,6 +5912,10 @@ msgid "" "database, OSS will not be affected." msgstr "" +#: settings/serializers/cleaning.py:53 +msgid "Change secret and push record retention days (day)" +msgstr "" + #: settings/serializers/feature.py:18 settings/serializers/msg.py:68 msgid "Subject" msgstr "" @@ -6448,109 +6477,109 @@ msgstr "" msgid "No user synchronization required" msgstr "" -#: settings/utils/ldap.py:494 +#: settings/utils/ldap.py:496 msgid "ldap:// or ldaps:// protocol is used." msgstr "" -#: settings/utils/ldap.py:505 +#: settings/utils/ldap.py:507 msgid "Host or port is disconnected: {}" msgstr "" -#: settings/utils/ldap.py:507 +#: settings/utils/ldap.py:509 msgid "The port is not the port of the LDAP service: {}" msgstr "" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:511 msgid "Please add certificate: {}" msgstr "" -#: settings/utils/ldap.py:513 settings/utils/ldap.py:540 -#: settings/utils/ldap.py:570 settings/utils/ldap.py:598 +#: settings/utils/ldap.py:515 settings/utils/ldap.py:542 +#: settings/utils/ldap.py:572 settings/utils/ldap.py:600 msgid "Unknown error: {}" msgstr "" -#: settings/utils/ldap.py:527 +#: settings/utils/ldap.py:529 msgid "Bind DN or Password incorrect" msgstr "" -#: settings/utils/ldap.py:534 +#: settings/utils/ldap.py:536 msgid "Please enter Bind DN: {}" msgstr "" -#: settings/utils/ldap.py:536 +#: settings/utils/ldap.py:538 msgid "Please enter Password: {}" msgstr "" -#: settings/utils/ldap.py:538 +#: settings/utils/ldap.py:540 msgid "Please enter correct Bind DN and Password: {}" msgstr "" -#: settings/utils/ldap.py:556 +#: settings/utils/ldap.py:558 msgid "Invalid User OU or User search filter: {}" msgstr "" -#: settings/utils/ldap.py:587 +#: settings/utils/ldap.py:589 msgid "LDAP User attr map not include: {}" msgstr "" -#: settings/utils/ldap.py:594 +#: settings/utils/ldap.py:596 msgid "LDAP User attr map is not dict" msgstr "" -#: settings/utils/ldap.py:613 +#: settings/utils/ldap.py:615 msgid "LDAP authentication is not enabled" msgstr "" -#: settings/utils/ldap.py:631 +#: settings/utils/ldap.py:633 msgid "Error (Invalid LDAP server): {}" msgstr "" -#: settings/utils/ldap.py:633 +#: settings/utils/ldap.py:635 msgid "Error (Invalid Bind DN): {}" msgstr "" -#: settings/utils/ldap.py:635 +#: settings/utils/ldap.py:637 msgid "Error (Invalid LDAP User attr map): {}" msgstr "" -#: settings/utils/ldap.py:637 +#: settings/utils/ldap.py:639 msgid "Error (Invalid User OU or User search filter): {}" msgstr "" -#: settings/utils/ldap.py:639 +#: settings/utils/ldap.py:641 msgid "Error (Not enabled LDAP authentication): {}" msgstr "" -#: settings/utils/ldap.py:641 +#: settings/utils/ldap.py:643 msgid "Error (Unknown): {}" msgstr "" -#: settings/utils/ldap.py:644 +#: settings/utils/ldap.py:646 msgid "Succeed: Match {} users" msgstr "" -#: settings/utils/ldap.py:677 +#: settings/utils/ldap.py:679 msgid "Authentication failed (configuration incorrect): {}" msgstr "" -#: settings/utils/ldap.py:681 +#: settings/utils/ldap.py:683 msgid "Authentication failed (username or password incorrect): {}" msgstr "" -#: settings/utils/ldap.py:683 +#: settings/utils/ldap.py:685 msgid "Authentication failed (Unknown): {}" msgstr "" -#: settings/utils/ldap.py:686 +#: settings/utils/ldap.py:688 msgid "Authentication success: {}" msgstr "" -#: settings/ws.py:195 +#: settings/ws.py:203 msgid "No LDAP user was found" msgstr "" -#: settings/ws.py:201 -msgid "Imported total: {} new: {}, failed: {} Organization: {}" +#: settings/ws.py:209 +msgid "Total {}, success {}, failure {}" msgstr "" #: templates/_csv_import_export.html:8 @@ -7276,7 +7305,7 @@ msgid "Command and replay storage" msgstr "Storage" #: terminal/notifications.py:240 terminal/tasks.py:153 -#: xpack/plugins/cloud/api.py:154 +#: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 msgid "Test failure: Account invalid" @@ -7566,11 +7595,11 @@ msgstr "" msgid "Store locally" msgstr "" -#: terminal/serializers/storage.py:257 +#: terminal/serializers/storage.py:258 msgid "Do not save" msgstr "" -#: terminal/serializers/storage.py:270 +#: terminal/serializers/storage.py:273 msgid "" "set as the default storage, will make new Component use the current storage " "by default, without affecting existing Component" @@ -7741,20 +7770,20 @@ msgstr "" msgid "view" msgstr "" -#: terminal/utils/db_port_mapper.py:85 +#: terminal/utils/db_port_mapper.py:88 msgid "" "No available port is matched. The number of databases may have exceeded the " "number of ports open to the database agent service, Contact the " "administrator to open more ports." msgstr "" -#: terminal/utils/db_port_mapper.py:113 +#: terminal/utils/db_port_mapper.py:116 msgid "" "No ports can be used, check and modify the limit on the number of ports that " "Magnus listens on in the configuration file." msgstr "" -#: terminal/utils/db_port_mapper.py:115 +#: terminal/utils/db_port_mapper.py:118 msgid "All available port count: {}, Already use port count: {}" msgstr "" @@ -7816,19 +7845,19 @@ msgid "" "processor: {} ticket ID: {}" msgstr "" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "Change field" msgstr "" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "Before change" msgstr "" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "After change" msgstr "" -#: tickets/handlers/base.py:97 +#: tickets/handlers/base.py:96 msgid "{} {} the ticket" msgstr "" @@ -8142,14 +8171,18 @@ msgstr "" msgid "Suffix" msgstr "" -#: users/exceptions.py:10 +#: users/exceptions.py:9 msgid "MFA not enabled" msgstr "" -#: users/exceptions.py:20 +#: users/exceptions.py:19 msgid "Unable to delete all users" msgstr "" +#: users/exceptions.py:24 +msgid "Create failed. The number of SSH keys has reached the limit" +msgstr "" + #: users/forms/profile.py:48 msgid "" "When enabled, you will enter the MFA binding process the next time you log " @@ -8269,7 +8302,7 @@ msgstr "" msgid "User password history" msgstr "" -#: users/models/user/_auth.py:33 +#: users/models/user/_auth.py:34 msgid "Force enabled" msgstr "" @@ -8793,15 +8826,15 @@ msgid "" "strategy will skipped." msgstr "" -#: xpack/plugins/cloud/api.py:66 +#: xpack/plugins/cloud/api.py:72 msgid "Test connection successful" msgstr "" -#: xpack/plugins/cloud/api.py:68 +#: xpack/plugins/cloud/api.py:74 msgid "Test connection failed: {}" msgstr "" -#: xpack/plugins/cloud/api.py:165 +#: xpack/plugins/cloud/api.py:171 msgid "User {} deleted the current resource and released the assets" msgstr "" @@ -9030,7 +9063,7 @@ msgstr "" msgid "Set protocols \"%s\"" msgstr "" -#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:28 +#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:30 msgid "Run sync instance task" msgstr "" @@ -9503,7 +9536,7 @@ msgstr "" msgid "Instance count" msgstr "" -#: xpack/plugins/cloud/tasks.py:42 +#: xpack/plugins/cloud/tasks.py:44 msgid "Period clean sync instance task execution" msgstr "" diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 85b96c1b0..95e4e78bf 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-15 14:04+0800\n" +"POT-Creation-Date: 2024-08-30 15:08+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -109,11 +109,11 @@ msgstr "アカウントのバックアップ計画を実行中です" msgid "Plan execution end" msgstr "計画実行終了" -#: accounts/automations/change_secret/manager.py:100 +#: accounts/automations/change_secret/manager.py:97 msgid "No pending accounts found" msgstr "保留中のアカウントが見つかりません" -#: accounts/automations/change_secret/manager.py:227 +#: accounts/automations/change_secret/manager.py:225 #, python-format msgid "Success: %s, Failed: %s, Total: %s" msgstr "成功: %s、失敗: %s、合計: %s" @@ -124,7 +124,7 @@ msgstr "成功: %s、失敗: %s、合計: %s" #: authentication/confirm/password.py:24 authentication/confirm/password.py:26 #: authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 -#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:51 +#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 #: settings/serializers/msg.py:37 settings/serializers/terminal.py:28 #: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142 #: users/forms/profile.py:21 users/serializers/user.py:144 @@ -347,7 +347,7 @@ msgstr "ユーザー %s がパスワードを閲覧/導き出しました" #: accounts/templates/accounts/asset_account_change_info.html:7 #: accounts/templates/accounts/change_secret_failed_info.html:11 #: acls/serializers/base.py:123 assets/models/asset/common.py:95 -#: assets/models/asset/common.py:349 assets/models/cmd_filter.py:36 +#: assets/models/asset/common.py:355 assets/models/cmd_filter.py:36 #: audits/models.py:58 authentication/models/connection_token.py:36 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:32 terminal/notifications.py:155 @@ -550,7 +550,7 @@ msgstr "SSHキープッシュ方式" #: accounts/models/automations/gather_account.py:58 #: accounts/serializers/account/backup.py:40 #: accounts/serializers/automations/change_secret.py:58 -#: settings/serializers/auth/ldap.py:99 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:100 settings/serializers/msg.py:45 msgid "Recipient" msgstr "受信者" @@ -592,7 +592,7 @@ msgstr "終了日" msgid "Status" msgstr "ステータス" -#: accounts/models/automations/change_secret.py:47 +#: accounts/models/automations/change_secret.py:46 #: accounts/serializers/account/account.py:273 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:8 @@ -603,7 +603,7 @@ msgstr "ステータス" msgid "Error" msgstr "間違い" -#: accounts/models/automations/change_secret.py:51 +#: accounts/models/automations/change_secret.py:50 msgid "Change secret record" msgstr "パスワード レコードの変更" @@ -834,7 +834,6 @@ msgstr "" "情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" #: accounts/notifications.py:83 -#: accounts/templates/accounts/asset_account_change_info.html:3 msgid "Gather account change information" msgstr "アカウント変更情報" @@ -950,7 +949,7 @@ msgstr "ID" #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 -#: rbac/builtin.py:124 rbac/models/rolebinding.py:49 +#: rbac/builtin.py:125 rbac/models/rolebinding.py:49 #: rbac/serializers/rolebinding.py:17 terminal/backends/command/models.py:16 #: terminal/models/session/session.py:30 terminal/models/session/sharing.py:34 #: terminal/notifications.py:156 terminal/notifications.py:205 @@ -1065,7 +1064,7 @@ msgstr "" "ください。 " #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "ノード" @@ -1127,14 +1126,22 @@ msgstr "アカウントを追加: %s" msgid "Delete account: %s" msgstr "アカウントを削除: %s" -#: accounts/tasks/automation.py:25 +#: accounts/tasks/automation.py:31 msgid "Account execute automation" msgstr "アカウント実行の自動化" -#: accounts/tasks/automation.py:51 accounts/tasks/automation.py:56 +#: accounts/tasks/automation.py:57 accounts/tasks/automation.py:62 msgid "Execute automation record" msgstr "自動化レコードを実行する" +#: accounts/tasks/automation.py:86 +msgid "Clean change secret and push record period" +msgstr "パスワード変更記録とプッシュ記録を定期的にクリアする" + +#: accounts/tasks/automation.py:87 +msgid "Clean change secret and push record period description" +msgstr "システムは、変更タスク、実行レコード、資産、アカウントに関連するものを含め、不要な変更シークレット レコードとプッシュ レコードを定期的にクリーンアップします。これらの関連項目のいずれかが削除されると、対応する変更シークレット レコードとプッシュ レコードは無効になります。したがって、整然とした効率的なデータベースを維持するために、システムはデフォルトでこれらの無効なレコードを 180 日ごとに自動的にクリーンアップします。この定期的なクリーンアップ プロセスにより、ストレージ領域が解放され、データ管理のセキュリティと全体的なパフォーマンスが向上します。" + #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" msgstr "アカウントのバックアップ計画を実施する" @@ -1171,11 +1178,11 @@ msgstr "アセット アカウントの可用性を確認する" msgid "Verify accounts connectivity" msgstr "アカウント接続のテスト" -#: accounts/templates/accounts/asset_account_change_info.html:8 +#: accounts/templates/accounts/asset_account_change_info.html:10 msgid "Added account" msgstr "新規アカウント" -#: accounts/templates/accounts/asset_account_change_info.html:9 +#: accounts/templates/accounts/asset_account_change_info.html:13 msgid "Deleted account" msgstr "アカウントの削除" @@ -1251,7 +1258,7 @@ msgstr "1-100、低い値は最初に一致します" msgid "Reviewers" msgstr "レビュー担当者" -#: acls/models/base.py:43 assets/models/asset/common.py:165 +#: acls/models/base.py:43 assets/models/asset/common.py:171 #: authentication/models/access_key.py:25 #: authentication/models/connection_token.py:53 #: authentication/models/ssh_key.py:13 @@ -1846,39 +1853,39 @@ msgstr "ポート" msgid "Address" msgstr "アドレス" -#: assets/models/asset/common.py:161 assets/models/platform.py:149 +#: assets/models/asset/common.py:162 assets/models/platform.py:149 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 msgid "Platform" msgstr "プラットフォーム" -#: assets/models/asset/common.py:163 assets/models/domain.py:22 +#: assets/models/asset/common.py:166 assets/models/domain.py:22 msgid "Zone" msgstr "ゾーン" -#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "資産ハードウェア情報の収集" -#: assets/models/asset/common.py:167 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:173 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "カスタム属性" -#: assets/models/asset/common.py:352 +#: assets/models/asset/common.py:358 msgid "Can refresh asset hardware info" msgstr "資産ハードウェア情報を更新できます" -#: assets/models/asset/common.py:353 +#: assets/models/asset/common.py:359 msgid "Can test asset connectivity" msgstr "資産接続をテストできます" -#: assets/models/asset/common.py:354 +#: assets/models/asset/common.py:360 msgid "Can match asset" msgstr "アセットを一致させることができます" -#: assets/models/asset/common.py:355 +#: assets/models/asset/common.py:361 msgid "Can change asset nodes" msgstr "資産ノードを変更できます" @@ -3270,7 +3277,7 @@ msgstr "電話番号を設定して有効にする" msgid "Clear phone number to disable" msgstr "無効にする電話番号をクリアする" -#: authentication/middleware.py:94 settings/utils/ldap.py:679 +#: authentication/middleware.py:94 settings/utils/ldap.py:681 msgid "Authentication failed (before login check failed): {}" msgstr "認証に失敗しました (ログインチェックが失敗する前): {}" @@ -4363,11 +4370,11 @@ msgstr "投稿サイトニュース" msgid "No account available" msgstr "利用可能なアカウントがありません" -#: ops/ansible/inventory.py:285 +#: ops/ansible/inventory.py:286 msgid "Ansible disabled" msgstr "Ansible 無効" -#: ops/ansible/inventory.py:301 +#: ops/ansible/inventory.py:302 msgid "Skip hosts below:" msgstr "次のホストをスキップします: " @@ -4556,17 +4563,17 @@ msgstr "コマンド実行が無効" msgid "no valid program entry found." msgstr "利用可能なプログラムポータルがありません" -#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:72 +#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:73 msgid "Periodic run" msgstr "定期的なパフォーマンス" #: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108 -#: settings/serializers/auth/ldap.py:79 +#: settings/serializers/auth/ldap.py:80 msgid "Interval" msgstr "間隔" #: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105 -#: settings/serializers/auth/ldap.py:76 +#: settings/serializers/auth/ldap.py:77 msgid "Crontab" msgstr "含む" @@ -4754,31 +4761,31 @@ msgstr "タスク ID" msgid "You do not have permission for the current job." msgstr "あなたは現在のジョブの権限を持っていません。" -#: ops/tasks.py:38 +#: ops/tasks.py:50 msgid "Run ansible task" msgstr "Ansible タスクを実行する" -#: ops/tasks.py:72 +#: ops/tasks.py:76 msgid "Run ansible task execution" msgstr "Ansible タスクの実行を開始する" -#: ops/tasks.py:94 +#: ops/tasks.py:89 msgid "Clear celery periodic tasks" msgstr "タスクログを定期的にクリアする" -#: ops/tasks.py:115 +#: ops/tasks.py:110 msgid "Create or update periodic tasks" msgstr "定期的なタスクの作成または更新" -#: ops/tasks.py:123 +#: ops/tasks.py:118 msgid "Periodic check service performance" msgstr "サービスのパフォーマンスを定期的に確認する" -#: ops/tasks.py:129 +#: ops/tasks.py:124 msgid "Clean up unexpected jobs" msgstr "例外ジョブのクリーンアップ" -#: ops/tasks.py:136 +#: ops/tasks.py:131 msgid "Clean job_execution db record" msgstr "ジョブセンター実行履歴のクリーンアップ" @@ -4822,18 +4829,18 @@ msgstr "ジョブのID" msgid "Name of the job" msgstr "ジョブの名前" -#: orgs/api.py:61 +#: orgs/api.py:60 msgid "The current organization ({}) cannot be deleted" msgstr "現在の組織 ({}) は削除できません" -#: orgs/api.py:66 +#: orgs/api.py:65 msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" msgstr "" "LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" -#: orgs/api.py:76 +#: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" msgstr "組織のリソース ({}) は削除できません" @@ -5057,27 +5064,27 @@ msgstr "{} 少なくとも1つのシステムロール" msgid "App RBAC" msgstr "RBAC" -#: rbac/builtin.py:115 +#: rbac/builtin.py:116 msgid "SystemAdmin" msgstr "システム管理者" -#: rbac/builtin.py:118 +#: rbac/builtin.py:119 msgid "SystemAuditor" msgstr "システム監査人" -#: rbac/builtin.py:121 +#: rbac/builtin.py:122 msgid "SystemComponent" msgstr "システムコンポーネント" -#: rbac/builtin.py:127 +#: rbac/builtin.py:128 msgid "OrgAdmin" msgstr "組織管理者" -#: rbac/builtin.py:130 +#: rbac/builtin.py:131 msgid "OrgAuditor" msgstr "監査員を組織する" -#: rbac/builtin.py:133 +#: rbac/builtin.py:134 msgid "OrgUser" msgstr "組織ユーザー" @@ -5276,7 +5283,7 @@ msgstr "{}に送信されたテストメールを確認してください" msgid "Test smtp setting" msgstr "SMTP設定のテスト" -#: settings/api/ldap.py:89 +#: settings/api/ldap.py:90 msgid "" "Users are not synchronized, please click the user synchronization button" msgstr "" @@ -5471,7 +5478,7 @@ msgstr "" msgid "CAS" msgstr "CAS" -#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:43 +#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 #: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "LDAPサーバー" @@ -5499,7 +5506,7 @@ msgstr "属性マップの有効化" #: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:65 settings/serializers/auth/oauth2.py:60 +#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 #: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 #: settings/serializers/auth/slack.py:18 settings/serializers/auth/wecom.py:18 msgid "User attribute" @@ -5557,47 +5564,47 @@ msgstr "" "ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" "`value` は Lark サービスのユーザー属性名です" -#: settings/serializers/auth/ldap.py:40 settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" msgstr "LDAP" -#: settings/serializers/auth/ldap.py:44 +#: settings/serializers/auth/ldap.py:45 msgid "LDAP server URI" msgstr "FIDOサーバーID" -#: settings/serializers/auth/ldap.py:47 +#: settings/serializers/auth/ldap.py:48 msgid "Bind DN" msgstr "DN のバインド" -#: settings/serializers/auth/ldap.py:48 +#: settings/serializers/auth/ldap.py:49 msgid "Binding Distinguished Name" msgstr "バインドディレクトリ管理者" -#: settings/serializers/auth/ldap.py:52 +#: settings/serializers/auth/ldap.py:53 msgid "Binding password" msgstr "古いパスワード" -#: settings/serializers/auth/ldap.py:55 +#: settings/serializers/auth/ldap.py:56 msgid "Search OU" msgstr "システムアーキテクチャ" -#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap.py:58 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "" "ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" -#: settings/serializers/auth/ldap.py:61 +#: settings/serializers/auth/ldap.py:62 msgid "Search filter" msgstr "ユーザー検索フィルター" -#: settings/serializers/auth/ldap.py:62 +#: settings/serializers/auth/ldap.py:63 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "選択は (cnまたはuidまたはsAMAccountName)=%(user)s)" -#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap.py:68 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" @@ -5605,15 +5612,15 @@ msgstr "" "ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" "`value` は LDAP サービスのユーザー属性名です" -#: settings/serializers/auth/ldap.py:83 +#: settings/serializers/auth/ldap.py:84 msgid "Connect timeout (s)" msgstr "接続タイムアウト (秒)" -#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap.py:89 msgid "User DN cache timeout (s)" msgstr "User DN キャッシュの有効期限 (秒)" -#: settings/serializers/auth/ldap.py:90 +#: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " "effectivelyimprove the speed of user authentication., 0 means no cache
If " @@ -5624,7 +5631,7 @@ msgstr "" "認証の速度を効果的に向上させることができます
ユーザー OU 構造が調整された" "場合、送信をクリックしてユーザー DN キャッシュをクリアします" -#: settings/serializers/auth/ldap.py:96 +#: settings/serializers/auth/ldap.py:97 msgid "Search paged size (piece)" msgstr "ページサイズを検索 (じょう)" @@ -6076,6 +6083,10 @@ msgstr "" "この期間を超えるセッション、録音、およびコマンド レコードは削除されます (デー" "タベースのバックアップに影響し、OSS などには影響しません)" +#: settings/serializers/cleaning.py:53 +msgid "Change secret and push record retention days (day)" +msgstr "パスワード変更プッシュ記録を保持する日数 (日)" + #: settings/serializers/feature.py:18 settings/serializers/msg.py:68 msgid "Subject" msgstr "件名" @@ -6703,108 +6714,108 @@ msgstr "同期されたユーザー" msgid "No user synchronization required" msgstr "ユーザーの同期は必要ありません" -#: settings/utils/ldap.py:494 +#: settings/utils/ldap.py:496 msgid "ldap:// or ldaps:// protocol is used." msgstr "ldap:// または ldaps:// プロトコルが使用されます。" -#: settings/utils/ldap.py:505 +#: settings/utils/ldap.py:507 msgid "Host or port is disconnected: {}" msgstr "ホストまたはポートが切断されました: {}" -#: settings/utils/ldap.py:507 +#: settings/utils/ldap.py:509 msgid "The port is not the port of the LDAP service: {}" msgstr "ポートはLDAPサービスのポートではありません: {}" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:511 msgid "Please add certificate: {}" msgstr "証明書を追加してください: {}" -#: settings/utils/ldap.py:513 settings/utils/ldap.py:540 -#: settings/utils/ldap.py:570 settings/utils/ldap.py:598 +#: settings/utils/ldap.py:515 settings/utils/ldap.py:542 +#: settings/utils/ldap.py:572 settings/utils/ldap.py:600 msgid "Unknown error: {}" msgstr "不明なエラー: {}" -#: settings/utils/ldap.py:527 +#: settings/utils/ldap.py:529 msgid "Bind DN or Password incorrect" msgstr "DNまたはパスワードのバインドが正しくありません" -#: settings/utils/ldap.py:534 +#: settings/utils/ldap.py:536 msgid "Please enter Bind DN: {}" msgstr "バインドDN: {} を入力してください" -#: settings/utils/ldap.py:536 +#: settings/utils/ldap.py:538 msgid "Please enter Password: {}" msgstr "パスワードを入力してください: {}" -#: settings/utils/ldap.py:538 +#: settings/utils/ldap.py:540 msgid "Please enter correct Bind DN and Password: {}" msgstr "正しいバインドDNとパスワードを入力してください: {}" -#: settings/utils/ldap.py:556 +#: settings/utils/ldap.py:558 msgid "Invalid User OU or User search filter: {}" msgstr "無効なユーザー OU またはユーザー検索フィルター: {}" -#: settings/utils/ldap.py:587 +#: settings/utils/ldap.py:589 msgid "LDAP User attr map not include: {}" msgstr "LDAP ユーザーattrマップは含まれません: {}" -#: settings/utils/ldap.py:594 +#: settings/utils/ldap.py:596 msgid "LDAP User attr map is not dict" msgstr "LDAPユーザーattrマップはdictではありません" -#: settings/utils/ldap.py:613 +#: settings/utils/ldap.py:615 msgid "LDAP authentication is not enabled" msgstr "LDAP 認証が有効になっていない" -#: settings/utils/ldap.py:631 +#: settings/utils/ldap.py:633 msgid "Error (Invalid LDAP server): {}" msgstr "エラー (LDAPサーバーが無効): {}" -#: settings/utils/ldap.py:633 +#: settings/utils/ldap.py:635 msgid "Error (Invalid Bind DN): {}" msgstr "エラー (DNのバインドが無効): {}" -#: settings/utils/ldap.py:635 +#: settings/utils/ldap.py:637 msgid "Error (Invalid LDAP User attr map): {}" msgstr "エラー (LDAPユーザーattrマップが無効): {}" -#: settings/utils/ldap.py:637 +#: settings/utils/ldap.py:639 msgid "Error (Invalid User OU or User search filter): {}" msgstr "エラー (ユーザーOUまたはユーザー検索フィルターが無効): {}" -#: settings/utils/ldap.py:639 +#: settings/utils/ldap.py:641 msgid "Error (Not enabled LDAP authentication): {}" msgstr "エラー (LDAP認証が有効化されていません): {}" -#: settings/utils/ldap.py:641 +#: settings/utils/ldap.py:643 msgid "Error (Unknown): {}" msgstr "エラー (不明): {}" -#: settings/utils/ldap.py:644 +#: settings/utils/ldap.py:646 msgid "Succeed: Match {} users" msgstr "成功: {} 人のユーザーに一致" -#: settings/utils/ldap.py:677 +#: settings/utils/ldap.py:679 msgid "Authentication failed (configuration incorrect): {}" msgstr "認証に失敗しました (設定が正しくありません): {}" -#: settings/utils/ldap.py:681 +#: settings/utils/ldap.py:683 msgid "Authentication failed (username or password incorrect): {}" msgstr "認証に失敗しました (ユーザー名またはパスワードが正しくありません): {}" -#: settings/utils/ldap.py:683 +#: settings/utils/ldap.py:685 msgid "Authentication failed (Unknown): {}" msgstr "認証に失敗しました (不明): {}" -#: settings/utils/ldap.py:686 +#: settings/utils/ldap.py:688 msgid "Authentication success: {}" msgstr "認証成功: {}" -#: settings/ws.py:198 +#: settings/ws.py:203 msgid "No LDAP user was found" msgstr "LDAPユーザーが取得されませんでした" -#: settings/ws.py:204 +#: settings/ws.py:209 msgid "Total {}, success {}, failure {}" msgstr "合計 {},成功 {},失敗 {}" @@ -8055,7 +8066,7 @@ msgstr "チェックコマンドと録画ストレージの接続性" msgid "view" msgstr "表示" -#: terminal/utils/db_port_mapper.py:85 +#: terminal/utils/db_port_mapper.py:88 msgid "" "No available port is matched. The number of databases may have exceeded the " "number of ports open to the database agent service, Contact the " @@ -8065,7 +8076,7 @@ msgstr "" "サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開" "くには、管理者に連絡してください。" -#: terminal/utils/db_port_mapper.py:113 +#: terminal/utils/db_port_mapper.py:116 msgid "" "No ports can be used, check and modify the limit on the number of ports that " "Magnus listens on in the configuration file." @@ -8073,7 +8084,7 @@ msgstr "" "使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の" "制限を確認して変更してください. " -#: terminal/utils/db_port_mapper.py:115 +#: terminal/utils/db_port_mapper.py:118 msgid "All available port count: {}, Already use port count: {}" msgstr "使用可能なすべてのポート数: {}、すでに使用しているポート数: {}" @@ -8137,19 +8148,19 @@ msgstr "" "チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: " "{}" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "Change field" msgstr "フィールドを変更" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "Before change" msgstr "変更前" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "After change" msgstr "変更後" -#: tickets/handlers/base.py:97 +#: tickets/handlers/base.py:96 msgid "{} {} the ticket" msgstr "{} {} チケット" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index bca835822..c3767dc92 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-15 14:04+0800\n" +"POT-Creation-Date: 2024-08-30 15:08+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -108,11 +108,11 @@ msgstr "账号备份计划正在执行" msgid "Plan execution end" msgstr "计划执行结束" -#: accounts/automations/change_secret/manager.py:100 +#: accounts/automations/change_secret/manager.py:97 msgid "No pending accounts found" msgstr "未找到待处理帐户" -#: accounts/automations/change_secret/manager.py:227 +#: accounts/automations/change_secret/manager.py:225 #, python-format msgid "Success: %s, Failed: %s, Total: %s" msgstr "成功: %s, 失败: %s, 总数: %s" @@ -123,7 +123,7 @@ msgstr "成功: %s, 失败: %s, 总数: %s" #: authentication/confirm/password.py:24 authentication/confirm/password.py:26 #: authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 -#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:51 +#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 #: settings/serializers/msg.py:37 settings/serializers/terminal.py:28 #: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142 #: users/forms/profile.py:21 users/serializers/user.py:144 @@ -346,7 +346,7 @@ msgstr "用户 %s 查看/导出 了密码" #: accounts/templates/accounts/asset_account_change_info.html:7 #: accounts/templates/accounts/change_secret_failed_info.html:11 #: acls/serializers/base.py:123 assets/models/asset/common.py:95 -#: assets/models/asset/common.py:349 assets/models/cmd_filter.py:36 +#: assets/models/asset/common.py:355 assets/models/cmd_filter.py:36 #: audits/models.py:58 authentication/models/connection_token.py:36 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:32 terminal/notifications.py:155 @@ -549,7 +549,7 @@ msgstr "SSH 密钥推送方式" #: accounts/models/automations/gather_account.py:58 #: accounts/serializers/account/backup.py:40 #: accounts/serializers/automations/change_secret.py:58 -#: settings/serializers/auth/ldap.py:99 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:100 settings/serializers/msg.py:45 msgid "Recipient" msgstr "收件人" @@ -591,7 +591,7 @@ msgstr "结束日期" msgid "Status" msgstr "状态" -#: accounts/models/automations/change_secret.py:47 +#: accounts/models/automations/change_secret.py:46 #: accounts/serializers/account/account.py:273 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:8 @@ -602,7 +602,7 @@ msgstr "状态" msgid "Error" msgstr "错误" -#: accounts/models/automations/change_secret.py:51 +#: accounts/models/automations/change_secret.py:50 msgid "Change secret record" msgstr "改密记录" @@ -832,7 +832,6 @@ msgstr "" "码" #: accounts/notifications.py:83 -#: accounts/templates/accounts/asset_account_change_info.html:3 msgid "Gather account change information" msgstr "账号变更信息" @@ -948,7 +947,7 @@ msgstr "ID" #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 -#: rbac/builtin.py:124 rbac/models/rolebinding.py:49 +#: rbac/builtin.py:125 rbac/models/rolebinding.py:49 #: rbac/serializers/rolebinding.py:17 terminal/backends/command/models.py:16 #: terminal/models/session/session.py:30 terminal/models/session/sharing.py:34 #: terminal/notifications.py:156 terminal/notifications.py:205 @@ -1062,7 +1061,7 @@ msgstr "" "CACHE_LOGIN_PASSWORD_ENABLED=true,重启服务才能开启" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "节点" @@ -1123,14 +1122,22 @@ msgstr "添加账号: %s" msgid "Delete account: %s" msgstr "删除账号: %s" -#: accounts/tasks/automation.py:25 +#: accounts/tasks/automation.py:31 msgid "Account execute automation" msgstr "账号执行自动化" -#: accounts/tasks/automation.py:51 accounts/tasks/automation.py:56 +#: accounts/tasks/automation.py:57 accounts/tasks/automation.py:62 msgid "Execute automation record" msgstr "自动化执行记录" +#: accounts/tasks/automation.py:86 +msgid "Clean change secret and push record period" +msgstr "周期清理改密记录和推送记录" + +#: accounts/tasks/automation.py:87 +msgid "Clean change secret and push record period description" +msgstr "系统会定期清理不再需要的改密记录和推送记录,包括那些关联的改密任务、执行记录、资产和账号。当这些关联项中的任意一个被删除时,对应的改密和推送记录将变为无效。因此,为了保持数据库的整洁和高效运行,系统默认每180天自动清理这些无效记录。这种定期清理机制不仅有助于释放存储空间,还能提高数据管理的安全性和整体性能。" + #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" msgstr "执行账号备份计划" @@ -1167,11 +1174,11 @@ msgstr "验证资产账号可用性" msgid "Verify accounts connectivity" msgstr "测试账号可连接性" -#: accounts/templates/accounts/asset_account_change_info.html:8 +#: accounts/templates/accounts/asset_account_change_info.html:10 msgid "Added account" msgstr "新增账号" -#: accounts/templates/accounts/asset_account_change_info.html:9 +#: accounts/templates/accounts/asset_account_change_info.html:13 msgid "Deleted account" msgstr "删除账号" @@ -1244,7 +1251,7 @@ msgstr "优先级可选范围为 1-100 (数值越小越优先)" msgid "Reviewers" msgstr "审批人" -#: acls/models/base.py:43 assets/models/asset/common.py:165 +#: acls/models/base.py:43 assets/models/asset/common.py:171 #: authentication/models/access_key.py:25 #: authentication/models/connection_token.py:53 #: authentication/models/ssh_key.py:13 @@ -1831,39 +1838,39 @@ msgstr "端口" msgid "Address" msgstr "地址" -#: assets/models/asset/common.py:161 assets/models/platform.py:149 +#: assets/models/asset/common.py:162 assets/models/platform.py:149 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 msgid "Platform" msgstr "平台" -#: assets/models/asset/common.py:163 assets/models/domain.py:22 +#: assets/models/asset/common.py:166 assets/models/domain.py:22 msgid "Zone" msgstr "网域" -#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集资产硬件信息" -#: assets/models/asset/common.py:167 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:173 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "自定义属性" -#: assets/models/asset/common.py:352 +#: assets/models/asset/common.py:358 msgid "Can refresh asset hardware info" msgstr "可以更新资产硬件信息" -#: assets/models/asset/common.py:353 +#: assets/models/asset/common.py:359 msgid "Can test asset connectivity" msgstr "可以测试资产连接性" -#: assets/models/asset/common.py:354 +#: assets/models/asset/common.py:360 msgid "Can match asset" msgstr "可以匹配资产" -#: assets/models/asset/common.py:355 +#: assets/models/asset/common.py:361 msgid "Can change asset nodes" msgstr "可以修改资产节点" @@ -3232,7 +3239,7 @@ msgstr "设置手机号码启用" msgid "Clear phone number to disable" msgstr "清空手机号码禁用" -#: authentication/middleware.py:94 settings/utils/ldap.py:679 +#: authentication/middleware.py:94 settings/utils/ldap.py:681 msgid "Authentication failed (before login check failed): {}" msgstr "认证失败 (登录前检查失败): {}" @@ -4301,11 +4308,11 @@ msgstr "发布站内消息" msgid "No account available" msgstr "无可用账号" -#: ops/ansible/inventory.py:285 +#: ops/ansible/inventory.py:286 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:301 +#: ops/ansible/inventory.py:302 msgid "Skip hosts below:" msgstr "跳过以下主机: " @@ -4489,17 +4496,17 @@ msgstr "命令执行已禁用" msgid "no valid program entry found." msgstr "没有可用程序入口" -#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:72 +#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:73 msgid "Periodic run" msgstr "周期执行" #: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108 -#: settings/serializers/auth/ldap.py:79 +#: settings/serializers/auth/ldap.py:80 msgid "Interval" msgstr "间隔" #: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105 -#: settings/serializers/auth/ldap.py:76 +#: settings/serializers/auth/ldap.py:77 msgid "Crontab" msgstr "Crontab" @@ -4687,31 +4694,31 @@ msgstr "任务 ID" msgid "You do not have permission for the current job." msgstr "你没有当前作业的权限。" -#: ops/tasks.py:38 +#: ops/tasks.py:50 msgid "Run ansible task" msgstr "运行 Ansible 任务" -#: ops/tasks.py:72 +#: ops/tasks.py:76 msgid "Run ansible task execution" msgstr "开始执行 Ansible 任务" -#: ops/tasks.py:94 +#: ops/tasks.py:89 msgid "Clear celery periodic tasks" msgstr "清理周期任务" -#: ops/tasks.py:115 +#: ops/tasks.py:110 msgid "Create or update periodic tasks" msgstr "创建或更新周期任务" -#: ops/tasks.py:123 +#: ops/tasks.py:118 msgid "Periodic check service performance" msgstr "周期检测服务性能" -#: ops/tasks.py:129 +#: ops/tasks.py:124 msgid "Clean up unexpected jobs" msgstr "清理异常作业" -#: ops/tasks.py:136 +#: ops/tasks.py:131 msgid "Clean job_execution db record" msgstr "清理作业中心执行历史" @@ -4755,17 +4762,17 @@ msgstr "Job ID" msgid "Name of the job" msgstr "Job 名称" -#: orgs/api.py:61 +#: orgs/api.py:60 msgid "The current organization ({}) cannot be deleted" msgstr "当前组织 ({}) 不能被删除" -#: orgs/api.py:66 +#: orgs/api.py:65 msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" msgstr "LDAP 同步设置组织为当前组织,请切换其他组织后再进行删除操作" -#: orgs/api.py:76 +#: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" msgstr "组织存在资源 ({}) 不能被删除" @@ -4989,27 +4996,27 @@ msgstr "{} 至少有一个系统角色" msgid "App RBAC" msgstr "RBAC" -#: rbac/builtin.py:115 +#: rbac/builtin.py:116 msgid "SystemAdmin" msgstr "系统管理员" -#: rbac/builtin.py:118 +#: rbac/builtin.py:119 msgid "SystemAuditor" msgstr "系统审计员" -#: rbac/builtin.py:121 +#: rbac/builtin.py:122 msgid "SystemComponent" msgstr "系统组件" -#: rbac/builtin.py:127 +#: rbac/builtin.py:128 msgid "OrgAdmin" msgstr "组织管理员" -#: rbac/builtin.py:130 +#: rbac/builtin.py:131 msgid "OrgAuditor" msgstr "组织审计员" -#: rbac/builtin.py:133 +#: rbac/builtin.py:134 msgid "OrgUser" msgstr "组织用户" @@ -5207,7 +5214,7 @@ msgstr "邮件已经发送{}, 请检查" msgid "Test smtp setting" msgstr "测试 smtp 设置" -#: settings/api/ldap.py:89 +#: settings/api/ldap.py:90 msgid "" "Users are not synchronized, please click the user synchronization button" msgstr "用户未同步,请点击同步用户按钮" @@ -5398,7 +5405,7 @@ msgstr "" msgid "CAS" msgstr "CAS" -#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:43 +#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 #: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "服务端地址" @@ -5426,7 +5433,7 @@ msgstr "启用属性映射" #: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:65 settings/serializers/auth/oauth2.py:60 +#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 #: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 #: settings/serializers/auth/slack.py:18 settings/serializers/auth/wecom.py:18 msgid "User attribute" @@ -5482,46 +5489,46 @@ msgstr "" "用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 Lark 服务用户" "属性名称" -#: settings/serializers/auth/ldap.py:40 settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" msgstr "LDAP" -#: settings/serializers/auth/ldap.py:44 +#: settings/serializers/auth/ldap.py:45 msgid "LDAP server URI" msgstr "LDAP 服务域名" -#: settings/serializers/auth/ldap.py:47 +#: settings/serializers/auth/ldap.py:48 msgid "Bind DN" msgstr "绑定 DN" -#: settings/serializers/auth/ldap.py:48 +#: settings/serializers/auth/ldap.py:49 msgid "Binding Distinguished Name" msgstr "绑定目录管理员" -#: settings/serializers/auth/ldap.py:52 +#: settings/serializers/auth/ldap.py:53 msgid "Binding password" msgstr "绑定密码" -#: settings/serializers/auth/ldap.py:55 +#: settings/serializers/auth/ldap.py:56 msgid "Search OU" msgstr "用户 OU" -#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap.py:58 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "用户搜索库,如果有多个OU,可以用`|`符号分隔" -#: settings/serializers/auth/ldap.py:61 +#: settings/serializers/auth/ldap.py:62 msgid "Search filter" msgstr "用户过滤器" -#: settings/serializers/auth/ldap.py:62 +#: settings/serializers/auth/ldap.py:63 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "可能的选项是(cn或uid或sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap.py:68 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" @@ -5529,15 +5536,15 @@ msgstr "" "用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 LDAP 服务用户" "属性名称" -#: settings/serializers/auth/ldap.py:83 +#: settings/serializers/auth/ldap.py:84 msgid "Connect timeout (s)" msgstr "连接超时时间 (秒)" -#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap.py:89 msgid "User DN cache timeout (s)" msgstr "User DN 缓存超时时间 (秒)" -#: settings/serializers/auth/ldap.py:90 +#: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " "effectivelyimprove the speed of user authentication., 0 means no cache
If " @@ -5547,7 +5554,7 @@ msgstr "" "对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度
如果" "用户 OU 架构有调整,点击提交即可清除用户 DN 缓存" -#: settings/serializers/auth/ldap.py:96 +#: settings/serializers/auth/ldap.py:97 msgid "Search paged size (piece)" msgstr "搜索分页数量 (条)" @@ -5987,6 +5994,10 @@ msgid "" msgstr "" "会话、录像,命令记录超过该时长将会被清除 (影响数据库存储,OSS 等不受影响)" +#: settings/serializers/cleaning.py:53 +msgid "Change secret and push record retention days (day)" +msgstr "改密推送记录保留天数 (天)" + #: settings/serializers/feature.py:18 settings/serializers/msg.py:68 msgid "Subject" msgstr "主题" @@ -6575,108 +6586,108 @@ msgstr "已同步用户" msgid "No user synchronization required" msgstr "没有用户需要同步" -#: settings/utils/ldap.py:494 +#: settings/utils/ldap.py:496 msgid "ldap:// or ldaps:// protocol is used." msgstr "使用 ldap:// 或 ldaps:// 协议" -#: settings/utils/ldap.py:505 +#: settings/utils/ldap.py:507 msgid "Host or port is disconnected: {}" msgstr "主机或端口不可连接: {}" -#: settings/utils/ldap.py:507 +#: settings/utils/ldap.py:509 msgid "The port is not the port of the LDAP service: {}" msgstr "端口不是LDAP服务端口: {}" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:511 msgid "Please add certificate: {}" msgstr "请添加证书" -#: settings/utils/ldap.py:513 settings/utils/ldap.py:540 -#: settings/utils/ldap.py:570 settings/utils/ldap.py:598 +#: settings/utils/ldap.py:515 settings/utils/ldap.py:542 +#: settings/utils/ldap.py:572 settings/utils/ldap.py:600 msgid "Unknown error: {}" msgstr "未知错误: {}" -#: settings/utils/ldap.py:527 +#: settings/utils/ldap.py:529 msgid "Bind DN or Password incorrect" msgstr "绑定DN或密码错误" -#: settings/utils/ldap.py:534 +#: settings/utils/ldap.py:536 msgid "Please enter Bind DN: {}" msgstr "请输入绑定DN: {}" -#: settings/utils/ldap.py:536 +#: settings/utils/ldap.py:538 msgid "Please enter Password: {}" msgstr "请输入密码: {}" -#: settings/utils/ldap.py:538 +#: settings/utils/ldap.py:540 msgid "Please enter correct Bind DN and Password: {}" msgstr "请输入正确的绑定DN和密码: {}" -#: settings/utils/ldap.py:556 +#: settings/utils/ldap.py:558 msgid "Invalid User OU or User search filter: {}" msgstr "不合法的用户OU或用户过滤器: {}" -#: settings/utils/ldap.py:587 +#: settings/utils/ldap.py:589 msgid "LDAP User attr map not include: {}" msgstr "LDAP属性映射没有包含: {}" -#: settings/utils/ldap.py:594 +#: settings/utils/ldap.py:596 msgid "LDAP User attr map is not dict" msgstr "LDAP属性映射不合法" -#: settings/utils/ldap.py:613 +#: settings/utils/ldap.py:615 msgid "LDAP authentication is not enabled" msgstr "LDAP认证没有启用" -#: settings/utils/ldap.py:631 +#: settings/utils/ldap.py:633 msgid "Error (Invalid LDAP server): {}" msgstr "错误 (不合法的LDAP服务器地址): {}" -#: settings/utils/ldap.py:633 +#: settings/utils/ldap.py:635 msgid "Error (Invalid Bind DN): {}" msgstr "错误 (不合法的绑定DN): {}" -#: settings/utils/ldap.py:635 +#: settings/utils/ldap.py:637 msgid "Error (Invalid LDAP User attr map): {}" msgstr "错误 (不合法的LDAP属性映射): {}" -#: settings/utils/ldap.py:637 +#: settings/utils/ldap.py:639 msgid "Error (Invalid User OU or User search filter): {}" msgstr "错误 (不合法的用户OU或用户过滤器): {}" -#: settings/utils/ldap.py:639 +#: settings/utils/ldap.py:641 msgid "Error (Not enabled LDAP authentication): {}" msgstr "错误 (没有启用LDAP认证): {}" -#: settings/utils/ldap.py:641 +#: settings/utils/ldap.py:643 msgid "Error (Unknown): {}" msgstr "错误 (未知): {}" -#: settings/utils/ldap.py:644 +#: settings/utils/ldap.py:646 msgid "Succeed: Match {} users" msgstr "成功匹配 {} 个用户" -#: settings/utils/ldap.py:677 +#: settings/utils/ldap.py:679 msgid "Authentication failed (configuration incorrect): {}" msgstr "认证失败 (配置错误): {}" -#: settings/utils/ldap.py:681 +#: settings/utils/ldap.py:683 msgid "Authentication failed (username or password incorrect): {}" msgstr "认证失败 (用户名或密码不正确): {}" -#: settings/utils/ldap.py:683 +#: settings/utils/ldap.py:685 msgid "Authentication failed (Unknown): {}" msgstr "认证失败: (未知): {}" -#: settings/utils/ldap.py:686 +#: settings/utils/ldap.py:688 msgid "Authentication success: {}" msgstr "认证成功: {}" -#: settings/ws.py:198 +#: settings/ws.py:203 msgid "No LDAP user was found" msgstr "没有获取到 LDAP 用户" -#: settings/ws.py:204 +#: settings/ws.py:209 msgid "Total {}, success {}, failure {}" msgstr "总共 {},成功 {},失败 {}" @@ -7907,7 +7918,7 @@ msgstr "检查命令及录像存储可连接性 " msgid "view" msgstr "查看" -#: terminal/utils/db_port_mapper.py:85 +#: terminal/utils/db_port_mapper.py:88 msgid "" "No available port is matched. The number of databases may have exceeded the " "number of ports open to the database agent service, Contact the " @@ -7916,13 +7927,13 @@ msgstr "" "未匹配到可用端口,数据库的数量可能已经超过数据库代理服务开放的端口数量,请联" "系管理员开放更多端口。" -#: terminal/utils/db_port_mapper.py:113 +#: terminal/utils/db_port_mapper.py:116 msgid "" "No ports can be used, check and modify the limit on the number of ports that " "Magnus listens on in the configuration file." msgstr "没有端口可以使用,检查并修改配置文件中 Magnus 监听的端口数量限制。" -#: terminal/utils/db_port_mapper.py:115 +#: terminal/utils/db_port_mapper.py:118 msgid "All available port count: {}, Already use port count: {}" msgstr "所有可用端口数量:{},已使用端口数量:{}" @@ -7985,19 +7996,19 @@ msgid "" msgstr "" "通过工单创建, 工单标题: {}, 工单申请人: {}, 工单处理人: {}, 工单 ID: {}" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "Change field" msgstr "变更字段" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "Before change" msgstr "变更前" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "After change" msgstr "变更后" -#: tickets/handlers/base.py:97 +#: tickets/handlers/base.py:96 msgid "{} {} the ticket" msgstr "{} {} 工单" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index e2de97732..0a1e2db6f 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-15 14:04+0800\n" +"POT-Creation-Date: 2024-08-30 15:08+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -110,11 +110,11 @@ msgstr "帳號備份計劃正在執行" msgid "Plan execution end" msgstr "計劃執行結束" -#: accounts/automations/change_secret/manager.py:100 +#: accounts/automations/change_secret/manager.py:97 msgid "No pending accounts found" msgstr "未找到待處理帳戶" -#: accounts/automations/change_secret/manager.py:227 +#: accounts/automations/change_secret/manager.py:225 #, python-format msgid "Success: %s, Failed: %s, Total: %s" msgstr "成功: %s, 失敗: %s, 總數: %s" @@ -125,7 +125,7 @@ msgstr "成功: %s, 失敗: %s, 總數: %s" #: authentication/confirm/password.py:24 authentication/confirm/password.py:26 #: authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 -#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:51 +#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 #: settings/serializers/msg.py:37 settings/serializers/terminal.py:28 #: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142 #: users/forms/profile.py:21 users/serializers/user.py:144 @@ -348,7 +348,7 @@ msgstr "用戶 %s 查看/匯出 了密碼" #: accounts/templates/accounts/asset_account_change_info.html:7 #: accounts/templates/accounts/change_secret_failed_info.html:11 #: acls/serializers/base.py:123 assets/models/asset/common.py:95 -#: assets/models/asset/common.py:349 assets/models/cmd_filter.py:36 +#: assets/models/asset/common.py:355 assets/models/cmd_filter.py:36 #: audits/models.py:58 authentication/models/connection_token.py:36 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:32 terminal/notifications.py:155 @@ -551,7 +551,7 @@ msgstr "SSH 金鑰推送方式" #: accounts/models/automations/gather_account.py:58 #: accounts/serializers/account/backup.py:40 #: accounts/serializers/automations/change_secret.py:58 -#: settings/serializers/auth/ldap.py:99 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:100 settings/serializers/msg.py:45 msgid "Recipient" msgstr "收件人" @@ -593,7 +593,7 @@ msgstr "結束日期" msgid "Status" msgstr "狀態" -#: accounts/models/automations/change_secret.py:47 +#: accounts/models/automations/change_secret.py:46 #: accounts/serializers/account/account.py:273 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:8 @@ -604,7 +604,7 @@ msgstr "狀態" msgid "Error" msgstr "錯誤" -#: accounts/models/automations/change_secret.py:51 +#: accounts/models/automations/change_secret.py:50 msgid "Change secret record" msgstr "改密記錄" @@ -834,7 +834,6 @@ msgstr "" "碼" #: accounts/notifications.py:83 -#: accounts/templates/accounts/asset_account_change_info.html:3 msgid "Gather account change information" msgstr "帳號變更資訊" @@ -950,7 +949,7 @@ msgstr "ID" #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 -#: rbac/builtin.py:124 rbac/models/rolebinding.py:49 +#: rbac/builtin.py:125 rbac/models/rolebinding.py:49 #: rbac/serializers/rolebinding.py:17 terminal/backends/command/models.py:16 #: terminal/models/session/session.py:30 terminal/models/session/sharing.py:34 #: terminal/notifications.py:156 terminal/notifications.py:205 @@ -1064,7 +1063,7 @@ msgstr "" "CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "節點" @@ -1125,14 +1124,22 @@ msgstr "添加帳號: %s" msgid "Delete account: %s" msgstr "刪除帳號: %s" -#: accounts/tasks/automation.py:25 +#: accounts/tasks/automation.py:31 msgid "Account execute automation" msgstr "帳號執行自動化" -#: accounts/tasks/automation.py:51 accounts/tasks/automation.py:56 +#: accounts/tasks/automation.py:57 accounts/tasks/automation.py:62 msgid "Execute automation record" msgstr "自動化執行記錄" +#: accounts/tasks/automation.py:86 +msgid "Clean change secret and push record period" +msgstr "週期清理改密記錄和推送記錄" + +#: accounts/tasks/automation.py:87 +msgid "Clean change secret and push record period description" +msgstr "系統會定期清理不必要的變更密文記錄和推播記錄,包括與變更任務、執行記錄、資產、帳戶相關的記錄。當任何這些關聯項被刪除時,相應的變更秘密和推送記錄將變得無效。因此,為了保持資料庫整潔、高效,系統預設每180天自動清理一次這些無效記錄。這種定期清理過程有助於釋放儲存空間並提高資料管理的安全性和整體效能。" + #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" msgstr "執行帳號備份計劃" @@ -1169,11 +1176,11 @@ msgstr "驗證資產帳號可用性" msgid "Verify accounts connectivity" msgstr "測試帳號可連接性" -#: accounts/templates/accounts/asset_account_change_info.html:8 +#: accounts/templates/accounts/asset_account_change_info.html:10 msgid "Added account" msgstr "新增帳號" -#: accounts/templates/accounts/asset_account_change_info.html:9 +#: accounts/templates/accounts/asset_account_change_info.html:13 msgid "Deleted account" msgstr "刪除帳號" @@ -1246,7 +1253,7 @@ msgstr "優先度可選範圍為 1-100 (數值越小越優先)" msgid "Reviewers" msgstr "審批人" -#: acls/models/base.py:43 assets/models/asset/common.py:165 +#: acls/models/base.py:43 assets/models/asset/common.py:171 #: authentication/models/access_key.py:25 #: authentication/models/connection_token.py:53 #: authentication/models/ssh_key.py:13 @@ -1833,39 +1840,39 @@ msgstr "埠" msgid "Address" msgstr "地址" -#: assets/models/asset/common.py:161 assets/models/platform.py:149 +#: assets/models/asset/common.py:162 assets/models/platform.py:149 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 msgid "Platform" msgstr "系統平台" -#: assets/models/asset/common.py:163 assets/models/domain.py:22 +#: assets/models/asset/common.py:166 assets/models/domain.py:22 msgid "Zone" msgstr "網域" -#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集資產硬體資訊" -#: assets/models/asset/common.py:167 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:173 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "自訂屬性" -#: assets/models/asset/common.py:352 +#: assets/models/asset/common.py:358 msgid "Can refresh asset hardware info" msgstr "可以更新資產硬體資訊" -#: assets/models/asset/common.py:353 +#: assets/models/asset/common.py:359 msgid "Can test asset connectivity" msgstr "可以測試資產連接性" -#: assets/models/asset/common.py:354 +#: assets/models/asset/common.py:360 msgid "Can match asset" msgstr "可以匹配資產" -#: assets/models/asset/common.py:355 +#: assets/models/asset/common.py:361 msgid "Can change asset nodes" msgstr "可以修改資產節點" @@ -3234,7 +3241,7 @@ msgstr "設置手機號碼啟用" msgid "Clear phone number to disable" msgstr "清空手機號碼禁用" -#: authentication/middleware.py:94 settings/utils/ldap.py:679 +#: authentication/middleware.py:94 settings/utils/ldap.py:681 msgid "Authentication failed (before login check failed): {}" msgstr "認證失敗 (登錄前檢查失敗): {}" @@ -4302,11 +4309,11 @@ msgstr "發布站內消息" msgid "No account available" msgstr "無可用帳號" -#: ops/ansible/inventory.py:285 +#: ops/ansible/inventory.py:286 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:301 +#: ops/ansible/inventory.py:302 msgid "Skip hosts below:" msgstr "跳過以下主機: " @@ -4490,17 +4497,17 @@ msgstr "命令執行禁用" msgid "no valid program entry found." msgstr "沒有可用程序入口" -#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:72 +#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:73 msgid "Periodic run" msgstr "週期性執行" #: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108 -#: settings/serializers/auth/ldap.py:79 +#: settings/serializers/auth/ldap.py:80 msgid "Interval" msgstr "間隔" #: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105 -#: settings/serializers/auth/ldap.py:76 +#: settings/serializers/auth/ldap.py:77 msgid "Crontab" msgstr "Crontab" @@ -4690,31 +4697,31 @@ msgstr "任務 ID" msgid "You do not have permission for the current job." msgstr "你沒有當前作業的權限。" -#: ops/tasks.py:38 +#: ops/tasks.py:50 msgid "Run ansible task" msgstr "運行 Ansible 任務" -#: ops/tasks.py:72 +#: ops/tasks.py:76 msgid "Run ansible task execution" msgstr "開始執行 Ansible 任務" -#: ops/tasks.py:94 +#: ops/tasks.py:89 msgid "Clear celery periodic tasks" msgstr "清理週期任務" -#: ops/tasks.py:115 +#: ops/tasks.py:110 msgid "Create or update periodic tasks" msgstr "創建或更新週期任務" -#: ops/tasks.py:123 +#: ops/tasks.py:118 msgid "Periodic check service performance" msgstr "週期檢測服務性能" -#: ops/tasks.py:129 +#: ops/tasks.py:124 msgid "Clean up unexpected jobs" msgstr "清理異常作業" -#: ops/tasks.py:136 +#: ops/tasks.py:131 msgid "Clean job_execution db record" msgstr "清理作業中心執行歷史" @@ -4758,17 +4765,17 @@ msgstr "Job ID" msgid "Name of the job" msgstr "Job 名稱" -#: orgs/api.py:61 +#: orgs/api.py:60 msgid "The current organization ({}) cannot be deleted" msgstr "當前組織 ({}) 不能被刪除" -#: orgs/api.py:66 +#: orgs/api.py:65 msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" msgstr "LDAP 同步設定組織為當前組織,請切換其他組織後再進行刪除操作" -#: orgs/api.py:76 +#: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" msgstr "組織存在資源 ({}) 不能被刪除" @@ -4992,27 +4999,27 @@ msgstr "{} 至少有一個系統角色" msgid "App RBAC" msgstr "RBAC" -#: rbac/builtin.py:115 +#: rbac/builtin.py:116 msgid "SystemAdmin" msgstr "系統管理員" -#: rbac/builtin.py:118 +#: rbac/builtin.py:119 msgid "SystemAuditor" msgstr "系統審計員" -#: rbac/builtin.py:121 +#: rbac/builtin.py:122 msgid "SystemComponent" msgstr "系統組件" -#: rbac/builtin.py:127 +#: rbac/builtin.py:128 msgid "OrgAdmin" msgstr "組織管理員" -#: rbac/builtin.py:130 +#: rbac/builtin.py:131 msgid "OrgAuditor" msgstr "組織審計員" -#: rbac/builtin.py:133 +#: rbac/builtin.py:134 msgid "OrgUser" msgstr "組織用戶" @@ -5210,7 +5217,7 @@ msgstr "郵件已經發送{}, 請檢查" msgid "Test smtp setting" msgstr "測試 smtp 設定" -#: settings/api/ldap.py:89 +#: settings/api/ldap.py:90 msgid "" "Users are not synchronized, please click the user synchronization button" msgstr "用戶未同步,請點擊同步用戶按鈕" @@ -5401,7 +5408,7 @@ msgstr "" msgid "CAS" msgstr "CAS" -#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:43 +#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 #: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "服務端地址" @@ -5429,7 +5436,7 @@ msgstr "啟用屬性映射" #: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:65 settings/serializers/auth/oauth2.py:60 +#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 #: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 #: settings/serializers/auth/slack.py:18 settings/serializers/auth/wecom.py:18 msgid "User attribute" @@ -5485,46 +5492,46 @@ msgstr "" "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務" "使用者屬性名稱" -#: settings/serializers/auth/ldap.py:40 settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" msgstr "LDAP" -#: settings/serializers/auth/ldap.py:44 +#: settings/serializers/auth/ldap.py:45 msgid "LDAP server URI" msgstr "LDAP 服務域名" -#: settings/serializers/auth/ldap.py:47 +#: settings/serializers/auth/ldap.py:48 msgid "Bind DN" msgstr "綁定 DN" -#: settings/serializers/auth/ldap.py:48 +#: settings/serializers/auth/ldap.py:49 msgid "Binding Distinguished Name" msgstr "綁定的 DN" -#: settings/serializers/auth/ldap.py:52 +#: settings/serializers/auth/ldap.py:53 msgid "Binding password" msgstr "原來的密碼" -#: settings/serializers/auth/ldap.py:55 +#: settings/serializers/auth/ldap.py:56 msgid "Search OU" msgstr "系統架構" -#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap.py:58 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "使用者搜尋庫,如果有多個OU,可以用`|`符號分隔" -#: settings/serializers/auth/ldap.py:61 +#: settings/serializers/auth/ldap.py:62 msgid "Search filter" msgstr "用戶過濾器" -#: settings/serializers/auth/ldap.py:62 +#: settings/serializers/auth/ldap.py:63 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "可能的選項是(cn或uid或sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap.py:68 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" @@ -5532,15 +5539,15 @@ msgstr "" "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務" "使用者屬性名稱" -#: settings/serializers/auth/ldap.py:83 +#: settings/serializers/auth/ldap.py:84 msgid "Connect timeout (s)" msgstr "連接超時時間 (秒)" -#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap.py:89 msgid "User DN cache timeout (s)" msgstr "快取逾時時間 (秒)" -#: settings/serializers/auth/ldap.py:90 +#: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " "effectivelyimprove the speed of user authentication., 0 means no cache
If " @@ -5550,7 +5557,7 @@ msgstr "" "對於使用者登錄認證時查詢的使用者 DN 進行快取,可以有效提高使用者認證的速度" "
如果使用者 OU 架構已調整,請點擊提交以清除使用者 DN 快取" -#: settings/serializers/auth/ldap.py:96 +#: settings/serializers/auth/ldap.py:97 msgid "Search paged size (piece)" msgstr "搜索分頁數量 (條)" @@ -5990,6 +5997,10 @@ msgid "" msgstr "" "會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" +#: settings/serializers/cleaning.py:53 +msgid "Change secret and push record retention days (day)" +msgstr "改密推送記錄保留天數 (天)" + #: settings/serializers/feature.py:18 settings/serializers/msg.py:68 msgid "Subject" msgstr "主題" @@ -6578,108 +6589,108 @@ msgstr "已同步用戶" msgid "No user synchronization required" msgstr "沒有用戶需要同步" -#: settings/utils/ldap.py:494 +#: settings/utils/ldap.py:496 msgid "ldap:// or ldaps:// protocol is used." msgstr "使用 ldap:// 或 ldaps:// 協議" -#: settings/utils/ldap.py:505 +#: settings/utils/ldap.py:507 msgid "Host or port is disconnected: {}" msgstr "主機或埠不可連接: {}" -#: settings/utils/ldap.py:507 +#: settings/utils/ldap.py:509 msgid "The port is not the port of the LDAP service: {}" msgstr "埠不是LDAP服務埠: {}" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:511 msgid "Please add certificate: {}" msgstr "請添加證書" -#: settings/utils/ldap.py:513 settings/utils/ldap.py:540 -#: settings/utils/ldap.py:570 settings/utils/ldap.py:598 +#: settings/utils/ldap.py:515 settings/utils/ldap.py:542 +#: settings/utils/ldap.py:572 settings/utils/ldap.py:600 msgid "Unknown error: {}" msgstr "未知錯誤: {}" -#: settings/utils/ldap.py:527 +#: settings/utils/ldap.py:529 msgid "Bind DN or Password incorrect" msgstr "綁定DN或密碼錯誤" -#: settings/utils/ldap.py:534 +#: settings/utils/ldap.py:536 msgid "Please enter Bind DN: {}" msgstr "請輸入綁定DN: {}" -#: settings/utils/ldap.py:536 +#: settings/utils/ldap.py:538 msgid "Please enter Password: {}" msgstr "請輸入密碼: {}" -#: settings/utils/ldap.py:538 +#: settings/utils/ldap.py:540 msgid "Please enter correct Bind DN and Password: {}" msgstr "請輸入正確的綁定DN和密碼: {}" -#: settings/utils/ldap.py:556 +#: settings/utils/ldap.py:558 msgid "Invalid User OU or User search filter: {}" msgstr "不合法的用戶OU或用戶過濾器: {}" -#: settings/utils/ldap.py:587 +#: settings/utils/ldap.py:589 msgid "LDAP User attr map not include: {}" msgstr "LDAP屬性映射沒有包含: {}" -#: settings/utils/ldap.py:594 +#: settings/utils/ldap.py:596 msgid "LDAP User attr map is not dict" msgstr "LDAP屬性映射不合法" -#: settings/utils/ldap.py:613 +#: settings/utils/ldap.py:615 msgid "LDAP authentication is not enabled" msgstr "LDAP認證沒有啟用" -#: settings/utils/ldap.py:631 +#: settings/utils/ldap.py:633 msgid "Error (Invalid LDAP server): {}" msgstr "錯誤 (不合法的LDAP伺服器地址): {}" -#: settings/utils/ldap.py:633 +#: settings/utils/ldap.py:635 msgid "Error (Invalid Bind DN): {}" msgstr "錯誤 (不合法的綁定DN): {}" -#: settings/utils/ldap.py:635 +#: settings/utils/ldap.py:637 msgid "Error (Invalid LDAP User attr map): {}" msgstr "錯誤 (不合法的LDAP屬性映射): {}" -#: settings/utils/ldap.py:637 +#: settings/utils/ldap.py:639 msgid "Error (Invalid User OU or User search filter): {}" msgstr "錯誤 (不合法的用戶OU或用戶過濾器): {}" -#: settings/utils/ldap.py:639 +#: settings/utils/ldap.py:641 msgid "Error (Not enabled LDAP authentication): {}" msgstr "錯誤 (沒有啟用LDAP認證): {}" -#: settings/utils/ldap.py:641 +#: settings/utils/ldap.py:643 msgid "Error (Unknown): {}" msgstr "錯誤 (未知): {}" -#: settings/utils/ldap.py:644 +#: settings/utils/ldap.py:646 msgid "Succeed: Match {} users" msgstr "成功配對 {} 個用戶" -#: settings/utils/ldap.py:677 +#: settings/utils/ldap.py:679 msgid "Authentication failed (configuration incorrect): {}" msgstr "認證失敗 (配置錯誤): {}" -#: settings/utils/ldap.py:681 +#: settings/utils/ldap.py:683 msgid "Authentication failed (username or password incorrect): {}" msgstr "認證失敗 (使用者名稱或密碼不正確): {}" -#: settings/utils/ldap.py:683 +#: settings/utils/ldap.py:685 msgid "Authentication failed (Unknown): {}" msgstr "認證失敗: (未知): {}" -#: settings/utils/ldap.py:686 +#: settings/utils/ldap.py:688 msgid "Authentication success: {}" msgstr "認證成功: {}" -#: settings/ws.py:198 +#: settings/ws.py:203 msgid "No LDAP user was found" msgstr "沒有取得到 LDAP 用戶" -#: settings/ws.py:204 +#: settings/ws.py:209 msgid "Total {}, success {}, failure {}" msgstr "總共 {},成功 {},失敗 {}" @@ -7910,7 +7921,7 @@ msgstr "檢查命令及錄影儲存可連接性 " msgid "view" msgstr "查看" -#: terminal/utils/db_port_mapper.py:85 +#: terminal/utils/db_port_mapper.py:88 msgid "" "No available port is matched. The number of databases may have exceeded the " "number of ports open to the database agent service, Contact the " @@ -7919,13 +7930,13 @@ msgstr "" "未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管" "理員開放更多埠。" -#: terminal/utils/db_port_mapper.py:113 +#: terminal/utils/db_port_mapper.py:116 msgid "" "No ports can be used, check and modify the limit on the number of ports that " "Magnus listens on in the configuration file." msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。" -#: terminal/utils/db_port_mapper.py:115 +#: terminal/utils/db_port_mapper.py:118 msgid "All available port count: {}, Already use port count: {}" msgstr "所有可用埠數量:{},已使用埠數量:{}" @@ -7988,19 +7999,19 @@ msgid "" msgstr "" "通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "Change field" msgstr "變更欄位" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "Before change" msgstr "變更前" -#: tickets/handlers/base.py:85 +#: tickets/handlers/base.py:84 msgid "After change" msgstr "變更後" -#: tickets/handlers/base.py:97 +#: tickets/handlers/base.py:96 msgid "{} {} the ticket" msgstr "{} {} 工單" From 1068662ab1af833cd6b70bcedec731f08d16d11c Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 30 Aug 2024 09:54:21 +0800 Subject: [PATCH 21/98] perf: Optimize asset connection speed with es command storage --- apps/terminal/serializers/session.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/terminal/serializers/session.py b/apps/terminal/serializers/session.py index 7bc08a2ad..91928431d 100644 --- a/apps/terminal/serializers/session.py +++ b/apps/terminal/serializers/session.py @@ -58,6 +58,15 @@ class SessionSerializer(BulkOrgResourceModelSerializer): 'terminal_display': {'label': _('Terminal display')}, } + def get_fields(self): + fields = super().get_fields() + self.pop_fields_if_need(fields) + return fields + + def pop_fields_if_need(self, fields): + if self.context['request'].method != "GET": + fields.pop("command_amount") + def validate_asset(self, value): max_length = self.Meta.model.asset.field.max_length value = pretty_string(value, max_length=max_length) From c545e2a3aa716599e12a539cd89ea79be5b6ba05 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 29 Aug 2024 19:23:04 +0800 Subject: [PATCH 22/98] perf: Support SAML2, OIDC user authentication services, mapping user group field information --- apps/authentication/backends/oidc/backends.py | 25 ++++----- .../authentication/backends/saml2/backends.py | 4 ++ apps/authentication/backends/saml2/views.py | 3 +- apps/users/signal_handlers.py | 52 +++++++++++++++++-- 4 files changed, 67 insertions(+), 17 deletions(-) diff --git a/apps/authentication/backends/oidc/backends.py b/apps/authentication/backends/oidc/backends.py index f29bf95e5..7586eb479 100644 --- a/apps/authentication/backends/oidc/backends.py +++ b/apps/authentication/backends/oidc/backends.py @@ -8,27 +8,26 @@ """ import base64 -import requests -from rest_framework.exceptions import ParseError +import requests +from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.auth.backends import ModelBackend from django.core.exceptions import SuspiciousOperation from django.db import transaction from django.urls import reverse -from django.conf import settings +from rest_framework.exceptions import ParseError -from common.utils import get_logger +from authentication.signals import user_auth_success, user_auth_failed from authentication.utils import build_absolute_uri_for_oidc +from common.utils import get_logger from users.utils import construct_user_email - -from ..base import JMSBaseAuthBackend -from .utils import validate_and_return_id_token from .decorator import ssl_verification from .signals import ( openid_create_or_update_user ) -from authentication.signals import user_auth_success, user_auth_failed +from .utils import validate_and_return_id_token +from ..base import JMSBaseAuthBackend logger = get_logger(__file__) @@ -55,16 +54,17 @@ class UserMixin: logger.debug(log_prompt.format(user_attrs)) username = user_attrs.get('username') - name = user_attrs.get('name') + groups = user_attrs.pop('groups', None) user, created = get_user_model().objects.get_or_create( username=username, defaults=user_attrs ) + user_attrs['groups'] = groups logger.debug(log_prompt.format("user: {}|created: {}".format(user, created))) logger.debug(log_prompt.format("Send signal => openid create or update user")) openid_create_or_update_user.send( - sender=self.__class__, request=request, user=user, created=created, - name=name, username=username, email=email + sender=self.__class__, request=request, user=user, + created=created, attrs=user_attrs, ) return user, created @@ -269,7 +269,8 @@ class OIDCAuthPasswordBackend(OIDCBaseBackend): # Calls the token endpoint. logger.debug(log_prompt.format('Call the token endpoint')) - token_response = requests.post(settings.AUTH_OPENID_PROVIDER_TOKEN_ENDPOINT, data=token_payload, timeout=request_timeout) + token_response = requests.post(settings.AUTH_OPENID_PROVIDER_TOKEN_ENDPOINT, data=token_payload, + timeout=request_timeout) try: token_response.raise_for_status() token_response_data = token_response.json() diff --git a/apps/authentication/backends/saml2/backends.py b/apps/authentication/backends/saml2/backends.py index 570557c1d..ac2aa7bb7 100644 --- a/apps/authentication/backends/saml2/backends.py +++ b/apps/authentication/backends/saml2/backends.py @@ -27,9 +27,13 @@ class SAML2Backend(JMSModelBackend): log_prompt = "Get or Create user [SAML2Backend]: {}" logger.debug(log_prompt.format('start')) + groups = saml_user_data.pop('groups', None) + user, created = get_user_model().objects.get_or_create( username=saml_user_data['username'], defaults=saml_user_data ) + + saml_user_data['groups'] = groups logger.debug(log_prompt.format("user: {}|created: {}".format(user, created))) logger.debug(log_prompt.format("Send signal => saml2 create or update user")) diff --git a/apps/authentication/backends/saml2/views.py b/apps/authentication/backends/saml2/views.py index 5a866cc47..22a5a9a68 100644 --- a/apps/authentication/backends/saml2/views.py +++ b/apps/authentication/backends/saml2/views.py @@ -87,6 +87,7 @@ class PrepareRequestMixin: ('name', 'name', False), ('phone', 'phone', False), ('comment', 'comment', False), + ('groups', 'groups', False), ) attr_list = [] for name, friend_name, is_required in need_attrs: @@ -185,7 +186,7 @@ class PrepareRequestMixin: user_attrs = {} attr_mapping = settings.SAML2_RENAME_ATTRIBUTES attrs = saml_instance.get_attributes() - valid_attrs = ['username', 'name', 'email', 'comment', 'phone'] + valid_attrs = ['username', 'name', 'email', 'comment', 'phone', 'groups'] for attr, value in attrs.items(): attr = attr.rsplit('/', 1)[-1] diff --git a/apps/users/signal_handlers.py b/apps/users/signal_handlers.py index 5bc116adf..c7be331aa 100644 --- a/apps/users/signal_handlers.py +++ b/apps/users/signal_handlers.py @@ -21,11 +21,13 @@ from common.signals import django_ready from common.utils import get_logger from jumpserver.utils import get_current_request from ops.celery.decorator import register_as_period_task +from orgs.models import Organization +from orgs.utils import tmp_to_root_org from rbac.builtin import BuiltinRole from rbac.const import Scope from rbac.models import RoleBinding from settings.signals import setting_changed -from .models import User, UserPasswordHistory +from .models import User, UserPasswordHistory, UserGroup from .signals import post_user_create logger = get_logger(__file__) @@ -50,7 +52,9 @@ def user_authenticated_handle(user, created, source, attrs=None, **kwargs): if created: user.source = source user.save() - bind_user_to_org_role(user) + org_ids = bind_user_to_org_role(user) + group_names = attrs.get('groups') + bind_user_to_group(org_ids, group_names, user) if not attrs: return @@ -146,7 +150,7 @@ def radius_create_user(sender, user, **kwargs): @receiver(openid_create_or_update_user) -def on_openid_create_or_update_user(sender, request, user, created, name, username, email, **kwargs): +def on_openid_create_or_update_user(sender, request, user, created, attrs, **kwargs): if not check_only_allow_exist_user_auth(created): return @@ -157,7 +161,13 @@ def on_openid_create_or_update_user(sender, request, user, created, name, userna ) user.source = User.Source.openid.value user.save() - bind_user_to_org_role(user) + org_ids = bind_user_to_org_role(user) + group_names = attrs.get('groups') + bind_user_to_group(org_ids, group_names, user) + + name = attrs.get('name') + username = attrs.get('username') + email = attrs.get('email') if not created and settings.AUTH_OPENID_ALWAYS_UPDATE_USER: logger.debug( @@ -225,3 +235,37 @@ def bind_user_to_org_role(user): ] RoleBinding.objects.bulk_create(bindings, ignore_conflicts=True) + return org_ids + + +def bind_user_to_group(org_ids, group_names, user): + if not isinstance(group_names, list): + return + + org_ids = org_ids or [Organization.DEFAULT_ID] + + with tmp_to_root_org(): + existing_groups = UserGroup.objects.filter(org_id__in=org_ids).values_list('org_id', 'name') + + org_groups_map = {} + for org_id, group_name in existing_groups: + org_groups_map.setdefault(org_id, []).append(group_name) + + groups_to_create = [] + for org_id in org_ids: + existing_group_names = set(org_groups_map.get(org_id, [])) + new_group_names = set(group_names) - existing_group_names + groups_to_create.extend( + UserGroup(org_id=org_id, name=name) for name in new_group_names + ) + + UserGroup.objects.bulk_create(groups_to_create) + + user_groups = UserGroup.objects.filter(org_id__in=org_ids, name__in=group_names) + + user_group_links = [ + User.groups.through(user_id=user.id, usergroup_id=group.id) + for group in user_groups + ] + if user_group_links: + User.groups.through.objects.bulk_create(user_group_links) From 8755ece633e7a27f06ff6238166d3d10fdb2703c Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 30 Aug 2024 17:40:24 +0800 Subject: [PATCH 23/98] perf: Translate --- apps/i18n/lina/en.json | 3 ++- apps/i18n/lina/ja.json | 3 ++- apps/i18n/lina/zh.json | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index 701364796..9f555cd26 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -1394,5 +1394,6 @@ "AdhocCreate": "Create the command", "UploadHelpText": "Please upload a .zip file containing the following sample directory structure", "SessionJoinRecords": "collaboration records", - "ApprovalSelected": "Batch approval" + "ApprovalSelected": "Batch approval", + "disallowSelfUpdateFields": "Not allowed to modify the current fields yourself" } diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json index 848834c4b..f2bd7617b 100644 --- a/apps/i18n/lina/ja.json +++ b/apps/i18n/lina/ja.json @@ -1432,5 +1432,6 @@ "AdhocCreate": "アドホックコマンドを作成", "UploadHelpText": "次のサンプル構造ディレクトリを含む .zip ファイルをアップロードしてください。", "SessionJoinRecords": "協力記録", - "ApprovalSelected": "大量承認です" + "ApprovalSelected": "大量承認です", + "disallowSelfUpdateFields": "現在のフィールドを自分で変更することは許可されていません" } diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index b92f37b32..7b8d3c4d5 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -1397,5 +1397,6 @@ "AdhocCreate": "创建命令", "UploadHelpText": "请上传包含以下示例结构目录的 .zip 压缩文件", "SessionJoinRecords": "协作记录", - "ApprovalSelected": "批量审批" + "ApprovalSelected": "批量审批", + "disallowSelfUpdateFields": "不允许自己修改当前字段" } From 55e8e34226922594fac816e8fb136ecd961c8f57 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 30 Aug 2024 17:57:48 +0800 Subject: [PATCH 24/98] fix: 500 error caused by duplicate email or username --- apps/authentication/backends/oidc/views.py | 13 +++++++++++-- apps/i18n/core/ja/LC_MESSAGES/django.po | 20 ++++++++++++++++++-- apps/i18n/core/zh/LC_MESSAGES/django.po | 17 +++++++++++++++-- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 16 ++++++++++++++-- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/apps/authentication/backends/oidc/views.py b/apps/authentication/backends/oidc/views.py index 56c1e4fb0..117c46c56 100644 --- a/apps/authentication/backends/oidc/views.py +++ b/apps/authentication/backends/oidc/views.py @@ -17,13 +17,16 @@ import time from django.conf import settings from django.contrib import auth from django.core.exceptions import SuspiciousOperation +from django.db import IntegrityError from django.http import HttpResponseRedirect, QueryDict from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.http import urlencode from django.views.generic import View +from django.utils.translation import gettext_lazy as _ from authentication.utils import build_absolute_uri_for_oidc +from authentication.views.mixins import FlashMessageMixin from common.utils import safe_next_url from .utils import get_logger @@ -113,7 +116,7 @@ class OIDCAuthRequestView(View): return HttpResponseRedirect(redirect_url) -class OIDCAuthCallbackView(View): +class OIDCAuthCallbackView(View, FlashMessageMixin): """ Allows to complete the authentication process. This view acts as the main endpoint to complete the authentication process involving the OIDC @@ -165,7 +168,13 @@ class OIDCAuthCallbackView(View): next_url = request.session.get('oidc_auth_next_url', None) code_verifier = request.session.get('oidc_auth_code_verifier', None) logger.debug(log_prompt.format('Process authenticate')) - user = auth.authenticate(nonce=nonce, request=request, code_verifier=code_verifier) + try: + user = auth.authenticate(nonce=nonce, request=request, code_verifier=code_verifier) + except IntegrityError: + title = _("OpenID Error") + msg = _('Username or email already exists, Please check') + response = self.get_failed_response('/', title, msg) + return response if user: logger.debug(log_prompt.format('Login: {}'.format(user))) auth.login(self.request, user) diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 95e4e78bf..fba291bfa 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-30 15:08+0800\n" +"POT-Creation-Date: 2024-09-02 10:59+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1140,7 +1140,15 @@ msgstr "パスワード変更記録とプッシュ記録を定期的にクリア #: accounts/tasks/automation.py:87 msgid "Clean change secret and push record period description" -msgstr "システムは、変更タスク、実行レコード、資産、アカウントに関連するものを含め、不要な変更シークレット レコードとプッシュ レコードを定期的にクリーンアップします。これらの関連項目のいずれかが削除されると、対応する変更シークレット レコードとプッシュ レコードは無効になります。したがって、整然とした効率的なデータベースを維持するために、システムはデフォルトでこれらの無効なレコードを 180 日ごとに自動的にクリーンアップします。この定期的なクリーンアップ プロセスにより、ストレージ領域が解放され、データ管理のセキュリティと全体的なパフォーマンスが向上します。" +msgstr "" +"システムは、変更タスク、実行レコード、資産、アカウントに関連するものを含め、" +"不要な変更シークレット レコードとプッシュ レコードを定期的にクリーンアップし" +"ます。これらの関連項目のいずれかが削除されると、対応する変更シークレット レ" +"コードとプッシュ レコードは無効になります。したがって、整然とした効率的なデー" +"タベースを維持するために、システムはデフォルトでこれらの無効なレコードを 180 " +"日ごとに自動的にクリーンアップします。この定期的なクリーンアップ プロセスによ" +"り、ストレージ領域が解放され、データ管理のセキュリティと全体的なパフォーマン" +"スが向上します。" #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" @@ -2972,6 +2980,14 @@ msgstr "" msgid "Invalid token or cache refreshed." msgstr "無効なトークンまたはキャッシュの更新。" +#: authentication/backends/oidc/views.py:174 +msgid "OpenID Error" +msgstr "OpenID エラー" + +#: authentication/backends/oidc/views.py:175 +msgid "Username or email already exists, Please check" +msgstr "ユーザー名またはメールアドレスが既に存在しています。ご確認ください" + #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" msgstr "ローカル・ユーザーのみの鍵の登録" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index c3767dc92..385f7d7d2 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-30 15:08+0800\n" +"POT-Creation-Date: 2024-09-02 10:59+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -1136,7 +1136,12 @@ msgstr "周期清理改密记录和推送记录" #: accounts/tasks/automation.py:87 msgid "Clean change secret and push record period description" -msgstr "系统会定期清理不再需要的改密记录和推送记录,包括那些关联的改密任务、执行记录、资产和账号。当这些关联项中的任意一个被删除时,对应的改密和推送记录将变为无效。因此,为了保持数据库的整洁和高效运行,系统默认每180天自动清理这些无效记录。这种定期清理机制不仅有助于释放存储空间,还能提高数据管理的安全性和整体性能。" +msgstr "" +"系统会定期清理不再需要的改密记录和推送记录,包括那些关联的改密任务、执行记" +"录、资产和账号。当这些关联项中的任意一个被删除时,对应的改密和推送记录将变为" +"无效。因此,为了保持数据库的整洁和高效运行,系统默认每180天自动清理这些无效记" +"录。这种定期清理机制不仅有助于释放存储空间,还能提高数据管理的安全性和整体性" +"能。" #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" @@ -2942,6 +2947,14 @@ msgstr "无效的令牌头。符号字符串不应包含无效字符。" msgid "Invalid token or cache refreshed." msgstr "刷新的令牌或缓存无效。" +#: authentication/backends/oidc/views.py:174 +msgid "OpenID Error" +msgstr "OpenID 错误" + +#: authentication/backends/oidc/views.py:175 +msgid "Username or email already exists, Please check" +msgstr "用户名或者邮箱已经存在,请检查" + #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" msgstr "仅为本地用户注册密钥" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 0a1e2db6f..d13397912 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-30 15:08+0800\n" +"POT-Creation-Date: 2024-09-02 10:59+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -1138,7 +1138,11 @@ msgstr "週期清理改密記錄和推送記錄" #: accounts/tasks/automation.py:87 msgid "Clean change secret and push record period description" -msgstr "系統會定期清理不必要的變更密文記錄和推播記錄,包括與變更任務、執行記錄、資產、帳戶相關的記錄。當任何這些關聯項被刪除時,相應的變更秘密和推送記錄將變得無效。因此,為了保持資料庫整潔、高效,系統預設每180天自動清理一次這些無效記錄。這種定期清理過程有助於釋放儲存空間並提高資料管理的安全性和整體效能。" +msgstr "" +"系統會定期清理不必要的變更密文記錄和推播記錄,包括與變更任務、執行記錄、資" +"產、帳戶相關的記錄。當任何這些關聯項被刪除時,相應的變更秘密和推送記錄將變得" +"無效。因此,為了保持資料庫整潔、高效,系統預設每180天自動清理一次這些無效記" +"錄。這種定期清理過程有助於釋放儲存空間並提高資料管理的安全性和整體效能。" #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" @@ -2944,6 +2948,14 @@ msgstr "無效的令牌頭。符號字串不應包含無效字元。" msgid "Invalid token or cache refreshed." msgstr "刷新的令牌或快取無效。" +#: authentication/backends/oidc/views.py:174 +msgid "OpenID Error" +msgstr "OpenID 錯誤" + +#: authentication/backends/oidc/views.py:175 +msgid "Username or email already exists, Please check" +msgstr "使用者名稱或者電子郵件已經存在,請檢查" + #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" msgstr "僅為本地用戶註冊金鑰" From e94520a3fd9edad8edccfcdb1689ba89238a2a4e Mon Sep 17 00:00:00 2001 From: kebyn Date: Mon, 2 Sep 2024 02:10:41 +0000 Subject: [PATCH 25/98] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9D=9E?= =?UTF-8?q?=E6=A0=87=E5=87=86=E5=AE=9E=E7=8E=B0=20X-Forwarded-For=20?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/utils/common.py | 4 ++-- apps/common/utils/http.py | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/common/utils/common.py b/apps/common/utils/common.py index b2c695c74..4715906df 100644 --- a/apps/common/utils/common.py +++ b/apps/common/utils/common.py @@ -158,7 +158,7 @@ def is_uuid(seq): def get_request_ip(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', '').split(',') if x_forwarded_for and x_forwarded_for[0]: - login_ip = x_forwarded_for[0] + login_ip = x_forwarded_for[0].split(":")[0] return login_ip login_ip = request.META.get('REMOTE_ADDR', '') @@ -293,7 +293,7 @@ def get_docker_mem_usage_if_limit(): inactive_file = int(inactive_file) return ((usage_in_bytes - inactive_file) / limit_in_bytes) * 100 - except Exception as e: + except Exception: return None diff --git a/apps/common/utils/http.py b/apps/common/utils/http.py index baf741407..30baa8d01 100644 --- a/apps/common/utils/http.py +++ b/apps/common/utils/http.py @@ -39,10 +39,6 @@ def iso8601_to_unixtime(time_string): return to_unixtime(time_string, _ISO8601_FORMAT) -def get_remote_addr(request): - return request.META.get("HTTP_X_FORWARDED_HOST") or request.META.get("REMOTE_ADDR") - - def is_true(value): return value in BooleanField.TRUE_VALUES From c8b7008d421e65c689eb833d37e65ec26be604a1 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 6 Sep 2024 10:34:35 +0800 Subject: [PATCH 26/98] perf: Translate --- apps/authentication/backends/oidc/views.py | 2 +- apps/i18n/core/ja/LC_MESSAGES/django.po | 14 +++++++------- apps/i18n/core/zh/LC_MESSAGES/django.po | 14 +++++++------- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 14 +++++++------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/apps/authentication/backends/oidc/views.py b/apps/authentication/backends/oidc/views.py index 117c46c56..6d3df51a4 100644 --- a/apps/authentication/backends/oidc/views.py +++ b/apps/authentication/backends/oidc/views.py @@ -172,7 +172,7 @@ class OIDCAuthCallbackView(View, FlashMessageMixin): user = auth.authenticate(nonce=nonce, request=request, code_verifier=code_verifier) except IntegrityError: title = _("OpenID Error") - msg = _('Username or email already exists, Please check') + msg = _('Please check if a user with the same username or email already exists') response = self.get_failed_response('/', title, msg) return response if user: diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index fba291bfa..2122b2a80 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-02 10:59+0800\n" +"POT-Creation-Date: 2024-09-06 10:29+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2630,7 +2630,7 @@ msgstr "終了" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:69 +#: terminal/serializers/session.py:78 msgid "Terminal" msgstr "ターミナル" @@ -2985,8 +2985,8 @@ msgid "OpenID Error" msgstr "OpenID エラー" #: authentication/backends/oidc/views.py:175 -msgid "Username or email already exists, Please check" -msgstr "ユーザー名またはメールアドレスが既に存在しています。ご確認ください" +msgid "Please check if a user with the same username or email already exists" +msgstr "同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認してください" #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" @@ -7463,7 +7463,7 @@ msgstr "ログイン元" msgid "Replay" msgstr "リプレイ" -#: terminal/models/session/session.py:48 terminal/serializers/session.py:68 +#: terminal/models/session/session.py:48 terminal/serializers/session.py:77 msgid "Command amount" msgstr "コマンド量" @@ -8892,7 +8892,7 @@ msgstr "" msgid "name not unique" msgstr "名前が一意ではない" -#: users/signal_handlers.py:39 +#: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" " and the current user is not in the user list. Please contact the " @@ -8901,7 +8901,7 @@ msgstr "" "管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザー" "はユーザーリストにありません。管理者に連絡してください。" -#: users/signal_handlers.py:183 +#: users/signal_handlers.py:193 msgid "Clean up expired user sessions" msgstr "期限切れのユーザー・セッションのパージ" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 385f7d7d2..ac1f04910 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-02 10:59+0800\n" +"POT-Creation-Date: 2024-09-06 10:29+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -2602,7 +2602,7 @@ msgstr "结束" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:69 +#: terminal/serializers/session.py:78 msgid "Terminal" msgstr "终端" @@ -2952,8 +2952,8 @@ msgid "OpenID Error" msgstr "OpenID 错误" #: authentication/backends/oidc/views.py:175 -msgid "Username or email already exists, Please check" -msgstr "用户名或者邮箱已经存在,请检查" +msgid "Please check if a user with the same username or email already exists" +msgstr "请检查是否已经存在相同用户名或邮箱的用户" #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" @@ -7322,7 +7322,7 @@ msgstr "登录来源" msgid "Replay" msgstr "回放" -#: terminal/models/session/session.py:48 terminal/serializers/session.py:68 +#: terminal/models/session/session.py:48 terminal/serializers/session.py:77 msgid "Command amount" msgstr "命令数量" @@ -8723,7 +8723,7 @@ msgstr "* 为安全起见,只显示部分用户。您可以搜索更多" msgid "name not unique" msgstr "名称重复" -#: users/signal_handlers.py:39 +#: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" " and the current user is not in the user list. Please contact the " @@ -8731,7 +8731,7 @@ msgid "" msgstr "" "管理员已开启'仅允许已存在用户登录',当前用户不在用户列表中,请联系管理员。" -#: users/signal_handlers.py:183 +#: users/signal_handlers.py:193 msgid "Clean up expired user sessions" msgstr "清除过期的用户会话" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index d13397912..5a9357fda 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-02 10:59+0800\n" +"POT-Creation-Date: 2024-09-06 10:29+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -2603,7 +2603,7 @@ msgstr "結束" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:69 +#: terminal/serializers/session.py:78 msgid "Terminal" msgstr "終端" @@ -2953,8 +2953,8 @@ msgid "OpenID Error" msgstr "OpenID 錯誤" #: authentication/backends/oidc/views.py:175 -msgid "Username or email already exists, Please check" -msgstr "使用者名稱或者電子郵件已經存在,請檢查" +msgid "Please check if a user with the same username or email already exists" +msgstr "請檢查是否已經存在相同用戶名或電子郵箱的用戶" #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" @@ -7324,7 +7324,7 @@ msgstr "登錄來源" msgid "Replay" msgstr "重播" -#: terminal/models/session/session.py:48 terminal/serializers/session.py:68 +#: terminal/models/session/session.py:48 terminal/serializers/session.py:77 msgid "Command amount" msgstr "命令數量" @@ -8732,7 +8732,7 @@ msgstr "" msgid "name not unique" msgstr "名稱重複" -#: users/signal_handlers.py:39 +#: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" " and the current user is not in the user list. Please contact the " @@ -8740,7 +8740,7 @@ msgid "" msgstr "" "管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" -#: users/signal_handlers.py:183 +#: users/signal_handlers.py:193 msgid "Clean up expired user sessions" msgstr "清除過期的用戶會話" From 50d3a4906ab9bdf524c257447ecff828b37304f3 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Mon, 2 Sep 2024 16:40:51 +0800 Subject: [PATCH 27/98] feat: Add announcement start and end dates --- apps/settings/models.py | 3 ++- apps/settings/serializers/feature.py | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/settings/models.py b/apps/settings/models.py index b39408098..98964ad0e 100644 --- a/apps/settings/models.py +++ b/apps/settings/models.py @@ -7,6 +7,7 @@ from django.core.files.uploadedfile import InMemoryUploadedFile from django.db import models from django.db.utils import ProgrammingError, OperationalError from django.utils.translation import gettext_lazy as _ +from rest_framework.utils.encoders import JSONEncoder from common.db.models import JMSBaseModel from common.utils import signer, get_logger @@ -63,7 +64,7 @@ class Setting(models.Model): @cleaned_value.setter def cleaned_value(self, item): try: - v = json.dumps(item) + v = json.dumps(item, cls=JSONEncoder) if self.encrypted: v = signer.sign(v) self.value = v diff --git a/apps/settings/serializers/feature.py b/apps/settings/serializers/feature.py index 4b219373d..3deb49942 100644 --- a/apps/settings/serializers/feature.py +++ b/apps/settings/serializers/feature.py @@ -1,10 +1,11 @@ import uuid - +from django.utils import timezone from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from assets.const import Protocol from common.serializers.fields import EncryptedField +from common.utils import date_expired_default __all__ = [ 'AnnouncementSettingSerializer', 'OpsSettingSerializer', @@ -21,6 +22,8 @@ class AnnouncementSerializer(serializers.Serializer): required=False, allow_null=True, allow_blank=True, label=_("More Link"), default='', ) + DATE_START = serializers.DateTimeField(default=timezone.now, label=_("Date start")) + DATE_END = serializers.DateTimeField(default=date_expired_default, label=_("Date end")) def to_representation(self, instance): defaults = {'ID': '', 'SUBJECT': '', 'CONTENT': '', 'LINK': '', 'ENABLED': False} From 054d385ffcf25b73b347d01f4aa9da58c2d8c654 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 5 Sep 2024 15:49:58 +0800 Subject: [PATCH 28/98] perf: Acl action add notify and warn --- apps/acls/const.py | 1 + apps/acls/serializers/base.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/acls/const.py b/apps/acls/const.py index 3c03d8e2d..f36bfc21e 100644 --- a/apps/acls/const.py +++ b/apps/acls/const.py @@ -8,3 +8,4 @@ class ActionChoices(models.TextChoices): review = 'review', _('Review') warning = 'warning', _('Warn') notice = 'notice', _('Notify') + notify_and_warn = 'notify_and_warn', _('Notify and warn') diff --git a/apps/acls/serializers/base.py b/apps/acls/serializers/base.py index 09f75bf42..4dfa56b9f 100644 --- a/apps/acls/serializers/base.py +++ b/apps/acls/serializers/base.py @@ -62,7 +62,7 @@ class ActionAclSerializer(serializers.Serializer): self.set_action_choices() class Meta: - action_choices_exclude = [ActionChoices.warning] + action_choices_exclude = [ActionChoices.warning, ActionChoices.notify_and_warn] def set_action_choices(self): field_action = self.fields.get("action") From 1baacd0b2c8042f282cd2af675b58367a3f4251f Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Fri, 6 Sep 2024 15:27:13 +0800 Subject: [PATCH 29/98] perf: Disable delete admin user --- apps/users/api/user.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/users/api/user.py b/apps/users/api/user.py index 1088da6e8..57a896eae 100644 --- a/apps/users/api/user.py +++ b/apps/users/api/user.py @@ -4,6 +4,7 @@ from collections import defaultdict from django.utils.translation import gettext as _ from rest_framework import generics from rest_framework.decorators import action +from rest_framework.exceptions import PermissionDenied from rest_framework.response import Response from rest_framework_bulk import BulkModelViewSet @@ -57,6 +58,11 @@ class UserViewSet(CommonApiMixin, UserQuerysetMixin, SuggestionMixin, BulkModelV raise UnableToDeleteAllUsers() return True + def perform_destroy(self, instance): + if instance.username == 'admin': + raise PermissionDenied(_("Cannot delete the admin user. Please disable it instead.")) + super().perform_destroy(instance) + @action(methods=['get'], detail=False, url_path='suggestions') def match(self, request, *args, **kwargs): with tmp_to_root_org(): From 7973239424b809b68588beb4888e0f3998b5a0c9 Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 4 Sep 2024 18:24:41 +0800 Subject: [PATCH 30/98] perf: support change gateway platform --- apps/assets/api/platform.py | 11 ++++++++++- apps/assets/serializers/gateway.py | 5 +++++ apps/i18n/lina/en.json | 1 + apps/i18n/lina/zh.json | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/assets/api/platform.py b/apps/assets/api/platform.py index bce8505cf..ca6dc882f 100644 --- a/apps/assets/api/platform.py +++ b/apps/assets/api/platform.py @@ -1,4 +1,5 @@ from django.db.models import Count +from django_filters import rest_framework as filters from rest_framework import generics from rest_framework import serializers from rest_framework.decorators import action @@ -14,6 +15,14 @@ from common.serializers import GroupedChoiceSerializer __all__ = ['AssetPlatformViewSet', 'PlatformAutomationMethodsApi', 'PlatformProtocolViewSet'] +class PlatformFilter(filters.FilterSet): + name__startswith = filters.CharFilter(field_name='name', lookup_expr='istartswith') + + class Meta: + model = Platform + fields = ['name', 'category', 'type'] + + class AssetPlatformViewSet(JMSModelViewSet): queryset = Platform.objects.all() serializer_classes = { @@ -21,7 +30,7 @@ class AssetPlatformViewSet(JMSModelViewSet): 'list': PlatformListSerializer, 'categories': GroupedChoiceSerializer, } - filterset_fields = ['name', 'category', 'type'] + filterset_class = PlatformFilter search_fields = ['name'] ordering = ['-internal', 'name'] rbac_perms = { diff --git a/apps/assets/serializers/gateway.py b/apps/assets/serializers/gateway.py index e596ef5a3..e435f0af7 100644 --- a/apps/assets/serializers/gateway.py +++ b/apps/assets/serializers/gateway.py @@ -14,6 +14,11 @@ class GatewaySerializer(HostSerializer): class Meta(HostSerializer.Meta): model = Gateway + def validate_platform(self, p): + if not p.name.startswith('Gateway'): + raise serializers.ValidationError(_('The platform must start with Gateway')) + return p + def validate_name(self, value): queryset = Asset.objects.filter(name=value) if self.instance: diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index 9f555cd26..b3b98cddc 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -543,6 +543,7 @@ "GatewayCreate": "Create gateway", "GatewayList": "Gateways", "GatewayUpdate": "Update the gateway", + "GatewayPlatformHelpText": "Only platforms with names starting with ‘Gateway’ can be used as gateways.", "GatherAccounts": "Gather accounts", "GatherAccountsHelpText": "Collect account information on assets. the collected account information can be imported into the system for centralized management.", "GatheredAccountList": "Gathered accounts", diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index 7b8d3c4d5..ef832d014 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -543,6 +543,7 @@ "GatewayCreate": "创建网关", "GatewayList": "网关列表", "GatewayUpdate": "更新网关", + "GatewayPlatformHelpText": "网关平台只能选择以 Gateway 开头的平台", "GatherAccounts": "账号收集", "GatherAccountsHelpText": "收集资产上的账号信息。收集后的账号信息可以导入到系统中,方便统一管理", "GatheredAccountList": "收集的账号", From cf1dc79c68d034d856e9210e239fc5381a5b175a Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 3 Sep 2024 18:16:50 +0800 Subject: [PATCH 31/98] perf: applet host tips --- apps/terminal/api/component/storage.py | 8 +++++--- apps/terminal/models/component/storage.py | 4 ++-- apps/terminal/models/component/terminal.py | 1 - apps/terminal/serializers/applet_host.py | 23 ++++++++++++++++------ 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/apps/terminal/api/component/storage.py b/apps/terminal/api/component/storage.py index 0121ac18a..9465106a8 100644 --- a/apps/terminal/api/component/storage.py +++ b/apps/terminal/api/component/storage.py @@ -9,9 +9,9 @@ from rest_framework.decorators import action from rest_framework.request import Request from rest_framework.response import Response +from common.api.mixin import CommonApiMixin from common.const.http import GET from common.drf.filters import BaseFilterSet -from common.api.mixin import CommonApiMixin from terminal import const from terminal.filters import CommandStorageFilter, CommandFilter, CommandFilterForStorageTree from terminal.models import CommandStorage, ReplayStorage @@ -30,8 +30,10 @@ class BaseStorageViewSetMixin(CommonApiMixin): if instance.type_null_or_server or instance.is_default: data = {'msg': _('Deleting the default storage is not allowed')} return Response(data=data, status=status.HTTP_400_BAD_REQUEST) - if instance.is_use(): - data = {'msg': _('Cannot delete storage that is being used')} + used_by = instance.used_by() + if used_by: + names = ', '.join(list(used_by.values_list('name', flat=True))) + data = {'msg': _('Cannot delete storage that is being used: {}').format(names)} return Response(data=data, status=status.HTTP_400_BAD_REQUEST) return super().destroy(request, *args, **kwargs) diff --git a/apps/terminal/models/component/storage.py b/apps/terminal/models/component/storage.py index 40c0c0f79..985fc1012 100644 --- a/apps/terminal/models/component/storage.py +++ b/apps/terminal/models/component/storage.py @@ -105,10 +105,10 @@ class CommandStorage(CommonStorageModelMixin, JMSBaseModel): store = engine_mod.CommandStore(self.config) return store.ping(timeout=3) - def is_use(self): + def used_by(self): return Terminal.objects.filter( command_storage=self.name, is_deleted=False - ).exists() + ) def get_command_queryset(self): if self.type_null: diff --git a/apps/terminal/models/component/terminal.py b/apps/terminal/models/component/terminal.py index 8666c5da2..b361102c4 100644 --- a/apps/terminal/models/component/terminal.py +++ b/apps/terminal/models/component/terminal.py @@ -158,7 +158,6 @@ class Terminal(StorageMixin, TerminalStatusMixin, JMSBaseModel): self.user = None self.is_deleted = True self.save() - return def __str__(self): status = "Active" diff --git a/apps/terminal/serializers/applet_host.py b/apps/terminal/serializers/applet_host.py index 00cabf2e7..e625fc84f 100644 --- a/apps/terminal/serializers/applet_host.py +++ b/apps/terminal/serializers/applet_host.py @@ -18,11 +18,13 @@ __all__ = [ 'AppletHostStartupSerializer', 'AppletSetupSerializer' ] +RDS_LICENSE_DOC_URL = 'https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/rds-client-access-license' + class DeployOptionsSerializer(serializers.Serializer): LICENSE_MODE_CHOICES = ( - (4, _('Per Session')), - (2, _('Per Device')), + (2, _('Per Device (Device number limit)')), + (4, _('Per User (User number limit)')), ) # 单用户单会话, @@ -44,11 +46,20 @@ class DeployOptionsSerializer(serializers.Serializer): """) ) IGNORE_VERIFY_CERTS = serializers.BooleanField(default=True, label=_("Ignore Certificate Verification")) - RDS_Licensing = serializers.BooleanField(default=False, label=_("Existing RDS license")) + RDS_Licensing = serializers.BooleanField( + default=False, label=_("Existing RDS license"), + help_text=_('If not exist, the RDS will be in trial mode, and the trial period is 120 days. ' + 'Detail').format(RDS_LICENSE_DOC_URL) + ) 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=2, label=_('RDS Licensing Mode')) - RDS_fSingleSessionPerUser = serializers.ChoiceField(choices=SESSION_PER_USER, default=1, - label=_("RDS Single Session Per User")) + RDS_LicensingMode = serializers.ChoiceField( + choices=LICENSE_MODE_CHOICES, default=2, label=_('RDS Licensing Mode'), + ) + RDS_fSingleSessionPerUser = serializers.ChoiceField( + choices=SESSION_PER_USER, default=1, label=_("RDS Single Session Per User"), + help_text=_('Tips: A RDS user can have only one session at a time. If set, when next login connected, ' + 'previous session will be disconnected.') + ) RDS_MaxDisconnectionTime = serializers.IntegerField( default=60000, label=_("RDS Max Disconnection Time (ms)"), help_text=_( From 763fe778d5f3ce305fc53e2b54fad5968789d7e0 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 9 Sep 2024 11:26:24 +0800 Subject: [PATCH 32/98] perf: finish this feat (#14079) * perf: basic finished * perf: finish this feat * perf: add datetime demo --------- Co-authored-by: ibuler --- apps/assets/serializers/asset/common.py | 22 ++- apps/common/api/action.py | 8 +- apps/common/drf/parsers/base.py | 12 +- apps/common/drf/renders/base.py | 72 +++++++- apps/common/drf/renders/csv.py | 4 +- apps/i18n/core/en/LC_MESSAGES/django.po | 174 +++++++++++++----- apps/i18n/core/ja/LC_MESSAGES/django.po | 175 +++++++++++++----- apps/i18n/core/zh/LC_MESSAGES/django.po | 177 ++++++++++++++----- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 175 +++++++++++++----- apps/orgs/mixins/serializers.py | 2 +- apps/perms/serializers/permission.py | 15 +- apps/settings/serializers/auth/ldap.py | 2 +- 12 files changed, 660 insertions(+), 178 deletions(-) diff --git a/apps/assets/serializers/asset/common.py b/apps/assets/serializers/asset/common.py index 2bbc6e451..5f1cee9ab 100644 --- a/apps/assets/serializers/asset/common.py +++ b/apps/assets/serializers/asset/common.py @@ -31,6 +31,12 @@ __all__ = [ class AssetProtocolsSerializer(serializers.ModelSerializer): port = serializers.IntegerField(required=False, allow_null=True, max_value=65535, min_value=0) + def get_render_help_text(self): + if self.parent and self.parent.many: + return _('Protocols, format is ["protocol/port"]') + else: + return _('Protocol, format is name/port') + def to_file_representation(self, data): return '{name}/{port}'.format(**data) @@ -97,6 +103,9 @@ class AssetAccountSerializer(AccountSerializer): attrs = super().validate(attrs) return self.set_secret(attrs) + def get_render_help_text(self): + return _('Accounts, format [{"name": "x", "username": "x", "secret": "x", "secret_type": "password"}]') + class Meta(AccountSerializer.Meta): fields = [ f for f in AccountSerializer.Meta.fields @@ -121,12 +130,23 @@ class AccountSecretSerializer(SecretReadableMixin, CommonModelSerializer): } +class NodeDisplaySerializer(serializers.ListField): + def get_render_help_text(self): + return _('Node path, format ["/org_name/node_name"], if node not exist, will create it') + + def to_internal_value(self, data): + return data + + def to_representation(self, data): + return data + + class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, WritableNestedModelSerializer): category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category')) type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type')) protocols = AssetProtocolsSerializer(many=True, required=False, label=_('Protocols'), default=()) accounts = AssetAccountSerializer(many=True, required=False, allow_null=True, write_only=True, label=_('Accounts')) - nodes_display = serializers.ListField(read_only=False, required=False, label=_("Node path")) + nodes_display = NodeDisplaySerializer(read_only=False, required=False, label=_("Node path")) _accounts = None class Meta: diff --git a/apps/common/api/action.py b/apps/common/api/action.py index fb780705a..627a1468a 100644 --- a/apps/common/api/action.py +++ b/apps/common/api/action.py @@ -38,9 +38,15 @@ class SuggestionMixin: class RenderToJsonMixin: @action(methods=[POST, PUT], detail=False, url_path='render-to-json') def render_to_json(self, request: Request, *args, **kwargs): + rows = request.data + if rows and isinstance(rows[0], dict): + first = list(rows[0].values())[0] + if first.startswith('#Help'): + rows.pop(0) + data = { 'title': (), - 'data': request.data, + 'data': rows, } jms_context = getattr(request, 'jms_context', {}) diff --git a/apps/common/drf/parsers/base.py b/apps/common/drf/parsers/base.py index 33b344457..b4cbd1825 100644 --- a/apps/common/drf/parsers/base.py +++ b/apps/common/drf/parsers/base.py @@ -119,8 +119,6 @@ class BaseFileParser(BaseParser): value = field.to_file_internal_value(value) elif isinstance(field, serializers.BooleanField): value = value.lower() in ['true', '1', 'yes'] - elif isinstance(field, serializers.ChoiceField): - value = value elif isinstance(field, ObjectRelatedField): if field.many: value = [self.id_name_to_obj(v) for v in value] @@ -164,6 +162,15 @@ class BaseFileParser(BaseParser): data.append(row_data) return data + @staticmethod + def pop_help_text_if_need(rows): + rows = list(rows) + if not rows: + return rows + if rows[0][0] == '#Help': + rows.pop(0) + return rows + def parse(self, stream, media_type=None, parser_context=None): assert parser_context is not None, '`parser_context` should not be `None`' @@ -192,6 +199,7 @@ class BaseFileParser(BaseParser): request.jms_context = {} request.jms_context['column_title_field_pairs'] = column_title_field_pairs + rows = self.pop_help_text_if_need(rows) data = self.generate_data(field_names, rows) return data except Exception as e: diff --git a/apps/common/drf/renders/base.py b/apps/common/drf/renders/base.py index a6eae282e..b7361c729 100644 --- a/apps/common/drf/renders/base.py +++ b/apps/common/drf/renders/base.py @@ -5,12 +5,13 @@ from datetime import datetime import pyzipper from django.conf import settings +from django.utils import timezone from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from rest_framework.renderers import BaseRenderer from rest_framework.utils import encoders, json -from common.serializers.fields import ObjectRelatedField, LabeledChoiceField +from common.serializers import fields as common_fields from common.utils import get_logger logger = get_logger(__file__) @@ -38,8 +39,10 @@ class BaseFileRenderer(BaseRenderer): filename_prefix = serializer.Meta.model.__name__.lower() else: filename_prefix = 'download' - now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") - filename = "{}_{}.{}".format(filename_prefix, now, self.format) + suffix = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + if self.template == 'import': + suffix = 'template' + filename = "{}_{}.{}".format(filename_prefix, suffix, self.format) disposition = 'attachment; filename="{}"'.format(filename) response['Content-Disposition'] = disposition @@ -105,10 +108,10 @@ class BaseFileRenderer(BaseRenderer): value = field.to_file_representation(value) elif isinstance(value, bool): value = 'Yes' if value else 'No' - elif isinstance(field, LabeledChoiceField): + elif isinstance(field, common_fields.LabeledChoiceField): value = value or {} value = '{}({})'.format(value.get('label'), value.get('value')) - elif isinstance(field, ObjectRelatedField): + elif isinstance(field, common_fields.ObjectRelatedField): if field.many: value = [self.to_id_name(v) for v in value] else: @@ -126,6 +129,53 @@ class BaseFileRenderer(BaseRenderer): value = json.dumps(value, cls=encoders.JSONEncoder, ensure_ascii=False) return str(value) + def get_field_help_text(self, field): + text = '' + if hasattr(field, 'get_render_help_text'): + text = field.get_render_help_text() + elif isinstance(field, serializers.BooleanField): + text = _('Yes/No') + elif isinstance(field, serializers.CharField): + if field.max_length: + text = _('Text, max length {}').format(field.max_length) + else: + text = _("Long text, no length limit") + elif isinstance(field, serializers.IntegerField): + text = _('Number, min {} max {}').format(field.min_value, field.max_value) + text = text.replace('min None', '').replace('max None', '') + elif isinstance(field, serializers.DateTimeField): + text = _('Datetime format {}').format(timezone.now().strftime(settings.REST_FRAMEWORK['DATETIME_FORMAT'])) + elif isinstance(field, serializers.IPAddressField): + text = _('IP') + elif isinstance(field, serializers.ChoiceField): + choices = [str(v) for v in field.choices.keys()] + if isinstance(field, common_fields.LabeledChoiceField): + text = _("Choices, format name(value), name is optional for human read," + " value is requisite, options {}").format(','.join(choices)) + else: + text = _("Choices, options {}").format(",".join(choices)) + elif isinstance(field, common_fields.PhoneField): + text = _("Phone number, format +8612345678901") + elif isinstance(field, common_fields.LabeledChoiceField): + text = _('Label, format ["key:value"]') + elif isinstance(field, common_fields.ObjectRelatedField): + text = _("Object, format name(id), name is optional for human read, id is requisite") + elif isinstance(field, serializers.PrimaryKeyRelatedField): + text = _('Object, format id') + elif isinstance(field, serializers.ManyRelatedField): + child_relation_class_name = field.child_relation.__class__.__name__ + if child_relation_class_name == "ObjectRelatedField": + text = _('Objects, format ["name(id)", ...], name is optional for human read, id is requisite') + elif child_relation_class_name == "LabelRelatedField": + text = _('Labels, format ["key:value", ...], if label not exists, will create it') + else: + text = _('Objects, format ["id", ...]') + elif isinstance(field, serializers.ListSerializer): + child = field.child + if hasattr(child, 'get_render_help_text'): + text = child.get_render_help_text() + return text + def generate_rows(self, data, render_fields): for item in data: row = [] @@ -135,6 +185,17 @@ class BaseFileRenderer(BaseRenderer): row.append(value) yield row + def write_help_text_if_need(self): + if self.template == 'export': + return + fields = self.get_rendered_fields() + row = [] + for f in fields: + text = self.get_field_help_text(f) + row.append(text) + row[0] = '#Help ' + str(row[0]) + self.write_row(row) + @abc.abstractmethod def initial_writer(self): raise NotImplementedError @@ -184,6 +245,7 @@ class BaseFileRenderer(BaseRenderer): rows = self.generate_rows(data, rendered_fields) self.initial_writer() self.write_column_titles(column_titles) + self.write_help_text_if_need() self.write_rows(rows) self.after_render() value = self.get_rendered_value() diff --git a/apps/common/drf/renders/csv.py b/apps/common/drf/renders/csv.py index a8729294b..8c676b60f 100644 --- a/apps/common/drf/renders/csv.py +++ b/apps/common/drf/renders/csv.py @@ -2,17 +2,17 @@ # import codecs + import unicodecsv from six import BytesIO from .base import BaseFileRenderer from ..const import CSV_FILE_ESCAPE_CHARS -class CSVFileRenderer(BaseFileRenderer): +class CSVFileRenderer(BaseFileRenderer): media_type = 'text/csv' format = 'csv' - writer = None buffer = None diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index 7b49ffcde..d758149da 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-30 15:08+0800\n" +"POT-Creation-Date: 2024-09-03 15:26+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -655,7 +655,7 @@ msgstr "" #: audits/models.py:92 audits/serializers.py:84 #: authentication/serializers/connect_token_secret.py:119 #: authentication/templates/authentication/_access_key_modal.html:34 -#: perms/serializers/permission.py:41 perms/serializers/permission.py:63 +#: perms/serializers/permission.py:52 perms/serializers/permission.py:74 #: tickets/serializers/ticket/ticket.py:21 msgid "Action" msgstr "" @@ -703,7 +703,7 @@ msgstr "" #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 #: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 -#: assets/serializers/platform.py:273 +#: assets/serializers/platform.py:282 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 @@ -845,8 +845,8 @@ msgstr "" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:125 -#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 -#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 +#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:177 +#: assets/serializers/platform.py:283 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -857,7 +857,7 @@ msgstr "" #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 #: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 -#: assets/serializers/platform.py:167 audits/serializers.py:53 +#: assets/serializers/platform.py:176 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 @@ -897,7 +897,7 @@ msgstr "" #: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 -#: perms/serializers/permission.py:35 +#: perms/serializers/permission.py:46 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:83 msgid "Assets" @@ -919,7 +919,7 @@ msgstr "" #: accounts/serializers/account/account.py:458 #: accounts/serializers/account/base.py:93 #: accounts/serializers/account/template.py:72 -#: assets/serializers/asset/common.py:387 +#: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "" @@ -1048,7 +1048,7 @@ msgid "" msgstr "" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "" @@ -1252,15 +1252,15 @@ msgstr "" msgid "Active" msgstr "Active" -#: acls/models/base.py:81 perms/serializers/permission.py:31 +#: acls/models/base.py:81 perms/serializers/permission.py:42 #: tickets/models/flow.py:23 users/models/preference.py:16 #: users/serializers/group.py:21 users/serializers/user.py:424 msgid "Users" msgstr "" #: acls/models/base.py:98 assets/models/automations/base.py:17 -#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 -#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 +#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148 +#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55 #: perms/serializers/user_permission.py:75 rbac/tree.py:35 msgid "Accounts" msgstr "" @@ -1392,7 +1392,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:147 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "" @@ -1809,12 +1809,12 @@ msgstr "" msgid "Port" msgstr "" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150 +#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "" -#: assets/models/asset/common.py:162 assets/models/platform.py:149 +#: assets/models/asset/common.py:161 assets/models/platform.py:138 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 @@ -1825,7 +1825,7 @@ msgstr "" msgid "Zone" msgstr "" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "" @@ -2169,38 +2169,58 @@ msgid "" "type" msgstr "" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:36 +msgid "Protocols, format is [\"protocol/port\"]" +msgstr "" + +#: assets/serializers/asset/common.py:38 +msgid "Protocol, format is name/port" +msgstr "" + +#: assets/serializers/asset/common.py:107 +msgid "" +"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" +msgstr "" + +#: assets/serializers/asset/common.py:135 +msgid "" +"Node path, format [\"/org_name/node_name\"], if node not exist, will create " +"it" +msgstr "" + +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 -#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 +#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388 #: xpack/plugins/cloud/serializers/task.py:35 msgid "Protocols" msgstr "" -#: assets/serializers/asset/common.py:129 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:149 +#: assets/serializers/asset/common.py:171 msgid "Node path" msgstr "" -#: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:389 +#: assets/serializers/asset/common.py:168 +#: assets/serializers/asset/common.py:409 msgid "Auto info" msgstr "" -#: assets/serializers/asset/common.py:245 +#: assets/serializers/asset/common.py:265 msgid "Platform not exist" msgstr "" -#: assets/serializers/asset/common.py:281 +#: assets/serializers/asset/common.py:301 msgid "port out of range (0-65535)" msgstr "" -#: assets/serializers/asset/common.py:288 +#: assets/serializers/asset/common.py:308 msgid "Protocol is required: {}" msgstr "" -#: assets/serializers/asset/common.py:316 +#: assets/serializers/asset/common.py:336 msgid "Invalid data" msgstr "" @@ -2286,7 +2306,7 @@ msgid "" "the zone, the connection is routed through the gateway." msgstr "" -#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 +#: assets/serializers/domain.py:24 assets/serializers/platform.py:186 #: orgs/serializers.py:13 perms/serializers/permission.py:39 msgid "Assets amount" msgstr "" @@ -2645,7 +2665,7 @@ msgid "Resource" msgstr "" #: audits/models.py:101 audits/models.py:147 audits/models.py:177 -#: terminal/serializers/command.py:75 +#: common/drf/renders/base.py:145 terminal/serializers/command.py:75 msgid "Datetime" msgstr "" @@ -3402,7 +3422,7 @@ msgid "Actions" msgstr "" #: authentication/serializers/connection_token.py:42 -#: perms/serializers/permission.py:43 perms/serializers/permission.py:64 +#: perms/serializers/permission.py:54 perms/serializers/permission.py:75 #: users/serializers/user.py:127 users/serializers/user.py:273 msgid "Is expired" msgstr "Expired" @@ -3444,8 +3464,8 @@ msgstr "" msgid "Access IP" msgstr "" -#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 -#: perms/serializers/permission.py:65 users/serializers/user.py:128 +#: authentication/serializers/token.py:92 perms/serializers/permission.py:53 +#: perms/serializers/permission.py:76 users/serializers/user.py:128 #: users/serializers/user.py:270 msgid "Is valid" msgstr "Is Valid" @@ -3953,7 +3973,7 @@ msgstr "Organization ID" msgid "The file content overflowed (The maximum length `{}` bytes)" msgstr "" -#: common/drf/parsers/base.py:199 +#: common/drf/parsers/base.py:207 msgid "Parse file error: {}" msgstr "" @@ -3961,7 +3981,65 @@ msgstr "" msgid "Invalid excel file" msgstr "" -#: common/drf/renders/base.py:208 +#: common/drf/renders/base.py:135 +msgid "Yes/No" +msgstr "" + +#: common/drf/renders/base.py:138 +msgid "Text, max length {}" +msgstr "" + +#: common/drf/renders/base.py:140 +msgid "Long text, no length limit" +msgstr "" + +#: common/drf/renders/base.py:142 +msgid "Number, min {} max {}" +msgstr "" + +#: common/drf/renders/base.py:153 +msgid "" +"Choices, format name(value), name is optional for human read, value is " +"requisite, options {}" +msgstr "" + +#: common/drf/renders/base.py:156 +msgid "Choices, options {}" +msgstr "" + +#: common/drf/renders/base.py:158 +msgid "Phone number, format +8612345678901" +msgstr "" + +#: common/drf/renders/base.py:160 +msgid "Label, format [\"key:value\"]" +msgstr "" + +#: common/drf/renders/base.py:162 +msgid "" +"Object, format name(id), name is optional for human read, id is requisite" +msgstr "" + +#: common/drf/renders/base.py:164 +msgid "Object, format id" +msgstr "" + +#: common/drf/renders/base.py:168 +msgid "" +"Objects, format [\"name(id)\", ...], name is optional for human read, id is " +"requisite" +msgstr "" + +#: common/drf/renders/base.py:170 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "" + +#: common/drf/renders/base.py:172 +msgid "Objects, format [\"id\", ...]" +msgstr "" + +#: common/drf/renders/base.py:270 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4776,7 +4854,7 @@ msgstr "" msgid "Can not delete virtual org" msgstr "" -#: orgs/serializers.py:10 perms/serializers/permission.py:37 +#: orgs/serializers.py:10 perms/serializers/permission.py:48 #: rbac/serializers/role.py:27 users/serializers/group.py:54 msgid "Users amount" msgstr "" @@ -4785,7 +4863,7 @@ msgstr "" msgid "User groups amount" msgstr "" -#: orgs/serializers.py:14 perms/serializers/permission.py:40 +#: orgs/serializers.py:14 perms/serializers/permission.py:51 msgid "Nodes amount" msgstr "" @@ -4902,11 +4980,21 @@ msgstr "" msgid "asset permissions of organization {}" msgstr "" -#: perms/serializers/permission.py:33 users/serializers/user.py:257 -msgid "Groups" +#: perms/serializers/permission.py:32 +msgid "" +"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " +"choices: @ALL, @SPEC, @USER, @ANON, @INPUT" msgstr "" #: perms/serializers/permission.py:38 +msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" +msgstr "" + +#: perms/serializers/permission.py:44 users/serializers/user.py:257 +msgid "Groups" +msgstr "" + +#: perms/serializers/permission.py:49 msgid "Groups amount" msgstr "" @@ -5483,9 +5571,9 @@ msgstr "" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " -"cache" +"effectively improve the speed of user authentication., 0 means no " +"cache
If the user OU structure has been adjusted, click Submit to clear " +"the user DN cache" msgstr "" #: settings/serializers/auth/ldap.py:97 @@ -6574,12 +6662,12 @@ msgstr "" msgid "Authentication success: {}" msgstr "" -#: settings/ws.py:203 +#: settings/ws.py:195 msgid "No LDAP user was found" msgstr "" -#: settings/ws.py:209 -msgid "Total {}, success {}, failure {}" +#: settings/ws.py:201 +msgid "Imported total: {} new: {}, failed: {} Organization: {}" msgstr "" #: templates/_csv_import_export.html:8 diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 2122b2a80..5a4da3d87 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-08-15 14:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -655,7 +655,7 @@ msgstr "トリガー方式" #: audits/models.py:92 audits/serializers.py:84 #: authentication/serializers/connect_token_secret.py:119 #: authentication/templates/authentication/_access_key_modal.html:34 -#: perms/serializers/permission.py:41 perms/serializers/permission.py:63 +#: perms/serializers/permission.py:52 perms/serializers/permission.py:74 #: tickets/serializers/ticket/ticket.py:21 msgid "Action" msgstr "アクション" @@ -702,7 +702,7 @@ msgstr "パスワードルール" #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 #: assets/serializers/platform.py:273 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 @@ -854,7 +854,7 @@ msgid "Exist policy" msgstr "アカウントの存在ポリシー" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 -#: assets/models/platform.py:95 assets/serializers/asset/common.py:125 +#: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 @@ -866,7 +866,7 @@ msgstr "カテゴリ" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 @@ -907,7 +907,7 @@ msgstr "編集済み" #: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 -#: perms/serializers/permission.py:35 +#: perms/serializers/permission.py:46 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:83 msgid "Assets" @@ -929,7 +929,7 @@ msgstr "アカウントはすでに存在しています" #: accounts/serializers/account/account.py:458 #: accounts/serializers/account/base.py:93 #: accounts/serializers/account/template.py:72 -#: assets/serializers/asset/common.py:387 +#: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特別情報" @@ -1064,7 +1064,7 @@ msgstr "" "ください。 " #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "ノード" @@ -1278,15 +1278,15 @@ msgstr "レビュー担当者" msgid "Active" msgstr "アクティブ" -#: acls/models/base.py:81 perms/serializers/permission.py:31 +#: acls/models/base.py:81 perms/serializers/permission.py:42 #: tickets/models/flow.py:23 users/models/preference.py:16 #: users/serializers/group.py:21 users/serializers/user.py:424 msgid "Users" msgstr "ユーザー" #: acls/models/base.py:98 assets/models/automations/base.py:17 -#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 -#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 +#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148 +#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55 #: perms/serializers/user_permission.py:75 rbac/tree.py:35 msgid "Accounts" msgstr "アカウント" @@ -1423,7 +1423,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:147 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1856,7 +1856,7 @@ msgstr "クラウド サービス" msgid "Port" msgstr "ポート" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150 +#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "アドレス" @@ -1872,7 +1872,7 @@ msgstr "プラットフォーム" msgid "Zone" msgstr "ゾーン" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "資産ハードウェア情報の収集" @@ -2218,38 +2218,58 @@ msgstr "" "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プ" "ラットフォーム" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:36 +msgid "Protocols, format is [\"protocol/port\"]" +msgstr "" + +#: assets/serializers/asset/common.py:38 +msgid "Protocol, format is name/port" +msgstr "" + +#: assets/serializers/asset/common.py:107 +msgid "" +"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" +msgstr "" + +#: assets/serializers/asset/common.py:135 +msgid "" +"Node path, format [\"/org_name/node_name\"], if node not exist, will create " +"it" +msgstr "" + +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 -#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 +#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388 #: xpack/plugins/cloud/serializers/task.py:35 msgid "Protocols" msgstr "プロトコル" -#: assets/serializers/asset/common.py:129 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:149 +#: assets/serializers/asset/common.py:171 msgid "Node path" msgstr "ノードパスです" -#: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:389 +#: assets/serializers/asset/common.py:168 +#: assets/serializers/asset/common.py:409 msgid "Auto info" msgstr "自動情報" -#: assets/serializers/asset/common.py:245 +#: assets/serializers/asset/common.py:265 msgid "Platform not exist" msgstr "プラットフォームが存在しません" -#: assets/serializers/asset/common.py:281 +#: assets/serializers/asset/common.py:301 msgid "port out of range (0-65535)" msgstr "ポート番号が範囲外です (0-65535)" -#: assets/serializers/asset/common.py:288 +#: assets/serializers/asset/common.py:308 msgid "Protocol is required: {}" msgstr "プロトコルが必要です: {}" -#: assets/serializers/asset/common.py:316 +#: assets/serializers/asset/common.py:336 msgid "Invalid data" msgstr "無効なデータ" @@ -2340,7 +2360,7 @@ msgstr "" "る際には、接続はゲートウェイを通してルーティングされます。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 -#: orgs/serializers.py:13 perms/serializers/permission.py:39 +#: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "資産数量" @@ -2708,7 +2728,7 @@ msgid "Resource" msgstr "リソース" #: audits/models.py:101 audits/models.py:147 audits/models.py:177 -#: terminal/serializers/command.py:75 +#: common/drf/renders/base.py:145 terminal/serializers/command.py:75 msgid "Datetime" msgstr "時間" @@ -3491,7 +3511,7 @@ msgid "Actions" msgstr "アクション" #: authentication/serializers/connection_token.py:42 -#: perms/serializers/permission.py:43 perms/serializers/permission.py:64 +#: perms/serializers/permission.py:54 perms/serializers/permission.py:75 #: users/serializers/user.py:127 users/serializers/user.py:273 msgid "Is expired" msgstr "期限切れです" @@ -3535,8 +3555,8 @@ msgstr "有効なssh公開鍵ではありません" msgid "Access IP" msgstr "Access IP" -#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 -#: perms/serializers/permission.py:65 users/serializers/user.py:128 +#: authentication/serializers/token.py:92 perms/serializers/permission.py:53 +#: perms/serializers/permission.py:76 users/serializers/user.py:128 #: users/serializers/user.py:270 msgid "Is valid" msgstr "有効です" @@ -4063,7 +4083,7 @@ msgstr "組織 ID" msgid "The file content overflowed (The maximum length `{}` bytes)" msgstr "ファイルの内容がオーバーフローしました (最大長 '{}' バイト)" -#: common/drf/parsers/base.py:199 +#: common/drf/parsers/base.py:207 msgid "Parse file error: {}" msgstr "解析ファイルエラー: {}" @@ -4071,7 +4091,67 @@ msgstr "解析ファイルエラー: {}" msgid "Invalid excel file" msgstr "無効 excel 書類" -#: common/drf/renders/base.py:208 +#: common/drf/renders/base.py:135 +msgid "Yes/No" +msgstr "" + +#: common/drf/renders/base.py:138 +msgid "Text, max length {}" +msgstr "" + +#: common/drf/renders/base.py:140 +msgid "Long text, no length limit" +msgstr "" + +#: common/drf/renders/base.py:142 +msgid "Number, min {} max {}" +msgstr "" + +#: common/drf/renders/base.py:153 +msgid "" +"Choices, format name(value), name is optional for human read, value is " +"requisite, options {}" +msgstr "" + +#: common/drf/renders/base.py:156 +#, fuzzy +#| msgid "Connect options" +msgid "Choices, options {}" +msgstr "接続アイテム" + +#: common/drf/renders/base.py:158 +msgid "Phone number, format +8612345678901" +msgstr "" + +#: common/drf/renders/base.py:160 +msgid "Label, format [\"key:value\"]" +msgstr "" + +#: common/drf/renders/base.py:162 +msgid "" +"Object, format name(id), name is optional for human read, id is requisite" +msgstr "" + +#: common/drf/renders/base.py:164 +msgid "Object, format id" +msgstr "" + +#: common/drf/renders/base.py:168 +msgid "" +"Objects, format [\"name(id)\", ...], name is optional for human read, id is " +"requisite" +msgstr "" + +#: common/drf/renders/base.py:170 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "" + +#: common/drf/renders/base.py:172 +msgid "Objects, format [\"id\", ...]" +msgstr "" + +#: common/drf/renders/base.py:270 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4906,7 +4986,7 @@ msgstr "参加しているすべての組織を表示できます" msgid "Can not delete virtual org" msgstr "仮想組織を削除できませんでした" -#: orgs/serializers.py:10 perms/serializers/permission.py:37 +#: orgs/serializers.py:10 perms/serializers/permission.py:48 #: rbac/serializers/role.py:27 users/serializers/group.py:54 msgid "Users amount" msgstr "ユーザー数" @@ -4915,7 +4995,7 @@ msgstr "ユーザー数" msgid "User groups amount" msgstr "ユーザーグループの数" -#: orgs/serializers.py:14 perms/serializers/permission.py:40 +#: orgs/serializers.py:14 perms/serializers/permission.py:51 msgid "Nodes amount" msgstr "ノード数" @@ -5032,11 +5112,21 @@ msgstr "資産権限の有効期限が近づいています" msgid "asset permissions of organization {}" msgstr "組織 {} の資産権限" -#: perms/serializers/permission.py:33 users/serializers/user.py:257 +#: perms/serializers/permission.py:32 +msgid "" +"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " +"choices: @ALL, @SPEC, @USER, @ANON, @INPUT" +msgstr "" + +#: perms/serializers/permission.py:38 +msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" +msgstr "" + +#: perms/serializers/permission.py:44 users/serializers/user.py:257 msgid "Groups" msgstr "ユーザーグループ" -#: perms/serializers/permission.py:38 +#: perms/serializers/permission.py:49 msgid "Groups amount" msgstr "ユーザーグループの数" @@ -5639,9 +5729,9 @@ msgstr "User DN キャッシュの有効期限 (秒)" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " -"cache" +"effectively improve the speed of user authentication., 0 means no " +"cache
If the user OU structure has been adjusted, click Submit to clear " +"the user DN cache" msgstr "" "ユーザーログイン認証時に取得したユーザー DN をキャッシュすることで、ユーザー" "認証の速度を効果的に向上させることができます
ユーザー OU 構造が調整された" @@ -6827,11 +6917,11 @@ msgstr "認証に失敗しました (不明): {}" msgid "Authentication success: {}" msgstr "認証成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:198 msgid "No LDAP user was found" msgstr "LDAPユーザーが取得されませんでした" -#: settings/ws.py:209 +#: settings/ws.py:204 msgid "Total {}, success {}, failure {}" msgstr "合計 {},成功 {},失敗 {}" @@ -9977,3 +10067,8 @@ msgstr "エンタープライズプロフェッショナル版" #: xpack/plugins/license/models.py:86 msgid "Ultimate edition" msgstr "エンタープライズ・フラッグシップ・エディション" + +#, fuzzy +#~| msgid "Help text" +#~ msgid "#Help: " +#~ msgstr "ヘルプ" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index ac1f04910..e3d0ea417 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-09-03 15:26+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -654,7 +654,7 @@ msgstr "触发方式" #: audits/models.py:92 audits/serializers.py:84 #: authentication/serializers/connect_token_secret.py:119 #: authentication/templates/authentication/_access_key_modal.html:34 -#: perms/serializers/permission.py:41 perms/serializers/permission.py:63 +#: perms/serializers/permission.py:52 perms/serializers/permission.py:74 #: tickets/serializers/ticket/ticket.py:21 msgid "Action" msgstr "动作" @@ -701,7 +701,7 @@ msgstr "密码规则" #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 #: assets/serializers/platform.py:273 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 @@ -852,7 +852,7 @@ msgid "Exist policy" msgstr "账号存在策略" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 -#: assets/models/platform.py:95 assets/serializers/asset/common.py:125 +#: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 @@ -864,7 +864,7 @@ msgstr "类别" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 @@ -905,7 +905,7 @@ msgstr "已修改" #: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 -#: perms/serializers/permission.py:35 +#: perms/serializers/permission.py:46 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:83 msgid "Assets" @@ -927,7 +927,7 @@ msgstr "账号已存在" #: accounts/serializers/account/account.py:458 #: accounts/serializers/account/base.py:93 #: accounts/serializers/account/template.py:72 -#: assets/serializers/asset/common.py:387 +#: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特殊信息" @@ -1061,7 +1061,7 @@ msgstr "" "CACHE_LOGIN_PASSWORD_ENABLED=true,重启服务才能开启" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "节点" @@ -1268,15 +1268,15 @@ msgstr "审批人" msgid "Active" msgstr "激活中" -#: acls/models/base.py:81 perms/serializers/permission.py:31 +#: acls/models/base.py:81 perms/serializers/permission.py:42 #: tickets/models/flow.py:23 users/models/preference.py:16 #: users/serializers/group.py:21 users/serializers/user.py:424 msgid "Users" msgstr "用户" #: acls/models/base.py:98 assets/models/automations/base.py:17 -#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 -#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 +#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148 +#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55 #: perms/serializers/user_permission.py:75 rbac/tree.py:35 msgid "Accounts" msgstr "账号" @@ -1412,7 +1412,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:147 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1838,7 +1838,7 @@ msgstr "云服务" msgid "Port" msgstr "端口" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150 +#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "地址" @@ -1854,7 +1854,7 @@ msgstr "平台" msgid "Zone" msgstr "网域" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集资产硬件信息" @@ -2200,38 +2200,60 @@ msgid "" "type" msgstr "资产中批量更新平台,不符合平台类型跳过的资产" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:36 +msgid "Protocols, format is [\"protocol/port\"]" +msgstr "协议,格式为 [\"协议/端口\"]" + +#: assets/serializers/asset/common.py:38 +msgid "Protocol, format is name/port" +msgstr "协议,格式为 名称/端口" + +#: assets/serializers/asset/common.py:107 +msgid "" +"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" +msgstr "" +"账号,格式为 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" + +#: assets/serializers/asset/common.py:135 +msgid "" +"Node path, format [\"/org_name/node_name\"], if node not exist, will create " +"it" +msgstr "节点路径,格式为 [\"/组织/节点名\"], 如果节点不存在,将创建它" + +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 -#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 +#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388 #: xpack/plugins/cloud/serializers/task.py:35 msgid "Protocols" msgstr "协议组" -#: assets/serializers/asset/common.py:129 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:149 +#: assets/serializers/asset/common.py:171 msgid "Node path" msgstr "节点路径" -#: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:389 +#: assets/serializers/asset/common.py:168 +#: assets/serializers/asset/common.py:409 msgid "Auto info" msgstr "自动化信息" -#: assets/serializers/asset/common.py:245 +#: assets/serializers/asset/common.py:265 msgid "Platform not exist" msgstr "平台不存在" -#: assets/serializers/asset/common.py:281 +#: assets/serializers/asset/common.py:301 msgid "port out of range (0-65535)" msgstr "端口超出范围 (0-65535)" -#: assets/serializers/asset/common.py:288 +#: assets/serializers/asset/common.py:308 msgid "Protocol is required: {}" msgstr "协议是必填的: {}" -#: assets/serializers/asset/common.py:316 +#: assets/serializers/asset/common.py:336 msgid "Invalid data" msgstr "无效的数据" @@ -2320,7 +2342,7 @@ msgid "" msgstr "网关是网域的网络代理,当连接网域内的资产时,连接将通过网关进行路由。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 -#: orgs/serializers.py:13 perms/serializers/permission.py:39 +#: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "资产数量" @@ -2680,7 +2702,7 @@ msgid "Resource" msgstr "资源" #: audits/models.py:101 audits/models.py:147 audits/models.py:177 -#: terminal/serializers/command.py:75 +#: common/drf/renders/base.py:145 terminal/serializers/command.py:75 msgid "Datetime" msgstr "日期" @@ -3448,7 +3470,7 @@ msgid "Actions" msgstr "动作" #: authentication/serializers/connection_token.py:42 -#: perms/serializers/permission.py:43 perms/serializers/permission.py:64 +#: perms/serializers/permission.py:54 perms/serializers/permission.py:75 #: users/serializers/user.py:127 users/serializers/user.py:273 msgid "Is expired" msgstr "已过期" @@ -3490,8 +3512,8 @@ msgstr "SSH密钥不合法" msgid "Access IP" msgstr "IP 白名单" -#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 -#: perms/serializers/permission.py:65 users/serializers/user.py:128 +#: authentication/serializers/token.py:92 perms/serializers/permission.py:53 +#: perms/serializers/permission.py:76 users/serializers/user.py:128 #: users/serializers/user.py:270 msgid "Is valid" msgstr "是否有效" @@ -4005,7 +4027,7 @@ msgstr "组织 ID" msgid "The file content overflowed (The maximum length `{}` bytes)" msgstr "文件内容太大 (最大长度 `{}` 字节)" -#: common/drf/parsers/base.py:199 +#: common/drf/parsers/base.py:207 msgid "Parse file error: {}" msgstr "解析文件错误: {}" @@ -4013,7 +4035,66 @@ msgstr "解析文件错误: {}" msgid "Invalid excel file" msgstr "无效的 excel 文件" -#: common/drf/renders/base.py:208 +#: common/drf/renders/base.py:135 +msgid "Yes/No" +msgstr "" + +#: common/drf/renders/base.py:138 +msgid "Text, max length {}" +msgstr "文本,最大长度 {}" + +#: common/drf/renders/base.py:140 +msgid "Long text, no length limit" +msgstr "长文本,无长度限制" + +#: common/drf/renders/base.py:142 +msgid "Number, min {} max {}" +msgstr "数字,最小 {} 最大 {}" + +#: common/drf/renders/base.py:153 +msgid "" +"Choices, format name(value), name is optional for human read, value is " +"requisite, options {}" +msgstr "选项,格式: 名称(值),名称是可选的,方便阅读,值是必填的,可选项有 {}" + +#: common/drf/renders/base.py:156 +msgid "Choices, options {}" +msgstr "选项,可选项有 {}" + +#: common/drf/renders/base.py:158 +msgid "Phone number, format +8612345678901" +msgstr "手机号,格式 +8612345678901" + +#: common/drf/renders/base.py:160 +msgid "Label, format [\"key:value\"]" +msgstr "标签,格式: [\"键:值\"]" + +#: common/drf/renders/base.py:162 +msgid "" +"Object, format name(id), name is optional for human read, id is requisite" +msgstr "关联项,格式: 名称(id), 名称是可选的,方便阅读,id 是必填的" + +#: common/drf/renders/base.py:164 +msgid "Object, format id" +msgstr "关联项,格式是 id" + +#: common/drf/renders/base.py:168 +msgid "" +"Objects, format [\"name(id)\", ...], name is optional for human read, id is " +"requisite" +msgstr "" +"多关联项,格式: [\"名称(id)\", ...], 名称是可选的,方便阅读,id 是必填的" + +#: common/drf/renders/base.py:170 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "标签,格式: [\"键:值\", ...], 如果标签不存在,将创建它" + +#: common/drf/renders/base.py:172 +msgid "Objects, format [\"id\", ...]" +msgstr "多关联项,格式是 [\"id\", ...]" + +#: common/drf/renders/base.py:270 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4835,7 +4916,7 @@ msgstr "可以查看所有加入的组织" msgid "Can not delete virtual org" msgstr "无法删除虚拟组织" -#: orgs/serializers.py:10 perms/serializers/permission.py:37 +#: orgs/serializers.py:10 perms/serializers/permission.py:48 #: rbac/serializers/role.py:27 users/serializers/group.py:54 msgid "Users amount" msgstr "用户数量" @@ -4844,7 +4925,7 @@ msgstr "用户数量" msgid "User groups amount" msgstr "用户组数量" -#: orgs/serializers.py:14 perms/serializers/permission.py:40 +#: orgs/serializers.py:14 perms/serializers/permission.py:51 msgid "Nodes amount" msgstr "节点数量" @@ -4961,11 +5042,21 @@ msgstr "资产授权规则将要过期" msgid "asset permissions of organization {}" msgstr "组织 ({}) 的资产授权" -#: perms/serializers/permission.py:33 users/serializers/user.py:257 +#: perms/serializers/permission.py:32 +msgid "" +"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " +"choices: @ALL, @SPEC, @USER, @ANON, @INPUT" +msgstr "账号,格式 [\"@虚拟账号\", \"root\", \"%模版id\"], 虚拟选项: @ALL, @SPEC, @USER, @ANON, @INPUT" + +#: perms/serializers/permission.py:38 +msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" +msgstr "协议,格式为 [\"ssh\", \"rdp\", \"vnc\"] 或 [\"all\"]" + +#: perms/serializers/permission.py:44 users/serializers/user.py:257 msgid "Groups" msgstr "用户组" -#: perms/serializers/permission.py:38 +#: perms/serializers/permission.py:49 msgid "Groups amount" msgstr "用户组数量" @@ -5560,9 +5651,9 @@ msgstr "User DN 缓存超时时间 (秒)" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " -"cache" +"effectively improve the speed of user authentication., 0 means no " +"cache
If the user OU structure has been adjusted, click Submit to clear " +"the user DN cache" msgstr "" "对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度
如果" "用户 OU 架构有调整,点击提交即可清除用户 DN 缓存" @@ -6696,11 +6787,11 @@ msgstr "认证失败: (未知): {}" msgid "Authentication success: {}" msgstr "认证成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:198 msgid "No LDAP user was found" msgstr "没有获取到 LDAP 用户" -#: settings/ws.py:209 +#: settings/ws.py:204 msgid "Total {}, success {}, failure {}" msgstr "总共 {},成功 {},失败 {}" @@ -9792,3 +9883,9 @@ msgstr "企业专业版" #: xpack/plugins/license/models.py:86 msgid "Ultimate edition" msgstr "企业旗舰版" + +#~ msgid "None" +#~ msgstr "无" + +#~ msgid "Yes,No" +#~ msgstr "Yes,No" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 5a9357fda..f7eab1398 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-08-15 14:04+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -656,7 +656,7 @@ msgstr "觸發方式" #: audits/models.py:92 audits/serializers.py:84 #: authentication/serializers/connect_token_secret.py:119 #: authentication/templates/authentication/_access_key_modal.html:34 -#: perms/serializers/permission.py:41 perms/serializers/permission.py:63 +#: perms/serializers/permission.py:52 perms/serializers/permission.py:74 #: tickets/serializers/ticket/ticket.py:21 msgid "Action" msgstr "動作" @@ -703,7 +703,7 @@ msgstr "密碼規則" #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 #: assets/serializers/platform.py:273 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 @@ -854,7 +854,7 @@ msgid "Exist policy" msgstr "帳號存在策略" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 -#: assets/models/platform.py:95 assets/serializers/asset/common.py:125 +#: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 @@ -866,7 +866,7 @@ msgstr "類別" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 @@ -907,7 +907,7 @@ msgstr "已修改" #: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 -#: perms/serializers/permission.py:35 +#: perms/serializers/permission.py:46 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:83 msgid "Assets" @@ -929,7 +929,7 @@ msgstr "帳號已存在" #: accounts/serializers/account/account.py:458 #: accounts/serializers/account/base.py:93 #: accounts/serializers/account/template.py:72 -#: assets/serializers/asset/common.py:387 +#: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特殊資訊" @@ -1063,7 +1063,7 @@ msgstr "" "CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "節點" @@ -1269,15 +1269,15 @@ msgstr "審批人" msgid "Active" msgstr "啟用中" -#: acls/models/base.py:81 perms/serializers/permission.py:31 +#: acls/models/base.py:81 perms/serializers/permission.py:42 #: tickets/models/flow.py:23 users/models/preference.py:16 #: users/serializers/group.py:21 users/serializers/user.py:424 msgid "Users" msgstr "用戶管理" #: acls/models/base.py:98 assets/models/automations/base.py:17 -#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 -#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 +#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148 +#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55 #: perms/serializers/user_permission.py:75 rbac/tree.py:35 msgid "Accounts" msgstr "帳號管理" @@ -1413,7 +1413,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:147 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1839,7 +1839,7 @@ msgstr "雲服務" msgid "Port" msgstr "埠" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150 +#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "地址" @@ -1855,7 +1855,7 @@ msgstr "系統平台" msgid "Zone" msgstr "網域" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集資產硬體資訊" @@ -2201,38 +2201,58 @@ msgid "" "type" msgstr "資產中批次更新平台,不符合平台類型跳過的資產" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:36 +msgid "Protocols, format is [\"protocol/port\"]" +msgstr "" + +#: assets/serializers/asset/common.py:38 +msgid "Protocol, format is name/port" +msgstr "" + +#: assets/serializers/asset/common.py:107 +msgid "" +"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" +msgstr "" + +#: assets/serializers/asset/common.py:135 +msgid "" +"Node path, format [\"/org_name/node_name\"], if node not exist, will create " +"it" +msgstr "" + +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 -#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 +#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388 #: xpack/plugins/cloud/serializers/task.py:35 msgid "Protocols" msgstr "協議組" -#: assets/serializers/asset/common.py:129 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:149 +#: assets/serializers/asset/common.py:171 msgid "Node path" msgstr "節點路徑" -#: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:389 +#: assets/serializers/asset/common.py:168 +#: assets/serializers/asset/common.py:409 msgid "Auto info" msgstr "自動化資訊" -#: assets/serializers/asset/common.py:245 +#: assets/serializers/asset/common.py:265 msgid "Platform not exist" msgstr "平台不存在" -#: assets/serializers/asset/common.py:281 +#: assets/serializers/asset/common.py:301 msgid "port out of range (0-65535)" msgstr "埠超出範圍 (0-65535)" -#: assets/serializers/asset/common.py:288 +#: assets/serializers/asset/common.py:308 msgid "Protocol is required: {}" msgstr "協議是必填的: {}" -#: assets/serializers/asset/common.py:316 +#: assets/serializers/asset/common.py:336 msgid "Invalid data" msgstr "無效的數據" @@ -2321,7 +2341,7 @@ msgid "" msgstr "網關是網域的網路代理,當連接網域內的資產時,連接將由網關進行路由。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 -#: orgs/serializers.py:13 perms/serializers/permission.py:39 +#: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "資產數量" @@ -2681,7 +2701,7 @@ msgid "Resource" msgstr "資源" #: audits/models.py:101 audits/models.py:147 audits/models.py:177 -#: terminal/serializers/command.py:75 +#: common/drf/renders/base.py:145 terminal/serializers/command.py:75 msgid "Datetime" msgstr "日期" @@ -3449,7 +3469,7 @@ msgid "Actions" msgstr "動作" #: authentication/serializers/connection_token.py:42 -#: perms/serializers/permission.py:43 perms/serializers/permission.py:64 +#: perms/serializers/permission.py:54 perms/serializers/permission.py:75 #: users/serializers/user.py:127 users/serializers/user.py:273 msgid "Is expired" msgstr "已過期" @@ -3491,8 +3511,8 @@ msgstr "SSH金鑰不合法" msgid "Access IP" msgstr "IP 白名單" -#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 -#: perms/serializers/permission.py:65 users/serializers/user.py:128 +#: authentication/serializers/token.py:92 perms/serializers/permission.py:53 +#: perms/serializers/permission.py:76 users/serializers/user.py:128 #: users/serializers/user.py:270 msgid "Is valid" msgstr "是否有效" @@ -4006,7 +4026,7 @@ msgstr "組織 ID" msgid "The file content overflowed (The maximum length `{}` bytes)" msgstr "文件內容太大 (最大長度 `{}` 位元組)" -#: common/drf/parsers/base.py:199 +#: common/drf/parsers/base.py:207 msgid "Parse file error: {}" msgstr "解析文件錯誤: {}" @@ -4014,7 +4034,67 @@ msgstr "解析文件錯誤: {}" msgid "Invalid excel file" msgstr "無效的 excel 文件" -#: common/drf/renders/base.py:208 +#: common/drf/renders/base.py:135 +msgid "Yes/No" +msgstr "" + +#: common/drf/renders/base.py:138 +msgid "Text, max length {}" +msgstr "" + +#: common/drf/renders/base.py:140 +msgid "Long text, no length limit" +msgstr "" + +#: common/drf/renders/base.py:142 +msgid "Number, min {} max {}" +msgstr "" + +#: common/drf/renders/base.py:153 +msgid "" +"Choices, format name(value), name is optional for human read, value is " +"requisite, options {}" +msgstr "" + +#: common/drf/renders/base.py:156 +#, fuzzy +#| msgid "Connect options" +msgid "Choices, options {}" +msgstr "連接項" + +#: common/drf/renders/base.py:158 +msgid "Phone number, format +8612345678901" +msgstr "" + +#: common/drf/renders/base.py:160 +msgid "Label, format [\"key:value\"]" +msgstr "" + +#: common/drf/renders/base.py:162 +msgid "" +"Object, format name(id), name is optional for human read, id is requisite" +msgstr "" + +#: common/drf/renders/base.py:164 +msgid "Object, format id" +msgstr "" + +#: common/drf/renders/base.py:168 +msgid "" +"Objects, format [\"name(id)\", ...], name is optional for human read, id is " +"requisite" +msgstr "" + +#: common/drf/renders/base.py:170 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "" + +#: common/drf/renders/base.py:172 +msgid "Objects, format [\"id\", ...]" +msgstr "" + +#: common/drf/renders/base.py:270 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4837,7 +4917,7 @@ msgstr "可以查看所有加入的組織" msgid "Can not delete virtual org" msgstr "無法刪除虛擬組織" -#: orgs/serializers.py:10 perms/serializers/permission.py:37 +#: orgs/serializers.py:10 perms/serializers/permission.py:48 #: rbac/serializers/role.py:27 users/serializers/group.py:54 msgid "Users amount" msgstr "用戶數量" @@ -4846,7 +4926,7 @@ msgstr "用戶數量" msgid "User groups amount" msgstr "用戶組數量" -#: orgs/serializers.py:14 perms/serializers/permission.py:40 +#: orgs/serializers.py:14 perms/serializers/permission.py:51 msgid "Nodes amount" msgstr "節點數量" @@ -4963,11 +5043,21 @@ msgstr "資產授權規則將要過期" msgid "asset permissions of organization {}" msgstr "組織 ({}) 的資產授權" -#: perms/serializers/permission.py:33 users/serializers/user.py:257 +#: perms/serializers/permission.py:32 +msgid "" +"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " +"choices: @ALL, @SPEC, @USER, @ANON, @INPUT" +msgstr "" + +#: perms/serializers/permission.py:38 +msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" +msgstr "" + +#: perms/serializers/permission.py:44 users/serializers/user.py:257 msgid "Groups" msgstr "使用者群組" -#: perms/serializers/permission.py:38 +#: perms/serializers/permission.py:49 msgid "Groups amount" msgstr "使用者組數量" @@ -5562,9 +5652,9 @@ msgstr "快取逾時時間 (秒)" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " -"cache" +"effectively improve the speed of user authentication., 0 means no " +"cache
If the user OU structure has been adjusted, click Submit to clear " +"the user DN cache" msgstr "" "對於使用者登錄認證時查詢的使用者 DN 進行快取,可以有效提高使用者認證的速度" "
如果使用者 OU 架構已調整,請點擊提交以清除使用者 DN 快取" @@ -6698,11 +6788,11 @@ msgstr "認證失敗: (未知): {}" msgid "Authentication success: {}" msgstr "認證成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:198 msgid "No LDAP user was found" msgstr "沒有取得到 LDAP 用戶" -#: settings/ws.py:209 +#: settings/ws.py:204 msgid "Total {}, success {}, failure {}" msgstr "總共 {},成功 {},失敗 {}" @@ -9807,3 +9897,8 @@ msgstr "企業專業版" #: xpack/plugins/license/models.py:86 msgid "Ultimate edition" msgstr "企業旗艦版" + +#, fuzzy +#~| msgid "Help text" +#~ msgid "#Help: " +#~ msgstr "幫助" diff --git a/apps/orgs/mixins/serializers.py b/apps/orgs/mixins/serializers.py index 558dac282..5f60c1318 100644 --- a/apps/orgs/mixins/serializers.py +++ b/apps/orgs/mixins/serializers.py @@ -23,7 +23,7 @@ class OrgResourceSerializerMixin(serializers.Serializer): 但是coco需要资产的org_id字段,所以修改为CharField类型 """ org_id = serializers.ReadOnlyField(default=get_current_org_id_for_serializer, label=_("Organization")) - org_name = serializers.ReadOnlyField(label=_("Org name")) + org_name = serializers.CharField(label=_("Org name"), read_only=True) add_org_fields = True def get_validators(self): diff --git a/apps/perms/serializers/permission.py b/apps/perms/serializers/permission.py index 38a32a29d..de0421e66 100644 --- a/apps/perms/serializers/permission.py +++ b/apps/perms/serializers/permission.py @@ -27,6 +27,17 @@ class ActionChoicesField(BitChoicesField): return data +class PermAccountsSerializer(serializers.ListField): + def get_render_help_text(self): + return _('Accounts, format ["@virtual", "root", "%template_id"], ' + 'virtual choices: @ALL, @SPEC, @USER, @ANON, @INPUT') + + +class PermProtocolsSerializer(serializers.ListField): + def get_render_help_text(self): + return _('Protocols, format ["ssh", "rdp", "vnc"] or ["all"]') + + class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer): users = ObjectRelatedField(queryset=User.objects, many=True, required=False, label=_('Users')) user_groups = ObjectRelatedField( @@ -41,8 +52,8 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali actions = ActionChoicesField(required=False, allow_null=True, label=_("Action")) is_valid = serializers.BooleanField(read_only=True, label=_("Is valid")) is_expired = serializers.BooleanField(read_only=True, label=_("Is expired")) - accounts = serializers.ListField(label=_("Accounts"), required=False) - protocols = serializers.ListField(label=_("Protocols"), required=False) + accounts = PermAccountsSerializer(label=_("Accounts"), required=False) + protocols = PermProtocolsSerializer(label=_("Protocols"), required=False) template_accounts = AccountTemplate.objects.none() diff --git a/apps/settings/serializers/auth/ldap.py b/apps/settings/serializers/auth/ldap.py index c835cf011..be022a659 100644 --- a/apps/settings/serializers/auth/ldap.py +++ b/apps/settings/serializers/auth/ldap.py @@ -88,7 +88,7 @@ class LDAPSettingSerializer(serializers.Serializer): default=3600 * 24 * 30, required=False, label=_('User DN cache timeout (s)'), help_text=_( - 'Caching the User DN obtained during user login authentication can effectively' + 'Caching the User DN obtained during user login authentication can effectively ' 'improve the speed of user authentication., 0 means no cache
' 'If the user OU structure has been adjusted, click Submit to clear the user DN cache' ) From 76b6489636bf67bef721652e6fe46e61a213a14d Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 9 Sep 2024 10:24:22 +0800 Subject: [PATCH 33/98] perf: update deps --- poetry.lock | 1626 ++++++++++++++++++++++++++---------------------- pyproject.toml | 6 +- 2 files changed, 892 insertions(+), 740 deletions(-) diff --git a/poetry.lock b/poetry.lock index 051a97173..030b4ff7d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -39,112 +39,131 @@ url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" [[package]] -name = "aiohttp" -version = "3.8.6" -description = "Async http client/server framework (asyncio)" +name = "aiohappyeyeballs" +version = "2.4.0" +description = "Happy Eyeballs for asyncio" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, - {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, - {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, - {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, - {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, - {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, - {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, - {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, - {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, - {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, - {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, - {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, - {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, - {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, - {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, - {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, - {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, - {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, - {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, - {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, - {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, - {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, - {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, - {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, - {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, - {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, - {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, - {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, - {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, - {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, - {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, - {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, - {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, - {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, - {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, - {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, - {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, - {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, - {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, + {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, + {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, ] -[package.dependencies] +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] +name = "aiohttp" +version = "3.10.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, + {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, + {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, + {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, + {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, + {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, + {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, + {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, + {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, + {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, + {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, + {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, + {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, + {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [package.source] type = "legacy" @@ -172,16 +191,16 @@ reference = "aliyun" [[package]] name = "alibabacloud-credentials" -version = "0.3.4" +version = "0.3.5" description = "The alibabacloud credentials module of alibabaCloud Python SDK." optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud_credentials-0.3.4.tar.gz", hash = "sha256:c15a34fe782c318d4cf24cb041a0385ac4ccd2548e524e5d7fe1cff56a9a6acc"}, + {file = "alibabacloud_credentials-0.3.5.tar.gz", hash = "sha256:ad065ec95921eaf51939195485d0e5cc9e0ea050282059c7d8bf74bdb5496177"}, ] [package.dependencies] -alibabacloud-tea = "*" +alibabacloud-tea = ">=0.3.9" [package.source] type = "legacy" @@ -230,16 +249,16 @@ reference = "aliyun" [[package]] name = "alibabacloud-gateway-spi" -version = "0.0.1" +version = "0.0.2" description = "Alibaba Cloud Gateway SPI SDK Library for Python" optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud_gateway_spi-0.0.1.tar.gz", hash = "sha256:1b259855708afc3c04d8711d8530c63f7645e1edc0cf97e2fd15461b08e11c30"}, + {file = "alibabacloud_gateway_spi-0.0.2.tar.gz", hash = "sha256:f932c8ba67291531dfbee6ca521dcf3523eb4ff93512bf0aaf135f2d4fc4704d"}, ] [package.dependencies] -alibabacloud_credentials = ">=0.2.0,<1.0.0" +alibabacloud_credentials = ">=0.3.4,<1.0.0" [package.source] type = "legacy" @@ -267,18 +286,18 @@ reference = "aliyun" [[package]] name = "alibabacloud-tea" -version = "0.3.6" +version = "0.3.9" description = "The tea module of alibabaCloud Python SDK." optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud-tea-0.3.6.tar.gz", hash = "sha256:ea7180c80b41ccddad1d474285f0da6ba9aa6ba898bcbc84e88409312a67a52a"}, + {file = "alibabacloud-tea-0.3.9.tar.gz", hash = "sha256:a9689770003fa9313d1995812f9fe36a2be315e5cdfc8d58de0d96808219ced9"}, + {file = "alibabacloud_tea-0.3.9-py3-none-any.whl", hash = "sha256:402fd2a92e6729f228d8c0300b182f80019edce19d83afa497aeb15fd7947f9a"}, ] [package.dependencies] -aiohttp = ">=3.7.0,<3.9.0" +aiohttp = ">=3.7.0,<4.0.0" requests = ">=2.21.0,<3.0.0" -urllib3 = "<2.0.0" [package.source] type = "legacy" @@ -287,19 +306,19 @@ reference = "aliyun" [[package]] name = "alibabacloud-tea-openapi" -version = "0.3.10" +version = "0.3.11" description = "Alibaba Cloud openapi SDK Library for Python" optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud_tea_openapi-0.3.10.tar.gz", hash = "sha256:46e9c54ea857346306cd5c628dc33479349b559179ed2fdb2251dbe6ec9a1cf1"}, + {file = "alibabacloud_tea_openapi-0.3.11.tar.gz", hash = "sha256:3f5cace1b1aeb8a64587574097403cfd066b86ee4c3c9abde587f9abfcad38de"}, ] [package.dependencies] alibabacloud_credentials = ">=0.3.1,<1.0.0" alibabacloud_gateway_spi = ">=0.0.1,<1.0.0" alibabacloud_openapi_util = ">=0.2.1,<1.0.0" -alibabacloud_tea_util = ">=0.3.12,<1.0.0" +alibabacloud_tea_util = ">=0.3.13,<1.0.0" alibabacloud_tea_xml = ">=0.0.2,<1.0.0" [package.source] @@ -309,12 +328,12 @@ reference = "aliyun" [[package]] name = "alibabacloud-tea-util" -version = "0.3.12" +version = "0.3.13" description = "The tea-util module of alibabaCloud Python SDK." optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud_tea_util-0.3.12.tar.gz", hash = "sha256:72a2f5a046e5b977ade4202eb4f65b3d70ad707a548e29aacd4a572c2d18d06b"}, + {file = "alibabacloud_tea_util-0.3.13.tar.gz", hash = "sha256:8cbdfd2a03fbbf622f901439fa08643898290dd40e1d928347f6346e43f63c90"}, ] [package.dependencies] @@ -345,16 +364,16 @@ reference = "aliyun" [[package]] name = "aliyun-python-sdk-core" -version = "2.15.1" +version = "2.15.2" description = "The core module of Aliyun Python SDK." optional = false python-versions = "*" files = [ - {file = "aliyun-python-sdk-core-2.15.1.tar.gz", hash = "sha256:518550d07f537cd3afac3b6c93b5c997ce3440e4d0c054e3acbdaa8261e90adf"}, + {file = "aliyun-python-sdk-core-2.15.2.tar.gz", hash = "sha256:54f66a53e193c61c5e16ea4505a0cab43543f8ad2ef22833f69c4d5e5151c17d"}, ] [package.dependencies] -cryptography = ">=2.6.0" +cryptography = ">=3.0.0" jmespath = ">=0.9.3,<1.0.0" [package.source] @@ -402,13 +421,13 @@ reference = "aliyun" [[package]] name = "aliyun-python-sdk-kms" -version = "2.16.3" +version = "2.16.5" description = "The kms module of Aliyun Python sdk." optional = false python-versions = "*" files = [ - {file = "aliyun-python-sdk-kms-2.16.3.tar.gz", hash = "sha256:c31b7d24e153271a3043e801e7b6b6b3f0db47e95a83c8d10cdab8c11662fc39"}, - {file = "aliyun_python_sdk_kms-2.16.3-py2.py3-none-any.whl", hash = "sha256:8bb8c293be94e0cc9114a5286a503d2ec215eaf8a1fb51de5d6c8bcac209d4a1"}, + {file = "aliyun-python-sdk-kms-2.16.5.tar.gz", hash = "sha256:f328a8a19d83ecbb965ffce0ec1e9930755216d104638cd95ecd362753b813b3"}, + {file = "aliyun_python_sdk_kms-2.16.5-py2.py3-none-any.whl", hash = "sha256:24b6cdc4fd161d2942619479c8d050c63ea9cd22b044fe33b60bbb60153786f0"}, ] [package.dependencies] @@ -501,7 +520,7 @@ description = "\"Consistent Ansible Python API and CLI with container and proces optional = false python-versions = ">=3.9" files = [ - {file = "2.4.0.1.zip", hash = "sha256:91df951047fae004f30f7a8b6b776940f44832a7646ecc5ff2cc15e4a887c47e"}, + {file = "2.4.0.1.zip", hash = "sha256:2753fc458afc047c637473a579154e92cd26b891a6d959e5083d36e4d478182a"}, ] [package.dependencies] @@ -592,22 +611,22 @@ reference = "aliyun" [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [package.source] type = "legacy" @@ -616,12 +635,13 @@ reference = "aliyun" [[package]] name = "autobahn" -version = "23.6.2" +version = "24.4.2" description = "WebSocket client & server library, WAMP real-time framework" optional = false python-versions = ">=3.9" files = [ - {file = "autobahn-23.6.2.tar.gz", hash = "sha256:ec9421c52a2103364d1ef0468036e6019ee84f71721e86b36fe19ad6966c1181"}, + {file = "autobahn-24.4.2-py2.py3-none-any.whl", hash = "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81"}, + {file = "autobahn-24.4.2.tar.gz", hash = "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9"}, ] [package.dependencies] @@ -631,14 +651,14 @@ setuptools = "*" txaio = ">=21.2.1" [package.extras] -all = ["PyGObject (>=3.40.0)", "argon2_cffi (>=20.1.0)", "attrs (>=20.3.0)", "base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "cffi (>=1.14.5)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "flatbuffers (>=22.12.6)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "msgpack (>=1.0.2)", "passlib (>=1.7.4)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "py-ubjson (>=0.16.1)", "pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "python-snappy (>=0.6.0)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "rlp (>=2.0.1)", "service_identity (>=18.1.0)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "ujson (>=4.0.2)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)", "zope.interface (>=5.2.0)"] +all = ["PyGObject (>=3.40.0)", "argon2-cffi (>=20.1.0)", "attrs (>=20.3.0)", "base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "cffi (>=1.14.5)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "flatbuffers (>=22.12.6)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "msgpack (>=1.0.2)", "passlib (>=1.7.4)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "py-ubjson (>=0.16.1)", "pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "python-snappy (>=0.6.0)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "rlp (>=2.0.1)", "service-identity (>=18.1.0)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "twisted (>=24.3.0)", "u-msgpack-python (>=2.1)", "ujson (>=4.0.2)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)", "zope.interface (>=5.2.0)"] compress = ["python-snappy (>=0.6.0)"] -dev = ["backports.tempfile (>=1.0)", "bumpversion (>=0.5.3)", "codecov (>=2.0.15)", "flake8 (<5)", "humanize (>=0.5.1)", "mypy (>=0.610)", "passlib", "pep8-naming (>=0.3.3)", "pip (>=9.0.1)", "pyenchant (>=1.6.6)", "pyflakes (>=1.0.0)", "pyinstaller (>=4.2)", "pylint (>=1.9.2)", "pytest (>=3.4.2)", "pytest-aiohttp", "pytest-asyncio (>=0.14.0)", "pytest-runner (>=2.11.1)", "pyyaml (>=4.2b4)", "qualname", "sphinx (>=1.7.1)", "sphinx-autoapi (>=1.7.0)", "sphinx_rtd_theme (>=0.1.9)", "sphinxcontrib-images (>=0.9.1)", "tox (>=4.2.8)", "tox-gh-actions (>=2.2.0)", "twine (>=3.3.0)", "twisted (>=22.10.0)", "txaio (>=20.4.1)", "watchdog (>=0.8.3)", "wheel (>=0.36.2)", "yapf (==0.29.0)"] -encryption = ["pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "service_identity (>=18.1.0)"] +dev = ["backports.tempfile (>=1.0)", "build (>=1.2.1)", "bumpversion (>=0.5.3)", "codecov (>=2.0.15)", "flake8 (<5)", "humanize (>=0.5.1)", "mypy (>=0.610)", "passlib", "pep8-naming (>=0.3.3)", "pip (>=9.0.1)", "pyenchant (>=1.6.6)", "pyflakes (>=1.0.0)", "pyinstaller (>=4.2)", "pylint (>=1.9.2)", "pytest (>=3.4.2)", "pytest-aiohttp", "pytest-asyncio (>=0.14.0)", "pytest-runner (>=2.11.1)", "pyyaml (>=4.2b4)", "qualname", "sphinx (>=1.7.1)", "sphinx-autoapi (>=1.7.0)", "sphinx-rtd-theme (>=0.1.9)", "sphinxcontrib-images (>=0.9.1)", "tox (>=4.2.8)", "tox-gh-actions (>=2.2.0)", "twine (>=3.3.0)", "twisted (>=22.10.0)", "txaio (>=20.4.1)", "watchdog (>=0.8.3)", "wheel (>=0.36.2)", "yapf (==0.29.0)"] +encryption = ["pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "service-identity (>=18.1.0)"] nvx = ["cffi (>=1.14.5)"] -scram = ["argon2_cffi (>=20.1.0)", "cffi (>=1.14.5)", "passlib (>=1.7.4)"] -serialization = ["cbor2 (>=5.2.0)", "flatbuffers (>=22.12.6)", "msgpack (>=1.0.2)", "py-ubjson (>=0.16.1)", "ujson (>=4.0.2)"] -twisted = ["attrs (>=20.3.0)", "twisted (>=20.3.0)", "zope.interface (>=5.2.0)"] +scram = ["argon2-cffi (>=20.1.0)", "cffi (>=1.14.5)", "passlib (>=1.7.4)"] +serialization = ["cbor2 (>=5.2.0)", "flatbuffers (>=22.12.6)", "msgpack (>=1.0.2)", "py-ubjson (>=0.16.1)", "u-msgpack-python (>=2.1)", "ujson (>=4.0.2)"] +twisted = ["attrs (>=20.3.0)", "twisted (>=24.3.0)", "zope.interface (>=5.2.0)"] ui = ["PyGObject (>=3.40.0)"] xbr = ["base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "rlp (>=2.0.1)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)"] @@ -649,19 +669,15 @@ reference = "aliyun" [[package]] name = "automat" -version = "22.10.0" +version = "24.8.1" description = "Self-service finite-state machines for the programmer on the go." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "Automat-22.10.0-py2.py3-none-any.whl", hash = "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180"}, - {file = "Automat-22.10.0.tar.gz", hash = "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e"}, + {file = "Automat-24.8.1-py3-none-any.whl", hash = "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a"}, + {file = "automat-24.8.1.tar.gz", hash = "sha256:b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88"}, ] -[package.dependencies] -attrs = ">=19.2.0" -six = "*" - [package.extras] visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] @@ -1024,13 +1040,13 @@ reference = "aliyun" [[package]] name = "cachetools" -version = "5.3.3" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [package.source] @@ -1116,63 +1132,78 @@ reference = "aliyun" [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -1546,13 +1577,13 @@ reference = "aliyun" [[package]] name = "cron-descriptor" -version = "1.4.3" +version = "1.4.5" description = "A Python library that converts cron expressions into human readable strings." optional = false python-versions = "*" files = [ - {file = "cron_descriptor-1.4.3-py3-none-any.whl", hash = "sha256:a67ba21804983b1427ed7f3e1ec27ee77bf24c652b0430239c268c5ddfbf9dc0"}, - {file = "cron_descriptor-1.4.3.tar.gz", hash = "sha256:7b1a00d7d25d6ae6896c0da4457e790b98cba778398a3d48e341e5e0d33f0488"}, + {file = "cron_descriptor-1.4.5-py3-none-any.whl", hash = "sha256:736b3ae9d1a99bc3dbfc5b55b5e6e7c12031e7ba5de716625772f8b02dcd6013"}, + {file = "cron_descriptor-1.4.5.tar.gz", hash = "sha256:f51ce4ffc1d1f2816939add8524f206c376a42c87a5fca3091ce26725b3b1bca"}, ] [package.extras] @@ -2226,13 +2257,13 @@ reference = "aliyun" [[package]] name = "elastic-transport" -version = "8.13.1" +version = "8.15.0" description = "Transport classes and utilities shared among Python Elastic client libraries" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "elastic_transport-8.13.1-py3-none-any.whl", hash = "sha256:5d4bb6b8e9d74a9c16de274e91a5caf65a3a8d12876f1e99152975e15b2746fe"}, - {file = "elastic_transport-8.13.1.tar.gz", hash = "sha256:16339d392b4bbe86ad00b4bdeecff10edf516d32bc6c16053846625f2c6ea250"}, + {file = "elastic_transport-8.15.0-py3-none-any.whl", hash = "sha256:d7080d1dada2b4eee69e7574f9c17a76b42f2895eff428e562f94b0360e158c0"}, + {file = "elastic_transport-8.15.0.tar.gz", hash = "sha256:85d62558f9baafb0868c801233a59b235e61d7b4804c28c2fadaa866b6766233"}, ] [package.dependencies] @@ -2240,7 +2271,7 @@ certifi = "*" urllib3 = ">=1.26.2,<3" [package.extras] -develop = ["aiohttp", "furo", "httpx", "mock", "opentelemetry-api", "opentelemetry-sdk", "orjson", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "respx", "sphinx (>2)", "sphinx-autodoc-typehints", "trustme"] +develop = ["aiohttp", "furo", "httpx", "opentelemetry-api", "opentelemetry-sdk", "orjson", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "respx", "sphinx (>2)", "sphinx-autodoc-typehints", "trustme"] [package.source] type = "legacy" @@ -2316,89 +2347,94 @@ reference = "aliyun" [[package]] name = "ephem" -version = "4.1.4" +version = "4.1.5" description = "Compute positions of the planets and stars" optional = false python-versions = "*" files = [ - {file = "ephem-4.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:024752ae7074c660630046929e12650cc6e72e1c11b7554ccefbe16f8ce3c48d"}, - {file = "ephem-4.1.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:158bf9fb2b58cb77c606687c9ad35dc82903ed00617a12c93dd2d89a65d6374d"}, - {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11be09d245e77457e87988a4fdc811bdc6c5f1daaa73fb24289b220db720831d"}, - {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:649bd2c85f5fc450136dacc0416af7127a07c0b2ce84bfdc89c1bc78129216a3"}, - {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6918b012365791b786ed0f30e8ea3941cbc49486dcf6c28d151f119c62d5be8"}, - {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d343e9ca26f04a05b01fcaaf800224da5d15ad76902d7dc452c216e448293893"}, - {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d0403738f59aefe81ee5b0219cd909f2a05b03b7da465f9b233da57d3dea0de6"}, - {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d61f38f35c25049ca2b95aa4e12e952e5ef56b31eac4a9d6d4e24aacf9373101"}, - {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4039aa2f0b8c204283fc478551d8b29c9473137ad8a910a5ff60ae3be6593c7b"}, - {file = "ephem-4.1.4-cp310-cp310-win32.whl", hash = "sha256:8979429643ac4e29a5496321c9c41a20cd7a6a530aee9865c7fab0008450ef28"}, - {file = "ephem-4.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:589a2235f49232b92ee0247923360a264086a57b2c39d4191348f95ba5ce0c3d"}, - {file = "ephem-4.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feab5f68ae9fa622d6316790c9cfc399e8b78f7958a61da4edf2cb5e0e675d44"}, - {file = "ephem-4.1.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df9c482c8d25e69271311606b4de0e177e44ceb11781c7ebacf17cc5b391f832"}, - {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cceea883856817f3ea3f73442e3be3a4a56558cdb77cc85d02db4429ce5ab16"}, - {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f3e9ea626bc522fd4dd1ff795f0922fcb4c4eb57effe91b6284411166ddd1fd7"}, - {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad22e769bd35415cad8f2ef6d4d875190d9bdad4fed2842fd19dac6f1ccb9dd"}, - {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3327218495235ec215ffe43253c0bf3fa982f59504b351c53b024f1c7b63752"}, - {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d2c56238a1aec72a78ad7061f5c531df97a66ea0cca45204b6b8141c3bb1540e"}, - {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fffe176bd94f4f61be5a54b54a966988cceb6ba69a6ed729aab166020fdb37c3"}, - {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f9b27117e7a82f7f70db9cb23b5cc36d37b166a2f73c55e14d7225d0ab95afa"}, - {file = "ephem-4.1.4-cp311-cp311-win32.whl", hash = "sha256:9bb21c0b117c9122c0141b0a71ee6fbbb087ed2aab4a7ab60f009e95e9f4a521"}, - {file = "ephem-4.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:55d7fb5c34b2e453e01fa4ca7ee375b19b438c9401ae8c4099ae4a3a37656972"}, - {file = "ephem-4.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f9e24aeea560dfcece3c2e313eb94e6be3e84888091455e541fa88f3a44da584"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653d99386932e5f78bb9cfc4495030ad9f3345eb4c2b32dca55547da8f1f0332"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53786461a6d5799d5fffe76622ad51444b264d1c7263b92a6dfcac640c3da93a"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:268f57f8768ccb0abbdf4cefb4781c7db812950019868f687b407b428513ee53"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d630aa287255ea9fba6962f351e4e0729bb620570684d52fbfcc31b11527f09e"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5f229bbf62ecb4cd6bb3374b15d0f8ff7b3d970c2936fccd89bdf9d693907a2"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d60d56f182de54bd84fadd6ea2dd8e8ef6fdef6a698c7cafd404ecb6eeefa598"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:404500c8d0030d75ec15bb6b98eee78ad163fd5252102c962ae6fb39c9488198"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fb020d6cc5ab1ad1cd9d3da4a6e2506beebb41d1b337d79cc20cc0a17f550f1"}, - {file = "ephem-4.1.4-cp312-cp312-win32.whl", hash = "sha256:29e71636ee4719419d03184abc85085f76989c79a61844f5e60acbf2513d2b42"}, - {file = "ephem-4.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:549654f63d88e0ab6248ae25ac2939131474ab9f3a91bee6b68ca6f214747c2a"}, - {file = "ephem-4.1.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:40067fc050c946c8d4c2d779805b61f063471a091e6124cbabcf61ac538011b2"}, - {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e2abe97aa2b091090012768b4d94793213cc01f0bf040dcc311a380ab08df69"}, - {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2677d3a5b42aedc578de10b0eecdba6a50731f159cb28f7ad38c5f62143494"}, - {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80a73da8ec61f86e5a97f73311159e61279dabdfbd17c9d4e2791a25a836f9ce"}, - {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a146db114cfc942d123a38c301a8b8ca7eef2e37d2c5a4bd59e4abc99123c083"}, - {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4f3650c27c3ab6b73e2de7fd8de10e1c0d73f4683c9c5fb2e7113722ec2c2b53"}, - {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:171fc5e7c4e9523f900dfd5ab6520bceb260a2b59fcb558d9aec17fd562b6251"}, - {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:8974799afb37f17ac71e16e479d0e315d74bea4bed2becaf21d1b9304299bbaf"}, - {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3c39fb62c240f57533ea618295e510c44e466e74f2f4a899fbaa04b166b62d04"}, - {file = "ephem-4.1.4-cp36-cp36m-win32.whl", hash = "sha256:23e1432f021c69b2965c87a693ffd25caf08416e92bcb0fed91425083a374210"}, - {file = "ephem-4.1.4-cp36-cp36m-win_amd64.whl", hash = "sha256:86d6dda3581e61f6bad5479e26bca9e560671852ac00a5a8ed10f722635ddf71"}, - {file = "ephem-4.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e731c3e2f1767fab14e5d4077a3519f70afd22cb7dd113274c2850f8ef8ff828"}, - {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8b79b47c7be0d64013fb5d97dd6bbfb9bf63ae07b2ec917be19d3b4cc5782b8"}, - {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89f759ce8e3489d15b9f3796d210196085dcb84cacdf24b2ece791b029245544"}, - {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daf1a1280102e14c718d684989da34151697a426522f8ae18b1081e8bad705c9"}, - {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3da3b76d5d5e339461059c3314013c152ef569c798bfd578bcfb504b875a837"}, - {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aac0a0e41deb2a197cf67e800a3d0f4029139b9ce12bed148ffe994ec78593f9"}, - {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:85809803e349bb4a0d56880067549abdc2b93fddf93ac3d55486040cbec1553f"}, - {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:93d8f8b4e6206d3401dbdb0cdabb0d15c59cf9c2a7ee7c586da8c7dbf1f2a136"}, - {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5beaa0cb659951211aec33a7c132557a1a161dacf53f1b1493830489cfc68215"}, - {file = "ephem-4.1.4-cp37-cp37m-win32.whl", hash = "sha256:bbd4727498928ece694ec1b33023f16b6d050d9952d4052129b24e08e04d67fd"}, - {file = "ephem-4.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:39c710d73449b1c495b58d803da881363a0cae4b728de9fa332f77bcb4686ac8"}, - {file = "ephem-4.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24b7e90c731e851a56ab5e9d538915faaa54945e9b5211cfdf04e570fc27c529"}, - {file = "ephem-4.1.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab40ad7a5ccd66cad4161ca2295c04f01a74ec596c936c3af97a67733e2cd5bf"}, - {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:555d63d70e36e46e43b955c37cdb0f8b82ee2051c575960c4b01948be9f04e5e"}, - {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a29de7c737047cc2412edada9d03b761339d3560d7db471cd04f257e1e02f2f"}, - {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e737b49643a300fa15b788accc72802af93b49cd5d071e53111e08e3fba6570"}, - {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:56c448a83290dabd1df5865fbf9e39d17400abcef37cb36de90ea1a860c0a08e"}, - {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3bd7da534a542d937b10f3c643301dc9b8bc09f7a40350b32efc32910232da9e"}, - {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0493ad1b3d2505acbf442e31aadb86fba096ba30008a586fe6361a9de5974ed3"}, - {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3442fba6afae0bcb643c9b069765033b67d2c8fe4350f9beb4f2f5cfdaaa7442"}, - {file = "ephem-4.1.4-cp38-cp38-win32.whl", hash = "sha256:8e0bb8379fb6b709a3cbceb6a11a3dc0f25e5b16a6f009b48e09d6b95f896d9c"}, - {file = "ephem-4.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:a940cd4d8d7aed68efd3d6b717f393bbedf541d388ba11eb3ed56a9fc6cbb1ca"}, - {file = "ephem-4.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f51a3bcd5f69c4070e8a6936e4a61019ad2d6b94bc8b5ca1e498dea0962a373"}, - {file = "ephem-4.1.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41680b48aeae5b992371bf7ec1bc07457500ff4a6ea7d333793e945b97951de0"}, - {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f11edaef2e4a4d010e21b5ff8bcd9435fbc7fe9e16923f81143f248ae8ae8e9d"}, - {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72078b49748318cbbbe1a49ab5dcd05e63c917151351175b590833e6163a1506"}, - {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2ba977ad0402ac44fe66af6e1119632efe84b7d1255f8f6f94d7768d9487453"}, - {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a21a11285904f43c3bc6909727d09109b8e38dc2e3cda662089601cb37b3d082"}, - {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9aabc3cab5fb9440564dfdf79e39ee01d16554d7bfb8228cddfe9eada460dba9"}, - {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:5327fd48fc8ff966023a6f177813fc058bb2a496c70b53a79f85bf2eba3ca93d"}, - {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e429f6e0e05e4c8c54802e951cd1bde440dd6f896c2b5691ef5ebd9bc3ba489"}, - {file = "ephem-4.1.4-cp39-cp39-win32.whl", hash = "sha256:a8d125d04800425a9d944109710687bbb3703e8f04ac3bc8445779bb0ad5dcc2"}, - {file = "ephem-4.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:4e8ec4e29c7f04d6334215775a8c4dc77eae8ed698384530d9415a98500ed01c"}, - {file = "ephem-4.1.4.tar.gz", hash = "sha256:73a59f0d2162d1624535c3c3b75f956556bdbb2055eaf554a7bef147d3f9c760"}, + {file = "ephem-4.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0796dbcd24f76af0e81c22e1f709b42873ef81d2c4dfa962f8d346f11489785d"}, + {file = "ephem-4.1.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0266cf69d594bd94034bd13c18dbcef13b301acd7357d7cf7d1bb8acaf7f00b4"}, + {file = "ephem-4.1.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3db8d53a37c772e1b132f5ed3535027d73e8dca4ead99a7563f09c4308996b63"}, + {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c6e7523d8856caa4ac53db1988693ce7a516fb25c1cd3c74a3472f951691c0e"}, + {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203bd3f00c49012bd07eb2627bcf9538f608b3431cb8053a7d3115e1df396312"}, + {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7ddf15c319a83fb5dadff58bb6e5fbcaff09338f5c2a1b2c7b1445b87002b5"}, + {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:13f800e03aad215ae6a4217122e64d0ce90e914574f8b5afa381d81dad0eecaa"}, + {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83921b341b4f4725e59c1463b9613f3fd3991392e17904170b146f5d6945afcb"}, + {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6219412800138f489733cb3a8b4fab0a8b3ef2dd5ec143aff35950dca9a71c36"}, + {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b95bf8c92a5eae665d63371440b93778b2508ad448907d12f72ed6ed08ea476c"}, + {file = "ephem-4.1.5-cp310-cp310-win32.whl", hash = "sha256:afefe022448f09c3e15472bd3ad30fa4824f8c4a9de65216b9952b9dfcec8750"}, + {file = "ephem-4.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:53df72aa3e2f1359ed56587b1930d0030fec030db71744564a83c10ea54316a7"}, + {file = "ephem-4.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b3e385d8447d908be6dd8c53c4452fee7d61040c9b6bb5a60195b57c85545ca6"}, + {file = "ephem-4.1.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:be6c4ced150d79ab6b5ff3bb7545fee26cf7f4f64ccf476a14850a63bbf125e7"}, + {file = "ephem-4.1.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c8a70e36632e88227c4ba8184fd91dbd32d0140f799202b5fb8510508f4c8e4"}, + {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ee2a4966167a0300db2c9155e4b64fc1a6bb67ca869659d4c0342869c44d4f3"}, + {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b45b9b15e65c7f26c1342b70e06e49bd83a9c527affe9de0fb5953a3a25a0cda"}, + {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e21a8120569f315ce181f2e654528cd10c18cb92382248de90574effed57d227"}, + {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:864d6aba1699f26e7768ed424d5218396300dce6d8deccb1c97164a424343675"}, + {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8f8f5dd5b1343dc77ea891ab423677a631fd7b820bbbeac7ec53ee332e8a4ca5"}, + {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:8a2347ad88aad026dff6f00b931bd2b0d6b4f184bf65ffd4b62f557526bf335d"}, + {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5496ebc21b2873e986836ad0756818bee80ed6deee58e1167a9876e4a64f0bbf"}, + {file = "ephem-4.1.5-cp311-cp311-win32.whl", hash = "sha256:f319ca58ee2ee27c18e42657ad8d3d1b0251dd369c9fd60af45b2bc2c42ded0a"}, + {file = "ephem-4.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:cc6a49fd3250cf67305230da962d779632b13da2a8fae5c383e973fa113baa97"}, + {file = "ephem-4.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51c17c62b031ec246546aa482d98e9a5573405385eb7adf7154f5a1af309ac8a"}, + {file = "ephem-4.1.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ff1436219d2dad1433c5f0a61f3a947ab6d4c622cc6a90d7cb5c2e28a8669fba"}, + {file = "ephem-4.1.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9495d515a6f49bd7a90f58320af1a95e4c3ab89307fbf31045cf05570f779eaf"}, + {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7952e8b54c771be6a58ce9aca91d729bcdace2293c68fe825df3433995aedafc"}, + {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e99ba9fbd5c136fc18b94fe5e709a7c4a19f13ed1c6a16bdec448cbd7d1bcb1"}, + {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2922e6cb66434e9edd3764b103b6bdd394a701bd39395c46f0a7751b9829ee"}, + {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:692f8dea9e91447c6406e9ee7001075d5794948677f5f8ee4601c146509b15b1"}, + {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7122f46a0ce2c2551360bf43b693a3f1f543c0aa6e736b2513bc3203df27df7c"}, + {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a68dd823d823ace3ecd94b3cf926d51ae8aa88ce248159850a8db45547720843"}, + {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cf745e4f02455d6c0f1d85a61206c420ee2c909b392266109e2da2d3a8c023db"}, + {file = "ephem-4.1.5-cp312-cp312-win32.whl", hash = "sha256:e1772852072727e848b5fe035ce7d9dc4662c1baffbd9e4cd7467ecf384db1d9"}, + {file = "ephem-4.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:fd984e38c5078be8cb881ed75c69b2204a1d7fd2230571fc92112edfc5362bf6"}, + {file = "ephem-4.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:740a5950b31ac9a7ca40a95b7cfb1678e747e860f77ac0030984c10dc5464e7f"}, + {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf5b786ed28e7d00704d2cf3862dec75223790ed800c285a91acfa538b1755c"}, + {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87e5be99ebc3bfa1dc70f31ba737dcdf9f6219570fa9a5729d0ff60134c7dc43"}, + {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:261f82bd821cfbb8a056bb834da06d19d3afd3eb735c8cd549f775e45caef502"}, + {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc612e5d1829f64a8db55d8b2566bef4ce479c1bbee110fedf3197170635f70c"}, + {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9fa8ee5d77a8a27a21d39142ee7c6332915b9e79a416a941cbc6f3db64c32cfe"}, + {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c109219a4728281dd4e8b1e9f449900d7a63e9400ef43c85151750d4725b0c9e"}, + {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cf81a3bfa15d84871c4f87ecbf92280184ce96619cacdfe55f761d510a7f81db"}, + {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:39dcc1b00882a2782771b12731a943706da8990c89be75caa294f0574cca661f"}, + {file = "ephem-4.1.5-cp36-cp36m-win32.whl", hash = "sha256:7b6384a032897d3e47da92ccc3348b74517c0dcf478a63b8cdedf69c177bccd2"}, + {file = "ephem-4.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:3bea9cb5a4a98d9c51430a395c4ad4f6307402fa7d3ffbe1bb28f7508e094dd3"}, + {file = "ephem-4.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cac6ed1664e7db22f3aadd8bc6b7afed191b8d5ce3aab9a00d719890a7c344d2"}, + {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02316f8ebb3f82273bc5fbb2970fd98bfb56ed8349197aff0f56c9b5fa04e47a"}, + {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b044d4e3b11953b0543cbd10468bf84afaa840d165c6effbffff3c15d721234"}, + {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a69b27eb82d7c0dccdd54e11ad27f3cadcddb02169a570ac7864dbaa9a10486"}, + {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b01734c27ce38705418191322fd7bd0372d9709d326263991b1c7e1bc75a59f"}, + {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bcae4b30c4a7474cfc102610f23a4a114196c8d15165cbc0551fb0d542a768eb"}, + {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6fde92b6cc7837c141506a09f721f983e31b32785a9680f4d075be9763dc931b"}, + {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:0849f522d1ad4daac5407307be786a54283599cfe87f3fcfc677153db45d7e22"}, + {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:82025d4a6d5f6d76a1f45b4eb940030be93e38a3ac3c589990172beac53c854e"}, + {file = "ephem-4.1.5-cp37-cp37m-win32.whl", hash = "sha256:d7c446228a8756fa39876701abf34d516cd9b49b867d52c2f661f1cf1d927335"}, + {file = "ephem-4.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:b1f509901dcf2b95cc175be39c90eb457e081f8ed9762f4aae74f45e092c7f8b"}, + {file = "ephem-4.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d1ca9cec961115a6197faee6ae2231bc76f9a7090bfdf759c810718c7715db9"}, + {file = "ephem-4.1.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3f95e89ab21e5214dbadfd41f9c94ce538bcd4411c18400cc638a00df728d67c"}, + {file = "ephem-4.1.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e8239ec63c9c6a1ab4d8c578bf6b34c114a3754b80c2e02ce07de827925353"}, + {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:972ff0942ddf0f4ac5124bd974608b8371b22e84ab5ed49b4634455331f41987"}, + {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd85a8b5b20020e791273f9cfd80510e4f647c362e5a3b7aec2abcb604d8d02a"}, + {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:543ddd9e6bf573c24c1ccf30257ec655d8be00e28279fbdadbc774927d949663"}, + {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:beea8cccaf184cd2a16c091b0ce92293f1128e49fd43e3c81e79c9f8d051cea6"}, + {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4f53899fbcdd14790b7a61aa70218337e1c6aabc26af99d2485ed6d98fec8cee"}, + {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3733d751c015d28bc043d543c47cee8d0a699a8330d3d34c9afdbd7e96310842"}, + {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a7c904e6df8511bfad2a3119d2ba2333d94953d0d212b31725f4f749267f21cc"}, + {file = "ephem-4.1.5-cp38-cp38-win32.whl", hash = "sha256:3b46aa3f576d528a9dd4357b18c3e59308d0a1e537e45fe91df3753fa63100bf"}, + {file = "ephem-4.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:37751e9bdb10ae109a2e7d7353911470ee5752f5caee4bbe0d764a39cdd57a5a"}, + {file = "ephem-4.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd76c85313b44e4a9b2e8a14f8e5ffbf43541b3cd023d623664f1dca8c8bf407"}, + {file = "ephem-4.1.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b56f805aa26818e7efa46c2bf98417f677e4dc9ae1b6ef278747d823c7d4df6"}, + {file = "ephem-4.1.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e9c15b5e5386cbee128737465ad7b042f57603c3e75bdbab84cd71b416127cf"}, + {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0f7f4a9de84a4ef8ce77ee980a963bb7725791caa3cb3389490ed35be1d06e8"}, + {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b38d0033f7e4ba6e2f5c9ecfc0827d619796ff182d98cc0adb62c6bce701fe0"}, + {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb55fc94512d0c46e610fa67af5fcad51e28aa2b30f7e88ef4cb38c7a443e81a"}, + {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c4183bc20f5933c9fad3d754f9a9ac75dc9ea0d8c6a7faff63de5d28d6bf26d9"}, + {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e067f98b6cd9da55a5de9ce7b2e1222574006b4c3083363eda507ce97ce9867b"}, + {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b5cf0e29657001482f3ed8eeaf1757c67b8d8fdc9c90e57b8d544fd1e7e4d6b3"}, + {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5058cfcf36643b11198d54266137d7db8476d66b2c9ff5e4e35638fc3254a2d"}, + {file = "ephem-4.1.5-cp39-cp39-win32.whl", hash = "sha256:c1eed128e5f6e551bc50cfaa87395cef7f03d65537fe4e8502704d200279e3b2"}, + {file = "ephem-4.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:f4ff7153ac577cb336e08fdc7a76ac91185b2af5dae9ba3ae9d0e87af3ac35c3"}, + {file = "ephem-4.1.5.tar.gz", hash = "sha256:0c64a8aa401574c75942045b9af70d1656e14c5366151c0cbb400cbeedc2362a"}, ] [package.source] @@ -2460,13 +2496,13 @@ reference = "aliyun" [[package]] name = "exchangelib" -version = "5.4.1" +version = "5.4.3" description = "Client for Microsoft Exchange Web Services (EWS)" optional = false python-versions = ">=3.8" files = [ - {file = "exchangelib-5.4.1-py3-none-any.whl", hash = "sha256:e093fe18062992d8a78bbdcc2564ec5c92deb644e9f62ea710521a1dd8dfce76"}, - {file = "exchangelib-5.4.1.tar.gz", hash = "sha256:33e2c7bd45718d940ee9920479907f50d3bc6b8d496a78dbc87fca8f8ddcc189"}, + {file = "exchangelib-5.4.3-py3-none-any.whl", hash = "sha256:be15937847823bc44ab91f572157959eaee64825e766984dbc03de379affe6d5"}, + {file = "exchangelib-5.4.3.tar.gz", hash = "sha256:dc8019c1c5e7afbc807170259bd3479cf572169f56f7e6f492ecdbdb7d7ceb3a"}, ] [package.dependencies] @@ -2701,13 +2737,13 @@ reference = "aliyun" [[package]] name = "google-api-core" -version = "2.19.0" +version = "2.19.2" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, - {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, + {file = "google_api_core-2.19.2-py3-none-any.whl", hash = "sha256:53ec0258f2837dd53bbd3d3df50f5359281b3cc13f800c941dd15a9b5a415af4"}, + {file = "google_api_core-2.19.2.tar.gz", hash = "sha256:ca07de7e8aa1c98a8bfca9321890ad2340ef7f2eb136e558cee68f24b94b0a8f"}, ] [package.dependencies] @@ -2716,7 +2752,7 @@ googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" [package.extras] @@ -2731,13 +2767,13 @@ reference = "aliyun" [[package]] name = "google-auth" -version = "2.30.0" +version = "2.34.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, - {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, + {file = "google_auth-2.34.0-py2.py3-none-any.whl", hash = "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65"}, + {file = "google_auth-2.34.0.tar.gz", hash = "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc"}, ] [package.dependencies] @@ -2747,7 +2783,7 @@ rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +enterprise-cert = ["cryptography", "pyopenssl"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -2780,17 +2816,17 @@ reference = "aliyun" [[package]] name = "googleapis-common-protos" -version = "1.63.1" +version = "1.65.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, - {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, + {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, + {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] @@ -2877,61 +2913,61 @@ reference = "aliyun" [[package]] name = "grpcio" -version = "1.64.1" +version = "1.66.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, - {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, - {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, - {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, - {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, - {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, - {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, - {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, - {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, - {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, - {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, - {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, - {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, - {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, - {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, - {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, - {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, - {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, - {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, - {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, - {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, + {file = "grpcio-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492"}, + {file = "grpcio-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083"}, + {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a"}, + {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d"}, + {file = "grpcio-1.66.1-cp310-cp310-win32.whl", hash = "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c"}, + {file = "grpcio-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858"}, + {file = "grpcio-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a"}, + {file = "grpcio-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1"}, + {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e"}, + {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd"}, + {file = "grpcio-1.66.1-cp311-cp311-win32.whl", hash = "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791"}, + {file = "grpcio-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb"}, + {file = "grpcio-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a"}, + {file = "grpcio-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761"}, + {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815"}, + {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524"}, + {file = "grpcio-1.66.1-cp312-cp312-win32.whl", hash = "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759"}, + {file = "grpcio-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734"}, + {file = "grpcio-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2"}, + {file = "grpcio-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef"}, + {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb"}, + {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d"}, + {file = "grpcio-1.66.1-cp38-cp38-win32.whl", hash = "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3"}, + {file = "grpcio-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce"}, + {file = "grpcio-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503"}, + {file = "grpcio-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e"}, + {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb"}, + {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c"}, + {file = "grpcio-1.66.1-cp39-cp39-win32.whl", hash = "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45"}, + {file = "grpcio-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8"}, + {file = "grpcio-1.66.1.tar.gz", hash = "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.64.1)"] +protobuf = ["grpcio-tools (>=1.66.1)"] [package.source] type = "legacy" @@ -2940,18 +2976,18 @@ reference = "aliyun" [[package]] name = "grpcio-status" -version = "1.62.2" +version = "1.62.3" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, - {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, + {file = "grpcio-status-1.62.3.tar.gz", hash = "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485"}, + {file = "grpcio_status-1.62.3-py3-none-any.whl", hash = "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.62.2" +grpcio = ">=1.62.3" protobuf = ">=4.21.6" [package.source] @@ -3064,13 +3100,13 @@ reference = "aliyun" [[package]] name = "httpx" -version = "0.27.0" +version = "0.27.2" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, ] [package.dependencies] @@ -3085,6 +3121,7 @@ brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] [package.source] type = "legacy" @@ -3137,13 +3174,13 @@ reference = "aliyun" [[package]] name = "humanize" -version = "4.9.0" +version = "4.10.0" description = "Python humanize utilities" optional = false python-versions = ">=3.8" files = [ - {file = "humanize-4.9.0-py3-none-any.whl", hash = "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"}, - {file = "humanize-4.9.0.tar.gz", hash = "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"}, + {file = "humanize-4.10.0-py3-none-any.whl", hash = "sha256:39e7ccb96923e732b5c2e27aeaa3b10a8dfeeba3eb965ba7b74a3eb0e30040a6"}, + {file = "humanize-4.10.0.tar.gz", hash = "sha256:06b6eb0293e4b85e8d385397c5868926820db32b9b654b932f57fa41c23c9978"}, ] [package.extras] @@ -3211,18 +3248,20 @@ reference = "aliyun" [[package]] name = "incremental" -version = "22.10.0" -description = "\"A small library that versions your Python projects.\"" +version = "24.7.2" +description = "A small library that versions your Python projects." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "incremental-22.10.0-py2.py3-none-any.whl", hash = "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51"}, - {file = "incremental-22.10.0.tar.gz", hash = "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0"}, + {file = "incremental-24.7.2-py3-none-any.whl", hash = "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe"}, + {file = "incremental-24.7.2.tar.gz", hash = "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9"}, ] +[package.dependencies] +setuptools = ">=61.0" + [package.extras] -mypy = ["click (>=6.0)", "mypy (==0.812)", "twisted (>=16.4.0)"] -scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] +scripts = ["click (>=6.0)"] [package.source] type = "legacy" @@ -3364,6 +3403,81 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" +[[package]] +name = "jiter" +version = "0.5.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, + {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, + {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, + {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, + {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, + {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, + {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, + {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, + {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, + {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, + {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, + {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, +] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + [[package]] name = "jmespath" version = "0.10.0" @@ -3901,22 +4015,22 @@ reference = "aliyun" [[package]] name = "msal" -version = "1.29.0" +version = "1.31.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false python-versions = ">=3.7" files = [ - {file = "msal-1.29.0-py3-none-any.whl", hash = "sha256:6b301e63f967481f0cc1a3a3bac0cf322b276855bc1b0955468d9deb3f33d511"}, - {file = "msal-1.29.0.tar.gz", hash = "sha256:8f6725f099752553f9b2fe84125e2a5ebe47b49f92eacca33ebedd3a9ebaae25"}, + {file = "msal-1.31.0-py3-none-any.whl", hash = "sha256:96bc37cff82ebe4b160d5fc0f1196f6ca8b50e274ecd0ec5bf69c438514086e7"}, + {file = "msal-1.31.0.tar.gz", hash = "sha256:2c4f189cf9cc8f00c80045f66d39b7c0f3ed45873fd3d1f2af9f22db2e12ff4b"}, ] [package.dependencies] -cryptography = ">=2.5,<45" +cryptography = ">=2.5,<46" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.13.2,<0.17)"] +broker = ["pymsalruntime (>=0.14,<0.18)", "pymsalruntime (>=0.17,<0.18)"] [package.source] type = "legacy" @@ -4288,23 +4402,24 @@ reference = "aliyun" [[package]] name = "openai" -version = "1.35.3" +version = "1.44.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.35.3-py3-none-any.whl", hash = "sha256:7b26544cef80f125431c073ffab3811d2421fbb9e30d3bd5c2436aba00b042d5"}, - {file = "openai-1.35.3.tar.gz", hash = "sha256:d6177087f150b381d49499be782d764213fdf638d391b29ca692b84dd675a389"}, + {file = "openai-1.44.0-py3-none-any.whl", hash = "sha256:99a12bbda15f9c632ee911851e101669a82ee34992fbfd658a9db27d90dc0a9c"}, + {file = "openai-1.44.0.tar.gz", hash = "sha256:acde74598976ec85bc477e9abb94eeb17f6efd998914d5685eeb46a69116894a"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" -typing-extensions = ">=4.7,<5" +typing-extensions = ">=4.11,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] @@ -4417,13 +4532,13 @@ reference = "aliyun" [[package]] name = "oslo-config" -version = "9.4.0" +version = "9.6.0" description = "Oslo Configuration API" optional = false python-versions = ">=3.8" files = [ - {file = "oslo.config-9.4.0-py3-none-any.whl", hash = "sha256:8c2049c14cade7adeeda18638531b3b3a40d3c6bcc690535939f64a3c1ec8d63"}, - {file = "oslo.config-9.4.0.tar.gz", hash = "sha256:35b11a661b608edb50305dad91e4e30819d90ef794b7d7dba5bd8b2ef2eb8c0d"}, + {file = "oslo.config-9.6.0-py3-none-any.whl", hash = "sha256:7bcd6c3d9dbdd6e4d49a9a6dc3d10ae96073ebe3175280031adc0cbc76500967"}, + {file = "oslo.config-9.6.0.tar.gz", hash = "sha256:9f05ef70e48d9a61a8d0c9bed389da24f2ef5a89df5b6e8deb7c741d6113667e"}, ] [package.dependencies] @@ -4436,8 +4551,8 @@ rfc3986 = ">=1.2.0" stevedore = ">=1.20.0" [package.extras] -rst-generator = ["rst2txt (>=1.1.0)", "sphinx (>=1.8.0,!=2.1.0)"] -test = ["bandit (>=1.7.0,<1.8.0)", "coverage (>=4.0,!=4.4)", "fixtures (>=3.0.0)", "hacking (>=6.1.0,<6.2.0)", "mypy (>=0.720)", "oslo.log (>=3.36.0)", "oslotest (>=3.2.0)", "pre-commit (>=2.6.0)", "requests-mock (>=1.5.0)", "stestr (>=2.1.0)", "testscenarios (>=0.4)", "testtools (>=2.2.0)"] +rst-generator = ["rst2txt (>=1.1.0)", "sphinx (>=1.8.0)"] +test = ["bandit (>=1.7.0,<1.8.0)", "coverage (>=4.0)", "fixtures (>=3.0.0)", "hacking (>=6.1.0,<6.2.0)", "mypy (>=0.720)", "oslo.log (>=3.36.0)", "oslotest (>=3.2.0)", "pre-commit (>=2.6.0)", "requests-mock (>=1.5.0)", "stestr (>=2.1.0)", "testscenarios (>=0.4)", "testtools (>=2.2.0)"] [package.source] type = "legacy" @@ -4446,17 +4561,17 @@ reference = "aliyun" [[package]] name = "oslo-i18n" -version = "6.3.0" +version = "6.4.0" description = "Oslo i18n library" optional = false python-versions = ">=3.8" files = [ - {file = "oslo.i18n-6.3.0-py3-none-any.whl", hash = "sha256:698eb5c63a01359ed6d91031d6331098190d38be0bdda7d270264d6f86bc79e7"}, - {file = "oslo.i18n-6.3.0.tar.gz", hash = "sha256:64a251edef8bf1bb1d4e6f78d377e149d4f15c1a9245de77f172016da6267444"}, + {file = "oslo.i18n-6.4.0-py3-none-any.whl", hash = "sha256:5417778ba3b1920b70b99859d730ac9bf37f18050dc28af890c66345ba855bc0"}, + {file = "oslo.i18n-6.4.0.tar.gz", hash = "sha256:66e04c041e9ff17d07e13ec7f48295fbc36169143c72ca2352a3efcc98e7b608"}, ] [package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" +pbr = ">=2.0.0" [package.source] type = "legacy" @@ -4465,19 +4580,19 @@ reference = "aliyun" [[package]] name = "oslo-serialization" -version = "5.4.0" +version = "5.5.0" description = "Oslo Serialization library" optional = false python-versions = ">=3.8" files = [ - {file = "oslo.serialization-5.4.0-py3-none-any.whl", hash = "sha256:f999b75f2c2904c2f6aae5efbb67ab668cc0e79470510b721937626b36427220"}, - {file = "oslo.serialization-5.4.0.tar.gz", hash = "sha256:315cb3465e99c685cb091b90365cb701bee7140e204ba3e5fc2d8a20b4ec6e76"}, + {file = "oslo.serialization-5.5.0-py3-none-any.whl", hash = "sha256:cd2297c2006be104298843c4d176fb659eba0c6b618a3e3760d650dc771a6df5"}, + {file = "oslo.serialization-5.5.0.tar.gz", hash = "sha256:9e752fc5d8a975956728dd96a82186783b3fefcacbb3553acd933058861e15a6"}, ] [package.dependencies] msgpack = ">=0.5.2" "oslo.utils" = ">=3.33.0" -pbr = ">=2.0.0,<2.1.0 || >2.1.0" +pbr = ">=2.0.0" tzdata = {version = ">=2022.4", markers = "python_version >= \"3.9\""} [package.source] @@ -4487,19 +4602,19 @@ reference = "aliyun" [[package]] name = "oslo-utils" -version = "7.1.0" +version = "7.3.0" description = "Oslo Utility library" optional = false python-versions = ">=3.8" files = [ - {file = "oslo.utils-7.1.0-py3-none-any.whl", hash = "sha256:1d6504526c33cc10ae2c72565d0446a82d2acd43eaa5e6f3fd901d78400a2da0"}, - {file = "oslo.utils-7.1.0.tar.gz", hash = "sha256:5e42f3394d1f1f976e8994ac4a0918966d2f7eaf7c77380dd612c4a4148dd98e"}, + {file = "oslo.utils-7.3.0-py3-none-any.whl", hash = "sha256:a25c0a3270f71fcfa822a72c3f74bd61fe41e97240812986695cd32d4a171fb1"}, + {file = "oslo.utils-7.3.0.tar.gz", hash = "sha256:59a5d3e4e7bbc78d801ccebc2b823e429b624c12bb6e3b6e76f71c29f2bf21df"}, ] [package.dependencies] debtcollector = ">=1.2.0" iso8601 = ">=0.1.11" -netaddr = ">=0.7.18" +netaddr = ">=0.10.0" netifaces = ">=0.10.4" "oslo.i18n" = ">=3.15.3" packaging = ">=20.4" @@ -4601,13 +4716,13 @@ reference = "aliyun" [[package]] name = "pbr" -version = "6.0.0" +version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" files = [ - {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, - {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, + {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, + {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, ] [package.source] @@ -4740,13 +4855,13 @@ reference = "aliyun" [[package]] name = "portalocker" -version = "2.10.0" +version = "2.10.1" description = "Wraps the portalocker recipe for easy usage" optional = false python-versions = ">=3.8" files = [ - {file = "portalocker-2.10.0-py3-none-any.whl", hash = "sha256:48944147b2cd42520549bc1bb8fe44e220296e56f7c3d551bc6ecce69d9b0de1"}, - {file = "portalocker-2.10.0.tar.gz", hash = "sha256:49de8bc0a2f68ca98bf9e219c81a3e6b27097c7bf505a87c5a112ce1aaeb9b81"}, + {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, + {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, ] [package.dependencies] @@ -4764,13 +4879,13 @@ reference = "aliyun" [[package]] name = "prettytable" -version = "3.10.0" +version = "3.11.0" description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" optional = false python-versions = ">=3.8" files = [ - {file = "prettytable-3.10.0-py3-none-any.whl", hash = "sha256:6536efaf0757fdaa7d22e78b3aac3b69ea1b7200538c2c6995d649365bddab92"}, - {file = "prettytable-3.10.0.tar.gz", hash = "sha256:9665594d137fb08a1117518c25551e0ede1687197cf353a4fdc78d27e1073568"}, + {file = "prettytable-3.11.0-py3-none-any.whl", hash = "sha256:aa17083feb6c71da11a68b2c213b04675c4af4ce9c541762632ca3f2cb3546dd"}, + {file = "prettytable-3.11.0.tar.gz", hash = "sha256:7e23ca1e68bbfd06ba8de98bf553bf3493264c96d5e8a615c0471025deeba722"}, ] [package.dependencies] @@ -4846,22 +4961,22 @@ reference = "aliyun" [[package]] name = "protobuf" -version = "4.25.3" +version = "4.25.4" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, + {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, + {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, + {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, + {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, + {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, + {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, + {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, + {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, ] [package.source] @@ -5153,19 +5268,23 @@ reference = "aliyun" [[package]] name = "pydantic" -version = "2.7.4" +version = "2.9.0" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, - {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, + {file = "pydantic-2.9.0-py3-none-any.whl", hash = "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370"}, + {file = "pydantic-2.9.0.tar.gz", hash = "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" +pydantic-core = "2.23.2" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] +tzdata = {version = "*", markers = "python_version >= \"3.9\""} [package.extras] email = ["email-validator (>=2.0.0)"] @@ -5177,90 +5296,100 @@ reference = "aliyun" [[package]] name = "pydantic-core" -version = "2.18.4" +version = "2.23.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, - {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, - {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, - {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, - {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, - {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, - {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, - {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, - {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, - {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, - {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, - {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, - {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, - {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, + {file = "pydantic_core-2.23.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7d0324a35ab436c9d768753cbc3c47a865a2cbc0757066cb864747baa61f6ece"}, + {file = "pydantic_core-2.23.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:276ae78153a94b664e700ac362587c73b84399bd1145e135287513442e7dfbc7"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c7aa318da542cdcc60d4a648377ffe1a2ef0eb1e996026c7f74507b720a78"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cf842265a3a820ebc6388b963ead065f5ce8f2068ac4e1c713ef77a67b71f7c"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae90b9e50fe1bd115b24785e962b51130340408156d34d67b5f8f3fa6540938e"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ae65fdfb8a841556b52935dfd4c3f79132dc5253b12c0061b96415208f4d622"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c8aa40f6ca803f95b1c1c5aeaee6237b9e879e4dfb46ad713229a63651a95fb"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c53100c8ee5a1e102766abde2158077d8c374bee0639201f11d3032e3555dfbc"}, + {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b9dd6aa03c812017411734e496c44fef29b43dba1e3dd1fa7361bbacfc1354"}, + {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b18cf68255a476b927910c6873d9ed00da692bb293c5b10b282bd48a0afe3ae2"}, + {file = "pydantic_core-2.23.2-cp310-none-win32.whl", hash = "sha256:e460475719721d59cd54a350c1f71c797c763212c836bf48585478c5514d2854"}, + {file = "pydantic_core-2.23.2-cp310-none-win_amd64.whl", hash = "sha256:5f3cf3721eaf8741cffaf092487f1ca80831202ce91672776b02b875580e174a"}, + {file = "pydantic_core-2.23.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8"}, + {file = "pydantic_core-2.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57"}, + {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4"}, + {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa"}, + {file = "pydantic_core-2.23.2-cp311-none-win32.whl", hash = "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576"}, + {file = "pydantic_core-2.23.2-cp311-none-win_amd64.whl", hash = "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589"}, + {file = "pydantic_core-2.23.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec"}, + {file = "pydantic_core-2.23.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0"}, + {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73"}, + {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0"}, + {file = "pydantic_core-2.23.2-cp312-none-win32.whl", hash = "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f"}, + {file = "pydantic_core-2.23.2-cp312-none-win_amd64.whl", hash = "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342"}, + {file = "pydantic_core-2.23.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac"}, + {file = "pydantic_core-2.23.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604"}, + {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d"}, + {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced"}, + {file = "pydantic_core-2.23.2-cp313-none-win32.whl", hash = "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1"}, + {file = "pydantic_core-2.23.2-cp313-none-win_amd64.whl", hash = "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac"}, + {file = "pydantic_core-2.23.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:743e5811b0c377eb830150d675b0847a74a44d4ad5ab8845923d5b3a756d8100"}, + {file = "pydantic_core-2.23.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6650a7bbe17a2717167e3e23c186849bae5cef35d38949549f1c116031b2b3aa"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56e6a12ec8d7679f41b3750ffa426d22b44ef97be226a9bab00a03365f217b2b"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810ca06cca91de9107718dc83d9ac4d2e86efd6c02cba49a190abcaf33fb0472"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:785e7f517ebb9890813d31cb5d328fa5eda825bb205065cde760b3150e4de1f7"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ef71ec876fcc4d3bbf2ae81961959e8d62f8d74a83d116668409c224012e3af"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d50ac34835c6a4a0d456b5db559b82047403c4317b3bc73b3455fefdbdc54b0a"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16b25a4a120a2bb7dab51b81e3d9f3cde4f9a4456566c403ed29ac81bf49744f"}, + {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:41ae8537ad371ec018e3c5da0eb3f3e40ee1011eb9be1da7f965357c4623c501"}, + {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07049ec9306ec64e955b2e7c40c8d77dd78ea89adb97a2013d0b6e055c5ee4c5"}, + {file = "pydantic_core-2.23.2-cp38-none-win32.whl", hash = "sha256:086c5db95157dc84c63ff9d96ebb8856f47ce113c86b61065a066f8efbe80acf"}, + {file = "pydantic_core-2.23.2-cp38-none-win_amd64.whl", hash = "sha256:67b6655311b00581914aba481729971b88bb8bc7996206590700a3ac85e457b8"}, + {file = "pydantic_core-2.23.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:358331e21a897151e54d58e08d0219acf98ebb14c567267a87e971f3d2a3be59"}, + {file = "pydantic_core-2.23.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4d9f15ffe68bcd3898b0ad7233af01b15c57d91cd1667f8d868e0eacbfe3f87"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0123655fedacf035ab10c23450163c2f65a4174f2bb034b188240a6cf06bb123"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6e3ccebdbd6e53474b0bb7ab8b88e83c0cfe91484b25e058e581348ee5a01a5"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc535cb898ef88333cf317777ecdfe0faac1c2a3187ef7eb061b6f7ecf7e6bae"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aab9e522efff3993a9e98ab14263d4e20211e62da088298089a03056980a3e69"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05b366fb8fe3d8683b11ac35fa08947d7b92be78ec64e3277d03bd7f9b7cda79"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7568f682c06f10f30ef643a1e8eec4afeecdafde5c4af1b574c6df079e96f96c"}, + {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cdd02a08205dc90238669f082747612cb3c82bd2c717adc60f9b9ecadb540f80"}, + {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a2ab4f410f4b886de53b6bddf5dd6f337915a29dd9f22f20f3099659536b2f6"}, + {file = "pydantic_core-2.23.2-cp39-none-win32.whl", hash = "sha256:0448b81c3dfcde439551bb04a9f41d7627f676b12701865c8a2574bcea034437"}, + {file = "pydantic_core-2.23.2-cp39-none-win_amd64.whl", hash = "sha256:4cebb9794f67266d65e7e4cbe5dcf063e29fc7b81c79dc9475bd476d9534150e"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e758d271ed0286d146cf7c04c539a5169a888dd0b57026be621547e756af55bc"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f477d26183e94eaafc60b983ab25af2a809a1b48ce4debb57b343f671b7a90b6"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da3131ef2b940b99106f29dfbc30d9505643f766704e14c5d5e504e6a480c35e"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329a721253c7e4cbd7aad4a377745fbcc0607f9d72a3cc2102dd40519be75ed2"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7706e15cdbf42f8fab1e6425247dfa98f4a6f8c63746c995d6a2017f78e619ae"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e64ffaf8f6e17ca15eb48344d86a7a741454526f3a3fa56bc493ad9d7ec63936"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dd59638025160056687d598b054b64a79183f8065eae0d3f5ca523cde9943940"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:12625e69b1199e94b0ae1c9a95d000484ce9f0182f9965a26572f054b1537e44"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d813fd871b3d5c3005157622ee102e8908ad6011ec915a18bd8fde673c4360e"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1eb37f7d6a8001c0f86dc8ff2ee8d08291a536d76e49e78cda8587bb54d8b329"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce7eaf9a98680b4312b7cebcdd9352531c43db00fca586115845df388f3c465"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f087879f1ffde024dd2788a30d55acd67959dcf6c431e9d3682d1c491a0eb474"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ce883906810b4c3bd90e0ada1f9e808d9ecf1c5f0b60c6b8831d6100bcc7dd6"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a8031074a397a5925d06b590121f8339d34a5a74cfe6970f8a1124eb8b83f4ac"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23af245b8f2f4ee9e2c99cb3f93d0e22fb5c16df3f2f643f5a8da5caff12a653"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c57e493a0faea1e4c38f860d6862ba6832723396c884fbf938ff5e9b224200e2"}, + {file = "pydantic_core-2.23.2.tar.gz", hash = "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd"}, ] [package.dependencies] @@ -5449,13 +5578,13 @@ reference = "aliyun" [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.9.0" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, ] [package.dependencies] @@ -5463,8 +5592,8 @@ cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryp [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [package.source] @@ -5589,43 +5718,92 @@ reference = "aliyun" [[package]] name = "pymssql" -version = "2.2.8" +version = "2.3.1" description = "DB-API interface to Microsoft SQL Server for Python. (new Cython-based version)" optional = false python-versions = "*" files = [ - {file = "pymssql-2.2.8-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bfd7b8edef78097ccd3f52ac3f3a5c3cf0019f8a280f306cacbbb165caaf63"}, - {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:049f2e3de919e8e02504780a21ebbf235e21ca8ed5c7538c5b6e705aa6c43d8c"}, - {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd86d8e3e346e34f3f03d12e333747b53a1daa74374a727f4714d5b82ee0dd5"}, - {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:508226a0df7cb6faeda9f8e84e85743690ca427d7b27af9a73d75fcf0c1eef6e"}, - {file = "pymssql-2.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:47859887adeaf184766b5e0bc845dd23611f3808f9521552063bb36eabc10092"}, - {file = "pymssql-2.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d873e553374d5b1c57fe1c43bb75e3bcc2920678db1ef26f6bfed396c7d21b30"}, - {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf31b8b76634c826a91f9999e15b7bfb0c051a0f53b319fd56481a67e5b903bb"}, - {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:821945c2214fe666fd456c61e09a29a00e7719c9e136c801bffb3a254e9c579b"}, - {file = "pymssql-2.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:cc85b609b4e60eac25fa38bbac1ff854fd2c2a276e0ca4a3614c6f97efb644bb"}, - {file = "pymssql-2.2.8-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:ebe7f64d5278d807f14bea08951e02512bfbc6219fd4d4f15bb45ded885cf3d4"}, - {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:253af3d39fc0235627966817262d5c4c94ad09dcbea59664748063470048c29c"}, - {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9d109df536dc5f7dd851a88d285a4c9cb12a9314b621625f4f5ab1197eb312"}, - {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:358d5acf0298d6618edf7fedc4ce3dc8fb5ce8a9db85e7332d5196d29d841821"}, - {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:63e1be8936372c07aee2405203ee0161ce76b03893cafe3d46841be9886f5ffe"}, - {file = "pymssql-2.2.8-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:381d8a47c4665d99f114849bed23bcba1922c9d005accc3ac19cee8a1d3522dc"}, - {file = "pymssql-2.2.8-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4f365033c9b4263b74b8a332bbdf2d7d8d7230f05805439b4f3fbf0a0164acfe"}, - {file = "pymssql-2.2.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03903bdf23a2aac26e9b772b3998efeba079fcb6fcfa6df7abc614e9afa14af0"}, - {file = "pymssql-2.2.8-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:5c83208138f87942c5f08aa50c5fb8d89b7f15340cde58a77b08f49df277e134"}, - {file = "pymssql-2.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7e4538e85d7b5fb3867636391f91e9e18ac2e0aef660d25e97268e04339f2c36"}, - {file = "pymssql-2.2.8-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:e920d6f805a525f19e770e48326a5f96b83d7b8dfd093f5b7015b54ef84bcf4c"}, - {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2446645eb8684c0cb246a3294110455dd89a29608dfa7a58ea88aa42aa1cf005"}, - {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3906993300650844ec140aa58772c0f5f3e9e9d5709c061334fd1551acdcf066"}, - {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7309c7352e4a87c9995c3183ebfe0ff4135e955bb759109637673c61c9f0ca8d"}, - {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b8d603cc1ec7ae585c5a409a1d45e8da067970c79dd550d45c238ae0aa0f79f"}, - {file = "pymssql-2.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:293cb4d0339e221d877d6b19a1905082b658f0100a1e2ccc9dda10de58938901"}, - {file = "pymssql-2.2.8-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:895041edd002a2e91d8a4faf0906b6fbfef29d9164bc6beb398421f5927fa40e"}, - {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b2d9c6d38a416c6f2db36ff1cd8e69f9a5387a46f9f4f612623192e0c9404b1"}, - {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63d6f25cf40fe6a03c49be2d4d337858362b8ab944d6684c268e4990807cf0c"}, - {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c83ad3ad20951f3a94894b354fa5fa9666dcd5ebb4a635dad507c7d1dd545833"}, - {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3933f7f082be74698eea835df51798dab9bc727d94d3d280bffc75ab9265f890"}, - {file = "pymssql-2.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:de313375b90b0f554058992f35c4a4beb3f6ec2f5912d8cd6afb649f95b03a9f"}, - {file = "pymssql-2.2.8.tar.gz", hash = "sha256:9baefbfbd07d0142756e2dfcaa804154361ac5806ab9381350aad4e780c3033e"}, + {file = "pymssql-2.3.1-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:001b3321a5f620b80d1427933fcca11b05f29a808d7772a84d18d01e640ee60a"}, + {file = "pymssql-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15466dd41be5e32302f0c4791f612aadd608a0e6ec0b10d769e76cbb4c86aa97"}, + {file = "pymssql-2.3.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74349040d4ff6f05894aefb5109ecffcd416e1e366d9951085d3225a9d09c46b"}, + {file = "pymssql-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc79dbe5eca8825b73830c8bb147b6f588300dc7510393822682162dc4ff003f"}, + {file = "pymssql-2.3.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0b93ebe2feb45e772ca708bc4cd70f3e4c72796ec1b157fd5d80cdc589c786aa"}, + {file = "pymssql-2.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:44b1c8752c0fc6750902c1c521f258bdf4271bfbf7b2a5fee469b6ad00631aab"}, + {file = "pymssql-2.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fdfadb055a9ecad58356decfecc41626999ad7b548cc7ea898cf159e2217f7bb"}, + {file = "pymssql-2.3.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:46f1074c6763e9a899128f22a0f72e9fb0035535f48efabd6a294db1c149e6f1"}, + {file = "pymssql-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ebb11b61d99ec5bbe0b8c411ff748a90263cdaf474881de231da8184e721c42c"}, + {file = "pymssql-2.3.1-cp310-cp310-win32.whl", hash = "sha256:2ef07fdee3e9652d39b4c081c5c5e1a1031abd122b402ed66813bceb3874ccea"}, + {file = "pymssql-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:791522339215cb7f88db54c831a2347e0c4d69dd3092a343eea5b9339adf4412"}, + {file = "pymssql-2.3.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:0433ffa1c86290a93e81176f377621cb70405be66ade8f3070d3f5ec9cfebdba"}, + {file = "pymssql-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6182d82ebfbe46f0e7748d068c6a1c16c0f4fe1f34f1c390f63375cee79b44b0"}, + {file = "pymssql-2.3.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfbe07dcf0aaee8ce630624669cb2fb77b76743d4dd925f99331422be8704de3"}, + {file = "pymssql-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d999c8e5d5d48e9305c4132392825de402f13feea15694e4e7103029b6eae06"}, + {file = "pymssql-2.3.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2dced0a76d8e99c283103a2e3c825ca22c67f1f8fc5cff657510f4d2ffb9d188"}, + {file = "pymssql-2.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:880d3173025dea3babf5ab862875b3c76a5cf8df5b292418050c7793c651c0b2"}, + {file = "pymssql-2.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9f89c698e29ce5c576e4980ded89c00b45e482ec02759bfbfc1aa326648cf64a"}, + {file = "pymssql-2.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f4f2a38ce6e39ed2414c20ca16deaea4340868033a4bb23d5e4e30c72290caf"}, + {file = "pymssql-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e34e8aa1d3da555dbf23141b02f401267c0be32104b4f030afd0bae62d26d735"}, + {file = "pymssql-2.3.1-cp311-cp311-win32.whl", hash = "sha256:72e57e20802bf97399e050a0760a4541996fc27bc605a1a25e48ca6fe4913c48"}, + {file = "pymssql-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b5d3604bca2fa8d5ba2eed1582a3c8a83970a8d2edabfcfd87c1edecb7617d16"}, + {file = "pymssql-2.3.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:c28f1b9560b82fe1a1e51d8c56f6d36bca7c507a8cdf2caa2a0642503c220d5c"}, + {file = "pymssql-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3509b75747eb22ae89f3d47ae316a4b9eac7d952269e88b356ef117a1b8e3b8"}, + {file = "pymssql-2.3.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cca3bed27e1ab867e482fa8b529d408489ad57e8b60452f75ef288da90573db6"}, + {file = "pymssql-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fe3276915e6040daec409203e3143aa2826984adb8d223c155dab91010110a4"}, + {file = "pymssql-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d36d566d0d6997c95442c3d2902800e6b072ccc017c6284e5b1bd4e17dc8fada"}, + {file = "pymssql-2.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3564df40a678623a769acd9677dc68228b2694170132c6f296eb62bf766d31e4"}, + {file = "pymssql-2.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3dbd4106faabf97f028d0ac59b30d132cfb5e48cf5314b0476f293123dbf3422"}, + {file = "pymssql-2.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:acd1690d9b1b2ece9d0e1fd7d68571fc9fa56b6ba8697a3132446419ff7fb3f4"}, + {file = "pymssql-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:126e0b78773975136e6385da7286c277e2e0320c1f4bee0e4dc61a5edcf98c41"}, + {file = "pymssql-2.3.1-cp312-cp312-win32.whl", hash = "sha256:21803b731b8c8780fc974d9b4931fa8f1ca29c227502a4c317e12773c8bdef43"}, + {file = "pymssql-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:6b0224fc5ce4cf0703278859f145e3e921c04d9feb59739a104d3020bbf0c0c1"}, + {file = "pymssql-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:709c1df3134e330ee9590437253be363b558154bde5bb54856fc5fe68a03c971"}, + {file = "pymssql-2.3.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9381eafaf529815f2d61f22b99e0538e744b31234f17d4384f5b0496bd1fbed"}, + {file = "pymssql-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3bf78789014f202855f5d00de982bbcd95177fe8bcf920f0ce730b72456c173"}, + {file = "pymssql-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4b44280eedd0a3f031e9464d4fc632a215fadcfb375bb479065b61a6337df402"}, + {file = "pymssql-2.3.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:922f536b925880c260968c8f2130b1c9d6315b83f300f18365b5421933f034a2"}, + {file = "pymssql-2.3.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f00f618d1c0f58617de548e5094f7d55ab6034b94068d7eebba60a034866b10b"}, + {file = "pymssql-2.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b363db86a1a3fe16df9b4253e17b02a268d0f2e2753679b8e85cee268e2fe8c4"}, + {file = "pymssql-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:396a26cf576196cc4a3d77890b2b8eb62655ff02846288757dd8b587352cc4f5"}, + {file = "pymssql-2.3.1-cp36-cp36m-win32.whl", hash = "sha256:5a1a1c697596f23058697709144d00a44e7af6ecab6a517f2ecf28dcf8fb4280"}, + {file = "pymssql-2.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:4f92e8657d42341dce01f7f57d03f84b35c0ed00a7bef24533ff80a37ffcfb4e"}, + {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:095b50e43bfbc4d6f953810175ba275bb3e6136206f3a7146bdd1031e3f0dd9b"}, + {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ac89098732c327725b53464932c6a532367271a3d5c5a988f61e23e0e0e286"}, + {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f284fc052cf1dbc702a2f4d13442d87fc6847ba9054faccfc8d8446fcf00894"}, + {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:40778b65c09eef9e7c25c444b96e76f81d8b5cf1828cb555123d052b7d3b5661"}, + {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c8609bc7f8b13d383729ba09042b4d796a607c93779c616be51b37caa6b384"}, + {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ab2aea2ae8bc1aba0105fccbf9e4f6716648b2b8f9421fd3418c6cc798fca43e"}, + {file = "pymssql-2.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e594de69832ad13761412f4d5c981a6e5d931b22f25136c8cd3531d9c6cfdf63"}, + {file = "pymssql-2.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:68f879b4ec4b2191a1d8b3bb24db04c3631737653785369c275bd5a574e54093"}, + {file = "pymssql-2.3.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:9ef157e63a1c19e7ab4823237b5f03a3bca45e1e94a4d5ed73baab6d019830c7"}, + {file = "pymssql-2.3.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:66afe6ee539e37cdfea0c6b2d596ec0d2a6223f09450c4df7cf872bad12691fe"}, + {file = "pymssql-2.3.1-cp37-cp37m-win32.whl", hash = "sha256:b9cc14a9f63e632200f54311da9868ece2715fa9560f6272c9bb82c57edc0543"}, + {file = "pymssql-2.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54bc10f28c0acc1347d3c7056e702ad21f128e6bf7737b4edc8c267372db9ce8"}, + {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8d955e751fb125be2a8513b5a338457a3fe73e5daa094815f96a86e496f7149"}, + {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c13ca6eaf0d7f16af9edf87d58070329bfacb7f27b90e1de16318d64c7b873b"}, + {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ecb0cdea24e2c019fb403fd642c04a64e8767c79f8dd38451eb5d72ceffce34"}, + {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:afd57a728e81d73a0f43f3d28216c402fea03bd06a382da881dfc8215fb4080d"}, + {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e6f6d9de73309cda602bbb769cb707f08d6899664f3ac6e9ed3e3b1ad472cee"}, + {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:02b808dbb86bbe751dd3fd117e83926b0a19ca9d9b833fae945bf2e31be66bf6"}, + {file = "pymssql-2.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0f1ba9befe23e6c4e75c2a626ffe59d159ab3a425a0208515888ec8670bf5bf"}, + {file = "pymssql-2.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8eecb4f3b41b8b29a0cbe502ae37b6477063d690151f668c410328f101f6198b"}, + {file = "pymssql-2.3.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a36c8b089e2d7b606aee823eefdfd72f5df110241fc5d913094b0b9da2692794"}, + {file = "pymssql-2.3.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:425de7d3f38cd1867c30b7c352d66020f38fdcdf804282ee232f5e25672930c1"}, + {file = "pymssql-2.3.1-cp38-cp38-win32.whl", hash = "sha256:ce397eb6a2a90fcd2a83d8812c1b8752af3b5362e630da49aa556c947e32ce3d"}, + {file = "pymssql-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:02c4ab7a58bfb57edb2deee7e2aceed2512960e7c2c1fd2cb23c647471a36ba2"}, + {file = "pymssql-2.3.1-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:750078568dafc1e0a24cf0f51eecfe548b13440976a2c8b19cc6e5d38e7b10bc"}, + {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a651dd98f67eef98f429c949fb50ea0a92fcf8668834cc35909237c24c1b906"}, + {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1ecedaeec8f4d8643d088b4985f0b742d9669bff701153a845b0d1900260b81"}, + {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015f6ccd1bcb53f22a3226653d0d8155da40f4afbc1fd0cec25de5fe8decf126"}, + {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:da44761ca2f996d88f90c0f972b583dfe9c389db84888bd8209cdb83508f7c7a"}, + {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9557b738475e06dfd53f97d8a2c2b259b9b9fd79bf1a4e084ae4e9f164be644d"}, + {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f3f2e2792364a50417f3c2dc0d8f125955c1b641f36eb313daf666045b9748"}, + {file = "pymssql-2.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:be8af4dea025f171ffb1e5b17cb0c9cbc92b0e3c32d0517bc678fff6f660e5fb"}, + {file = "pymssql-2.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a87950fb1a2b1c4028064fac971f3e191adebb58657ca985330f70e02f95223e"}, + {file = "pymssql-2.3.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9ea04bf8e13d567650631a944c88886c99a5622d9491e896a9b5a9ffbef2e352"}, + {file = "pymssql-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d93a82f8ad7d3606354b81bbbe7e7832f70fd6e9ccb2e04a2975117da5df973"}, + {file = "pymssql-2.3.1-cp39-cp39-win32.whl", hash = "sha256:6a2657152d4007314b66f353a25fc2742155c2770083320b5255fc576103661e"}, + {file = "pymssql-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6c9ffb3ef110bf0fc2a41c845f231cf749162b1d71e02b0aceb6c0ebc603e2e9"}, + {file = "pymssql-2.3.1.tar.gz", hash = "sha256:ddee15c4c193e14c92fe2cd720ca9be1dba1e0f4178240380b8f5f6f00da04c6"}, ] [package.source] @@ -5705,13 +5883,13 @@ reference = "aliyun" [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, ] [package.extras] @@ -5744,13 +5922,13 @@ reference = "aliyun" [[package]] name = "pyspnego" -version = "0.11.0" +version = "0.11.1" description = "Windows Negotiate Authentication Client and Server" optional = false python-versions = ">=3.8" files = [ - {file = "pyspnego-0.11.0-py3-none-any.whl", hash = "sha256:cdfe9af7b19749d692e02fd4bd1b4b71d44ecb8dd9b2474abb0f3d90f6154e7e"}, - {file = "pyspnego-0.11.0.tar.gz", hash = "sha256:17dda4fbf725094c440e68709601c1575db83d9c844c9efedf0ad4dd1b72e5a0"}, + {file = "pyspnego-0.11.1-py3-none-any.whl", hash = "sha256:129a4294f2c4d681d5875240ef87accc6f1d921e8983737fb0b59642b397951e"}, + {file = "pyspnego-0.11.1.tar.gz", hash = "sha256:e92ed8b0a62765b9d6abbb86a48cf871228ddb97678598dc01c9c39a626823f6"}, ] [package.dependencies] @@ -5789,12 +5967,13 @@ reference = "aliyun" [[package]] name = "python-crontab" -version = "3.1.0" +version = "3.2.0" description = "Python Crontab API" optional = false python-versions = "*" files = [ - {file = "python-crontab-3.1.0.tar.gz", hash = "sha256:f4ea1605d24533b67fa7a634ef26cb59a5f2e7954f6e677d2d7a2229959a2fc8"}, + {file = "python_crontab-3.2.0-py3-none-any.whl", hash = "sha256:82cb9b6a312d41ff66fd3caf3eed7115c28c195bfb50711bc2b4b9592feb9fe5"}, + {file = "python_crontab-3.2.0.tar.gz", hash = "sha256:40067d1dd39ade3460b2ad8557c7651514cd3851deffff61c5c60e1227c5c36b"}, ] [package.dependencies] @@ -6425,18 +6604,23 @@ reference = "aliyun" [[package]] name = "setuptools" -version = "70.1.0" +version = "74.1.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.1.0-py3-none-any.whl", hash = "sha256:d9b8b771455a97c8a9f3ab3448ebe0b29b5e105f1228bba41028be116985a267"}, - {file = "setuptools-70.1.0.tar.gz", hash = "sha256:01a1e793faa5bd89abc851fa15d0a0db26f160890c7102cd8dce643e886b47f5"}, + {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, + {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] [package.source] type = "legacy" @@ -6576,13 +6760,13 @@ reference = "aliyun" [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [package.source] @@ -6592,13 +6776,13 @@ reference = "aliyun" [[package]] name = "sqlparse" -version = "0.5.0" +version = "0.5.1" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" files = [ - {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, - {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, + {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, + {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, ] [package.extras] @@ -6703,17 +6887,17 @@ reference = "aliyun" [[package]] name = "stevedore" -version = "5.2.0" +version = "5.3.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.8" files = [ - {file = "stevedore-5.2.0-py3-none-any.whl", hash = "sha256:1c15d95766ca0569cad14cb6272d4d31dae66b011a929d7c18219c176ea1b5c9"}, - {file = "stevedore-5.2.0.tar.gz", hash = "sha256:46b93ca40e1114cea93d738a6c1e365396981bb6bb78c27045b7587c9473544d"}, + {file = "stevedore-5.3.0-py3-none-any.whl", hash = "sha256:1efd34ca08f474dad08d9b19e934a22c68bb6fe416926479ba29e5013bcc8f78"}, + {file = "stevedore-5.3.0.tar.gz", hash = "sha256:9a64265f4060312828151c204efbe9b7a9852a0d9228756344dbc7e4023e375a"}, ] [package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" +pbr = ">=2.0.0" [package.source] type = "legacy" @@ -6845,13 +7029,13 @@ reference = "aliyun" [[package]] name = "twisted" -version = "24.3.0" +version = "24.7.0" description = "An asynchronous networking framework written in Python" optional = false python-versions = ">=3.8.0" files = [ - {file = "twisted-24.3.0-py3-none-any.whl", hash = "sha256:039f2e6a49ab5108abd94de187fa92377abe5985c7a72d68d0ad266ba19eae63"}, - {file = "twisted-24.3.0.tar.gz", hash = "sha256:6b38b6ece7296b5e122c9eb17da2eeab3d98a198f50ca9efd00fb03e5b4fd4ae"}, + {file = "twisted-24.7.0-py3-none-any.whl", hash = "sha256:734832ef98108136e222b5230075b1079dad8a3fc5637319615619a7725b0c81"}, + {file = "twisted-24.7.0.tar.gz", hash = "sha256:5a60147f044187a127ec7da96d170d49bcce50c6fd36f594e60f4587eff4d394"}, ] [package.dependencies] @@ -6860,60 +7044,26 @@ automat = ">=0.8.0" constantly = ">=15.1" hyperlink = ">=17.1.1" idna = {version = ">=2.4", optional = true, markers = "extra == \"tls\""} -incremental = ">=22.10.0" +incremental = ">=24.7.0" pyopenssl = {version = ">=21.0.0", optional = true, markers = "extra == \"tls\""} service-identity = {version = ">=18.1.0", optional = true, markers = "extra == \"tls\""} -twisted-iocpsupport = {version = ">=1.0.2,<2", markers = "platform_system == \"Windows\""} typing-extensions = ">=4.2.0" zope-interface = ">=5" [package.extras] -all-non-platform = ["twisted[conch,http2,serial,test,tls]", "twisted[conch,http2,serial,test,tls]"] +all-non-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] conch = ["appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)"] -dev = ["coverage (>=6b1,<7)", "pyflakes (>=2.2,<3.0)", "python-subunit (>=1.4,<2.0)", "twisted[dev-release]", "twistedchecker (>=0.7,<1.0)"] +dev = ["coverage (>=7.5,<8.0)", "cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.56)", "pydoctor (>=23.9.0,<23.10.0)", "pyflakes (>=2.2,<3.0)", "pyhamcrest (>=2)", "python-subunit (>=1.4,<2.0)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "twistedchecker (>=0.7,<1.0)"] dev-release = ["pydoctor (>=23.9.0,<23.10.0)", "pydoctor (>=23.9.0,<23.10.0)", "sphinx (>=6,<7)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "towncrier (>=23.6,<24.0)"] -gtk-platform = ["pygobject", "pygobject", "twisted[all-non-platform]", "twisted[all-non-platform]"] +gtk-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pygobject", "pygobject", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] http2 = ["h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)"] -macos-platform = ["pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "twisted[all-non-platform]", "twisted[all-non-platform]"] -mypy = ["mypy (>=1.8,<2.0)", "mypy-zope (>=1.0.3,<1.1.0)", "twisted[all-non-platform,dev]", "types-pyopenssl", "types-setuptools"] -osx-platform = ["twisted[macos-platform]", "twisted[macos-platform]"] +macos-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +mypy = ["appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "coverage (>=7.5,<8.0)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "idna (>=2.4)", "mypy (>=1.8,<2.0)", "mypy-zope (>=1.0.3,<1.1.0)", "priority (>=1.1.0,<2.0)", "pydoctor (>=23.9.0,<23.10.0)", "pyflakes (>=2.2,<3.0)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "python-subunit (>=1.4,<2.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "twistedchecker (>=0.7,<1.0)", "types-pyopenssl", "types-setuptools"] +osx-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] test = ["cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.56)", "pyhamcrest (>=2)"] tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] -windows-platform = ["pywin32 (!=226)", "pywin32 (!=226)", "twisted[all-non-platform]", "twisted[all-non-platform]"] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - -[[package]] -name = "twisted-iocpsupport" -version = "1.0.4" -description = "An extension for use in the twisted I/O Completion Ports reactor." -optional = false -python-versions = "*" -files = [ - {file = "twisted-iocpsupport-1.0.4.tar.gz", hash = "sha256:858096c0d15e33f15ac157f455d8f86f2f2cdd223963e58c0f682a3af8362d89"}, - {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win32.whl", hash = "sha256:afa2b630797f9ed2f27f3d9f55e3f72b4244911e45a8c82756f44babbf0b243e"}, - {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:0058c963c8957bcd3deda62122e89953c9de1e867a274facc9b15dde1a9f31e8"}, - {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win32.whl", hash = "sha256:196f7c7ccad4ba4d1783b1c4e1d1b22d93c04275cd780bf7498d16c77319ad6e"}, - {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:4e5f97bcbabdd79cbaa969b63439b89801ea560f11d42b0a387634275c633623"}, - {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win32.whl", hash = "sha256:6081bd7c2f4fcf9b383dcdb3b3385d75a26a7c9d2be25b6950c3d8ea652d2d2d"}, - {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:76f7e67cec1f1d097d1f4ed7de41be3d74546e1a4ede0c7d56e775c4dce5dfb0"}, - {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:3d306fc4d88a6bcf61ce9d572c738b918578121bfd72891625fab314549024b5"}, - {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:391ac4d6002a80e15f35adc4ad6056f4fe1c17ceb0d1f98ba01b0f4f917adfd7"}, - {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:0c1b5cf37f0b2d96cc3c9bc86fff16613b9f5d0ca565c96cf1f1fb8cfca4b81c"}, - {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:3c5dc11d72519e55f727320e3cee535feedfaee09c0f0765ed1ca7badff1ab3c"}, - {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win32.whl", hash = "sha256:cc86c2ef598c15d824a243c2541c29459881c67fc3c0adb6efe2242f8f0ec3af"}, - {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c27985e949b9b1a1fb4c20c71d315c10ea0f93fdf3ccdd4a8c158b5926edd8c8"}, - {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win32.whl", hash = "sha256:e311dfcb470696e3c077249615893cada598e62fa7c4e4ca090167bd2b7d331f"}, - {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4574eef1f3bb81501fb02f911298af3c02fe8179c31a33b361dd49180c3e644d"}, - {file = "twisted_iocpsupport-1.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:872747a3b64e2909aee59c803ccd0bceb9b75bf27915520ebd32d69687040fa2"}, - {file = "twisted_iocpsupport-1.0.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c2712b778bacf1db434e3e065adfed3db300754186a29aecac1efae9ef4bcaff"}, - {file = "twisted_iocpsupport-1.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7c66fa0aa4236b27b3c61cb488662d85dae746a6d1c7b0d91cf7aae118445adf"}, - {file = "twisted_iocpsupport-1.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:300437af17396a945a58dcfffd77863303a8b6d9e65c6e81f1d2eed55b50d444"}, -] +windows-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)", "twisted-iocpsupport (>=1.0.2)", "twisted-iocpsupport (>=1.0.2)"] [package.source] type = "legacy" @@ -7069,13 +7219,13 @@ reference = "aliyun" [[package]] name = "urllib3" -version = "1.26.19" +version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, - {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] @@ -7503,101 +7653,103 @@ reference = "aliyun" [[package]] name = "yarl" -version = "1.9.4" +version = "1.11.0" description = "Yet another URL library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, - {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, - {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, - {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, - {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, - {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, - {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, - {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, - {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, - {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, - {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, - {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, - {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, - {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, - {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, - {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, + {file = "yarl-1.11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a657db1b9982f3dac0e360614d0e8945d2873da6e681fb7fca23ef1c3eb37f8"}, + {file = "yarl-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65a1a05efca52b102691e64db5fcf973030a1c88fee393804ff91f99c95a6e74"}, + {file = "yarl-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f4cb417d380e2d77961eecec75aaaf6f7ab14e6de26eb3a498f498029a6556a1"}, + {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8aee7c8378c6aa3103b99d1eb9995268ef730fa9f88ea68b9eee4341e204eec9"}, + {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84624db40e2358cfd5cf2558b1aaffd93366d27ee32228a97785f2ec87d44a17"}, + {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a596bb15e036952549871a4ccd2205679902dc7f241e3ced6b2ab2e44c55795"}, + {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d4d2cc4b076c8ad0175a15ee9482a387b3303c97d4b71062db7356b2ac04c7"}, + {file = "yarl-1.11.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f8bc849004122591104793a576e9c747b0e5d9486d6a30225521b817255748"}, + {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e38176a559edde0cfff4b663791a007a5f9f90c73aee1d6f7ddbcf6bfb7287b3"}, + {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:706ac0f77b45e9e0278ec6c98929764e119d3ce3136792b6475e7ae961da53ec"}, + {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:48bac099586cf75ae5837b0ac17a674450d01f451f38afcb02acfc940110b60b"}, + {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:540fd5f62fe21f3d1d9efe8af5c4d9dbbb184ce03ce95acb0289500e46215dd2"}, + {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05ab59db0bb64e847972373c5cda8924e6605480f6b13cc04573fa0d87bfc637"}, + {file = "yarl-1.11.0-cp310-cp310-win32.whl", hash = "sha256:ddab47748933ac9cf5f29d6e9e2e2060cff40b2751d02c55129661ea4e577152"}, + {file = "yarl-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:976d02274e6d88b24c7131e7b26a083412b2592f2bbcef53d3b00b2508cad26c"}, + {file = "yarl-1.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:39e3087e1ef70862de81e22af9eb299faee580f41673ef92829949022791b521"}, + {file = "yarl-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7fd535cc41b81a566ad347081b671ab5c7e5f5b6a15526d85b4e748baf065cf0"}, + {file = "yarl-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f7cc02d8e9a612174869f4b983f159e87659096f7e2dc1fe9effd9902e408739"}, + {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f391ccf4b1b1e0ba4880075ba337d41a619a5350f67053927f67ebe764bf44"}, + {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c19a0d95943bb2c914b4e71043803be34bc75c08c4a6ca232bdc649a1e9ef1b"}, + {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ead4d89eade0e09b8ef97877664abb0e2e8704787db5564f83658fdee5c36497"}, + {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:195f7791bc23d5f2480efe53f935daf8a61661000dfbfbdd70dbd06397594fff"}, + {file = "yarl-1.11.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a7905e662665ca8e058635377522bc3c98bdb873be761ff42c86eb72b03914"}, + {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53c80b1927b75aed208d7fd965a3a705dc8c1db4d50b9112418fa0f7784363e6"}, + {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:11af21bbf807688d49b7d4915bb28cbc2e3aa028a2ee194738477eabcc413c65"}, + {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:732d56da00ea7a5da4f0d15adbbd22dcb37da7825510aafde40112e53f6baa52"}, + {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7bd54d79025b59d1dc5fb26a09734d6a9cc651a04bc381966ed264b28331a168"}, + {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aacd62ff67efd54cb18cea2aa7ae4fb83cfbca19a07055d4777266b70561defe"}, + {file = "yarl-1.11.0-cp311-cp311-win32.whl", hash = "sha256:68e14ae71e5b51c8282ae5db53ccb3baffc40e1551370a8a2361f1c1d8a0bf8c"}, + {file = "yarl-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:3ade2265716667b6bd4123d6f684b5f7cf4a8d83dcf1d5581ac44643466bb00a"}, + {file = "yarl-1.11.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6e73dab98e3c3b5441720153e72a5f28e717aac2d22f1ec4b08ef33417d9987e"}, + {file = "yarl-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4a0d090d296ced05edfe29c6ff34869412fa6a97d0928c12b00939c4842884cd"}, + {file = "yarl-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d29e446cfb0a82d3df7745968b9fa286665a9be8b4d68de46bcc32d917cb218e"}, + {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8dc0efcf8266ecfe057b95e01f43eb62516196a4bbf3918fd1dcb8d0dc0dff"}, + {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:202f5ec49ff163dcc767426deb55020a28078e61d6bbe1f80331d92bca53b236"}, + {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8055b0d78ce1cafa657c4b455e22661e8d3b2834de66a0753c3567da47fcc4aa"}, + {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60ed3c7f64e820959d7f682ec2f559b4f4df723dc09df619d269853a4214a4b4"}, + {file = "yarl-1.11.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2371510367d39d74997acfdcd1dead17938c79c99365482821627f7838a8eba0"}, + {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e24bb6a8be89ccc3ce8c47e8940fdfcb7429e9efbf65ce6fa3e7d122fcf0bcf0"}, + {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:18ec42da256cfcb9b4cd5d253e04c291f69911a5228d1438a7d431c15ba0ae40"}, + {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:418eeb8f228ea36c368bf6782ebd6016ecebfb1a8b90145ef6726ffcbba65ef8"}, + {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:07e8cfb1dd7669a129f8fd5df1da65efa73aea77582bde2a3a837412e2863543"}, + {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c458483711d393dad51340505c3fab3194748fd06bab311d2f8b5b7a7349e9a"}, + {file = "yarl-1.11.0-cp312-cp312-win32.whl", hash = "sha256:5b008c3127382503e7a1e12b4c3a3236e3dd833a4c62a066f4a0fbd650c655d2"}, + {file = "yarl-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc94be7472b9f88d7441340534a3ecae05c86ccfec7ba75ce5b6e4778b2bfc6e"}, + {file = "yarl-1.11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a45e51ba3777031e0b20c1e7ab59114ed4e1884b3c1db48962c1d8d08aefb418"}, + {file = "yarl-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:765128029218eade3a01187cdd7f375977cc827505ed31828196c8ae9b622928"}, + {file = "yarl-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2516e238daf0339c8ac4dfab9d7cda9afad652ff073517f200d653d5d8371f7e"}, + {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10be62bee117f05b1ad75a6c2538ca9e5367342dc8a4f3c206c87dadbc1189c"}, + {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50ceaeda771ee3e382291168c90c7ede62b63ecf3e181024bcfeb35c0ea6c84f"}, + {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a601c99fc20fd0eea84e7bc0dc9e7f196f55a0ded67242d724988c754295538"}, + {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42ff79371614764fc0a4ab8eaba9adb493bf9ad856e2a4664f6c754fc907a903"}, + {file = "yarl-1.11.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93fca4c9f88c17ead902b3f3285b2d039fc8f26d117e1441973ba64315109b54"}, + {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e7dddf5f41395c84fc59e0ed5493b24bfeb39fb04823e880b52c8c55085d4695"}, + {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ea501ea07e14ba6364ff2621bfc8b2381e5b1e10353927fa9a607057fd2b98e5"}, + {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a4f7e470f2c9c8b8774a5bda72adfb8e9dc4ec32311fe9bdaa4921e36cf6659b"}, + {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:361fdb3993431157302b7104d525092b5df4d7d346df5a5ffeee2d1ca8e0d15b"}, + {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e300eaf5e0329ad31b3d53e2f3d26b4b6dff1217207c6ab1d4212967b54b2185"}, + {file = "yarl-1.11.0-cp313-cp313-win32.whl", hash = "sha256:f1e2d4ce72e06e38a16da3e9c24a0520dbc19018a69ef6ed57b6b38527cb275c"}, + {file = "yarl-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:fa9de2f87be58f714a230bd1f3ef3aad1ed65c9931146e3fc55f85fcbe6bacc3"}, + {file = "yarl-1.11.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:24da0b38274727fe9266d09229987e7f0efdb97beb94c0bb2d327d65f112e78d"}, + {file = "yarl-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0310eb2e63872de66047e05ad9982f2e53ad6405dc42fa60d7cc670bf6ca8aa8"}, + {file = "yarl-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:52433604340a4ab3d1f32281c6eb9ad9b47c99435b4212f763121bf7348c8c00"}, + {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e2eb182d59f0845a79434003f94b4f61cd69465248f9388c2e5bf2191c9f7f"}, + {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3dd10f0fe0e0f659926c1da791de5bef05fd48974ad74618c9168e302e2b7cc"}, + {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:121d3798e4bb35a4321b2422cb887f80ea39f94bf52f0eb5cb2c168bb0043c9b"}, + {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8bbac56c80610dd659ace534765d7bcd2488f6600023f6984f35108b2b3f4f0"}, + {file = "yarl-1.11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79d420399f0e82e302236a762d8b8ceec89761ce3b30c83ac1d4d6e29f811444"}, + {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a726fb50588307dfe1d233b67535d493fb0bb157bdbfda6bb34e04189f2f57"}, + {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9057f5de2fade7440e6db358913bc7ae8de43ba72c83cf95420a1fc1a6c6b59e"}, + {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6471d747d0ac8059895e66d32ca8630c8db5b572ca7763150d0927eaa257df67"}, + {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d97cb22ad380850754fa16ef8d490d9340d8573d81f73429f3975e8e87db0586"}, + {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fe78dec8caeda1e7b353cbd8aa0cc5a5bc182b22998d64ec8fa9ee59c898ab3b"}, + {file = "yarl-1.11.0-cp38-cp38-win32.whl", hash = "sha256:7ff371002fbbb79613269d76a2932c99979dac15fac30107064ef70d25f35474"}, + {file = "yarl-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:4fa9d762eee63eed767895d68b994c58e29f809292a4d0fca483e9cc6fdc22c8"}, + {file = "yarl-1.11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4ae63bc65e5bf8843bd1eca46e75eaa9eb157e0312fb362123181512892daad8"}, + {file = "yarl-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d1bd3262e00043907e0a6d7d4f7b7a4815281acc25699a2384552870c79f1f0"}, + {file = "yarl-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c58656c2e0b41b5d325130b8da4f8e216aad10029e7de5c523a6be25faa9fe8"}, + {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9425c333575fce5e0fb414b766492c6ba4aa335ef910a7540dbdefe58a78232e"}, + {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dc66e2420e1e282105071934883bbb9c37c16901b5b8aa0a8aee370b477eac6"}, + {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2949067359d1ef5bf3228c7f1deb102c209832a13df5419239f99449bc1d3fa9"}, + {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c006fe73f851cf20b9986b3b4cc15239795bd5da9c3fda76bb3e043da5bec4ff"}, + {file = "yarl-1.11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:969ad4ee3892e893471b6572bbf2bbb091f93e7c81de25d6b3a5c0a5126e5ccb"}, + {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c9fbe9dc6ee8bfe1af34137e3add6f0e49799dd5467dd6af189d27616879161e"}, + {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69a45c711fea9b783b592a75f26f6dc59b2e4a923b97bf6eec357566fcb1d922"}, + {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1a29b82c42a7791ffe53ee6dfbf29acc61ea7ec05643dcacc50510ed6187b897"}, + {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ed0c090f00c3fc024f7b0799cab9dd7c419fcd8f1a00634d1f9952bab7e7bfb2"}, + {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:31df9d9b3fe6e15decee629fc7976a5fb21eaa39e290f60e57e1d422827194c6"}, + {file = "yarl-1.11.0-cp39-cp39-win32.whl", hash = "sha256:fcb7c36ba8b663a5900e6d40533f0e698ba0f38f744aad5410d4e38129e41a70"}, + {file = "yarl-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c6c0d640bad721834a737e25267fb71d296684ada21ca7d5ad2e63da7b73f1b7"}, + {file = "yarl-1.11.0-py3-none-any.whl", hash = "sha256:03717a6627e55934b2a1d9caf24f299b461a2e8d048a90920f42ad5c20ae1b82"}, + {file = "yarl-1.11.0.tar.gz", hash = "sha256:f86f4f4a57a29ef08fa70c4667d04c5e3ba513500da95586208b285437cb9592"}, ] [package.dependencies] @@ -7611,47 +7763,45 @@ reference = "aliyun" [[package]] name = "zope-interface" -version = "6.4.post2" +version = "7.0.3" description = "Interfaces for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zope.interface-6.4.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c"}, - {file = "zope.interface-6.4.post2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530"}, - {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341"}, - {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b"}, - {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9"}, - {file = "zope.interface-6.4.post2-cp310-cp310-win_amd64.whl", hash = "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7"}, - {file = "zope.interface-6.4.post2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede"}, - {file = "zope.interface-6.4.post2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827"}, - {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874"}, - {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e"}, - {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8"}, - {file = "zope.interface-6.4.post2-cp311-cp311-win_amd64.whl", hash = "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250"}, - {file = "zope.interface-6.4.post2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde"}, - {file = "zope.interface-6.4.post2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4"}, - {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b"}, - {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb"}, - {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854"}, - {file = "zope.interface-6.4.post2-cp312-cp312-win_amd64.whl", hash = "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7"}, - {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e"}, - {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e"}, - {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc"}, - {file = "zope.interface-6.4.post2-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1"}, - {file = "zope.interface-6.4.post2-cp37-cp37m-win_amd64.whl", hash = "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82"}, - {file = "zope.interface-6.4.post2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b"}, - {file = "zope.interface-6.4.post2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc"}, - {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934"}, - {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1"}, - {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43"}, - {file = "zope.interface-6.4.post2-cp38-cp38-win_amd64.whl", hash = "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5"}, - {file = "zope.interface-6.4.post2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2"}, - {file = "zope.interface-6.4.post2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438"}, - {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4"}, - {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79"}, - {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671"}, - {file = "zope.interface-6.4.post2-cp39-cp39-win_amd64.whl", hash = "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15"}, - {file = "zope.interface-6.4.post2.tar.gz", hash = "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e"}, + {file = "zope.interface-7.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b9369671a20b8d039b8e5a1a33abd12e089e319a3383b4cc0bf5c67bd05fe7b"}, + {file = "zope.interface-7.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db6237e8fa91ea4f34d7e2d16d74741187e9105a63bbb5686c61fea04cdbacca"}, + {file = "zope.interface-7.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53d678bb1c3b784edbfb0adeebfeea6bf479f54da082854406a8f295d36f8386"}, + {file = "zope.interface-7.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3aa8fcbb0d3c2be1bfd013a0f0acd636f6ed570c287743ae2bbd467ee967154d"}, + {file = "zope.interface-7.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6195c3c03fef9f87c0dbee0b3b6451df6e056322463cf35bca9a088e564a3c58"}, + {file = "zope.interface-7.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:11fa1382c3efb34abf16becff8cb214b0b2e3144057c90611621f2d186b7e1b7"}, + {file = "zope.interface-7.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:af94e429f9d57b36e71ef4e6865182090648aada0cb2d397ae2b3f7fc478493a"}, + {file = "zope.interface-7.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dd647fcd765030638577fe6984284e0ebba1a1008244c8a38824be096e37fe3"}, + {file = "zope.interface-7.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bee1b722077d08721005e8da493ef3adf0b7908e0cd85cc7dc836ac117d6f32"}, + {file = "zope.interface-7.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2545d6d7aac425d528cd9bf0d9e55fcd47ab7fd15f41a64b1c4bf4c6b24946dc"}, + {file = "zope.interface-7.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d04b11ea47c9c369d66340dbe51e9031df2a0de97d68f442305ed7625ad6493"}, + {file = "zope.interface-7.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:064ade95cb54c840647205987c7b557f75d2b2f7d1a84bfab4cf81822ef6e7d1"}, + {file = "zope.interface-7.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3fcdc76d0cde1c09c37b7c6b0f8beba2d857d8417b055d4f47df9c34ec518bdd"}, + {file = "zope.interface-7.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3d4b91821305c8d8f6e6207639abcbdaf186db682e521af7855d0bea3047c8ca"}, + {file = "zope.interface-7.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35062d93bc49bd9b191331c897a96155ffdad10744ab812485b6bad5b588d7e4"}, + {file = "zope.interface-7.0.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c96b3e6b0d4f6ddfec4e947130ec30bd2c7b19db6aa633777e46c8eecf1d6afd"}, + {file = "zope.interface-7.0.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0c151a6c204f3830237c59ee4770cc346868a7a1af6925e5e38650141a7f05"}, + {file = "zope.interface-7.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:3de1d553ce72868b77a7e9d598c9bff6d3816ad2b4cc81c04f9d8914603814f3"}, + {file = "zope.interface-7.0.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab985c566a99cc5f73bc2741d93f1ed24a2cc9da3890144d37b9582965aff996"}, + {file = "zope.interface-7.0.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d976fa7b5faf5396eb18ce6c132c98e05504b52b60784e3401f4ef0b2e66709b"}, + {file = "zope.interface-7.0.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a207c6b2c58def5011768140861a73f5240f4f39800625072ba84e76c9da0b"}, + {file = "zope.interface-7.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:382d31d1e68877061daaa6499468e9eb38eb7625d4369b1615ac08d3860fe896"}, + {file = "zope.interface-7.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c4316a30e216f51acbd9fb318aa5af2e362b716596d82cbb92f9101c8f8d2e7"}, + {file = "zope.interface-7.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d"}, + {file = "zope.interface-7.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799ef7a444aebbad5a145c3b34bff012b54453cddbde3332d47ca07225792ea4"}, + {file = "zope.interface-7.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3b7ce6d46fb0e60897d62d1ff370790ce50a57d40a651db91a3dde74f73b738"}, + {file = "zope.interface-7.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:f418c88f09c3ba159b95a9d1cfcdbe58f208443abb1f3109f4b9b12fd60b187c"}, + {file = "zope.interface-7.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:84f8794bd59ca7d09d8fce43ae1b571be22f52748169d01a13d3ece8394d8b5b"}, + {file = "zope.interface-7.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7d92920416f31786bc1b2f34cc4fc4263a35a407425319572cbf96b51e835cd3"}, + {file = "zope.interface-7.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95e5913ec718010dc0e7c215d79a9683b4990e7026828eedfda5268e74e73e11"}, + {file = "zope.interface-7.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1eeeb92cb7d95c45e726e3c1afe7707919370addae7ed14f614e22217a536958"}, + {file = "zope.interface-7.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd32f30f40bfd8511b17666895831a51b532e93fc106bfa97f366589d3e4e0e"}, + {file = "zope.interface-7.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:5112c530fa8aa2108a3196b9c2f078f5738c1c37cfc716970edc0df0414acda8"}, + {file = "zope.interface-7.0.3.tar.gz", hash = "sha256:cd2690d4b08ec9eaf47a85914fe513062b20da78d10d6d789a792c0b20307fb1"}, ] [package.dependencies] @@ -7670,4 +7820,4 @@ reference = "aliyun" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "9acfafd75bf7dbb7e0dffb54b7f11f6b09aa4ceff769d193a3906d03ae796ccc" +content-hash = "25567e8ab7b2b79ec750b4a2fa4f147fad22ceba4fcf565ce3dc41884c65b7a8" diff --git a/pyproject.toml b/pyproject.toml index 9b2047f6c..818f0f183 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,8 @@ ansible-runner = { url = "https://github.com/jumpserver-dev/ansible-runner/archi asn1crypto = "1.5.1" bcrypt = "4.0.1" billiard = "4.1.0" +aiohttp = "3.10.5" +aiohappyeyeballs = "2.4.0" # certifi = "2023.7.22" # cffi = "1.15.1" chardet = "5.1.0" @@ -33,7 +35,7 @@ decorator = "5.1.1" docutils = "0.20.1" ecdsa = "0.18.0" enum-compat = "0.0.3" -ephem = "4.1.4" +ephem = "4.1.5" future = "0.18.3" # idna = "3.4" itypes = "1.2.0" @@ -127,7 +129,7 @@ boto3 = "1.28.9" botocore = "1.31.9" s3transfer = "0.6.1" mysqlclient = "2.2.4" -pymssql = "2.2.8" +pymssql = "2.3.1" django-redis = "5.3.0" python-redis-lock = "4.0.0" pyopenssl = "23.2.0" From 0d833a966c611b9c0cccf545e3dca3d45004cfd6 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Mon, 9 Sep 2024 14:15:16 +0800 Subject: [PATCH 34/98] perf: Translate --- apps/i18n/core/en/LC_MESSAGES/django.po | 169 ++-- apps/i18n/core/ja/LC_MESSAGES/django.po | 995 +++++++------------ apps/i18n/core/zh/LC_MESSAGES/django.po | 143 +-- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 671 ++++++------- apps/i18n/koko/en.json | 12 +- apps/i18n/koko/ja.json | 19 +- apps/i18n/koko/zh.json | 12 +- apps/i18n/koko/zh_hant.json | 19 +- apps/i18n/lina/ja.json | 23 +- apps/i18n/lina/zh.json | 4 +- apps/i18n/lina/zh_hant.json | 22 +- apps/i18n/luna/en.json | 2 +- apps/i18n/luna/ja.json | 2 +- apps/i18n/luna/zh.json | 2 +- apps/i18n/luna/zh_hant.json | 2 +- 15 files changed, 929 insertions(+), 1168 deletions(-) diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index 7b49ffcde..f02e084f0 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-30 15:08+0800\n" +"POT-Creation-Date: 2024-09-09 14:08+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -145,7 +145,7 @@ msgid "Access key" msgstr "" #: accounts/const/account.py:9 authentication/backends/passkey/models.py:16 -#: authentication/models/sso_token.py:14 settings/serializers/feature.py:52 +#: authentication/models/sso_token.py:14 settings/serializers/feature.py:55 msgid "Token" msgstr "" @@ -315,7 +315,7 @@ msgstr "" msgid "Database" msgstr "" -#: accounts/const/vault.py:9 settings/serializers/feature.py:43 +#: accounts/const/vault.py:9 settings/serializers/feature.py:46 msgid "HCP Vault" msgstr "" @@ -461,7 +461,7 @@ msgstr "" #: assets/models/automations/base.py:115 audits/models.py:65 #: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:242 #: ops/templates/ops/celery_task_log.html:101 -#: perms/models/asset_permission.py:78 +#: perms/models/asset_permission.py:78 settings/serializers/feature.py:25 #: settings/templates/ldap/_msg_import_ldap_user.html:5 #: terminal/models/applet/host.py:141 terminal/models/session/session.py:45 #: tickets/models/ticket/apply_application.py:30 @@ -712,7 +712,7 @@ msgstr "" #: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 -#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183 +#: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 #: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 @@ -847,7 +847,7 @@ msgstr "" #: assets/models/platform.py:95 assets/serializers/asset/common.py:125 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 -#: settings/models.py:36 tickets/models/ticket/apply_application.py:13 +#: settings/models.py:37 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" msgstr "" @@ -1029,7 +1029,7 @@ msgstr "" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 #: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 #: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:39 terminal/models/applet/applet.py:46 +#: settings/models.py:40 terminal/models/applet/applet.py:46 #: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 #: terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 @@ -1125,7 +1125,15 @@ msgstr "" #: accounts/tasks/automation.py:87 msgid "Clean change secret and push record period description" -msgstr "The system will periodically clean up unnecessary change secret records and push records, including those associated with change tasks, execution records, assets, and accounts. When any of these associated items are deleted, the corresponding change secret and push records become invalid. Therefore, to maintain a tidy and efficient database, the system automatically cleans up these invalid records every 180 days by default. This regular cleanup process helps free up storage space and improves the security and overall performance of data management." +msgstr "" +"The system will periodically clean up unnecessary change secret records and " +"push records, including those associated with change tasks, execution " +"records, assets, and accounts. When any of these associated items are " +"deleted, the corresponding change secret and push records become invalid. " +"Therefore, to maintain a tidy and efficient database, the system " +"automatically cleans up these invalid records every 180 days by default. " +"This regular cleanup process helps free up storage space and improves the " +"security and overall performance of data management." #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" @@ -1225,6 +1233,10 @@ msgstr "" msgid "Notify" msgstr "" +#: acls/const.py:11 +msgid "Notify and warn" +msgstr "" + #: acls/models/base.py:37 assets/models/cmd_filter.py:76 #: terminal/models/component/endpoint.py:112 xpack/plugins/cloud/models.py:314 msgid "Priority" @@ -1280,7 +1292,7 @@ msgid "Regex" msgstr "" #: acls/models/command_acl.py:26 assets/models/cmd_filter.py:79 -#: settings/models.py:184 settings/serializers/feature.py:19 +#: settings/models.py:185 settings/serializers/feature.py:20 #: settings/serializers/msg.py:78 xpack/plugins/license/models.py:30 msgid "Content" msgstr "" @@ -1578,7 +1590,7 @@ msgstr "" #: assets/const/category.py:10 assets/models/asset/host.py:8 #: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:76 -#: settings/serializers/feature.py:49 settings/serializers/msg.py:30 +#: settings/serializers/feature.py:52 settings/serializers/msg.py:30 #: terminal/models/component/endpoint.py:13 terminal/serializers/applet.py:17 #: xpack/plugins/cloud/manager.py:83 #: xpack/plugins/cloud/serializers/account_attrs.py:72 @@ -1870,7 +1882,7 @@ msgstr "" msgid "Allow invalid cert" msgstr "" -#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:89 +#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:92 msgid "Proxy" msgstr "" @@ -1972,7 +1984,7 @@ msgstr "" #: assets/serializers/cagegory.py:24 #: authentication/models/connection_token.py:29 #: authentication/serializers/connect_token_secret.py:125 -#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:35 +#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:36 #: users/models/preference.py:13 msgid "Value" msgstr "" @@ -2047,7 +2059,7 @@ msgid "Setting" msgstr "" #: assets/models/platform.py:38 audits/const.py:59 -#: authentication/backends/passkey/models.py:11 settings/models.py:38 +#: authentication/backends/passkey/models.py:11 settings/models.py:39 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "" @@ -2567,7 +2579,7 @@ msgstr "" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:69 +#: terminal/serializers/session.py:78 msgid "Terminal" msgstr "" @@ -2912,6 +2924,14 @@ msgstr "" msgid "Invalid token or cache refreshed." msgstr "" +#: authentication/backends/oidc/views.py:174 +msgid "OpenID Error" +msgstr "" + +#: authentication/backends/oidc/views.py:175 +msgid "Please check if a user with the same username or email already exists" +msgstr "" + #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" msgstr "" @@ -4378,7 +4398,7 @@ msgstr "" msgid "VCS" msgstr "" -#: ops/const.py:38 ops/models/adhoc.py:44 settings/serializers/feature.py:120 +#: ops/const.py:38 ops/models/adhoc.py:44 settings/serializers/feature.py:123 msgid "Adhoc" msgstr "" @@ -4759,7 +4779,7 @@ msgstr "" msgid "SYSTEM" msgstr "" -#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:185 +#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:186 #: terminal/models/applet/applet.py:42 msgid "Builtin" msgstr "Builtin" @@ -4882,7 +4902,7 @@ msgid "today" msgstr "" #: perms/notifications.py:12 perms/notifications.py:44 -#: settings/serializers/feature.py:111 +#: settings/serializers/feature.py:114 msgid "day" msgstr "" @@ -5071,7 +5091,7 @@ msgstr "Workbench" msgid "Audit view" msgstr "Audits" -#: rbac/tree.py:27 settings/models.py:161 +#: rbac/tree.py:27 settings/models.py:162 msgid "System setting" msgstr "" @@ -5099,7 +5119,7 @@ msgstr "" msgid "App ops" msgstr "Ops" -#: rbac/tree.py:57 settings/serializers/feature.py:117 +#: rbac/tree.py:57 settings/serializers/feature.py:120 msgid "Feature" msgstr "" @@ -5134,8 +5154,8 @@ msgstr "Organizations" msgid "Ticket comment" msgstr "" -#: rbac/tree.py:159 settings/serializers/feature.py:98 -#: settings/serializers/feature.py:100 tickets/models/ticket/general.py:308 +#: rbac/tree.py:159 settings/serializers/feature.py:101 +#: settings/serializers/feature.py:103 tickets/models/ticket/general.py:308 msgid "Ticket" msgstr "" @@ -5182,75 +5202,75 @@ msgstr "" msgid "App Settings" msgstr "Settings" -#: settings/models.py:37 users/models/preference.py:14 +#: settings/models.py:38 users/models/preference.py:14 msgid "Encrypted" msgstr "" -#: settings/models.py:163 +#: settings/models.py:164 msgid "Can change email setting" msgstr "" -#: settings/models.py:164 +#: settings/models.py:165 msgid "Can change auth setting" msgstr "" -#: settings/models.py:165 +#: settings/models.py:166 msgid "Can change auth ops" msgstr "" -#: settings/models.py:166 +#: settings/models.py:167 msgid "Can change auth ticket" msgstr "" -#: settings/models.py:167 +#: settings/models.py:168 msgid "Can change virtual app setting" msgstr "" -#: settings/models.py:168 +#: settings/models.py:169 msgid "Can change auth announcement" msgstr "" -#: settings/models.py:169 +#: settings/models.py:170 msgid "Can change vault setting" msgstr "" -#: settings/models.py:170 +#: settings/models.py:171 msgid "Can change chat ai setting" msgstr "" -#: settings/models.py:171 +#: settings/models.py:172 msgid "Can change system msg sub setting" msgstr "" -#: settings/models.py:172 +#: settings/models.py:173 msgid "Can change sms setting" msgstr "" -#: settings/models.py:173 +#: settings/models.py:174 msgid "Can change security setting" msgstr "" -#: settings/models.py:174 +#: settings/models.py:175 msgid "Can change clean setting" msgstr "" -#: settings/models.py:175 +#: settings/models.py:176 msgid "Can change interface setting" msgstr "" -#: settings/models.py:176 +#: settings/models.py:177 msgid "Can change license setting" msgstr "" -#: settings/models.py:177 +#: settings/models.py:178 msgid "Can change terminal setting" msgstr "" -#: settings/models.py:178 +#: settings/models.py:179 msgid "Can change other setting" msgstr "" -#: settings/models.py:188 +#: settings/models.py:189 msgid "Chat prompt" msgstr "" @@ -5916,32 +5936,38 @@ msgstr "" msgid "Change secret and push record retention days (day)" msgstr "" -#: settings/serializers/feature.py:18 settings/serializers/msg.py:68 +#: settings/serializers/feature.py:19 settings/serializers/msg.py:68 msgid "Subject" msgstr "" -#: settings/serializers/feature.py:22 +#: settings/serializers/feature.py:23 msgid "More Link" msgstr "" -#: settings/serializers/feature.py:36 settings/serializers/feature.py:38 -#: settings/serializers/feature.py:39 +#: settings/serializers/feature.py:26 +#: settings/templates/ldap/_msg_import_ldap_user.html:6 +#: terminal/models/session/session.py:46 +msgid "Date end" +msgstr "" + +#: settings/serializers/feature.py:39 settings/serializers/feature.py:41 +#: settings/serializers/feature.py:42 msgid "Announcement" msgstr "" -#: settings/serializers/feature.py:46 +#: settings/serializers/feature.py:49 msgid "Vault" msgstr "" -#: settings/serializers/feature.py:55 +#: settings/serializers/feature.py:58 msgid "Mount Point" msgstr "" -#: settings/serializers/feature.py:61 +#: settings/serializers/feature.py:64 msgid "Record limit" msgstr "" -#: settings/serializers/feature.py:63 +#: settings/serializers/feature.py:66 msgid "" "If the specific value is less than 999 (default), the system will " "automatically perform a task every night: check and delete historical " @@ -5949,74 +5975,74 @@ msgid "" "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -#: settings/serializers/feature.py:73 settings/serializers/feature.py:79 +#: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" msgstr "" -#: settings/serializers/feature.py:82 +#: settings/serializers/feature.py:85 msgid "GPT Base URL" msgstr "" -#: settings/serializers/feature.py:83 +#: settings/serializers/feature.py:86 msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "" -#: settings/serializers/feature.py:86 templates/_header_bar.html:96 +#: settings/serializers/feature.py:89 templates/_header_bar.html:96 msgid "API Key" msgstr "" -#: settings/serializers/feature.py:90 +#: settings/serializers/feature.py:93 msgid "" "The proxy server address of the GPT service. For example: http://ip:port" msgstr "" -#: settings/serializers/feature.py:93 +#: settings/serializers/feature.py:96 msgid "GPT Model" msgstr "" -#: settings/serializers/feature.py:102 +#: settings/serializers/feature.py:105 msgid "Approval without login" msgstr "" -#: settings/serializers/feature.py:103 +#: settings/serializers/feature.py:106 msgid "Allow direct approval ticket without login" msgstr "" -#: settings/serializers/feature.py:107 +#: settings/serializers/feature.py:110 msgid "Period" msgstr "" -#: settings/serializers/feature.py:108 +#: settings/serializers/feature.py:111 msgid "" "The default authorization time period when applying for assets via a ticket" msgstr "" -#: settings/serializers/feature.py:111 +#: settings/serializers/feature.py:114 msgid "hour" msgstr "" -#: settings/serializers/feature.py:112 +#: settings/serializers/feature.py:115 msgid "Unit" msgstr "" -#: settings/serializers/feature.py:112 +#: settings/serializers/feature.py:115 msgid "The unit of period" msgstr "" -#: settings/serializers/feature.py:121 +#: settings/serializers/feature.py:124 msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" msgstr "" -#: settings/serializers/feature.py:125 +#: settings/serializers/feature.py:128 msgid "Command blacklist" msgstr "" -#: settings/serializers/feature.py:126 +#: settings/serializers/feature.py:129 msgid "Command blacklist in Adhoc" msgstr "" -#: settings/serializers/feature.py:131 +#: settings/serializers/feature.py:134 #: terminal/models/virtualapp/provider.py:17 #: terminal/models/virtualapp/virtualapp.py:36 #: terminal/models/virtualapp/virtualapp.py:97 @@ -6024,11 +6050,11 @@ msgstr "" msgid "Virtual app" msgstr "" -#: settings/serializers/feature.py:134 +#: settings/serializers/feature.py:137 msgid "Virtual App" msgstr "" -#: settings/serializers/feature.py:136 +#: settings/serializers/feature.py:139 msgid "" "Virtual applications, you can use the Linux operating system as an " "application server in remote applications." @@ -6460,11 +6486,6 @@ msgstr "" msgid "Sync task finish" msgstr "" -#: settings/templates/ldap/_msg_import_ldap_user.html:6 -#: terminal/models/session/session.py:46 -msgid "Date end" -msgstr "" - #: settings/templates/ldap/_msg_import_ldap_user.html:9 msgid "Synced Organization" msgstr "" @@ -7180,7 +7201,7 @@ msgstr "" msgid "Replay" msgstr "" -#: terminal/models/session/session.py:48 terminal/serializers/session.py:68 +#: terminal/models/session/session.py:48 terminal/serializers/session.py:77 msgid "Command amount" msgstr "" @@ -8545,14 +8566,14 @@ msgstr "" msgid "name not unique" msgstr "" -#: users/signal_handlers.py:39 +#: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" " and the current user is not in the user list. Please contact the " "administrator." msgstr "" -#: users/signal_handlers.py:183 +#: users/signal_handlers.py:193 msgid "Clean up expired user sessions" msgstr "" diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 2122b2a80..fb630ffe5 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-09-09 14:08+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -145,7 +145,7 @@ msgid "Access key" msgstr "アクセスキー" #: accounts/const/account.py:9 authentication/backends/passkey/models.py:16 -#: authentication/models/sso_token.py:14 settings/serializers/feature.py:52 +#: authentication/models/sso_token.py:14 settings/serializers/feature.py:55 msgid "Token" msgstr "トークン" @@ -187,7 +187,8 @@ msgstr "集めました" msgid "Template" msgstr "テンプレート" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "スキップ" @@ -315,7 +316,7 @@ msgstr "未定" msgid "Database" msgstr "データベース" -#: accounts/const/vault.py:9 settings/serializers/feature.py:43 +#: accounts/const/vault.py:9 settings/serializers/feature.py:46 msgid "HCP Vault" msgstr "HashiCorp Vault" @@ -390,8 +391,8 @@ msgstr "ソース ID" #: assets/serializers/gateway.py:28 audits/models.py:59 #: authentication/api/connection_token.py:411 ops/models/base.py:18 #: perms/models/asset_permission.py:75 settings/serializers/msg.py:33 -#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 -#: terminal/serializers/command.py:72 +#: terminal/backends/command/models.py:18 +#: terminal/models/session/session.py:34 terminal/serializers/command.py:72 #: terminal/templates/terminal/_msg_command_warning.html:8 #: terminal/templates/terminal/_msg_session_sharing.html:8 #: tickets/models/ticket/command_confirm.py:13 @@ -461,7 +462,7 @@ msgstr "アカウントバックアップ計画" #: assets/models/automations/base.py:115 audits/models.py:65 #: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:242 #: ops/templates/ops/celery_task_log.html:101 -#: perms/models/asset_permission.py:78 +#: perms/models/asset_permission.py:78 settings/serializers/feature.py:25 #: settings/templates/ldap/_msg_import_ldap_user.html:5 #: terminal/models/applet/host.py:141 terminal/models/session/session.py:45 #: tickets/models/ticket/apply_application.py:30 @@ -712,11 +713,13 @@ msgstr "パスワードルール" #: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 -#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183 +#: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:85 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -777,8 +780,7 @@ msgstr "ユーザーと同じユーザー名" #: accounts/models/virtual.py:37 msgid "Non-asset account, Input username/password on connect" -msgstr "" -"アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" +msgstr "アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" #: accounts/models/virtual.py:38 msgid "The account username name same with user on connect" @@ -788,9 +790,7 @@ msgstr "接続時にユーザー名と同じユーザー名を使用します" msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "" -"ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタ" -"イプのアセットのみをサポートします" +msgstr "ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタイプのアセットのみをサポートします" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -800,9 +800,7 @@ msgstr "アカウントバックアップルートタスクの結果の通知" msgid "" "{} - The account backup passage task has been completed. See the attachment " "for details" -msgstr "" -"{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご" -"覧ください" +msgstr "{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご覧ください" #: accounts/notifications.py:25 msgid "" @@ -810,9 +808,8 @@ msgid "" "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" msgstr "" -"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定" -"されていません-個人情報にアクセスしてください-> プリファレンス設定の基本的な" -"ファイル暗号化パスワードの設定" +"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> " +"プリファレンス設定の基本的なファイル暗号化パスワードの設定" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -830,8 +827,7 @@ msgid "" "has not been set - please go to personal information -> set encryption " "password in preferences" msgstr "" -"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人" -"情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" +"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -857,7 +853,7 @@ msgstr "アカウントの存在ポリシー" #: assets/models/platform.py:95 assets/serializers/asset/common.py:125 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 -#: settings/models.py:36 tickets/models/ticket/apply_application.py:13 +#: settings/models.py:37 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" msgstr "カテゴリ" @@ -869,9 +865,9 @@ msgstr "カテゴリ" #: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: authentication/serializers/connect_token_secret.py:126 +#: ops/models/job.py:150 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -943,9 +939,10 @@ msgstr "ID" #: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 -#: audits/models.py:90 audits/models.py:172 audits/models.py:271 -#: audits/serializers.py:171 authentication/models/connection_token.py:32 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:54 audits/models.py:90 audits/models.py:172 +#: audits/models.py:271 audits/serializers.py:171 +#: authentication/models/connection_token.py:32 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 @@ -995,8 +992,7 @@ msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." msgstr "" -"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの" -"場合は、`username@domain`のようになります。" +"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの場合は、`username@domain`のようになります。" #: accounts/serializers/account/template.py:13 msgid "Password length" @@ -1039,11 +1035,11 @@ msgid "" msgstr "关联平台,可以配置推送参数,如果不关联,则使用默认参数" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 -#: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:39 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:25 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:26 ops/models/job.py:158 ops/models/playbook.py:31 +#: rbac/models/role.py:37 settings/models.py:40 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:332 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 @@ -1058,14 +1054,13 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: " -"資産シークレット内の同じアカウント > ログインシークレット > 手動入力.
" -"セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定して" -"ください。 " +"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: 資産シークレット内の同じアカウント > ログインシークレット > " +"手動入力.
セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定してください。 " #: accounts/serializers/automations/base.py:23 #: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 -#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 +#: assets/serializers/automations/base.py:21 +#: perms/serializers/permission.py:36 msgid "Nodes" msgstr "ノード" @@ -1095,8 +1090,7 @@ msgstr "アカウントのユーザー名を入力してください" msgid "" "Secret parameter settings, currently only effective for assets of the host " "type." -msgstr "" -"パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" +msgstr "パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" #: accounts/serializers/automations/change_secret.py:84 msgid "* Please enter the correct password length" @@ -1141,14 +1135,11 @@ msgstr "パスワード変更記録とプッシュ記録を定期的にクリア #: accounts/tasks/automation.py:87 msgid "Clean change secret and push record period description" msgstr "" -"システムは、変更タスク、実行レコード、資産、アカウントに関連するものを含め、" -"不要な変更シークレット レコードとプッシュ レコードを定期的にクリーンアップし" -"ます。これらの関連項目のいずれかが削除されると、対応する変更シークレット レ" -"コードとプッシュ レコードは無効になります。したがって、整然とした効率的なデー" -"タベースを維持するために、システムはデフォルトでこれらの無効なレコードを 180 " -"日ごとに自動的にクリーンアップします。この定期的なクリーンアップ プロセスによ" -"り、ストレージ領域が解放され、データ管理のセキュリティと全体的なパフォーマン" -"スが向上します。" +"システムは、変更タスク、実行レコード、資産、アカウントに関連するものを含め、不要な変更シークレット レコードとプッシュ " +"レコードを定期的にクリーンアップします。これらの関連項目のいずれかが削除されると、対応する変更シークレット レコードとプッシュ " +"レコードは無効になります。したがって、整然とした効率的なデータベースを維持するために、システムはデフォルトでこれらの無効なレコードを 180 " +"日ごとに自動的にクリーンアップします。この定期的なクリーンアップ " +"プロセスにより、ストレージ領域が解放され、データ管理のセキュリティと全体的なパフォーマンスが向上します。" #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" @@ -1211,16 +1202,13 @@ msgstr "尊敬する" msgid "" "Hello! The following is the failure of changing the password of your assets " "or pushing the account. Please check and handle it in time." -msgstr "" -"こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとお" -"りです。 時間内に確認して対処してください。" +msgstr "こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとおりです。 時間内に確認して対処してください。" #: accounts/utils.py:52 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." -msgstr "" -"パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." +msgstr "パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" #: accounts/utils.py:59 msgid "private key invalid or passphrase error" @@ -1251,6 +1239,10 @@ msgstr "警告" msgid "Notify" msgstr "通知する" +#: acls/const.py:11 +msgid "Notify and warn" +msgstr "プロンプトと警告" + #: acls/models/base.py:37 assets/models/cmd_filter.py:76 #: terminal/models/component/endpoint.py:112 xpack/plugins/cloud/models.py:314 msgid "Priority" @@ -1306,7 +1298,7 @@ msgid "Regex" msgstr "正規情報" #: acls/models/command_acl.py:26 assets/models/cmd_filter.py:79 -#: settings/models.py:184 settings/serializers/feature.py:19 +#: settings/models.py:185 settings/serializers/feature.py:20 #: settings/serializers/msg.py:78 xpack/plugins/license/models.py:30 msgid "Content" msgstr "コンテンツ" @@ -1386,9 +1378,9 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" -"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64 (ドメイン名サ" -"ポート)" +"* はすべて一致することを示します。例: " +"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64" +" (ドメイン名サポート)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1416,8 +1408,8 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" -"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" +"* はすべて一致することを示します。例: " +"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 @@ -1457,9 +1449,7 @@ msgid "" "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." msgstr "" -"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してくださ" -"い。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必" -"要な措置を講じてください。" +"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してください。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必要な措置を講じてください。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -1488,9 +1478,7 @@ msgstr "ユーザーエージェント" #: assets/api/asset/asset.py:181 msgid "Cannot create asset directly, you should create a host or other" -msgstr "" -"資産を直接作成することはできません。ホストまたはその他を作成する必要がありま" -"す" +msgstr "資産を直接作成することはできません。ホストまたはその他を作成する必要があります" #: assets/api/asset/asset.py:185 msgid "The number of assets exceeds the limit of 5000" @@ -1582,7 +1570,7 @@ msgstr "不明" #: assets/const/automation.py:7 msgid "OK" -msgstr "" +msgstr "成功" #: assets/const/automation.py:12 msgid "Ping" @@ -1614,7 +1602,7 @@ msgstr "脚本" #: assets/const/category.py:10 assets/models/asset/host.py:8 #: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:76 -#: settings/serializers/feature.py:49 settings/serializers/msg.py:30 +#: settings/serializers/feature.py:52 settings/serializers/msg.py:30 #: terminal/models/component/endpoint.py:13 terminal/serializers/applet.py:17 #: xpack/plugins/cloud/manager.py:83 #: xpack/plugins/cloud/serializers/account_attrs.py:72 @@ -1696,9 +1684,7 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントの" -"ユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}" -"ユーザーのユーザー名" +"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントのユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}ユーザーのユーザー名" #: assets/const/protocol.py:75 msgid "Console" @@ -1719,20 +1705,17 @@ msgstr "セキュリティ" #: assets/const/protocol.py:83 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされて" -"いるセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します" -"
RDP
レガシーRDP暗号化。このモードは、通常、古い Windowsサーバーや標準" -"のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装され" -"たRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名と" -"パスワードを提供する必要があります
" +"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされているセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します
RDP
レガシーRDP暗号化。このモードは、通常、古い" +" " +"Windowsサーバーや標準のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装されたRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名とパスワードを提供する必要があります
" #: assets/const/protocol.py:100 msgid "AD domain" @@ -1808,9 +1791,7 @@ msgstr "安全モード" msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "" -"安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへ" -"のアクセスなど、一部の操作が無効になります" +msgstr "安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへのアクセスなど、一部の操作が無効になります" #: assets/const/protocol.py:269 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -1917,7 +1898,7 @@ msgstr "クライアントキー" msgid "Allow invalid cert" msgstr "証明書チェックを無視" -#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:89 +#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:92 msgid "Proxy" msgstr "プロキシー" @@ -2019,7 +2000,7 @@ msgstr "システム" #: assets/serializers/cagegory.py:24 #: authentication/models/connection_token.py:29 #: authentication/serializers/connect_token_secret.py:125 -#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:35 +#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:36 #: users/models/preference.py:13 msgid "Value" msgstr "値" @@ -2094,7 +2075,7 @@ msgid "Setting" msgstr "設定" #: assets/models/platform.py:38 audits/const.py:59 -#: authentication/backends/passkey/models.py:11 settings/models.py:38 +#: authentication/backends/passkey/models.py:11 settings/models.py:39 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "有効化" @@ -2214,9 +2195,7 @@ msgstr "%(value)s は偶数ではありません" msgid "" "Batch update platform in assets, skipping assets that do not meet platform " "type" -msgstr "" -"プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プ" -"ラットフォーム" +msgstr "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プラットフォーム" #: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 @@ -2259,11 +2238,10 @@ msgstr "デフォルト・データベース" #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" msgstr "" -"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要" -"があります。例: http(s)://host:port" +"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要があります。例: http(s)://host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2335,9 +2313,7 @@ msgstr "タイプ" msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." -msgstr "" -"ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続す" -"る際には、接続はゲートウェイを通してルーティングされます。" +msgstr "ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続する際には、接続はゲートウェイを通してルーティングされます。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 #: orgs/serializers.py:13 perms/serializers/permission.py:39 @@ -2404,9 +2380,7 @@ msgstr "アドレスからのポート" msgid "" "This protocol is primary, and it must be set when adding assets. " "Additionally, there can only be one primary protocol." -msgstr "" -"このプロトコルはプライマリであり、資産を追加するときに設定する必要がありま" -"す。また、プライマリプロトコルは1つしかありません" +msgstr "このプロトコルはプライマリであり、資産を追加するときに設定する必要があります。また、プライマリプロトコルは1つしかありません" #: assets/serializers/platform.py:102 msgid "This protocol is required, and it must be set when adding assets." @@ -2416,14 +2390,11 @@ msgstr "このプロトコルは必須であり、資産を追加するときに msgid "" "This protocol is default, when adding assets, it will be displayed by " "default." -msgstr "" -"このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されま" -"す" +msgstr "このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されます" #: assets/serializers/platform.py:108 msgid "This protocol is public, asset will show this protocol to user" -msgstr "" -"このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" +msgstr "このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" #: assets/serializers/platform.py:157 msgid "Help text" @@ -2443,9 +2414,8 @@ msgid "" "another, similar to logging in with a regular account and then switching to " "root" msgstr "" -"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに" -"切り替えます。これは、通常のアカウントでログインした後に root に切り替えるの" -"と似ています" +"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに切り替えます。これは、通常のアカウントでログインした後に root " +"に切り替えるのと似ています" #: assets/serializers/platform.py:205 msgid "Assets can be connected using a zone gateway" @@ -2493,10 +2463,9 @@ msgstr "ノード下のアセット数を確認する" #: assets/tasks/nodes_amount.py:28 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" -msgstr "" -"セルフチェックのタスクはすでに実行されており、繰り返し開始することはできませ" -"ん" +"The task of self-checking is already running and cannot be started " +"repeatedly" +msgstr "セルフチェックのタスクはすでに実行されており、繰り返し開始することはできません" #: assets/tasks/nodes_amount.py:33 msgid "Periodic check the amount of assets under the node" @@ -2536,7 +2505,8 @@ msgid "App Audits" msgstr "監査" #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "文章の内容が長すぎる。Elasticsearchで操作履歴を保存する" #: audits/backends/db.py:108 @@ -2629,8 +2599,8 @@ msgstr "終了" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:78 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:55 terminal/serializers/session.py:78 msgid "Terminal" msgstr "ターミナル" @@ -2669,7 +2639,8 @@ msgid "Job audit log" msgstr "ジョブ監査ログ" #: audits/models.py:56 audits/models.py:100 audits/models.py:175 -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:113 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:113 msgid "Remote addr" msgstr "リモートaddr" @@ -2899,9 +2870,7 @@ msgstr "この操作には、MFAを検証する必要があります" #: authentication/api/connection_token.py:265 msgid "Reusable connection token is not allowed, global setting not enabled" -msgstr "" -"再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効に" -"なっていません" +msgstr "再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効になっていません" #: authentication/api/connection_token.py:379 msgid "Anonymous account is not supported for this asset" @@ -2940,9 +2909,7 @@ msgstr "ユーザーにマッチしなかった" msgid "" "The user is from {}, please go to the corresponding system to change the " "password" -msgstr "" -"ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してくだ" -"さい。" +msgstr "ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してください。" #: authentication/api/password.py:65 #: authentication/templates/authentication/login.html:393 @@ -2973,8 +2940,7 @@ msgstr "無効なトークンヘッダー。記号文字列にはスペースを #: authentication/backends/drf.py:61 msgid "" "Invalid token header. Sign string should not contain invalid characters." -msgstr "" -"無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" +msgstr "無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" #: authentication/backends/drf.py:74 msgid "Invalid token or cache refreshed." @@ -3006,7 +2972,8 @@ msgstr "に追加" #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:26 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後に使用した日付" @@ -3081,34 +3048,27 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 " -"{times_try} 回試すこともできます (アカウントは {block_time} 分の間一時的に" -"ロックされます)" +"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 {times_try} 回試すこともできます (アカウントは " +"{block_time} 分の間一時的にロックされます)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" "The account has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "" -"アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後" -"にもう一度お試しください)" +msgstr "アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後にもう一度お試しください)" #: authentication/errors/const.py:51 msgid "" "The address has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "" -"IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行" -"してください)" +msgstr "IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行してください)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" -msgstr "" -"{error},{times_try} 回も試すことができます (アカウントは {block_time} 分の間" -"一時的にロックされます)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" +msgstr "{error},{times_try} 回も試すことができます (アカウントは {block_time} 分の間一時的にロックされます)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3195,8 +3155,7 @@ msgstr "ログインする前にパスワードを変更する必要がありま #: authentication/errors/redirect.py:101 authentication/mixins.py:337 msgid "Your password has expired, please reset before logging in" -msgstr "" -"パスワードの有効期限が切れました。ログインする前にリセットしてください。" +msgstr "パスワードの有効期限が切れました。ログインする前にリセットしてください。" #: authentication/forms.py:34 msgid "Auto-login" @@ -3237,8 +3196,7 @@ msgstr "カスタム MFA 検証コード" #: authentication/mfa/custom.py:56 msgid "MFA custom global enabled, cannot disable" -msgstr "" -"カスタム MFA はグローバルに有効になっており、無効にすることはできません" +msgstr "カスタム MFA はグローバルに有効になっており、無効にすることはできません" #: authentication/mfa/otp.py:7 msgid "OTP code invalid, or server time error" @@ -3305,9 +3263,7 @@ msgstr "無効なユーザーです" msgid "" "The administrator has enabled 'Only allow login from user source'. \n" " The current user source is {}. Please contact the administrator." -msgstr "" -"管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユー" -"ザーソースは {} です。管理者に連絡してください。" +msgstr "管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユーザーソースは {} です。管理者に連絡してください。" #: authentication/mixins.py:273 msgid "The MFA type ({}) is not enabled" @@ -3520,11 +3476,9 @@ msgstr "タイプを作成" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" -msgstr "" -"作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度き" -"りです" +"Please download the private key after creation. Each private key can only be" +" downloaded once" +msgstr "作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度きりです" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 #: users/serializers/profile.py:133 users/serializers/profile.py:160 @@ -3621,9 +3575,7 @@ msgstr "アカウントにリモートログイン動作があります。注意 msgid "" "If you suspect that the login behavior is abnormal, please modify the " "account password in time." -msgstr "" -"ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変" -"更してください。" +msgstr "ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変更してください。" #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" @@ -3637,9 +3589,7 @@ msgstr "操作が独自のものでない場合は、パスワードをバイン msgid "" "Please click the link below to reset your password, if not your request, " "concern your account security" -msgstr "" -"下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場" -"合は、アカウントのセキュリティに関係します。" +msgstr "下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場合は、アカウントのセキュリティに関係します。" #: authentication/templates/authentication/_msg_reset_password.html:10 msgid "Click here reset password" @@ -3684,9 +3634,7 @@ msgstr "ブラウザ" msgid "" "If the password update was not initiated by you, your account may have " "security issues" -msgstr "" -"パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題があ" -"る可能性があります" +msgstr "パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" #: authentication/templates/authentication/_msg_rest_password_success.html:14 #: authentication/templates/authentication/_msg_rest_public_key_success.html:14 @@ -3701,9 +3649,7 @@ msgstr "公開鍵が正常に更新されました" msgid "" "If the public key update was not initiated by you, your account may have " "security issues" -msgstr "" -"公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可" -"能性があります" +msgstr "公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" #: authentication/templates/authentication/auth_fail_flash_message_standalone.html:28 #: templates/flash_message_standalone.html:28 tickets/const.py:18 @@ -3714,9 +3660,7 @@ msgstr "キャンセル" msgid "" "Configuration file has problems and cannot be logged in. Please contact the " "administrator or view latest docs" -msgstr "" -"設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のド" -"キュメントを参照してください。" +msgstr "設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のドキュメントを参照してください。" #: authentication/templates/authentication/login.html:309 msgid "If you are administrator, you can update the config resolve it, set" @@ -3762,9 +3706,7 @@ msgstr "コピー成功" msgid "" "This page is not served over HTTPS. Please use HTTPS to ensure security of " "your credentials." -msgstr "" -"このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリ" -"ティを確保してください。" +msgstr "このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリティを確保してください。" #: authentication/templates/authentication/passkey.html:173 msgid "Do you want to retry ?" @@ -3893,11 +3835,9 @@ msgstr "ログアウト成功、ログインページを返す" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" -msgstr "" -"安全のため、クライアントでの自動リダイレクトログインはサポートされていませ" -"ん。クライアントで開く必要がある場合は、再度ログインしてください" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" +msgstr "安全のため、クライアントでの自動リダイレクトログインはサポートされていません。クライアントで開く必要がある場合は、再度ログインしてください" #: authentication/views/slack.py:35 authentication/views/slack.py:118 msgid "Slack Error" @@ -4003,13 +3943,12 @@ msgstr "Secret Keyを使用したフィールドの暗号化" #: common/db/fields.py:577 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 " -"{'type':'ids','ids':[]}或 #タイプ:属性、属性:[#名前:ip、照合:正確、" -"値:1.1.1.1}" +"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 {'type':'ids','ids':[]}或 " +"#タイプ:属性、属性:[#名前:ip、照合:正確、値:1.1.1.1}" #: common/db/fields.py:584 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4075,9 +4014,7 @@ msgstr "無効 excel 書類" msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" -msgstr "" -"{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワード" -"に暗号化パスワードを設定してください" +msgstr "{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワードに暗号化パスワードを設定してください" #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format @@ -4120,9 +4057,7 @@ msgstr "サポートされていません Elasticsearch8" msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" -msgstr "" -"接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してく" -"ださい" +msgstr "接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してください" #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" @@ -4300,16 +4235,13 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要" -"があります。urlディストリビューションにnginxを設定します。
この" -"ページが表示されている場合は、nginxリスニングポートにアクセスしていないことを" -"証明してください。頑張ってください。" +"
" +"Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要があります。urlディストリビューションにnginxを設定します。
" +" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" -msgstr "" -"Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要がありま" -"す。" +msgstr "Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要があります。" #: jumpserver/views/other.py:90 msgid "" @@ -4317,10 +4249,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要が" -"あります。URL配布用にnginxを設定します。
このページが表示されて" -"いる場合は、nginxリスニングポートにアクセスしていないことを証明してください。" -"頑張ってください。" +"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要があります。URL配布用にnginxを設定します。
" +" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" #: labels/apps.py:8 msgid "App Labels" @@ -4411,15 +4341,12 @@ msgstr "タスク実行パラメータエラー" msgid "" "Asset ({asset}) must have at least one of the following protocols added: " "SSH, SFTP, or WinRM" -msgstr "" -"資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加" -"する必要があります" +msgstr "資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加する必要があります" #: ops/api/job.py:84 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" -msgstr "" -"資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" +msgstr "資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" #: ops/api/job.py:85 #, python-brace-format @@ -4434,9 +4361,7 @@ msgstr "重複したファイルが存在する" #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" -msgstr "" -"ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択し" -"てください。" +msgstr "ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択してください。" #: ops/api/job.py:244 msgid "" @@ -4507,7 +4432,7 @@ msgstr "空欄" msgid "VCS" msgstr "VCS" -#: ops/const.py:38 ops/models/adhoc.py:44 settings/serializers/feature.py:120 +#: ops/const.py:38 ops/models/adhoc.py:44 settings/serializers/feature.py:123 msgid "Adhoc" msgstr "コマンド" @@ -4853,8 +4778,7 @@ msgstr "現在の組織 ({}) は削除できません" msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" -msgstr "" -"LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" +msgstr "LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" #: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" @@ -4873,7 +4797,8 @@ msgstr "組織を選択してから保存してください" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:52 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:60 msgid "Organization" msgstr "組織" @@ -4889,7 +4814,7 @@ msgstr "デフォルト組織" msgid "SYSTEM" msgstr "システム組織" -#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:185 +#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:186 #: terminal/models/applet/applet.py:42 msgid "Builtin" msgstr "ビルトイン" @@ -5012,7 +4937,7 @@ msgid "today" msgstr "今日" #: perms/notifications.py:12 perms/notifications.py:44 -#: settings/serializers/feature.py:111 +#: settings/serializers/feature.py:114 msgid "day" msgstr "日" @@ -5170,8 +5095,7 @@ msgstr "全ての組織" msgid "" "User last role in org, can not be delete, you can remove user from org " "instead" -msgstr "" -"ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" +msgstr "ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" #: rbac/models/rolebinding.py:200 msgid "Organization role binding" @@ -5205,7 +5129,7 @@ msgstr "ワークスペースビュー" msgid "Audit view" msgstr "監査ビュー" -#: rbac/tree.py:27 settings/models.py:161 +#: rbac/tree.py:27 settings/models.py:162 msgid "System setting" msgstr "システム設定" @@ -5233,7 +5157,7 @@ msgstr "アカウントの秘密の変更" msgid "App ops" msgstr "アプリ操作" -#: rbac/tree.py:57 settings/serializers/feature.py:117 +#: rbac/tree.py:57 settings/serializers/feature.py:120 msgid "Feature" msgstr "機能" @@ -5268,8 +5192,8 @@ msgstr "アプリ組織" msgid "Ticket comment" msgstr "チケットコメント" -#: rbac/tree.py:159 settings/serializers/feature.py:98 -#: settings/serializers/feature.py:100 tickets/models/ticket/general.py:308 +#: rbac/tree.py:159 settings/serializers/feature.py:101 +#: settings/serializers/feature.py:103 tickets/models/ticket/general.py:308 msgid "Ticket" msgstr "チケット" @@ -5302,9 +5226,7 @@ msgstr "SMTP設定のテスト" #: settings/api/ldap.py:90 msgid "" "Users are not synchronized, please click the user synchronization button" -msgstr "" -"ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてくださ" -"い。" +msgstr "ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてください。" #: settings/api/sms.py:142 msgid "Invalid SMS platform" @@ -5318,75 +5240,75 @@ msgstr "携帯番号をテストこのフィールドは必須です" msgid "App Settings" msgstr "設定" -#: settings/models.py:37 users/models/preference.py:14 +#: settings/models.py:38 users/models/preference.py:14 msgid "Encrypted" msgstr "暗号化された" -#: settings/models.py:163 +#: settings/models.py:164 msgid "Can change email setting" msgstr "メール設定を変更できます" -#: settings/models.py:164 +#: settings/models.py:165 msgid "Can change auth setting" msgstr "資格認定の設定" -#: settings/models.py:165 +#: settings/models.py:166 msgid "Can change auth ops" msgstr "タスクセンターの設定" -#: settings/models.py:166 +#: settings/models.py:167 msgid "Can change auth ticket" msgstr "製造オーダ設定" -#: settings/models.py:167 +#: settings/models.py:168 msgid "Can change virtual app setting" msgstr "仮想アプリケーション設定を変更できます" -#: settings/models.py:168 +#: settings/models.py:169 msgid "Can change auth announcement" msgstr "公告の設定" -#: settings/models.py:169 +#: settings/models.py:170 msgid "Can change vault setting" msgstr "金庫の設定を変えることができます" -#: settings/models.py:170 +#: settings/models.py:171 msgid "Can change chat ai setting" msgstr "チャットAI設定を変更できます" -#: settings/models.py:171 +#: settings/models.py:172 msgid "Can change system msg sub setting" msgstr "システムmsgサブ设定を変更できます" -#: settings/models.py:172 +#: settings/models.py:173 msgid "Can change sms setting" msgstr "Smsの設定を変えることができます" -#: settings/models.py:173 +#: settings/models.py:174 msgid "Can change security setting" msgstr "セキュリティ設定を変更できます" -#: settings/models.py:174 +#: settings/models.py:175 msgid "Can change clean setting" msgstr "きれいな設定を変えることができます" -#: settings/models.py:175 +#: settings/models.py:176 msgid "Can change interface setting" msgstr "インターフェイスの設定を変えることができます" -#: settings/models.py:176 +#: settings/models.py:177 msgid "Can change license setting" msgstr "ライセンス設定を変更できます" -#: settings/models.py:177 +#: settings/models.py:178 msgid "Can change terminal setting" msgstr "ターミナルの設定を変えることができます" -#: settings/models.py:178 +#: settings/models.py:179 msgid "Can change other setting" msgstr "他の設定を変えることができます" -#: settings/models.py:188 +#: settings/models.py:189 msgid "Chat prompt" msgstr "チャットのヒント" @@ -5457,9 +5379,7 @@ msgid "" "information, the system will automatically create the user using this email " "suffix" msgstr "" -"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユー" -"ザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィック" -"スでユーザーを作成します" +"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユーザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィックスでユーザーを作成します" #: settings/serializers/auth/base.py:36 msgid "Forgot Password URL" @@ -5478,17 +5398,13 @@ msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "" -"管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証" -"にリダイレクトされる前に Flash ページを表示するかどうか" +msgstr "管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証にリダイレクトされる前に Flash ページを表示するかどうか" #: settings/serializers/auth/base.py:54 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "" -"ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザー" -"は常にデフォルト組織に属します。" +msgstr "ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザーは常にデフォルト組織に属します。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" @@ -5520,7 +5436,8 @@ msgstr "ユーザー名のプロパティ" msgid "Enable attributes map" msgstr "属性マップの有効化" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 #: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 #: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 @@ -5533,8 +5450,7 @@ msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、" -"`value` は JumpServer のユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、`value` は JumpServer のユーザー属性名です" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -5544,9 +5460,7 @@ msgstr "そうでない場合はユーザーを作成" msgid "" "After successful user authentication, if the user does not exist, " "automatically create the user" -msgstr "" -"ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成さ" -"れます" +msgstr "ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成されます" #: settings/serializers/auth/dingtalk.py:16 msgid "Dingtalk" @@ -5557,16 +5471,15 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は ディントーク サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は ディントーク " +"サービスのユーザー属性名です" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は フェイシュ サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は フェイシュ サービスのユーザー属性名です" #: settings/serializers/auth/lark.py:13 users/models/user/_source.py:21 msgid "Lark" @@ -5577,8 +5490,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は Lark サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Lark サービスのユーザー属性名です" #: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" @@ -5608,8 +5520,7 @@ msgstr "システムアーキテクチャ" msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" -msgstr "" -"ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" +msgstr "ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" #: settings/serializers/auth/ldap.py:62 msgid "Search filter" @@ -5625,8 +5536,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は LDAP サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は LDAP サービスのユーザー属性名です" #: settings/serializers/auth/ldap.py:84 msgid "Connect timeout (s)" @@ -5639,13 +5549,12 @@ msgstr "User DN キャッシュの有効期限 (秒)" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" -"ユーザーログイン認証時に取得したユーザー DN をキャッシュすることで、ユーザー" -"認証の速度を効果的に向上させることができます
ユーザー OU 構造が調整された" -"場合、送信をクリックしてユーザー DN キャッシュをクリアします" +"ユーザーログイン認証時に取得したユーザー DN をキャッシュすることで、ユーザー認証の速度を効果的に向上させることができます
ユーザー OU " +"構造が調整された場合、送信をクリックしてユーザー DN キャッシュをクリアします" #: settings/serializers/auth/ldap.py:97 msgid "Search paged size (piece)" @@ -5696,7 +5605,8 @@ msgid "End session endpoint" msgstr "プロバイダーのセッション終了エンドポイント" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "ユーザーがログアウトすると、OAuth2 サーバからもログアウトします" #: settings/serializers/auth/oauth2.py:62 @@ -5704,11 +5614,11 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は OAuth2 サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OAuth2 " +"サービスのユーザー属性名です" -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "常にユーザーを更新" @@ -5741,8 +5651,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は OIDC サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OIDC サービスのユーザー属性名です" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -5760,9 +5669,7 @@ msgstr "Keycloakを使用する" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "" -"Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プ" -"ロトコルを使用する" +msgstr "Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プロトコルを使用する" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -5821,9 +5728,7 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストと" -"DOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切り" -"ます" +"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストとDOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切ります" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -5839,10 +5744,9 @@ msgid "OTP in RADIUS" msgstr "Radius のOTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" -msgstr "" -"* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用す" -"ることができる" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgstr "* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用することができる" #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 msgid "SAML2" @@ -5872,9 +5776,7 @@ msgstr "SP 証明書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -"ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`は" -"JumpServerのユーザー属性名)" +msgstr "ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`はJumpServerのユーザー属性名)" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -5885,8 +5787,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は Slack サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Slack サービスのユーザー属性名です" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -5951,13 +5852,11 @@ msgstr "ビジネス・タイプ(Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." msgstr "" -"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未" -"満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わない" -"でください。" +"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わないでください。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -5978,8 +5877,7 @@ msgstr "SSO Token認証の有効化" #: settings/serializers/auth/sso.py:17 msgid "Other service can using SSO token login to JumpServer without password" -msgstr "" -"他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" +msgstr "他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" #: settings/serializers/auth/sso.py:20 msgid "SSO auth key TTL" @@ -5995,8 +5893,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は エンタープライズ WeChat サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は エンタープライズ WeChat " +"サービスのユーザー属性名です" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -6004,11 +5902,9 @@ msgstr "サイトURL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" -msgstr "" -"サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常は" -"システムメール内のリンクに使用されます" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" +msgstr "サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常はシステムメール内のリンクに使用されます" #: settings/serializers/basic.py:18 msgid "User guide url" @@ -6033,9 +5929,7 @@ msgstr "ドキュメントリンク" #: settings/serializers/basic.py:27 msgid "" "Document URL refers to the address in the top navigation bar Help - Document" -msgstr "" -"ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ド" -"キュメント" +msgstr "ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ドキュメント" #: settings/serializers/basic.py:30 msgid "Support URL" @@ -6044,8 +5938,7 @@ msgstr "サポートリンク" #: settings/serializers/basic.py:31 msgid "" "Support URL refers to the address in the top navigation bar Help - Support" -msgstr "" -"サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" +msgstr "サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" #: settings/serializers/basic.py:44 msgid "Organization name already exists" @@ -6096,119 +5989,122 @@ msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." msgstr "" -"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (デー" -"タベースのバックアップに影響し、OSS などには影響しません)" +"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (データベースのバックアップに影響し、OSS などには影響しません)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" msgstr "パスワード変更プッシュ記録を保持する日数 (日)" -#: settings/serializers/feature.py:18 settings/serializers/msg.py:68 +#: settings/serializers/feature.py:19 settings/serializers/msg.py:68 msgid "Subject" msgstr "件名" -#: settings/serializers/feature.py:22 +#: settings/serializers/feature.py:23 msgid "More Link" msgstr "もっとURL" -#: settings/serializers/feature.py:36 settings/serializers/feature.py:38 -#: settings/serializers/feature.py:39 +#: settings/serializers/feature.py:26 +#: settings/templates/ldap/_msg_import_ldap_user.html:6 +#: terminal/models/session/session.py:46 +msgid "Date end" +msgstr "終了日" + +#: settings/serializers/feature.py:39 settings/serializers/feature.py:41 +#: settings/serializers/feature.py:42 msgid "Announcement" msgstr "発表" -#: settings/serializers/feature.py:46 +#: settings/serializers/feature.py:49 msgid "Vault" msgstr "有効化 Vault" -#: settings/serializers/feature.py:55 +#: settings/serializers/feature.py:58 msgid "Mount Point" msgstr "マウントポイント" -#: settings/serializers/feature.py:61 +#: settings/serializers/feature.py:64 msgid "Record limit" msgstr "記録制限" -#: settings/serializers/feature.py:63 +#: settings/serializers/feature.py:66 msgid "" "If the specific value is less than 999 (default), the system will " "automatically perform a task every night: check and delete historical " "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、" -"所定の数を超える履歴アカウントを確認して削除します。 値が 999 以上の場合、履" -"歴アカウントの削除は実行されません。" +"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、所定の数を超える履歴アカウントを確認して削除します。 値が 999 " +"以上の場合、履歴アカウントの削除は実行されません。" -#: settings/serializers/feature.py:73 settings/serializers/feature.py:79 +#: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" msgstr "チャットAI" -#: settings/serializers/feature.py:82 +#: settings/serializers/feature.py:85 msgid "GPT Base URL" msgstr "GPTアドレス" -#: settings/serializers/feature.py:83 -msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" +#: settings/serializers/feature.py:86 +msgid "" +"The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPTサービスの基本のURL。例えば:https://api.openai.com/v1" -#: settings/serializers/feature.py:86 templates/_header_bar.html:96 +#: settings/serializers/feature.py:89 templates/_header_bar.html:96 msgid "API Key" msgstr "API Key" -#: settings/serializers/feature.py:90 +#: settings/serializers/feature.py:93 msgid "" "The proxy server address of the GPT service. For example: http://ip:port" msgstr "GPTサービスのプロキシサーバーのアドレス。例えば:http://ip:port" -#: settings/serializers/feature.py:93 +#: settings/serializers/feature.py:96 msgid "GPT Model" msgstr "GPTモデル" -#: settings/serializers/feature.py:102 +#: settings/serializers/feature.py:105 msgid "Approval without login" msgstr "ログイン承認なし" -#: settings/serializers/feature.py:103 +#: settings/serializers/feature.py:106 msgid "Allow direct approval ticket without login" msgstr "ログインせずに直接承認チケットを許可します" -#: settings/serializers/feature.py:107 +#: settings/serializers/feature.py:110 msgid "Period" msgstr "期間" -#: settings/serializers/feature.py:108 +#: settings/serializers/feature.py:111 msgid "" "The default authorization time period when applying for assets via a ticket" msgstr "ワークオーダーの資産申請に対するデフォルトの承認時間帯" -#: settings/serializers/feature.py:111 +#: settings/serializers/feature.py:114 msgid "hour" msgstr "時" -#: settings/serializers/feature.py:112 +#: settings/serializers/feature.py:115 msgid "Unit" msgstr "単位" -#: settings/serializers/feature.py:112 +#: settings/serializers/feature.py:115 msgid "The unit of period" msgstr "ユーザーの実行" -#: settings/serializers/feature.py:121 +#: settings/serializers/feature.py:124 msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" -msgstr "" -"ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行すること" -"を許可します" +msgstr "ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行することを許可します" -#: settings/serializers/feature.py:125 +#: settings/serializers/feature.py:128 msgid "Command blacklist" msgstr "コマンドフィルタリング" -#: settings/serializers/feature.py:126 +#: settings/serializers/feature.py:129 msgid "Command blacklist in Adhoc" msgstr "コマンドフィルタリング" -#: settings/serializers/feature.py:131 +#: settings/serializers/feature.py:134 #: terminal/models/virtualapp/provider.py:17 #: terminal/models/virtualapp/virtualapp.py:36 #: terminal/models/virtualapp/virtualapp.py:97 @@ -6216,17 +6112,15 @@ msgstr "コマンドフィルタリング" msgid "Virtual app" msgstr "仮想アプリケーション" -#: settings/serializers/feature.py:134 +#: settings/serializers/feature.py:137 msgid "Virtual App" msgstr "仮想アプリケーション" -#: settings/serializers/feature.py:136 +#: settings/serializers/feature.py:139 msgid "" "Virtual applications, you can use the Linux operating system as an " "application server in remote applications." -msgstr "" -"仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレー" -"ティングシステムを使用できます。" +msgstr "仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレーティングシステムを使用できます。" #: settings/serializers/msg.py:24 msgid "SMTP" @@ -6238,9 +6132,7 @@ msgstr "" #: settings/serializers/msg.py:34 msgid "The user to be used for email server authentication" -msgstr "" -"メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアド" -"レスです" +msgstr "メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアドレスです" #: settings/serializers/msg.py:38 msgid "" @@ -6266,9 +6158,7 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどの" -"メール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用し" -"ます" +"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどのメール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用します" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -6278,9 +6168,7 @@ msgstr "TLSの使用" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "" -"SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的な" -"TLS接続を使用します、通常ポート587を使用します" +msgstr "SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的なTLS接続を使用します、通常ポート587を使用します" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -6288,11 +6176,9 @@ msgstr "件名プレフィックス" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" -msgstr "" -"ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを" -"正常に作成)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" +msgstr "ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを正常に作成)" #: settings/serializers/msg.py:73 msgid "Honorific" @@ -6300,17 +6186,14 @@ msgstr "ユーザー敬語の作成" #: settings/serializers/msg.py:74 msgid "Tips: When creating a user, send the honorific of the email (eg:Hello)" -msgstr "" -"ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" +msgstr "ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" #: settings/serializers/msg.py:80 #, python-brace-format msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "" -"ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}" -"{email}ラベルをサポートします。" +msgstr "ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}{email}ラベルをサポートします。" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -6327,9 +6210,7 @@ msgstr "グループ化されていないノードを表示" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" msgstr "" -"グループ化されていないノードに個別に許可された資産を配置し、資産が存在する" -"ノードが表示されないようにしますが、そのノードが許可されていないという質問に" -"質問" +"グループ化されていないノードに個別に許可された資産を配置し、資産が存在するノードが表示されないようにしますが、そのノードが許可されていないという質問に質問" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -6341,10 +6222,8 @@ msgid "" "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" msgstr "" -"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有" -"効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) 以内に、パスワー" -"ドの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信さ" -"れます。" +"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) " +"以内に、パスワードの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信されます。" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -6354,9 +6233,7 @@ msgstr "繰り返された履歴パスワードの数" msgid "" "Tip: When the user resets the password, it cannot be the previous n " "historical passwords of the user" -msgstr "" -"ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワード" -"にすることはできません" +msgstr "ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワードにすることはできません" #: settings/serializers/security.py:34 msgid "Minimum length (User)" @@ -6378,9 +6255,7 @@ msgstr "特別な" msgid "" "If the user has failed to log in for a limited number of times, no login is " "allowed during this time interval." -msgstr "" -"ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログイン" -"はできません。" +msgstr "ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログインはできません。" #: settings/serializers/security.py:63 settings/serializers/security.py:73 msgid "Login failures count" @@ -6406,9 +6281,7 @@ msgstr "単一デバイスログインのみ" msgid "" "After the user logs in on the new device, other logged-in devices will " "automatically log out" -msgstr "" -"ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動" -"的にログアウトします。" +msgstr "ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動的にログアウトします。" #: settings/serializers/security.py:95 msgid "Only exist user login" @@ -6421,9 +6294,8 @@ msgid "" "are allowed to log in and automatically create users (if the user does not " "exist)" msgstr "" -"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、" -"ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的" -"に作成されます (ユーザーが存在しない場合)。" +"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的に作成されます" +" (ユーザーが存在しない場合)。" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -6431,14 +6303,13 @@ msgstr "ソースログインからのみ" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効" -"な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべ" -"ての認証方法を特定の順序で認証します。 、直接ログインできます" +"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべての認証方法を特定の順序で認証します。" +" 、直接ログインできます" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -6489,8 +6360,7 @@ msgstr "ログインページのMFA" #: settings/serializers/security.py:144 msgid "Eu security regulations(GDPR) require MFA to be on the login page" -msgstr "" -"Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" +msgstr "Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" #: settings/serializers/security.py:148 msgid "Verify code TTL (second)" @@ -6508,9 +6378,7 @@ msgstr "ログイン動的コードの有効化" msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "" -"パスワードと追加コードは、検証のためにサードパーティの認証システムに送信され" -"ます" +msgstr "パスワードと追加コードは、検証のためにサードパーティの認証システムに送信されます" #: settings/serializers/security.py:158 msgid "Login captcha" @@ -6526,13 +6394,11 @@ msgstr "リモートログイン保護" #: settings/serializers/security.py:164 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" msgstr "" -"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断" -"します。アカウントが共通のログイン都市からログインしている場合、システムはリ" -"モートログインリマインダーを送信します" +"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断します。アカウントが共通のログイン都市からログインしている場合、システムはリモートログインリマインダーを送信します" #: settings/serializers/security.py:170 msgid "Auto Disable Threshold (day)" @@ -6542,9 +6408,7 @@ msgstr "未使用のユーザータイムアウト(日)" msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" -msgstr "" -"毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効に" -"します" +msgstr "毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効にします" #: settings/serializers/security.py:191 msgid "Watermark" @@ -6589,8 +6453,7 @@ msgstr "セッション共有" #: settings/serializers/security.py:213 msgid "Enabled, Allows user active session to be shared with other users" -msgstr "" -"ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" +msgstr "ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" #: settings/serializers/security.py:219 msgid "Insecure command alert" @@ -6619,30 +6482,24 @@ msgstr "ターミナルレジスタの有効化" #: settings/serializers/terminal.py:24 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" -msgstr "" -"ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティ" -"のためにこれを無効にする必要があります" +"Allow component register, after all component setup, you should disable this" +" for security" +msgstr "ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティのためにこれを無効にする必要があります" #: settings/serializers/terminal.py:30 msgid "" "* Allow users to log in to the KoKo component via password authentication" -msgstr "" -"* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可" -"する" +msgstr "* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可する" #: settings/serializers/terminal.py:36 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" -"* 公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第" -"三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバ" -"から削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべ" -"きです。" +"* " +"公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバから削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべきです。" #: settings/serializers/terminal.py:43 msgid "Asset sorting" @@ -6654,23 +6511,21 @@ msgstr "ページサイズを一覧表示" #: settings/serializers/terminal.py:51 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" -"
有効化した場合、Luna ページでは資産への接続時にDBクライアントの起動方法" -"を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna " +"ページでは資産への接続時にDBクライアントの起動方法を表示します。" #: settings/serializers/terminal.py:59 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" -"
有効化した場合、Luna ページでは資産への接続時にrdp ファイルのダウンロー" -"ドボタンとRDPクライアントの起動方法を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna ページでは資産への接続時にrdp " +"ファイルのダウンロードボタンとRDPクライアントの起動方法を表示します。" #: settings/serializers/terminal.py:66 msgid "Client connection" @@ -6679,11 +6534,11 @@ msgstr "クライアント接続" #: settings/serializers/terminal.py:68 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" +"Luna page will display the SSH client launch method when connecting to " +"assets" msgstr "" -"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効" -"化した場合、Luna ページでは資産への接続時にSSHクライアントの起動方法を表示し" -"ます。" +"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効化した場合、Luna " +"ページでは資産への接続時にSSHクライアントの起動方法を表示します。" #: settings/serializers/tool.py:10 msgid "Tool" @@ -6695,11 +6550,9 @@ msgstr "ワークベンチのツール" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" -msgstr "" -"* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにしま" -"す" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" +msgstr "* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにします" #: settings/tasks/ldap.py:28 msgid "Periodic import ldap user" @@ -6713,11 +6566,6 @@ msgstr "登録サイクルLDAPユーザータスクのインポート" msgid "Sync task finish" msgstr "同期タスクが完了しました" -#: settings/templates/ldap/_msg_import_ldap_user.html:6 -#: terminal/models/session/session.py:46 -msgid "Date end" -msgstr "終了日" - #: settings/templates/ldap/_msg_import_ldap_user.html:9 msgid "Synced Organization" msgstr "組織が同期されました" @@ -6846,9 +6694,7 @@ msgstr "インポート" #: templates/_csv_import_modal.html:12 msgid "Download the imported template or use the exported CSV file format" -msgstr "" -"インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形" -"式を使用する" +msgstr "インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" #: templates/_csv_import_modal.html:13 msgid "Download the import template" @@ -6864,9 +6710,7 @@ msgstr "ファイルを選択してください" #: templates/_csv_update_modal.html:12 msgid "Download the update template or use the exported CSV file format" -msgstr "" -"更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用す" -"る" +msgstr "更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" #: templates/_csv_update_modal.html:13 msgid "Download the update template" @@ -6907,8 +6751,7 @@ msgid "" " " msgstr "" "\n" -" アカウントが期限切れになったので、管理者に連絡してくださ" -"い。 " +" アカウントが期限切れになったので、管理者に連絡してください。 " #: templates/_message.html:13 msgid "Your account will at" @@ -6922,13 +6765,11 @@ msgstr "期限切れです。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" パスワードが期限切れになりましたので、クリックしてください " -" リンク パスワードの更新\n" +" パスワードが期限切れになりましたので、クリックしてください リンク パスワードの更新\n" " " #: templates/_message.html:30 @@ -6939,39 +6780,33 @@ msgstr "あなたのパスワードは" #, python-format msgid "" "\n" -" please click this " -"link to update your password.\n" +" please click this link to update your password.\n" " " msgstr "" "\n" -" クリックしてください リンク パスワードの更新\n" +" クリックしてください リンク パスワードの更新\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" +" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" +" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -7003,9 +6838,8 @@ msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" msgstr "" -"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起す" -"るために使用されており、現在はRDP SSHクライアントのみをサポートしています。" -"「Telnetは将来的にサポートする" +"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起するために使用されており、現在はRDP " +"SSHクライアントのみをサポートしています。「Telnetは将来的にサポートする" #: templates/resource_download.html:35 msgid "Microsoft" @@ -7019,9 +6853,7 @@ msgstr "公式" msgid "" "macOS needs to download the client to connect RDP asset, which comes with " "Windows" -msgstr "" -"MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロード" -"する必要があります" +msgstr "MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロードする必要があります" #: templates/resource_download.html:45 msgid "Windows Remote application publisher tools" @@ -7031,9 +6863,7 @@ msgstr "Windowsリモートアプリケーション発行者ツール" msgid "" "OpenSSH is a program used to connect remote applications in the Windows " "Remote Application Publisher" -msgstr "" -"OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続する" -"プログラムです" +msgstr "OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続するプログラムです" #: templates/resource_download.html:53 msgid "Offline video player" @@ -7455,7 +7285,8 @@ msgstr "セッション再生をダウンロードできます" msgid "Account ID" msgstr "アカウント ID" -#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:37 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "ログイン元" @@ -7504,8 +7335,8 @@ msgstr "アクションパーミッション" msgid "Origin" msgstr "ソース" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:261 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:261 msgid "Session sharing" msgstr "セッション共有" @@ -7618,21 +7449,16 @@ msgstr "コア サービス アドレス" #: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリー" -"ス マシンとコア サービスが同じネットワーク セグメント上にある場合は、イントラ" -"ネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト " -"URL を入力します。
例: https://172.16.10.110 または https://dev." -"jumpserver.com" +"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリース マシンとコア サービスが同じネットワーク " +"セグメント上にある場合は、イントラネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト URL を入力します。
例: " +"https://172.16.10.110 または https://dev.jumpserver.com" #: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -7662,9 +7488,7 @@ msgstr "最大切断時間(ミリ秒)" msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "" -"ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時" -"間を設定します(60000ミリ秒後にセッションをログオフ)。" +msgstr "ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時間を設定します(60000ミリ秒後にセッションをログオフ)。" #: terminal/serializers/applet_host.py:60 msgid "RDS Remote App Logoff Time Limit (ms)" @@ -7672,11 +7496,10 @@ msgstr "RDSリモートアプリケーションのログアウト時間制限( #: terminal/serializers/applet_host.py:62 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." msgstr "" -"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ" -"時間を設定します(0ミリ秒、セッションを即座にログオフ)。" +"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ時間を設定します(0ミリ秒、セッションを即座にログオフ)。" #: terminal/serializers/applet_host.py:71 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 @@ -7685,17 +7508,13 @@ msgstr "ロードステータス" #: terminal/serializers/applet_host.py:85 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" -"これらのアカウントは、公開されたアプリケーションに接続するために使用されま" -"す。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専" -"用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公" -"開されています。アプリケーションが複数のオープンをサポートしていない場合、お" -"よび特別なものが使用されている場合、公開アカウントが使用されます。" +"これらのアカウントは、公開されたアプリケーションに接続するために使用されます。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公開されています。アプリケーションが複数のオープンをサポートしていない場合、および特別なものが使用されている場合、公開アカウントが使用されます。" #: terminal/serializers/applet_host.py:92 msgid "The number of public accounts created automatically" @@ -7707,9 +7526,8 @@ msgid "" "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項" -"目 CACHE_LOGIN_PASSWORD_ENABLED=true を設定してサービスを再起動して有効にして" -"ください。" +"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項目 CACHE_LOGIN_PASSWORD_ENABLED=true " +"を設定してサービスを再起動して有効にしてください。" #: terminal/serializers/applet_host.py:137 msgid "Install applets" @@ -7759,9 +7577,7 @@ msgstr "Oracle がリッスンするポート範囲" msgid "" "Oracle proxy server listen port is dynamic, Each additional Oracle database " "instance adds a port listener" -msgstr "" -"Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データ" -"ベースインスタンスはポートリスナーを追加します" +msgstr "Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データベースインスタンスはポートリスナーを追加します" #: terminal/serializers/endpoint.py:38 msgid "" @@ -7769,22 +7585,19 @@ msgid "" "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" msgstr "" -"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラ" -"ウザのアクセス アドレスが使用されます (デフォルトのエンドポイントではホストの" -"変更は許可されません)。" +"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラウザのアクセス アドレスが使用されます " +"(デフォルトのエンドポイントではホストの変更は許可されません)。" #: terminal/serializers/endpoint.py:64 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "このIP範囲内のアセットは、以下のエンドポイントを使用して接続されます" #: terminal/serializers/endpoint.py:65 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" -msgstr "" -"異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用" -"して実装します" +msgstr "異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用して実装します" #: terminal/serializers/endpoint.py:69 msgid "Asset IP" @@ -7881,8 +7694,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www." -"jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" +"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www.jumpserver.a.com:9100, " +"http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -7913,9 +7726,7 @@ msgid "" "set as the default storage, will make new Component use the current storage " "by default, without affecting existing Component" msgstr "" -"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレー" -"ジをデフォルトで使用するようになりますが、既存のコンポーネントには影響しませ" -"ん" +"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレージをデフォルトで使用するようになりますが、既存のコンポーネントには影響しません" #: terminal/serializers/task.py:9 msgid "Session id" @@ -8089,16 +7900,13 @@ msgid "" "administrator to open more ports." msgstr "" "利用可能なポートと一致しません。データベースの数が、データベース プロキシ " -"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開" -"くには、管理者に連絡してください。" +"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開くには、管理者に連絡してください。" #: terminal/utils/db_port_mapper.py:116 msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "" -"使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の" -"制限を確認して変更してください. " +"No ports can be used, check and modify the limit on the number of ports that" +" Magnus listens on in the configuration file." +msgstr "使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の制限を確認して変更してください. " #: terminal/utils/db_port_mapper.py:118 msgid "All available port count: {}, Already use port count: {}" @@ -8160,9 +7968,7 @@ msgstr "チケットはすでに閉じています" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "" -"チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: " -"{}" +msgstr "チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -8396,9 +8202,7 @@ msgstr "承認" #: tickets/views/approve.py:44 msgid "" "This ticket does not exist, the process has ended, or this link has expired" -msgstr "" -"このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効に" -"なっています" +msgstr "このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効になっています" #: tickets/views/approve.py:72 msgid "Click the button below to approve or reject" @@ -8510,8 +8314,7 @@ msgid "" "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" msgstr "" -"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入りま" -"す。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" +"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入ります。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" #: users/forms/profile.py:59 msgid "* Enable MFA to make the account more secure." @@ -8519,12 +8322,11 @@ msgstr "* アカウントをより安全にするためにMFAを有効にしま #: users/forms/profile.py:68 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" msgstr "" -"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報" -"を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" +"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" #: users/forms/profile.py:82 users/serializers/preference/lina.py:21 msgid "New password" @@ -8677,12 +8479,10 @@ msgstr "ターミナルテーマ名" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" -"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含" -"まれている場合、このパスワードで解読します。
例:アカウントのバックアップ" -"ファイル、アカウントのパスワード変更結果ファイル" +"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含まれている場合、このパスワードで解読します。
例:アカウントのバックアップファイル、アカウントのパスワード変更結果ファイル" #: users/serializers/preference/lina.py:39 users/serializers/profile.py:48 msgid "The newly set password is inconsistent" @@ -8730,9 +8530,7 @@ msgid "" "remote computer to fit the window size of the client computer when the " "window is resized." msgstr "" -"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコン" -"ピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように" -"拡大または縮小するかどうかを決定します。" +"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコンピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように拡大または縮小するかどうかを決定します。" # msgid "" # "Determines whether the client computer should scale the content on the " @@ -8784,10 +8582,9 @@ msgstr "システムの役割" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" -msgstr "" -"システムロールはシステムレベルのロールであり、すべての組織で有効になります" +"System roles are roles at the system level, and they will take effect across" +" all organizations" +msgstr "システムロールはシステムレベルのロールであり、すべての組織で有効になります" #: users/serializers/user.py:61 msgid "Org roles" @@ -8857,9 +8654,7 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。" -"セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザ" -"を制限することができます。" +"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザを制限することができます。" #: users/serializers/user.py:266 msgid "Superuser" @@ -8883,10 +8678,9 @@ msgstr "認証" #: users/serializers/user.py:426 msgid "" -"* For security, only a partial of users is displayed. You can search for more" -msgstr "" -"* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを" -"検索することができます" +"* For security, only a partial of users is displayed. You can search for " +"more" +msgstr "* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを検索することができます" #: users/serializers/user.py:461 msgid "name not unique" @@ -8895,11 +8689,8 @@ msgstr "名前が一意ではない" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." -msgstr "" -"管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザー" -"はユーザーリストにありません。管理者に連絡してください。" +" and the current user is not in the user list. Please contact the administrator." +msgstr "管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザーはユーザーリストにありません。管理者に連絡してください。" #: users/signal_handlers.py:193 msgid "Clean up expired user sessions" @@ -8937,8 +8728,7 @@ msgstr "アカウントの有効期限は" msgid "" "In order not to affect your normal work, please contact the administrator " "for confirmation." -msgstr "" -"通常の作業に影響を与えないように、確認のために管理者に連絡してください。" +msgstr "通常の作業に影響を与えないように、確認のために管理者に連絡してください。" #: users/templates/users/_msg_password_expire_reminder.html:7 msgid "Your password will expire in" @@ -8948,9 +8738,7 @@ msgstr "パスワードは" msgid "" "For your account security, please click on the link below to update your " "password in time" -msgstr "" -"アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間" -"内に更新してください" +msgstr "アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間内に更新してください" #: users/templates/users/_msg_password_expire_reminder.html:11 msgid "Click here update password" @@ -8958,8 +8746,7 @@ msgstr "ここをクリック更新パスワード" #: users/templates/users/_msg_password_expire_reminder.html:16 msgid "If your password has expired, please click the link below to" -msgstr "" -"パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" +msgstr "パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" #: users/templates/users/_msg_reset_mfa.html:7 msgid "Your MFA has been reset by site administrator" @@ -9059,11 +8846,9 @@ msgstr "ワンタイムパスワード認証子のバインド" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" -msgstr "" -"MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コード" -"でスキャンします。" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" +msgstr "MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コードでスキャンします。" #: users/templates/users/user_otp_enable_bind.html:22 #: users/templates/users/user_verify_mfa.html:27 @@ -9078,9 +8863,7 @@ msgstr "アプリのインストール" msgid "" "Download and install the MFA Authenticator application on your phone or " "applet of WeChat" -msgstr "" -"携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウン" -"ロードしてインストールします" +msgstr "携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウンロードしてインストールします" #: users/templates/users/user_otp_enable_install_app.html:18 msgid "Android downloads" @@ -9094,9 +8877,7 @@ msgstr "IPhoneのダウンロード" msgid "" "After installation, click the next step to enter the binding page (if " "installed, go to the next step directly)." -msgstr "" -"インストール後、次のステップをクリックしてバインディングページに入ります (イ" -"ンストールされている場合は、次のステップに直接進みます)。" +msgstr "インストール後、次のステップをクリックしてバインディングページに入ります (インストールされている場合は、次のステップに直接進みます)。" #: users/templates/users/user_password_verify.html:8 #: users/templates/users/user_password_verify.html:9 @@ -9111,8 +8892,7 @@ msgstr "認証" msgid "" "The account protection has been opened, please complete the following " "operations according to the prompts" -msgstr "" -"アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" +msgstr "アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" #: users/templates/users/user_verify_mfa.html:17 msgid "Open MFA Authenticator and enter the 6-bit dynamic code" @@ -9124,8 +8904,7 @@ msgstr "すでにバインド済み" #: users/views/profile/otp.py:107 msgid "MFA already bound, disable first, then bound" -msgstr "" -"MFAはすでにバインドされており、最初に無効にしてからバインドされています。" +msgstr "MFAはすでにバインドされており、最初に無効にしてからバインドされています。" #: users/views/profile/otp.py:134 msgid "OTP enable success" @@ -9153,11 +8932,9 @@ msgstr "パスワード無効" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" -msgstr "" -"ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが" -"許可され、パスワードの変更はサポートされていません: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" +msgstr "ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが許可され、パスワードの変更はサポートされていません: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 msgid "Token invalid or expired" @@ -9389,9 +9166,7 @@ msgstr "インスタンス \"%s\" の同期に失敗しました" msgid "" "The updated platform of asset \"%s\" is inconsistent with the original " "platform type. Skip platform and protocol updates" -msgstr "" -"更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プ" -"ラットフォームとプロトコルの更新をスキップ" +msgstr "更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プラットフォームとプロトコルの更新をスキップ" #: xpack/plugins/cloud/manager.py:393 #, python-format @@ -9522,7 +9297,8 @@ msgstr "インスタンス" msgid "Sync instance detail" msgstr "同期インスタンスの詳細" -#: xpack/plugins/cloud/models.py:311 xpack/plugins/cloud/serializers/task.py:77 +#: xpack/plugins/cloud/models.py:311 +#: xpack/plugins/cloud/serializers/task.py:77 msgid "Rule relation" msgstr "条件関係" @@ -9578,7 +9354,8 @@ msgstr "ルール一致" msgid "Rule value" msgstr "ルール値" -#: xpack/plugins/cloud/models.py:381 xpack/plugins/cloud/serializers/task.py:80 +#: xpack/plugins/cloud/models.py:381 +#: xpack/plugins/cloud/serializers/task.py:80 msgid "Strategy rule" msgstr "戦略ルール" @@ -9594,7 +9371,8 @@ msgstr "アクション属性" msgid "Action value" msgstr "アクション値" -#: xpack/plugins/cloud/models.py:407 xpack/plugins/cloud/serializers/task.py:83 +#: xpack/plugins/cloud/models.py:407 +#: xpack/plugins/cloud/serializers/task.py:83 msgid "Strategy action" msgstr "戦略アクション" @@ -9872,9 +9650,8 @@ msgid "" "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." msgstr "" -"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが" -"実行されると、有効な IP アドレスのみが同期されます。
ポートが0の場合、す" -"べてのIPアドレスが有効です。" +"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが実行されると、有効な IP アドレスのみが同期されます。 " +"
ポートが0の場合、すべてのIPアドレスが有効です。" #: xpack/plugins/cloud/serializers/account_attrs.py:190 msgid "Hostname prefix" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index ac1f04910..0619e827a 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-09-09 14:08+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -144,7 +144,7 @@ msgid "Access key" msgstr "Access key" #: accounts/const/account.py:9 authentication/backends/passkey/models.py:16 -#: authentication/models/sso_token.py:14 settings/serializers/feature.py:52 +#: authentication/models/sso_token.py:14 settings/serializers/feature.py:55 msgid "Token" msgstr "令牌" @@ -314,7 +314,7 @@ msgstr "待定的" msgid "Database" msgstr "数据库" -#: accounts/const/vault.py:9 settings/serializers/feature.py:43 +#: accounts/const/vault.py:9 settings/serializers/feature.py:46 msgid "HCP Vault" msgstr "HashiCorp Vault" @@ -460,7 +460,7 @@ msgstr "账号备份计划" #: assets/models/automations/base.py:115 audits/models.py:65 #: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:242 #: ops/templates/ops/celery_task_log.html:101 -#: perms/models/asset_permission.py:78 +#: perms/models/asset_permission.py:78 settings/serializers/feature.py:25 #: settings/templates/ldap/_msg_import_ldap_user.html:5 #: terminal/models/applet/host.py:141 terminal/models/session/session.py:45 #: tickets/models/ticket/apply_application.py:30 @@ -711,7 +711,7 @@ msgstr "密码规则" #: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 -#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183 +#: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 #: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 @@ -855,7 +855,7 @@ msgstr "账号存在策略" #: assets/models/platform.py:95 assets/serializers/asset/common.py:125 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 -#: settings/models.py:36 tickets/models/ticket/apply_application.py:13 +#: settings/models.py:37 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" msgstr "类别" @@ -1039,7 +1039,7 @@ msgstr "关联平台,可配置推送参数,如果不关联,将使用默认 #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 #: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 #: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:39 terminal/models/applet/applet.py:46 +#: settings/models.py:40 terminal/models/applet/applet.py:46 #: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 #: terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 @@ -1241,6 +1241,10 @@ msgstr "告警" msgid "Notify" msgstr "通知" +#: acls/const.py:11 +msgid "Notify and warn" +msgstr "提示并告警" + #: acls/models/base.py:37 assets/models/cmd_filter.py:76 #: terminal/models/component/endpoint.py:112 xpack/plugins/cloud/models.py:314 msgid "Priority" @@ -1296,7 +1300,7 @@ msgid "Regex" msgstr "正则表达式" #: acls/models/command_acl.py:26 assets/models/cmd_filter.py:79 -#: settings/models.py:184 settings/serializers/feature.py:19 +#: settings/models.py:185 settings/serializers/feature.py:20 #: settings/serializers/msg.py:78 xpack/plugins/license/models.py:30 msgid "Content" msgstr "内容" @@ -1600,7 +1604,7 @@ msgstr "脚本" #: assets/const/category.py:10 assets/models/asset/host.py:8 #: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:76 -#: settings/serializers/feature.py:49 settings/serializers/msg.py:30 +#: settings/serializers/feature.py:52 settings/serializers/msg.py:30 #: terminal/models/component/endpoint.py:13 terminal/serializers/applet.py:17 #: xpack/plugins/cloud/manager.py:83 #: xpack/plugins/cloud/serializers/account_attrs.py:72 @@ -1899,7 +1903,7 @@ msgstr "客户端密钥" msgid "Allow invalid cert" msgstr "忽略证书校验" -#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:89 +#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:92 msgid "Proxy" msgstr "代理" @@ -2003,7 +2007,7 @@ msgstr "系统" #: assets/serializers/cagegory.py:24 #: authentication/models/connection_token.py:29 #: authentication/serializers/connect_token_secret.py:125 -#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:35 +#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:36 #: users/models/preference.py:13 msgid "Value" msgstr "值" @@ -2078,7 +2082,7 @@ msgid "Setting" msgstr "设置" #: assets/models/platform.py:38 audits/const.py:59 -#: authentication/backends/passkey/models.py:11 settings/models.py:38 +#: authentication/backends/passkey/models.py:11 settings/models.py:39 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "启用" @@ -4437,7 +4441,7 @@ msgstr "空白" msgid "VCS" msgstr "VCS" -#: ops/const.py:38 ops/models/adhoc.py:44 settings/serializers/feature.py:120 +#: ops/const.py:38 ops/models/adhoc.py:44 settings/serializers/feature.py:123 msgid "Adhoc" msgstr "命令" @@ -4818,7 +4822,7 @@ msgstr "默认组织" msgid "SYSTEM" msgstr "系统组织" -#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:185 +#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:186 #: terminal/models/applet/applet.py:42 msgid "Builtin" msgstr "内置的" @@ -4941,7 +4945,7 @@ msgid "today" msgstr "今天" #: perms/notifications.py:12 perms/notifications.py:44 -#: settings/serializers/feature.py:111 +#: settings/serializers/feature.py:114 msgid "day" msgstr "天" @@ -5133,7 +5137,7 @@ msgstr "工作台" msgid "Audit view" msgstr "审计台" -#: rbac/tree.py:27 settings/models.py:161 +#: rbac/tree.py:27 settings/models.py:162 msgid "System setting" msgstr "系统设置" @@ -5161,7 +5165,7 @@ msgstr "账号改密" msgid "App ops" msgstr "作业中心" -#: rbac/tree.py:57 settings/serializers/feature.py:117 +#: rbac/tree.py:57 settings/serializers/feature.py:120 msgid "Feature" msgstr "功能" @@ -5196,8 +5200,8 @@ msgstr "组织管理" msgid "Ticket comment" msgstr "工单评论" -#: rbac/tree.py:159 settings/serializers/feature.py:98 -#: settings/serializers/feature.py:100 tickets/models/ticket/general.py:308 +#: rbac/tree.py:159 settings/serializers/feature.py:101 +#: settings/serializers/feature.py:103 tickets/models/ticket/general.py:308 msgid "Ticket" msgstr "工单" @@ -5244,75 +5248,75 @@ msgstr "测试手机号 该字段是必填项。" msgid "App Settings" msgstr "系统设置" -#: settings/models.py:37 users/models/preference.py:14 +#: settings/models.py:38 users/models/preference.py:14 msgid "Encrypted" msgstr "加密的" -#: settings/models.py:163 +#: settings/models.py:164 msgid "Can change email setting" msgstr "邮件设置" -#: settings/models.py:164 +#: settings/models.py:165 msgid "Can change auth setting" msgstr "认证设置" -#: settings/models.py:165 +#: settings/models.py:166 msgid "Can change auth ops" msgstr "任务中心设置" -#: settings/models.py:166 +#: settings/models.py:167 msgid "Can change auth ticket" msgstr "工单设置" -#: settings/models.py:167 +#: settings/models.py:168 msgid "Can change virtual app setting" msgstr "可以更改虚拟应用设置" -#: settings/models.py:168 +#: settings/models.py:169 msgid "Can change auth announcement" msgstr "公告设置" -#: settings/models.py:169 +#: settings/models.py:170 msgid "Can change vault setting" msgstr "可以更改 vault 设置" -#: settings/models.py:170 +#: settings/models.py:171 msgid "Can change chat ai setting" msgstr "可以修改聊天 AI 设置" -#: settings/models.py:171 +#: settings/models.py:172 msgid "Can change system msg sub setting" msgstr "消息订阅设置" -#: settings/models.py:172 +#: settings/models.py:173 msgid "Can change sms setting" msgstr "短信设置" -#: settings/models.py:173 +#: settings/models.py:174 msgid "Can change security setting" msgstr "安全设置" -#: settings/models.py:174 +#: settings/models.py:175 msgid "Can change clean setting" msgstr "定期清理" -#: settings/models.py:175 +#: settings/models.py:176 msgid "Can change interface setting" msgstr "界面设置" -#: settings/models.py:176 +#: settings/models.py:177 msgid "Can change license setting" msgstr "许可证设置" -#: settings/models.py:177 +#: settings/models.py:178 msgid "Can change terminal setting" msgstr "终端设置" -#: settings/models.py:178 +#: settings/models.py:179 msgid "Can change other setting" msgstr "其它设置" -#: settings/models.py:188 +#: settings/models.py:189 msgid "Chat prompt" msgstr "聊天提示" @@ -6011,32 +6015,38 @@ msgstr "" msgid "Change secret and push record retention days (day)" msgstr "改密推送记录保留天数 (天)" -#: settings/serializers/feature.py:18 settings/serializers/msg.py:68 +#: settings/serializers/feature.py:19 settings/serializers/msg.py:68 msgid "Subject" msgstr "主题" -#: settings/serializers/feature.py:22 +#: settings/serializers/feature.py:23 msgid "More Link" msgstr "更多信息 URL" -#: settings/serializers/feature.py:36 settings/serializers/feature.py:38 -#: settings/serializers/feature.py:39 +#: settings/serializers/feature.py:26 +#: settings/templates/ldap/_msg_import_ldap_user.html:6 +#: terminal/models/session/session.py:46 +msgid "Date end" +msgstr "结束日期" + +#: settings/serializers/feature.py:39 settings/serializers/feature.py:41 +#: settings/serializers/feature.py:42 msgid "Announcement" msgstr "公告" -#: settings/serializers/feature.py:46 +#: settings/serializers/feature.py:49 msgid "Vault" msgstr "启用 Vault" -#: settings/serializers/feature.py:55 +#: settings/serializers/feature.py:58 msgid "Mount Point" msgstr "挂载点" -#: settings/serializers/feature.py:61 +#: settings/serializers/feature.py:64 msgid "Record limit" msgstr "记录限制" -#: settings/serializers/feature.py:63 +#: settings/serializers/feature.py:66 msgid "" "If the specific value is less than 999 (default), the system will " "automatically perform a task every night: check and delete historical " @@ -6046,74 +6056,74 @@ msgstr "" "若特定数值小于999,系统将在每日晚间自动执行任务:检查并删除超出预定数量的历史" "账号。如果该数值达到或超过999,则不进行任何历史账号的删除操作。" -#: settings/serializers/feature.py:73 settings/serializers/feature.py:79 +#: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" msgstr "聊天 AI" -#: settings/serializers/feature.py:82 +#: settings/serializers/feature.py:85 msgid "GPT Base URL" msgstr "GPT 地址" -#: settings/serializers/feature.py:83 +#: settings/serializers/feature.py:86 msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPT 服务的基本 URL。例如:https://api.openai.com/v1" -#: settings/serializers/feature.py:86 templates/_header_bar.html:96 +#: settings/serializers/feature.py:89 templates/_header_bar.html:96 msgid "API Key" msgstr "API Key" -#: settings/serializers/feature.py:90 +#: settings/serializers/feature.py:93 msgid "" "The proxy server address of the GPT service. For example: http://ip:port" msgstr "GPT 服务的代理服务器地址。例如:http://ip:port" -#: settings/serializers/feature.py:93 +#: settings/serializers/feature.py:96 msgid "GPT Model" msgstr "GPT 模型" -#: settings/serializers/feature.py:102 +#: settings/serializers/feature.py:105 msgid "Approval without login" msgstr "免登录审批" -#: settings/serializers/feature.py:103 +#: settings/serializers/feature.py:106 msgid "Allow direct approval ticket without login" msgstr "允许无需登录直接批准工单" -#: settings/serializers/feature.py:107 +#: settings/serializers/feature.py:110 msgid "Period" msgstr "时段" -#: settings/serializers/feature.py:108 +#: settings/serializers/feature.py:111 msgid "" "The default authorization time period when applying for assets via a ticket" msgstr "工单申请资产的默认授权时间段" -#: settings/serializers/feature.py:111 +#: settings/serializers/feature.py:114 msgid "hour" msgstr "时" -#: settings/serializers/feature.py:112 +#: settings/serializers/feature.py:115 msgid "Unit" msgstr "单位" -#: settings/serializers/feature.py:112 +#: settings/serializers/feature.py:115 msgid "The unit of period" msgstr "执行周期" -#: settings/serializers/feature.py:121 +#: settings/serializers/feature.py:124 msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" msgstr "允许用户在工作台 - 作业中心 - Adhoc 中执行批量命令" -#: settings/serializers/feature.py:125 +#: settings/serializers/feature.py:128 msgid "Command blacklist" msgstr "作业中心命令黑名单" -#: settings/serializers/feature.py:126 +#: settings/serializers/feature.py:129 msgid "Command blacklist in Adhoc" msgstr "作业中心命令黑名单" -#: settings/serializers/feature.py:131 +#: settings/serializers/feature.py:134 #: terminal/models/virtualapp/provider.py:17 #: terminal/models/virtualapp/virtualapp.py:36 #: terminal/models/virtualapp/virtualapp.py:97 @@ -6121,11 +6131,11 @@ msgstr "作业中心命令黑名单" msgid "Virtual app" msgstr "虚拟应用" -#: settings/serializers/feature.py:134 +#: settings/serializers/feature.py:137 msgid "Virtual App" msgstr "虚拟应用" -#: settings/serializers/feature.py:136 +#: settings/serializers/feature.py:139 msgid "" "Virtual applications, you can use the Linux operating system as an " "application server in remote applications." @@ -6582,11 +6592,6 @@ msgstr "注册周期导入 LDAP 用户 任务" msgid "Sync task finish" msgstr "同步任务完成" -#: settings/templates/ldap/_msg_import_ldap_user.html:6 -#: terminal/models/session/session.py:46 -msgid "Date end" -msgstr "结束日期" - #: settings/templates/ldap/_msg_import_ldap_user.html:9 msgid "Synced Organization" msgstr "已同步组织" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 5a9357fda..743469087 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-09-09 14:08+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -16,8 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.3\n" -"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://" -"zhconvert.org\n" +"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://zhconvert.org\n" #: accounts/api/automations/base.py:79 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" @@ -146,7 +145,7 @@ msgid "Access key" msgstr "Access key" #: accounts/const/account.py:9 authentication/backends/passkey/models.py:16 -#: authentication/models/sso_token.py:14 settings/serializers/feature.py:52 +#: authentication/models/sso_token.py:14 settings/serializers/feature.py:55 msgid "Token" msgstr "Token" @@ -188,7 +187,8 @@ msgstr "收集" msgid "Template" msgstr "模板" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "跳過" @@ -316,7 +316,7 @@ msgstr "待定的" msgid "Database" msgstr "資料庫" -#: accounts/const/vault.py:9 settings/serializers/feature.py:43 +#: accounts/const/vault.py:9 settings/serializers/feature.py:46 msgid "HCP Vault" msgstr "HashiCorp Vault" @@ -391,8 +391,8 @@ msgstr "來源 ID" #: assets/serializers/gateway.py:28 audits/models.py:59 #: authentication/api/connection_token.py:411 ops/models/base.py:18 #: perms/models/asset_permission.py:75 settings/serializers/msg.py:33 -#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 -#: terminal/serializers/command.py:72 +#: terminal/backends/command/models.py:18 +#: terminal/models/session/session.py:34 terminal/serializers/command.py:72 #: terminal/templates/terminal/_msg_command_warning.html:8 #: terminal/templates/terminal/_msg_session_sharing.html:8 #: tickets/models/ticket/command_confirm.py:13 @@ -462,7 +462,7 @@ msgstr "帳號備份計劃" #: assets/models/automations/base.py:115 audits/models.py:65 #: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:242 #: ops/templates/ops/celery_task_log.html:101 -#: perms/models/asset_permission.py:78 +#: perms/models/asset_permission.py:78 settings/serializers/feature.py:25 #: settings/templates/ldap/_msg_import_ldap_user.html:5 #: terminal/models/applet/host.py:141 terminal/models/session/session.py:45 #: tickets/models/ticket/apply_application.py:30 @@ -713,11 +713,13 @@ msgstr "密碼規則" #: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 -#: rbac/serializers/role.py:28 settings/models.py:34 settings/models.py:183 +#: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:85 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -792,8 +794,7 @@ msgstr "登錄資產時,帳號使用者名稱與使用者使用者名稱相同 msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "" -"連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" +msgstr "連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -810,9 +811,7 @@ msgid "" "{} - The account backup passage task has been completed: the encryption " "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" -msgstr "" -"{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中" -"設置文件加密密碼" +msgstr "{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中設置文件加密密碼" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -829,9 +828,7 @@ msgid "" "{} - The encryption change task has been completed: the encryption password " "has not been set - please go to personal information -> set encryption " "password in preferences" -msgstr "" -"{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密" -"碼" +msgstr "{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密碼" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -857,7 +854,7 @@ msgstr "帳號存在策略" #: assets/models/platform.py:95 assets/serializers/asset/common.py:125 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 -#: settings/models.py:36 tickets/models/ticket/apply_application.py:13 +#: settings/models.py:37 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" msgstr "類別" @@ -869,9 +866,9 @@ msgstr "類別" #: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: authentication/serializers/connect_token_secret.py:126 +#: ops/models/job.py:150 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -943,9 +940,10 @@ msgstr "ID" #: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 -#: audits/models.py:90 audits/models.py:172 audits/models.py:271 -#: audits/serializers.py:171 authentication/models/connection_token.py:32 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:54 audits/models.py:90 audits/models.py:172 +#: audits/models.py:271 audits/serializers.py:171 +#: authentication/models/connection_token.py:32 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 @@ -994,9 +992,7 @@ msgstr "密鑰密碼" msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." -msgstr "" -"提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 " -"username@domain" +msgstr "提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 username@domain" #: accounts/serializers/account/template.py:13 msgid "Password length" @@ -1039,11 +1035,11 @@ msgid "" msgstr "關聯平台,可配置推送參數,如果不關聯,將使用默認參數" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 -#: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:39 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:25 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:26 ops/models/job.py:158 ops/models/playbook.py:31 +#: rbac/models/role.py:37 settings/models.py:40 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:332 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 @@ -1058,13 +1054,13 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號" -"密碼 > 登錄密碼 > 手動輸入
為了安全起見,請設置配置項 " -"CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" +"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號密碼 > 登錄密碼 > 手動輸入
" +"為了安全起見,請設置配置項 CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" #: accounts/serializers/automations/base.py:23 #: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 -#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 +#: assets/serializers/automations/base.py:21 +#: perms/serializers/permission.py:36 msgid "Nodes" msgstr "節點" @@ -1139,10 +1135,7 @@ msgstr "週期清理改密記錄和推送記錄" #: accounts/tasks/automation.py:87 msgid "Clean change secret and push record period description" msgstr "" -"系統會定期清理不必要的變更密文記錄和推播記錄,包括與變更任務、執行記錄、資" -"產、帳戶相關的記錄。當任何這些關聯項被刪除時,相應的變更秘密和推送記錄將變得" -"無效。因此,為了保持資料庫整潔、高效,系統預設每180天自動清理一次這些無效記" -"錄。這種定期清理過程有助於釋放儲存空間並提高資料管理的安全性和整體效能。" +"系統會定期清理不必要的變更密文記錄和推播記錄,包括與變更任務、執行記錄、資產、帳戶相關的記錄。當任何這些關聯項被刪除時,相應的變更秘密和推送記錄將變得無效。因此,為了保持資料庫整潔、高效,系統預設每180天自動清理一次這些無效記錄。這種定期清理過程有助於釋放儲存空間並提高資料管理的安全性和整體效能。" #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" @@ -1209,8 +1202,8 @@ msgstr "你好! 以下是資產改密或推送帳戶失敗的情況。 請及 #: accounts/utils.py:52 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." msgstr "如果密碼以 `{{` 開始,並且以 `}}` 結束,則該密碼是不允許的。" #: accounts/utils.py:59 @@ -1242,6 +1235,10 @@ msgstr "警報" msgid "Notify" msgstr "通知" +#: acls/const.py:11 +msgid "Notify and warn" +msgstr "提示並警告" + #: acls/models/base.py:37 assets/models/cmd_filter.py:76 #: terminal/models/component/endpoint.py:112 xpack/plugins/cloud/models.py:314 msgid "Priority" @@ -1297,7 +1294,7 @@ msgid "Regex" msgstr "正則表達式" #: acls/models/command_acl.py:26 assets/models/cmd_filter.py:79 -#: settings/models.py:184 settings/serializers/feature.py:19 +#: settings/models.py:185 settings/serializers/feature.py:20 #: settings/serializers/msg.py:78 xpack/plugins/license/models.py:30 msgid "Content" msgstr "內容" @@ -1377,8 +1374,8 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" -"db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " +"2001:db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1406,8 +1403,8 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" -"db8:2de::e13, 2001:db8:1a:1110::/64" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " +"2001:db8:2de::e13, 2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 @@ -1446,9 +1443,7 @@ msgid "" "Please review the login activity to ensure the security and proper usage of " "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." -msgstr "" -"請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任" -"何可疑行為,請立即採取必要的行動。" +msgstr "請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任何可疑行為,請立即採取必要的行動。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -1569,7 +1564,7 @@ msgstr "未知" #: assets/const/automation.py:7 msgid "OK" -msgstr "" +msgstr "Success" #: assets/const/automation.py:12 msgid "Ping" @@ -1601,7 +1596,7 @@ msgstr "腳本" #: assets/const/category.py:10 assets/models/asset/host.py:8 #: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:76 -#: settings/serializers/feature.py:49 settings/serializers/msg.py:30 +#: settings/serializers/feature.py:52 settings/serializers/msg.py:30 #: terminal/models/component/endpoint.py:13 terminal/serializers/applet.py:17 #: xpack/plugins/cloud/manager.py:83 #: xpack/plugins/cloud/serializers/account_attrs.py:72 @@ -1683,8 +1678,7 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶" -"的主目錄
-${USER}用戶的使用者名稱" +"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶的主目錄
-${USER}用戶的使用者名稱" #: assets/const/protocol.py:75 msgid "Console" @@ -1705,18 +1699,17 @@ msgstr "安全" #: assets/const/protocol.py:83 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式" -"
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 Windows 伺服器或需要標準 " -"Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP 認證和加密
NLA
此" -"模式使用 TLS 加密,並要求提前提供用戶名和密碼
" +"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 " +"Windows 伺服器或需要標準 Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP " +"認證和加密
NLA
此模式使用 TLS 加密,並要求提前提供用戶名和密碼
" #: assets/const/protocol.py:100 msgid "AD domain" @@ -1792,8 +1785,7 @@ msgstr "安全模式" msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "" -"當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" +msgstr "當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" #: assets/const/protocol.py:269 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -1900,7 +1892,7 @@ msgstr "用戶端金鑰" msgid "Allow invalid cert" msgstr "忽略證書校驗" -#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:89 +#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:92 msgid "Proxy" msgstr "代理" @@ -2004,7 +1996,7 @@ msgstr "系統" #: assets/serializers/cagegory.py:24 #: authentication/models/connection_token.py:29 #: authentication/serializers/connect_token_secret.py:125 -#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:35 +#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:36 #: users/models/preference.py:13 msgid "Value" msgstr "值" @@ -2079,7 +2071,7 @@ msgid "Setting" msgstr "設置" #: assets/models/platform.py:38 audits/const.py:59 -#: authentication/backends/passkey/models.py:11 settings/models.py:38 +#: authentication/backends/passkey/models.py:11 settings/models.py:39 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "啟用" @@ -2242,11 +2234,9 @@ msgstr "默認資料庫" #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" -msgstr "" -"如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://" -"host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" +msgstr "如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2418,9 +2408,7 @@ msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " "root" -msgstr "" -"在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切" -"換到 root 一樣" +msgstr "在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切換到 root 一樣" #: assets/serializers/platform.py:205 msgid "Assets can be connected using a zone gateway" @@ -2468,7 +2456,8 @@ msgstr "檢查節點下資產數量" #: assets/tasks/nodes_amount.py:28 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" +"The task of self-checking is already running and cannot be started " +"repeatedly" msgstr "自檢程序已經在運行,不能重複啟動" #: assets/tasks/nodes_amount.py:33 @@ -2509,7 +2498,8 @@ msgid "App Audits" msgstr "日志审计" #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "文字內容太長。請使用 Elasticsearch 儲存操作日誌" #: audits/backends/db.py:108 @@ -2602,8 +2592,8 @@ msgstr "結束" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:78 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:55 terminal/serializers/session.py:78 msgid "Terminal" msgstr "終端" @@ -2642,7 +2632,8 @@ msgid "Job audit log" msgstr "作業審計日誌" #: audits/models.py:56 audits/models.py:100 audits/models.py:175 -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:113 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:113 msgid "Remote addr" msgstr "遠端地址" @@ -2974,7 +2965,8 @@ msgstr "附加" #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:26 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後使用日期" @@ -3049,8 +3041,7 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳" -"號將被臨時 鎖定 {block_time} 分鐘)" +"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳號將被臨時 鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" @@ -3067,10 +3058,9 @@ msgstr "IP 已被鎖定 (請聯絡管理員解鎖或 {} 分鐘後重試)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" -msgstr "" -"{error},您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" +msgstr "{error},您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3478,8 +3468,8 @@ msgstr "創建類型" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" +"Please download the private key after creation. Each private key can only be" +" downloaded once" msgstr "創建完成後請下載私鑰,每個私鑰僅有一次下載機會" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 @@ -3837,10 +3827,9 @@ msgstr "退出登錄成功,返回到登入頁面" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" -msgstr "" -"為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" +msgstr "為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" #: authentication/views/slack.py:35 authentication/views/slack.py:118 msgid "Slack Error" @@ -3946,13 +3935,12 @@ msgstr "加密的欄位" #: common/db/fields.py:577 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 " -"{'type': 'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': " -"'1.1.1.1'}}" +"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 {'type': " +"'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': '1.1.1.1'}}" #: common/db/fields.py:584 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4241,8 +4229,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Luna是單獨部署的一個程序,你需要部署luna,koko,
如果你看到了" -"這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Luna是單獨部署的一個程序,你需要部署luna,koko, " +"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" @@ -4254,8 +4242,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發,
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發, " +"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: labels/apps.py:8 msgid "App Labels" @@ -4437,7 +4425,7 @@ msgstr "空白" msgid "VCS" msgstr "VCS" -#: ops/const.py:38 ops/models/adhoc.py:44 settings/serializers/feature.py:120 +#: ops/const.py:38 ops/models/adhoc.py:44 settings/serializers/feature.py:123 msgid "Adhoc" msgstr "命令" @@ -4804,7 +4792,8 @@ msgstr "請選擇一個組織後再保存" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:52 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:60 msgid "Organization" msgstr "組織" @@ -4820,7 +4809,7 @@ msgstr "默認組織" msgid "SYSTEM" msgstr "系統組織" -#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:185 +#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:186 #: terminal/models/applet/applet.py:42 msgid "Builtin" msgstr "內建的" @@ -4943,7 +4932,7 @@ msgid "today" msgstr "今天" #: perms/notifications.py:12 perms/notifications.py:44 -#: settings/serializers/feature.py:111 +#: settings/serializers/feature.py:114 msgid "day" msgstr "天" @@ -5135,7 +5124,7 @@ msgstr "工作檯" msgid "Audit view" msgstr "審計台" -#: rbac/tree.py:27 settings/models.py:161 +#: rbac/tree.py:27 settings/models.py:162 msgid "System setting" msgstr "系統設置" @@ -5163,7 +5152,7 @@ msgstr "帳號改密" msgid "App ops" msgstr "作業中心" -#: rbac/tree.py:57 settings/serializers/feature.py:117 +#: rbac/tree.py:57 settings/serializers/feature.py:120 msgid "Feature" msgstr "功能" @@ -5198,8 +5187,8 @@ msgstr "組織管理" msgid "Ticket comment" msgstr "工單評論" -#: rbac/tree.py:159 settings/serializers/feature.py:98 -#: settings/serializers/feature.py:100 tickets/models/ticket/general.py:308 +#: rbac/tree.py:159 settings/serializers/feature.py:101 +#: settings/serializers/feature.py:103 tickets/models/ticket/general.py:308 msgid "Ticket" msgstr "工單管理" @@ -5246,75 +5235,75 @@ msgstr "測試手機號碼 該欄位是必填項。" msgid "App Settings" msgstr "System Settings" -#: settings/models.py:37 users/models/preference.py:14 +#: settings/models.py:38 users/models/preference.py:14 msgid "Encrypted" msgstr "加密的" -#: settings/models.py:163 +#: settings/models.py:164 msgid "Can change email setting" msgstr "郵件設置" -#: settings/models.py:164 +#: settings/models.py:165 msgid "Can change auth setting" msgstr "認證設置" -#: settings/models.py:165 +#: settings/models.py:166 msgid "Can change auth ops" msgstr "任務中心設置" -#: settings/models.py:166 +#: settings/models.py:167 msgid "Can change auth ticket" msgstr "工單設置" -#: settings/models.py:167 +#: settings/models.py:168 msgid "Can change virtual app setting" msgstr "可以更改虛擬應用設定" -#: settings/models.py:168 +#: settings/models.py:169 msgid "Can change auth announcement" msgstr "公告設置" -#: settings/models.py:169 +#: settings/models.py:170 msgid "Can change vault setting" msgstr "可以更改 vault 設置" -#: settings/models.py:170 +#: settings/models.py:171 msgid "Can change chat ai setting" msgstr "可以修改聊天 AI 設置" -#: settings/models.py:171 +#: settings/models.py:172 msgid "Can change system msg sub setting" msgstr "消息訂閱設置" -#: settings/models.py:172 +#: settings/models.py:173 msgid "Can change sms setting" msgstr "簡訊設置" -#: settings/models.py:173 +#: settings/models.py:174 msgid "Can change security setting" msgstr "安全設定" -#: settings/models.py:174 +#: settings/models.py:175 msgid "Can change clean setting" msgstr "定期清理" -#: settings/models.py:175 +#: settings/models.py:176 msgid "Can change interface setting" msgstr "界面設置" -#: settings/models.py:176 +#: settings/models.py:177 msgid "Can change license setting" msgstr "許可證設置" -#: settings/models.py:177 +#: settings/models.py:178 msgid "Can change terminal setting" msgstr "終端設置" -#: settings/models.py:178 +#: settings/models.py:179 msgid "Can change other setting" msgstr "其它設置" -#: settings/models.py:188 +#: settings/models.py:189 msgid "Chat prompt" msgstr "聊天提示" @@ -5384,9 +5373,7 @@ msgid "" "authentication service platform does not return the user's email " "information, the system will automatically create the user using this email " "suffix" -msgstr "" -"第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系" -"統將自動以此電子信箱後綴建立使用者" +msgstr "第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系統將自動以此電子信箱後綴建立使用者" #: settings/serializers/auth/base.py:36 msgid "Forgot Password URL" @@ -5405,16 +5392,13 @@ msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "" -"Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前" -"是否顯示 Flash 頁面" +msgstr "Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前是否顯示 Flash 頁面" #: settings/serializers/auth/base.py:54 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "" -"建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" +msgstr "建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" @@ -5446,7 +5430,8 @@ msgstr "使用者名稱屬性" msgid "Enable attributes map" msgstr "啟用屬性映射" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 #: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 #: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 @@ -5458,9 +5443,7 @@ msgstr "映射屬性" msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer " -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -5480,17 +5463,13 @@ msgstr "啟用釘釘認證" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使" -"用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使用者屬性名稱" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使" -"用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使用者屬性名稱" #: settings/serializers/auth/lark.py:13 users/models/user/_source.py:21 msgid "Lark" @@ -5500,9 +5479,7 @@ msgstr "" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務" -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務使用者屬性名稱" #: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" @@ -5547,9 +5524,7 @@ msgstr "可能的選項是(cn或uid或sAMAccountName=%(user)s)" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務" -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務使用者屬性名稱" #: settings/serializers/auth/ldap.py:84 msgid "Connect timeout (s)" @@ -5562,12 +5537,11 @@ msgstr "快取逾時時間 (秒)" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" -"對於使用者登錄認證時查詢的使用者 DN 進行快取,可以有效提高使用者認證的速度" -"
如果使用者 OU 架構已調整,請點擊提交以清除使用者 DN 快取" +"對於使用者登錄認證時查詢的使用者 DN 進行快取,可以有效提高使用者認證的速度
如果使用者 OU 架構已調整,請點擊提交以清除使用者 DN 快取" #: settings/serializers/auth/ldap.py:97 msgid "Search paged size (piece)" @@ -5618,19 +5592,18 @@ msgid "End session endpoint" msgstr "Logout session endpoint address" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "當使用者退出時,他們也會從 OAuth2 伺服器退出" #: settings/serializers/auth/oauth2.py:62 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服" -"務使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服務使用者屬性名稱" -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "總是更新用戶資訊" @@ -5662,9 +5635,7 @@ msgstr "Ignore SSL certificate verification" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" -msgstr "" -"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務" -"使用者屬性名稱" +msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務使用者屬性名稱" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -5682,8 +5653,7 @@ msgstr "使用 Keycloak" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "" -"使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" +msgstr "使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -5742,8 +5712,7 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 " -"DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" +"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -5759,7 +5728,8 @@ msgid "OTP in RADIUS" msgstr "Use Radius OTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" msgstr "* 在 RADIUS 中使用 OTP 意味著使用者可以利用 RADIUS 作為 MFA 的方法 " #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 @@ -5790,9 +5760,7 @@ msgstr "SP 證書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -" 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 " -"JumpServer 使用者屬性名稱" +msgstr " 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -5802,9 +5770,7 @@ msgstr "當使用者登出時,他們也會從 SAML2 伺服器登出" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服" -"務使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服務使用者屬性名稱" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -5869,12 +5835,10 @@ msgstr "業務型態(Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." -msgstr "" -"模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 " -"{code}, 有效期為5分鐘。請不要洩露給其他人。" +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." +msgstr "模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 {code}, 有效期為5分鐘。請不要洩露給其他人。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -5910,9 +5874,7 @@ msgstr "單位: 秒" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" -msgstr "" -"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服" -"務使用者屬性名稱" +msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服務使用者屬性名稱" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -5920,8 +5882,8 @@ msgstr "目前網站 URL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" msgstr "站點 URL 是目前產品服務的外部可訪問地址,通常在系統郵件的連結中使用" #: settings/serializers/basic.py:18 @@ -6006,116 +5968,121 @@ msgstr "會話日誌 (天)" msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." -msgstr "" -"會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" +msgstr "會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" msgstr "改密推送記錄保留天數 (天)" -#: settings/serializers/feature.py:18 settings/serializers/msg.py:68 +#: settings/serializers/feature.py:19 settings/serializers/msg.py:68 msgid "Subject" msgstr "主題" -#: settings/serializers/feature.py:22 +#: settings/serializers/feature.py:23 msgid "More Link" msgstr "更多資訊 URL" -#: settings/serializers/feature.py:36 settings/serializers/feature.py:38 -#: settings/serializers/feature.py:39 +#: settings/serializers/feature.py:26 +#: settings/templates/ldap/_msg_import_ldap_user.html:6 +#: terminal/models/session/session.py:46 +msgid "Date end" +msgstr "結束日期" + +#: settings/serializers/feature.py:39 settings/serializers/feature.py:41 +#: settings/serializers/feature.py:42 msgid "Announcement" msgstr "公告" -#: settings/serializers/feature.py:46 +#: settings/serializers/feature.py:49 msgid "Vault" msgstr "啟用 Vault" -#: settings/serializers/feature.py:55 +#: settings/serializers/feature.py:58 msgid "Mount Point" msgstr "掛載點" -#: settings/serializers/feature.py:61 +#: settings/serializers/feature.py:64 msgid "Record limit" msgstr "紀錄限制" -#: settings/serializers/feature.py:63 +#: settings/serializers/feature.py:66 msgid "" "If the specific value is less than 999 (default), the system will " "automatically perform a task every night: check and delete historical " "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷" -"史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" +"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" -#: settings/serializers/feature.py:73 settings/serializers/feature.py:79 +#: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" msgstr "聊天 AI" -#: settings/serializers/feature.py:82 +#: settings/serializers/feature.py:85 msgid "GPT Base URL" msgstr "GPT 地址" -#: settings/serializers/feature.py:83 -msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" +#: settings/serializers/feature.py:86 +msgid "" +"The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPT 服務的基礎 URL。例如:https://api.openai.com/v1" -#: settings/serializers/feature.py:86 templates/_header_bar.html:96 +#: settings/serializers/feature.py:89 templates/_header_bar.html:96 msgid "API Key" msgstr "API Key" -#: settings/serializers/feature.py:90 +#: settings/serializers/feature.py:93 msgid "" "The proxy server address of the GPT service. For example: http://ip:port" msgstr "GPT 服務的代理伺服器地址。例如:http://ip:port" -#: settings/serializers/feature.py:93 +#: settings/serializers/feature.py:96 msgid "GPT Model" msgstr "GPT 模型" -#: settings/serializers/feature.py:102 +#: settings/serializers/feature.py:105 msgid "Approval without login" msgstr "免登入審核" -#: settings/serializers/feature.py:103 +#: settings/serializers/feature.py:106 msgid "Allow direct approval ticket without login" msgstr "允許無需登入直接批准工單" -#: settings/serializers/feature.py:107 +#: settings/serializers/feature.py:110 msgid "Period" msgstr "時段" -#: settings/serializers/feature.py:108 +#: settings/serializers/feature.py:111 msgid "" "The default authorization time period when applying for assets via a ticket" msgstr "工單申請資產的預設授權時間段" -#: settings/serializers/feature.py:111 +#: settings/serializers/feature.py:114 msgid "hour" msgstr "時" -#: settings/serializers/feature.py:112 +#: settings/serializers/feature.py:115 msgid "Unit" msgstr "單位" -#: settings/serializers/feature.py:112 +#: settings/serializers/feature.py:115 msgid "The unit of period" msgstr "執行週期" -#: settings/serializers/feature.py:121 +#: settings/serializers/feature.py:124 msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" msgstr "允許使用者在工作台 - 作業中心 - Adhoc 中執行批量指令" -#: settings/serializers/feature.py:125 +#: settings/serializers/feature.py:128 msgid "Command blacklist" msgstr "作業中心命令黑名單" -#: settings/serializers/feature.py:126 +#: settings/serializers/feature.py:129 msgid "Command blacklist in Adhoc" msgstr "作業中心指令黑名單" -#: settings/serializers/feature.py:131 +#: settings/serializers/feature.py:134 #: terminal/models/virtualapp/provider.py:17 #: terminal/models/virtualapp/virtualapp.py:36 #: terminal/models/virtualapp/virtualapp.py:97 @@ -6123,11 +6090,11 @@ msgstr "作業中心指令黑名單" msgid "Virtual app" msgstr "虛擬應用" -#: settings/serializers/feature.py:134 +#: settings/serializers/feature.py:137 msgid "Virtual App" msgstr "虛擬應用" -#: settings/serializers/feature.py:136 +#: settings/serializers/feature.py:139 msgid "" "Virtual applications, you can use the Linux operating system as an " "application server in remote applications." @@ -6169,8 +6136,7 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這" -"種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" +"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -6180,9 +6146,7 @@ msgstr "使用 TLS" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "" -"與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 " -"587 上" +msgstr "與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 587 上" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -6190,8 +6154,8 @@ msgstr "主題前綴" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" msgstr "提示: 創建用戶時,發送設置密碼郵件的主題 (例如: 創建用戶成功)" #: settings/serializers/msg.py:73 @@ -6207,8 +6171,7 @@ msgstr "提示: 創建用戶時,發送設置密碼郵件的敬語 (例如: 你 msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "" -"提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" +msgstr "提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -6224,9 +6187,7 @@ msgstr "顯示未分組節點" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" -msgstr "" -"放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問" -"題" +msgstr "放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問題" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -6237,9 +6198,7 @@ msgid "" "If the user does not update the password during the time, the user password " "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" -msgstr "" -"如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過" -"期前5天內由系統 (每天)自動發送給用戶" +msgstr "如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過期前5天內由系統 (每天)自動發送給用戶" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -6309,9 +6268,7 @@ msgid "" "users of other authentication methods except local authentication methods " "are allowed to log in and automatically create users (if the user does not " "exist)" -msgstr "" -"如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方" -"式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" +msgstr "如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -6319,13 +6276,12 @@ msgstr "僅從用戶來源登錄" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順" -"序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" +"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -6394,9 +6350,7 @@ msgstr "啟用登入附加碼" msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "" -"密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密" -"碼+6位數字 完成認證" +msgstr "密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密碼+6位數字 完成認證" #: settings/serializers/security.py:158 msgid "Login captcha" @@ -6412,12 +6366,10 @@ msgstr "異地登入通知" #: settings/serializers/security.py:164 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" -msgstr "" -"根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地" -"登錄提醒" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" +msgstr "根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地登錄提醒" #: settings/serializers/security.py:170 msgid "Auto Disable Threshold (day)" @@ -6501,8 +6453,8 @@ msgstr "元件註冊" #: settings/serializers/terminal.py:24 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" +"Allow component register, after all component setup, you should disable this" +" for security" msgstr "是否允許元件註冊,當所有終端啟動後,為了安全應該關閉" #: settings/serializers/terminal.py:30 @@ -6514,11 +6466,11 @@ msgstr "* 允許用戶透過密碼驗證登入KoKo元件" msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" -"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)" -"已啟用,則應禁用此選項,以防止用戶從 AD/LDAP 伺服器中刪除後再次登入" +"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)已啟用,則應禁用此選項,以防止用戶從 AD/LDAP " +"伺服器中刪除後再次登入" #: settings/serializers/terminal.py:43 msgid "Asset sorting" @@ -6530,21 +6482,18 @@ msgstr "資產列表每頁數量" #: settings/serializers/terminal.py:51 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" -msgstr "" -"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" -"產時顯示 DB 客戶端啟動方法" +msgstr "* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示 DB 客戶端啟動方法" #: settings/serializers/terminal.py:59 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" -"產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" +"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" #: settings/serializers/terminal.py:66 msgid "Client connection" @@ -6553,10 +6502,9 @@ msgstr "客戶端連接" #: settings/serializers/terminal.py:68 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" -msgstr "" -"* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界" -"面將顯示 SSH 客戶端啟動方法" +"Luna page will display the SSH client launch method when connecting to " +"assets" +msgstr "* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界面將顯示 SSH 客戶端啟動方法" #: settings/serializers/tool.py:10 msgid "Tool" @@ -6568,8 +6516,8 @@ msgstr "工作台中的工具" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" msgstr "*! 如果啟用,具有 RBAC 權限的用戶將能夠使用工作台中的所有工具" #: settings/tasks/ldap.py:28 @@ -6584,11 +6532,6 @@ msgstr "註冊週期匯入 LDAP 用戶 任務" msgid "Sync task finish" msgstr "同步動作完成" -#: settings/templates/ldap/_msg_import_ldap_user.html:6 -#: terminal/models/session/session.py:46 -msgid "Date end" -msgstr "結束日期" - #: settings/templates/ldap/_msg_import_ldap_user.html:9 msgid "Synced Organization" msgstr "已同步組織" @@ -6788,13 +6731,11 @@ msgstr "過期。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" 您的密碼已經過期,請點擊 連結 更新密碼\n" +" 您的密碼已經過期,請點擊 連結 更新密碼\n" " " #: templates/_message.html:30 @@ -6805,39 +6746,33 @@ msgstr "您的密碼將於" #, python-format msgid "" "\n" -" please click this " -"link to update your password.\n" +" please click this link to update your password.\n" " " msgstr "" "\n" -" 請點擊 連結 更" -"新密碼\n" +" 請點擊 連結 更新密碼\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" 你的資訊不完整,請點擊 連結 " -" 補充完整\n" +" 你的資訊不完整,請點擊 連結 補充完整\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" 您的SSH金鑰沒有設置或已失效,請點擊 連結 更新\n" +" 您的SSH金鑰沒有設置或已失效,請點擊 連結 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -6868,9 +6803,7 @@ msgstr "用戶端" msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" -msgstr "" -"JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH " -"用戶端,Telnet 會在未來支持" +msgstr "JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH 用戶端,Telnet 會在未來支持" #: templates/resource_download.html:35 msgid "Microsoft" @@ -7316,7 +7249,8 @@ msgstr "可以下載會話錄影" msgid "Account ID" msgstr "帳號" -#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:37 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "登錄來源" @@ -7365,8 +7299,8 @@ msgstr "操作權限" msgid "Origin" msgstr "來源" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:261 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:261 msgid "Session sharing" msgstr "會話分享" @@ -7479,19 +7413,15 @@ msgstr "Core 服務地址" #: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段," -"建議填寫內網地址,否則填寫當前站點 URL
例如:https://172.16.10.110 or " -"https://dev.jumpserver.com" +"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段,建議填寫內網地址,否則填寫當前站點 " +"URL
例如:https://172.16.10.110 or https://dev.jumpserver.com" #: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -7521,9 +7451,7 @@ msgstr "RDS 最大斷開時間(毫秒)" msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "" -"提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒" -"後註銷會話)" +msgstr "提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒後註銷會話)" #: terminal/serializers/applet_host.py:60 msgid "RDS Remote App Logoff Time Limit (ms)" @@ -7531,11 +7459,9 @@ msgstr "RDS 遠程應用註銷時間限制(毫秒)" #: terminal/serializers/applet_host.py:62 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." -msgstr "" -"提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即" -"註銷會話)" +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." +msgstr "提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即註銷會話)" #: terminal/serializers/applet_host.py:71 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 @@ -7544,16 +7470,15 @@ msgstr "負載狀態" #: terminal/serializers/applet_host.py:85 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" -"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用" -"戶都有一個專用帳號。 另一種是公共的,當應用不支持多開且專用的已經被使用時,會" -"使用公共帳號連接;
注意: 如果不開啟自動創建帳號, 當前發布機僅能被指定標" -"簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" +"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用戶都有一個專用帳號。 " +"另一種是公共的,當應用不支持多開且專用的已經被使用時,會使用公共帳號連接;
注意: 如果不開啟自動創建帳號, " +"當前發布機僅能被指定標簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" #: terminal/serializers/applet_host.py:92 msgid "The number of public accounts created automatically" @@ -7565,8 +7490,7 @@ msgid "" "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 " -"CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" +"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" #: terminal/serializers/applet_host.py:137 msgid "Install applets" @@ -7616,23 +7540,19 @@ msgstr "Oracle 埠範圍" msgid "" "Oracle proxy server listen port is dynamic, Each additional Oracle database " "instance adds a port listener" -msgstr "" -"Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠" -"監聽" +msgstr "Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠監聽" #: terminal/serializers/endpoint.py:38 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" -msgstr "" -"連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許" -"修改主機)" +msgstr "連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許修改主機)" #: terminal/serializers/endpoint.py:64 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "該 IP 範圍內的資產,將使用下面的端點進行連接" #: terminal/serializers/endpoint.py:65 @@ -7735,8 +7655,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"如果有多個主機,請用逗號 (,) 分隔它們。
(例如:http://www.jumpserver.a." -"com:9100,http://www.jumpserver.b.com:9100)" +"如果有多個主機,請用逗號 (,) " +"分隔它們。
(例如:http://www.jumpserver.a.com:9100,http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -7938,14 +7858,12 @@ msgid "" "No available port is matched. The number of databases may have exceeded the " "number of ports open to the database agent service, Contact the " "administrator to open more ports." -msgstr "" -"未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管" -"理員開放更多埠。" +msgstr "未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管理員開放更多埠。" #: terminal/utils/db_port_mapper.py:116 msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." +"No ports can be used, check and modify the limit on the number of ports that" +" Magnus listens on in the configuration file." msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。" #: terminal/utils/db_port_mapper.py:118 @@ -8008,8 +7926,7 @@ msgstr "工單已經關閉" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "" -"通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" +msgstr "通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -8354,9 +8271,7 @@ msgid "" "When enabled, you will enter the MFA binding process the next time you log " "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" -msgstr "" -"啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速" -"修改->設置 MFA 多因子認證)中直接綁定!" +msgstr "啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速修改->設置 MFA 多因子認證)中直接綁定!" #: users/forms/profile.py:59 msgid "* Enable MFA to make the account more secure." @@ -8364,12 +8279,10 @@ msgstr "* 啟用 MFA 多因子認證,使帳號更加安全。" #: users/forms/profile.py:68 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" -msgstr "" -"為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:" -"設置複雜密碼,並啟用 MFA 多因子認證)" +msgstr "為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:設置複雜密碼,並啟用 MFA 多因子認證)" #: users/forms/profile.py:82 users/serializers/preference/lina.py:21 msgid "New password" @@ -8522,8 +8435,8 @@ msgstr "終端主題名稱" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" "File Encryption Password, when the system sends mails containing file " "attachments, use this password for decryption.
For example: Account " @@ -8576,9 +8489,7 @@ msgid "" "Determines whether the client computer should scale the content on the " "remote computer to fit the window size of the client computer when the " "window is resized." -msgstr "" -"確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機" -"的窗口大小" +msgstr "確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機的窗口大小" #: users/serializers/preference/luna.py:59 msgid "Remote app connect method" @@ -8622,10 +8533,11 @@ msgstr "系統角色" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" +"System roles are roles at the system level, and they will take effect across" +" all organizations" msgstr "" -"System role is a system-level role, it will be effective in all organizations" +"System role is a system-level role, it will be effective in all " +"organizations" #: users/serializers/user.py:61 msgid "Org roles" @@ -8636,8 +8548,8 @@ msgid "" "Org roles are roles at the organization level, and they will only take " "effect within current organization" msgstr "" -"Organization role is an organization-level role, it is only effective within " -"the current organization" +"Organization role is an organization-level role, it is only effective within" +" the current organization" #: users/serializers/user.py:70 msgid "Organizations and roles" @@ -8697,8 +8609,8 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"User origin identifies the location where the user was created. It can be AD " -"or other sources. Security settings can restrict users to log in to the " +"User origin identifies the location where the user was created. It can be AD" +" or other sources. Security settings can restrict users to log in to the " "system only from designated sources." #: users/serializers/user.py:266 @@ -8723,7 +8635,8 @@ msgstr "認證" #: users/serializers/user.py:426 msgid "" -"* For security, only a partial of users is displayed. You can search for more" +"* For security, only a partial of users is displayed. You can search for " +"more" msgstr "" "*For security reasons, only a portion of users is displayed. You can search " "for more" @@ -8735,10 +8648,8 @@ msgstr "名稱重複" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." -msgstr "" -"管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" +" and the current user is not in the user list. Please contact the administrator." +msgstr "管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" #: users/signal_handlers.py:193 msgid "Clean up expired user sessions" @@ -8896,8 +8807,8 @@ msgstr "綁定MFA驗證器" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" msgstr "使用 MFA 驗證器應用掃描以下二維碼,獲取6位驗證碼" #: users/templates/users/user_otp_enable_bind.html:22 @@ -8982,8 +8893,8 @@ msgstr "使用者名稱或密碼無效" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" msgstr "非本地用戶僅允許從第三方平台登錄,不支持修改密碼: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 @@ -9207,8 +9118,7 @@ msgstr "同步地區" #: xpack/plugins/cloud/manager.py:115 #, python-format msgid "Get instances of region \"%s\" error, error: %s" -msgstr "" -"An error occurred while getting the instances of Region \"%s\", Error: %s" +msgstr "An error occurred while getting the instances of Region \"%s\", Error: %s" #: xpack/plugins/cloud/manager.py:157 #, python-format @@ -9353,7 +9263,8 @@ msgstr "實例" msgid "Sync instance detail" msgstr "同步實例詳情" -#: xpack/plugins/cloud/models.py:311 xpack/plugins/cloud/serializers/task.py:77 +#: xpack/plugins/cloud/models.py:311 +#: xpack/plugins/cloud/serializers/task.py:77 msgid "Rule relation" msgstr "條件關係" @@ -9409,7 +9320,8 @@ msgstr "規則匹配" msgid "Rule value" msgstr "規則值" -#: xpack/plugins/cloud/models.py:381 xpack/plugins/cloud/serializers/task.py:80 +#: xpack/plugins/cloud/models.py:381 +#: xpack/plugins/cloud/serializers/task.py:80 msgid "Strategy rule" msgstr "條件" @@ -9425,7 +9337,8 @@ msgstr "動作屬性" msgid "Action value" msgstr "動作值" -#: xpack/plugins/cloud/models.py:407 xpack/plugins/cloud/serializers/task.py:83 +#: xpack/plugins/cloud/models.py:407 +#: xpack/plugins/cloud/serializers/task.py:83 msgid "Strategy action" msgstr "動作" @@ -9702,9 +9615,7 @@ msgid "" "The port is used to detect the validity of the IP address. When the " "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." -msgstr "" -"埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如" -"果埠為 0,則表示所有 IP 地址均有效。" +msgstr "埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如果埠為 0,則表示所有 IP 地址均有效。" #: xpack/plugins/cloud/serializers/account_attrs.py:190 msgid "Hostname prefix" diff --git a/apps/i18n/koko/en.json b/apps/i18n/koko/en.json index d92a0777a..5e7880638 100644 --- a/apps/i18n/koko/en.json +++ b/apps/i18n/koko/en.json @@ -52,5 +52,15 @@ "Writable": "Writable", "JoinedWithSuccess": "Successfully joined", "KubernetesManagement": "Kubernetes management", - "WebSocketClosed": "WebSocket closed" + "WebSocketClosed": "WebSocket closed", + "Connect": "Connect", + "Search": "Search", + "Refresh": "Refresh", + "Hotkeys": "Hotkeys", + "Paste": "Paste", + "DownArrow": "Down arrow", + "LeftArrow": "Left arrow", + "RightArrow": "Right arrow", + "UpArrow": "Up arrow", + "Expand": "Expand" } diff --git a/apps/i18n/koko/ja.json b/apps/i18n/koko/ja.json index 8ab3c9f14..4ef320f8e 100644 --- a/apps/i18n/koko/ja.json +++ b/apps/i18n/koko/ja.json @@ -1,20 +1,28 @@ { "ActionPerm": "アクション権限", "Cancel": "キャンセル", + "Confirm": "確認", "ConfirmBtn": "確定", + "Connect": "接続", "CopyLink": "リンクと認証コードのコピー", "CopyShareURLSuccess": "レプリケーション共有住所成功", "CreateLink": "シェアリンクの作成", "CreateSuccess": "作成に成功しました", + "DownArrow": "下向き矢印", "Download": "ダウンロード", "DownloadSuccess": "ダウンロードに成功しました", "EndFileTransfer": "ファイル転送終了", "ExceedTransferSize": "最大転送サイズを超えています", + "Expand": "展開", "ExpiredTime": "有効期限", "GetShareUser": "ユーザー名の入力", + "Hotkeys": "ショートカットキー", "InputVerifyCode": "認証コードを入力してください", "JoinShare": "共有セッションに参加", + "JoinedWithSuccess": "正常に参加しました", + "KubernetesManagement": "Kubernetes 管理", "LeaveShare": "共有セッションから退出", + "LeftArrow": "戻る矢印", "LinkAddr": "リンク先", "Minute": "分間", "Minutes": "分間", @@ -22,12 +30,16 @@ "MustSelectOneFile": "ファイルを選択する必要があります", "NoLink": "住所なし", "OnlineUsers": "オンラインスタッフ", + "Paste": "貼り付け", "PauseSession": "セッションを一時停止", "ReadOnly": "読み取り専用", + "Refresh": "リフレッシュ", "Remove": "削除", "RemoveShareUser": "あなたはすでに共有セッションから削除されました」という意味です", "RemoveShareUserConfirm": "共有セッションから削除してもよろしいですか?", "ResumeSession": "セッションを再開", + "RightArrow": "進む矢印", + "Search": "検索", "SelectAction": "選択してください", "SelectTheme": "テーマを選択してください", "Self": "自分", @@ -41,6 +53,7 @@ "Theme": "テーマ", "ThemeColors": "テーマカラー", "ThemeConfig": "テーマ", + "UpArrow": "上向き矢印", "Upload": "アップロード", "UploadSuccess": "アップロード成功", "UploadTips": "ファイルをここにドラッグするか、アップロードをクリックします", @@ -48,8 +61,6 @@ "User": "ユーザー", "VerifyCode": "認証コード", "WaitFileTransfer": "ファイル転送終了待ち", - "Writable": "書き込み可能", - "JoinedWithSuccess": "正常に参加しました", - "KubernetesManagement": "Kubernetes 管理", - "WebSocketClosed": "WebSocket 閉店" + "WebSocketClosed": "WebSocket 閉店", + "Writable": "書き込み可能" } \ No newline at end of file diff --git a/apps/i18n/koko/zh.json b/apps/i18n/koko/zh.json index 5c53c284e..70326e2dc 100644 --- a/apps/i18n/koko/zh.json +++ b/apps/i18n/koko/zh.json @@ -52,5 +52,15 @@ "Writable": "读写", "JoinedWithSuccess": "已成功加入", "KubernetesManagement": "Kubernetes 管理", - "WebSocketClosed": "WebSocket 已关闭" + "WebSocketClosed": "WebSocket 已关闭", + "Connect": "连接", + "Search": "搜索", + "Refresh": "刷新", + "Hotkeys": "快捷键", + "Paste": "粘贴", + "DownArrow": "向下箭头", + "LeftArrow": "后退箭头", + "RightArrow": "前进箭头", + "UpArrow": "向上箭头", + "Expand": "展开" } diff --git a/apps/i18n/koko/zh_hant.json b/apps/i18n/koko/zh_hant.json index f75f18ff1..545f35c19 100644 --- a/apps/i18n/koko/zh_hant.json +++ b/apps/i18n/koko/zh_hant.json @@ -1,20 +1,28 @@ { "ActionPerm": "操作權限", "Cancel": "取消", + "Confirm": "確認", "ConfirmBtn": "確定", + "Connect": "連接", "CopyLink": "複製連結及驗證碼", "CopyShareURLSuccess": "複製分享地址成功", "CreateLink": "創建分享連結", "CreateSuccess": "創建成功", + "DownArrow": "向下箭頭", "Download": "下載", "DownloadSuccess": "下載成功", "EndFileTransfer": "文件傳輸結束", "ExceedTransferSize": "超過最大傳輸大小", + "Expand": "展開", "ExpiredTime": "有效期限", "GetShareUser": "輸入使用者名稱", + "Hotkeys": "快速鍵", "InputVerifyCode": "請輸入驗證碼", "JoinShare": "加入共享", + "JoinedWithSuccess": "已成功加入", + "KubernetesManagement": "Kubernetes 管理", "LeaveShare": "離開共享", + "LeftArrow": "後退箭頭", "LinkAddr": "連結地址", "Minute": "分鐘", "Minutes": "分鐘", @@ -22,12 +30,16 @@ "MustSelectOneFile": "必須選擇一個文件", "NoLink": "無地址", "OnlineUsers": "在線人員", + "Paste": "貼上", "PauseSession": "暫停此會話", "ReadOnly": "只讀", + "Refresh": "刷新", "Remove": "移除", "RemoveShareUser": "你已經被移除共享會話", "RemoveShareUserConfirm": "確定要移除該用戶嗎?", "ResumeSession": "恢復此會話", + "RightArrow": "前進箭頭", + "Search": "搜尋", "SelectAction": "請選擇", "SelectTheme": "請選擇主題", "Self": "我", @@ -41,6 +53,7 @@ "Theme": "主題", "ThemeColors": "主題顏色", "ThemeConfig": "主題", + "UpArrow": "向上箭頭", "Upload": "上傳", "UploadSuccess": "上傳成功", "UploadTips": "將文件拖到此處,或點擊上傳", @@ -48,8 +61,6 @@ "User": "用戶", "VerifyCode": "驗證碼", "WaitFileTransfer": "等待文件傳輸結束", - "Writable": "讀寫", - "JoinedWithSuccess": "已成功加入", - "KubernetesManagement": "Kubernetes 管理", - "WebSocketClosed": "WebSocket 已關閉" + "WebSocketClosed": "WebSocket 已關閉", + "Writable": "讀寫" } \ No newline at end of file diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json index f2bd7617b..49e1c2ae7 100644 --- a/apps/i18n/lina/ja.json +++ b/apps/i18n/lina/ja.json @@ -67,6 +67,7 @@ "AddUserGroupToThisPermission": "ユーザーグループを追加", "AddUserToThisPermission": "ユーザーを追加する", "Address": "アドレス", + "AdhocCreate": "アドホックコマンドを作成", "AdhocDetail": "コマンド詳細", "AdhocManage": "コマンド", "AdhocUpdate": "コマンドを更新", @@ -116,6 +117,7 @@ "ApprovaLevel": "承認情報", "ApprovalLevel": "承認レベル", "ApprovalProcess": "承認プロセス", + "ApprovalSelected": "大量承認です", "Approved": "同意済み", "ApproverNumbers": "アプルーバの数", "ApsaraStack": "アリババクラウド専用クラウド", @@ -330,7 +332,7 @@ "CommunityEdition": "コミュニティ版", "Component": "コンポーネント", "ComponentMonitor": "コンポーネントの監視", - "Components": "コンポーネント設定", + "Components": "コンポーネントリスト", "ConceptContent": "あなたにはPythonインタープリタのように行動してほしい。Pythonのコードを提供しますので、それを実行してください。説明は一切不要です。コードの出力以外では何も反応しないでください。", "ConceptTitle": "🤔 Python インタープリター", "Config": "設定", @@ -1027,6 +1029,7 @@ "Resume": "回復", "ResumeTaskSendSuccessMsg": "リカバリータスクが発行されました、しばらくしてから更新してご確認ください", "Retry": "再試行", + "RetrySelected": "選択したものを再試行", "Reviewer": "承認者", "Role": "役割", "RoleCreate": "ロール作成", @@ -1053,6 +1056,7 @@ "RunasHelpText": "実行スクリプトのユーザー名を入力してください", "RunasPolicy": "アカウント戦略", "RunasPolicyHelpText": "現在の資産にはこの実行ユーザーがいない場合、どのアカウント選択戦略を採用するか。スキップ:実行しない。特権アカウントを優先:特権アカウントがあれば最初に特権アカウントを選び、なければ一般アカウントを選ぶ。特権アカウントのみ:特権アカウントからのみ選択し、なければ実行しない", + "Running": "実行中", "RunningPath": "実行パス", "RunningPathHelpText": "スクリプトの実行パスを記入してください、この設定はシェルスクリプトのみ有効です", "RunningTimes": "最近5回の実行時間", @@ -1061,7 +1065,7 @@ "SMSProvider": "メッセージサービスプロバイダ", "SMTP": "メールサーバ", "SPECIAL_CHAR_REQUIRED": "特別な文字を含む必要があります", - "SSHKey": "SSH公開鍵", + "SSHKey": "SSHキー", "SSHKeyOfProfileSSHUpdatePage": "下のボタンをクリックしてSSH公開鍵をリセットおよびダウンロードするか、あなたのSSH公開鍵をコピーして提出できます。", "SSHPort": "SSH ポート", "SSHSecretKey": "SSHキー", @@ -1069,7 +1073,6 @@ "SameAccount": "同名アカウント", "SameAccountTip": "権限を持つユーザーのユーザー名と同じアカウント", "SameTypeAccountTip": "同じユーザー名、鍵の種類のアカウントがすでに存在しています", - "Share": "共有", "Saturday": "土曜日", "Save": "保存", "SaveAdhoc": "コマンドを保存する", @@ -1120,6 +1123,7 @@ "SessionData": "セッションデータ", "SessionDetail": "セッションの詳細", "SessionID": "セッションID", + "SessionJoinRecords": "協力記録", "SessionList": "セッション記録", "SessionMonitor": "監視", "SessionOffline": "過去のセッション", @@ -1141,6 +1145,7 @@ "Setting": "設定", "SettingInEndpointHelpText": "システム設定/コンポーネント設定/サーバーエンドポイントでサービスのアドレスとポートを設定してください", "Settings": "システム設定", + "Share": "共有", "Show": "表示", "ShowAssetAllChildrenNode": "すべての子ノードの資産を表示", "ShowAssetOnlyCurrentNode": "現在のノードアセットのみを表示", @@ -1343,6 +1348,7 @@ "UploadCsvLth10MHelpText": "アップロード可能なのは csv/xlsx のみで、10Mを超えないこと", "UploadDir": "アップロードディレクトリ", "UploadFileLthHelpText": "{limit}MB以下のファイルのみアップロード可能", + "UploadHelpText": "次のサンプル構造ディレクトリを含む .zip ファイルをアップロードしてください。", "UploadPlaybook": "Playbookのアップロード", "UploadSucceed": "アップロード成功", "UploadZipTips": "zip形式のファイルをアップロードしてください", @@ -1383,6 +1389,7 @@ "Valid": "有効", "Variable": "変数", "VariableHelpText": "コマンド中で {{ key }} を使用して内蔵変数を読み取ることができます", + "VaultHCPMountPoint": "Vault サーバのマウントポイント、デフォルトはjumpserver", "VaultHelpText": "1. セキュリティ上の理由により、設定ファイルで Vault ストレージをオンにする必要があります。
2. オンにした後、他の設定を入力してテストを行います。
3. データ同期を行います。同期は一方向です。ローカルデータベースからリモートの Vault にのみ同期します。同期が終了すればローカルデータベースはパスワードを保管していませんので、データのバックアップをお願いします。
4. Vault の設定を二度変更した後はサービスを再起動する必要があります。", "VerificationCodeSent": "認証コードが送信されました", "VerifySignTmpl": "認証コードのSMSテンプレート", @@ -1427,11 +1434,7 @@ "ZoneHelpMessage": "エリアとはアセットの位置で、データセンターやパブリッククラウド、あるいはVPCが該当します。エリアにはゲートウェイを設定でき、ネットワークが直接接続できない場合、ゲートウェイを経由してアセットにログインすることができます", "ZoneList": "地域リスト", "ZoneUpdate": "更新エリア", + "disallowSelfUpdateFields": "現在のフィールドを自分で変更することは許可されていません", "forceEnableMFAHelpText": "強制的に有効化すると、ユーザーは自分で無効化することができません。", - "removeWarningMsg": "削除してもよろしいですか", - "AdhocCreate": "アドホックコマンドを作成", - "UploadHelpText": "次のサンプル構造ディレクトリを含む .zip ファイルをアップロードしてください。", - "SessionJoinRecords": "協力記録", - "ApprovalSelected": "大量承認です", - "disallowSelfUpdateFields": "現在のフィールドを自分で変更することは許可されていません" -} + "removeWarningMsg": "削除してもよろしいですか" +} \ No newline at end of file diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index 7b8d3c4d5..4dd39b451 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -315,7 +315,7 @@ "CommunityEdition": "社区版", "Component": "组件", "ComponentMonitor": "组件监控", - "Components": "组件设置", + "Components": "组件列表", "ConceptContent": "我想让你像一个 Python 解释器一样行事。我将给你 Python 代码,你将执行它。不要提供任何解释。除了代码的输出,不要用任何东西来回应。", "ConceptTitle": "🤔 Python 解释器 ", "Config": "配置", @@ -1030,7 +1030,7 @@ "SMSProvider": "短信服务商", "SMTP": "邮件服务器", "SPECIAL_CHAR_REQUIRED": "必须包含特殊字符", - "SSHKey": "SSH公钥", + "SSHKey": "SSH密钥", "SSHKeyOfProfileSSHUpdatePage": "你可以点击下面的按钮重置并下载密钥,或者复制你的 SSH 公钥并提交。", "SSHPort": "SSH 端口", "SSHSecretKey": "SSH 密钥", diff --git a/apps/i18n/lina/zh_hant.json b/apps/i18n/lina/zh_hant.json index fd2843ad7..b5946d0a7 100644 --- a/apps/i18n/lina/zh_hant.json +++ b/apps/i18n/lina/zh_hant.json @@ -85,6 +85,7 @@ "AddUserToThisPermission": "新增使用者", "Address": "地址", "Addressee": "收件人", + "AdhocCreate": "創建命令", "AdhocDetail": "命令詳情", "AdhocManage": "命令管理", "AdhocUpdate": "更新命令", @@ -155,6 +156,7 @@ "ApprovaLevel": "審批資訊", "ApprovalLevel": "審批級別", "ApprovalProcess": "審批流程", + "ApprovalSelected": "批次審批", "Approved": "已同意", "ApproverNumbers": "審批人數量", "ApsaraStack": "阿里雲專有雲", @@ -423,7 +425,7 @@ "CommunityEdition": "社區版", "Component": "組件", "ComponentMonitor": "組件監控", - "Components": "組件設置", + "Components": "組件列表", "ConceptContent": "我想讓你像一個 Python 解釋器一樣行事。我將給你 Python 代碼,你將執行它。不要提供任何解釋。除了代碼的輸出,不要用任何東西來回應。", "ConceptTitle": "🤔 Python 解釋器 ", "Config": "配置", @@ -766,8 +768,8 @@ "IPLoginLimit": "IP 登入限制", "IPMatch": "IP 匹配", "IPNetworkSegment": "IP網段", - "Icon": "圖示", "IPType": "IP 類型", + "Icon": "圖示", "Id": "ID", "IdeaContent": "我想讓你充當一個 Linux 終端。我將輸入命令,你將回答終端應該顯示的內容。我希望你只在一個獨特的代碼塊內回復終端輸出,而不是其他。不要寫解釋。當我需要告訴你一些事情時,我會把文字放在大括號裡{備註文本}。", "IdeaTitle": "🌱 Linux 終端", @@ -1357,6 +1359,7 @@ "RunasHelpText": "填寫運行腳本的使用者名稱", "RunasPolicy": "帳號策略", "RunasPolicyHelpText": "當前資產上沒此運行用戶時,採取什麼帳號選擇策略。跳過:不執行。優先特權帳號:如果有特權帳號先選特權帳號,如果沒有就選普通帳號。僅特權帳號:只從特權帳號中選擇,如果沒有則不執行", + "Running": "正在運行中的Vault 伺服器掛載點,預設為 jumpserver", "RunningPath": "運行路徑", "RunningPathHelpText": "填寫腳本的運行路徑,此設置僅 shell 腳本生效", "RunningTimes": " Last 5 run times", @@ -1367,7 +1370,7 @@ "SMSProvider": "簡訊服務商", "SMTP": "郵件伺服器", "SPECIAL_CHAR_REQUIRED": "須包含特殊字元", - "SSHKey": "SSH公鑰", + "SSHKey": "SSH金鑰", "SSHKeyOfProfileSSHUpdatePage": "複製你的公鑰到這裡", "SSHKeySetting": "SSH公鑰設置", "SSHPort": "SSH 埠", @@ -1378,7 +1381,6 @@ "SameAccount": "同名帳號", "SameAccountTip": "與被授權人使用者名稱相同的帳號", "SameTypeAccountTip": "相同使用者名稱、金鑰類型的帳號已存在", - "Share": "分享", "Saturday": "週六", "Save": "保存", "SaveAdhoc": "保存命令", @@ -1439,6 +1441,7 @@ "SessionData": "會話數據", "SessionDetail": "會話詳情", "SessionID": "會話ID", + "SessionJoinRecords": "協作記錄", "SessionList": "會話記錄", "SessionMonitor": "監控", "SessionOffline": "歷史會話", @@ -1463,6 +1466,7 @@ "Setting": "設置", "SettingInEndpointHelpText": "在 系統設置 / 組件設置 / 服務端點 中配置服務地址和埠", "Settings": "系統設置", + "Share": "分享", "Show": "顯示", "ShowAssetAllChildrenNode": "顯示所有子節點資產", "ShowAssetOnlyCurrentNode": "僅顯示當前節點資產", @@ -1716,6 +1720,7 @@ "UploadDir": "上傳目錄", "UploadFailed": "上傳失敗", "UploadFileLthHelpText": "只能上傳小於{limit}MB檔案", + "UploadHelpText": "請上傳包含以下範例結構目錄的 .zip 壓縮文件", "UploadPlaybook": "上傳 Playbook", "UploadSucceed": "上傳成功", "UploadZipTips": "請上傳 zip 格式的文件", @@ -1780,6 +1785,7 @@ "Variable": "變數", "VariableHelpText": "您可以在命令中使用 {{ key }} 讀取內建變數", "Vault": "密碼匣子", + "VaultHCPMountPoint": "重新嘗試所選", "VaultHelpText": "1. 由於安全原因,需要配置文件中開啟 Vault 儲存。
2. 開啟後,填寫其他配置,進行測試。
3. 進行數據同步,同步是單向的,只會從本地資料庫同步到遠端 Vault,同步完成本地資料庫不再儲存密碼,請備份好數據。
4. 二次修改 Vault 配置後需重啟服務。", "Vendor": "製造商", "VerificationCodeSent": "驗證碼已發送", @@ -1912,7 +1918,6 @@ "consult": "諮詢", "containerName": "容器名稱", "contents": "內容", - "AdhocCreate": "創建命令", "createBy": "創建者", "createErrorMsg": "創建失敗", "createSuccessMsg": "導入創建成功,總共:{count}", @@ -2271,8 +2276,5 @@ "weComTest": "測試", "week": "周", "weekOf": "周的星期", - "wildcardsAllowed": "允許的通配符", - "UploadHelpText": "請上傳包含以下範例結構目錄的 .zip 壓縮文件", - "SessionJoinRecords": "協作記錄", - "ApprovalSelected": "批次審批" -} + "wildcardsAllowed": "允許的通配符" +} \ No newline at end of file diff --git a/apps/i18n/luna/en.json b/apps/i18n/luna/en.json index dffcf3f0d..b06e91d49 100644 --- a/apps/i18n/luna/en.json +++ b/apps/i18n/luna/en.json @@ -91,7 +91,7 @@ "Info": "Info", "InstallClientMsg": "JumpServer client not found, Go to download and install?", "Japanese keyboard layout": "Japanese (Qwerty)", - "Keyboard keys": "Option + Left / Option + Right", + "Keyboard keys": "Option + Shift + Left / Right", "Keyboard layout": "Keyboard layout", "Keyboard switch session": "Switch session → Shortcut keys", "Kubernetes": "Kubernetes", diff --git a/apps/i18n/luna/ja.json b/apps/i18n/luna/ja.json index 53e24ddc2..a9c9a402f 100644 --- a/apps/i18n/luna/ja.json +++ b/apps/i18n/luna/ja.json @@ -90,7 +90,7 @@ "Info": "ヒント", "InstallClientMsg": "JumpServerクライアントがインストールされていない、今ダウンロードしてインストールしますか?", "Japanese keyboard layout": "Japanese (Qwerty)", - "Keyboard keys": "Option + Left / Option + Right", + "Keyboard keys": "Option + Shift + Left / Right", "Keyboard layout": "キーボードレイアウト", "Keyboard switch session": "セッションの切り替え → ショートカットキー", "Kubernetes": "Kubernetes", diff --git a/apps/i18n/luna/zh.json b/apps/i18n/luna/zh.json index a761a7713..dc4ae3222 100644 --- a/apps/i18n/luna/zh.json +++ b/apps/i18n/luna/zh.json @@ -89,7 +89,7 @@ "Info": "提示", "InstallClientMsg": "JumpServer 客户端没有安装,现在去下载安装?", "Japanese keyboard layout": "Japanese (Qwerty)", - "Keyboard keys": "Option + Left / Option + Right", + "Keyboard keys": "Option + Shift + Left / Right", "Keyboard layout": "键盘布局", "Keyboard switch session": "切换会话 → 快捷键", "Kubernetes": "Kubernetes", diff --git a/apps/i18n/luna/zh_hant.json b/apps/i18n/luna/zh_hant.json index be0659e66..a75fe3dfd 100644 --- a/apps/i18n/luna/zh_hant.json +++ b/apps/i18n/luna/zh_hant.json @@ -90,7 +90,7 @@ "Info": "提示", "InstallClientMsg": "JumpServer 用戶端沒有安裝,現在去下載安裝?", "Japanese keyboard layout": "Japanese (Qwerty)", - "Keyboard keys": "Option + Left / Option + Right", + "Keyboard keys": "Option + Shift + Left / Right", "Keyboard layout": "鍵盤布局", "Keyboard switch session": "切換會話 → 快捷鍵", "Kubernetes": "Kubernetes", From bd548b3fe217d56c57b5ef896fecefae09c79d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E5=B9=BF?= Date: Mon, 9 Sep 2024 15:32:29 +0800 Subject: [PATCH 35/98] Revert "perf: update deps" This reverts commit 76b6489636bf67bef721652e6fe46e61a213a14d. --- poetry.lock | 1626 ++++++++++++++++++++++-------------------------- pyproject.toml | 6 +- 2 files changed, 740 insertions(+), 892 deletions(-) diff --git a/poetry.lock b/poetry.lock index 030b4ff7d..051a97173 100644 --- a/poetry.lock +++ b/poetry.lock @@ -38,132 +38,113 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "aiohappyeyeballs" -version = "2.4.0" -description = "Happy Eyeballs for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, -] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.8.6" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, -] - -[package.dependencies] -aiohappyeyeballs = ">=2.3.0" + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, + {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, + {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, + {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, + {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, + {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, + {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, + {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, + {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, + {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, + {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, +] + +[package.dependencies] aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] +speedups = ["Brotli", "aiodns", "cchardet"] [package.source] type = "legacy" @@ -191,16 +172,16 @@ reference = "aliyun" [[package]] name = "alibabacloud-credentials" -version = "0.3.5" +version = "0.3.4" description = "The alibabacloud credentials module of alibabaCloud Python SDK." optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud_credentials-0.3.5.tar.gz", hash = "sha256:ad065ec95921eaf51939195485d0e5cc9e0ea050282059c7d8bf74bdb5496177"}, + {file = "alibabacloud_credentials-0.3.4.tar.gz", hash = "sha256:c15a34fe782c318d4cf24cb041a0385ac4ccd2548e524e5d7fe1cff56a9a6acc"}, ] [package.dependencies] -alibabacloud-tea = ">=0.3.9" +alibabacloud-tea = "*" [package.source] type = "legacy" @@ -249,16 +230,16 @@ reference = "aliyun" [[package]] name = "alibabacloud-gateway-spi" -version = "0.0.2" +version = "0.0.1" description = "Alibaba Cloud Gateway SPI SDK Library for Python" optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud_gateway_spi-0.0.2.tar.gz", hash = "sha256:f932c8ba67291531dfbee6ca521dcf3523eb4ff93512bf0aaf135f2d4fc4704d"}, + {file = "alibabacloud_gateway_spi-0.0.1.tar.gz", hash = "sha256:1b259855708afc3c04d8711d8530c63f7645e1edc0cf97e2fd15461b08e11c30"}, ] [package.dependencies] -alibabacloud_credentials = ">=0.3.4,<1.0.0" +alibabacloud_credentials = ">=0.2.0,<1.0.0" [package.source] type = "legacy" @@ -286,18 +267,18 @@ reference = "aliyun" [[package]] name = "alibabacloud-tea" -version = "0.3.9" +version = "0.3.6" description = "The tea module of alibabaCloud Python SDK." optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud-tea-0.3.9.tar.gz", hash = "sha256:a9689770003fa9313d1995812f9fe36a2be315e5cdfc8d58de0d96808219ced9"}, - {file = "alibabacloud_tea-0.3.9-py3-none-any.whl", hash = "sha256:402fd2a92e6729f228d8c0300b182f80019edce19d83afa497aeb15fd7947f9a"}, + {file = "alibabacloud-tea-0.3.6.tar.gz", hash = "sha256:ea7180c80b41ccddad1d474285f0da6ba9aa6ba898bcbc84e88409312a67a52a"}, ] [package.dependencies] -aiohttp = ">=3.7.0,<4.0.0" +aiohttp = ">=3.7.0,<3.9.0" requests = ">=2.21.0,<3.0.0" +urllib3 = "<2.0.0" [package.source] type = "legacy" @@ -306,19 +287,19 @@ reference = "aliyun" [[package]] name = "alibabacloud-tea-openapi" -version = "0.3.11" +version = "0.3.10" description = "Alibaba Cloud openapi SDK Library for Python" optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud_tea_openapi-0.3.11.tar.gz", hash = "sha256:3f5cace1b1aeb8a64587574097403cfd066b86ee4c3c9abde587f9abfcad38de"}, + {file = "alibabacloud_tea_openapi-0.3.10.tar.gz", hash = "sha256:46e9c54ea857346306cd5c628dc33479349b559179ed2fdb2251dbe6ec9a1cf1"}, ] [package.dependencies] alibabacloud_credentials = ">=0.3.1,<1.0.0" alibabacloud_gateway_spi = ">=0.0.1,<1.0.0" alibabacloud_openapi_util = ">=0.2.1,<1.0.0" -alibabacloud_tea_util = ">=0.3.13,<1.0.0" +alibabacloud_tea_util = ">=0.3.12,<1.0.0" alibabacloud_tea_xml = ">=0.0.2,<1.0.0" [package.source] @@ -328,12 +309,12 @@ reference = "aliyun" [[package]] name = "alibabacloud-tea-util" -version = "0.3.13" +version = "0.3.12" description = "The tea-util module of alibabaCloud Python SDK." optional = false python-versions = ">=3.6" files = [ - {file = "alibabacloud_tea_util-0.3.13.tar.gz", hash = "sha256:8cbdfd2a03fbbf622f901439fa08643898290dd40e1d928347f6346e43f63c90"}, + {file = "alibabacloud_tea_util-0.3.12.tar.gz", hash = "sha256:72a2f5a046e5b977ade4202eb4f65b3d70ad707a548e29aacd4a572c2d18d06b"}, ] [package.dependencies] @@ -364,16 +345,16 @@ reference = "aliyun" [[package]] name = "aliyun-python-sdk-core" -version = "2.15.2" +version = "2.15.1" description = "The core module of Aliyun Python SDK." optional = false python-versions = "*" files = [ - {file = "aliyun-python-sdk-core-2.15.2.tar.gz", hash = "sha256:54f66a53e193c61c5e16ea4505a0cab43543f8ad2ef22833f69c4d5e5151c17d"}, + {file = "aliyun-python-sdk-core-2.15.1.tar.gz", hash = "sha256:518550d07f537cd3afac3b6c93b5c997ce3440e4d0c054e3acbdaa8261e90adf"}, ] [package.dependencies] -cryptography = ">=3.0.0" +cryptography = ">=2.6.0" jmespath = ">=0.9.3,<1.0.0" [package.source] @@ -421,13 +402,13 @@ reference = "aliyun" [[package]] name = "aliyun-python-sdk-kms" -version = "2.16.5" +version = "2.16.3" description = "The kms module of Aliyun Python sdk." optional = false python-versions = "*" files = [ - {file = "aliyun-python-sdk-kms-2.16.5.tar.gz", hash = "sha256:f328a8a19d83ecbb965ffce0ec1e9930755216d104638cd95ecd362753b813b3"}, - {file = "aliyun_python_sdk_kms-2.16.5-py2.py3-none-any.whl", hash = "sha256:24b6cdc4fd161d2942619479c8d050c63ea9cd22b044fe33b60bbb60153786f0"}, + {file = "aliyun-python-sdk-kms-2.16.3.tar.gz", hash = "sha256:c31b7d24e153271a3043e801e7b6b6b3f0db47e95a83c8d10cdab8c11662fc39"}, + {file = "aliyun_python_sdk_kms-2.16.3-py2.py3-none-any.whl", hash = "sha256:8bb8c293be94e0cc9114a5286a503d2ec215eaf8a1fb51de5d6c8bcac209d4a1"}, ] [package.dependencies] @@ -520,7 +501,7 @@ description = "\"Consistent Ansible Python API and CLI with container and proces optional = false python-versions = ">=3.9" files = [ - {file = "2.4.0.1.zip", hash = "sha256:2753fc458afc047c637473a579154e92cd26b891a6d959e5083d36e4d478182a"}, + {file = "2.4.0.1.zip", hash = "sha256:91df951047fae004f30f7a8b6b776940f44832a7646ecc5ff2cc15e4a887c47e"}, ] [package.dependencies] @@ -611,22 +592,22 @@ reference = "aliyun" [[package]] name = "attrs" -version = "24.2.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [package.source] type = "legacy" @@ -635,13 +616,12 @@ reference = "aliyun" [[package]] name = "autobahn" -version = "24.4.2" +version = "23.6.2" description = "WebSocket client & server library, WAMP real-time framework" optional = false python-versions = ">=3.9" files = [ - {file = "autobahn-24.4.2-py2.py3-none-any.whl", hash = "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81"}, - {file = "autobahn-24.4.2.tar.gz", hash = "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9"}, + {file = "autobahn-23.6.2.tar.gz", hash = "sha256:ec9421c52a2103364d1ef0468036e6019ee84f71721e86b36fe19ad6966c1181"}, ] [package.dependencies] @@ -651,14 +631,14 @@ setuptools = "*" txaio = ">=21.2.1" [package.extras] -all = ["PyGObject (>=3.40.0)", "argon2-cffi (>=20.1.0)", "attrs (>=20.3.0)", "base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "cffi (>=1.14.5)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "flatbuffers (>=22.12.6)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "msgpack (>=1.0.2)", "passlib (>=1.7.4)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "py-ubjson (>=0.16.1)", "pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "python-snappy (>=0.6.0)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "rlp (>=2.0.1)", "service-identity (>=18.1.0)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "twisted (>=24.3.0)", "u-msgpack-python (>=2.1)", "ujson (>=4.0.2)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)", "zope.interface (>=5.2.0)"] +all = ["PyGObject (>=3.40.0)", "argon2_cffi (>=20.1.0)", "attrs (>=20.3.0)", "base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "cffi (>=1.14.5)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "flatbuffers (>=22.12.6)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "msgpack (>=1.0.2)", "passlib (>=1.7.4)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "py-ubjson (>=0.16.1)", "pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "python-snappy (>=0.6.0)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "rlp (>=2.0.1)", "service_identity (>=18.1.0)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "ujson (>=4.0.2)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)", "zope.interface (>=5.2.0)"] compress = ["python-snappy (>=0.6.0)"] -dev = ["backports.tempfile (>=1.0)", "build (>=1.2.1)", "bumpversion (>=0.5.3)", "codecov (>=2.0.15)", "flake8 (<5)", "humanize (>=0.5.1)", "mypy (>=0.610)", "passlib", "pep8-naming (>=0.3.3)", "pip (>=9.0.1)", "pyenchant (>=1.6.6)", "pyflakes (>=1.0.0)", "pyinstaller (>=4.2)", "pylint (>=1.9.2)", "pytest (>=3.4.2)", "pytest-aiohttp", "pytest-asyncio (>=0.14.0)", "pytest-runner (>=2.11.1)", "pyyaml (>=4.2b4)", "qualname", "sphinx (>=1.7.1)", "sphinx-autoapi (>=1.7.0)", "sphinx-rtd-theme (>=0.1.9)", "sphinxcontrib-images (>=0.9.1)", "tox (>=4.2.8)", "tox-gh-actions (>=2.2.0)", "twine (>=3.3.0)", "twisted (>=22.10.0)", "txaio (>=20.4.1)", "watchdog (>=0.8.3)", "wheel (>=0.36.2)", "yapf (==0.29.0)"] -encryption = ["pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "service-identity (>=18.1.0)"] +dev = ["backports.tempfile (>=1.0)", "bumpversion (>=0.5.3)", "codecov (>=2.0.15)", "flake8 (<5)", "humanize (>=0.5.1)", "mypy (>=0.610)", "passlib", "pep8-naming (>=0.3.3)", "pip (>=9.0.1)", "pyenchant (>=1.6.6)", "pyflakes (>=1.0.0)", "pyinstaller (>=4.2)", "pylint (>=1.9.2)", "pytest (>=3.4.2)", "pytest-aiohttp", "pytest-asyncio (>=0.14.0)", "pytest-runner (>=2.11.1)", "pyyaml (>=4.2b4)", "qualname", "sphinx (>=1.7.1)", "sphinx-autoapi (>=1.7.0)", "sphinx_rtd_theme (>=0.1.9)", "sphinxcontrib-images (>=0.9.1)", "tox (>=4.2.8)", "tox-gh-actions (>=2.2.0)", "twine (>=3.3.0)", "twisted (>=22.10.0)", "txaio (>=20.4.1)", "watchdog (>=0.8.3)", "wheel (>=0.36.2)", "yapf (==0.29.0)"] +encryption = ["pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "service_identity (>=18.1.0)"] nvx = ["cffi (>=1.14.5)"] -scram = ["argon2-cffi (>=20.1.0)", "cffi (>=1.14.5)", "passlib (>=1.7.4)"] -serialization = ["cbor2 (>=5.2.0)", "flatbuffers (>=22.12.6)", "msgpack (>=1.0.2)", "py-ubjson (>=0.16.1)", "u-msgpack-python (>=2.1)", "ujson (>=4.0.2)"] -twisted = ["attrs (>=20.3.0)", "twisted (>=24.3.0)", "zope.interface (>=5.2.0)"] +scram = ["argon2_cffi (>=20.1.0)", "cffi (>=1.14.5)", "passlib (>=1.7.4)"] +serialization = ["cbor2 (>=5.2.0)", "flatbuffers (>=22.12.6)", "msgpack (>=1.0.2)", "py-ubjson (>=0.16.1)", "ujson (>=4.0.2)"] +twisted = ["attrs (>=20.3.0)", "twisted (>=20.3.0)", "zope.interface (>=5.2.0)"] ui = ["PyGObject (>=3.40.0)"] xbr = ["base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "rlp (>=2.0.1)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)"] @@ -669,15 +649,19 @@ reference = "aliyun" [[package]] name = "automat" -version = "24.8.1" +version = "22.10.0" description = "Self-service finite-state machines for the programmer on the go." optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ - {file = "Automat-24.8.1-py3-none-any.whl", hash = "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a"}, - {file = "automat-24.8.1.tar.gz", hash = "sha256:b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88"}, + {file = "Automat-22.10.0-py2.py3-none-any.whl", hash = "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180"}, + {file = "Automat-22.10.0.tar.gz", hash = "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e"}, ] +[package.dependencies] +attrs = ">=19.2.0" +six = "*" + [package.extras] visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] @@ -1040,13 +1024,13 @@ reference = "aliyun" [[package]] name = "cachetools" -version = "5.5.0" +version = "5.3.3" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, - {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] [package.source] @@ -1132,78 +1116,63 @@ reference = "aliyun" [[package]] name = "cffi" -version = "1.17.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -1577,13 +1546,13 @@ reference = "aliyun" [[package]] name = "cron-descriptor" -version = "1.4.5" +version = "1.4.3" description = "A Python library that converts cron expressions into human readable strings." optional = false python-versions = "*" files = [ - {file = "cron_descriptor-1.4.5-py3-none-any.whl", hash = "sha256:736b3ae9d1a99bc3dbfc5b55b5e6e7c12031e7ba5de716625772f8b02dcd6013"}, - {file = "cron_descriptor-1.4.5.tar.gz", hash = "sha256:f51ce4ffc1d1f2816939add8524f206c376a42c87a5fca3091ce26725b3b1bca"}, + {file = "cron_descriptor-1.4.3-py3-none-any.whl", hash = "sha256:a67ba21804983b1427ed7f3e1ec27ee77bf24c652b0430239c268c5ddfbf9dc0"}, + {file = "cron_descriptor-1.4.3.tar.gz", hash = "sha256:7b1a00d7d25d6ae6896c0da4457e790b98cba778398a3d48e341e5e0d33f0488"}, ] [package.extras] @@ -2257,13 +2226,13 @@ reference = "aliyun" [[package]] name = "elastic-transport" -version = "8.15.0" +version = "8.13.1" description = "Transport classes and utilities shared among Python Elastic client libraries" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "elastic_transport-8.15.0-py3-none-any.whl", hash = "sha256:d7080d1dada2b4eee69e7574f9c17a76b42f2895eff428e562f94b0360e158c0"}, - {file = "elastic_transport-8.15.0.tar.gz", hash = "sha256:85d62558f9baafb0868c801233a59b235e61d7b4804c28c2fadaa866b6766233"}, + {file = "elastic_transport-8.13.1-py3-none-any.whl", hash = "sha256:5d4bb6b8e9d74a9c16de274e91a5caf65a3a8d12876f1e99152975e15b2746fe"}, + {file = "elastic_transport-8.13.1.tar.gz", hash = "sha256:16339d392b4bbe86ad00b4bdeecff10edf516d32bc6c16053846625f2c6ea250"}, ] [package.dependencies] @@ -2271,7 +2240,7 @@ certifi = "*" urllib3 = ">=1.26.2,<3" [package.extras] -develop = ["aiohttp", "furo", "httpx", "opentelemetry-api", "opentelemetry-sdk", "orjson", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "respx", "sphinx (>2)", "sphinx-autodoc-typehints", "trustme"] +develop = ["aiohttp", "furo", "httpx", "mock", "opentelemetry-api", "opentelemetry-sdk", "orjson", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "respx", "sphinx (>2)", "sphinx-autodoc-typehints", "trustme"] [package.source] type = "legacy" @@ -2347,94 +2316,89 @@ reference = "aliyun" [[package]] name = "ephem" -version = "4.1.5" +version = "4.1.4" description = "Compute positions of the planets and stars" optional = false python-versions = "*" files = [ - {file = "ephem-4.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0796dbcd24f76af0e81c22e1f709b42873ef81d2c4dfa962f8d346f11489785d"}, - {file = "ephem-4.1.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0266cf69d594bd94034bd13c18dbcef13b301acd7357d7cf7d1bb8acaf7f00b4"}, - {file = "ephem-4.1.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3db8d53a37c772e1b132f5ed3535027d73e8dca4ead99a7563f09c4308996b63"}, - {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c6e7523d8856caa4ac53db1988693ce7a516fb25c1cd3c74a3472f951691c0e"}, - {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203bd3f00c49012bd07eb2627bcf9538f608b3431cb8053a7d3115e1df396312"}, - {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7ddf15c319a83fb5dadff58bb6e5fbcaff09338f5c2a1b2c7b1445b87002b5"}, - {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:13f800e03aad215ae6a4217122e64d0ce90e914574f8b5afa381d81dad0eecaa"}, - {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83921b341b4f4725e59c1463b9613f3fd3991392e17904170b146f5d6945afcb"}, - {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6219412800138f489733cb3a8b4fab0a8b3ef2dd5ec143aff35950dca9a71c36"}, - {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b95bf8c92a5eae665d63371440b93778b2508ad448907d12f72ed6ed08ea476c"}, - {file = "ephem-4.1.5-cp310-cp310-win32.whl", hash = "sha256:afefe022448f09c3e15472bd3ad30fa4824f8c4a9de65216b9952b9dfcec8750"}, - {file = "ephem-4.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:53df72aa3e2f1359ed56587b1930d0030fec030db71744564a83c10ea54316a7"}, - {file = "ephem-4.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b3e385d8447d908be6dd8c53c4452fee7d61040c9b6bb5a60195b57c85545ca6"}, - {file = "ephem-4.1.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:be6c4ced150d79ab6b5ff3bb7545fee26cf7f4f64ccf476a14850a63bbf125e7"}, - {file = "ephem-4.1.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c8a70e36632e88227c4ba8184fd91dbd32d0140f799202b5fb8510508f4c8e4"}, - {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ee2a4966167a0300db2c9155e4b64fc1a6bb67ca869659d4c0342869c44d4f3"}, - {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b45b9b15e65c7f26c1342b70e06e49bd83a9c527affe9de0fb5953a3a25a0cda"}, - {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e21a8120569f315ce181f2e654528cd10c18cb92382248de90574effed57d227"}, - {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:864d6aba1699f26e7768ed424d5218396300dce6d8deccb1c97164a424343675"}, - {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8f8f5dd5b1343dc77ea891ab423677a631fd7b820bbbeac7ec53ee332e8a4ca5"}, - {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:8a2347ad88aad026dff6f00b931bd2b0d6b4f184bf65ffd4b62f557526bf335d"}, - {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5496ebc21b2873e986836ad0756818bee80ed6deee58e1167a9876e4a64f0bbf"}, - {file = "ephem-4.1.5-cp311-cp311-win32.whl", hash = "sha256:f319ca58ee2ee27c18e42657ad8d3d1b0251dd369c9fd60af45b2bc2c42ded0a"}, - {file = "ephem-4.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:cc6a49fd3250cf67305230da962d779632b13da2a8fae5c383e973fa113baa97"}, - {file = "ephem-4.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51c17c62b031ec246546aa482d98e9a5573405385eb7adf7154f5a1af309ac8a"}, - {file = "ephem-4.1.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ff1436219d2dad1433c5f0a61f3a947ab6d4c622cc6a90d7cb5c2e28a8669fba"}, - {file = "ephem-4.1.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9495d515a6f49bd7a90f58320af1a95e4c3ab89307fbf31045cf05570f779eaf"}, - {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7952e8b54c771be6a58ce9aca91d729bcdace2293c68fe825df3433995aedafc"}, - {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e99ba9fbd5c136fc18b94fe5e709a7c4a19f13ed1c6a16bdec448cbd7d1bcb1"}, - {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2922e6cb66434e9edd3764b103b6bdd394a701bd39395c46f0a7751b9829ee"}, - {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:692f8dea9e91447c6406e9ee7001075d5794948677f5f8ee4601c146509b15b1"}, - {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7122f46a0ce2c2551360bf43b693a3f1f543c0aa6e736b2513bc3203df27df7c"}, - {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a68dd823d823ace3ecd94b3cf926d51ae8aa88ce248159850a8db45547720843"}, - {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cf745e4f02455d6c0f1d85a61206c420ee2c909b392266109e2da2d3a8c023db"}, - {file = "ephem-4.1.5-cp312-cp312-win32.whl", hash = "sha256:e1772852072727e848b5fe035ce7d9dc4662c1baffbd9e4cd7467ecf384db1d9"}, - {file = "ephem-4.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:fd984e38c5078be8cb881ed75c69b2204a1d7fd2230571fc92112edfc5362bf6"}, - {file = "ephem-4.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:740a5950b31ac9a7ca40a95b7cfb1678e747e860f77ac0030984c10dc5464e7f"}, - {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf5b786ed28e7d00704d2cf3862dec75223790ed800c285a91acfa538b1755c"}, - {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87e5be99ebc3bfa1dc70f31ba737dcdf9f6219570fa9a5729d0ff60134c7dc43"}, - {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:261f82bd821cfbb8a056bb834da06d19d3afd3eb735c8cd549f775e45caef502"}, - {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc612e5d1829f64a8db55d8b2566bef4ce479c1bbee110fedf3197170635f70c"}, - {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9fa8ee5d77a8a27a21d39142ee7c6332915b9e79a416a941cbc6f3db64c32cfe"}, - {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c109219a4728281dd4e8b1e9f449900d7a63e9400ef43c85151750d4725b0c9e"}, - {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cf81a3bfa15d84871c4f87ecbf92280184ce96619cacdfe55f761d510a7f81db"}, - {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:39dcc1b00882a2782771b12731a943706da8990c89be75caa294f0574cca661f"}, - {file = "ephem-4.1.5-cp36-cp36m-win32.whl", hash = "sha256:7b6384a032897d3e47da92ccc3348b74517c0dcf478a63b8cdedf69c177bccd2"}, - {file = "ephem-4.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:3bea9cb5a4a98d9c51430a395c4ad4f6307402fa7d3ffbe1bb28f7508e094dd3"}, - {file = "ephem-4.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cac6ed1664e7db22f3aadd8bc6b7afed191b8d5ce3aab9a00d719890a7c344d2"}, - {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02316f8ebb3f82273bc5fbb2970fd98bfb56ed8349197aff0f56c9b5fa04e47a"}, - {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b044d4e3b11953b0543cbd10468bf84afaa840d165c6effbffff3c15d721234"}, - {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a69b27eb82d7c0dccdd54e11ad27f3cadcddb02169a570ac7864dbaa9a10486"}, - {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b01734c27ce38705418191322fd7bd0372d9709d326263991b1c7e1bc75a59f"}, - {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bcae4b30c4a7474cfc102610f23a4a114196c8d15165cbc0551fb0d542a768eb"}, - {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6fde92b6cc7837c141506a09f721f983e31b32785a9680f4d075be9763dc931b"}, - {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:0849f522d1ad4daac5407307be786a54283599cfe87f3fcfc677153db45d7e22"}, - {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:82025d4a6d5f6d76a1f45b4eb940030be93e38a3ac3c589990172beac53c854e"}, - {file = "ephem-4.1.5-cp37-cp37m-win32.whl", hash = "sha256:d7c446228a8756fa39876701abf34d516cd9b49b867d52c2f661f1cf1d927335"}, - {file = "ephem-4.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:b1f509901dcf2b95cc175be39c90eb457e081f8ed9762f4aae74f45e092c7f8b"}, - {file = "ephem-4.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d1ca9cec961115a6197faee6ae2231bc76f9a7090bfdf759c810718c7715db9"}, - {file = "ephem-4.1.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3f95e89ab21e5214dbadfd41f9c94ce538bcd4411c18400cc638a00df728d67c"}, - {file = "ephem-4.1.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e8239ec63c9c6a1ab4d8c578bf6b34c114a3754b80c2e02ce07de827925353"}, - {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:972ff0942ddf0f4ac5124bd974608b8371b22e84ab5ed49b4634455331f41987"}, - {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd85a8b5b20020e791273f9cfd80510e4f647c362e5a3b7aec2abcb604d8d02a"}, - {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:543ddd9e6bf573c24c1ccf30257ec655d8be00e28279fbdadbc774927d949663"}, - {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:beea8cccaf184cd2a16c091b0ce92293f1128e49fd43e3c81e79c9f8d051cea6"}, - {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4f53899fbcdd14790b7a61aa70218337e1c6aabc26af99d2485ed6d98fec8cee"}, - {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3733d751c015d28bc043d543c47cee8d0a699a8330d3d34c9afdbd7e96310842"}, - {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a7c904e6df8511bfad2a3119d2ba2333d94953d0d212b31725f4f749267f21cc"}, - {file = "ephem-4.1.5-cp38-cp38-win32.whl", hash = "sha256:3b46aa3f576d528a9dd4357b18c3e59308d0a1e537e45fe91df3753fa63100bf"}, - {file = "ephem-4.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:37751e9bdb10ae109a2e7d7353911470ee5752f5caee4bbe0d764a39cdd57a5a"}, - {file = "ephem-4.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd76c85313b44e4a9b2e8a14f8e5ffbf43541b3cd023d623664f1dca8c8bf407"}, - {file = "ephem-4.1.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b56f805aa26818e7efa46c2bf98417f677e4dc9ae1b6ef278747d823c7d4df6"}, - {file = "ephem-4.1.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e9c15b5e5386cbee128737465ad7b042f57603c3e75bdbab84cd71b416127cf"}, - {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0f7f4a9de84a4ef8ce77ee980a963bb7725791caa3cb3389490ed35be1d06e8"}, - {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b38d0033f7e4ba6e2f5c9ecfc0827d619796ff182d98cc0adb62c6bce701fe0"}, - {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb55fc94512d0c46e610fa67af5fcad51e28aa2b30f7e88ef4cb38c7a443e81a"}, - {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c4183bc20f5933c9fad3d754f9a9ac75dc9ea0d8c6a7faff63de5d28d6bf26d9"}, - {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e067f98b6cd9da55a5de9ce7b2e1222574006b4c3083363eda507ce97ce9867b"}, - {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b5cf0e29657001482f3ed8eeaf1757c67b8d8fdc9c90e57b8d544fd1e7e4d6b3"}, - {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5058cfcf36643b11198d54266137d7db8476d66b2c9ff5e4e35638fc3254a2d"}, - {file = "ephem-4.1.5-cp39-cp39-win32.whl", hash = "sha256:c1eed128e5f6e551bc50cfaa87395cef7f03d65537fe4e8502704d200279e3b2"}, - {file = "ephem-4.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:f4ff7153ac577cb336e08fdc7a76ac91185b2af5dae9ba3ae9d0e87af3ac35c3"}, - {file = "ephem-4.1.5.tar.gz", hash = "sha256:0c64a8aa401574c75942045b9af70d1656e14c5366151c0cbb400cbeedc2362a"}, + {file = "ephem-4.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:024752ae7074c660630046929e12650cc6e72e1c11b7554ccefbe16f8ce3c48d"}, + {file = "ephem-4.1.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:158bf9fb2b58cb77c606687c9ad35dc82903ed00617a12c93dd2d89a65d6374d"}, + {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11be09d245e77457e87988a4fdc811bdc6c5f1daaa73fb24289b220db720831d"}, + {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:649bd2c85f5fc450136dacc0416af7127a07c0b2ce84bfdc89c1bc78129216a3"}, + {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6918b012365791b786ed0f30e8ea3941cbc49486dcf6c28d151f119c62d5be8"}, + {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d343e9ca26f04a05b01fcaaf800224da5d15ad76902d7dc452c216e448293893"}, + {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d0403738f59aefe81ee5b0219cd909f2a05b03b7da465f9b233da57d3dea0de6"}, + {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d61f38f35c25049ca2b95aa4e12e952e5ef56b31eac4a9d6d4e24aacf9373101"}, + {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4039aa2f0b8c204283fc478551d8b29c9473137ad8a910a5ff60ae3be6593c7b"}, + {file = "ephem-4.1.4-cp310-cp310-win32.whl", hash = "sha256:8979429643ac4e29a5496321c9c41a20cd7a6a530aee9865c7fab0008450ef28"}, + {file = "ephem-4.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:589a2235f49232b92ee0247923360a264086a57b2c39d4191348f95ba5ce0c3d"}, + {file = "ephem-4.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feab5f68ae9fa622d6316790c9cfc399e8b78f7958a61da4edf2cb5e0e675d44"}, + {file = "ephem-4.1.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df9c482c8d25e69271311606b4de0e177e44ceb11781c7ebacf17cc5b391f832"}, + {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cceea883856817f3ea3f73442e3be3a4a56558cdb77cc85d02db4429ce5ab16"}, + {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f3e9ea626bc522fd4dd1ff795f0922fcb4c4eb57effe91b6284411166ddd1fd7"}, + {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad22e769bd35415cad8f2ef6d4d875190d9bdad4fed2842fd19dac6f1ccb9dd"}, + {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3327218495235ec215ffe43253c0bf3fa982f59504b351c53b024f1c7b63752"}, + {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d2c56238a1aec72a78ad7061f5c531df97a66ea0cca45204b6b8141c3bb1540e"}, + {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fffe176bd94f4f61be5a54b54a966988cceb6ba69a6ed729aab166020fdb37c3"}, + {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f9b27117e7a82f7f70db9cb23b5cc36d37b166a2f73c55e14d7225d0ab95afa"}, + {file = "ephem-4.1.4-cp311-cp311-win32.whl", hash = "sha256:9bb21c0b117c9122c0141b0a71ee6fbbb087ed2aab4a7ab60f009e95e9f4a521"}, + {file = "ephem-4.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:55d7fb5c34b2e453e01fa4ca7ee375b19b438c9401ae8c4099ae4a3a37656972"}, + {file = "ephem-4.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f9e24aeea560dfcece3c2e313eb94e6be3e84888091455e541fa88f3a44da584"}, + {file = "ephem-4.1.4-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653d99386932e5f78bb9cfc4495030ad9f3345eb4c2b32dca55547da8f1f0332"}, + {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53786461a6d5799d5fffe76622ad51444b264d1c7263b92a6dfcac640c3da93a"}, + {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:268f57f8768ccb0abbdf4cefb4781c7db812950019868f687b407b428513ee53"}, + {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d630aa287255ea9fba6962f351e4e0729bb620570684d52fbfcc31b11527f09e"}, + {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5f229bbf62ecb4cd6bb3374b15d0f8ff7b3d970c2936fccd89bdf9d693907a2"}, + {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d60d56f182de54bd84fadd6ea2dd8e8ef6fdef6a698c7cafd404ecb6eeefa598"}, + {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:404500c8d0030d75ec15bb6b98eee78ad163fd5252102c962ae6fb39c9488198"}, + {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fb020d6cc5ab1ad1cd9d3da4a6e2506beebb41d1b337d79cc20cc0a17f550f1"}, + {file = "ephem-4.1.4-cp312-cp312-win32.whl", hash = "sha256:29e71636ee4719419d03184abc85085f76989c79a61844f5e60acbf2513d2b42"}, + {file = "ephem-4.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:549654f63d88e0ab6248ae25ac2939131474ab9f3a91bee6b68ca6f214747c2a"}, + {file = "ephem-4.1.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:40067fc050c946c8d4c2d779805b61f063471a091e6124cbabcf61ac538011b2"}, + {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e2abe97aa2b091090012768b4d94793213cc01f0bf040dcc311a380ab08df69"}, + {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2677d3a5b42aedc578de10b0eecdba6a50731f159cb28f7ad38c5f62143494"}, + {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80a73da8ec61f86e5a97f73311159e61279dabdfbd17c9d4e2791a25a836f9ce"}, + {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a146db114cfc942d123a38c301a8b8ca7eef2e37d2c5a4bd59e4abc99123c083"}, + {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4f3650c27c3ab6b73e2de7fd8de10e1c0d73f4683c9c5fb2e7113722ec2c2b53"}, + {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:171fc5e7c4e9523f900dfd5ab6520bceb260a2b59fcb558d9aec17fd562b6251"}, + {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:8974799afb37f17ac71e16e479d0e315d74bea4bed2becaf21d1b9304299bbaf"}, + {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3c39fb62c240f57533ea618295e510c44e466e74f2f4a899fbaa04b166b62d04"}, + {file = "ephem-4.1.4-cp36-cp36m-win32.whl", hash = "sha256:23e1432f021c69b2965c87a693ffd25caf08416e92bcb0fed91425083a374210"}, + {file = "ephem-4.1.4-cp36-cp36m-win_amd64.whl", hash = "sha256:86d6dda3581e61f6bad5479e26bca9e560671852ac00a5a8ed10f722635ddf71"}, + {file = "ephem-4.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e731c3e2f1767fab14e5d4077a3519f70afd22cb7dd113274c2850f8ef8ff828"}, + {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8b79b47c7be0d64013fb5d97dd6bbfb9bf63ae07b2ec917be19d3b4cc5782b8"}, + {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89f759ce8e3489d15b9f3796d210196085dcb84cacdf24b2ece791b029245544"}, + {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daf1a1280102e14c718d684989da34151697a426522f8ae18b1081e8bad705c9"}, + {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3da3b76d5d5e339461059c3314013c152ef569c798bfd578bcfb504b875a837"}, + {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aac0a0e41deb2a197cf67e800a3d0f4029139b9ce12bed148ffe994ec78593f9"}, + {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:85809803e349bb4a0d56880067549abdc2b93fddf93ac3d55486040cbec1553f"}, + {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:93d8f8b4e6206d3401dbdb0cdabb0d15c59cf9c2a7ee7c586da8c7dbf1f2a136"}, + {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5beaa0cb659951211aec33a7c132557a1a161dacf53f1b1493830489cfc68215"}, + {file = "ephem-4.1.4-cp37-cp37m-win32.whl", hash = "sha256:bbd4727498928ece694ec1b33023f16b6d050d9952d4052129b24e08e04d67fd"}, + {file = "ephem-4.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:39c710d73449b1c495b58d803da881363a0cae4b728de9fa332f77bcb4686ac8"}, + {file = "ephem-4.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24b7e90c731e851a56ab5e9d538915faaa54945e9b5211cfdf04e570fc27c529"}, + {file = "ephem-4.1.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab40ad7a5ccd66cad4161ca2295c04f01a74ec596c936c3af97a67733e2cd5bf"}, + {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:555d63d70e36e46e43b955c37cdb0f8b82ee2051c575960c4b01948be9f04e5e"}, + {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a29de7c737047cc2412edada9d03b761339d3560d7db471cd04f257e1e02f2f"}, + {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e737b49643a300fa15b788accc72802af93b49cd5d071e53111e08e3fba6570"}, + {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:56c448a83290dabd1df5865fbf9e39d17400abcef37cb36de90ea1a860c0a08e"}, + {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3bd7da534a542d937b10f3c643301dc9b8bc09f7a40350b32efc32910232da9e"}, + {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0493ad1b3d2505acbf442e31aadb86fba096ba30008a586fe6361a9de5974ed3"}, + {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3442fba6afae0bcb643c9b069765033b67d2c8fe4350f9beb4f2f5cfdaaa7442"}, + {file = "ephem-4.1.4-cp38-cp38-win32.whl", hash = "sha256:8e0bb8379fb6b709a3cbceb6a11a3dc0f25e5b16a6f009b48e09d6b95f896d9c"}, + {file = "ephem-4.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:a940cd4d8d7aed68efd3d6b717f393bbedf541d388ba11eb3ed56a9fc6cbb1ca"}, + {file = "ephem-4.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f51a3bcd5f69c4070e8a6936e4a61019ad2d6b94bc8b5ca1e498dea0962a373"}, + {file = "ephem-4.1.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41680b48aeae5b992371bf7ec1bc07457500ff4a6ea7d333793e945b97951de0"}, + {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f11edaef2e4a4d010e21b5ff8bcd9435fbc7fe9e16923f81143f248ae8ae8e9d"}, + {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72078b49748318cbbbe1a49ab5dcd05e63c917151351175b590833e6163a1506"}, + {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2ba977ad0402ac44fe66af6e1119632efe84b7d1255f8f6f94d7768d9487453"}, + {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a21a11285904f43c3bc6909727d09109b8e38dc2e3cda662089601cb37b3d082"}, + {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9aabc3cab5fb9440564dfdf79e39ee01d16554d7bfb8228cddfe9eada460dba9"}, + {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:5327fd48fc8ff966023a6f177813fc058bb2a496c70b53a79f85bf2eba3ca93d"}, + {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e429f6e0e05e4c8c54802e951cd1bde440dd6f896c2b5691ef5ebd9bc3ba489"}, + {file = "ephem-4.1.4-cp39-cp39-win32.whl", hash = "sha256:a8d125d04800425a9d944109710687bbb3703e8f04ac3bc8445779bb0ad5dcc2"}, + {file = "ephem-4.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:4e8ec4e29c7f04d6334215775a8c4dc77eae8ed698384530d9415a98500ed01c"}, + {file = "ephem-4.1.4.tar.gz", hash = "sha256:73a59f0d2162d1624535c3c3b75f956556bdbb2055eaf554a7bef147d3f9c760"}, ] [package.source] @@ -2496,13 +2460,13 @@ reference = "aliyun" [[package]] name = "exchangelib" -version = "5.4.3" +version = "5.4.1" description = "Client for Microsoft Exchange Web Services (EWS)" optional = false python-versions = ">=3.8" files = [ - {file = "exchangelib-5.4.3-py3-none-any.whl", hash = "sha256:be15937847823bc44ab91f572157959eaee64825e766984dbc03de379affe6d5"}, - {file = "exchangelib-5.4.3.tar.gz", hash = "sha256:dc8019c1c5e7afbc807170259bd3479cf572169f56f7e6f492ecdbdb7d7ceb3a"}, + {file = "exchangelib-5.4.1-py3-none-any.whl", hash = "sha256:e093fe18062992d8a78bbdcc2564ec5c92deb644e9f62ea710521a1dd8dfce76"}, + {file = "exchangelib-5.4.1.tar.gz", hash = "sha256:33e2c7bd45718d940ee9920479907f50d3bc6b8d496a78dbc87fca8f8ddcc189"}, ] [package.dependencies] @@ -2737,13 +2701,13 @@ reference = "aliyun" [[package]] name = "google-api-core" -version = "2.19.2" +version = "2.19.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google_api_core-2.19.2-py3-none-any.whl", hash = "sha256:53ec0258f2837dd53bbd3d3df50f5359281b3cc13f800c941dd15a9b5a415af4"}, - {file = "google_api_core-2.19.2.tar.gz", hash = "sha256:ca07de7e8aa1c98a8bfca9321890ad2340ef7f2eb136e558cee68f24b94b0a8f"}, + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, ] [package.dependencies] @@ -2752,7 +2716,7 @@ googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" [package.extras] @@ -2767,13 +2731,13 @@ reference = "aliyun" [[package]] name = "google-auth" -version = "2.34.0" +version = "2.30.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.34.0-py2.py3-none-any.whl", hash = "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65"}, - {file = "google_auth-2.34.0.tar.gz", hash = "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc"}, + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, ] [package.dependencies] @@ -2783,7 +2747,7 @@ rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography", "pyopenssl"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -2816,17 +2780,17 @@ reference = "aliyun" [[package]] name = "googleapis-common-protos" -version = "1.65.0" +version = "1.63.1" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, - {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, + {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, + {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, ] [package.dependencies] -protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] @@ -2913,61 +2877,61 @@ reference = "aliyun" [[package]] name = "grpcio" -version = "1.66.1" +version = "1.64.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492"}, - {file = "grpcio-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac"}, - {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60"}, - {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f"}, - {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083"}, - {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a"}, - {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d"}, - {file = "grpcio-1.66.1-cp310-cp310-win32.whl", hash = "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c"}, - {file = "grpcio-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858"}, - {file = "grpcio-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a"}, - {file = "grpcio-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26"}, - {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df"}, - {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22"}, - {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1"}, - {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e"}, - {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd"}, - {file = "grpcio-1.66.1-cp311-cp311-win32.whl", hash = "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791"}, - {file = "grpcio-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb"}, - {file = "grpcio-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a"}, - {file = "grpcio-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9"}, - {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d"}, - {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0"}, - {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761"}, - {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815"}, - {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524"}, - {file = "grpcio-1.66.1-cp312-cp312-win32.whl", hash = "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759"}, - {file = "grpcio-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734"}, - {file = "grpcio-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2"}, - {file = "grpcio-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce"}, - {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c"}, - {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b"}, - {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef"}, - {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb"}, - {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d"}, - {file = "grpcio-1.66.1-cp38-cp38-win32.whl", hash = "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3"}, - {file = "grpcio-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce"}, - {file = "grpcio-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503"}, - {file = "grpcio-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e"}, - {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0"}, - {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44"}, - {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e"}, - {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb"}, - {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c"}, - {file = "grpcio-1.66.1-cp39-cp39-win32.whl", hash = "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45"}, - {file = "grpcio-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8"}, - {file = "grpcio-1.66.1.tar.gz", hash = "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2"}, + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.66.1)"] +protobuf = ["grpcio-tools (>=1.64.1)"] [package.source] type = "legacy" @@ -2976,18 +2940,18 @@ reference = "aliyun" [[package]] name = "grpcio-status" -version = "1.62.3" +version = "1.62.2" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.62.3.tar.gz", hash = "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485"}, - {file = "grpcio_status-1.62.3-py3-none-any.whl", hash = "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8"}, + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.62.3" +grpcio = ">=1.62.2" protobuf = ">=4.21.6" [package.source] @@ -3100,13 +3064,13 @@ reference = "aliyun" [[package]] name = "httpx" -version = "0.27.2" +version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] @@ -3121,7 +3085,6 @@ brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] [package.source] type = "legacy" @@ -3174,13 +3137,13 @@ reference = "aliyun" [[package]] name = "humanize" -version = "4.10.0" +version = "4.9.0" description = "Python humanize utilities" optional = false python-versions = ">=3.8" files = [ - {file = "humanize-4.10.0-py3-none-any.whl", hash = "sha256:39e7ccb96923e732b5c2e27aeaa3b10a8dfeeba3eb965ba7b74a3eb0e30040a6"}, - {file = "humanize-4.10.0.tar.gz", hash = "sha256:06b6eb0293e4b85e8d385397c5868926820db32b9b654b932f57fa41c23c9978"}, + {file = "humanize-4.9.0-py3-none-any.whl", hash = "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"}, + {file = "humanize-4.9.0.tar.gz", hash = "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"}, ] [package.extras] @@ -3248,20 +3211,18 @@ reference = "aliyun" [[package]] name = "incremental" -version = "24.7.2" -description = "A small library that versions your Python projects." +version = "22.10.0" +description = "\"A small library that versions your Python projects.\"" optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ - {file = "incremental-24.7.2-py3-none-any.whl", hash = "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe"}, - {file = "incremental-24.7.2.tar.gz", hash = "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9"}, + {file = "incremental-22.10.0-py2.py3-none-any.whl", hash = "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51"}, + {file = "incremental-22.10.0.tar.gz", hash = "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0"}, ] -[package.dependencies] -setuptools = ">=61.0" - [package.extras] -scripts = ["click (>=6.0)"] +mypy = ["click (>=6.0)", "mypy (==0.812)", "twisted (>=16.4.0)"] +scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] [package.source] type = "legacy" @@ -3403,81 +3364,6 @@ type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" reference = "aliyun" -[[package]] -name = "jiter" -version = "0.5.0" -description = "Fast iterable JSON parser." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, - {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, - {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, - {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, - {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, - {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, - {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, - {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, - {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, - {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, - {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, - {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, - {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, - {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, - {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, - {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, - {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, - {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, - {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, - {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, - {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, - {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, - {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, - {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, - {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, - {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, - {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, - {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, - {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, - {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, - {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, -] - -[package.source] -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" -reference = "aliyun" - [[package]] name = "jmespath" version = "0.10.0" @@ -4015,22 +3901,22 @@ reference = "aliyun" [[package]] name = "msal" -version = "1.31.0" +version = "1.29.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false python-versions = ">=3.7" files = [ - {file = "msal-1.31.0-py3-none-any.whl", hash = "sha256:96bc37cff82ebe4b160d5fc0f1196f6ca8b50e274ecd0ec5bf69c438514086e7"}, - {file = "msal-1.31.0.tar.gz", hash = "sha256:2c4f189cf9cc8f00c80045f66d39b7c0f3ed45873fd3d1f2af9f22db2e12ff4b"}, + {file = "msal-1.29.0-py3-none-any.whl", hash = "sha256:6b301e63f967481f0cc1a3a3bac0cf322b276855bc1b0955468d9deb3f33d511"}, + {file = "msal-1.29.0.tar.gz", hash = "sha256:8f6725f099752553f9b2fe84125e2a5ebe47b49f92eacca33ebedd3a9ebaae25"}, ] [package.dependencies] -cryptography = ">=2.5,<46" +cryptography = ">=2.5,<45" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.14,<0.18)", "pymsalruntime (>=0.17,<0.18)"] +broker = ["pymsalruntime (>=0.13.2,<0.17)"] [package.source] type = "legacy" @@ -4402,24 +4288,23 @@ reference = "aliyun" [[package]] name = "openai" -version = "1.44.0" +version = "1.35.3" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.44.0-py3-none-any.whl", hash = "sha256:99a12bbda15f9c632ee911851e101669a82ee34992fbfd658a9db27d90dc0a9c"}, - {file = "openai-1.44.0.tar.gz", hash = "sha256:acde74598976ec85bc477e9abb94eeb17f6efd998914d5685eeb46a69116894a"}, + {file = "openai-1.35.3-py3-none-any.whl", hash = "sha256:7b26544cef80f125431c073ffab3811d2421fbb9e30d3bd5c2436aba00b042d5"}, + {file = "openai-1.35.3.tar.gz", hash = "sha256:d6177087f150b381d49499be782d764213fdf638d391b29ca692b84dd675a389"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" -jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" -typing-extensions = ">=4.11,<5" +typing-extensions = ">=4.7,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] @@ -4532,13 +4417,13 @@ reference = "aliyun" [[package]] name = "oslo-config" -version = "9.6.0" +version = "9.4.0" description = "Oslo Configuration API" optional = false python-versions = ">=3.8" files = [ - {file = "oslo.config-9.6.0-py3-none-any.whl", hash = "sha256:7bcd6c3d9dbdd6e4d49a9a6dc3d10ae96073ebe3175280031adc0cbc76500967"}, - {file = "oslo.config-9.6.0.tar.gz", hash = "sha256:9f05ef70e48d9a61a8d0c9bed389da24f2ef5a89df5b6e8deb7c741d6113667e"}, + {file = "oslo.config-9.4.0-py3-none-any.whl", hash = "sha256:8c2049c14cade7adeeda18638531b3b3a40d3c6bcc690535939f64a3c1ec8d63"}, + {file = "oslo.config-9.4.0.tar.gz", hash = "sha256:35b11a661b608edb50305dad91e4e30819d90ef794b7d7dba5bd8b2ef2eb8c0d"}, ] [package.dependencies] @@ -4551,8 +4436,8 @@ rfc3986 = ">=1.2.0" stevedore = ">=1.20.0" [package.extras] -rst-generator = ["rst2txt (>=1.1.0)", "sphinx (>=1.8.0)"] -test = ["bandit (>=1.7.0,<1.8.0)", "coverage (>=4.0)", "fixtures (>=3.0.0)", "hacking (>=6.1.0,<6.2.0)", "mypy (>=0.720)", "oslo.log (>=3.36.0)", "oslotest (>=3.2.0)", "pre-commit (>=2.6.0)", "requests-mock (>=1.5.0)", "stestr (>=2.1.0)", "testscenarios (>=0.4)", "testtools (>=2.2.0)"] +rst-generator = ["rst2txt (>=1.1.0)", "sphinx (>=1.8.0,!=2.1.0)"] +test = ["bandit (>=1.7.0,<1.8.0)", "coverage (>=4.0,!=4.4)", "fixtures (>=3.0.0)", "hacking (>=6.1.0,<6.2.0)", "mypy (>=0.720)", "oslo.log (>=3.36.0)", "oslotest (>=3.2.0)", "pre-commit (>=2.6.0)", "requests-mock (>=1.5.0)", "stestr (>=2.1.0)", "testscenarios (>=0.4)", "testtools (>=2.2.0)"] [package.source] type = "legacy" @@ -4561,17 +4446,17 @@ reference = "aliyun" [[package]] name = "oslo-i18n" -version = "6.4.0" +version = "6.3.0" description = "Oslo i18n library" optional = false python-versions = ">=3.8" files = [ - {file = "oslo.i18n-6.4.0-py3-none-any.whl", hash = "sha256:5417778ba3b1920b70b99859d730ac9bf37f18050dc28af890c66345ba855bc0"}, - {file = "oslo.i18n-6.4.0.tar.gz", hash = "sha256:66e04c041e9ff17d07e13ec7f48295fbc36169143c72ca2352a3efcc98e7b608"}, + {file = "oslo.i18n-6.3.0-py3-none-any.whl", hash = "sha256:698eb5c63a01359ed6d91031d6331098190d38be0bdda7d270264d6f86bc79e7"}, + {file = "oslo.i18n-6.3.0.tar.gz", hash = "sha256:64a251edef8bf1bb1d4e6f78d377e149d4f15c1a9245de77f172016da6267444"}, ] [package.dependencies] -pbr = ">=2.0.0" +pbr = ">=2.0.0,<2.1.0 || >2.1.0" [package.source] type = "legacy" @@ -4580,19 +4465,19 @@ reference = "aliyun" [[package]] name = "oslo-serialization" -version = "5.5.0" +version = "5.4.0" description = "Oslo Serialization library" optional = false python-versions = ">=3.8" files = [ - {file = "oslo.serialization-5.5.0-py3-none-any.whl", hash = "sha256:cd2297c2006be104298843c4d176fb659eba0c6b618a3e3760d650dc771a6df5"}, - {file = "oslo.serialization-5.5.0.tar.gz", hash = "sha256:9e752fc5d8a975956728dd96a82186783b3fefcacbb3553acd933058861e15a6"}, + {file = "oslo.serialization-5.4.0-py3-none-any.whl", hash = "sha256:f999b75f2c2904c2f6aae5efbb67ab668cc0e79470510b721937626b36427220"}, + {file = "oslo.serialization-5.4.0.tar.gz", hash = "sha256:315cb3465e99c685cb091b90365cb701bee7140e204ba3e5fc2d8a20b4ec6e76"}, ] [package.dependencies] msgpack = ">=0.5.2" "oslo.utils" = ">=3.33.0" -pbr = ">=2.0.0" +pbr = ">=2.0.0,<2.1.0 || >2.1.0" tzdata = {version = ">=2022.4", markers = "python_version >= \"3.9\""} [package.source] @@ -4602,19 +4487,19 @@ reference = "aliyun" [[package]] name = "oslo-utils" -version = "7.3.0" +version = "7.1.0" description = "Oslo Utility library" optional = false python-versions = ">=3.8" files = [ - {file = "oslo.utils-7.3.0-py3-none-any.whl", hash = "sha256:a25c0a3270f71fcfa822a72c3f74bd61fe41e97240812986695cd32d4a171fb1"}, - {file = "oslo.utils-7.3.0.tar.gz", hash = "sha256:59a5d3e4e7bbc78d801ccebc2b823e429b624c12bb6e3b6e76f71c29f2bf21df"}, + {file = "oslo.utils-7.1.0-py3-none-any.whl", hash = "sha256:1d6504526c33cc10ae2c72565d0446a82d2acd43eaa5e6f3fd901d78400a2da0"}, + {file = "oslo.utils-7.1.0.tar.gz", hash = "sha256:5e42f3394d1f1f976e8994ac4a0918966d2f7eaf7c77380dd612c4a4148dd98e"}, ] [package.dependencies] debtcollector = ">=1.2.0" iso8601 = ">=0.1.11" -netaddr = ">=0.10.0" +netaddr = ">=0.7.18" netifaces = ">=0.10.4" "oslo.i18n" = ">=3.15.3" packaging = ">=20.4" @@ -4716,13 +4601,13 @@ reference = "aliyun" [[package]] name = "pbr" -version = "6.1.0" +version = "6.0.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" files = [ - {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, - {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, + {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, + {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, ] [package.source] @@ -4855,13 +4740,13 @@ reference = "aliyun" [[package]] name = "portalocker" -version = "2.10.1" +version = "2.10.0" description = "Wraps the portalocker recipe for easy usage" optional = false python-versions = ">=3.8" files = [ - {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, - {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, + {file = "portalocker-2.10.0-py3-none-any.whl", hash = "sha256:48944147b2cd42520549bc1bb8fe44e220296e56f7c3d551bc6ecce69d9b0de1"}, + {file = "portalocker-2.10.0.tar.gz", hash = "sha256:49de8bc0a2f68ca98bf9e219c81a3e6b27097c7bf505a87c5a112ce1aaeb9b81"}, ] [package.dependencies] @@ -4879,13 +4764,13 @@ reference = "aliyun" [[package]] name = "prettytable" -version = "3.11.0" +version = "3.10.0" description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" optional = false python-versions = ">=3.8" files = [ - {file = "prettytable-3.11.0-py3-none-any.whl", hash = "sha256:aa17083feb6c71da11a68b2c213b04675c4af4ce9c541762632ca3f2cb3546dd"}, - {file = "prettytable-3.11.0.tar.gz", hash = "sha256:7e23ca1e68bbfd06ba8de98bf553bf3493264c96d5e8a615c0471025deeba722"}, + {file = "prettytable-3.10.0-py3-none-any.whl", hash = "sha256:6536efaf0757fdaa7d22e78b3aac3b69ea1b7200538c2c6995d649365bddab92"}, + {file = "prettytable-3.10.0.tar.gz", hash = "sha256:9665594d137fb08a1117518c25551e0ede1687197cf353a4fdc78d27e1073568"}, ] [package.dependencies] @@ -4961,22 +4846,22 @@ reference = "aliyun" [[package]] name = "protobuf" -version = "4.25.4" +version = "4.25.3" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, - {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, - {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, - {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, - {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, - {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, - {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, - {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, - {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] [package.source] @@ -5268,23 +5153,19 @@ reference = "aliyun" [[package]] name = "pydantic" -version = "2.9.0" +version = "2.7.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.0-py3-none-any.whl", hash = "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370"}, - {file = "pydantic-2.9.0.tar.gz", hash = "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598"}, + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.23.2" -typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, -] -tzdata = {version = "*", markers = "python_version >= \"3.9\""} +pydantic-core = "2.18.4" +typing-extensions = ">=4.6.1" [package.extras] email = ["email-validator (>=2.0.0)"] @@ -5296,100 +5177,90 @@ reference = "aliyun" [[package]] name = "pydantic-core" -version = "2.23.2" +version = "2.18.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7d0324a35ab436c9d768753cbc3c47a865a2cbc0757066cb864747baa61f6ece"}, - {file = "pydantic_core-2.23.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:276ae78153a94b664e700ac362587c73b84399bd1145e135287513442e7dfbc7"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c7aa318da542cdcc60d4a648377ffe1a2ef0eb1e996026c7f74507b720a78"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cf842265a3a820ebc6388b963ead065f5ce8f2068ac4e1c713ef77a67b71f7c"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae90b9e50fe1bd115b24785e962b51130340408156d34d67b5f8f3fa6540938e"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ae65fdfb8a841556b52935dfd4c3f79132dc5253b12c0061b96415208f4d622"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c8aa40f6ca803f95b1c1c5aeaee6237b9e879e4dfb46ad713229a63651a95fb"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c53100c8ee5a1e102766abde2158077d8c374bee0639201f11d3032e3555dfbc"}, - {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b9dd6aa03c812017411734e496c44fef29b43dba1e3dd1fa7361bbacfc1354"}, - {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b18cf68255a476b927910c6873d9ed00da692bb293c5b10b282bd48a0afe3ae2"}, - {file = "pydantic_core-2.23.2-cp310-none-win32.whl", hash = "sha256:e460475719721d59cd54a350c1f71c797c763212c836bf48585478c5514d2854"}, - {file = "pydantic_core-2.23.2-cp310-none-win_amd64.whl", hash = "sha256:5f3cf3721eaf8741cffaf092487f1ca80831202ce91672776b02b875580e174a"}, - {file = "pydantic_core-2.23.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8"}, - {file = "pydantic_core-2.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57"}, - {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4"}, - {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa"}, - {file = "pydantic_core-2.23.2-cp311-none-win32.whl", hash = "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576"}, - {file = "pydantic_core-2.23.2-cp311-none-win_amd64.whl", hash = "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589"}, - {file = "pydantic_core-2.23.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec"}, - {file = "pydantic_core-2.23.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0"}, - {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73"}, - {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0"}, - {file = "pydantic_core-2.23.2-cp312-none-win32.whl", hash = "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f"}, - {file = "pydantic_core-2.23.2-cp312-none-win_amd64.whl", hash = "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342"}, - {file = "pydantic_core-2.23.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac"}, - {file = "pydantic_core-2.23.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604"}, - {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d"}, - {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced"}, - {file = "pydantic_core-2.23.2-cp313-none-win32.whl", hash = "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1"}, - {file = "pydantic_core-2.23.2-cp313-none-win_amd64.whl", hash = "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac"}, - {file = "pydantic_core-2.23.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:743e5811b0c377eb830150d675b0847a74a44d4ad5ab8845923d5b3a756d8100"}, - {file = "pydantic_core-2.23.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6650a7bbe17a2717167e3e23c186849bae5cef35d38949549f1c116031b2b3aa"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56e6a12ec8d7679f41b3750ffa426d22b44ef97be226a9bab00a03365f217b2b"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810ca06cca91de9107718dc83d9ac4d2e86efd6c02cba49a190abcaf33fb0472"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:785e7f517ebb9890813d31cb5d328fa5eda825bb205065cde760b3150e4de1f7"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ef71ec876fcc4d3bbf2ae81961959e8d62f8d74a83d116668409c224012e3af"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d50ac34835c6a4a0d456b5db559b82047403c4317b3bc73b3455fefdbdc54b0a"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16b25a4a120a2bb7dab51b81e3d9f3cde4f9a4456566c403ed29ac81bf49744f"}, - {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:41ae8537ad371ec018e3c5da0eb3f3e40ee1011eb9be1da7f965357c4623c501"}, - {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07049ec9306ec64e955b2e7c40c8d77dd78ea89adb97a2013d0b6e055c5ee4c5"}, - {file = "pydantic_core-2.23.2-cp38-none-win32.whl", hash = "sha256:086c5db95157dc84c63ff9d96ebb8856f47ce113c86b61065a066f8efbe80acf"}, - {file = "pydantic_core-2.23.2-cp38-none-win_amd64.whl", hash = "sha256:67b6655311b00581914aba481729971b88bb8bc7996206590700a3ac85e457b8"}, - {file = "pydantic_core-2.23.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:358331e21a897151e54d58e08d0219acf98ebb14c567267a87e971f3d2a3be59"}, - {file = "pydantic_core-2.23.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4d9f15ffe68bcd3898b0ad7233af01b15c57d91cd1667f8d868e0eacbfe3f87"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0123655fedacf035ab10c23450163c2f65a4174f2bb034b188240a6cf06bb123"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6e3ccebdbd6e53474b0bb7ab8b88e83c0cfe91484b25e058e581348ee5a01a5"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc535cb898ef88333cf317777ecdfe0faac1c2a3187ef7eb061b6f7ecf7e6bae"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aab9e522efff3993a9e98ab14263d4e20211e62da088298089a03056980a3e69"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05b366fb8fe3d8683b11ac35fa08947d7b92be78ec64e3277d03bd7f9b7cda79"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7568f682c06f10f30ef643a1e8eec4afeecdafde5c4af1b574c6df079e96f96c"}, - {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cdd02a08205dc90238669f082747612cb3c82bd2c717adc60f9b9ecadb540f80"}, - {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a2ab4f410f4b886de53b6bddf5dd6f337915a29dd9f22f20f3099659536b2f6"}, - {file = "pydantic_core-2.23.2-cp39-none-win32.whl", hash = "sha256:0448b81c3dfcde439551bb04a9f41d7627f676b12701865c8a2574bcea034437"}, - {file = "pydantic_core-2.23.2-cp39-none-win_amd64.whl", hash = "sha256:4cebb9794f67266d65e7e4cbe5dcf063e29fc7b81c79dc9475bd476d9534150e"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e758d271ed0286d146cf7c04c539a5169a888dd0b57026be621547e756af55bc"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f477d26183e94eaafc60b983ab25af2a809a1b48ce4debb57b343f671b7a90b6"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da3131ef2b940b99106f29dfbc30d9505643f766704e14c5d5e504e6a480c35e"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329a721253c7e4cbd7aad4a377745fbcc0607f9d72a3cc2102dd40519be75ed2"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7706e15cdbf42f8fab1e6425247dfa98f4a6f8c63746c995d6a2017f78e619ae"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e64ffaf8f6e17ca15eb48344d86a7a741454526f3a3fa56bc493ad9d7ec63936"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dd59638025160056687d598b054b64a79183f8065eae0d3f5ca523cde9943940"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:12625e69b1199e94b0ae1c9a95d000484ce9f0182f9965a26572f054b1537e44"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d813fd871b3d5c3005157622ee102e8908ad6011ec915a18bd8fde673c4360e"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1eb37f7d6a8001c0f86dc8ff2ee8d08291a536d76e49e78cda8587bb54d8b329"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce7eaf9a98680b4312b7cebcdd9352531c43db00fca586115845df388f3c465"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f087879f1ffde024dd2788a30d55acd67959dcf6c431e9d3682d1c491a0eb474"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ce883906810b4c3bd90e0ada1f9e808d9ecf1c5f0b60c6b8831d6100bcc7dd6"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a8031074a397a5925d06b590121f8339d34a5a74cfe6970f8a1124eb8b83f4ac"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23af245b8f2f4ee9e2c99cb3f93d0e22fb5c16df3f2f643f5a8da5caff12a653"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c57e493a0faea1e4c38f860d6862ba6832723396c884fbf938ff5e9b224200e2"}, - {file = "pydantic_core-2.23.2.tar.gz", hash = "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, ] [package.dependencies] @@ -5578,13 +5449,13 @@ reference = "aliyun" [[package]] name = "pyjwt" -version = "2.9.0" +version = "2.8.0" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] [package.dependencies] @@ -5592,8 +5463,8 @@ cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryp [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [package.source] @@ -5718,92 +5589,43 @@ reference = "aliyun" [[package]] name = "pymssql" -version = "2.3.1" +version = "2.2.8" description = "DB-API interface to Microsoft SQL Server for Python. (new Cython-based version)" optional = false python-versions = "*" files = [ - {file = "pymssql-2.3.1-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:001b3321a5f620b80d1427933fcca11b05f29a808d7772a84d18d01e640ee60a"}, - {file = "pymssql-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15466dd41be5e32302f0c4791f612aadd608a0e6ec0b10d769e76cbb4c86aa97"}, - {file = "pymssql-2.3.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74349040d4ff6f05894aefb5109ecffcd416e1e366d9951085d3225a9d09c46b"}, - {file = "pymssql-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc79dbe5eca8825b73830c8bb147b6f588300dc7510393822682162dc4ff003f"}, - {file = "pymssql-2.3.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0b93ebe2feb45e772ca708bc4cd70f3e4c72796ec1b157fd5d80cdc589c786aa"}, - {file = "pymssql-2.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:44b1c8752c0fc6750902c1c521f258bdf4271bfbf7b2a5fee469b6ad00631aab"}, - {file = "pymssql-2.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fdfadb055a9ecad58356decfecc41626999ad7b548cc7ea898cf159e2217f7bb"}, - {file = "pymssql-2.3.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:46f1074c6763e9a899128f22a0f72e9fb0035535f48efabd6a294db1c149e6f1"}, - {file = "pymssql-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ebb11b61d99ec5bbe0b8c411ff748a90263cdaf474881de231da8184e721c42c"}, - {file = "pymssql-2.3.1-cp310-cp310-win32.whl", hash = "sha256:2ef07fdee3e9652d39b4c081c5c5e1a1031abd122b402ed66813bceb3874ccea"}, - {file = "pymssql-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:791522339215cb7f88db54c831a2347e0c4d69dd3092a343eea5b9339adf4412"}, - {file = "pymssql-2.3.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:0433ffa1c86290a93e81176f377621cb70405be66ade8f3070d3f5ec9cfebdba"}, - {file = "pymssql-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6182d82ebfbe46f0e7748d068c6a1c16c0f4fe1f34f1c390f63375cee79b44b0"}, - {file = "pymssql-2.3.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfbe07dcf0aaee8ce630624669cb2fb77b76743d4dd925f99331422be8704de3"}, - {file = "pymssql-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d999c8e5d5d48e9305c4132392825de402f13feea15694e4e7103029b6eae06"}, - {file = "pymssql-2.3.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2dced0a76d8e99c283103a2e3c825ca22c67f1f8fc5cff657510f4d2ffb9d188"}, - {file = "pymssql-2.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:880d3173025dea3babf5ab862875b3c76a5cf8df5b292418050c7793c651c0b2"}, - {file = "pymssql-2.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9f89c698e29ce5c576e4980ded89c00b45e482ec02759bfbfc1aa326648cf64a"}, - {file = "pymssql-2.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f4f2a38ce6e39ed2414c20ca16deaea4340868033a4bb23d5e4e30c72290caf"}, - {file = "pymssql-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e34e8aa1d3da555dbf23141b02f401267c0be32104b4f030afd0bae62d26d735"}, - {file = "pymssql-2.3.1-cp311-cp311-win32.whl", hash = "sha256:72e57e20802bf97399e050a0760a4541996fc27bc605a1a25e48ca6fe4913c48"}, - {file = "pymssql-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b5d3604bca2fa8d5ba2eed1582a3c8a83970a8d2edabfcfd87c1edecb7617d16"}, - {file = "pymssql-2.3.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:c28f1b9560b82fe1a1e51d8c56f6d36bca7c507a8cdf2caa2a0642503c220d5c"}, - {file = "pymssql-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3509b75747eb22ae89f3d47ae316a4b9eac7d952269e88b356ef117a1b8e3b8"}, - {file = "pymssql-2.3.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cca3bed27e1ab867e482fa8b529d408489ad57e8b60452f75ef288da90573db6"}, - {file = "pymssql-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fe3276915e6040daec409203e3143aa2826984adb8d223c155dab91010110a4"}, - {file = "pymssql-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d36d566d0d6997c95442c3d2902800e6b072ccc017c6284e5b1bd4e17dc8fada"}, - {file = "pymssql-2.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3564df40a678623a769acd9677dc68228b2694170132c6f296eb62bf766d31e4"}, - {file = "pymssql-2.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3dbd4106faabf97f028d0ac59b30d132cfb5e48cf5314b0476f293123dbf3422"}, - {file = "pymssql-2.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:acd1690d9b1b2ece9d0e1fd7d68571fc9fa56b6ba8697a3132446419ff7fb3f4"}, - {file = "pymssql-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:126e0b78773975136e6385da7286c277e2e0320c1f4bee0e4dc61a5edcf98c41"}, - {file = "pymssql-2.3.1-cp312-cp312-win32.whl", hash = "sha256:21803b731b8c8780fc974d9b4931fa8f1ca29c227502a4c317e12773c8bdef43"}, - {file = "pymssql-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:6b0224fc5ce4cf0703278859f145e3e921c04d9feb59739a104d3020bbf0c0c1"}, - {file = "pymssql-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:709c1df3134e330ee9590437253be363b558154bde5bb54856fc5fe68a03c971"}, - {file = "pymssql-2.3.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9381eafaf529815f2d61f22b99e0538e744b31234f17d4384f5b0496bd1fbed"}, - {file = "pymssql-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3bf78789014f202855f5d00de982bbcd95177fe8bcf920f0ce730b72456c173"}, - {file = "pymssql-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4b44280eedd0a3f031e9464d4fc632a215fadcfb375bb479065b61a6337df402"}, - {file = "pymssql-2.3.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:922f536b925880c260968c8f2130b1c9d6315b83f300f18365b5421933f034a2"}, - {file = "pymssql-2.3.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f00f618d1c0f58617de548e5094f7d55ab6034b94068d7eebba60a034866b10b"}, - {file = "pymssql-2.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b363db86a1a3fe16df9b4253e17b02a268d0f2e2753679b8e85cee268e2fe8c4"}, - {file = "pymssql-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:396a26cf576196cc4a3d77890b2b8eb62655ff02846288757dd8b587352cc4f5"}, - {file = "pymssql-2.3.1-cp36-cp36m-win32.whl", hash = "sha256:5a1a1c697596f23058697709144d00a44e7af6ecab6a517f2ecf28dcf8fb4280"}, - {file = "pymssql-2.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:4f92e8657d42341dce01f7f57d03f84b35c0ed00a7bef24533ff80a37ffcfb4e"}, - {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:095b50e43bfbc4d6f953810175ba275bb3e6136206f3a7146bdd1031e3f0dd9b"}, - {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ac89098732c327725b53464932c6a532367271a3d5c5a988f61e23e0e0e286"}, - {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f284fc052cf1dbc702a2f4d13442d87fc6847ba9054faccfc8d8446fcf00894"}, - {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:40778b65c09eef9e7c25c444b96e76f81d8b5cf1828cb555123d052b7d3b5661"}, - {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c8609bc7f8b13d383729ba09042b4d796a607c93779c616be51b37caa6b384"}, - {file = "pymssql-2.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ab2aea2ae8bc1aba0105fccbf9e4f6716648b2b8f9421fd3418c6cc798fca43e"}, - {file = "pymssql-2.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e594de69832ad13761412f4d5c981a6e5d931b22f25136c8cd3531d9c6cfdf63"}, - {file = "pymssql-2.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:68f879b4ec4b2191a1d8b3bb24db04c3631737653785369c275bd5a574e54093"}, - {file = "pymssql-2.3.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:9ef157e63a1c19e7ab4823237b5f03a3bca45e1e94a4d5ed73baab6d019830c7"}, - {file = "pymssql-2.3.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:66afe6ee539e37cdfea0c6b2d596ec0d2a6223f09450c4df7cf872bad12691fe"}, - {file = "pymssql-2.3.1-cp37-cp37m-win32.whl", hash = "sha256:b9cc14a9f63e632200f54311da9868ece2715fa9560f6272c9bb82c57edc0543"}, - {file = "pymssql-2.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54bc10f28c0acc1347d3c7056e702ad21f128e6bf7737b4edc8c267372db9ce8"}, - {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8d955e751fb125be2a8513b5a338457a3fe73e5daa094815f96a86e496f7149"}, - {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c13ca6eaf0d7f16af9edf87d58070329bfacb7f27b90e1de16318d64c7b873b"}, - {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ecb0cdea24e2c019fb403fd642c04a64e8767c79f8dd38451eb5d72ceffce34"}, - {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:afd57a728e81d73a0f43f3d28216c402fea03bd06a382da881dfc8215fb4080d"}, - {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e6f6d9de73309cda602bbb769cb707f08d6899664f3ac6e9ed3e3b1ad472cee"}, - {file = "pymssql-2.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:02b808dbb86bbe751dd3fd117e83926b0a19ca9d9b833fae945bf2e31be66bf6"}, - {file = "pymssql-2.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0f1ba9befe23e6c4e75c2a626ffe59d159ab3a425a0208515888ec8670bf5bf"}, - {file = "pymssql-2.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8eecb4f3b41b8b29a0cbe502ae37b6477063d690151f668c410328f101f6198b"}, - {file = "pymssql-2.3.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a36c8b089e2d7b606aee823eefdfd72f5df110241fc5d913094b0b9da2692794"}, - {file = "pymssql-2.3.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:425de7d3f38cd1867c30b7c352d66020f38fdcdf804282ee232f5e25672930c1"}, - {file = "pymssql-2.3.1-cp38-cp38-win32.whl", hash = "sha256:ce397eb6a2a90fcd2a83d8812c1b8752af3b5362e630da49aa556c947e32ce3d"}, - {file = "pymssql-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:02c4ab7a58bfb57edb2deee7e2aceed2512960e7c2c1fd2cb23c647471a36ba2"}, - {file = "pymssql-2.3.1-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:750078568dafc1e0a24cf0f51eecfe548b13440976a2c8b19cc6e5d38e7b10bc"}, - {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a651dd98f67eef98f429c949fb50ea0a92fcf8668834cc35909237c24c1b906"}, - {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1ecedaeec8f4d8643d088b4985f0b742d9669bff701153a845b0d1900260b81"}, - {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015f6ccd1bcb53f22a3226653d0d8155da40f4afbc1fd0cec25de5fe8decf126"}, - {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:da44761ca2f996d88f90c0f972b583dfe9c389db84888bd8209cdb83508f7c7a"}, - {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9557b738475e06dfd53f97d8a2c2b259b9b9fd79bf1a4e084ae4e9f164be644d"}, - {file = "pymssql-2.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f3f2e2792364a50417f3c2dc0d8f125955c1b641f36eb313daf666045b9748"}, - {file = "pymssql-2.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:be8af4dea025f171ffb1e5b17cb0c9cbc92b0e3c32d0517bc678fff6f660e5fb"}, - {file = "pymssql-2.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a87950fb1a2b1c4028064fac971f3e191adebb58657ca985330f70e02f95223e"}, - {file = "pymssql-2.3.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9ea04bf8e13d567650631a944c88886c99a5622d9491e896a9b5a9ffbef2e352"}, - {file = "pymssql-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d93a82f8ad7d3606354b81bbbe7e7832f70fd6e9ccb2e04a2975117da5df973"}, - {file = "pymssql-2.3.1-cp39-cp39-win32.whl", hash = "sha256:6a2657152d4007314b66f353a25fc2742155c2770083320b5255fc576103661e"}, - {file = "pymssql-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6c9ffb3ef110bf0fc2a41c845f231cf749162b1d71e02b0aceb6c0ebc603e2e9"}, - {file = "pymssql-2.3.1.tar.gz", hash = "sha256:ddee15c4c193e14c92fe2cd720ca9be1dba1e0f4178240380b8f5f6f00da04c6"}, + {file = "pymssql-2.2.8-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bfd7b8edef78097ccd3f52ac3f3a5c3cf0019f8a280f306cacbbb165caaf63"}, + {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:049f2e3de919e8e02504780a21ebbf235e21ca8ed5c7538c5b6e705aa6c43d8c"}, + {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd86d8e3e346e34f3f03d12e333747b53a1daa74374a727f4714d5b82ee0dd5"}, + {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:508226a0df7cb6faeda9f8e84e85743690ca427d7b27af9a73d75fcf0c1eef6e"}, + {file = "pymssql-2.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:47859887adeaf184766b5e0bc845dd23611f3808f9521552063bb36eabc10092"}, + {file = "pymssql-2.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d873e553374d5b1c57fe1c43bb75e3bcc2920678db1ef26f6bfed396c7d21b30"}, + {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf31b8b76634c826a91f9999e15b7bfb0c051a0f53b319fd56481a67e5b903bb"}, + {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:821945c2214fe666fd456c61e09a29a00e7719c9e136c801bffb3a254e9c579b"}, + {file = "pymssql-2.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:cc85b609b4e60eac25fa38bbac1ff854fd2c2a276e0ca4a3614c6f97efb644bb"}, + {file = "pymssql-2.2.8-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:ebe7f64d5278d807f14bea08951e02512bfbc6219fd4d4f15bb45ded885cf3d4"}, + {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:253af3d39fc0235627966817262d5c4c94ad09dcbea59664748063470048c29c"}, + {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9d109df536dc5f7dd851a88d285a4c9cb12a9314b621625f4f5ab1197eb312"}, + {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:358d5acf0298d6618edf7fedc4ce3dc8fb5ce8a9db85e7332d5196d29d841821"}, + {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:63e1be8936372c07aee2405203ee0161ce76b03893cafe3d46841be9886f5ffe"}, + {file = "pymssql-2.2.8-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:381d8a47c4665d99f114849bed23bcba1922c9d005accc3ac19cee8a1d3522dc"}, + {file = "pymssql-2.2.8-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4f365033c9b4263b74b8a332bbdf2d7d8d7230f05805439b4f3fbf0a0164acfe"}, + {file = "pymssql-2.2.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03903bdf23a2aac26e9b772b3998efeba079fcb6fcfa6df7abc614e9afa14af0"}, + {file = "pymssql-2.2.8-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:5c83208138f87942c5f08aa50c5fb8d89b7f15340cde58a77b08f49df277e134"}, + {file = "pymssql-2.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7e4538e85d7b5fb3867636391f91e9e18ac2e0aef660d25e97268e04339f2c36"}, + {file = "pymssql-2.2.8-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:e920d6f805a525f19e770e48326a5f96b83d7b8dfd093f5b7015b54ef84bcf4c"}, + {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2446645eb8684c0cb246a3294110455dd89a29608dfa7a58ea88aa42aa1cf005"}, + {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3906993300650844ec140aa58772c0f5f3e9e9d5709c061334fd1551acdcf066"}, + {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7309c7352e4a87c9995c3183ebfe0ff4135e955bb759109637673c61c9f0ca8d"}, + {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b8d603cc1ec7ae585c5a409a1d45e8da067970c79dd550d45c238ae0aa0f79f"}, + {file = "pymssql-2.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:293cb4d0339e221d877d6b19a1905082b658f0100a1e2ccc9dda10de58938901"}, + {file = "pymssql-2.2.8-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:895041edd002a2e91d8a4faf0906b6fbfef29d9164bc6beb398421f5927fa40e"}, + {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b2d9c6d38a416c6f2db36ff1cd8e69f9a5387a46f9f4f612623192e0c9404b1"}, + {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63d6f25cf40fe6a03c49be2d4d337858362b8ab944d6684c268e4990807cf0c"}, + {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c83ad3ad20951f3a94894b354fa5fa9666dcd5ebb4a635dad507c7d1dd545833"}, + {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3933f7f082be74698eea835df51798dab9bc727d94d3d280bffc75ab9265f890"}, + {file = "pymssql-2.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:de313375b90b0f554058992f35c4a4beb3f6ec2f5912d8cd6afb649f95b03a9f"}, + {file = "pymssql-2.2.8.tar.gz", hash = "sha256:9baefbfbd07d0142756e2dfcaa804154361ac5806ab9381350aad4e780c3033e"}, ] [package.source] @@ -5883,13 +5705,13 @@ reference = "aliyun" [[package]] name = "pyparsing" -version = "3.1.4" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, - {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -5922,13 +5744,13 @@ reference = "aliyun" [[package]] name = "pyspnego" -version = "0.11.1" +version = "0.11.0" description = "Windows Negotiate Authentication Client and Server" optional = false python-versions = ">=3.8" files = [ - {file = "pyspnego-0.11.1-py3-none-any.whl", hash = "sha256:129a4294f2c4d681d5875240ef87accc6f1d921e8983737fb0b59642b397951e"}, - {file = "pyspnego-0.11.1.tar.gz", hash = "sha256:e92ed8b0a62765b9d6abbb86a48cf871228ddb97678598dc01c9c39a626823f6"}, + {file = "pyspnego-0.11.0-py3-none-any.whl", hash = "sha256:cdfe9af7b19749d692e02fd4bd1b4b71d44ecb8dd9b2474abb0f3d90f6154e7e"}, + {file = "pyspnego-0.11.0.tar.gz", hash = "sha256:17dda4fbf725094c440e68709601c1575db83d9c844c9efedf0ad4dd1b72e5a0"}, ] [package.dependencies] @@ -5967,13 +5789,12 @@ reference = "aliyun" [[package]] name = "python-crontab" -version = "3.2.0" +version = "3.1.0" description = "Python Crontab API" optional = false python-versions = "*" files = [ - {file = "python_crontab-3.2.0-py3-none-any.whl", hash = "sha256:82cb9b6a312d41ff66fd3caf3eed7115c28c195bfb50711bc2b4b9592feb9fe5"}, - {file = "python_crontab-3.2.0.tar.gz", hash = "sha256:40067d1dd39ade3460b2ad8557c7651514cd3851deffff61c5c60e1227c5c36b"}, + {file = "python-crontab-3.1.0.tar.gz", hash = "sha256:f4ea1605d24533b67fa7a634ef26cb59a5f2e7954f6e677d2d7a2229959a2fc8"}, ] [package.dependencies] @@ -6604,23 +6425,18 @@ reference = "aliyun" [[package]] name = "setuptools" -version = "74.1.2" +version = "70.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, - {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, + {file = "setuptools-70.1.0-py3-none-any.whl", hash = "sha256:d9b8b771455a97c8a9f3ab3448ebe0b29b5e105f1228bba41028be116985a267"}, + {file = "setuptools-70.1.0.tar.gz", hash = "sha256:01a1e793faa5bd89abc851fa15d0a0db26f160890c7102cd8dce643e886b47f5"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [package.source] type = "legacy" @@ -6760,13 +6576,13 @@ reference = "aliyun" [[package]] name = "soupsieve" -version = "2.6" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, - {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [package.source] @@ -6776,13 +6592,13 @@ reference = "aliyun" [[package]] name = "sqlparse" -version = "0.5.1" +version = "0.5.0" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" files = [ - {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, - {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, + {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, + {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, ] [package.extras] @@ -6887,17 +6703,17 @@ reference = "aliyun" [[package]] name = "stevedore" -version = "5.3.0" +version = "5.2.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.8" files = [ - {file = "stevedore-5.3.0-py3-none-any.whl", hash = "sha256:1efd34ca08f474dad08d9b19e934a22c68bb6fe416926479ba29e5013bcc8f78"}, - {file = "stevedore-5.3.0.tar.gz", hash = "sha256:9a64265f4060312828151c204efbe9b7a9852a0d9228756344dbc7e4023e375a"}, + {file = "stevedore-5.2.0-py3-none-any.whl", hash = "sha256:1c15d95766ca0569cad14cb6272d4d31dae66b011a929d7c18219c176ea1b5c9"}, + {file = "stevedore-5.2.0.tar.gz", hash = "sha256:46b93ca40e1114cea93d738a6c1e365396981bb6bb78c27045b7587c9473544d"}, ] [package.dependencies] -pbr = ">=2.0.0" +pbr = ">=2.0.0,<2.1.0 || >2.1.0" [package.source] type = "legacy" @@ -7029,13 +6845,13 @@ reference = "aliyun" [[package]] name = "twisted" -version = "24.7.0" +version = "24.3.0" description = "An asynchronous networking framework written in Python" optional = false python-versions = ">=3.8.0" files = [ - {file = "twisted-24.7.0-py3-none-any.whl", hash = "sha256:734832ef98108136e222b5230075b1079dad8a3fc5637319615619a7725b0c81"}, - {file = "twisted-24.7.0.tar.gz", hash = "sha256:5a60147f044187a127ec7da96d170d49bcce50c6fd36f594e60f4587eff4d394"}, + {file = "twisted-24.3.0-py3-none-any.whl", hash = "sha256:039f2e6a49ab5108abd94de187fa92377abe5985c7a72d68d0ad266ba19eae63"}, + {file = "twisted-24.3.0.tar.gz", hash = "sha256:6b38b6ece7296b5e122c9eb17da2eeab3d98a198f50ca9efd00fb03e5b4fd4ae"}, ] [package.dependencies] @@ -7044,26 +6860,60 @@ automat = ">=0.8.0" constantly = ">=15.1" hyperlink = ">=17.1.1" idna = {version = ">=2.4", optional = true, markers = "extra == \"tls\""} -incremental = ">=24.7.0" +incremental = ">=22.10.0" pyopenssl = {version = ">=21.0.0", optional = true, markers = "extra == \"tls\""} service-identity = {version = ">=18.1.0", optional = true, markers = "extra == \"tls\""} +twisted-iocpsupport = {version = ">=1.0.2,<2", markers = "platform_system == \"Windows\""} typing-extensions = ">=4.2.0" zope-interface = ">=5" [package.extras] -all-non-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +all-non-platform = ["twisted[conch,http2,serial,test,tls]", "twisted[conch,http2,serial,test,tls]"] conch = ["appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)"] -dev = ["coverage (>=7.5,<8.0)", "cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.56)", "pydoctor (>=23.9.0,<23.10.0)", "pyflakes (>=2.2,<3.0)", "pyhamcrest (>=2)", "python-subunit (>=1.4,<2.0)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "twistedchecker (>=0.7,<1.0)"] +dev = ["coverage (>=6b1,<7)", "pyflakes (>=2.2,<3.0)", "python-subunit (>=1.4,<2.0)", "twisted[dev-release]", "twistedchecker (>=0.7,<1.0)"] dev-release = ["pydoctor (>=23.9.0,<23.10.0)", "pydoctor (>=23.9.0,<23.10.0)", "sphinx (>=6,<7)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "towncrier (>=23.6,<24.0)"] -gtk-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pygobject", "pygobject", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +gtk-platform = ["pygobject", "pygobject", "twisted[all-non-platform]", "twisted[all-non-platform]"] http2 = ["h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)"] -macos-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] -mypy = ["appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "coverage (>=7.5,<8.0)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "idna (>=2.4)", "mypy (>=1.8,<2.0)", "mypy-zope (>=1.0.3,<1.1.0)", "priority (>=1.1.0,<2.0)", "pydoctor (>=23.9.0,<23.10.0)", "pyflakes (>=2.2,<3.0)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "python-subunit (>=1.4,<2.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "twistedchecker (>=0.7,<1.0)", "types-pyopenssl", "types-setuptools"] -osx-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +macos-platform = ["pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "twisted[all-non-platform]", "twisted[all-non-platform]"] +mypy = ["mypy (>=1.8,<2.0)", "mypy-zope (>=1.0.3,<1.1.0)", "twisted[all-non-platform,dev]", "types-pyopenssl", "types-setuptools"] +osx-platform = ["twisted[macos-platform]", "twisted[macos-platform]"] serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] test = ["cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.56)", "pyhamcrest (>=2)"] tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] -windows-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)", "twisted-iocpsupport (>=1.0.2)", "twisted-iocpsupport (>=1.0.2)"] +windows-platform = ["pywin32 (!=226)", "pywin32 (!=226)", "twisted[all-non-platform]", "twisted[all-non-platform]"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] +name = "twisted-iocpsupport" +version = "1.0.4" +description = "An extension for use in the twisted I/O Completion Ports reactor." +optional = false +python-versions = "*" +files = [ + {file = "twisted-iocpsupport-1.0.4.tar.gz", hash = "sha256:858096c0d15e33f15ac157f455d8f86f2f2cdd223963e58c0f682a3af8362d89"}, + {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win32.whl", hash = "sha256:afa2b630797f9ed2f27f3d9f55e3f72b4244911e45a8c82756f44babbf0b243e"}, + {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:0058c963c8957bcd3deda62122e89953c9de1e867a274facc9b15dde1a9f31e8"}, + {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win32.whl", hash = "sha256:196f7c7ccad4ba4d1783b1c4e1d1b22d93c04275cd780bf7498d16c77319ad6e"}, + {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:4e5f97bcbabdd79cbaa969b63439b89801ea560f11d42b0a387634275c633623"}, + {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win32.whl", hash = "sha256:6081bd7c2f4fcf9b383dcdb3b3385d75a26a7c9d2be25b6950c3d8ea652d2d2d"}, + {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:76f7e67cec1f1d097d1f4ed7de41be3d74546e1a4ede0c7d56e775c4dce5dfb0"}, + {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:3d306fc4d88a6bcf61ce9d572c738b918578121bfd72891625fab314549024b5"}, + {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:391ac4d6002a80e15f35adc4ad6056f4fe1c17ceb0d1f98ba01b0f4f917adfd7"}, + {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:0c1b5cf37f0b2d96cc3c9bc86fff16613b9f5d0ca565c96cf1f1fb8cfca4b81c"}, + {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:3c5dc11d72519e55f727320e3cee535feedfaee09c0f0765ed1ca7badff1ab3c"}, + {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win32.whl", hash = "sha256:cc86c2ef598c15d824a243c2541c29459881c67fc3c0adb6efe2242f8f0ec3af"}, + {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c27985e949b9b1a1fb4c20c71d315c10ea0f93fdf3ccdd4a8c158b5926edd8c8"}, + {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win32.whl", hash = "sha256:e311dfcb470696e3c077249615893cada598e62fa7c4e4ca090167bd2b7d331f"}, + {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4574eef1f3bb81501fb02f911298af3c02fe8179c31a33b361dd49180c3e644d"}, + {file = "twisted_iocpsupport-1.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:872747a3b64e2909aee59c803ccd0bceb9b75bf27915520ebd32d69687040fa2"}, + {file = "twisted_iocpsupport-1.0.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c2712b778bacf1db434e3e065adfed3db300754186a29aecac1efae9ef4bcaff"}, + {file = "twisted_iocpsupport-1.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7c66fa0aa4236b27b3c61cb488662d85dae746a6d1c7b0d91cf7aae118445adf"}, + {file = "twisted_iocpsupport-1.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:300437af17396a945a58dcfffd77863303a8b6d9e65c6e81f1d2eed55b50d444"}, +] [package.source] type = "legacy" @@ -7219,13 +7069,13 @@ reference = "aliyun" [[package]] name = "urllib3" -version = "1.26.20" +version = "1.26.19" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, - {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, + {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, + {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, ] [package.extras] @@ -7653,103 +7503,101 @@ reference = "aliyun" [[package]] name = "yarl" -version = "1.11.0" +version = "1.9.4" description = "Yet another URL library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "yarl-1.11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a657db1b9982f3dac0e360614d0e8945d2873da6e681fb7fca23ef1c3eb37f8"}, - {file = "yarl-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65a1a05efca52b102691e64db5fcf973030a1c88fee393804ff91f99c95a6e74"}, - {file = "yarl-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f4cb417d380e2d77961eecec75aaaf6f7ab14e6de26eb3a498f498029a6556a1"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8aee7c8378c6aa3103b99d1eb9995268ef730fa9f88ea68b9eee4341e204eec9"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84624db40e2358cfd5cf2558b1aaffd93366d27ee32228a97785f2ec87d44a17"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a596bb15e036952549871a4ccd2205679902dc7f241e3ced6b2ab2e44c55795"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d4d2cc4b076c8ad0175a15ee9482a387b3303c97d4b71062db7356b2ac04c7"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f8bc849004122591104793a576e9c747b0e5d9486d6a30225521b817255748"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e38176a559edde0cfff4b663791a007a5f9f90c73aee1d6f7ddbcf6bfb7287b3"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:706ac0f77b45e9e0278ec6c98929764e119d3ce3136792b6475e7ae961da53ec"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:48bac099586cf75ae5837b0ac17a674450d01f451f38afcb02acfc940110b60b"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:540fd5f62fe21f3d1d9efe8af5c4d9dbbb184ce03ce95acb0289500e46215dd2"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05ab59db0bb64e847972373c5cda8924e6605480f6b13cc04573fa0d87bfc637"}, - {file = "yarl-1.11.0-cp310-cp310-win32.whl", hash = "sha256:ddab47748933ac9cf5f29d6e9e2e2060cff40b2751d02c55129661ea4e577152"}, - {file = "yarl-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:976d02274e6d88b24c7131e7b26a083412b2592f2bbcef53d3b00b2508cad26c"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:39e3087e1ef70862de81e22af9eb299faee580f41673ef92829949022791b521"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7fd535cc41b81a566ad347081b671ab5c7e5f5b6a15526d85b4e748baf065cf0"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f7cc02d8e9a612174869f4b983f159e87659096f7e2dc1fe9effd9902e408739"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f391ccf4b1b1e0ba4880075ba337d41a619a5350f67053927f67ebe764bf44"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c19a0d95943bb2c914b4e71043803be34bc75c08c4a6ca232bdc649a1e9ef1b"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ead4d89eade0e09b8ef97877664abb0e2e8704787db5564f83658fdee5c36497"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:195f7791bc23d5f2480efe53f935daf8a61661000dfbfbdd70dbd06397594fff"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a7905e662665ca8e058635377522bc3c98bdb873be761ff42c86eb72b03914"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53c80b1927b75aed208d7fd965a3a705dc8c1db4d50b9112418fa0f7784363e6"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:11af21bbf807688d49b7d4915bb28cbc2e3aa028a2ee194738477eabcc413c65"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:732d56da00ea7a5da4f0d15adbbd22dcb37da7825510aafde40112e53f6baa52"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7bd54d79025b59d1dc5fb26a09734d6a9cc651a04bc381966ed264b28331a168"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aacd62ff67efd54cb18cea2aa7ae4fb83cfbca19a07055d4777266b70561defe"}, - {file = "yarl-1.11.0-cp311-cp311-win32.whl", hash = "sha256:68e14ae71e5b51c8282ae5db53ccb3baffc40e1551370a8a2361f1c1d8a0bf8c"}, - {file = "yarl-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:3ade2265716667b6bd4123d6f684b5f7cf4a8d83dcf1d5581ac44643466bb00a"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6e73dab98e3c3b5441720153e72a5f28e717aac2d22f1ec4b08ef33417d9987e"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4a0d090d296ced05edfe29c6ff34869412fa6a97d0928c12b00939c4842884cd"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d29e446cfb0a82d3df7745968b9fa286665a9be8b4d68de46bcc32d917cb218e"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8dc0efcf8266ecfe057b95e01f43eb62516196a4bbf3918fd1dcb8d0dc0dff"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:202f5ec49ff163dcc767426deb55020a28078e61d6bbe1f80331d92bca53b236"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8055b0d78ce1cafa657c4b455e22661e8d3b2834de66a0753c3567da47fcc4aa"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60ed3c7f64e820959d7f682ec2f559b4f4df723dc09df619d269853a4214a4b4"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2371510367d39d74997acfdcd1dead17938c79c99365482821627f7838a8eba0"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e24bb6a8be89ccc3ce8c47e8940fdfcb7429e9efbf65ce6fa3e7d122fcf0bcf0"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:18ec42da256cfcb9b4cd5d253e04c291f69911a5228d1438a7d431c15ba0ae40"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:418eeb8f228ea36c368bf6782ebd6016ecebfb1a8b90145ef6726ffcbba65ef8"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:07e8cfb1dd7669a129f8fd5df1da65efa73aea77582bde2a3a837412e2863543"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c458483711d393dad51340505c3fab3194748fd06bab311d2f8b5b7a7349e9a"}, - {file = "yarl-1.11.0-cp312-cp312-win32.whl", hash = "sha256:5b008c3127382503e7a1e12b4c3a3236e3dd833a4c62a066f4a0fbd650c655d2"}, - {file = "yarl-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc94be7472b9f88d7441340534a3ecae05c86ccfec7ba75ce5b6e4778b2bfc6e"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a45e51ba3777031e0b20c1e7ab59114ed4e1884b3c1db48962c1d8d08aefb418"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:765128029218eade3a01187cdd7f375977cc827505ed31828196c8ae9b622928"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2516e238daf0339c8ac4dfab9d7cda9afad652ff073517f200d653d5d8371f7e"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10be62bee117f05b1ad75a6c2538ca9e5367342dc8a4f3c206c87dadbc1189c"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50ceaeda771ee3e382291168c90c7ede62b63ecf3e181024bcfeb35c0ea6c84f"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a601c99fc20fd0eea84e7bc0dc9e7f196f55a0ded67242d724988c754295538"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42ff79371614764fc0a4ab8eaba9adb493bf9ad856e2a4664f6c754fc907a903"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93fca4c9f88c17ead902b3f3285b2d039fc8f26d117e1441973ba64315109b54"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e7dddf5f41395c84fc59e0ed5493b24bfeb39fb04823e880b52c8c55085d4695"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ea501ea07e14ba6364ff2621bfc8b2381e5b1e10353927fa9a607057fd2b98e5"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a4f7e470f2c9c8b8774a5bda72adfb8e9dc4ec32311fe9bdaa4921e36cf6659b"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:361fdb3993431157302b7104d525092b5df4d7d346df5a5ffeee2d1ca8e0d15b"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e300eaf5e0329ad31b3d53e2f3d26b4b6dff1217207c6ab1d4212967b54b2185"}, - {file = "yarl-1.11.0-cp313-cp313-win32.whl", hash = "sha256:f1e2d4ce72e06e38a16da3e9c24a0520dbc19018a69ef6ed57b6b38527cb275c"}, - {file = "yarl-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:fa9de2f87be58f714a230bd1f3ef3aad1ed65c9931146e3fc55f85fcbe6bacc3"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:24da0b38274727fe9266d09229987e7f0efdb97beb94c0bb2d327d65f112e78d"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0310eb2e63872de66047e05ad9982f2e53ad6405dc42fa60d7cc670bf6ca8aa8"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:52433604340a4ab3d1f32281c6eb9ad9b47c99435b4212f763121bf7348c8c00"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e2eb182d59f0845a79434003f94b4f61cd69465248f9388c2e5bf2191c9f7f"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3dd10f0fe0e0f659926c1da791de5bef05fd48974ad74618c9168e302e2b7cc"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:121d3798e4bb35a4321b2422cb887f80ea39f94bf52f0eb5cb2c168bb0043c9b"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8bbac56c80610dd659ace534765d7bcd2488f6600023f6984f35108b2b3f4f0"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79d420399f0e82e302236a762d8b8ceec89761ce3b30c83ac1d4d6e29f811444"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a726fb50588307dfe1d233b67535d493fb0bb157bdbfda6bb34e04189f2f57"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9057f5de2fade7440e6db358913bc7ae8de43ba72c83cf95420a1fc1a6c6b59e"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6471d747d0ac8059895e66d32ca8630c8db5b572ca7763150d0927eaa257df67"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d97cb22ad380850754fa16ef8d490d9340d8573d81f73429f3975e8e87db0586"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fe78dec8caeda1e7b353cbd8aa0cc5a5bc182b22998d64ec8fa9ee59c898ab3b"}, - {file = "yarl-1.11.0-cp38-cp38-win32.whl", hash = "sha256:7ff371002fbbb79613269d76a2932c99979dac15fac30107064ef70d25f35474"}, - {file = "yarl-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:4fa9d762eee63eed767895d68b994c58e29f809292a4d0fca483e9cc6fdc22c8"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4ae63bc65e5bf8843bd1eca46e75eaa9eb157e0312fb362123181512892daad8"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d1bd3262e00043907e0a6d7d4f7b7a4815281acc25699a2384552870c79f1f0"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c58656c2e0b41b5d325130b8da4f8e216aad10029e7de5c523a6be25faa9fe8"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9425c333575fce5e0fb414b766492c6ba4aa335ef910a7540dbdefe58a78232e"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dc66e2420e1e282105071934883bbb9c37c16901b5b8aa0a8aee370b477eac6"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2949067359d1ef5bf3228c7f1deb102c209832a13df5419239f99449bc1d3fa9"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c006fe73f851cf20b9986b3b4cc15239795bd5da9c3fda76bb3e043da5bec4ff"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:969ad4ee3892e893471b6572bbf2bbb091f93e7c81de25d6b3a5c0a5126e5ccb"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c9fbe9dc6ee8bfe1af34137e3add6f0e49799dd5467dd6af189d27616879161e"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69a45c711fea9b783b592a75f26f6dc59b2e4a923b97bf6eec357566fcb1d922"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1a29b82c42a7791ffe53ee6dfbf29acc61ea7ec05643dcacc50510ed6187b897"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ed0c090f00c3fc024f7b0799cab9dd7c419fcd8f1a00634d1f9952bab7e7bfb2"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:31df9d9b3fe6e15decee629fc7976a5fb21eaa39e290f60e57e1d422827194c6"}, - {file = "yarl-1.11.0-cp39-cp39-win32.whl", hash = "sha256:fcb7c36ba8b663a5900e6d40533f0e698ba0f38f744aad5410d4e38129e41a70"}, - {file = "yarl-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c6c0d640bad721834a737e25267fb71d296684ada21ca7d5ad2e63da7b73f1b7"}, - {file = "yarl-1.11.0-py3-none-any.whl", hash = "sha256:03717a6627e55934b2a1d9caf24f299b461a2e8d048a90920f42ad5c20ae1b82"}, - {file = "yarl-1.11.0.tar.gz", hash = "sha256:f86f4f4a57a29ef08fa70c4667d04c5e3ba513500da95586208b285437cb9592"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -7763,45 +7611,47 @@ reference = "aliyun" [[package]] name = "zope-interface" -version = "7.0.3" +version = "6.4.post2" description = "Interfaces for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "zope.interface-7.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b9369671a20b8d039b8e5a1a33abd12e089e319a3383b4cc0bf5c67bd05fe7b"}, - {file = "zope.interface-7.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db6237e8fa91ea4f34d7e2d16d74741187e9105a63bbb5686c61fea04cdbacca"}, - {file = "zope.interface-7.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53d678bb1c3b784edbfb0adeebfeea6bf479f54da082854406a8f295d36f8386"}, - {file = "zope.interface-7.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3aa8fcbb0d3c2be1bfd013a0f0acd636f6ed570c287743ae2bbd467ee967154d"}, - {file = "zope.interface-7.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6195c3c03fef9f87c0dbee0b3b6451df6e056322463cf35bca9a088e564a3c58"}, - {file = "zope.interface-7.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:11fa1382c3efb34abf16becff8cb214b0b2e3144057c90611621f2d186b7e1b7"}, - {file = "zope.interface-7.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:af94e429f9d57b36e71ef4e6865182090648aada0cb2d397ae2b3f7fc478493a"}, - {file = "zope.interface-7.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dd647fcd765030638577fe6984284e0ebba1a1008244c8a38824be096e37fe3"}, - {file = "zope.interface-7.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bee1b722077d08721005e8da493ef3adf0b7908e0cd85cc7dc836ac117d6f32"}, - {file = "zope.interface-7.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2545d6d7aac425d528cd9bf0d9e55fcd47ab7fd15f41a64b1c4bf4c6b24946dc"}, - {file = "zope.interface-7.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d04b11ea47c9c369d66340dbe51e9031df2a0de97d68f442305ed7625ad6493"}, - {file = "zope.interface-7.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:064ade95cb54c840647205987c7b557f75d2b2f7d1a84bfab4cf81822ef6e7d1"}, - {file = "zope.interface-7.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3fcdc76d0cde1c09c37b7c6b0f8beba2d857d8417b055d4f47df9c34ec518bdd"}, - {file = "zope.interface-7.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3d4b91821305c8d8f6e6207639abcbdaf186db682e521af7855d0bea3047c8ca"}, - {file = "zope.interface-7.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35062d93bc49bd9b191331c897a96155ffdad10744ab812485b6bad5b588d7e4"}, - {file = "zope.interface-7.0.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c96b3e6b0d4f6ddfec4e947130ec30bd2c7b19db6aa633777e46c8eecf1d6afd"}, - {file = "zope.interface-7.0.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0c151a6c204f3830237c59ee4770cc346868a7a1af6925e5e38650141a7f05"}, - {file = "zope.interface-7.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:3de1d553ce72868b77a7e9d598c9bff6d3816ad2b4cc81c04f9d8914603814f3"}, - {file = "zope.interface-7.0.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab985c566a99cc5f73bc2741d93f1ed24a2cc9da3890144d37b9582965aff996"}, - {file = "zope.interface-7.0.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d976fa7b5faf5396eb18ce6c132c98e05504b52b60784e3401f4ef0b2e66709b"}, - {file = "zope.interface-7.0.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a207c6b2c58def5011768140861a73f5240f4f39800625072ba84e76c9da0b"}, - {file = "zope.interface-7.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:382d31d1e68877061daaa6499468e9eb38eb7625d4369b1615ac08d3860fe896"}, - {file = "zope.interface-7.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c4316a30e216f51acbd9fb318aa5af2e362b716596d82cbb92f9101c8f8d2e7"}, - {file = "zope.interface-7.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d"}, - {file = "zope.interface-7.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799ef7a444aebbad5a145c3b34bff012b54453cddbde3332d47ca07225792ea4"}, - {file = "zope.interface-7.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3b7ce6d46fb0e60897d62d1ff370790ce50a57d40a651db91a3dde74f73b738"}, - {file = "zope.interface-7.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:f418c88f09c3ba159b95a9d1cfcdbe58f208443abb1f3109f4b9b12fd60b187c"}, - {file = "zope.interface-7.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:84f8794bd59ca7d09d8fce43ae1b571be22f52748169d01a13d3ece8394d8b5b"}, - {file = "zope.interface-7.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7d92920416f31786bc1b2f34cc4fc4263a35a407425319572cbf96b51e835cd3"}, - {file = "zope.interface-7.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95e5913ec718010dc0e7c215d79a9683b4990e7026828eedfda5268e74e73e11"}, - {file = "zope.interface-7.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1eeeb92cb7d95c45e726e3c1afe7707919370addae7ed14f614e22217a536958"}, - {file = "zope.interface-7.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd32f30f40bfd8511b17666895831a51b532e93fc106bfa97f366589d3e4e0e"}, - {file = "zope.interface-7.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:5112c530fa8aa2108a3196b9c2f078f5738c1c37cfc716970edc0df0414acda8"}, - {file = "zope.interface-7.0.3.tar.gz", hash = "sha256:cd2690d4b08ec9eaf47a85914fe513062b20da78d10d6d789a792c0b20307fb1"}, + {file = "zope.interface-6.4.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c"}, + {file = "zope.interface-6.4.post2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530"}, + {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341"}, + {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b"}, + {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9"}, + {file = "zope.interface-6.4.post2-cp310-cp310-win_amd64.whl", hash = "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7"}, + {file = "zope.interface-6.4.post2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede"}, + {file = "zope.interface-6.4.post2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827"}, + {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874"}, + {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e"}, + {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8"}, + {file = "zope.interface-6.4.post2-cp311-cp311-win_amd64.whl", hash = "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250"}, + {file = "zope.interface-6.4.post2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde"}, + {file = "zope.interface-6.4.post2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4"}, + {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b"}, + {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb"}, + {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854"}, + {file = "zope.interface-6.4.post2-cp312-cp312-win_amd64.whl", hash = "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7"}, + {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e"}, + {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e"}, + {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc"}, + {file = "zope.interface-6.4.post2-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1"}, + {file = "zope.interface-6.4.post2-cp37-cp37m-win_amd64.whl", hash = "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82"}, + {file = "zope.interface-6.4.post2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b"}, + {file = "zope.interface-6.4.post2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc"}, + {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934"}, + {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1"}, + {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43"}, + {file = "zope.interface-6.4.post2-cp38-cp38-win_amd64.whl", hash = "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5"}, + {file = "zope.interface-6.4.post2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2"}, + {file = "zope.interface-6.4.post2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438"}, + {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4"}, + {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79"}, + {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671"}, + {file = "zope.interface-6.4.post2-cp39-cp39-win_amd64.whl", hash = "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15"}, + {file = "zope.interface-6.4.post2.tar.gz", hash = "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e"}, ] [package.dependencies] @@ -7820,4 +7670,4 @@ reference = "aliyun" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "25567e8ab7b2b79ec750b4a2fa4f147fad22ceba4fcf565ce3dc41884c65b7a8" +content-hash = "9acfafd75bf7dbb7e0dffb54b7f11f6b09aa4ceff769d193a3906d03ae796ccc" diff --git a/pyproject.toml b/pyproject.toml index 818f0f183..9b2047f6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,8 +25,6 @@ ansible-runner = { url = "https://github.com/jumpserver-dev/ansible-runner/archi asn1crypto = "1.5.1" bcrypt = "4.0.1" billiard = "4.1.0" -aiohttp = "3.10.5" -aiohappyeyeballs = "2.4.0" # certifi = "2023.7.22" # cffi = "1.15.1" chardet = "5.1.0" @@ -35,7 +33,7 @@ decorator = "5.1.1" docutils = "0.20.1" ecdsa = "0.18.0" enum-compat = "0.0.3" -ephem = "4.1.5" +ephem = "4.1.4" future = "0.18.3" # idna = "3.4" itypes = "1.2.0" @@ -129,7 +127,7 @@ boto3 = "1.28.9" botocore = "1.31.9" s3transfer = "0.6.1" mysqlclient = "2.2.4" -pymssql = "2.3.1" +pymssql = "2.2.8" django-redis = "5.3.0" python-redis-lock = "4.0.0" pyopenssl = "23.2.0" From 1417abecfb2dd4ecf541a5ef61c7f174aedd0129 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 9 Sep 2024 18:54:33 +0800 Subject: [PATCH 36/98] perf: Add task description (#14033) Co-authored-by: ZhaoJiSen <97007455+ZhaoJiSen@users.noreply.github.com> --- apps/accounts/tasks/automation.py | 28 +- apps/accounts/tasks/backup_account.py | 10 +- apps/accounts/tasks/gather_accounts.py | 6 +- apps/accounts/tasks/push_account.py | 10 +- apps/accounts/tasks/remove_account.py | 23 +- apps/accounts/tasks/template.py | 8 +- apps/accounts/tasks/vault.py | 10 +- apps/accounts/tasks/verify_account.py | 10 +- apps/assets/tasks/automation.py | 6 +- apps/assets/tasks/gather_facts.py | 11 +- apps/assets/tasks/nodes_amount.py | 21 +- apps/assets/tasks/ping.py | 11 +- apps/assets/tasks/ping_gateway.py | 14 +- apps/audits/tasks.py | 26 +- apps/authentication/tasks.py | 10 +- apps/common/tasks.py | 31 +- apps/common/utils/verify_code.py | 10 +- apps/i18n/core/zh/LC_MESSAGES/django.po | 754 +++++++++++++++++++++--- apps/i18n/lina/en.json | 3 +- apps/i18n/lina/zh.json | 3 +- apps/notifications/notifications.py | 10 +- apps/ops/models/celery.py | 1 + apps/ops/tasks.py | 79 ++- apps/orgs/tasks.py | 5 +- apps/perms/tasks.py | 24 +- apps/settings/tasks/ldap.py | 19 +- apps/terminal/tasks.py | 68 ++- apps/users/signal_handlers.py | 10 +- apps/users/tasks.py | 56 +- 29 files changed, 1129 insertions(+), 148 deletions(-) diff --git a/apps/accounts/tasks/automation.py b/apps/accounts/tasks/automation.py index c03e4cf97..6e086aaf5 100644 --- a/apps/accounts/tasks/automation.py +++ b/apps/accounts/tasks/automation.py @@ -28,8 +28,16 @@ def task_activity_callback(self, pid, trigger, tp, *args, **kwargs): @shared_task( - queue='ansible', verbose_name=_('Account execute automation'), - activity_callback=task_activity_callback + queue='ansible', + verbose_name=_('Account execute automation'), + activity_callback=task_activity_callback, + description=_( + """ + Unified execution entry for account automation tasks: when the system performs tasks + such as account push, password change, account verification, account collection, + and gateway account verification, all tasks are executed through this unified entry + """ + ) ) def execute_account_automation_task(pid, trigger, tp): model = AutomationTypes.get_type_model(tp) @@ -54,8 +62,14 @@ def record_task_activity_callback(self, record_ids, *args, **kwargs): @shared_task( - queue='ansible', verbose_name=_('Execute automation record'), - activity_callback=record_task_activity_callback + queue='ansible', + verbose_name=_('Execute automation record'), + activity_callback=record_task_activity_callback, + description=_( + """ + When manually executing password change records, this task is used + """ + ) ) def execute_automation_record_task(record_ids, tp): from accounts.models import ChangeSecretRecord @@ -84,7 +98,11 @@ def execute_automation_record_task(record_ids, tp): @shared_task( verbose_name=_('Clean change secret and push record period'), - description=_('Clean change secret and push record period description') + description=_( + """ + Clean change secret and push record period description + """ + ) ) @register_as_period_task(crontab=CRONTAB_AT_AM_THREE) def clean_change_secret_and_push_record_period(): diff --git a/apps/accounts/tasks/backup_account.py b/apps/accounts/tasks/backup_account.py index c9b881b4d..d491c78f5 100644 --- a/apps/accounts/tasks/backup_account.py +++ b/apps/accounts/tasks/backup_account.py @@ -22,7 +22,15 @@ def task_activity_callback(self, pid, trigger, *args, **kwargs): return resource_ids, org_id -@shared_task(verbose_name=_('Execute account backup plan'), activity_callback=task_activity_callback) +@shared_task( + verbose_name=_('Execute account backup plan'), + activity_callback=task_activity_callback, + description=_( + """ + When performing scheduled or manual account backups, this task is used + """ + ) +) def execute_account_backup_task(pid, trigger, **kwargs): from accounts.models import AccountBackupAutomation with tmp_to_root_org(): diff --git a/apps/accounts/tasks/gather_accounts.py b/apps/accounts/tasks/gather_accounts.py index 42f8641bb..831a9fdf6 100644 --- a/apps/accounts/tasks/gather_accounts.py +++ b/apps/accounts/tasks/gather_accounts.py @@ -26,8 +26,10 @@ def gather_asset_accounts_util(nodes, task_name): @shared_task( - queue="ansible", verbose_name=_('Gather asset accounts'), - activity_callback=lambda self, node_ids, task_name=None, *args, **kwargs: (node_ids, None) + queue="ansible", + verbose_name=_('Gather asset accounts'), + activity_callback=lambda self, node_ids, task_name=None, *args, **kwargs: (node_ids, None), + description=_("Unused") ) def gather_asset_accounts_task(node_ids, task_name=None): if task_name is None: diff --git a/apps/accounts/tasks/push_account.py b/apps/accounts/tasks/push_account.py index 0e0608999..280d9b3a3 100644 --- a/apps/accounts/tasks/push_account.py +++ b/apps/accounts/tasks/push_account.py @@ -12,8 +12,14 @@ __all__ = [ @shared_task( - queue="ansible", verbose_name=_('Push accounts to assets'), - activity_callback=lambda self, account_ids, *args, **kwargs: (account_ids, None) + queue="ansible", + verbose_name=_('Push accounts to assets'), + activity_callback=lambda self, account_ids, *args, **kwargs: (account_ids, None), + description=_( + """ + When creating or modifying an account requires account push, this task is executed + """ + ) ) def push_accounts_to_assets_task(account_ids, params=None): from accounts.models import PushAccountAutomation diff --git a/apps/accounts/tasks/remove_account.py b/apps/accounts/tasks/remove_account.py index 44bb9a840..60fe82327 100644 --- a/apps/accounts/tasks/remove_account.py +++ b/apps/accounts/tasks/remove_account.py @@ -21,8 +21,15 @@ __all__ = ['remove_accounts_task'] @shared_task( - queue="ansible", verbose_name=_('Remove account'), - activity_callback=lambda self, gather_account_ids, *args, **kwargs: (gather_account_ids, None) + queue="ansible", + verbose_name=_('Remove account'), + activity_callback=lambda self, gather_account_ids, *args, **kwargs: (gather_account_ids, None), + description=_( + """ + When clicking "Sync deletion" in 'Console - Gather Account - Gathered accounts' this + task will be executed + """ + ) ) def remove_accounts_task(gather_account_ids): from accounts.models import GatheredAccount @@ -41,7 +48,17 @@ def remove_accounts_task(gather_account_ids): quickstart_automation_by_snapshot(task_name, tp, task_snapshot) -@shared_task(verbose_name=_('Clean historical accounts')) +@shared_task( + verbose_name=_('Clean historical accounts'), + description=_( + """ + Each time an asset account is updated, a historical account is generated, so it is + necessary to clean up the asset account history. The system will clean up excess account + records at 2 a.m. daily based on the configuration in the "System settings - Features - + Account storage - Record limit + """ + ) +) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) @tmp_to_root_org() def clean_historical_accounts(): diff --git a/apps/accounts/tasks/template.py b/apps/accounts/tasks/template.py index bc5416b9f..c4c781557 100644 --- a/apps/accounts/tasks/template.py +++ b/apps/accounts/tasks/template.py @@ -9,7 +9,13 @@ from orgs.utils import tmp_to_root_org, tmp_to_org @shared_task( verbose_name=_('Template sync info to related accounts'), - activity_callback=lambda self, template_id, *args, **kwargs: (template_id, None) + activity_callback=lambda self, template_id, *args, **kwargs: (template_id, None), + description=_( + """ + When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - + Accounts' this task will be executed + """ + ) ) def template_sync_related_accounts(template_id, user_id=None): from accounts.models import Account, AccountTemplate diff --git a/apps/accounts/tasks/vault.py b/apps/accounts/tasks/vault.py index 6429b7133..2ef1f742c 100644 --- a/apps/accounts/tasks/vault.py +++ b/apps/accounts/tasks/vault.py @@ -28,7 +28,15 @@ def sync_instance(instance): return "succeeded", msg -@shared_task(verbose_name=_('Sync secret to vault')) +@shared_task( + verbose_name=_('Sync secret to vault'), + description=_( + """ + When clicking 'Sync' in 'System Settings - Features - Account Storage' this task will + be executed + """ + ) +) def sync_secret_to_vault(): if not vault_client.enabled: # 这里不能判断 settings.VAULT_ENABLED, 必须判断当前 vault_client 的类型 diff --git a/apps/accounts/tasks/verify_account.py b/apps/accounts/tasks/verify_account.py index 523e7f3d2..88fd31049 100644 --- a/apps/accounts/tasks/verify_account.py +++ b/apps/accounts/tasks/verify_account.py @@ -46,8 +46,14 @@ def verify_accounts_connectivity_util(accounts, task_name): @shared_task( - queue="ansible", verbose_name=_('Verify asset account availability'), - activity_callback=lambda self, account_ids, *args, **kwargs: (account_ids, None) + queue="ansible", + verbose_name=_('Verify asset account availability'), + activity_callback=lambda self, account_ids, *args, **kwargs: (account_ids, None), + description=_( + """ + When clicking 'Test' in 'Console - Asset details - Accounts' this task will be executed + """ + ) ) def verify_accounts_connectivity_task(account_ids): from accounts.models import Account, VerifyAccountAutomation diff --git a/apps/assets/tasks/automation.py b/apps/assets/tasks/automation.py index 20426451c..6fa4e2df2 100644 --- a/apps/assets/tasks/automation.py +++ b/apps/assets/tasks/automation.py @@ -21,8 +21,10 @@ def task_activity_callback(self, pid, trigger, tp, *args, **kwargs): @shared_task( - queue='ansible', verbose_name=_('Asset execute automation'), - activity_callback=task_activity_callback + queue='ansible', + verbose_name=_('Asset execute automation'), + activity_callback=task_activity_callback, + description=_("Unused") ) def execute_asset_automation_task(pid, trigger, tp): model = AutomationTypes.get_type_model(tp) diff --git a/apps/assets/tasks/gather_facts.py b/apps/assets/tasks/gather_facts.py index b541bde69..499c58995 100644 --- a/apps/assets/tasks/gather_facts.py +++ b/apps/assets/tasks/gather_facts.py @@ -18,8 +18,15 @@ __all__ = [ @shared_task( - queue="ansible", verbose_name=_('Gather assets facts'), - activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id) + queue="ansible", + verbose_name=_('Gather assets facts'), + activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id), + description=_( + """ + When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task + will be executed + """ + ) ) def gather_assets_facts_task(asset_ids, org_id, task_name=None): from assets.models import GatherFactsAutomation diff --git a/apps/assets/tasks/nodes_amount.py b/apps/assets/tasks/nodes_amount.py index 58344aa11..c660c314e 100644 --- a/apps/assets/tasks/nodes_amount.py +++ b/apps/assets/tasks/nodes_amount.py @@ -13,7 +13,16 @@ from common.const.crontab import CRONTAB_AT_AM_TWO logger = get_logger(__file__) -@shared_task(verbose_name=_('Check the amount of assets under the node')) +@shared_task( + verbose_name=_('Check the amount of assets under the node'), + description=_( + """ + Manually verifying asset quantities updates the asset count for nodes under the + current organization. This task will be called in the following two cases: when updating + nodes and when the number of nodes exceeds 100 + """ + ) +) def check_node_assets_amount_task(org_id=None): if org_id is None: orgs = Organization.objects.all() @@ -30,7 +39,15 @@ def check_node_assets_amount_task(org_id=None): logger.error(error) -@shared_task(verbose_name=_('Periodic check the amount of assets under the node')) +@shared_task( + verbose_name=_('Periodic check the amount of assets under the node'), + description=_( + """ + Schedule the check_node_assets_amount_task to periodically update the asset count of + all nodes under all organizations + """ + ) +) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) def check_node_assets_amount_period_task(): check_node_assets_amount_task() diff --git a/apps/assets/tasks/ping.py b/apps/assets/tasks/ping.py index 3882fe0b3..e441a63a0 100644 --- a/apps/assets/tasks/ping.py +++ b/apps/assets/tasks/ping.py @@ -17,8 +17,15 @@ __all__ = [ @shared_task( - verbose_name=_('Test assets connectivity'), queue='ansible', - activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id) + verbose_name=_('Test assets connectivity'), + queue='ansible', + activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id), + description=_( + """ + When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' this task + will be executed + """ + ) ) def test_assets_connectivity_task(asset_ids, org_id, task_name=None): from assets.models import PingAutomation diff --git a/apps/assets/tasks/ping_gateway.py b/apps/assets/tasks/ping_gateway.py index 05ab7fb0c..dad7a6a6e 100644 --- a/apps/assets/tasks/ping_gateway.py +++ b/apps/assets/tasks/ping_gateway.py @@ -16,8 +16,15 @@ __all__ = [ @shared_task( - verbose_name=_('Test gateways connectivity'), queue='ansible', - activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id) + verbose_name=_('Test gateways connectivity'), + queue='ansible', + activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id), + description=_( + """ + When clicking 'Test Connection' in 'Domain Details - Gateway' this task will be + executed + """ + ) ) def test_gateways_connectivity_task(asset_ids, org_id, local_port, task_name=None): from assets.models import PingAutomation @@ -33,4 +40,5 @@ def test_gateways_connectivity_task(asset_ids, org_id, local_port, task_name=Non def test_gateways_connectivity_manual(gateway_ids, local_port): task_name = gettext_noop("Test gateways connectivity") gateway_ids = [str(i) for i in gateway_ids] - return test_gateways_connectivity_task.delay(gateway_ids, str(current_org.id), local_port, task_name) + return test_gateways_connectivity_task.delay(gateway_ids, str(current_org.id), local_port, + task_name) diff --git a/apps/audits/tasks.py b/apps/audits/tasks.py index f59d515ee..8daaca79d 100644 --- a/apps/audits/tasks.py +++ b/apps/audits/tasks.py @@ -128,7 +128,21 @@ def clean_expired_session_period(): logger.info("Clean session replay done") -@shared_task(verbose_name=_('Clean audits session task log')) +@shared_task( + verbose_name=_('Clean audits session task log'), + description=_( + """ + Since the system generates login logs, operation logs, file upload logs, activity + logs, Celery execution logs, session recordings, and command records, as well as password + change logs, it will clean up these records based on the periodic cleanup configuration + in "System Settings - Tasks" The system will clean up login logs, task logs, operation + logs, password change logs, upload and download logs, session logs, activity records, + job center execution history logs, and cloud synchronization records that exceed the set + time limit every day at 2 a.m., according to the periodic cleanup configuration in + 'System Settings - Tasks' + """ + ) +) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) def clean_audits_log_period(): print("Start clean audit session task log") @@ -142,7 +156,15 @@ def clean_audits_log_period(): clean_password_change_log_period() -@shared_task(verbose_name=_('Upload FTP file to external storage')) +@shared_task( + verbose_name=_('Upload FTP file to external storage'), + description=_( + """ + If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be + synchronized to external storage + """ + ) +) def upload_ftp_file_to_external_storage(ftp_log_id, file_name): logger.info(f'Start upload FTP file record to external storage: {ftp_log_id} - {file_name}') ftp_log = FTPLog.objects.filter(id=ftp_log_id).first() diff --git a/apps/authentication/tasks.py b/apps/authentication/tasks.py index f731d6670..db7c9124a 100644 --- a/apps/authentication/tasks.py +++ b/apps/authentication/tasks.py @@ -8,7 +8,15 @@ from django.utils import timezone from django.utils.translation import gettext_lazy as _ -@shared_task(verbose_name=_('Clean expired session')) +@shared_task( + verbose_name=_('Clean expired session'), + description=_( + """ + Since user logins create sessions, the system will clean up expired sessions every 24 + hours + """ + ) +) @register_as_period_task(interval=3600 * 24) def clean_django_sessions(): Session.objects.filter(expire_date__lt=timezone.now()).delete() diff --git a/apps/common/tasks.py b/apps/common/tasks.py index 5bffe07f4..dd2645c9a 100644 --- a/apps/common/tasks.py +++ b/apps/common/tasks.py @@ -28,7 +28,15 @@ def task_activity_callback(self, subject, message, recipient_list, *args, **kwar return resource_ids, -@shared_task(verbose_name=_("Send email"), activity_callback=task_activity_callback) +@shared_task( + verbose_name=_("Send email"), + activity_callback=task_activity_callback, + description=_( + """ + This task will be executed when sending email notifications + """ + ) +) def send_mail_async(*args, **kwargs): """ Using celery to send email async @@ -55,7 +63,16 @@ def send_mail_async(*args, **kwargs): logger.error("Sending mail error: {}".format(e)) -@shared_task(verbose_name=_("Send email attachment"), activity_callback=task_activity_callback) +@shared_task( + verbose_name=_("Send email attachment"), + activity_callback=task_activity_callback, + description=_( + """ + When an account password is changed or an account backup generates attachments, + this task needs to be executed for sending emails and handling attachments + """ + ) +) def send_mail_attachment_async(subject, message, recipient_list, attachment_list=None): if attachment_list is None: attachment_list = [] @@ -77,7 +94,15 @@ def send_mail_attachment_async(subject, message, recipient_list, attachment_list logger.error("Sending mail attachment error: {}".format(e)) -@shared_task(verbose_name=_('Upload session replay to external storage')) +@shared_task( + verbose_name=_('Upload account backup to external storage'), + description=_( + """ + When performing an account backup, this task needs to be executed to external storage + (SFTP) + """ + ) +) def upload_backup_to_obj_storage(recipient, upload_file): logger.info(f'Start upload file : {upload_file}') remote_path = os.path.join('account_backup', os.path.basename(upload_file)) diff --git a/apps/common/utils/verify_code.py b/apps/common/utils/verify_code.py index dea844768..8dc575d6c 100644 --- a/apps/common/utils/verify_code.py +++ b/apps/common/utils/verify_code.py @@ -13,7 +13,15 @@ from common.utils.random import random_string logger = get_logger(__file__) -@shared_task(verbose_name=_('Send SMS code')) +@shared_task( + verbose_name=_('Send SMS code'), + description=_( + """ + When resetting a password, forgetting a password, or verifying MFA, this task needs to + be executed to send SMS messages + """ + ) +) def send_sms_async(target, code): SMS().send_verify_code(target, code) diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index eaa0643e6..50dde09ba 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 14:22+0800\n" +"POT-Creation-Date: 2024-09-09 18:29+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -207,8 +207,8 @@ msgstr "更改密码" msgid "Verify account" msgstr "验证账号" -#: accounts/const/automation.py:27 accounts/tasks/remove_account.py:24 -#: accounts/tasks/remove_account.py:33 +#: accounts/const/automation.py:27 accounts/tasks/remove_account.py:25 +#: accounts/tasks/remove_account.py:40 msgid "Remove account" msgstr "移除账号" @@ -458,7 +458,7 @@ msgstr "账号备份计划" #: accounts/models/automations/backup_account.py:120 #: assets/models/automations/base.py:115 audits/models.py:65 -#: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:242 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:242 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:25 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -470,7 +470,7 @@ msgstr "开始日期" #: accounts/models/automations/backup_account.py:123 #: authentication/templates/authentication/_msg_oauth_bind.html:11 -#: notifications/notifications.py:194 +#: notifications/notifications.py:202 #: settings/templates/ldap/_msg_import_ldap_user.html:3 msgid "Time" msgstr "时间" @@ -571,7 +571,7 @@ msgstr "开始日期" #: accounts/models/automations/change_secret.py:42 #: assets/models/automations/base.py:116 ops/models/base.py:56 -#: ops/models/celery.py:89 ops/models/job.py:243 +#: ops/models/celery.py:90 ops/models/job.py:243 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "结束日期" @@ -633,7 +633,7 @@ msgid "Address login" msgstr "最后登录地址" #: accounts/models/automations/gather_account.py:44 -#: accounts/tasks/gather_accounts.py:29 +#: accounts/tasks/gather_accounts.py:30 msgid "Gather asset accounts" msgstr "收集账号" @@ -708,7 +708,7 @@ msgstr "密码规则" #: authentication/serializers/connect_token_secret.py:113 #: authentication/serializers/connect_token_secret.py:169 labels/models.py:11 #: ops/mixin.py:21 ops/models/adhoc.py:20 ops/models/celery.py:15 -#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28 +#: ops/models/celery.py:81 ops/models/job.py:142 ops/models/playbook.py:28 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 @@ -887,7 +887,7 @@ msgstr "资产不存在" msgid "Has secret" msgstr "已托管密码" -#: accounts/serializers/account/account.py:272 ops/models/celery.py:83 +#: accounts/serializers/account/account.py:272 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" @@ -1122,44 +1122,124 @@ msgstr "添加账号: %s" msgid "Delete account: %s" msgstr "删除账号: %s" -#: accounts/tasks/automation.py:31 +#: accounts/tasks/automation.py:32 msgid "Account execute automation" msgstr "账号执行自动化" -#: accounts/tasks/automation.py:57 accounts/tasks/automation.py:62 +#: accounts/tasks/automation.py:35 +msgid "" +"\n" +" Unified execution entry for account automation tasks: when the " +"system performs tasks \n" +" such as account push, password change, account verification, account " +"collection, \n" +" and gateway account verification, all tasks are executed through " +"this unified entry\n" +" " +msgstr "" +"\n" +"账号自动化任务统一执行入口,当系统执行账号推送,更改密码,验证账号,收集账" +"号,验证网关账号任务时,统一通过当前任务执行" + +#: accounts/tasks/automation.py:66 accounts/tasks/automation.py:76 msgid "Execute automation record" msgstr "自动化执行记录" -#: accounts/tasks/automation.py:86 +#: accounts/tasks/automation.py:69 +msgid "" +"\n" +" When manually executing password change records, this task is used\n" +" " +msgstr "" +"\n" +"当手动执行改密记录时,通过该任务执行" + +#: accounts/tasks/automation.py:100 msgid "Clean change secret and push record period" msgstr "周期清理改密记录和推送记录" -#: accounts/tasks/automation.py:87 -msgid "Clean change secret and push record period description" +#: accounts/tasks/automation.py:102 +msgid "" +"\n" +" Clean change secret and push record period description\n" +" " msgstr "" +"\n" "系统会定期清理不再需要的改密记录和推送记录,包括那些关联的改密任务、执行记" "录、资产和账号。当这些关联项中的任意一个被删除时,对应的改密和推送记录将变为" "无效。因此,为了保持数据库的整洁和高效运行,系统默认每180天自动清理这些无效记" "录。这种定期清理机制不仅有助于释放存储空间,还能提高数据管理的安全性和整体性" "能。" -#: accounts/tasks/backup_account.py:25 +#: accounts/tasks/backup_account.py:26 msgid "Execute account backup plan" msgstr "执行账号备份计划" -#: accounts/tasks/gather_accounts.py:34 +#: accounts/tasks/backup_account.py:29 +msgid "" +"\n" +" When performing scheduled or manual account backups, this task is " +"used\n" +" " +msgstr "" +"\n" +"定时或手动执行账号备份时,通过该任务执行" + +#: accounts/tasks/gather_accounts.py:32 assets/tasks/automation.py:27 +#: orgs/tasks.py:11 terminal/tasks.py:33 +msgid "Unused" +msgstr "未使用" + +#: accounts/tasks/gather_accounts.py:36 msgid "Gather assets accounts" msgstr "收集资产上的账号" -#: accounts/tasks/push_account.py:15 accounts/tasks/push_account.py:23 +#: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:29 msgid "Push accounts to assets" msgstr "推送账号到资产" -#: accounts/tasks/remove_account.py:44 +#: accounts/tasks/push_account.py:19 +msgid "" +"\n" +" When creating or modifying an account requires account push, this " +"task is executed\n" +" " +msgstr "" +"\n" +"当创建账号,修改账号时,需要账号推送时执行该任务" + +#: accounts/tasks/remove_account.py:28 +msgid "" +"\n" +" When clicking \"Sync deletion\" in 'Console - Gather Account - " +"Gathered accounts' this \n" +" task will be executed\n" +" " +msgstr "" +"\n" +"当在控制台-自动化-账号收集-收集的账号-点击同步删除会执行该任务" + +#: accounts/tasks/remove_account.py:52 msgid "Clean historical accounts" msgstr "清理历史账号" -#: accounts/tasks/remove_account.py:76 +#: accounts/tasks/remove_account.py:54 +msgid "" +"\n" +" Each time an asset account is updated, a historical account is " +"generated, so it is \n" +" necessary to clean up the asset account history. The system will " +"clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System " +"settings - Features - \n" +" Account storage - Record limit\n" +" " +msgstr "" +"\n" +"由于每次更新资产账号,都会生成历史账号,所以需要清理资产账号的历史。系统会根" +"据账号存储-记录限制的配置,每天凌晨2点对于超出的数量的账号记录进行清理" + +#: accounts/tasks/remove_account.py:93 msgid "Remove historical accounts that are out of range." msgstr "删除超出范围的历史帐户。" @@ -1167,15 +1247,47 @@ msgstr "删除超出范围的历史帐户。" msgid "Template sync info to related accounts" msgstr "同步信息到关联的账号" -#: accounts/tasks/vault.py:31 +#: accounts/tasks/template.py:14 +msgid "" +"\n" +" When clicking 'Sync new secret to accounts' in 'Console - Account - " +"Templates - \n" +" Accounts' this task will be executed\n" +" " +msgstr "" +"\n" +"当在控制台-账号模板-账号-同步更新账号信息点击同步时,执行该任务" + +#: accounts/tasks/vault.py:32 msgid "Sync secret to vault" msgstr "同步密文到 vault" -#: accounts/tasks/verify_account.py:49 +#: accounts/tasks/vault.py:34 +msgid "" +"\n" +" When clicking 'Sync' in 'System Settings - Features - Account " +"Storage' this task will \n" +" be executed\n" +" " +msgstr "" +"\n" +"在系统设置-功能设置-账号存储点击同步时,执行该任务" + +#: accounts/tasks/verify_account.py:50 msgid "Verify asset account availability" msgstr "验证资产账号可用性" -#: accounts/tasks/verify_account.py:55 +#: accounts/tasks/verify_account.py:53 +msgid "" +"\n" +" When clicking 'Test' in 'Console - Asset details - Accounts' this " +"task will be executed\n" +" " +msgstr "" +"\n" +"当在控制台-资产详情-账号点击测试执行该任务" + +#: accounts/tasks/verify_account.py:61 msgid "Verify accounts connectivity" msgstr "测试账号可连接性" @@ -2467,7 +2579,7 @@ msgstr "类型 该字段是必填项。" msgid "Protocols is required" msgstr "协议是必填的" -#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:35 +#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:42 msgid "Test assets connectivity " msgstr "测试资产可连接性" @@ -2475,48 +2587,106 @@ msgstr "测试资产可连接性" msgid "Gather asset hardware info" msgstr "收集资产硬件信息" -#: assets/tasks/automation.py:24 +#: assets/tasks/automation.py:25 msgid "Asset execute automation" msgstr "资产执行自动化" -#: assets/tasks/gather_facts.py:21 assets/tasks/gather_facts.py:27 +#: assets/tasks/gather_facts.py:22 assets/tasks/gather_facts.py:34 msgid "Gather assets facts" msgstr "收集资产信息" -#: assets/tasks/gather_facts.py:39 +#: assets/tasks/gather_facts.py:25 +msgid "" +"\n" +" When clicking 'Refresh hardware info' in 'Console - Asset Details - " +"Basic' this task \n" +" will be executed\n" +" " +msgstr "" +"\n" +"当在控制台资产详情-基本设置点击更新硬件信息执行该任务" + +#: assets/tasks/gather_facts.py:46 msgid "Update assets hardware info: " msgstr "更新资产硬件信息" -#: assets/tasks/gather_facts.py:47 +#: assets/tasks/gather_facts.py:54 msgid "Update node asset hardware information: " msgstr "更新节点资产硬件信息: " -#: assets/tasks/nodes_amount.py:16 +#: assets/tasks/nodes_amount.py:17 msgid "Check the amount of assets under the node" msgstr "检查节点下资产数量" -#: assets/tasks/nodes_amount.py:28 +#: assets/tasks/nodes_amount.py:19 +msgid "" +"\n" +" Manually verifying asset quantities updates the asset count for " +"nodes under the \n" +" current organization. This task will be called in the following two " +"cases: when updating \n" +" nodes and when the number of nodes exceeds 100\n" +" " +msgstr "" +"\n" +"手动校对资产数量更新当前组织下的节点资产数量;更新节点,当节点数大于100这两种" +"情况会调用该任务" + +#: assets/tasks/nodes_amount.py:37 msgid "" "The task of self-checking is already running and cannot be started repeatedly" msgstr "自检程序已经在运行,不能重复启动" -#: assets/tasks/nodes_amount.py:33 +#: assets/tasks/nodes_amount.py:43 msgid "Periodic check the amount of assets under the node" msgstr "周期性检查节点下资产数量" -#: assets/tasks/ping.py:20 assets/tasks/ping.py:26 +#: assets/tasks/nodes_amount.py:45 +msgid "" +"\n" +" Schedule the check_node_assets_amount_task to periodically update " +"the asset count of \n" +" all nodes under all organizations\n" +" " +msgstr "" +"\n" +"定时调用check_node_assets_amount_task任务,更新所有组织下所有节点的资产数量" + +#: assets/tasks/ping.py:20 assets/tasks/ping.py:33 msgid "Test assets connectivity" msgstr "测试资产可连接性" -#: assets/tasks/ping.py:42 +#: assets/tasks/ping.py:24 +msgid "" +"\n" +" When clicking 'Test Asset Connectivity' in 'Asset Details - Basic " +"Settings' this task \n" +" will be executed\n" +" " +msgstr "" +"\n" +"当资产详情-基本设置点击测试资产可连接性 执行该任务" + +#: assets/tasks/ping.py:49 msgid "Test if the assets under the node are connectable " msgstr "测试节点下资产是否可连接" -#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:25 -#: assets/tasks/ping_gateway.py:34 +#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:32 +#: assets/tasks/ping_gateway.py:41 msgid "Test gateways connectivity" msgstr "测试网关可连接性" +#: assets/tasks/ping_gateway.py:23 +msgid "" +"\n" +" When clicking 'Test Connection' in 'Domain Details - Gateway' this " +"task will be \n" +" executed\n" +" " +msgstr "" +"\n" +"当在网域详情-网关-测试连接时执行该任务" + #: assets/tasks/utils.py:16 msgid "Asset has been disabled, skipped: {}" msgstr "资产已经被禁用, 跳过: {}" @@ -2623,7 +2793,7 @@ msgstr "同意" msgid "Close" msgstr "关闭" -#: audits/const.py:41 ops/models/celery.py:84 +#: audits/const.py:41 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" @@ -2785,7 +2955,7 @@ msgid "Offline user session" msgstr "下线用户会话" #: audits/serializers.py:33 ops/models/adhoc.py:25 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:86 ops/models/job.py:151 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:151 #: ops/models/job.py:240 ops/models/playbook.py:30 #: terminal/models/session/sharing.py:25 msgid "Creator" @@ -2878,14 +3048,52 @@ msgstr "临时密码" msgid "Passkey" msgstr "Passkey" -#: audits/tasks.py:131 +#: audits/tasks.py:132 msgid "Clean audits session task log" msgstr "清理资产审计会话任务日志" -#: audits/tasks.py:145 +#: audits/tasks.py:134 +msgid "" +"\n" +" Since the system generates login logs, operation logs, file upload " +"logs, activity \n" +" logs, Celery execution logs, session recordings, and command " +"records, as well as password \n" +" change logs, it will clean up these records based on the periodic " +"cleanup configuration \n" +" in \"System Settings - Tasks\" The system will clean up login logs, " +"task logs, operation \n" +" logs, password change logs, upload and download logs, session logs, " +"activity records, \n" +" job center execution history logs, and cloud synchronization records " +"that exceed the set \n" +" time limit every day at 2 a.m., according to the periodic cleanup " +"configuration in \n" +" 'System Settings - Tasks'\n" +" " +msgstr "" +"\n" +"由于系统会产生登录日志,操作日志,文件上传日志,活动日志,celery执行日志,会" +"话录像和命令记录,改密日志,所以系统会根据系统设置-任务列表-定期清理配置对这" +"些记录进行清理。系统会根据系统设置-任务列表-定期清理的配置,对于超出时间的登" +"录日志、任务日志、操作日志、改密日志、上传下载日志、会话日志、活动记录、作业" +"中心执行历史日志、云同步记录日志于每天凌晨2点进行清理" + +#: audits/tasks.py:160 msgid "Upload FTP file to external storage" msgstr "上传 FTP 文件到外部存储" +#: audits/tasks.py:162 +msgid "" +"\n" +" If SERVER_REPLAY_STORAGE is configured, files uploaded through file " +"management will be \n" +" synchronized to external storage\n" +" " +msgstr "" +"\n" +"如果设置了SERVER_REPLAY_STORAGE,将通过文件管理上传的文件同步到外部存储" + #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" msgstr "最多可以创建10个访问密钥" @@ -3526,10 +3734,21 @@ msgstr "IP 白名单" msgid "Is valid" msgstr "是否有效" -#: authentication/tasks.py:11 +#: authentication/tasks.py:12 msgid "Clean expired session" msgstr "清除过期会话" +#: authentication/tasks.py:14 +msgid "" +"\n" +" Since user logins create sessions, the system will clean up expired " +"sessions every 24 \n" +" hours\n" +" " +msgstr "" +"\n" +"由于用户登录系统会产生会话,系统会每24小时清理已经过期的会话" + #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" msgstr "API Key列表" @@ -4265,18 +4484,50 @@ msgstr "标签" # msgid "Labels" # msgstr "标签管理" -#: common/tasks.py:31 +#: common/tasks.py:32 msgid "Send email" msgstr "发件邮件" -#: common/tasks.py:58 +#: common/tasks.py:35 +msgid "" +"\n" +" This task will be executed when sending email notifications\n" +" " +msgstr "" +"\n" +"发送邮件消息时执行该任务" + +#: common/tasks.py:67 msgid "Send email attachment" msgstr "发送邮件附件" -#: common/tasks.py:80 terminal/tasks.py:58 -msgid "Upload session replay to external storage" +#: common/tasks.py:70 +msgid "" +"\n" +" When an account password is changed or an account backup generates " +"attachments, \n" +" this task needs to be executed for sending emails and handling " +"attachments\n" +" " +msgstr "" +"\n" +"当账号改密,账号备份产生附件,需要对发送邮件及附件,执行该任务" + +#: common/tasks.py:98 +msgid "Upload account backup to external storage" msgstr "上传会话录像到外部存储" +#: common/tasks.py:100 +msgid "" +"\n" +" When performing an account backup, this task needs to be executed to " +"external storage \n" +" (SFTP)\n" +" " +msgstr "" +"\n" +"当执行账号备份,需要到外部存储(sftp),执行该任务" + #: common/utils/ip/geoip/utils.py:26 msgid "Invalid ip" msgstr "无效 IP" @@ -4290,10 +4541,21 @@ msgstr "无效地址" msgid "Hello %s" msgstr "你好 %s" -#: common/utils/verify_code.py:16 +#: common/utils/verify_code.py:17 msgid "Send SMS code" msgstr "发送短信验证码" +#: common/utils/verify_code.py:19 +msgid "" +"\n" +" When resetting a password, forgetting a password, or verifying MFA, " +"this task needs to \n" +" be executed to send SMS messages\n" +" " +msgstr "" +"\n" +"当重置密码,忘记密码,验证mfa时,需要发送短信时执行该任务" + #: common/validators.py:16 msgid "Special char not allowed" msgstr "不能包含特殊字符" @@ -4406,10 +4668,21 @@ msgstr "{} 订阅" msgid "System message" msgstr "系统信息" -#: notifications/notifications.py:46 +#: notifications/notifications.py:47 msgid "Publish the station message" msgstr "发布站内消息" +#: notifications/notifications.py:49 +msgid "" +"\n" +" This task needs to be executed for sending internal messages for " +"system alerts, \n" +" work orders, and other notifications\n" +" " +msgstr "" +"\n" +"系统一些告警,工单等需要发送站内信时执行该任务" + #: ops/ansible/inventory.py:106 ops/models/job.py:65 msgid "No account available" msgstr "无可用账号" @@ -4640,7 +4913,7 @@ msgstr "模式" msgid "Module" msgstr "模块" -#: ops/models/adhoc.py:24 ops/models/celery.py:81 ops/models/job.py:144 +#: ops/models/adhoc.py:24 ops/models/celery.py:82 ops/models/job.py:144 #: terminal/models/component/task.py:14 msgid "Args" msgstr "参数" @@ -4671,23 +4944,23 @@ msgstr "汇总" msgid "Date last publish" msgstr "发布日期" -#: ops/models/celery.py:70 +#: ops/models/celery.py:71 msgid "Celery Task" msgstr "Celery 任务" -#: ops/models/celery.py:73 +#: ops/models/celery.py:74 msgid "Can view task monitor" msgstr "可以查看任务监控" -#: ops/models/celery.py:82 terminal/models/component/task.py:15 +#: ops/models/celery.py:83 terminal/models/component/task.py:15 msgid "Kwargs" msgstr "其它参数" -#: ops/models/celery.py:87 +#: ops/models/celery.py:88 msgid "Date published" msgstr "发布日期" -#: ops/models/celery.py:112 +#: ops/models/celery.py:113 msgid "Celery Task Execution" msgstr "Celery 任务执行" @@ -4800,34 +5073,121 @@ msgstr "任务 ID" msgid "You do not have permission for the current job." msgstr "你没有当前作业的权限。" -#: ops/tasks.py:50 +#: ops/tasks.py:52 msgid "Run ansible task" msgstr "运行 Ansible 任务" -#: ops/tasks.py:76 +#: ops/tasks.py:55 +msgid "" +"\n" +" Execute scheduled adhoc and playbooks, periodically invoking the " +"task for execution\n" +" " +msgstr "" +"\n" +"当执行定时的快捷命令,playbook,定时调用该任务执行" + +#: ops/tasks.py:85 msgid "Run ansible task execution" msgstr "开始执行 Ansible 任务" -#: ops/tasks.py:89 +#: ops/tasks.py:88 +msgid "" +"\n" +" Execute the task when manually adhoc or playbooks\n" +" " +msgstr "" +"\n" +"手动执行快捷命令,playbook时执行该任务" + +#: ops/tasks.py:104 msgid "Clear celery periodic tasks" msgstr "清理周期任务" -#: ops/tasks.py:110 +#: ops/tasks.py:106 +msgid "" +"\n" +" At system startup, clean up celery tasks that no longer exist\n" +" " +msgstr "" +"\n" +"系统启动时,清理已经不存在的celery任务" + +#: ops/tasks.py:132 msgid "Create or update periodic tasks" msgstr "创建或更新周期任务" -#: ops/tasks.py:118 +#: ops/tasks.py:134 +msgid "" +"\n" +" With version iterations, new tasks may be added, or task names and " +"execution times may \n" +" be modified. Therefore, upon system startup, tasks will be " +"registered or the parameters \n" +" of scheduled tasks will be updated\n" +" " +msgstr "" +"\n" +"随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动" +"时,,将会注册任务或者更新定时任务参数" + +#: ops/tasks.py:149 msgid "Periodic check service performance" msgstr "周期检测服务性能" -#: ops/tasks.py:124 +#: ops/tasks.py:151 +msgid "" +"\n" +" Check every hour whether each component is offline and whether the " +"CPU, memory, \n" +" and disk usage exceed the thresholds, and send an alert message to " +"the administrator\n" +" " +msgstr "" +"\n" +"每小时检测各组件是否离线,cpu,内存,硬盘使用率是否超过阈值,向管理员发送消息" +"预警" + +#: ops/tasks.py:163 msgid "Clean up unexpected jobs" msgstr "清理异常作业" -#: ops/tasks.py:131 +#: ops/tasks.py:165 +msgid "" +"\n" +" Due to exceptions caused by executing adhoc and playbooks in the Job " +"Center, \n" +" which result in the task status not being updated, the system will " +"clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and " +"mark these tasks as \n" +" failed\n" +" " +msgstr "" +"\n" +"由于作业中心执行快捷命令,playbook会产生异常,任务状态未更新完成,系统将每小" +"时执行清理超3小时未完成的异常作业,并将任务标记失败" + +#: ops/tasks.py:180 msgid "Clean job_execution db record" msgstr "清理作业中心执行历史" +#: ops/tasks.py:182 +msgid "" +"\n" +" Due to the execution of adhoc and playbooks in the Job Center, " +"execution records will \n" +" be generated. The system will clean up records that exceed the " +"retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - " +"Regular clean-up - \n" +" Job execution retention days'\n" +" " +msgstr "" +"\n" +"由于作业中心执行快捷命令,playbook,会产生j执行记录,系统会根据系统设置-任务" +"列表-定期清理-作业中心执行历史配置,每天凌晨2点对超出保存时间的记录进行清理" + #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" msgstr "任务列表" @@ -4953,7 +5313,7 @@ msgstr "网关数量" msgid "Asset permissions amount" msgstr "资产授权数量" -#: orgs/tasks.py:9 +#: orgs/tasks.py:10 msgid "Refresh organization cache" msgstr "刷新组织缓存" @@ -5074,14 +5434,48 @@ msgstr "用户组" msgid "Groups amount" msgstr "用户组数量" -#: perms/tasks.py:27 +#: perms/tasks.py:28 msgid "Check asset permission expired" msgstr "校验资产授权规则已过期" -#: perms/tasks.py:40 +#: perms/tasks.py:30 +msgid "" +"\n" +" The cache of organizational collections, which have completed user " +"authorization tree \n" +" construction, will expire. Therefore, expired collections need to be " +"cleared from the \n" +" cache, and this task will be executed periodically based on the time " +"interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " +"config.txt\n" +" " +msgstr "" +"\n" +"用户授权树已经构建完成的组织集合缓存会过期,所以需要将过期的集合从缓存中清理" +"掉,根据系统配置文件 config.txt 中 PERM_EXPIRED_CHECK_PERIODIC 的时间间隔定时" +"执行该任务" + +#: perms/tasks.py:51 msgid "Send asset permission expired notification" msgstr "发送资产权限过期通知" +#: perms/tasks.py:53 +msgid "" +"\n" +" Check every day at 10 a.m. and send a notification message to users " +"associated with \n" +" assets whose authorization is about to expire, as well as to the " +"organization's \n" +" administrators, 3 days in advance, to remind them that the asset " +"authorization will \n" +" expire in a few days\n" +" " +msgstr "" +"\n" +"每天上午10点检查,对资产授权即将过期的所关联的用户及该组织管理员提前三天发送" +"消息通知,提示资产还有几天即将过期" + #: perms/templates/perms/_msg_item_permissions_expire.html:7 #: perms/templates/perms/_msg_permed_items_expire.html:7 #, python-format @@ -6681,14 +7075,36 @@ msgid "" "in the workbench" msgstr "*! 如果启用,具有 RBAC 权限的用户将能够使用工作台中的所有工具" -#: settings/tasks/ldap.py:28 +#: settings/tasks/ldap.py:29 msgid "Periodic import ldap user" msgstr "周期导入 LDAP 用户" -#: settings/tasks/ldap.py:66 +#: settings/tasks/ldap.py:31 +msgid "" +"\n" +" When LDAP auto-sync is configured, this task will be invoked to " +"synchronize users\n" +" " +msgstr "" +"\n" +"当设置了LDAP自动同步,将调用该任务进行用户同步" + +#: settings/tasks/ldap.py:74 msgid "Registration periodic import ldap user task" msgstr "注册周期导入 LDAP 用户 任务" +#: settings/tasks/ldap.py:76 +msgid "" +"\n" +" When LDAP auto-sync parameters change, such as Crontab parameters, " +"the LDAP sync task \n" +" will be re-registered or updated, and this task will be invoked\n" +" " +msgstr "" +"\n" +"当设置了LDAP自动同步参数发生变化时,比如Crontab参数,重新注册或更新ldap同步任" +"务调用该任务" + #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" msgstr "同步任务完成" @@ -7038,7 +7454,7 @@ msgstr "命令存储" msgid "Invalid" msgstr "无效" -#: terminal/api/component/storage.py:132 terminal/tasks.py:149 +#: terminal/api/component/storage.py:132 terminal/tasks.py:201 msgid "Test failure: {}" msgstr "测试失败: {}" @@ -7552,7 +7968,7 @@ msgstr "级别" msgid "Command and replay storage" msgstr "命令及录像存储" -#: terminal/notifications.py:240 terminal/tasks.py:153 +#: terminal/notifications.py:240 terminal/tasks.py:205 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -7593,6 +8009,7 @@ msgid "" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" +" \n" "提示:应用发布机和 Core 服务进行通信使用,如果发布机和 Core 服务在同一网段," "建议填写内网地址,否则填写当前站点 URL
例如:https://172.16.10.110 or " "https://dev.jumpserver.com" @@ -8017,34 +8434,120 @@ msgstr "授权已过期" msgid "storage is null" msgstr "存储为空" -#: terminal/tasks.py:31 +#: terminal/tasks.py:32 msgid "Periodic delete terminal status" msgstr "周期清理终端状态" -#: terminal/tasks.py:39 +#: terminal/tasks.py:43 msgid "Clean orphan session" msgstr "清除离线会话" -#: terminal/tasks.py:87 +#: terminal/tasks.py:45 +msgid "" +"\n" +" Check every 10 minutes for asset connection sessions that have been " +"inactive for 3 \n" +" minutes and mark these sessions as completed\n" +" " +msgstr "" +"\n" +"每10分钟检查3分钟未活跃的资产连接会话,将这些会话标记未已完成" + +#: terminal/tasks.py:70 +msgid "Upload session replay to external storage" +msgstr "上传会话录像到外部存储" + +#: terminal/tasks.py:72 +msgid "" +"\n" +" If SERVER_REPLAY_STORAGE is configured in the config.txt, session " +"commands and \n" +" recordings will be uploaded to external storage\n" +" " +msgstr "" +"\n" +"如果设置了SERVER_REPLAY_STORAGE,将通过文件管理上传的文件同步到外部存储" + +#: terminal/tasks.py:106 msgid "Run applet host deployment" msgstr "运行应用机部署" -#: terminal/tasks.py:97 +#: terminal/tasks.py:109 +msgid "" +"\n" +" When deploying from the remote application publisher details page, " +"and the 'Deploy' \n" +" button is clicked, this task will be executed\n" +" " +msgstr "" +"\n" +"发布机部署,点击部署时,执行该任务" + +#: terminal/tasks.py:122 msgid "Install applet" msgstr "安装应用" -#: terminal/tasks.py:108 +#: terminal/tasks.py:125 +msgid "" +"\n" +" When the 'Deploy' button is clicked in the 'Remote Application' " +"section of the remote \n" +" application publisher details page, this task will be executed\n" +" " +msgstr "" +"\n" +"当远程应用发布机详情-远程应用,点击部署时,执行该任务" + +#: terminal/tasks.py:139 msgid "Uninstall applet" msgstr "卸载应用" -#: terminal/tasks.py:119 +#: terminal/tasks.py:142 +msgid "" +"\n" +" When the 'Uninstall' button is clicked in the 'Remote Application' " +"section of the \n" +" remote application publisher details page, this task will be " +"executed\n" +" " +msgstr "" +"\n" +"当远程应用发布机详情-远程应用,点击卸载时,执行该任务" + +#: terminal/tasks.py:156 msgid "Generate applet host accounts" msgstr "收集远程应用上的账号" -#: terminal/tasks.py:131 +#: terminal/tasks.py:159 +msgid "" +"\n" +" When a remote publishing server is created and an account needs to " +"be created \n" +" automatically, this task will be executed\n" +" " +msgstr "" +"\n" +"当创建远程发布机后,需要自动创建账号时,执行该任务" + +#: terminal/tasks.py:175 msgid "Check command replay storage connectivity" msgstr "检查命令及录像存储可连接性 " +#: terminal/tasks.py:177 +msgid "" +"\n" +" Check every day at midnight whether the external storage for " +"commands and recordings \n" +" is accessible. If it is not accessible, send a notification to the " +"recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - " +"Connectivity'\n" +" " +msgstr "" +"\n" +"每天凌晨0点检查命令及录像外部存储是否可连接,不可连接发送给:系统设置-通知设" +"置-消息订阅-命令及录像存储设置的接收人" + #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" msgstr "查看" @@ -8853,31 +9356,106 @@ msgid "" msgstr "" "管理员已开启'仅允许已存在用户登录',当前用户不在用户列表中,请联系管理员。" -#: users/signal_handlers.py:193 +#: users/signal_handlers.py:194 msgid "Clean up expired user sessions" msgstr "清除过期的用户会话" -#: users/tasks.py:25 +#: users/signal_handlers.py:196 +msgid "" +"\n" +" After logging in via the web, a user session record is created. At 2 " +"a.m. every day, \n" +" the system cleans up inactive user devices\n" +" " +msgstr "" +"\n" +"使用web登录后,会产生用户会话在线记录,每天凌晨2点,清理未在线的用户设备" + +#: users/tasks.py:26 msgid "Check password expired" msgstr "校验密码已过期" -#: users/tasks.py:39 +#: users/tasks.py:28 +msgid "" +"\n" +" Check every day at 10 AM whether the passwords of users in the " +"system are expired, \n" +" and send a notification 5 days in advance\n" +" " +msgstr "" +"\n" +"每天上午10点检查,系统中用户的密码是否过期,提前5天发送通知" + +#: users/tasks.py:48 msgid "Periodic check password expired" msgstr "周期校验密码过期" -#: users/tasks.py:53 +#: users/tasks.py:50 +msgid "" +"\n" +" With version iterations, new tasks may be added, or task names and " +"execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to " +"register or update the \n" +" parameters of the task that checks if passwords have expired\n" +" " +msgstr "" +"\n" +"随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动时," +"注册或者更新校验密码已过期任务的参数" + +#: users/tasks.py:71 msgid "Check user expired" msgstr "校验用户已过期" -#: users/tasks.py:70 +#: users/tasks.py:73 +msgid "" +"\n" +" Check every day at 10 AM whether the users in the system are " +"expired, and send a \n" +" notification 5 days in advance\n" +" " +msgstr "" +"\n" +"每天上午10点检查,系统中的用户是否过期,提前5天发送通知" + +#: users/tasks.py:96 msgid "Periodic check user expired" msgstr "周期检测用户过期" -#: users/tasks.py:84 +#: users/tasks.py:98 +msgid "" +"\n" +" With version iterations, new tasks may be added, or task names and " +"execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to " +"register or update the \n" +" parameters of the task that checks if users have expired\n" +" " +msgstr "" +"\n" +"随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动时," +"注册或者更新校验用户已过期任务的参数" + +#: users/tasks.py:119 msgid "Check unused users" msgstr "检查未使用的用户" -#: users/tasks.py:123 +#: users/tasks.py:121 +msgid "" +"\n" +" At 2 a.m. every day, according to the configuration in \"System " +"Settings - Security - \n" +" Auth security - Auto disable threshold\" users who have not logged " +"in or whose API keys \n" +" have not been used for a long time will be disabled\n" +" " +msgstr "" +"\n" +"每天凌晨2点,根据系统配置-安全设置-不活跃用户自动禁用配置,对长时间不登录或" +"api_key不使用的用户进行禁用" + +#: users/tasks.py:167 msgid "The user has not logged in recently and has been disabled." msgstr "该用户最近未登录,已被禁用。" @@ -9841,10 +10419,26 @@ msgstr "执行次数" msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/tasks.py:44 +#: xpack/plugins/cloud/tasks.py:32 +msgid "" +"Execute this task when manually or scheduled cloud synchronization tasks are " +"performed" +msgstr "手动,定时执行云同步任务时执行该任务" + +#: xpack/plugins/cloud/tasks.py:46 msgid "Period clean sync instance task execution" msgstr "定期清除同步实例任务执行记录" +#: xpack/plugins/cloud/tasks.py:46 +msgid "" +"Every day, according to the \n" +"configuration in \"System Settings - Tasks - Regular clean-up - Cloud sync " +"task history retention days\" the system \n" +"will clean up the execution records generated by cloud synchronization" +msgstr "" +"每天根据系统设置-任务列表-定期清理配置-云同步记录配置,对云同步产生的执行记录" +"进行清理" + #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." msgstr "恢复默认成功!" diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index f641680c0..26fe94167 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -1396,5 +1396,6 @@ "ZoneUpdate": "Update the zone", "disallowSelfUpdateFields": "Not allowed to modify the current fields yourself", "forceEnableMFAHelpText": "If force enable, user can not disable by themselves", - "removeWarningMsg": "Are you sure you want to remove" + "removeWarningMsg": "Are you sure you want to remove", + "TaskPath": "Task path" } \ No newline at end of file diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index 309b2ff90..4df1b71c8 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -1399,5 +1399,6 @@ "ZoneUpdate": "更新网域", "disallowSelfUpdateFields": "不允许自己修改当前字段", "forceEnableMFAHelpText": "如果强制启用,用户无法自行禁用", - "removeWarningMsg": "你确定要移除" + "removeWarningMsg": "你确定要移除", + "TaskPath": "任务路径" } \ No newline at end of file diff --git a/apps/notifications/notifications.py b/apps/notifications/notifications.py index 11db34f98..abde60768 100644 --- a/apps/notifications/notifications.py +++ b/apps/notifications/notifications.py @@ -43,7 +43,15 @@ class MessageType(type): return clz -@shared_task(verbose_name=_('Publish the station message')) +@shared_task( + verbose_name=_('Publish the station message'), + description=_( + """ + This task needs to be executed for sending internal messages for system alerts, + work orders, and other notifications + """ + ) +) def publish_task(receive_user_ids, backends_msg_mapper): Message.send_msg(receive_user_ids, backends_msg_mapper) diff --git a/apps/ops/models/celery.py b/apps/ops/models/celery.py index 9e40cd921..f92317eeb 100644 --- a/apps/ops/models/celery.py +++ b/apps/ops/models/celery.py @@ -23,6 +23,7 @@ class CeleryTask(models.Model): task = app.tasks.get(self.name, None) return { "comment": getattr(task, 'verbose_name', None), + "description": getattr(task, 'description', None), "queue": getattr(task, 'queue', 'default') } diff --git a/apps/ops/tasks.py b/apps/ops/tasks.py index 2d6bcb375..3ec35a042 100644 --- a/apps/ops/tasks.py +++ b/apps/ops/tasks.py @@ -47,8 +47,15 @@ def _run_ops_job_execution(execution): @shared_task( - soft_time_limit=60, queue="ansible", verbose_name=_("Run ansible task"), - activity_callback=job_task_activity_callback + soft_time_limit=60, + queue="ansible", + verbose_name=_("Run ansible task"), + activity_callback=job_task_activity_callback, + description=_( + """ + Execute scheduled adhoc and playbooks, periodically invoking the task for execution + """ + ) ) def run_ops_job(job_id): with tmp_to_root_org(): @@ -73,8 +80,15 @@ def job_execution_task_activity_callback(self, execution_id, *args, **kwargs): @shared_task( - soft_time_limit=60, queue="ansible", verbose_name=_("Run ansible task execution"), - activity_callback=job_execution_task_activity_callback + soft_time_limit=60, + queue="ansible", + verbose_name=_("Run ansible task execution"), + activity_callback=job_execution_task_activity_callback, + description=_( + """ + Execute the task when manually adhoc or playbooks + """ + ) ) def run_ops_job_execution(execution_id, **kwargs): with tmp_to_root_org(): @@ -86,7 +100,14 @@ def run_ops_job_execution(execution_id, **kwargs): _run_ops_job_execution(execution) -@shared_task(verbose_name=_('Clear celery periodic tasks')) +@shared_task( + verbose_name=_('Clear celery periodic tasks'), + description=_( + """ + At system startup, clean up celery tasks that no longer exist + """ + ) +) @after_app_ready_start def clean_celery_periodic_tasks(): """清除celery定时任务""" @@ -107,7 +128,16 @@ def clean_celery_periodic_tasks(): logger.info('Clean task failure: {}'.format(task)) -@shared_task(verbose_name=_('Create or update periodic tasks')) +@shared_task( + verbose_name=_('Create or update periodic tasks'), + description=_( + """ + With version iterations, new tasks may be added, or task names and execution times may + be modified. Therefore, upon system startup, tasks will be registered or the parameters + of scheduled tasks will be updated + """ + ) +) @after_app_ready_start def create_or_update_registered_periodic_tasks(): from .celery.decorator import get_register_period_tasks @@ -115,20 +145,48 @@ def create_or_update_registered_periodic_tasks(): create_or_update_celery_periodic_tasks(task) -@shared_task(verbose_name=_("Periodic check service performance")) +@shared_task( + verbose_name=_("Periodic check service performance"), + description=_( + """ + Check every hour whether each component is offline and whether the CPU, memory, + and disk usage exceed the thresholds, and send an alert message to the administrator + """ + ) +) @register_as_period_task(interval=3600) def check_server_performance_period(): ServerPerformanceCheckUtil().check_and_publish() -@shared_task(verbose_name=_("Clean up unexpected jobs")) +@shared_task( + verbose_name=_("Clean up unexpected jobs"), + description=_( + """ + Due to exceptions caused by executing adhoc and playbooks in the Job Center, + which result in the task status not being updated, the system will clean up abnormal jobs + that have not been completed for more than 3 hours every hour and mark these tasks as + failed + """ + ) +) @register_as_period_task(interval=3600) def clean_up_unexpected_jobs(): with tmp_to_root_org(): JobExecution.clean_unexpected_execution() -@shared_task(verbose_name=_('Clean job_execution db record')) +@shared_task( + verbose_name=_('Clean job_execution db record'), + description=_( + """ + Due to the execution of adhoc and playbooks in the Job Center, execution records will + be generated. The system will clean up records that exceed the retention period every day + at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - + Job execution retention days' + """ + ) +) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) def clean_job_execution_period(): logger.info("Start clean job_execution db record") @@ -137,7 +195,8 @@ def clean_job_execution_period(): expired_day = now - datetime.timedelta(days=days) with tmp_to_root_org(): del_res = JobExecution.objects.filter(date_created__lt=expired_day).delete() - logger.info(f"clean job_execution db record success! delete {days} days {del_res[0]} records") + logger.info( + f"clean job_execution db record success! delete {days} days {del_res[0]} records") # 测试使用,注释隐藏 # @shared_task diff --git a/apps/orgs/tasks.py b/apps/orgs/tasks.py index 7e02a64a2..a23185362 100644 --- a/apps/orgs/tasks.py +++ b/apps/orgs/tasks.py @@ -6,7 +6,10 @@ from common.utils import get_logger logger = get_logger(__file__) -@shared_task(verbose_name=_("Refresh organization cache")) +@shared_task( + verbose_name=_("Refresh organization cache"), + description=_("Unused") +) def refresh_org_cache_task(*fields): from .caches import OrgResourceStatisticsCache OrgResourceStatisticsCache.refresh(*fields) diff --git a/apps/perms/tasks.py b/apps/perms/tasks.py index 82f97bf8c..d9e45a9f1 100644 --- a/apps/perms/tasks.py +++ b/apps/perms/tasks.py @@ -24,7 +24,17 @@ from perms.utils import UserPermTreeExpireUtil logger = get_logger(__file__) -@shared_task(verbose_name=_('Check asset permission expired')) +@shared_task( + verbose_name=_('Check asset permission expired'), + description=_( + """ + The cache of organizational collections, which have completed user authorization tree + construction, will expire. Therefore, expired collections need to be cleared from the + cache, and this task will be executed periodically based on the time interval specified + by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt + """ + ) +) @register_as_period_task(interval=settings.PERM_EXPIRED_CHECK_PERIODIC) @atomic() @tmp_to_root_org() @@ -37,7 +47,17 @@ def check_asset_permission_expired(): UserPermTreeExpireUtil().expire_perm_tree_for_perms(perm_ids) -@shared_task(verbose_name=_('Send asset permission expired notification')) +@shared_task( + verbose_name=_('Send asset permission expired notification'), + description=_( + """ + Check every day at 10 a.m. and send a notification message to users associated with + assets whose authorization is about to expire, as well as to the organization's + administrators, 3 days in advance, to remind them that the asset authorization will + expire in a few days + """ + ) +) @register_as_period_task(crontab=CRONTAB_AT_AM_TEN) @atomic() @tmp_to_root_org() diff --git a/apps/settings/tasks/ldap.py b/apps/settings/tasks/ldap.py index 1882bf37b..86faa47cb 100644 --- a/apps/settings/tasks/ldap.py +++ b/apps/settings/tasks/ldap.py @@ -25,7 +25,14 @@ def sync_ldap_user(): LDAPSyncUtil().perform_sync() -@shared_task(verbose_name=_('Periodic import ldap user')) +@shared_task( + verbose_name=_('Periodic import ldap user'), + description=_( + """ + When LDAP auto-sync is configured, this task will be invoked to synchronize users + """ + ) +) def import_ldap_user(): start_time = time.time() time_start_display = local_now_display() @@ -63,7 +70,15 @@ def import_ldap_user(): LDAPImportMessage(user, extra_kwargs).publish() -@shared_task(verbose_name=_('Registration periodic import ldap user task')) +@shared_task( + verbose_name=_('Registration periodic import ldap user task'), + description=_( + """ + When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task + will be re-registered or updated, and this task will be invoked + """ + ) +) @after_app_ready_start def import_ldap_user_periodic(**kwargs): task_name = 'import_ldap_user_periodic' diff --git a/apps/terminal/tasks.py b/apps/terminal/tasks.py index 0892aeac5..4ed25b0f0 100644 --- a/apps/terminal/tasks.py +++ b/apps/terminal/tasks.py @@ -28,7 +28,10 @@ RUNNING = False logger = get_task_logger(__name__) -@shared_task(verbose_name=_('Periodic delete terminal status')) +@shared_task( + verbose_name=_('Periodic delete terminal status'), + description=_("Unused") +) @register_as_period_task(interval=3600) @after_app_ready_start def delete_terminal_status_period(): @@ -36,7 +39,15 @@ def delete_terminal_status_period(): Status.objects.filter(date_created__lt=yesterday).delete() -@shared_task(verbose_name=_('Clean orphan session')) +@shared_task( + verbose_name=_('Clean orphan session'), + description=_( + """ + Check every 10 minutes for asset connection sessions that have been inactive for 3 + minutes and mark these sessions as completed + """ + ) +) @register_as_period_task(interval=600) @after_app_ready_start @tmp_to_root_org() @@ -55,7 +66,15 @@ def clean_orphan_session(): session.save() -@shared_task(verbose_name=_('Upload session replay to external storage')) +@shared_task( + verbose_name=_('Upload session replay to external storage'), + description=_( + """ + If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and + recordings will be uploaded to external storage + """ + ) +) def upload_session_replay_to_external_storage(session_id): logger.info(f'Start upload session to external storage: {session_id}') session = Session.objects.filter(id=session_id).first() @@ -85,7 +104,13 @@ def upload_session_replay_to_external_storage(session_id): @shared_task( verbose_name=_('Run applet host deployment'), - activity_callback=lambda self, did, *args, **kwargs: ([did],) + activity_callback=lambda self, did, *args, **kwargs: ([did],), + description=_( + """ + When deploying from the remote application publisher details page, and the 'Deploy' + button is clicked, this task will be executed + """ + ) ) def run_applet_host_deployment(did, install_applets): with tmp_to_builtin_org(system=1): @@ -95,7 +120,13 @@ def run_applet_host_deployment(did, install_applets): @shared_task( verbose_name=_('Install applet'), - activity_callback=lambda self, ids, applet_id, *args, **kwargs: (ids,) + activity_callback=lambda self, ids, applet_id, *args, **kwargs: (ids,), + description=_( + """ + When the 'Deploy' button is clicked in the 'Remote Application' section of the remote + application publisher details page, this task will be executed + """ + ) ) def run_applet_host_deployment_install_applet(ids, applet_id): with tmp_to_builtin_org(system=1): @@ -106,7 +137,13 @@ def run_applet_host_deployment_install_applet(ids, applet_id): @shared_task( verbose_name=_('Uninstall applet'), - activity_callback=lambda self, ids, applet_id, *args, **kwargs: (ids,) + activity_callback=lambda self, ids, applet_id, *args, **kwargs: (ids,), + description=_( + """ + When the 'Uninstall' button is clicked in the 'Remote Application' section of the + remote application publisher details page, this task will be executed + """ + ) ) def run_applet_host_deployment_uninstall_applet(ids, applet_id): with tmp_to_builtin_org(system=1): @@ -117,7 +154,13 @@ def run_applet_host_deployment_uninstall_applet(ids, applet_id): @shared_task( verbose_name=_('Generate applet host accounts'), - activity_callback=lambda self, host_id, *args, **kwargs: ([host_id],) + activity_callback=lambda self, host_id, *args, **kwargs: ([host_id],), + description=_( + """ + When a remote publishing server is created and an account needs to be created + automatically, this task will be executed + """ + ) ) def applet_host_generate_accounts(host_id): applet_host = AppletHost.objects.filter(id=host_id).first() @@ -128,7 +171,16 @@ def applet_host_generate_accounts(host_id): applet_host.generate_accounts() -@shared_task(verbose_name=_('Check command replay storage connectivity')) +@shared_task( + verbose_name=_('Check command replay storage connectivity'), + description=_( + """ + Check every day at midnight whether the external storage for commands and recordings + is accessible. If it is not accessible, send a notification to the recipients specified + in 'System Settings - Notifications - Subscription - Storage - Connectivity' + """ + ) +) @register_as_period_task(crontab='0 0 * * *') @tmp_to_root_org() def check_command_replay_storage_connectivity(): diff --git a/apps/users/signal_handlers.py b/apps/users/signal_handlers.py index c7be331aa..27c629efc 100644 --- a/apps/users/signal_handlers.py +++ b/apps/users/signal_handlers.py @@ -190,7 +190,15 @@ def on_ldap_create_user(sender, user, ldap_user, **kwargs): user.save() -@shared_task(verbose_name=_('Clean up expired user sessions')) +@shared_task( + verbose_name=_('Clean up expired user sessions'), + description=_( + """ + After logging in via the web, a user session record is created. At 2 a.m. every day, + the system cleans up inactive user devices + """ + ) +) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) def clean_expired_user_session_period(): UserSession.clear_expired_sessions() diff --git a/apps/users/tasks.py b/apps/users/tasks.py index 7fd707ac7..a9ba74a4d 100644 --- a/apps/users/tasks.py +++ b/apps/users/tasks.py @@ -22,7 +22,15 @@ from .models import User logger = get_logger(__file__) -@shared_task(verbose_name=_('Check password expired')) +@shared_task( + verbose_name=_('Check password expired'), + description=_( + """ + Check every day at 10 AM whether the passwords of users in the system are expired, + and send a notification 5 days in advance + """ + ) +) def check_password_expired(): users = User.get_nature_users().filter(source=User.Source.local) for user in users: @@ -36,7 +44,16 @@ def check_password_expired(): PasswordExpirationReminderMsg(user).publish_async() -@shared_task(verbose_name=_('Periodic check password expired')) +@shared_task( + verbose_name=_('Periodic check password expired'), + description=_( + """ + With version iterations, new tasks may be added, or task names and execution times may + be modified. Therefore, upon system startup, it is necessary to register or update the + parameters of the task that checks if passwords have expired + """ + ) +) @after_app_ready_start def check_password_expired_periodic(): tasks = { @@ -50,7 +67,15 @@ def check_password_expired_periodic(): create_or_update_celery_periodic_tasks(tasks) -@shared_task(verbose_name=_('Check user expired')) +@shared_task( + verbose_name=_('Check user expired'), + description=_( + """ + Check every day at 10 AM whether the users in the system are expired, and send a + notification 5 days in advance + """ + ) +) def check_user_expired(): date_expired_lt = timezone.now() + timezone.timedelta(days=User.DATE_EXPIRED_WARNING_DAYS) users = User.get_nature_users() \ @@ -67,7 +92,16 @@ def check_user_expired(): UserExpirationReminderMsg(user).publish_async() -@shared_task(verbose_name=_('Periodic check user expired')) +@shared_task( + verbose_name=_('Periodic check user expired'), + description=_( + """ + With version iterations, new tasks may be added, or task names and execution times may + be modified. Therefore, upon system startup, it is necessary to register or update the + parameters of the task that checks if users have expired + """ + ) +) @after_app_ready_start def check_user_expired_periodic(): tasks = { @@ -81,7 +115,16 @@ def check_user_expired_periodic(): create_or_update_celery_periodic_tasks(tasks) -@shared_task(verbose_name=_('Check unused users')) +@shared_task( + verbose_name=_('Check unused users'), + description=_( + """ + At 2 a.m. every day, according to the configuration in "System Settings - Security - + Auth security - Auto disable threshold" users who have not logged in or whose API keys + have not been used for a long time will be disabled + """ + ) +) @register_as_period_task(crontab=CRONTAB_AT_PM_TWO) @tmp_to_root_org() def check_unused_users(): @@ -96,7 +139,8 @@ def check_unused_users(): seconds_to_subtract = uncommon_users_ttl * 24 * 60 * 60 t = timezone.now() - timedelta(seconds=seconds_to_subtract) last_login_q = Q(last_login__lte=t) | (Q(last_login__isnull=True) & Q(date_joined__lte=t)) - api_key_q = Q(date_api_key_last_used__lte=t) | (Q(date_api_key_last_used__isnull=True) & Q(date_joined__lte=t)) + api_key_q = Q(date_api_key_last_used__lte=t) | ( + Q(date_api_key_last_used__isnull=True) & Q(date_joined__lte=t)) users = User.objects \ .filter(date_joined__lt=t) \ From 6264319c51a557cfd2846e98d5e90a84000efa5c Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 9 Sep 2024 19:00:48 +0800 Subject: [PATCH 37/98] perf: When connected through a gateway, you can use nc to forward data (#14110) Co-authored-by: feng <1304903146@qq.com> Co-authored-by: Bryan --- apps/assets/const/protocol.py | 6 + apps/assets/models/gateway.py | 2 +- apps/i18n/core/en/LC_MESSAGES/django.po | 70 +- apps/i18n/core/ja/LC_MESSAGES/django.po | 954 ++++++++++++------- apps/i18n/core/zh/LC_MESSAGES/django.po | 70 +- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 610 +++++++----- apps/ops/ansible/inventory.py | 30 +- 7 files changed, 1058 insertions(+), 684 deletions(-) diff --git a/apps/assets/const/protocol.py b/apps/assets/const/protocol.py index 07a60c3de..dde7ccabe 100644 --- a/apps/assets/const/protocol.py +++ b/apps/assets/const/protocol.py @@ -45,6 +45,12 @@ class Protocol(ChoicesMixin, models.TextChoices): 'default': False, 'label': _('Old SSH version'), 'help_text': _('Old SSH version like openssh 5.x or 6.x') + }, + 'nc': { + 'type': 'bool', + 'default': False, + 'label': 'Netcat (nc)', + 'help_text': _('Netcat help text') } } }, diff --git a/apps/assets/models/gateway.py b/apps/assets/models/gateway.py index 36b2a5a72..9f23cb5fc 100644 --- a/apps/assets/models/gateway.py +++ b/apps/assets/models/gateway.py @@ -16,7 +16,7 @@ __all__ = ['Gateway'] class GatewayManager(OrgManager): def get_queryset(self): queryset = super().get_queryset() - queryset = queryset.filter(platform__name=GATEWAY_NAME) + queryset = queryset.filter(platform__name__startswith=GATEWAY_NAME) return queryset def bulk_create(self, objs, batch_size=None, ignore_conflicts=False): diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index b4efc0405..3587e66bb 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 14:22+0800\n" +"POT-Creation-Date: 2024-09-09 16:05+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -366,7 +366,7 @@ msgstr "" msgid "Su from" msgstr "Switch from" -#: accounts/models/account.py:55 assets/const/protocol.py:189 +#: accounts/models/account.py:55 assets/const/protocol.py:195 #: settings/serializers/auth/cas.py:25 terminal/models/applet/applet.py:36 #: terminal/models/virtualapp/virtualapp.py:21 msgid "Version" @@ -1583,7 +1583,7 @@ msgstr "" msgid "Basic" msgstr "" -#: assets/const/base.py:34 assets/const/protocol.py:292 +#: assets/const/base.py:34 assets/const/protocol.py:298 #: assets/models/asset/web.py:13 msgid "Script" msgstr "" @@ -1661,11 +1661,15 @@ msgstr "" msgid "Old SSH version like openssh 5.x or 6.x" msgstr "" -#: assets/const/protocol.py:58 +#: assets/const/protocol.py:53 +msgid "Netcat help text" +msgstr "Use netcat (nc) as a proxy tool to forward connections from the proxy server to the target host. This is useful in environments that do not support the SSH native proxy option (-W), or when more flexibility and timeout control are needed." + +#: assets/const/protocol.py:64 msgid "SFTP root" msgstr "" -#: assets/const/protocol.py:60 +#: assets/const/protocol.py:66 #, python-brace-format msgid "" "SFTP root directory, Support variable:
- ${ACCOUNT} The connected " @@ -1673,24 +1677,24 @@ msgid "" "
- ${USER} The username of the user" msgstr "" -#: assets/const/protocol.py:75 +#: assets/const/protocol.py:81 msgid "Console" msgstr "" -#: assets/const/protocol.py:76 +#: assets/const/protocol.py:82 msgid "Connect to console session" msgstr "" -#: assets/const/protocol.py:80 +#: assets/const/protocol.py:86 msgid "Any" msgstr "" -#: assets/const/protocol.py:82 rbac/tree.py:62 +#: assets/const/protocol.py:88 rbac/tree.py:62 #: settings/serializers/security.py:232 msgid "Security" msgstr "" -#: assets/const/protocol.py:83 +#: assets/const/protocol.py:89 msgid "" "Security layer to use for the connection:
Any
Automatically select the " "security mode based on the security protocols supported by both the client " @@ -1701,100 +1705,100 @@ msgid "" "and password to be given in advance" msgstr "" -#: assets/const/protocol.py:100 +#: assets/const/protocol.py:106 msgid "AD domain" msgstr "" -#: assets/const/protocol.py:115 +#: assets/const/protocol.py:121 msgid "Username prompt" msgstr "" -#: assets/const/protocol.py:116 +#: assets/const/protocol.py:122 msgid "We will send username when we see this prompt" msgstr "" -#: assets/const/protocol.py:121 +#: assets/const/protocol.py:127 msgid "Password prompt" msgstr "" -#: assets/const/protocol.py:122 +#: assets/const/protocol.py:128 msgid "We will send password when we see this prompt" msgstr "" -#: assets/const/protocol.py:127 +#: assets/const/protocol.py:133 msgid "Success prompt" msgstr "" -#: assets/const/protocol.py:128 +#: assets/const/protocol.py:134 msgid "We will consider login success when we see this prompt" msgstr "" -#: assets/const/protocol.py:139 assets/models/asset/database.py:10 +#: assets/const/protocol.py:145 assets/models/asset/database.py:10 #: settings/serializers/msg.py:49 msgid "Use SSL" msgstr "" -#: assets/const/protocol.py:174 +#: assets/const/protocol.py:180 msgid "SYSDBA" msgstr "" -#: assets/const/protocol.py:175 +#: assets/const/protocol.py:181 msgid "Connect as SYSDBA" msgstr "" -#: assets/const/protocol.py:190 +#: assets/const/protocol.py:196 msgid "" "SQL Server version, Different versions have different connection drivers" msgstr "" -#: assets/const/protocol.py:220 +#: assets/const/protocol.py:226 msgid "Auth source" msgstr "" -#: assets/const/protocol.py:221 +#: assets/const/protocol.py:227 msgid "The database to authenticate against" msgstr "" -#: assets/const/protocol.py:226 authentication/models/connection_token.py:43 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:43 msgid "Connect options" msgstr "" -#: assets/const/protocol.py:227 +#: assets/const/protocol.py:233 msgid "The connection specific options eg. retryWrites=false&retryReads=false" msgstr "" -#: assets/const/protocol.py:239 +#: assets/const/protocol.py:245 msgid "Auth username" msgstr "" -#: assets/const/protocol.py:262 +#: assets/const/protocol.py:268 msgid "Safe mode" msgstr "" -#: assets/const/protocol.py:264 +#: assets/const/protocol.py:270 msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." msgstr "" -#: assets/const/protocol.py:269 assets/models/asset/web.py:9 +#: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 msgid "Autofill" msgstr "" -#: assets/const/protocol.py:277 assets/models/asset/web.py:10 +#: assets/const/protocol.py:283 assets/models/asset/web.py:10 msgid "Username selector" msgstr "" -#: assets/const/protocol.py:282 assets/models/asset/web.py:11 +#: assets/const/protocol.py:288 assets/models/asset/web.py:11 msgid "Password selector" msgstr "" -#: assets/const/protocol.py:287 assets/models/asset/web.py:12 +#: assets/const/protocol.py:293 assets/models/asset/web.py:12 msgid "Submit selector" msgstr "" -#: assets/const/protocol.py:310 +#: assets/const/protocol.py:316 msgid "API mode" msgstr "" diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 91657a68d..ad5c10c64 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 14:22+0800\n" +"POT-Creation-Date: 2024-09-09 16:05+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -187,8 +187,7 @@ msgstr "集めました" msgid "Template" msgstr "テンプレート" -#: accounts/const/account.py:32 ops/const.py:46 -#: xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "スキップ" @@ -367,7 +366,7 @@ msgstr "資産" msgid "Su from" msgstr "から切り替え" -#: accounts/models/account.py:55 assets/const/protocol.py:189 +#: accounts/models/account.py:55 assets/const/protocol.py:195 #: settings/serializers/auth/cas.py:25 terminal/models/applet/applet.py:36 #: terminal/models/virtualapp/virtualapp.py:21 msgid "Version" @@ -391,8 +390,8 @@ msgstr "ソース ID" #: assets/serializers/gateway.py:33 audits/models.py:59 #: authentication/api/connection_token.py:411 ops/models/base.py:18 #: perms/models/asset_permission.py:75 settings/serializers/msg.py:33 -#: terminal/backends/command/models.py:18 -#: terminal/models/session/session.py:34 terminal/serializers/command.py:72 +#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 +#: terminal/serializers/command.py:72 #: terminal/templates/terminal/_msg_command_warning.html:8 #: terminal/templates/terminal/_msg_session_sharing.html:8 #: tickets/models/ticket/command_confirm.py:13 @@ -715,11 +714,9 @@ msgstr "パスワードルール" #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 -#: terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 -#: terminal/models/component/storage.py:26 -#: terminal/models/component/task.py:13 +#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:85 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -780,7 +777,8 @@ msgstr "ユーザーと同じユーザー名" #: accounts/models/virtual.py:37 msgid "Non-asset account, Input username/password on connect" -msgstr "アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" +msgstr "" +"アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" #: accounts/models/virtual.py:38 msgid "The account username name same with user on connect" @@ -790,7 +788,9 @@ msgstr "接続時にユーザー名と同じユーザー名を使用します" msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタイプのアセットのみをサポートします" +msgstr "" +"ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタ" +"イプのアセットのみをサポートします" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -800,7 +800,9 @@ msgstr "アカウントバックアップルートタスクの結果の通知" msgid "" "{} - The account backup passage task has been completed. See the attachment " "for details" -msgstr "{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご覧ください" +msgstr "" +"{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご" +"覧ください" #: accounts/notifications.py:25 msgid "" @@ -808,8 +810,9 @@ msgid "" "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" msgstr "" -"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> " -"プリファレンス設定の基本的なファイル暗号化パスワードの設定" +"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定" +"されていません-個人情報にアクセスしてください-> プリファレンス設定の基本的な" +"ファイル暗号化パスワードの設定" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -827,7 +830,8 @@ msgid "" "has not been set - please go to personal information -> set encryption " "password in preferences" msgstr "" -"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" +"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人" +"情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -865,9 +869,9 @@ msgstr "カテゴリ" #: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 -#: authentication/serializers/connect_token_secret.py:126 -#: ops/models/job.py:150 perms/serializers/user_permission.py:27 -#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 +#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 +#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 +#: terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -939,10 +943,9 @@ msgstr "ID" #: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 -#: audits/models.py:54 audits/models.py:90 audits/models.py:172 -#: audits/models.py:271 audits/serializers.py:171 -#: authentication/models/connection_token.py:32 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 +#: audits/models.py:90 audits/models.py:172 audits/models.py:271 +#: audits/serializers.py:171 authentication/models/connection_token.py:32 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 @@ -992,7 +995,8 @@ msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." msgstr "" -"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの場合は、`username@domain`のようになります。" +"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの" +"場合は、`username@domain`のようになります。" #: accounts/serializers/account/template.py:13 msgid "Password length" @@ -1035,11 +1039,11 @@ msgid "" msgstr "关联平台,可以配置推送参数,如果不关联,则使用默认参数" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 -#: ops/models/adhoc.py:26 ops/models/job.py:158 ops/models/playbook.py:31 -#: rbac/models/role.py:37 settings/models.py:40 -#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:332 -#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:25 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 +#: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 +#: settings/models.py:40 terminal/models/applet/applet.py:46 +#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 +#: terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 @@ -1054,13 +1058,14 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: 資産シークレット内の同じアカウント > ログインシークレット > " -"手動入力.
セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定してください。 " +"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: " +"資産シークレット内の同じアカウント > ログインシークレット > 手動入力.
" +"セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定して" +"ください。 " #: accounts/serializers/automations/base.py:23 #: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172 -#: assets/serializers/automations/base.py:21 -#: perms/serializers/permission.py:47 +#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47 msgid "Nodes" msgstr "ノード" @@ -1090,7 +1095,8 @@ msgstr "アカウントのユーザー名を入力してください" msgid "" "Secret parameter settings, currently only effective for assets of the host " "type." -msgstr "パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" +msgstr "" +"パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" #: accounts/serializers/automations/change_secret.py:84 msgid "* Please enter the correct password length" @@ -1135,11 +1141,14 @@ msgstr "パスワード変更記録とプッシュ記録を定期的にクリア #: accounts/tasks/automation.py:87 msgid "Clean change secret and push record period description" msgstr "" -"システムは、変更タスク、実行レコード、資産、アカウントに関連するものを含め、不要な変更シークレット レコードとプッシュ " -"レコードを定期的にクリーンアップします。これらの関連項目のいずれかが削除されると、対応する変更シークレット レコードとプッシュ " -"レコードは無効になります。したがって、整然とした効率的なデータベースを維持するために、システムはデフォルトでこれらの無効なレコードを 180 " -"日ごとに自動的にクリーンアップします。この定期的なクリーンアップ " -"プロセスにより、ストレージ領域が解放され、データ管理のセキュリティと全体的なパフォーマンスが向上します。" +"システムは、変更タスク、実行レコード、資産、アカウントに関連するものを含め、" +"不要な変更シークレット レコードとプッシュ レコードを定期的にクリーンアップし" +"ます。これらの関連項目のいずれかが削除されると、対応する変更シークレット レ" +"コードとプッシュ レコードは無効になります。したがって、整然とした効率的なデー" +"タベースを維持するために、システムはデフォルトでこれらの無効なレコードを 180 " +"日ごとに自動的にクリーンアップします。この定期的なクリーンアップ プロセスによ" +"り、ストレージ領域が解放され、データ管理のセキュリティと全体的なパフォーマン" +"スが向上します。" #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" @@ -1202,13 +1211,16 @@ msgstr "尊敬する" msgid "" "Hello! The following is the failure of changing the password of your assets " "or pushing the account. Please check and handle it in time." -msgstr "こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとおりです。 時間内に確認して対処してください。" +msgstr "" +"こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとお" +"りです。 時間内に確認して対処してください。" #: accounts/utils.py:52 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not" -" allowed." -msgstr "パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" +"If the password starts with {{` and ends with }} `, then the password is not " +"allowed." +msgstr "" +"パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" #: accounts/utils.py:59 msgid "private key invalid or passphrase error" @@ -1378,9 +1390,9 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* はすべて一致することを示します。例: " -"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64" -" (ドメイン名サポート)" +"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" +"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64 (ドメイン名サ" +"ポート)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1408,8 +1420,8 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* はすべて一致することを示します。例: " -"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" +"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" +"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 @@ -1449,7 +1461,9 @@ msgid "" "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." msgstr "" -"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してください。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必要な措置を講じてください。" +"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してくださ" +"い。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必" +"要な措置を講じてください。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -1478,7 +1492,9 @@ msgstr "ユーザーエージェント" #: assets/api/asset/asset.py:181 msgid "Cannot create asset directly, you should create a host or other" -msgstr "資産を直接作成することはできません。ホストまたはその他を作成する必要があります" +msgstr "" +"資産を直接作成することはできません。ホストまたはその他を作成する必要がありま" +"す" #: assets/api/asset/asset.py:185 msgid "The number of assets exceeds the limit of 5000" @@ -1595,7 +1611,7 @@ msgstr "無効" msgid "Basic" msgstr "基本" -#: assets/const/base.py:34 assets/const/protocol.py:292 +#: assets/const/base.py:34 assets/const/protocol.py:298 #: assets/models/asset/web.py:13 msgid "Script" msgstr "脚本" @@ -1673,144 +1689,155 @@ msgstr "古いSSHバージョン" msgid "Old SSH version like openssh 5.x or 6.x" msgstr "openssh 5.x または 6.x などの古い SSH バージョン" -#: assets/const/protocol.py:58 +#: assets/const/protocol.py:53 +msgid "Netcat help text" +msgstr "netcat (nc) をプロキシ ツールとして使用し、プロキシ サーバーからターゲット ホストに接続を転送します。 SSH ネイティブ エージェント オプション (-W) がサポートされていない環境、またはより柔軟なタイムアウト制御が必要な環境に最適です。" + +#: assets/const/protocol.py:64 msgid "SFTP root" msgstr "SFTPルート" -#: assets/const/protocol.py:60 +#: assets/const/protocol.py:66 #, python-brace-format msgid "" "SFTP root directory, Support variable:
- ${ACCOUNT} The connected " "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントのユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}ユーザーのユーザー名" +"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントの" +"ユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}" +"ユーザーのユーザー名" -#: assets/const/protocol.py:75 +#: assets/const/protocol.py:81 msgid "Console" msgstr "Console" -#: assets/const/protocol.py:76 +#: assets/const/protocol.py:82 msgid "Connect to console session" msgstr "コンソールセッションに接続" -#: assets/const/protocol.py:80 +#: assets/const/protocol.py:86 msgid "Any" msgstr "任意" -#: assets/const/protocol.py:82 rbac/tree.py:62 +#: assets/const/protocol.py:88 rbac/tree.py:62 #: settings/serializers/security.py:232 msgid "Security" msgstr "セキュリティ" -#: assets/const/protocol.py:83 +#: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the" -" security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the " +"security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされているセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します
RDP
レガシーRDP暗号化。このモードは、通常、古い" -" " -"Windowsサーバーや標準のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装されたRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名とパスワードを提供する必要があります
" - -#: assets/const/protocol.py:100 +"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされて" +"いるセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します" +"
RDP
レガシーRDP暗号化。このモードは、通常、古い Windowsサーバーや標準" +"のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装され" +"たRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名と" +"パスワードを提供する必要があります
" + +#: assets/const/protocol.py:106 msgid "AD domain" msgstr "AD ドメイン" -#: assets/const/protocol.py:115 +#: assets/const/protocol.py:121 msgid "Username prompt" msgstr "ユーザー名プロンプト" -#: assets/const/protocol.py:116 +#: assets/const/protocol.py:122 msgid "We will send username when we see this prompt" msgstr "このプロンプトが表示されたらユーザー名を送信します" -#: assets/const/protocol.py:121 +#: assets/const/protocol.py:127 msgid "Password prompt" msgstr "パスワードプロンプト" -#: assets/const/protocol.py:122 +#: assets/const/protocol.py:128 msgid "We will send password when we see this prompt" msgstr "このプロンプトが表示されたらパスワードを送信します" -#: assets/const/protocol.py:127 +#: assets/const/protocol.py:133 msgid "Success prompt" msgstr "成功プロンプト" -#: assets/const/protocol.py:128 +#: assets/const/protocol.py:134 msgid "We will consider login success when we see this prompt" msgstr "このプロンプトが表示されたらログイン成功とみなします" -#: assets/const/protocol.py:139 assets/models/asset/database.py:10 +#: assets/const/protocol.py:145 assets/models/asset/database.py:10 #: settings/serializers/msg.py:49 msgid "Use SSL" msgstr "SSLの使用" -#: assets/const/protocol.py:174 +#: assets/const/protocol.py:180 msgid "SYSDBA" msgstr "SYSDBA" -#: assets/const/protocol.py:175 +#: assets/const/protocol.py:181 msgid "Connect as SYSDBA" msgstr "SYSDBA として接続" -#: assets/const/protocol.py:190 +#: assets/const/protocol.py:196 msgid "" "SQL Server version, Different versions have different connection drivers" msgstr "SQL Server のバージョン。バージョンによって接続ドライバが異なります" -#: assets/const/protocol.py:220 +#: assets/const/protocol.py:226 msgid "Auth source" msgstr "認証データベース" -#: assets/const/protocol.py:221 +#: assets/const/protocol.py:227 msgid "The database to authenticate against" msgstr "認証するデータベース" -#: assets/const/protocol.py:226 authentication/models/connection_token.py:43 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:43 msgid "Connect options" msgstr "接続アイテム" -#: assets/const/protocol.py:227 +#: assets/const/protocol.py:233 msgid "The connection specific options eg. retryWrites=false&retryReads=false" msgstr "接続固有のオプション (例: retryWrites=false&retryReads=false)" -#: assets/const/protocol.py:239 +#: assets/const/protocol.py:245 msgid "Auth username" msgstr "ユーザー名で認証する" -#: assets/const/protocol.py:262 +#: assets/const/protocol.py:268 msgid "Safe mode" msgstr "安全モード" -#: assets/const/protocol.py:264 +#: assets/const/protocol.py:270 msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへのアクセスなど、一部の操作が無効になります" +msgstr "" +"安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへ" +"のアクセスなど、一部の操作が無効になります" -#: assets/const/protocol.py:269 assets/models/asset/web.py:9 +#: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 msgid "Autofill" msgstr "自動充填" -#: assets/const/protocol.py:277 assets/models/asset/web.py:10 +#: assets/const/protocol.py:283 assets/models/asset/web.py:10 msgid "Username selector" msgstr "ユーザー名ピッカー" -#: assets/const/protocol.py:282 assets/models/asset/web.py:11 +#: assets/const/protocol.py:288 assets/models/asset/web.py:11 msgid "Password selector" msgstr "パスワードセレクター" -#: assets/const/protocol.py:287 assets/models/asset/web.py:12 +#: assets/const/protocol.py:293 assets/models/asset/web.py:12 msgid "Submit selector" msgstr "ボタンセレクターを確認する" -#: assets/const/protocol.py:310 +#: assets/const/protocol.py:316 msgid "API mode" msgstr "APIモード" @@ -2195,7 +2222,9 @@ msgstr "%(value)s は偶数ではありません" msgid "" "Batch update platform in assets, skipping assets that do not meet platform " "type" -msgstr "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プラットフォーム" +msgstr "" +"プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プ" +"ラットフォーム" #: assets/serializers/asset/common.py:36 msgid "Protocols, format is [\"protocol/port\"]" @@ -2209,13 +2238,17 @@ msgstr "契約書、形式は 名前/ポート" msgid "" "Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " "\"secret_type\": \"password\"}]" -msgstr "アカウント、形式は [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"パスワード\"}]" +msgstr "" +"アカウント、形式は [{\"name\": \"x\", \"username\": \"x\", \"secret\": " +"\"x\", \"secret_type\": \"パスワード\"}]" #: assets/serializers/asset/common.py:135 msgid "" "Node path, format [\"/org_name/node_name\"], if node not exist, will create " "it" -msgstr "ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作成します" +msgstr "" +"ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作" +"成します" #: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 @@ -2258,10 +2291,11 @@ msgstr "デフォルト・データベース" #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an" -" HTTP proxy. e.g. http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an " +"HTTP proxy. e.g. http(s)://host:port" msgstr "" -"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要があります。例: http(s)://host:port" +"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要" +"があります。例: http(s)://host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2333,7 +2367,9 @@ msgstr "タイプ" msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." -msgstr "ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続する際には、接続はゲートウェイを通してルーティングされます。" +msgstr "" +"ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続す" +"る際には、接続はゲートウェイを通してルーティングされます。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 #: orgs/serializers.py:13 perms/serializers/permission.py:50 @@ -2404,7 +2440,9 @@ msgstr "アドレスからのポート" msgid "" "This protocol is primary, and it must be set when adding assets. " "Additionally, there can only be one primary protocol." -msgstr "このプロトコルはプライマリであり、資産を追加するときに設定する必要があります。また、プライマリプロトコルは1つしかありません" +msgstr "" +"このプロトコルはプライマリであり、資産を追加するときに設定する必要がありま" +"す。また、プライマリプロトコルは1つしかありません" #: assets/serializers/platform.py:102 msgid "This protocol is required, and it must be set when adding assets." @@ -2414,11 +2452,14 @@ msgstr "このプロトコルは必須であり、資産を追加するときに msgid "" "This protocol is default, when adding assets, it will be displayed by " "default." -msgstr "このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されます" +msgstr "" +"このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されま" +"す" #: assets/serializers/platform.py:108 msgid "This protocol is public, asset will show this protocol to user" -msgstr "このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" +msgstr "" +"このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" #: assets/serializers/platform.py:157 msgid "Help text" @@ -2438,8 +2479,9 @@ msgid "" "another, similar to logging in with a regular account and then switching to " "root" msgstr "" -"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに切り替えます。これは、通常のアカウントでログインした後に root " -"に切り替えるのと似ています" +"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに" +"切り替えます。これは、通常のアカウントでログインした後に root に切り替えるの" +"と似ています" #: assets/serializers/platform.py:205 msgid "Assets can be connected using a zone gateway" @@ -2487,9 +2529,10 @@ msgstr "ノード下のアセット数を確認する" #: assets/tasks/nodes_amount.py:28 msgid "" -"The task of self-checking is already running and cannot be started " -"repeatedly" -msgstr "セルフチェックのタスクはすでに実行されており、繰り返し開始することはできません" +"The task of self-checking is already running and cannot be started repeatedly" +msgstr "" +"セルフチェックのタスクはすでに実行されており、繰り返し開始することはできませ" +"ん" #: assets/tasks/nodes_amount.py:33 msgid "Periodic check the amount of assets under the node" @@ -2529,8 +2572,7 @@ msgid "App Audits" msgstr "監査" #: audits/backends/db.py:17 -msgid "" -"The text content is too long. Use Elasticsearch to store operation logs" +msgid "The text content is too long. Use Elasticsearch to store operation logs" msgstr "文章の内容が長すぎる。Elasticsearchで操作履歴を保存する" #: audits/backends/db.py:108 @@ -2623,8 +2665,8 @@ msgstr "終了" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174 -#: terminal/models/virtualapp/provider.py:14 -#: terminal/serializers/session.py:55 terminal/serializers/session.py:78 +#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 +#: terminal/serializers/session.py:78 msgid "Terminal" msgstr "ターミナル" @@ -2663,8 +2705,7 @@ msgid "Job audit log" msgstr "ジョブ監査ログ" #: audits/models.py:56 audits/models.py:100 audits/models.py:175 -#: terminal/models/session/session.py:39 -#: terminal/models/session/sharing.py:113 +#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:113 msgid "Remote addr" msgstr "リモートaddr" @@ -2894,7 +2935,9 @@ msgstr "この操作には、MFAを検証する必要があります" #: authentication/api/connection_token.py:265 msgid "Reusable connection token is not allowed, global setting not enabled" -msgstr "再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効になっていません" +msgstr "" +"再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効に" +"なっていません" #: authentication/api/connection_token.py:379 msgid "Anonymous account is not supported for this asset" @@ -2933,7 +2976,9 @@ msgstr "ユーザーにマッチしなかった" msgid "" "The user is from {}, please go to the corresponding system to change the " "password" -msgstr "ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してください。" +msgstr "" +"ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してくだ" +"さい。" #: authentication/api/password.py:65 #: authentication/templates/authentication/login.html:393 @@ -2964,7 +3009,8 @@ msgstr "無効なトークンヘッダー。記号文字列にはスペースを #: authentication/backends/drf.py:61 msgid "" "Invalid token header. Sign string should not contain invalid characters." -msgstr "無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" +msgstr "" +"無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" #: authentication/backends/drf.py:74 msgid "Invalid token or cache refreshed." @@ -2976,7 +3022,9 @@ msgstr "OpenID エラー" #: authentication/backends/oidc/views.py:175 msgid "Please check if a user with the same username or email already exists" -msgstr "同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認してください" +msgstr "" +"同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認して" +"ください" #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" @@ -2996,8 +3044,7 @@ msgstr "に追加" #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:26 -#: authentication/models/private_token.py:8 -#: authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後に使用した日付" @@ -3072,27 +3119,34 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 {times_try} 回試すこともできます (アカウントは " -"{block_time} 分の間一時的にロックされます)" +"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 " +"{times_try} 回試すこともできます (アカウントは {block_time} 分の間一時的に" +"ロックされます)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" "The account has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後にもう一度お試しください)" +msgstr "" +"アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後" +"にもう一度お試しください)" #: authentication/errors/const.py:51 msgid "" "The address has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行してください)" +msgstr "" +"IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行" +"してください)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily" -" locked for {block_time} minutes)" -msgstr "{error},{times_try} 回も試すことができます (アカウントは {block_time} 分の間一時的にロックされます)" +"{error}, You can also try {times_try} times (The account will be temporarily " +"locked for {block_time} minutes)" +msgstr "" +"{error},{times_try} 回も試すことができます (アカウントは {block_time} 分の間" +"一時的にロックされます)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3179,7 +3233,8 @@ msgstr "ログインする前にパスワードを変更する必要がありま #: authentication/errors/redirect.py:101 authentication/mixins.py:337 msgid "Your password has expired, please reset before logging in" -msgstr "パスワードの有効期限が切れました。ログインする前にリセットしてください。" +msgstr "" +"パスワードの有効期限が切れました。ログインする前にリセットしてください。" #: authentication/forms.py:34 msgid "Auto-login" @@ -3220,7 +3275,8 @@ msgstr "カスタム MFA 検証コード" #: authentication/mfa/custom.py:56 msgid "MFA custom global enabled, cannot disable" -msgstr "カスタム MFA はグローバルに有効になっており、無効にすることはできません" +msgstr "" +"カスタム MFA はグローバルに有効になっており、無効にすることはできません" #: authentication/mfa/otp.py:7 msgid "OTP code invalid, or server time error" @@ -3287,7 +3343,9 @@ msgstr "無効なユーザーです" msgid "" "The administrator has enabled 'Only allow login from user source'. \n" " The current user source is {}. Please contact the administrator." -msgstr "管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユーザーソースは {} です。管理者に連絡してください。" +msgstr "" +"管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユー" +"ザーソースは {} です。管理者に連絡してください。" #: authentication/mixins.py:273 msgid "The MFA type ({}) is not enabled" @@ -3500,9 +3558,11 @@ msgstr "タイプを作成" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be" -" downloaded once" -msgstr "作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度きりです" +"Please download the private key after creation. Each private key can only be " +"downloaded once" +msgstr "" +"作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度き" +"りです" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 #: users/serializers/profile.py:133 users/serializers/profile.py:160 @@ -3599,7 +3659,9 @@ msgstr "アカウントにリモートログイン動作があります。注意 msgid "" "If you suspect that the login behavior is abnormal, please modify the " "account password in time." -msgstr "ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変更してください。" +msgstr "" +"ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変" +"更してください。" #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" @@ -3613,7 +3675,9 @@ msgstr "操作が独自のものでない場合は、パスワードをバイン msgid "" "Please click the link below to reset your password, if not your request, " "concern your account security" -msgstr "下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場合は、アカウントのセキュリティに関係します。" +msgstr "" +"下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場" +"合は、アカウントのセキュリティに関係します。" #: authentication/templates/authentication/_msg_reset_password.html:10 msgid "Click here reset password" @@ -3658,7 +3722,9 @@ msgstr "ブラウザ" msgid "" "If the password update was not initiated by you, your account may have " "security issues" -msgstr "パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" +msgstr "" +"パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題があ" +"る可能性があります" #: authentication/templates/authentication/_msg_rest_password_success.html:14 #: authentication/templates/authentication/_msg_rest_public_key_success.html:14 @@ -3673,7 +3739,9 @@ msgstr "公開鍵が正常に更新されました" msgid "" "If the public key update was not initiated by you, your account may have " "security issues" -msgstr "公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" +msgstr "" +"公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可" +"能性があります" #: authentication/templates/authentication/auth_fail_flash_message_standalone.html:28 #: templates/flash_message_standalone.html:28 tickets/const.py:18 @@ -3684,7 +3752,9 @@ msgstr "キャンセル" msgid "" "Configuration file has problems and cannot be logged in. Please contact the " "administrator or view latest docs" -msgstr "設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のドキュメントを参照してください。" +msgstr "" +"設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のド" +"キュメントを参照してください。" #: authentication/templates/authentication/login.html:309 msgid "If you are administrator, you can update the config resolve it, set" @@ -3730,7 +3800,9 @@ msgstr "コピー成功" msgid "" "This page is not served over HTTPS. Please use HTTPS to ensure security of " "your credentials." -msgstr "このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリティを確保してください。" +msgstr "" +"このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリ" +"ティを確保してください。" #: authentication/templates/authentication/passkey.html:173 msgid "Do you want to retry ?" @@ -3859,9 +3931,11 @@ msgstr "ログアウト成功、ログインページを返す" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client." -" If you need to open it in the client, please log in again" -msgstr "安全のため、クライアントでの自動リダイレクトログインはサポートされていません。クライアントで開く必要がある場合は、再度ログインしてください" +"For your safety, automatic redirection login is not supported on the client. " +"If you need to open it in the client, please log in again" +msgstr "" +"安全のため、クライアントでの自動リダイレクトログインはサポートされていませ" +"ん。クライアントで開く必要がある場合は、再度ログインしてください" #: authentication/views/slack.py:35 authentication/views/slack.py:118 msgid "Slack Error" @@ -3967,12 +4041,13 @@ msgstr "Secret Keyを使用したフィールドの暗号化" #: common/db/fields.py:577 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" -" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " +"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 {'type':'ids','ids':[]}或 " -"#タイプ:属性、属性:[#名前:ip、照合:正確、値:1.1.1.1}" +"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 " +"{'type':'ids','ids':[]}或 #タイプ:属性、属性:[#名前:ip、照合:正確、" +"値:1.1.1.1}" #: common/db/fields.py:584 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4058,7 +4133,9 @@ msgstr "日付時刻形式 {}" msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" -msgstr "選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。選択肢は {}" +msgstr "" +"選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。" +"選択肢は {}" #: common/drf/renders/base.py:156 msgid "Choices, options {}" @@ -4075,7 +4152,9 @@ msgstr "タグ、形式: [\"キー:値\"]" #: common/drf/renders/base.py:162 msgid "" "Object, format name(id), name is optional for human read, id is requisite" -msgstr "関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須です" +msgstr "" +"関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須で" +"す" #: common/drf/renders/base.py:164 msgid "Object, format id" @@ -4085,11 +4164,15 @@ msgstr "関連項目、形式は id" msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" -msgstr "多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいように、idは必須です" +msgstr "" +"多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいよう" +"に、idは必須です" #: common/drf/renders/base.py:170 -msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" -msgstr "タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します" +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "" +"タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します" #: common/drf/renders/base.py:172 msgid "Objects, format [\"id\", ...]" @@ -4099,7 +4182,9 @@ msgstr "多関連項目、形式は [\"id\", ...]" msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" -msgstr "{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワードに暗号化パスワードを設定してください" +msgstr "" +"{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワード" +"に暗号化パスワードを設定してください" #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format @@ -4142,7 +4227,9 @@ msgstr "サポートされていません Elasticsearch8" msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" -msgstr "接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してください" +msgstr "" +"接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してく" +"ださい" #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" @@ -4320,13 +4407,16 @@ msgid "" "configure nginx for url distribution,
If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
" -"Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要があります。urlディストリビューションにnginxを設定します。
" -" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" +"
Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要" +"があります。urlディストリビューションにnginxを設定します。
この" +"ページが表示されている場合は、nginxリスニングポートにアクセスしていないことを" +"証明してください。頑張ってください。" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" -msgstr "Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要があります。" +msgstr "" +"Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要がありま" +"す。" #: jumpserver/views/other.py:90 msgid "" @@ -4334,8 +4424,10 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要があります。URL配布用にnginxを設定します。
" -" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" +"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要が" +"あります。URL配布用にnginxを設定します。
このページが表示されて" +"いる場合は、nginxリスニングポートにアクセスしていないことを証明してください。" +"頑張ってください。" #: labels/apps.py:8 msgid "App Labels" @@ -4426,12 +4518,15 @@ msgstr "タスク実行パラメータエラー" msgid "" "Asset ({asset}) must have at least one of the following protocols added: " "SSH, SFTP, or WinRM" -msgstr "資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加する必要があります" +msgstr "" +"資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加" +"する必要があります" #: ops/api/job.py:84 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" -msgstr "資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" +msgstr "" +"資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" #: ops/api/job.py:85 #, python-brace-format @@ -4446,7 +4541,9 @@ msgstr "重複したファイルが存在する" #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" -msgstr "ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択してください。" +msgstr "" +"ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択し" +"てください。" #: ops/api/job.py:244 msgid "" @@ -4863,7 +4960,8 @@ msgstr "現在の組織 ({}) は削除できません" msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" -msgstr "LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" +msgstr "" +"LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" #: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" @@ -4882,8 +4980,7 @@ msgstr "組織を選択してから保存してください" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:52 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 -#: tickets/serializers/ticket/ticket.py:60 +#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 msgid "Organization" msgstr "組織" @@ -5047,8 +5144,8 @@ msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" msgstr "" -"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], バーチャルオプション: @ALL, " -"@SPEC, @USER, @ANON, @INPUT" +"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], " +"バーチャルオプション: @ALL, @SPEC, @USER, @ANON, @INPUT" #: perms/serializers/permission.py:38 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -5192,7 +5289,8 @@ msgstr "全ての組織" msgid "" "User last role in org, can not be delete, you can remove user from org " "instead" -msgstr "ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" +msgstr "" +"ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" #: rbac/models/rolebinding.py:200 msgid "Organization role binding" @@ -5323,7 +5421,9 @@ msgstr "SMTP設定のテスト" #: settings/api/ldap.py:90 msgid "" "Users are not synchronized, please click the user synchronization button" -msgstr "ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてください。" +msgstr "" +"ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてくださ" +"い。" #: settings/api/sms.py:142 msgid "Invalid SMS platform" @@ -5476,7 +5576,9 @@ msgid "" "information, the system will automatically create the user using this email " "suffix" msgstr "" -"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユーザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィックスでユーザーを作成します" +"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユー" +"ザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィック" +"スでユーザーを作成します" #: settings/serializers/auth/base.py:36 msgid "Forgot Password URL" @@ -5495,13 +5597,17 @@ msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証にリダイレクトされる前に Flash ページを表示するかどうか" +msgstr "" +"管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証" +"にリダイレクトされる前に Flash ページを表示するかどうか" #: settings/serializers/auth/base.py:54 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザーは常にデフォルト組織に属します。" +msgstr "" +"ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザー" +"は常にデフォルト組織に属します。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" @@ -5533,8 +5639,7 @@ msgstr "ユーザー名のプロパティ" msgid "Enable attributes map" msgstr "属性マップの有効化" -#: settings/serializers/auth/cas.py:34 -#: settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 #: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 #: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 @@ -5547,7 +5652,8 @@ msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、`value` は JumpServer のユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、" +"`value` は JumpServer のユーザー属性名です" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -5557,7 +5663,9 @@ msgstr "そうでない場合はユーザーを作成" msgid "" "After successful user authentication, if the user does not exist, " "automatically create the user" -msgstr "ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成されます" +msgstr "" +"ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成さ" +"れます" #: settings/serializers/auth/dingtalk.py:16 msgid "Dingtalk" @@ -5568,15 +5676,16 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は ディントーク " -"サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は ディントーク サービスのユーザー属性名です" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は フェイシュ サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は フェイシュ サービスのユーザー属性名です" #: settings/serializers/auth/lark.py:13 users/models/user/_source.py:21 msgid "Lark" @@ -5587,7 +5696,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Lark サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は Lark サービスのユーザー属性名です" #: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" @@ -5617,7 +5727,8 @@ msgstr "システムアーキテクチャ" msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" -msgstr "ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" +msgstr "" +"ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" #: settings/serializers/auth/ldap.py:62 msgid "Search filter" @@ -5633,7 +5744,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は LDAP サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は LDAP サービスのユーザー属性名です" #: settings/serializers/auth/ldap.py:84 msgid "Connect timeout (s)" @@ -5650,8 +5762,9 @@ msgid "" "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証の速度を効果的に改善できます。
ユーザーの OU " -"構造が調整された場合は、提出をクリックしてユーザーの DN キャッシュをクリアできます。" +"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証" +"の速度を効果的に改善できます。
ユーザーの OU 構造が調整された場合は、提出" +"をクリックしてユーザーの DN キャッシュをクリアできます。" #: settings/serializers/auth/ldap.py:97 msgid "Search paged size (piece)" @@ -5702,8 +5815,7 @@ msgid "End session endpoint" msgstr "プロバイダーのセッション終了エンドポイント" #: settings/serializers/auth/oauth2.py:57 -msgid "" -"When the user signs out, they also be logged out from the OAuth2 server" +msgid "When the user signs out, they also be logged out from the OAuth2 server" msgstr "ユーザーがログアウトすると、OAuth2 サーバからもログアウトします" #: settings/serializers/auth/oauth2.py:62 @@ -5711,11 +5823,11 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OAuth2 " -"サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は OAuth2 サービスのユーザー属性名です" -#: settings/serializers/auth/oauth2.py:67 -#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 +#: settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "常にユーザーを更新" @@ -5748,7 +5860,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OIDC サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は OIDC サービスのユーザー属性名です" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -5766,7 +5879,9 @@ msgstr "Keycloakを使用する" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プロトコルを使用する" +msgstr "" +"Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プ" +"ロトコルを使用する" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -5825,7 +5940,9 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストとDOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切ります" +"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストと" +"DOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切り" +"ます" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -5841,9 +5958,10 @@ msgid "OTP in RADIUS" msgstr "Radius のOTP" #: settings/serializers/auth/radius.py:24 -msgid "" -"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" -msgstr "* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用することができる" +msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgstr "" +"* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用す" +"ることができる" #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 msgid "SAML2" @@ -5873,7 +5991,9 @@ msgstr "SP 証明書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`はJumpServerのユーザー属性名)" +msgstr "" +"ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`は" +"JumpServerのユーザー属性名)" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -5884,7 +6004,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Slack サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は Slack サービスのユーザー属性名です" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -5949,11 +6070,13 @@ msgstr "ビジネス・タイプ(Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed" -" 67 words. For example, your verification code is {code}, which is valid for" -" 5 minutes. Please do not disclose it to others." +"Template need contain {code} and Signature + template length does not exceed " +"67 words. For example, your verification code is {code}, which is valid for " +"5 minutes. Please do not disclose it to others." msgstr "" -"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わないでください。" +"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未" +"満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わない" +"でください。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -5974,7 +6097,8 @@ msgstr "SSO Token認証の有効化" #: settings/serializers/auth/sso.py:17 msgid "Other service can using SSO token login to JumpServer without password" -msgstr "他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" +msgstr "" +"他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" #: settings/serializers/auth/sso.py:20 msgid "SSO auth key TTL" @@ -5990,8 +6114,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は エンタープライズ WeChat " -"サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は エンタープライズ WeChat サービスのユーザー属性名です" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -5999,9 +6123,11 @@ msgstr "サイトURL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service" -" and is usually used in links in system emails" -msgstr "サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常はシステムメール内のリンクに使用されます" +"Site URL is the externally accessible address of the current product service " +"and is usually used in links in system emails" +msgstr "" +"サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常は" +"システムメール内のリンクに使用されます" #: settings/serializers/basic.py:18 msgid "User guide url" @@ -6026,7 +6152,9 @@ msgstr "ドキュメントリンク" #: settings/serializers/basic.py:27 msgid "" "Document URL refers to the address in the top navigation bar Help - Document" -msgstr "ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ドキュメント" +msgstr "" +"ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ド" +"キュメント" #: settings/serializers/basic.py:30 msgid "Support URL" @@ -6035,7 +6163,8 @@ msgstr "サポートリンク" #: settings/serializers/basic.py:31 msgid "" "Support URL refers to the address in the top navigation bar Help - Support" -msgstr "サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" +msgstr "" +"サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" #: settings/serializers/basic.py:44 msgid "Organization name already exists" @@ -6086,7 +6215,8 @@ msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." msgstr "" -"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (データベースのバックアップに影響し、OSS などには影響しません)" +"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (デー" +"タベースのバックアップに影響し、OSS などには影響しません)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -6130,8 +6260,9 @@ msgid "" "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、所定の数を超える履歴アカウントを確認して削除します。 値が 999 " -"以上の場合、履歴アカウントの削除は実行されません。" +"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、" +"所定の数を超える履歴アカウントを確認して削除します。 値が 999 以上の場合、履" +"歴アカウントの削除は実行されません。" #: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" @@ -6142,8 +6273,7 @@ msgid "GPT Base URL" msgstr "GPTアドレス" #: settings/serializers/feature.py:86 -msgid "" -"The base URL of the GPT service. For example: https://api.openai.com/v1" +msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPTサービスの基本のURL。例えば:https://api.openai.com/v1" #: settings/serializers/feature.py:89 templates/_header_bar.html:96 @@ -6191,7 +6321,9 @@ msgstr "ユーザーの実行" #: settings/serializers/feature.py:124 msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" -msgstr "ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行することを許可します" +msgstr "" +"ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行すること" +"を許可します" #: settings/serializers/feature.py:128 msgid "Command blacklist" @@ -6217,7 +6349,9 @@ msgstr "仮想アプリケーション" msgid "" "Virtual applications, you can use the Linux operating system as an " "application server in remote applications." -msgstr "仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレーティングシステムを使用できます。" +msgstr "" +"仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレー" +"ティングシステムを使用できます。" #: settings/serializers/msg.py:24 msgid "SMTP" @@ -6229,7 +6363,9 @@ msgstr "" #: settings/serializers/msg.py:34 msgid "The user to be used for email server authentication" -msgstr "メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアドレスです" +msgstr "" +"メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアド" +"レスです" #: settings/serializers/msg.py:38 msgid "" @@ -6255,7 +6391,9 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどのメール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用します" +"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどの" +"メール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用し" +"ます" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -6265,7 +6403,9 @@ msgstr "TLSの使用" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的なTLS接続を使用します、通常ポート587を使用します" +msgstr "" +"SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的な" +"TLS接続を使用します、通常ポート587を使用します" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -6273,9 +6413,11 @@ msgstr "件名プレフィックス" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account" -" successfully)" -msgstr "ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを正常に作成)" +"Tips: When creating a user, send the subject of the email (eg:Create account " +"successfully)" +msgstr "" +"ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを" +"正常に作成)" #: settings/serializers/msg.py:73 msgid "Honorific" @@ -6283,14 +6425,17 @@ msgstr "ユーザー敬語の作成" #: settings/serializers/msg.py:74 msgid "Tips: When creating a user, send the honorific of the email (eg:Hello)" -msgstr "ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" +msgstr "" +"ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" #: settings/serializers/msg.py:80 #, python-brace-format msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}{email}ラベルをサポートします。" +msgstr "" +"ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}" +"{email}ラベルをサポートします。" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -6307,7 +6452,9 @@ msgstr "グループ化されていないノードを表示" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" msgstr "" -"グループ化されていないノードに個別に許可された資産を配置し、資産が存在するノードが表示されないようにしますが、そのノードが許可されていないという質問に質問" +"グループ化されていないノードに個別に許可された資産を配置し、資産が存在する" +"ノードが表示されないようにしますが、そのノードが許可されていないという質問に" +"質問" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -6319,8 +6466,10 @@ msgid "" "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" msgstr "" -"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) " -"以内に、パスワードの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信されます。" +"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有" +"効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) 以内に、パスワー" +"ドの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信さ" +"れます。" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -6330,7 +6479,9 @@ msgstr "繰り返された履歴パスワードの数" msgid "" "Tip: When the user resets the password, it cannot be the previous n " "historical passwords of the user" -msgstr "ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワードにすることはできません" +msgstr "" +"ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワード" +"にすることはできません" #: settings/serializers/security.py:34 msgid "Minimum length (User)" @@ -6352,7 +6503,9 @@ msgstr "特別な" msgid "" "If the user has failed to log in for a limited number of times, no login is " "allowed during this time interval." -msgstr "ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログインはできません。" +msgstr "" +"ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログイン" +"はできません。" #: settings/serializers/security.py:63 settings/serializers/security.py:73 msgid "Login failures count" @@ -6378,7 +6531,9 @@ msgstr "単一デバイスログインのみ" msgid "" "After the user logs in on the new device, other logged-in devices will " "automatically log out" -msgstr "ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動的にログアウトします。" +msgstr "" +"ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動" +"的にログアウトします。" #: settings/serializers/security.py:95 msgid "Only exist user login" @@ -6391,8 +6546,9 @@ msgid "" "are allowed to log in and automatically create users (if the user does not " "exist)" msgstr "" -"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的に作成されます" -" (ユーザーが存在しない場合)。" +"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、" +"ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的" +"に作成されます (ユーザーが存在しない場合)。" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -6400,13 +6556,14 @@ msgstr "ソースログインからのみ" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging" -" in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging " +"in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべての認証方法を特定の順序で認証します。" -" 、直接ログインできます" +"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効" +"な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべ" +"ての認証方法を特定の順序で認証します。 、直接ログインできます" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -6457,7 +6614,8 @@ msgstr "ログインページのMFA" #: settings/serializers/security.py:144 msgid "Eu security regulations(GDPR) require MFA to be on the login page" -msgstr "Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" +msgstr "" +"Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" #: settings/serializers/security.py:148 msgid "Verify code TTL (second)" @@ -6475,7 +6633,9 @@ msgstr "ログイン動的コードの有効化" msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "パスワードと追加コードは、検証のためにサードパーティの認証システムに送信されます" +msgstr "" +"パスワードと追加コードは、検証のためにサードパーティの認証システムに送信され" +"ます" #: settings/serializers/security.py:158 msgid "Login captcha" @@ -6491,11 +6651,13 @@ msgstr "リモートログイン保護" #: settings/serializers/security.py:164 msgid "" -"The system determines whether the login IP address belongs to a common login" -" city. If the account is logged in from a common login city, the system " -"sends a remote login reminder" +"The system determines whether the login IP address belongs to a common login " +"city. If the account is logged in from a common login city, the system sends " +"a remote login reminder" msgstr "" -"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断します。アカウントが共通のログイン都市からログインしている場合、システムはリモートログインリマインダーを送信します" +"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断" +"します。アカウントが共通のログイン都市からログインしている場合、システムはリ" +"モートログインリマインダーを送信します" #: settings/serializers/security.py:170 msgid "Auto Disable Threshold (day)" @@ -6505,7 +6667,9 @@ msgstr "未使用のユーザータイムアウト(日)" msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" -msgstr "毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効にします" +msgstr "" +"毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効に" +"します" #: settings/serializers/security.py:191 msgid "Watermark" @@ -6550,7 +6714,8 @@ msgstr "セッション共有" #: settings/serializers/security.py:213 msgid "Enabled, Allows user active session to be shared with other users" -msgstr "ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" +msgstr "" +"ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" #: settings/serializers/security.py:219 msgid "Insecure command alert" @@ -6579,24 +6744,30 @@ msgstr "ターミナルレジスタの有効化" #: settings/serializers/terminal.py:24 msgid "" -"Allow component register, after all component setup, you should disable this" -" for security" -msgstr "ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティのためにこれを無効にする必要があります" +"Allow component register, after all component setup, you should disable this " +"for security" +msgstr "" +"ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティ" +"のためにこれを無効にする必要があります" #: settings/serializers/terminal.py:30 msgid "" "* Allow users to log in to the KoKo component via password authentication" -msgstr "* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可する" +msgstr "" +"* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可" +"する" #: settings/serializers/terminal.py:36 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in" -" after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in " +"after being deleted from the AD/LDAP server" msgstr "" -"* " -"公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバから削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべきです。" +"* 公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第" +"三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバ" +"から削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべ" +"きです。" #: settings/serializers/terminal.py:43 msgid "Asset sorting" @@ -6608,21 +6779,23 @@ msgstr "ページサイズを一覧表示" #: settings/serializers/terminal.py:51 msgid "" -"* You can individually configure the service address and port in the service" -" endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service " +"endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna " -"ページでは資産への接続時にDBクライアントの起動方法を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" +"
有効化した場合、Luna ページでは資産への接続時にDBクライアントの起動方法" +"を表示します。" #: settings/serializers/terminal.py:59 msgid "" -"* You can individually configure the service address and port in the service" -" endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service " +"endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna ページでは資産への接続時にrdp " -"ファイルのダウンロードボタンとRDPクライアントの起動方法を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" +"
有効化した場合、Luna ページでは資産への接続時にrdp ファイルのダウンロー" +"ドボタンとRDPクライアントの起動方法を表示します。" #: settings/serializers/terminal.py:66 msgid "Client connection" @@ -6631,11 +6804,11 @@ msgstr "クライアント接続" #: settings/serializers/terminal.py:68 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to " -"assets" +"Luna page will display the SSH client launch method when connecting to assets" msgstr "" -"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効化した場合、Luna " -"ページでは資産への接続時にSSHクライアントの起動方法を表示します。" +"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効" +"化した場合、Luna ページでは資産への接続時にSSHクライアントの起動方法を表示し" +"ます。" #: settings/serializers/tool.py:10 msgid "Tool" @@ -6647,9 +6820,11 @@ msgstr "ワークベンチのツール" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools" -" in the workbench" -msgstr "* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにします" +"*! If enabled, users with RBAC permissions will be able to utilize all tools " +"in the workbench" +msgstr "" +"* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにしま" +"す" #: settings/tasks/ldap.py:28 msgid "Periodic import ldap user" @@ -6791,7 +6966,9 @@ msgstr "インポート" #: templates/_csv_import_modal.html:12 msgid "Download the imported template or use the exported CSV file format" -msgstr "インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" +msgstr "" +"インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形" +"式を使用する" #: templates/_csv_import_modal.html:13 msgid "Download the import template" @@ -6807,7 +6984,9 @@ msgstr "ファイルを選択してください" #: templates/_csv_update_modal.html:12 msgid "Download the update template or use the exported CSV file format" -msgstr "更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" +msgstr "" +"更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用す" +"る" #: templates/_csv_update_modal.html:13 msgid "Download the update template" @@ -6848,7 +7027,8 @@ msgid "" " " msgstr "" "\n" -" アカウントが期限切れになったので、管理者に連絡してください。 " +" アカウントが期限切れになったので、管理者に連絡してくださ" +"い。 " #: templates/_message.html:13 msgid "Your account will at" @@ -6862,11 +7042,13 @@ msgstr "期限切れです。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" パスワードが期限切れになりましたので、クリックしてください リンク パスワードの更新\n" +" パスワードが期限切れになりましたので、クリックしてください " +" リンク パスワードの更新\n" " " #: templates/_message.html:30 @@ -6877,33 +7059,39 @@ msgstr "あなたのパスワードは" #, python-format msgid "" "\n" -" please click this link to update your password.\n" +" please click this " +"link to update your password.\n" " " msgstr "" "\n" -" クリックしてください リンク パスワードの更新\n" +" クリックしてください リンク パスワードの更新\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" +" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" +" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -6935,8 +7123,9 @@ msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" msgstr "" -"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起するために使用されており、現在はRDP " -"SSHクライアントのみをサポートしています。「Telnetは将来的にサポートする" +"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起す" +"るために使用されており、現在はRDP SSHクライアントのみをサポートしています。" +"「Telnetは将来的にサポートする" #: templates/resource_download.html:35 msgid "Microsoft" @@ -6950,7 +7139,9 @@ msgstr "公式" msgid "" "macOS needs to download the client to connect RDP asset, which comes with " "Windows" -msgstr "MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロードする必要があります" +msgstr "" +"MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロード" +"する必要があります" #: templates/resource_download.html:45 msgid "Windows Remote application publisher tools" @@ -6960,7 +7151,9 @@ msgstr "Windowsリモートアプリケーション発行者ツール" msgid "" "OpenSSH is a program used to connect remote applications in the Windows " "Remote Application Publisher" -msgstr "OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続するプログラムです" +msgstr "" +"OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続する" +"プログラムです" #: templates/resource_download.html:53 msgid "Offline video player" @@ -7382,8 +7575,7 @@ msgstr "セッション再生をダウンロードできます" msgid "Account ID" msgstr "アカウント ID" -#: terminal/models/session/session.py:37 -#: terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:118 msgid "Login from" msgstr "ログイン元" @@ -7432,8 +7624,8 @@ msgstr "アクションパーミッション" msgid "Origin" msgstr "ソース" -#: terminal/models/session/sharing.py:42 -#: terminal/models/session/sharing.py:100 terminal/notifications.py:261 +#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 +#: terminal/notifications.py:261 msgid "Session sharing" msgstr "セッション共有" @@ -7546,16 +7738,21 @@ msgstr "コア サービス アドレス" #: terminal/serializers/applet_host.py:40 msgid "" " \n" -" Tips: The application release machine communicates with the Core service. \n" -" If the release machine and the Core service are on the same network segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" +" Tips: The application release machine communicates with the Core " +"service. \n" +" If the release machine and the Core service are on the same network " +"segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in " +"the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリース マシンとコア サービスが同じネットワーク " -"セグメント上にある場合は、イントラネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト URL を入力します。
例: " -"https://172.16.10.110 または https://dev.jumpserver.com" +"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリー" +"ス マシンとコア サービスが同じネットワーク セグメント上にある場合は、イントラ" +"ネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト " +"URL を入力します。
例: https://172.16.10.110 または https://dev." +"jumpserver.com" #: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -7597,7 +7794,9 @@ msgstr "最大切断時間(ミリ秒)" msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時間を設定します(60000ミリ秒後にセッションをログオフ)。" +msgstr "" +"ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時" +"間を設定します(60000ミリ秒後にセッションをログオフ)。" #: terminal/serializers/applet_host.py:71 msgid "RDS Remote App Logoff Time Limit (ms)" @@ -7605,10 +7804,11 @@ msgstr "RDSリモートアプリケーションのログアウト時間制限( #: terminal/serializers/applet_host.py:73 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" -" programs (0 milliseconds, log off the session immediately)." +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " +"programs (0 milliseconds, log off the session immediately)." msgstr "" -"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ時間を設定します(0ミリ秒、セッションを即座にログオフ)。" +"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ" +"時間を設定します(0ミリ秒、セッションを即座にログオフ)。" #: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 @@ -7617,13 +7817,17 @@ msgstr "ロードステータス" #: terminal/serializers/applet_host.py:96 msgid "" -"These accounts are used to connect to the published application, the account" -" is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account " +"is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will" -" be used to connect" +"support multiple open and the special has been used, the public account will " +"be used to connect" msgstr "" -"これらのアカウントは、公開されたアプリケーションに接続するために使用されます。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公開されています。アプリケーションが複数のオープンをサポートしていない場合、および特別なものが使用されている場合、公開アカウントが使用されます。" +"これらのアカウントは、公開されたアプリケーションに接続するために使用されま" +"す。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専" +"用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公" +"開されています。アプリケーションが複数のオープンをサポートしていない場合、お" +"よび特別なものが使用されている場合、公開アカウントが使用されます。" #: terminal/serializers/applet_host.py:103 msgid "The number of public accounts created automatically" @@ -7635,8 +7839,9 @@ msgid "" "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項目 CACHE_LOGIN_PASSWORD_ENABLED=true " -"を設定してサービスを再起動して有効にしてください。" +"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項" +"目 CACHE_LOGIN_PASSWORD_ENABLED=true を設定してサービスを再起動して有効にして" +"ください。" #: terminal/serializers/applet_host.py:148 msgid "Install applets" @@ -7686,7 +7891,9 @@ msgstr "Oracle がリッスンするポート範囲" msgid "" "Oracle proxy server listen port is dynamic, Each additional Oracle database " "instance adds a port listener" -msgstr "Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データベースインスタンスはポートリスナーを追加します" +msgstr "" +"Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データ" +"ベースインスタンスはポートリスナーを追加します" #: terminal/serializers/endpoint.py:38 msgid "" @@ -7694,19 +7901,22 @@ msgid "" "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" msgstr "" -"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラウザのアクセス アドレスが使用されます " -"(デフォルトのエンドポイントではホストの変更は許可されません)。" +"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラ" +"ウザのアクセス アドレスが使用されます (デフォルトのエンドポイントではホストの" +"変更は許可されません)。" #: terminal/serializers/endpoint.py:64 msgid "" -"The assets within this IP range, the following endpoint will be used for the" -" connection" +"The assets within this IP range, the following endpoint will be used for the " +"connection" msgstr "このIP範囲内のアセットは、以下のエンドポイントを使用して接続されます" #: terminal/serializers/endpoint.py:65 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" -msgstr "異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用して実装します" +msgstr "" +"異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用" +"して実装します" #: terminal/serializers/endpoint.py:69 msgid "Asset IP" @@ -7803,8 +8013,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www.jumpserver.a.com:9100, " -"http://www.jumpserver.b.com:9100)" +"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www." +"jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -7835,7 +8045,9 @@ msgid "" "set as the default storage, will make new Component use the current storage " "by default, without affecting existing Component" msgstr "" -"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレージをデフォルトで使用するようになりますが、既存のコンポーネントには影響しません" +"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレー" +"ジをデフォルトで使用するようになりますが、既存のコンポーネントには影響しませ" +"ん" #: terminal/serializers/task.py:9 msgid "Session id" @@ -8009,13 +8221,16 @@ msgid "" "administrator to open more ports." msgstr "" "利用可能なポートと一致しません。データベースの数が、データベース プロキシ " -"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開くには、管理者に連絡してください。" +"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開" +"くには、管理者に連絡してください。" #: terminal/utils/db_port_mapper.py:116 msgid "" -"No ports can be used, check and modify the limit on the number of ports that" -" Magnus listens on in the configuration file." -msgstr "使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の制限を確認して変更してください. " +"No ports can be used, check and modify the limit on the number of ports that " +"Magnus listens on in the configuration file." +msgstr "" +"使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の" +"制限を確認して変更してください. " #: terminal/utils/db_port_mapper.py:118 msgid "All available port count: {}, Already use port count: {}" @@ -8077,7 +8292,9 @@ msgstr "チケットはすでに閉じています" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: {}" +msgstr "" +"チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: " +"{}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -8311,7 +8528,9 @@ msgstr "承認" #: tickets/views/approve.py:44 msgid "" "This ticket does not exist, the process has ended, or this link has expired" -msgstr "このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効になっています" +msgstr "" +"このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効に" +"なっています" #: tickets/views/approve.py:72 msgid "Click the button below to approve or reject" @@ -8427,7 +8646,8 @@ msgid "" "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" msgstr "" -"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入ります。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" +"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入りま" +"す。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" #: users/forms/profile.py:59 msgid "* Enable MFA to make the account more secure." @@ -8435,11 +8655,12 @@ msgstr "* アカウントをより安全にするためにMFAを有効にしま #: users/forms/profile.py:68 msgid "" -"In order to protect you and your company, please keep your account, password" -" and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password " +"and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" msgstr "" -"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" +"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報" +"を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" #: users/forms/profile.py:82 users/serializers/preference/lina.py:21 msgid "New password" @@ -8592,10 +8813,12 @@ msgstr "ターミナルテーマ名" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files," -" account password change results files" +"sends emails containing file attachments.
Such as: account backup files, " +"account password change results files" msgstr "" -"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含まれている場合、このパスワードで解読します。
例:アカウントのバックアップファイル、アカウントのパスワード変更結果ファイル" +"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含" +"まれている場合、このパスワードで解読します。
例:アカウントのバックアップ" +"ファイル、アカウントのパスワード変更結果ファイル" #: users/serializers/preference/lina.py:39 users/serializers/profile.py:48 msgid "The newly set password is inconsistent" @@ -8643,7 +8866,9 @@ msgid "" "remote computer to fit the window size of the client computer when the " "window is resized." msgstr "" -"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコンピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように拡大または縮小するかどうかを決定します。" +"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコン" +"ピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように" +"拡大または縮小するかどうかを決定します。" # msgid "" # "Determines whether the client computer should scale the content on the " @@ -8695,9 +8920,10 @@ msgstr "システムの役割" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across" -" all organizations" -msgstr "システムロールはシステムレベルのロールであり、すべての組織で有効になります" +"System roles are roles at the system level, and they will take effect across " +"all organizations" +msgstr "" +"システムロールはシステムレベルのロールであり、すべての組織で有効になります" #: users/serializers/user.py:61 msgid "Org roles" @@ -8767,7 +8993,9 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザを制限することができます。" +"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。" +"セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザ" +"を制限することができます。" #: users/serializers/user.py:266 msgid "Superuser" @@ -8791,9 +9019,10 @@ msgstr "認証" #: users/serializers/user.py:426 msgid "" -"* For security, only a partial of users is displayed. You can search for " -"more" -msgstr "* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを検索することができます" +"* For security, only a partial of users is displayed. You can search for more" +msgstr "" +"* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを" +"検索することができます" #: users/serializers/user.py:461 msgid "name not unique" @@ -8802,8 +9031,11 @@ msgstr "名前が一意ではない" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the administrator." -msgstr "管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザーはユーザーリストにありません。管理者に連絡してください。" +" and the current user is not in the user list. Please contact the " +"administrator." +msgstr "" +"管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザー" +"はユーザーリストにありません。管理者に連絡してください。" #: users/signal_handlers.py:193 msgid "Clean up expired user sessions" @@ -8841,7 +9073,8 @@ msgstr "アカウントの有効期限は" msgid "" "In order not to affect your normal work, please contact the administrator " "for confirmation." -msgstr "通常の作業に影響を与えないように、確認のために管理者に連絡してください。" +msgstr "" +"通常の作業に影響を与えないように、確認のために管理者に連絡してください。" #: users/templates/users/_msg_password_expire_reminder.html:7 msgid "Your password will expire in" @@ -8851,7 +9084,9 @@ msgstr "パスワードは" msgid "" "For your account security, please click on the link below to update your " "password in time" -msgstr "アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間内に更新してください" +msgstr "" +"アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間" +"内に更新してください" #: users/templates/users/_msg_password_expire_reminder.html:11 msgid "Click here update password" @@ -8859,7 +9094,8 @@ msgstr "ここをクリック更新パスワード" #: users/templates/users/_msg_password_expire_reminder.html:16 msgid "If your password has expired, please click the link below to" -msgstr "パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" +msgstr "" +"パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" #: users/templates/users/_msg_reset_mfa.html:7 msgid "Your MFA has been reset by site administrator" @@ -8959,9 +9195,11 @@ msgstr "ワンタイムパスワード認証子のバインド" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a " -"6-bit verification code" -msgstr "MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コードでスキャンします。" +"Use the MFA Authenticator application to scan the following qr code for a 6-" +"bit verification code" +msgstr "" +"MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コード" +"でスキャンします。" #: users/templates/users/user_otp_enable_bind.html:22 #: users/templates/users/user_verify_mfa.html:27 @@ -8976,7 +9214,9 @@ msgstr "アプリのインストール" msgid "" "Download and install the MFA Authenticator application on your phone or " "applet of WeChat" -msgstr "携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウンロードしてインストールします" +msgstr "" +"携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウン" +"ロードしてインストールします" #: users/templates/users/user_otp_enable_install_app.html:18 msgid "Android downloads" @@ -8990,7 +9230,9 @@ msgstr "IPhoneのダウンロード" msgid "" "After installation, click the next step to enter the binding page (if " "installed, go to the next step directly)." -msgstr "インストール後、次のステップをクリックしてバインディングページに入ります (インストールされている場合は、次のステップに直接進みます)。" +msgstr "" +"インストール後、次のステップをクリックしてバインディングページに入ります (イ" +"ンストールされている場合は、次のステップに直接進みます)。" #: users/templates/users/user_password_verify.html:8 #: users/templates/users/user_password_verify.html:9 @@ -9005,7 +9247,8 @@ msgstr "認証" msgid "" "The account protection has been opened, please complete the following " "operations according to the prompts" -msgstr "アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" +msgstr "" +"アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" #: users/templates/users/user_verify_mfa.html:17 msgid "Open MFA Authenticator and enter the 6-bit dynamic code" @@ -9017,7 +9260,8 @@ msgstr "すでにバインド済み" #: users/views/profile/otp.py:107 msgid "MFA already bound, disable first, then bound" -msgstr "MFAはすでにバインドされており、最初に無効にしてからバインドされています。" +msgstr "" +"MFAはすでにバインドされており、最初に無効にしてからバインドされています。" #: users/views/profile/otp.py:134 msgid "OTP enable success" @@ -9045,9 +9289,11 @@ msgstr "パスワード無効" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change" -" their passwords: {}" -msgstr "ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが許可され、パスワードの変更はサポートされていません: {}" +"Non-local users can log in only from third-party platforms and cannot change " +"their passwords: {}" +msgstr "" +"ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが" +"許可され、パスワードの変更はサポートされていません: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 msgid "Token invalid or expired" @@ -9279,7 +9525,9 @@ msgstr "インスタンス \"%s\" の同期に失敗しました" msgid "" "The updated platform of asset \"%s\" is inconsistent with the original " "platform type. Skip platform and protocol updates" -msgstr "更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プラットフォームとプロトコルの更新をスキップ" +msgstr "" +"更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プ" +"ラットフォームとプロトコルの更新をスキップ" #: xpack/plugins/cloud/manager.py:392 #, python-format @@ -9410,8 +9658,7 @@ msgstr "インスタンス" msgid "Sync instance detail" msgstr "同期インスタンスの詳細" -#: xpack/plugins/cloud/models.py:311 -#: xpack/plugins/cloud/serializers/task.py:77 +#: xpack/plugins/cloud/models.py:311 xpack/plugins/cloud/serializers/task.py:77 msgid "Rule relation" msgstr "条件関係" @@ -9467,8 +9714,7 @@ msgstr "ルール一致" msgid "Rule value" msgstr "ルール値" -#: xpack/plugins/cloud/models.py:381 -#: xpack/plugins/cloud/serializers/task.py:80 +#: xpack/plugins/cloud/models.py:381 xpack/plugins/cloud/serializers/task.py:80 msgid "Strategy rule" msgstr "戦略ルール" @@ -9484,8 +9730,7 @@ msgstr "アクション属性" msgid "Action value" msgstr "アクション値" -#: xpack/plugins/cloud/models.py:407 -#: xpack/plugins/cloud/serializers/task.py:83 +#: xpack/plugins/cloud/models.py:407 xpack/plugins/cloud/serializers/task.py:83 msgid "Strategy action" msgstr "戦略アクション" @@ -9763,8 +10008,9 @@ msgid "" "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." msgstr "" -"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが実行されると、有効な IP アドレスのみが同期されます。 " -"
ポートが0の場合、すべてのIPアドレスが有効です。" +"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが" +"実行されると、有効な IP アドレスのみが同期されます。
ポートが0の場合、す" +"べてのIPアドレスが有効です。" #: xpack/plugins/cloud/serializers/account_attrs.py:190 msgid "Hostname prefix" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 50dde09ba..70a8f1601 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -365,7 +365,7 @@ msgstr "资产" msgid "Su from" msgstr "切换自" -#: accounts/models/account.py:55 assets/const/protocol.py:189 +#: accounts/models/account.py:55 assets/const/protocol.py:195 #: settings/serializers/auth/cas.py:25 terminal/models/applet/applet.py:36 #: terminal/models/virtualapp/virtualapp.py:21 msgid "Version" @@ -1709,7 +1709,7 @@ msgstr "禁用" msgid "Basic" msgstr "基本" -#: assets/const/base.py:34 assets/const/protocol.py:292 +#: assets/const/base.py:34 assets/const/protocol.py:298 #: assets/models/asset/web.py:13 msgid "Script" msgstr "脚本" @@ -1781,17 +1781,21 @@ msgstr "其它" #: assets/const/protocol.py:46 msgid "Old SSH version" -msgstr "Old SSH version" +msgstr "旧 SSH 版本" #: assets/const/protocol.py:47 msgid "Old SSH version like openssh 5.x or 6.x" msgstr "旧的 SSH 版本,例如 openssh 5.x 或 6.x" -#: assets/const/protocol.py:58 +#: assets/const/protocol.py:53 +msgid "Netcat help text" +msgstr "使用 netcat (nc) 作为代理工具,将连接从代理服务器转发到目标主机。适用于不支持 SSH 原生代理选项 (-W) 的环境,或需要更多灵活性和超时控制的场景。" + +#: assets/const/protocol.py:64 msgid "SFTP root" msgstr "SFTP 根路径" -#: assets/const/protocol.py:60 +#: assets/const/protocol.py:66 #, python-brace-format msgid "" "SFTP root directory, Support variable:
- ${ACCOUNT} The connected " @@ -1801,24 +1805,24 @@ msgstr "" "SFTP根目录,支持变量:
-${ACCOUNT}已连接帐户用户名
-${HOME}连接帐户的主" "目录
-${USER}用户的用户名" -#: assets/const/protocol.py:75 +#: assets/const/protocol.py:81 msgid "Console" msgstr "控制台" -#: assets/const/protocol.py:76 +#: assets/const/protocol.py:82 msgid "Connect to console session" msgstr "连接到控制台会话" -#: assets/const/protocol.py:80 +#: assets/const/protocol.py:86 msgid "Any" msgstr "任意" -#: assets/const/protocol.py:82 rbac/tree.py:62 +#: assets/const/protocol.py:88 rbac/tree.py:62 #: settings/serializers/security.py:232 msgid "Security" msgstr "安全" -#: assets/const/protocol.py:83 +#: assets/const/protocol.py:89 msgid "" "Security layer to use for the connection:
Any
Automatically select the " "security mode based on the security protocols supported by both the client " @@ -1833,101 +1837,101 @@ msgstr "" "Windows 登录屏幕的情况
TLS
通过 TLS 实现的 RDP 认证和加密
NLA
该" "模式使用 TLS 加密,并要求提前提供用户名和密码" -#: assets/const/protocol.py:100 +#: assets/const/protocol.py:106 msgid "AD domain" msgstr "AD 网域" -#: assets/const/protocol.py:115 +#: assets/const/protocol.py:121 msgid "Username prompt" msgstr "用户名提示" -#: assets/const/protocol.py:116 +#: assets/const/protocol.py:122 msgid "We will send username when we see this prompt" msgstr "当我们看到这个提示时,我们将发送用户名" -#: assets/const/protocol.py:121 +#: assets/const/protocol.py:127 msgid "Password prompt" msgstr "密码提示" -#: assets/const/protocol.py:122 +#: assets/const/protocol.py:128 msgid "We will send password when we see this prompt" msgstr "当我们看到这个提示时,我们将发送密码" -#: assets/const/protocol.py:127 +#: assets/const/protocol.py:133 msgid "Success prompt" msgstr "成功提示" -#: assets/const/protocol.py:128 +#: assets/const/protocol.py:134 msgid "We will consider login success when we see this prompt" msgstr "当我们看到这个提示时,我们将认为登录成功" -#: assets/const/protocol.py:139 assets/models/asset/database.py:10 +#: assets/const/protocol.py:145 assets/models/asset/database.py:10 #: settings/serializers/msg.py:49 msgid "Use SSL" msgstr "使用 SSL" -#: assets/const/protocol.py:174 +#: assets/const/protocol.py:180 msgid "SYSDBA" msgstr "SYSDBA" -#: assets/const/protocol.py:175 +#: assets/const/protocol.py:181 msgid "Connect as SYSDBA" msgstr "以 SYSDBA 角色连接" -#: assets/const/protocol.py:190 +#: assets/const/protocol.py:196 msgid "" "SQL Server version, Different versions have different connection drivers" msgstr "SQL Server 版本,不同版本有不同的连接驱动" -#: assets/const/protocol.py:220 +#: assets/const/protocol.py:226 msgid "Auth source" msgstr "认证数据库" -#: assets/const/protocol.py:221 +#: assets/const/protocol.py:227 msgid "The database to authenticate against" msgstr "要进行身份验证的数据库" -#: assets/const/protocol.py:226 authentication/models/connection_token.py:43 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:43 msgid "Connect options" msgstr "连接项" -#: assets/const/protocol.py:227 +#: assets/const/protocol.py:233 msgid "The connection specific options eg. retryWrites=false&retryReads=false" msgstr "连接特定选项,例如 retryWrites=false&retryReads=false" -#: assets/const/protocol.py:239 +#: assets/const/protocol.py:245 msgid "Auth username" msgstr "使用用户名认证" -#: assets/const/protocol.py:262 +#: assets/const/protocol.py:268 msgid "Safe mode" msgstr "安全模式" -#: assets/const/protocol.py:264 +#: assets/const/protocol.py:270 msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." msgstr "" "当安全模式启用时,一些操作将被禁用,例如:新建标签页、右键、访问其它网站 等" -#: assets/const/protocol.py:269 assets/models/asset/web.py:9 +#: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 msgid "Autofill" msgstr "自动代填" -#: assets/const/protocol.py:277 assets/models/asset/web.py:10 +#: assets/const/protocol.py:283 assets/models/asset/web.py:10 msgid "Username selector" msgstr "用户名选择器" -#: assets/const/protocol.py:282 assets/models/asset/web.py:11 +#: assets/const/protocol.py:288 assets/models/asset/web.py:11 msgid "Password selector" msgstr "密码选择器" -#: assets/const/protocol.py:287 assets/models/asset/web.py:12 +#: assets/const/protocol.py:293 assets/models/asset/web.py:12 msgid "Submit selector" msgstr "确认按钮选择器" -#: assets/const/protocol.py:310 +#: assets/const/protocol.py:316 msgid "API mode" msgstr "API 模式" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 8fa1a7993..36c3ac3dd 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 14:22+0800\n" +"POT-Creation-Date: 2024-09-09 16:05+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -16,7 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.3\n" -"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://zhconvert.org\n" +"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://" +"zhconvert.org\n" #: accounts/api/automations/base.py:79 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" @@ -187,8 +188,7 @@ msgstr "收集" msgid "Template" msgstr "模板" -#: accounts/const/account.py:32 ops/const.py:46 -#: xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "跳過" @@ -367,7 +367,7 @@ msgstr "資產" msgid "Su from" msgstr "切換自" -#: accounts/models/account.py:55 assets/const/protocol.py:189 +#: accounts/models/account.py:55 assets/const/protocol.py:195 #: settings/serializers/auth/cas.py:25 terminal/models/applet/applet.py:36 #: terminal/models/virtualapp/virtualapp.py:21 msgid "Version" @@ -391,8 +391,8 @@ msgstr "來源 ID" #: assets/serializers/gateway.py:33 audits/models.py:59 #: authentication/api/connection_token.py:411 ops/models/base.py:18 #: perms/models/asset_permission.py:75 settings/serializers/msg.py:33 -#: terminal/backends/command/models.py:18 -#: terminal/models/session/session.py:34 terminal/serializers/command.py:72 +#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 +#: terminal/serializers/command.py:72 #: terminal/templates/terminal/_msg_command_warning.html:8 #: terminal/templates/terminal/_msg_session_sharing.html:8 #: tickets/models/ticket/command_confirm.py:13 @@ -715,11 +715,9 @@ msgstr "密碼規則" #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 -#: terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 -#: terminal/models/component/storage.py:26 -#: terminal/models/component/task.py:13 +#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:85 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -794,7 +792,8 @@ msgstr "登錄資產時,帳號使用者名稱與使用者使用者名稱相同 msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" +msgstr "" +"連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -811,7 +810,9 @@ msgid "" "{} - The account backup passage task has been completed: the encryption " "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" -msgstr "{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中設置文件加密密碼" +msgstr "" +"{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中" +"設置文件加密密碼" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -828,7 +829,9 @@ msgid "" "{} - The encryption change task has been completed: the encryption password " "has not been set - please go to personal information -> set encryption " "password in preferences" -msgstr "{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密碼" +msgstr "" +"{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密" +"碼" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -866,9 +869,9 @@ msgstr "類別" #: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 -#: authentication/serializers/connect_token_secret.py:126 -#: ops/models/job.py:150 perms/serializers/user_permission.py:27 -#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 +#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 +#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 +#: terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -940,10 +943,9 @@ msgstr "ID" #: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 -#: audits/models.py:54 audits/models.py:90 audits/models.py:172 -#: audits/models.py:271 audits/serializers.py:171 -#: authentication/models/connection_token.py:32 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 +#: audits/models.py:90 audits/models.py:172 audits/models.py:271 +#: audits/serializers.py:171 authentication/models/connection_token.py:32 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 @@ -992,7 +994,9 @@ msgstr "密鑰密碼" msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." -msgstr "提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 username@domain" +msgstr "" +"提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 " +"username@domain" #: accounts/serializers/account/template.py:13 msgid "Password length" @@ -1035,11 +1039,11 @@ msgid "" msgstr "關聯平台,可配置推送參數,如果不關聯,將使用默認參數" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 -#: ops/models/adhoc.py:26 ops/models/job.py:158 ops/models/playbook.py:31 -#: rbac/models/role.py:37 settings/models.py:40 -#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:332 -#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:25 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 +#: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 +#: settings/models.py:40 terminal/models/applet/applet.py:46 +#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 +#: terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 @@ -1054,13 +1058,13 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號密碼 > 登錄密碼 > 手動輸入
" -"為了安全起見,請設置配置項 CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" +"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號" +"密碼 > 登錄密碼 > 手動輸入
為了安全起見,請設置配置項 " +"CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" #: accounts/serializers/automations/base.py:23 #: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172 -#: assets/serializers/automations/base.py:21 -#: perms/serializers/permission.py:47 +#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47 msgid "Nodes" msgstr "節點" @@ -1135,7 +1139,10 @@ msgstr "週期清理改密記錄和推送記錄" #: accounts/tasks/automation.py:87 msgid "Clean change secret and push record period description" msgstr "" -"系統會定期清理不必要的變更密文記錄和推播記錄,包括與變更任務、執行記錄、資產、帳戶相關的記錄。當任何這些關聯項被刪除時,相應的變更秘密和推送記錄將變得無效。因此,為了保持資料庫整潔、高效,系統預設每180天自動清理一次這些無效記錄。這種定期清理過程有助於釋放儲存空間並提高資料管理的安全性和整體效能。" +"系統會定期清理不必要的變更密文記錄和推播記錄,包括與變更任務、執行記錄、資" +"產、帳戶相關的記錄。當任何這些關聯項被刪除時,相應的變更秘密和推送記錄將變得" +"無效。因此,為了保持資料庫整潔、高效,系統預設每180天自動清理一次這些無效記" +"錄。這種定期清理過程有助於釋放儲存空間並提高資料管理的安全性和整體效能。" #: accounts/tasks/backup_account.py:25 msgid "Execute account backup plan" @@ -1202,8 +1209,8 @@ msgstr "你好! 以下是資產改密或推送帳戶失敗的情況。 請及 #: accounts/utils.py:52 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not" -" allowed." +"If the password starts with {{` and ends with }} `, then the password is not " +"allowed." msgstr "如果密碼以 `{{` 開始,並且以 `}}` 結束,則該密碼是不允許的。" #: accounts/utils.py:59 @@ -1374,8 +1381,8 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " -"2001:db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" +"db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1403,8 +1410,8 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " -"2001:db8:2de::e13, 2001:db8:1a:1110::/64" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" +"db8:2de::e13, 2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 @@ -1443,7 +1450,9 @@ msgid "" "Please review the login activity to ensure the security and proper usage of " "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." -msgstr "請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任何可疑行為,請立即採取必要的行動。" +msgstr "" +"請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任" +"何可疑行為,請立即採取必要的行動。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -1589,7 +1598,7 @@ msgstr "禁用" msgid "Basic" msgstr "基本" -#: assets/const/base.py:34 assets/const/protocol.py:292 +#: assets/const/base.py:34 assets/const/protocol.py:298 #: assets/models/asset/web.py:13 msgid "Script" msgstr "腳本" @@ -1661,150 +1670,157 @@ msgstr "其它" #: assets/const/protocol.py:46 msgid "Old SSH version" -msgstr "Old SSH version" +msgstr "舊的 SSH 版本" #: assets/const/protocol.py:47 msgid "Old SSH version like openssh 5.x or 6.x" msgstr "舊的 SSH 版本,例如 openssh 5.x 或 6.x" -#: assets/const/protocol.py:58 +#: assets/const/protocol.py:53 +msgid "Netcat help text" +msgstr "使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支援 SSH 原生代理選項 (-W) 的環境,或需要更多靈活性和逾時控制的場景。" + +#: assets/const/protocol.py:64 msgid "SFTP root" msgstr "SFTP 根路徑" -#: assets/const/protocol.py:60 +#: assets/const/protocol.py:66 #, python-brace-format msgid "" "SFTP root directory, Support variable:
- ${ACCOUNT} The connected " "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶的主目錄
-${USER}用戶的使用者名稱" +"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶" +"的主目錄
-${USER}用戶的使用者名稱" -#: assets/const/protocol.py:75 +#: assets/const/protocol.py:81 msgid "Console" msgstr "控制台" -#: assets/const/protocol.py:76 +#: assets/const/protocol.py:82 msgid "Connect to console session" msgstr "連接到控制台會話" -#: assets/const/protocol.py:80 +#: assets/const/protocol.py:86 msgid "Any" msgstr "任意" -#: assets/const/protocol.py:82 rbac/tree.py:62 +#: assets/const/protocol.py:88 rbac/tree.py:62 #: settings/serializers/security.py:232 msgid "Security" msgstr "安全" -#: assets/const/protocol.py:83 +#: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the" -" security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the " +"security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 " -"Windows 伺服器或需要標準 Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP " -"認證和加密
NLA
此模式使用 TLS 加密,並要求提前提供用戶名和密碼
" +"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式" +"
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 Windows 伺服器或需要標準 " +"Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP 認證和加密
NLA
此" +"模式使用 TLS 加密,並要求提前提供用戶名和密碼
" -#: assets/const/protocol.py:100 +#: assets/const/protocol.py:106 msgid "AD domain" msgstr "AD 網域" -#: assets/const/protocol.py:115 +#: assets/const/protocol.py:121 msgid "Username prompt" msgstr "使用者名稱提示" -#: assets/const/protocol.py:116 +#: assets/const/protocol.py:122 msgid "We will send username when we see this prompt" msgstr "當我們看到這個提示時,我們將發送使用者名稱" -#: assets/const/protocol.py:121 +#: assets/const/protocol.py:127 msgid "Password prompt" msgstr "密碼提示" -#: assets/const/protocol.py:122 +#: assets/const/protocol.py:128 msgid "We will send password when we see this prompt" msgstr "當我們看到這個提示時,我們將發送密碼" -#: assets/const/protocol.py:127 +#: assets/const/protocol.py:133 msgid "Success prompt" msgstr "成功提示" -#: assets/const/protocol.py:128 +#: assets/const/protocol.py:134 msgid "We will consider login success when we see this prompt" msgstr "當我們看到這個提示時,我們將認為登錄成功" -#: assets/const/protocol.py:139 assets/models/asset/database.py:10 +#: assets/const/protocol.py:145 assets/models/asset/database.py:10 #: settings/serializers/msg.py:49 msgid "Use SSL" msgstr "使用 SSL" -#: assets/const/protocol.py:174 +#: assets/const/protocol.py:180 msgid "SYSDBA" msgstr "SYSDBA" -#: assets/const/protocol.py:175 +#: assets/const/protocol.py:181 msgid "Connect as SYSDBA" msgstr "以 SYSDBA 角色連接" -#: assets/const/protocol.py:190 +#: assets/const/protocol.py:196 msgid "" "SQL Server version, Different versions have different connection drivers" msgstr "SQL Server 版本,不同版本有不同的連接驅動" -#: assets/const/protocol.py:220 +#: assets/const/protocol.py:226 msgid "Auth source" msgstr "認證資料庫" -#: assets/const/protocol.py:221 +#: assets/const/protocol.py:227 msgid "The database to authenticate against" msgstr "要進行身份驗證的資料庫" -#: assets/const/protocol.py:226 authentication/models/connection_token.py:43 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:43 msgid "Connect options" msgstr "連接項" -#: assets/const/protocol.py:227 +#: assets/const/protocol.py:233 msgid "The connection specific options eg. retryWrites=false&retryReads=false" msgstr "連接特定選項,例如。重試寫入=假&重試讀取=假" -#: assets/const/protocol.py:239 +#: assets/const/protocol.py:245 msgid "Auth username" msgstr "使用使用者名稱認證" -#: assets/const/protocol.py:262 +#: assets/const/protocol.py:268 msgid "Safe mode" msgstr "安全模式" -#: assets/const/protocol.py:264 +#: assets/const/protocol.py:270 msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" +msgstr "" +"當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" -#: assets/const/protocol.py:269 assets/models/asset/web.py:9 +#: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 msgid "Autofill" msgstr "自動代填" -#: assets/const/protocol.py:277 assets/models/asset/web.py:10 +#: assets/const/protocol.py:283 assets/models/asset/web.py:10 msgid "Username selector" msgstr "使用者名稱選擇器" -#: assets/const/protocol.py:282 assets/models/asset/web.py:11 +#: assets/const/protocol.py:288 assets/models/asset/web.py:11 msgid "Password selector" msgstr "密碼選擇器" -#: assets/const/protocol.py:287 assets/models/asset/web.py:12 +#: assets/const/protocol.py:293 assets/models/asset/web.py:12 msgid "Submit selector" msgstr "確認按鈕選擇器" -#: assets/const/protocol.py:310 +#: assets/const/protocol.py:316 msgid "API mode" msgstr "API 模式" @@ -2205,7 +2221,9 @@ msgstr "協定,格式為 名稱/連接埠" msgid "" "Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " "\"secret_type\": \"password\"}]" -msgstr "帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"password\"}]" +msgstr "" +"帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" #: assets/serializers/asset/common.py:135 msgid "" @@ -2254,9 +2272,11 @@ msgstr "默認資料庫" #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an" -" HTTP proxy. e.g. http(s)://host:port" -msgstr "如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an " +"HTTP proxy. e.g. http(s)://host:port" +msgstr "" +"如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://" +"host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2432,7 +2452,9 @@ msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " "root" -msgstr "在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切換到 root 一樣" +msgstr "" +"在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切" +"換到 root 一樣" #: assets/serializers/platform.py:205 msgid "Assets can be connected using a zone gateway" @@ -2480,8 +2502,7 @@ msgstr "檢查節點下資產數量" #: assets/tasks/nodes_amount.py:28 msgid "" -"The task of self-checking is already running and cannot be started " -"repeatedly" +"The task of self-checking is already running and cannot be started repeatedly" msgstr "自檢程序已經在運行,不能重複啟動" #: assets/tasks/nodes_amount.py:33 @@ -2522,8 +2543,7 @@ msgid "App Audits" msgstr "日志审计" #: audits/backends/db.py:17 -msgid "" -"The text content is too long. Use Elasticsearch to store operation logs" +msgid "The text content is too long. Use Elasticsearch to store operation logs" msgstr "文字內容太長。請使用 Elasticsearch 儲存操作日誌" #: audits/backends/db.py:108 @@ -2616,8 +2636,8 @@ msgstr "結束" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174 -#: terminal/models/virtualapp/provider.py:14 -#: terminal/serializers/session.py:55 terminal/serializers/session.py:78 +#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 +#: terminal/serializers/session.py:78 msgid "Terminal" msgstr "終端" @@ -2656,8 +2676,7 @@ msgid "Job audit log" msgstr "作業審計日誌" #: audits/models.py:56 audits/models.py:100 audits/models.py:175 -#: terminal/models/session/session.py:39 -#: terminal/models/session/sharing.py:113 +#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:113 msgid "Remote addr" msgstr "遠端地址" @@ -2989,8 +3008,7 @@ msgstr "附加" #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:26 -#: authentication/models/private_token.py:8 -#: authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後使用日期" @@ -3065,7 +3083,8 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳號將被臨時 鎖定 {block_time} 分鐘)" +"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳" +"號將被臨時 鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" @@ -3082,9 +3101,10 @@ msgstr "IP 已被鎖定 (請聯絡管理員解鎖或 {} 分鐘後重試)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily" -" locked for {block_time} minutes)" -msgstr "{error},您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" +"{error}, You can also try {times_try} times (The account will be temporarily " +"locked for {block_time} minutes)" +msgstr "" +"{error},您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3492,8 +3512,8 @@ msgstr "創建類型" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be" -" downloaded once" +"Please download the private key after creation. Each private key can only be " +"downloaded once" msgstr "創建完成後請下載私鑰,每個私鑰僅有一次下載機會" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 @@ -3851,9 +3871,10 @@ msgstr "退出登錄成功,返回到登入頁面" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client." -" If you need to open it in the client, please log in again" -msgstr "為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" +"For your safety, automatic redirection login is not supported on the client. " +"If you need to open it in the client, please log in again" +msgstr "" +"為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" #: authentication/views/slack.py:35 authentication/views/slack.py:118 msgid "Slack Error" @@ -3959,12 +3980,13 @@ msgstr "加密的欄位" #: common/db/fields.py:577 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" -" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " +"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 {'type': " -"'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': '1.1.1.1'}}" +"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 " +"{'type': 'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': " +"'1.1.1.1'}}" #: common/db/fields.py:584 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4077,10 +4099,12 @@ msgstr "關聯項,格式是 id" msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" -msgstr "多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的" +msgstr "" +"多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的" #: common/drf/renders/base.py:170 -msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "標籤,格式: [\"鍵:值\", ...], 如果標籤不存在,將創建它" #: common/drf/renders/base.py:172 @@ -4314,8 +4338,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Luna是單獨部署的一個程序,你需要部署luna,koko, " -"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Luna是單獨部署的一個程序,你需要部署luna,koko,
如果你看到了" +"這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" @@ -4327,8 +4351,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發, " -"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發,
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: labels/apps.py:8 msgid "App Labels" @@ -4877,8 +4901,7 @@ msgstr "請選擇一個組織後再保存" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:52 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 -#: tickets/serializers/ticket/ticket.py:60 +#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 msgid "Organization" msgstr "組織" @@ -5041,7 +5064,9 @@ msgstr "組織 ({}) 的資產授權" msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" -msgstr "帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, @USER, @ANON, @INPUT" +msgstr "" +"帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, " +"@USER, @ANON, @INPUT" #: perms/serializers/permission.py:38 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -5468,7 +5493,9 @@ msgid "" "authentication service platform does not return the user's email " "information, the system will automatically create the user using this email " "suffix" -msgstr "第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系統將自動以此電子信箱後綴建立使用者" +msgstr "" +"第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系" +"統將自動以此電子信箱後綴建立使用者" #: settings/serializers/auth/base.py:36 msgid "Forgot Password URL" @@ -5487,13 +5514,16 @@ msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前是否顯示 Flash 頁面" +msgstr "" +"Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前" +"是否顯示 Flash 頁面" #: settings/serializers/auth/base.py:54 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" +msgstr "" +"建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" @@ -5525,8 +5555,7 @@ msgstr "使用者名稱屬性" msgid "Enable attributes map" msgstr "啟用屬性映射" -#: settings/serializers/auth/cas.py:34 -#: settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 #: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 #: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 @@ -5538,7 +5567,9 @@ msgstr "映射屬性" msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer " +"使用者屬性名稱" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -5558,13 +5589,17 @@ msgstr "啟用釘釘認證" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使" +"用者屬性名稱" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使" +"用者屬性名稱" #: settings/serializers/auth/lark.py:13 users/models/user/_source.py:21 msgid "Lark" @@ -5574,7 +5609,9 @@ msgstr "" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務" +"使用者屬性名稱" #: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" @@ -5619,7 +5656,9 @@ msgstr "可能的選項是(cn或uid或sAMAccountName=%(user)s)" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務" +"使用者屬性名稱" #: settings/serializers/auth/ldap.py:84 msgid "Connect timeout (s)" @@ -5636,7 +5675,8 @@ msgid "" "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存" +"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果" +"用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存" #: settings/serializers/auth/ldap.py:97 msgid "Search paged size (piece)" @@ -5687,18 +5727,19 @@ msgid "End session endpoint" msgstr "Logout session endpoint address" #: settings/serializers/auth/oauth2.py:57 -msgid "" -"When the user signs out, they also be logged out from the OAuth2 server" +msgid "When the user signs out, they also be logged out from the OAuth2 server" msgstr "當使用者退出時,他們也會從 OAuth2 伺服器退出" #: settings/serializers/auth/oauth2.py:62 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服" +"務使用者屬性名稱" -#: settings/serializers/auth/oauth2.py:67 -#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 +#: settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "總是更新用戶資訊" @@ -5730,7 +5771,9 @@ msgstr "Ignore SSL certificate verification" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" -msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務使用者屬性名稱" +msgstr "" +"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務" +"使用者屬性名稱" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -5748,7 +5791,8 @@ msgstr "使用 Keycloak" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" +msgstr "" +"使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -5807,7 +5851,8 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" +"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 " +"DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -5823,8 +5868,7 @@ msgid "OTP in RADIUS" msgstr "Use Radius OTP" #: settings/serializers/auth/radius.py:24 -msgid "" -"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" msgstr "* 在 RADIUS 中使用 OTP 意味著使用者可以利用 RADIUS 作為 MFA 的方法 " #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 @@ -5855,7 +5899,9 @@ msgstr "SP 證書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr " 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" +msgstr "" +" 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 " +"JumpServer 使用者屬性名稱" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -5865,7 +5911,9 @@ msgstr "當使用者登出時,他們也會從 SAML2 伺服器登出" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服" +"務使用者屬性名稱" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -5930,10 +5978,12 @@ msgstr "業務型態(Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed" -" 67 words. For example, your verification code is {code}, which is valid for" -" 5 minutes. Please do not disclose it to others." -msgstr "模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 {code}, 有效期為5分鐘。請不要洩露給其他人。" +"Template need contain {code} and Signature + template length does not exceed " +"67 words. For example, your verification code is {code}, which is valid for " +"5 minutes. Please do not disclose it to others." +msgstr "" +"模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 " +"{code}, 有效期為5分鐘。請不要洩露給其他人。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -5969,7 +6019,9 @@ msgstr "單位: 秒" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" -msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服務使用者屬性名稱" +msgstr "" +"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服" +"務使用者屬性名稱" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -5977,8 +6029,8 @@ msgstr "目前網站 URL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service" -" and is usually used in links in system emails" +"Site URL is the externally accessible address of the current product service " +"and is usually used in links in system emails" msgstr "站點 URL 是目前產品服務的外部可訪問地址,通常在系統郵件的連結中使用" #: settings/serializers/basic.py:18 @@ -6063,7 +6115,8 @@ msgstr "會話日誌 (天)" msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." -msgstr "會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" +msgstr "" +"會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -6107,7 +6160,8 @@ msgid "" "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" +"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷" +"史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" #: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" @@ -6118,8 +6172,7 @@ msgid "GPT Base URL" msgstr "GPT 地址" #: settings/serializers/feature.py:86 -msgid "" -"The base URL of the GPT service. For example: https://api.openai.com/v1" +msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPT 服務的基礎 URL。例如:https://api.openai.com/v1" #: settings/serializers/feature.py:89 templates/_header_bar.html:96 @@ -6231,7 +6284,8 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" +"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這" +"種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -6241,7 +6295,9 @@ msgstr "使用 TLS" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 587 上" +msgstr "" +"與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 " +"587 上" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -6249,8 +6305,8 @@ msgstr "主題前綴" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account" -" successfully)" +"Tips: When creating a user, send the subject of the email (eg:Create account " +"successfully)" msgstr "提示: 創建用戶時,發送設置密碼郵件的主題 (例如: 創建用戶成功)" #: settings/serializers/msg.py:73 @@ -6266,7 +6322,8 @@ msgstr "提示: 創建用戶時,發送設置密碼郵件的敬語 (例如: 你 msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" +msgstr "" +"提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -6282,7 +6339,9 @@ msgstr "顯示未分組節點" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" -msgstr "放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問題" +msgstr "" +"放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問" +"題" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -6293,7 +6352,9 @@ msgid "" "If the user does not update the password during the time, the user password " "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" -msgstr "如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過期前5天內由系統 (每天)自動發送給用戶" +msgstr "" +"如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過" +"期前5天內由系統 (每天)自動發送給用戶" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -6363,7 +6424,9 @@ msgid "" "users of other authentication methods except local authentication methods " "are allowed to log in and automatically create users (if the user does not " "exist)" -msgstr "如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" +msgstr "" +"如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方" +"式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -6371,12 +6434,13 @@ msgstr "僅從用戶來源登錄" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging" -" in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging " +"in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" +"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順" +"序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -6445,7 +6509,9 @@ msgstr "啟用登入附加碼" msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密碼+6位數字 完成認證" +msgstr "" +"密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密" +"碼+6位數字 完成認證" #: settings/serializers/security.py:158 msgid "Login captcha" @@ -6461,10 +6527,12 @@ msgstr "異地登入通知" #: settings/serializers/security.py:164 msgid "" -"The system determines whether the login IP address belongs to a common login" -" city. If the account is logged in from a common login city, the system " -"sends a remote login reminder" -msgstr "根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地登錄提醒" +"The system determines whether the login IP address belongs to a common login " +"city. If the account is logged in from a common login city, the system sends " +"a remote login reminder" +msgstr "" +"根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地" +"登錄提醒" #: settings/serializers/security.py:170 msgid "Auto Disable Threshold (day)" @@ -6548,8 +6616,8 @@ msgstr "元件註冊" #: settings/serializers/terminal.py:24 msgid "" -"Allow component register, after all component setup, you should disable this" -" for security" +"Allow component register, after all component setup, you should disable this " +"for security" msgstr "是否允許元件註冊,當所有終端啟動後,為了安全應該關閉" #: settings/serializers/terminal.py:30 @@ -6561,11 +6629,11 @@ msgstr "* 允許用戶透過密碼驗證登入KoKo元件" msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in" -" after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in " +"after being deleted from the AD/LDAP server" msgstr "" -"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)已啟用,則應禁用此選項,以防止用戶從 AD/LDAP " -"伺服器中刪除後再次登入" +"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)" +"已啟用,則應禁用此選項,以防止用戶從 AD/LDAP 伺服器中刪除後再次登入" #: settings/serializers/terminal.py:43 msgid "Asset sorting" @@ -6577,18 +6645,21 @@ msgstr "資產列表每頁數量" #: settings/serializers/terminal.py:51 msgid "" -"* You can individually configure the service address and port in the service" -" endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service " +"endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" -msgstr "* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示 DB 客戶端啟動方法" +msgstr "" +"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" +"產時顯示 DB 客戶端啟動方法" #: settings/serializers/terminal.py:59 msgid "" -"* You can individually configure the service address and port in the service" -" endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service " +"endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" +"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" +"產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" #: settings/serializers/terminal.py:66 msgid "Client connection" @@ -6597,9 +6668,10 @@ msgstr "客戶端連接" #: settings/serializers/terminal.py:68 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to " -"assets" -msgstr "* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界面將顯示 SSH 客戶端啟動方法" +"Luna page will display the SSH client launch method when connecting to assets" +msgstr "" +"* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界" +"面將顯示 SSH 客戶端啟動方法" #: settings/serializers/tool.py:10 msgid "Tool" @@ -6611,8 +6683,8 @@ msgstr "工作台中的工具" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools" -" in the workbench" +"*! If enabled, users with RBAC permissions will be able to utilize all tools " +"in the workbench" msgstr "*! 如果啟用,具有 RBAC 權限的用戶將能夠使用工作台中的所有工具" #: settings/tasks/ldap.py:28 @@ -6826,11 +6898,13 @@ msgstr "過期。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" 您的密碼已經過期,請點擊 連結 更新密碼\n" +" 您的密碼已經過期,請點擊 連結 更新密碼\n" " " #: templates/_message.html:30 @@ -6841,33 +6915,39 @@ msgstr "您的密碼將於" #, python-format msgid "" "\n" -" please click this link to update your password.\n" +" please click this " +"link to update your password.\n" " " msgstr "" "\n" -" 請點擊 連結 更新密碼\n" +" 請點擊 連結 更" +"新密碼\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" 你的資訊不完整,請點擊 連結 補充完整\n" +" 你的資訊不完整,請點擊 連結 " +" 補充完整\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" 您的SSH金鑰沒有設置或已失效,請點擊 連結 更新\n" +" 您的SSH金鑰沒有設置或已失效,請點擊 連結 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -6898,7 +6978,9 @@ msgstr "用戶端" msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" -msgstr "JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH 用戶端,Telnet 會在未來支持" +msgstr "" +"JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH " +"用戶端,Telnet 會在未來支持" #: templates/resource_download.html:35 msgid "Microsoft" @@ -7344,8 +7426,7 @@ msgstr "可以下載會話錄影" msgid "Account ID" msgstr "帳號" -#: terminal/models/session/session.py:37 -#: terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:118 msgid "Login from" msgstr "登錄來源" @@ -7394,8 +7475,8 @@ msgstr "操作權限" msgid "Origin" msgstr "來源" -#: terminal/models/session/sharing.py:42 -#: terminal/models/session/sharing.py:100 terminal/notifications.py:261 +#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 +#: terminal/notifications.py:261 msgid "Session sharing" msgstr "會話分享" @@ -7508,15 +7589,19 @@ msgstr "Core 服務地址" #: terminal/serializers/applet_host.py:40 msgid "" " \n" -" Tips: The application release machine communicates with the Core service. \n" -" If the release machine and the Core service are on the same network segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" +" Tips: The application release machine communicates with the Core " +"service. \n" +" If the release machine and the Core service are on the same network " +"segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in " +"the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段,建議填寫內網地址,否則填寫當前站點 " -"URL
例如:https://172.16.10.110 or https://dev.jumpserver.com" +"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段," +"建議填寫內網地址,否則填寫當前站點 URL
例如:https://172.16.10.110 or " +"https://dev.jumpserver.com" #: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -7558,7 +7643,9 @@ msgstr "RDS 最大斷開時間(毫秒)" msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒後註銷會話)" +msgstr "" +"提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒" +"後註銷會話)" #: terminal/serializers/applet_host.py:71 msgid "RDS Remote App Logoff Time Limit (ms)" @@ -7566,9 +7653,11 @@ msgstr "RDS 遠程應用註銷時間限制(毫秒)" #: terminal/serializers/applet_host.py:73 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" -" programs (0 milliseconds, log off the session immediately)." -msgstr "提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即註銷會話)" +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " +"programs (0 milliseconds, log off the session immediately)." +msgstr "" +"提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即" +"註銷會話)" #: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 @@ -7577,15 +7666,16 @@ msgstr "負載狀態" #: terminal/serializers/applet_host.py:96 msgid "" -"These accounts are used to connect to the published application, the account" -" is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account " +"is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will" -" be used to connect" +"support multiple open and the special has been used, the public account will " +"be used to connect" msgstr "" -"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用戶都有一個專用帳號。 " -"另一種是公共的,當應用不支持多開且專用的已經被使用時,會使用公共帳號連接;
注意: 如果不開啟自動創建帳號, " -"當前發布機僅能被指定標簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" +"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用" +"戶都有一個專用帳號。 另一種是公共的,當應用不支持多開且專用的已經被使用時,會" +"使用公共帳號連接;
注意: 如果不開啟自動創建帳號, 當前發布機僅能被指定標" +"簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" #: terminal/serializers/applet_host.py:103 msgid "The number of public accounts created automatically" @@ -7597,7 +7687,8 @@ msgid "" "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" +"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 " +"CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" #: terminal/serializers/applet_host.py:148 msgid "Install applets" @@ -7647,19 +7738,23 @@ msgstr "Oracle 埠範圍" msgid "" "Oracle proxy server listen port is dynamic, Each additional Oracle database " "instance adds a port listener" -msgstr "Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠監聽" +msgstr "" +"Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠" +"監聽" #: terminal/serializers/endpoint.py:38 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" -msgstr "連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許修改主機)" +msgstr "" +"連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許" +"修改主機)" #: terminal/serializers/endpoint.py:64 msgid "" -"The assets within this IP range, the following endpoint will be used for the" -" connection" +"The assets within this IP range, the following endpoint will be used for the " +"connection" msgstr "該 IP 範圍內的資產,將使用下面的端點進行連接" #: terminal/serializers/endpoint.py:65 @@ -7762,8 +7857,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"如果有多個主機,請用逗號 (,) " -"分隔它們。
(例如:http://www.jumpserver.a.com:9100,http://www.jumpserver.b.com:9100)" +"如果有多個主機,請用逗號 (,) 分隔它們。
(例如:http://www.jumpserver.a." +"com:9100,http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -7965,12 +8060,14 @@ msgid "" "No available port is matched. The number of databases may have exceeded the " "number of ports open to the database agent service, Contact the " "administrator to open more ports." -msgstr "未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管理員開放更多埠。" +msgstr "" +"未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管" +"理員開放更多埠。" #: terminal/utils/db_port_mapper.py:116 msgid "" -"No ports can be used, check and modify the limit on the number of ports that" -" Magnus listens on in the configuration file." +"No ports can be used, check and modify the limit on the number of ports that " +"Magnus listens on in the configuration file." msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。" #: terminal/utils/db_port_mapper.py:118 @@ -8033,7 +8130,8 @@ msgstr "工單已經關閉" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" +msgstr "" +"通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -8382,7 +8480,9 @@ msgid "" "When enabled, you will enter the MFA binding process the next time you log " "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" -msgstr "啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速修改->設置 MFA 多因子認證)中直接綁定!" +msgstr "" +"啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速" +"修改->設置 MFA 多因子認證)中直接綁定!" #: users/forms/profile.py:59 msgid "* Enable MFA to make the account more secure." @@ -8390,10 +8490,12 @@ msgstr "* 啟用 MFA 多因子認證,使帳號更加安全。" #: users/forms/profile.py:68 msgid "" -"In order to protect you and your company, please keep your account, password" -" and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password " +"and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" -msgstr "為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:設置複雜密碼,並啟用 MFA 多因子認證)" +msgstr "" +"為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:" +"設置複雜密碼,並啟用 MFA 多因子認證)" #: users/forms/profile.py:82 users/serializers/preference/lina.py:21 msgid "New password" @@ -8546,8 +8648,8 @@ msgstr "終端主題名稱" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files," -" account password change results files" +"sends emails containing file attachments.
Such as: account backup files, " +"account password change results files" msgstr "" "File Encryption Password, when the system sends mails containing file " "attachments, use this password for decryption.
For example: Account " @@ -8600,7 +8702,9 @@ msgid "" "Determines whether the client computer should scale the content on the " "remote computer to fit the window size of the client computer when the " "window is resized." -msgstr "確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機的窗口大小" +msgstr "" +"確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機" +"的窗口大小" #: users/serializers/preference/luna.py:59 msgid "Remote app connect method" @@ -8644,11 +8748,10 @@ msgstr "系統角色" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across" -" all organizations" +"System roles are roles at the system level, and they will take effect across " +"all organizations" msgstr "" -"System role is a system-level role, it will be effective in all " -"organizations" +"System role is a system-level role, it will be effective in all organizations" #: users/serializers/user.py:61 msgid "Org roles" @@ -8659,8 +8762,8 @@ msgid "" "Org roles are roles at the organization level, and they will only take " "effect within current organization" msgstr "" -"Organization role is an organization-level role, it is only effective within" -" the current organization" +"Organization role is an organization-level role, it is only effective within " +"the current organization" #: users/serializers/user.py:70 msgid "Organizations and roles" @@ -8720,8 +8823,8 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"User origin identifies the location where the user was created. It can be AD" -" or other sources. Security settings can restrict users to log in to the " +"User origin identifies the location where the user was created. It can be AD " +"or other sources. Security settings can restrict users to log in to the " "system only from designated sources." #: users/serializers/user.py:266 @@ -8746,8 +8849,7 @@ msgstr "認證" #: users/serializers/user.py:426 msgid "" -"* For security, only a partial of users is displayed. You can search for " -"more" +"* For security, only a partial of users is displayed. You can search for more" msgstr "" "*For security reasons, only a portion of users is displayed. You can search " "for more" @@ -8759,8 +8861,10 @@ msgstr "名稱重複" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the administrator." -msgstr "管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" +" and the current user is not in the user list. Please contact the " +"administrator." +msgstr "" +"管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" #: users/signal_handlers.py:193 msgid "Clean up expired user sessions" @@ -8918,8 +9022,8 @@ msgstr "綁定MFA驗證器" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a " -"6-bit verification code" +"Use the MFA Authenticator application to scan the following qr code for a 6-" +"bit verification code" msgstr "使用 MFA 驗證器應用掃描以下二維碼,獲取6位驗證碼" #: users/templates/users/user_otp_enable_bind.html:22 @@ -9004,8 +9108,8 @@ msgstr "使用者名稱或密碼無效" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change" -" their passwords: {}" +"Non-local users can log in only from third-party platforms and cannot change " +"their passwords: {}" msgstr "非本地用戶僅允許從第三方平台登錄,不支持修改密碼: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 @@ -9229,7 +9333,8 @@ msgstr "同步地區" #: xpack/plugins/cloud/manager.py:115 #, python-format msgid "Get instances of region \"%s\" error, error: %s" -msgstr "An error occurred while getting the instances of Region \"%s\", Error: %s" +msgstr "" +"An error occurred while getting the instances of Region \"%s\", Error: %s" #: xpack/plugins/cloud/manager.py:157 #, python-format @@ -9374,8 +9479,7 @@ msgstr "實例" msgid "Sync instance detail" msgstr "同步實例詳情" -#: xpack/plugins/cloud/models.py:311 -#: xpack/plugins/cloud/serializers/task.py:77 +#: xpack/plugins/cloud/models.py:311 xpack/plugins/cloud/serializers/task.py:77 msgid "Rule relation" msgstr "條件關係" @@ -9431,8 +9535,7 @@ msgstr "規則匹配" msgid "Rule value" msgstr "規則值" -#: xpack/plugins/cloud/models.py:381 -#: xpack/plugins/cloud/serializers/task.py:80 +#: xpack/plugins/cloud/models.py:381 xpack/plugins/cloud/serializers/task.py:80 msgid "Strategy rule" msgstr "條件" @@ -9448,8 +9551,7 @@ msgstr "動作屬性" msgid "Action value" msgstr "動作值" -#: xpack/plugins/cloud/models.py:407 -#: xpack/plugins/cloud/serializers/task.py:83 +#: xpack/plugins/cloud/models.py:407 xpack/plugins/cloud/serializers/task.py:83 msgid "Strategy action" msgstr "動作" @@ -9726,7 +9828,9 @@ msgid "" "The port is used to detect the validity of the IP address. When the " "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." -msgstr "埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如果埠為 0,則表示所有 IP 地址均有效。" +msgstr "" +"埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如" +"果埠為 0,則表示所有 IP 地址均有效。" #: xpack/plugins/cloud/serializers/account_attrs.py:190 msgid "Hostname prefix" diff --git a/apps/ops/ansible/inventory.py b/apps/ops/ansible/inventory.py index 09bfd0f39..bb9cf2060 100644 --- a/apps/ops/ansible/inventory.py +++ b/apps/ops/ansible/inventory.py @@ -45,24 +45,34 @@ class JMSInventory: return groups @staticmethod - def make_proxy_command(gateway, path_dir): + def get_gateway_ssh_settings(gateway): + platform = gateway.platform + try: + protocol = platform.protocols.get(name='ssh') + except platform.protocols.model.DoesNotExist: + return {} + return protocol.setting + + def make_proxy_command(self, gateway, path_dir): proxy_command_list = [ "ssh", "-o", "Port={}".format(gateway.port), "-o", "StrictHostKeyChecking=no", - "{}@{}".format(gateway.username, gateway.address), - "-W", "%h:%p", "-q", + f"{gateway.username}@{gateway.address}" ] + setting = self.get_gateway_ssh_settings(gateway) + if setting.get('nc', False): + proxy_command_list.extend(["nc", "-w", "10", "%h", "%p"]) + else: + proxy_command_list.extend(["-W", "%h:%p", "-q"]) + if gateway.password: - proxy_command_list.insert( - 0, "sshpass -p {}".format(gateway.password) - ) + proxy_command_list.insert(0, f"sshpass -p {gateway.password}") + if gateway.private_key: - proxy_command_list.append("-i {}".format(gateway.get_private_key_path(path_dir))) + proxy_command_list.append(f"-i {gateway.get_private_key_path(path_dir)}") - proxy_command = "-o ProxyCommand='{}'".format( - " ".join(proxy_command_list) - ) + proxy_command = f"-o ProxyCommand='{' '.join(proxy_command_list)}'" return {"ansible_ssh_common_args": proxy_command} @staticmethod From ef91ebb46883696539b0e90ff9f9c54f81eebe20 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Tue, 10 Sep 2024 15:04:41 +0800 Subject: [PATCH 38/98] perf: clean expired and account is null SyncInstanceTask record --- apps/ops/mixin.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/ops/mixin.py b/apps/ops/mixin.py index 9e884ee4b..ab312826a 100644 --- a/apps/ops/mixin.py +++ b/apps/ops/mixin.py @@ -16,6 +16,13 @@ __all__ = [ ] +class PeriodTaskModelQuerySet(models.QuerySet): + def delete(self, *args, **kwargs): + for obj in self: + obj.delete() + return super().delete(*args, **kwargs) + + class PeriodTaskModelMixin(models.Model): name = models.CharField( max_length=128, unique=False, verbose_name=_("Name") @@ -27,6 +34,7 @@ class PeriodTaskModelMixin(models.Model): crontab = models.CharField( blank=True, max_length=128, null=True, verbose_name=_("Crontab"), ) + objects = PeriodTaskModelQuerySet.as_manager() @abc.abstractmethod def get_register_task(self): From db4d841bb04d03ec6238d1998373b827358ad21e Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Mon, 9 Sep 2024 19:06:43 +0800 Subject: [PATCH 39/98] perf: add xpack task description --- apps/i18n/core/zh/LC_MESSAGES/django.po | 42 +++++++++++++++---------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 70a8f1601..98821557e 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 18:29+0800\n" +"POT-Creation-Date: 2024-09-09 19:05+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -1789,7 +1789,9 @@ msgstr "旧的 SSH 版本,例如 openssh 5.x 或 6.x" #: assets/const/protocol.py:53 msgid "Netcat help text" -msgstr "使用 netcat (nc) 作为代理工具,将连接从代理服务器转发到目标主机。适用于不支持 SSH 原生代理选项 (-W) 的环境,或需要更多灵活性和超时控制的场景。" +msgstr "" +"使用 netcat (nc) 作为代理工具,将连接从代理服务器转发到目标主机。适用于不支" +"持 SSH 原生代理选项 (-W) 的环境,或需要更多灵活性和超时控制的场景。" #: assets/const/protocol.py:64 msgid "SFTP root" @@ -4687,15 +4689,15 @@ msgstr "" "\n" "系统一些告警,工单等需要发送站内信时执行该任务" -#: ops/ansible/inventory.py:106 ops/models/job.py:65 +#: ops/ansible/inventory.py:116 ops/models/job.py:65 msgid "No account available" msgstr "无可用账号" -#: ops/ansible/inventory.py:286 +#: ops/ansible/inventory.py:296 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:302 +#: ops/ansible/inventory.py:312 msgid "Skip hosts below:" msgstr "跳过以下主机: " @@ -9948,7 +9950,7 @@ msgstr "删除账号: %s" msgid "Set protocols \"%s\"" msgstr "设置协议 \"%s\"" -#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:30 +#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:31 msgid "Run sync instance task" msgstr "执行同步实例任务" @@ -10423,23 +10425,31 @@ msgstr "执行次数" msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/tasks.py:32 +#: xpack/plugins/cloud/tasks.py:33 msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are " -"performed" -msgstr "手动,定时执行云同步任务时执行该任务" +"\n" +" Execute this task when manually or scheduled cloud synchronization " +"tasks are performed\n" +" " +msgstr "" +"\n" +"手动,定时执行云同步任务时执行该任务" -#: xpack/plugins/cloud/tasks.py:46 +#: xpack/plugins/cloud/tasks.py:52 msgid "Period clean sync instance task execution" msgstr "定期清除同步实例任务执行记录" -#: xpack/plugins/cloud/tasks.py:46 +#: xpack/plugins/cloud/tasks.py:54 msgid "" -"Every day, according to the \n" -"configuration in \"System Settings - Tasks - Regular clean-up - Cloud sync " -"task history retention days\" the system \n" -"will clean up the execution records generated by cloud synchronization" +"\n" +" Every day, according to the configuration in \"System Settings - " +"Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will " +"clean up the execution \n" +" records generated by cloud synchronization\n" +" " msgstr "" +"\n" "每天根据系统设置-任务列表-定期清理配置-云同步记录配置,对云同步产生的执行记录" "进行清理" From 6982ab1efc5bd238a2471278437901f9f4577d1f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 9 Sep 2024 11:20:57 +0000 Subject: [PATCH 40/98] perf: Update Dockerfile with new base image tag --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 082eddeaa..0168efb66 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM jumpserver/core-base:20240815_080231 AS stage-build +FROM jumpserver/core-base:20240909_110723 AS stage-build ARG VERSION From b6f3c23787c8385480a76e0d9ceec52f682d0cc9 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Tue, 10 Sep 2024 17:04:43 +0800 Subject: [PATCH 41/98] perf: task description translate --- apps/accounts/tasks/automation.py | 9 ++- apps/audits/tasks.py | 10 +--- apps/i18n/core/zh/LC_MESSAGES/django.po | 80 +++++++++++-------------- 3 files changed, 47 insertions(+), 52 deletions(-) diff --git a/apps/accounts/tasks/automation.py b/apps/accounts/tasks/automation.py index 6e086aaf5..45eb45b2e 100644 --- a/apps/accounts/tasks/automation.py +++ b/apps/accounts/tasks/automation.py @@ -100,7 +100,14 @@ def execute_automation_record_task(record_ids, tp): verbose_name=_('Clean change secret and push record period'), description=_( """ - Clean change secret and push record period description + The system will periodically clean up unnecessary password change and push records, + including their associated change tasks, execution logs, assets, and accounts. When any + of these associated items are deleted, the corresponding password change and push records + become invalid. Therefore, to maintain a clean and efficient database, the system will + clean up expired records at 2 a.m daily, based on the interval specified by + PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup + mechanism helps free up storage space and enhances the security and overall performance + of data management """ ) ) diff --git a/apps/audits/tasks.py b/apps/audits/tasks.py index 8daaca79d..fddc8bc69 100644 --- a/apps/audits/tasks.py +++ b/apps/audits/tasks.py @@ -133,13 +133,9 @@ def clean_expired_session_period(): description=_( """ Since the system generates login logs, operation logs, file upload logs, activity - logs, Celery execution logs, session recordings, and command records, as well as password - change logs, it will clean up these records based on the periodic cleanup configuration - in "System Settings - Tasks" The system will clean up login logs, task logs, operation - logs, password change logs, upload and download logs, session logs, activity records, - job center execution history logs, and cloud synchronization records that exceed the set - time limit every day at 2 a.m., according to the periodic cleanup configuration in - 'System Settings - Tasks' + logs, Celery execution logs, session recordings, command records, and password change + logs, it will perform cleanup of records that exceed the time limit according to the + 'Tasks - Regular clean-up' in the system settings at 2 a.m daily """ ) ) diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 98821557e..0699f9316 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 19:05+0800\n" +"POT-Creation-Date: 2024-09-10 16:58+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -707,7 +707,7 @@ msgstr "密码规则" #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 #: authentication/serializers/connect_token_secret.py:169 labels/models.py:11 -#: ops/mixin.py:21 ops/models/adhoc.py:20 ops/models/celery.py:15 +#: ops/mixin.py:28 ops/models/adhoc.py:20 ops/models/celery.py:15 #: ops/models/celery.py:81 ops/models/job.py:142 ops/models/playbook.py:28 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 @@ -1161,15 +1161,29 @@ msgstr "周期清理改密记录和推送记录" #: accounts/tasks/automation.py:102 msgid "" "\n" -" Clean change secret and push record period description\n" +" The system will periodically clean up unnecessary password change " +"and push records, \n" +" including their associated change tasks, execution logs, assets, and " +"accounts. When any \n" +" of these associated items are deleted, the corresponding password " +"change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient " +"database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval " +"specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " +"This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and " +"overall performance \n" +" of data management\n" " " msgstr "" "\n" "系统会定期清理不再需要的改密记录和推送记录,包括那些关联的改密任务、执行记" "录、资产和账号。当这些关联项中的任意一个被删除时,对应的改密和推送记录将变为" -"无效。因此,为了保持数据库的整洁和高效运行,系统默认每180天自动清理这些无效记" -"录。这种定期清理机制不仅有助于释放存储空间,还能提高数据管理的安全性和整体性" -"能。" +"无效。因此,为了保持数据库的整洁和高效运行,根据系统配置文件 config.txt 中 " +"PERM_EXPIRED_CHECK_PERIODIC 的时间间隔对于超出时间的于每天凌晨2点进行清理。这" +"种定期清理机制不仅有助于释放存储空间,还能提高数据管理的安全和整体性能" #: accounts/tasks/backup_account.py:26 msgid "Execute account backup plan" @@ -3063,33 +3077,23 @@ msgid "" "\n" " Since the system generates login logs, operation logs, file upload " "logs, activity \n" -" logs, Celery execution logs, session recordings, and command " -"records, as well as password \n" -" change logs, it will clean up these records based on the periodic " -"cleanup configuration \n" -" in \"System Settings - Tasks\" The system will clean up login logs, " -"task logs, operation \n" -" logs, password change logs, upload and download logs, session logs, " -"activity records, \n" -" job center execution history logs, and cloud synchronization records " -"that exceed the set \n" -" time limit every day at 2 a.m., according to the periodic cleanup " -"configuration in \n" -" 'System Settings - Tasks'\n" +" logs, Celery execution logs, session recordings, command records, " +"and password change \n" +" logs, it will perform cleanup of records that exceed the time limit " +"according to the \n" +" 'Tasks - Regular clean-up' in the system settings at 2 a.m daily\n" " " msgstr "" "\n" "由于系统会产生登录日志,操作日志,文件上传日志,活动日志,celery执行日志,会" -"话录像和命令记录,改密日志,所以系统会根据系统设置-任务列表-定期清理配置对这" -"些记录进行清理。系统会根据系统设置-任务列表-定期清理的配置,对于超出时间的登" -"录日志、任务日志、操作日志、改密日志、上传下载日志、会话日志、活动记录、作业" -"中心执行历史日志、云同步记录日志于每天凌晨2点进行清理" +"话录像和命令记录,改密日志,所以系统会根据系统设置-任务列表-定期清理配置,对" +"于超出时间的于每天凌晨2点进行清理" -#: audits/tasks.py:160 +#: audits/tasks.py:156 msgid "Upload FTP file to external storage" msgstr "上传 FTP 文件到外部存储" -#: audits/tasks.py:162 +#: audits/tasks.py:158 msgid "" "\n" " If SERVER_REPLAY_STORAGE is configured, files uploaded through file " @@ -4881,33 +4885,33 @@ msgstr "命令执行已禁用" msgid "no valid program entry found." msgstr "没有可用程序入口" -#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:73 +#: ops/mixin.py:30 ops/mixin.py:110 settings/serializers/auth/ldap.py:73 msgid "Periodic run" msgstr "周期执行" -#: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108 +#: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116 #: settings/serializers/auth/ldap.py:80 msgid "Interval" msgstr "间隔" -#: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105 +#: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113 #: settings/serializers/auth/ldap.py:77 msgid "Crontab" msgstr "Crontab" -#: ops/mixin.py:110 +#: ops/mixin.py:118 msgid "Run period" msgstr "执行周期" -#: ops/mixin.py:119 +#: ops/mixin.py:127 msgid "* Please enter a valid crontab expression" msgstr "* 请输入有效的 crontab 表达式" -#: ops/mixin.py:126 +#: ops/mixin.py:134 msgid "Range {} to {}" msgstr "输入在 {} - {} 范围之间" -#: ops/mixin.py:137 +#: ops/mixin.py:145 msgid "Require interval or crontab setting" msgstr "需要周期或定期设置" @@ -10522,15 +10526,3 @@ msgstr "企业专业版" #: xpack/plugins/license/models.py:86 msgid "Ultimate edition" msgstr "企业旗舰版" - -#~ msgid "Per Session" -#~ msgstr "每用户" - -#~ msgid "Per Device" -#~ msgstr "每设备" - -#~ msgid "None" -#~ msgstr "无" - -#~ msgid "Yes,No" -#~ msgstr "Yes,No" From f55869a449814f18453b463f8c2a0435ccd3101f Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 6 Sep 2024 17:41:09 +0800 Subject: [PATCH 42/98] feat: Support playbook, adhoc share --- apps/i18n/lina/en.json | 2 +- apps/i18n/lina/ja.json | 2 +- apps/i18n/lina/zh.json | 2 +- apps/i18n/lina/zh_hant.json | 2 +- apps/ops/api/adhoc.py | 29 +++++++++---- apps/ops/api/playbook.py | 26 +++++++++--- apps/ops/const.py | 7 +++- ...03_alter_adhoc_unique_together_and_more.py | 41 +++++++++++++++++++ apps/ops/models/adhoc.py | 10 ++--- apps/ops/models/playbook.py | 11 +++-- apps/ops/serializers/adhoc.py | 12 +++--- apps/ops/serializers/mixin.py | 11 +++++ apps/ops/serializers/playbook.py | 7 ++-- 13 files changed, 128 insertions(+), 34 deletions(-) create mode 100644 apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py create mode 100644 apps/ops/serializers/mixin.py diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index 26fe94167..6e454af30 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -69,7 +69,7 @@ "Address": "Address", "AdhocCreate": "Create the command", "AdhocDetail": "Command details", - "AdhocManage": "Command", + "AdhocManage": "Script", "AdhocUpdate": "Update the command", "Advanced": "Advanced settings", "AfterChange": "After changes", diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json index d5dee7b62..a3edc71fd 100644 --- a/apps/i18n/lina/ja.json +++ b/apps/i18n/lina/ja.json @@ -69,7 +69,7 @@ "Address": "アドレス", "AdhocCreate": "アドホックコマンドを作成", "AdhocDetail": "コマンド詳細", - "AdhocManage": "コマンド", + "AdhocManage": "スクリプト管理", "AdhocUpdate": "コマンドを更新", "Advanced": "高度な設定", "AfterChange": "変更後", diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index 4df1b71c8..45106c025 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -69,7 +69,7 @@ "Address": "地址", "AdhocCreate": "创建命令", "AdhocDetail": "命令详情", - "AdhocManage": "命令管理", + "AdhocManage": "脚本管理", "AdhocUpdate": "更新命令", "Advanced": "高级设置", "AfterChange": "变更后", diff --git a/apps/i18n/lina/zh_hant.json b/apps/i18n/lina/zh_hant.json index 248b398d7..500c74591 100644 --- a/apps/i18n/lina/zh_hant.json +++ b/apps/i18n/lina/zh_hant.json @@ -87,7 +87,7 @@ "Addressee": "收件人", "AdhocCreate": "創建命令", "AdhocDetail": "命令詳情", - "AdhocManage": "命令管理", + "AdhocManage": "腳本管理", "AdhocUpdate": "更新命令", "Admin": "管理員", "AdminUser": "特權用戶", diff --git a/apps/ops/api/adhoc.py b/apps/ops/api/adhoc.py index 70b74bed7..77c989940 100644 --- a/apps/ops/api/adhoc.py +++ b/apps/ops/api/adhoc.py @@ -1,22 +1,37 @@ # -*- coding: utf-8 -*- -from orgs.mixins.api import OrgBulkModelViewSet +from django.db.models import Q + +from common.api.generic import JMSBulkModelViewSet +from common.utils.http import is_true from rbac.permissions import RBACPermission +from ..const import Scope from ..models import AdHoc -from ..serializers import ( - AdHocSerializer -) +from ..serializers import AdHocSerializer __all__ = [ 'AdHocViewSet' ] -class AdHocViewSet(OrgBulkModelViewSet): +class AdHocViewSet(JMSBulkModelViewSet): + queryset = AdHoc.objects.all() serializer_class = AdHocSerializer permission_classes = (RBACPermission,) search_fields = ('name', 'comment') - model = AdHoc + filterset_fields = ['scope', 'creator'] + + def check_object_permissions(self, request, obj): + if request.method != 'GET' and obj.creator != request.user: + self.permission_denied( + request, message={"detail": "Deleting other people's script is not allowed"} + ) + return super().check_object_permissions(request, obj) def get_queryset(self): queryset = super().get_queryset() - return queryset.filter(creator=self.request.user) + user = self.request.user + if is_true(self.request.query_params.get('only_myself')): + queryset = queryset.filter(creator=user) + else: + queryset = queryset.filter(Q(creator=user) | Q(scope=Scope.public)) + return queryset diff --git a/apps/ops/api/playbook.py b/apps/ops/api/playbook.py index e75841ff1..cab0c960d 100644 --- a/apps/ops/api/playbook.py +++ b/apps/ops/api/playbook.py @@ -4,13 +4,16 @@ import zipfile from django.conf import settings from django.core.exceptions import SuspiciousFileOperation +from django.db.models import Q from django.shortcuts import get_object_or_404 from django.utils.translation import gettext_lazy as _ from rest_framework import status +from common.api.generic import JMSBulkModelViewSet from common.exceptions import JMSException -from orgs.mixins.api import OrgBulkModelViewSet +from common.utils.http import is_true from rbac.permissions import RBACPermission +from ..const import Scope from ..exception import PlaybookNoValidEntry from ..models import Playbook from ..serializers.playbook import PlaybookSerializer @@ -28,11 +31,19 @@ def unzip_playbook(src, dist): fz.extract(file, dist) -class PlaybookViewSet(OrgBulkModelViewSet): +class PlaybookViewSet(JMSBulkModelViewSet): serializer_class = PlaybookSerializer permission_classes = (RBACPermission,) - model = Playbook + queryset = Playbook.objects.all() search_fields = ('name', 'comment') + filterset_fields = ['scope', 'creator'] + + def check_object_permissions(self, request, obj): + if request.method != 'GET' and obj.creator != request.user: + self.permission_denied( + request, message={"detail": "Deleting other people's playbook is not allowed"} + ) + return super().check_object_permissions(request, obj) def perform_destroy(self, instance): if instance.job_set.exists(): @@ -45,7 +56,11 @@ class PlaybookViewSet(OrgBulkModelViewSet): def get_queryset(self): queryset = super().get_queryset() - queryset = queryset.filter(creator=self.request.user) + user = self.request.user + if is_true(self.request.query_params.get('only_myself')): + queryset = queryset.filter(creator=user) + else: + queryset = queryset.filter(Q(creator=user) | Q(scope=Scope.public)) return queryset def perform_create(self, serializer): @@ -85,7 +100,8 @@ class PlaybookFileBrowserAPIView(APIView): def get(self, request, **kwargs): playbook_id = kwargs.get('pk') - playbook = self.get_playbook(playbook_id) + user = self.request.user + playbook = get_object_or_404(Playbook, Q(creator=user) | Q(scope=Scope.public), id=playbook_id) work_path = playbook.work_dir file_key = request.query_params.get('key', '') if file_key: diff --git a/apps/ops/const.py b/apps/ops/const.py index 5676da4de..b2b1c63ca 100644 --- a/apps/ops/const.py +++ b/apps/ops/const.py @@ -1,5 +1,5 @@ from django.db import models -from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy class StrategyChoice(models.TextChoices): @@ -80,3 +80,8 @@ class JobStatus(models.TextChoices): CELERY_LOG_MAGIC_MARK = b'\x00\x00\x00\x00\x00' COMMAND_EXECUTION_DISABLED = _('Command execution disabled') + + +class Scope(models.TextChoices): + public = 'public', pgettext_lazy("scope", 'Public') + private = 'private', _('Private') diff --git a/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py b/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py new file mode 100644 index 000000000..610e19330 --- /dev/null +++ b/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py @@ -0,0 +1,41 @@ +# Generated by Django 4.1.13 on 2024-09-06 08:32 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('ops', '0002_celerytask'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='adhoc', + unique_together={('name', 'creator')}, + ), + migrations.AlterUniqueTogether( + name='playbook', + unique_together={('name', 'creator')}, + ), + migrations.AddField( + model_name='adhoc', + name='scope', + field=models.CharField(default='public', max_length=64, verbose_name='Scope'), + ), + migrations.AddField( + model_name='playbook', + name='scope', + field=models.CharField(default='public', max_length=64, verbose_name='Scope'), + ), + migrations.RemoveField( + model_name='adhoc', + name='org_id', + ), + migrations.RemoveField( + model_name='playbook', + name='org_id', + ), + ] diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index 3ca2fa281..f7e13f18d 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -8,14 +8,13 @@ from common.utils import get_logger __all__ = ["AdHoc"] -from ops.const import AdHocModules - -from orgs.mixins.models import JMSOrgBaseModel +from common.db.models import JMSBaseModel +from ops.const import AdHocModules, Scope logger = get_logger(__file__) -class AdHoc(JMSOrgBaseModel): +class AdHoc(JMSBaseModel): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, verbose_name=_('Name')) pattern = models.CharField(max_length=1024, verbose_name=_("Pattern"), default='all') @@ -24,6 +23,7 @@ class AdHoc(JMSOrgBaseModel): args = models.CharField(max_length=8192, default='', verbose_name=_('Args')) creator = models.ForeignKey('users.User', verbose_name=_("Creator"), on_delete=models.SET_NULL, null=True) comment = models.CharField(max_length=1024, default='', verbose_name=_('Comment'), null=True, blank=True) + scope = models.CharField(max_length=64, default=Scope.public, verbose_name=_('Scope')) @property def row_count(self): @@ -40,5 +40,5 @@ class AdHoc(JMSOrgBaseModel): return "{}: {}".format(self.module, self.args) class Meta: - unique_together = [('name', 'org_id', 'creator')] + unique_together = [('name', 'creator')] verbose_name = _("Adhoc") diff --git a/apps/ops/models/playbook.py b/apps/ops/models/playbook.py index 2b703916a..ccc7223d2 100644 --- a/apps/ops/models/playbook.py +++ b/apps/ops/models/playbook.py @@ -6,9 +6,9 @@ from django.db import models from django.utils.translation import gettext_lazy as _ from private_storage.fields import PrivateFileField -from ops.const import CreateMethods +from common.db.models import JMSBaseModel +from ops.const import CreateMethods, Scope from ops.exception import PlaybookNoValidEntry -from orgs.mixins.models import JMSOrgBaseModel dangerous_keywords = ( 'hosts:localhost', @@ -23,7 +23,9 @@ dangerous_keywords = ( ) -class Playbook(JMSOrgBaseModel): + + +class Playbook(JMSBaseModel): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, verbose_name=_('Name'), null=True) path = PrivateFileField(upload_to='playbooks/') @@ -31,6 +33,7 @@ class Playbook(JMSOrgBaseModel): comment = models.CharField(max_length=1024, default='', verbose_name=_('Comment'), null=True, blank=True) create_method = models.CharField(max_length=128, choices=CreateMethods.choices, default=CreateMethods.blank, verbose_name=_('CreateMethod')) + scope = models.CharField(max_length=64, default=Scope.public, verbose_name=_('Scope')) vcs_url = models.CharField(max_length=1024, default='', verbose_name=_('VCS URL'), null=True, blank=True) def __str__(self): @@ -84,6 +87,6 @@ class Playbook(JMSOrgBaseModel): return work_dir class Meta: - unique_together = [('name', 'org_id', 'creator')] + unique_together = [('name', 'creator')] verbose_name = _("Playbook") ordering = ['date_created'] diff --git a/apps/ops/serializers/adhoc.py b/apps/ops/serializers/adhoc.py index 58cbaad98..4b72860e5 100644 --- a/apps/ops/serializers/adhoc.py +++ b/apps/ops/serializers/adhoc.py @@ -1,17 +1,19 @@ # ~*~ coding: utf-8 ~*~ from __future__ import unicode_literals - +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers -from common.serializers.fields import ReadableHiddenField -from orgs.mixins.serializers import BulkOrgResourceModelSerializer +from common.serializers.fields import ReadableHiddenField, LabeledChoiceField +from common.serializers.mixin import CommonBulkModelSerializer +from .mixin import ScopeSerializerMixin +from ..const import Scope from ..models import AdHoc -class AdHocSerializer(BulkOrgResourceModelSerializer): +class AdHocSerializer(ScopeSerializerMixin, CommonBulkModelSerializer): creator = ReadableHiddenField(default=serializers.CurrentUserDefault()) class Meta: model = AdHoc read_only_field = ["id", "creator", "date_created", "date_updated"] - fields = read_only_field + ["id", "name", "module", "args", "comment"] + fields = read_only_field + ["id", "name", "scope", "module", "args", "comment"] diff --git a/apps/ops/serializers/mixin.py b/apps/ops/serializers/mixin.py new file mode 100644 index 000000000..c1ee343ee --- /dev/null +++ b/apps/ops/serializers/mixin.py @@ -0,0 +1,11 @@ +from django.utils.translation import gettext_lazy as _ +from rest_framework import serializers + +from common.serializers.fields import LabeledChoiceField +from ..const import Scope + + +class ScopeSerializerMixin(serializers.Serializer): + scope = LabeledChoiceField( + choices=Scope.choices, default=Scope.public, label=_("Scope") + ) diff --git a/apps/ops/serializers/playbook.py b/apps/ops/serializers/playbook.py index 1ff48906a..c157251a6 100644 --- a/apps/ops/serializers/playbook.py +++ b/apps/ops/serializers/playbook.py @@ -3,8 +3,9 @@ import os from rest_framework import serializers from common.serializers.fields import ReadableHiddenField +from common.serializers.mixin import CommonBulkModelSerializer from ops.models import Playbook -from orgs.mixins.serializers import BulkOrgResourceModelSerializer +from .mixin import ScopeSerializerMixin def parse_playbook_name(path): @@ -12,7 +13,7 @@ def parse_playbook_name(path): return file_name.split(".")[-2] -class PlaybookSerializer(BulkOrgResourceModelSerializer): +class PlaybookSerializer(ScopeSerializerMixin, CommonBulkModelSerializer): creator = ReadableHiddenField(default=serializers.CurrentUserDefault()) path = serializers.FileField(required=False) @@ -26,6 +27,6 @@ class PlaybookSerializer(BulkOrgResourceModelSerializer): model = Playbook read_only_fields = ["id", "date_created", "date_updated"] fields = read_only_fields + [ - "id", 'path', "name", "comment", "creator", + "id", 'path', 'scope', "name", "comment", "creator", 'create_method', 'vcs_url', ] From 2dd01549677771558e4371f9dea1f787825ae284 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Wed, 11 Sep 2024 18:01:01 +0800 Subject: [PATCH 43/98] perf: modify only_myself to only_mine --- apps/ops/api/adhoc.py | 2 +- apps/ops/api/playbook.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ops/api/adhoc.py b/apps/ops/api/adhoc.py index 77c989940..fdb82d8c1 100644 --- a/apps/ops/api/adhoc.py +++ b/apps/ops/api/adhoc.py @@ -30,7 +30,7 @@ class AdHocViewSet(JMSBulkModelViewSet): def get_queryset(self): queryset = super().get_queryset() user = self.request.user - if is_true(self.request.query_params.get('only_myself')): + if is_true(self.request.query_params.get('only_mine')): queryset = queryset.filter(creator=user) else: queryset = queryset.filter(Q(creator=user) | Q(scope=Scope.public)) diff --git a/apps/ops/api/playbook.py b/apps/ops/api/playbook.py index cab0c960d..6c3ed5a7c 100644 --- a/apps/ops/api/playbook.py +++ b/apps/ops/api/playbook.py @@ -57,7 +57,7 @@ class PlaybookViewSet(JMSBulkModelViewSet): def get_queryset(self): queryset = super().get_queryset() user = self.request.user - if is_true(self.request.query_params.get('only_myself')): + if is_true(self.request.query_params.get('only_mine')): queryset = queryset.filter(creator=user) else: queryset = queryset.filter(Q(creator=user) | Q(scope=Scope.public)) From 512e727ac6d5be49c2c29fe2baf3f0fbe9b7ea4a Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Tue, 10 Sep 2024 17:42:59 +0800 Subject: [PATCH 44/98] feat: Postgresql support ssl --- .../change_secret/database/mysql/main.yml | 21 +++++++++++-------- .../database/postgresql/main.yml | 17 +++++++++++++++ .../gather_accounts/database/mysql/main.yml | 9 +++++--- .../database/postgresql/main.yml | 9 ++++++++ .../push_account/database/mysql/main.yml | 21 +++++++++++-------- .../push_account/database/postgresql/main.yml | 17 +++++++++++++++ .../remove_account/database/mysql/main.yml | 9 +++++--- .../database/postgresql/main.yml | 9 ++++++++ .../verify_account/database/mysql/main.yml | 9 +++++--- .../database/postgresql/main.yml | 9 ++++++++ .../gather_facts/database/mysql/main.yml | 9 +++++--- .../gather_facts/database/postgresql/main.yml | 9 ++++++++ .../automations/ping/database/mysql/main.yml | 9 +++++--- .../ping/database/postgresql/main.yml | 9 ++++++++ 14 files changed, 133 insertions(+), 33 deletions(-) diff --git a/apps/accounts/automations/change_secret/database/mysql/main.yml b/apps/accounts/automations/change_secret/database/mysql/main.yml index f36eff171..15648e76d 100644 --- a/apps/accounts/automations/change_secret/database/mysql/main.yml +++ b/apps/accounts/automations/change_secret/database/mysql/main.yml @@ -4,6 +4,9 @@ ansible_python_interpreter: /opt/py3/bin/python db_name: "{{ jms_asset.spec_info.db_name }}" check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Test MySQL connection @@ -13,9 +16,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" filter: version register: db_info @@ -30,9 +33,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" name: "{{ account.username }}" password: "{{ account.secret }}" host: "%" @@ -47,7 +50,7 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" filter: version diff --git a/apps/accounts/automations/change_secret/database/postgresql/main.yml b/apps/accounts/automations/change_secret/database/postgresql/main.yml index 9d55a898e..b73baac4a 100644 --- a/apps/accounts/automations/change_secret/database/postgresql/main.yml +++ b/apps/accounts/automations/change_secret/database/postgresql/main.yml @@ -2,6 +2,11 @@ gather_facts: no vars: ansible_python_interpreter: /opt/py3/bin/python + check_ssl: "{{ jms_asset.spec_info.use_ssl }}" + check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Test PostgreSQL connection @@ -11,6 +16,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" register: result failed_when: not result.is_available @@ -28,6 +37,10 @@ db: "{{ jms_asset.spec_info.db_name }}" name: "{{ account.username }}" password: "{{ account.secret }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" role_attr_flags: LOGIN ignore_errors: true when: result is succeeded @@ -39,3 +52,7 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" db: "{{ jms_asset.spec_info.db_name }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" diff --git a/apps/accounts/automations/gather_accounts/database/mysql/main.yml b/apps/accounts/automations/gather_accounts/database/mysql/main.yml index e36925209..92121189d 100644 --- a/apps/accounts/automations/gather_accounts/database/mysql/main.yml +++ b/apps/accounts/automations/gather_accounts/database/mysql/main.yml @@ -3,6 +3,9 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Get info @@ -12,9 +15,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" filter: users register: db_info diff --git a/apps/accounts/automations/gather_accounts/database/postgresql/main.yml b/apps/accounts/automations/gather_accounts/database/postgresql/main.yml index ce5ed181c..fd27ab132 100644 --- a/apps/accounts/automations/gather_accounts/database/postgresql/main.yml +++ b/apps/accounts/automations/gather_accounts/database/postgresql/main.yml @@ -2,6 +2,11 @@ gather_facts: no vars: ansible_python_interpreter: /opt/py3/bin/python + check_ssl: "{{ jms_asset.spec_info.use_ssl }}" + check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Get info @@ -11,6 +16,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" filter: "roles" register: db_info diff --git a/apps/accounts/automations/push_account/database/mysql/main.yml b/apps/accounts/automations/push_account/database/mysql/main.yml index f36eff171..15648e76d 100644 --- a/apps/accounts/automations/push_account/database/mysql/main.yml +++ b/apps/accounts/automations/push_account/database/mysql/main.yml @@ -4,6 +4,9 @@ ansible_python_interpreter: /opt/py3/bin/python db_name: "{{ jms_asset.spec_info.db_name }}" check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Test MySQL connection @@ -13,9 +16,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" filter: version register: db_info @@ -30,9 +33,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" name: "{{ account.username }}" password: "{{ account.secret }}" host: "%" @@ -47,7 +50,7 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" filter: version diff --git a/apps/accounts/automations/push_account/database/postgresql/main.yml b/apps/accounts/automations/push_account/database/postgresql/main.yml index 265401fbd..3678e4fe2 100644 --- a/apps/accounts/automations/push_account/database/postgresql/main.yml +++ b/apps/accounts/automations/push_account/database/postgresql/main.yml @@ -2,6 +2,11 @@ gather_facts: no vars: ansible_python_interpreter: /opt/py3/bin/python + check_ssl: "{{ jms_asset.spec_info.use_ssl }}" + check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Test PostgreSQL connection @@ -11,6 +16,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" register: result failed_when: not result.is_available @@ -28,6 +37,10 @@ db: "{{ jms_asset.spec_info.db_name }}" name: "{{ account.username }}" password: "{{ account.secret }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" role_attr_flags: LOGIN ignore_errors: true when: result is succeeded @@ -40,6 +53,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" db: "{{ jms_asset.spec_info.db_name }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" when: - result is succeeded - change_info is succeeded diff --git a/apps/accounts/automations/remove_account/database/mysql/main.yml b/apps/accounts/automations/remove_account/database/mysql/main.yml index a8700850f..07b84a58b 100644 --- a/apps/accounts/automations/remove_account/database/mysql/main.yml +++ b/apps/accounts/automations/remove_account/database/mysql/main.yml @@ -3,6 +3,9 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: "Remove account" @@ -12,8 +15,8 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" name: "{{ account.username }}" state: absent diff --git a/apps/accounts/automations/remove_account/database/postgresql/main.yml b/apps/accounts/automations/remove_account/database/postgresql/main.yml index 7004dc945..4738fcd04 100644 --- a/apps/accounts/automations/remove_account/database/postgresql/main.yml +++ b/apps/accounts/automations/remove_account/database/postgresql/main.yml @@ -2,6 +2,11 @@ gather_facts: no vars: ansible_python_interpreter: /opt/py3/bin/python + check_ssl: "{{ jms_asset.spec_info.use_ssl }}" + check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: "Remove account" @@ -12,4 +17,8 @@ login_port: "{{ jms_asset.port }}" db: "{{ jms_asset.spec_info.db_name }}" name: "{{ account.username }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" state: absent diff --git a/apps/accounts/automations/verify_account/database/mysql/main.yml b/apps/accounts/automations/verify_account/database/mysql/main.yml index e2768d2c2..ab6a4d33b 100644 --- a/apps/accounts/automations/verify_account/database/mysql/main.yml +++ b/apps/accounts/automations/verify_account/database/mysql/main.yml @@ -3,6 +3,9 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Verify account @@ -12,7 +15,7 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" filter: version diff --git a/apps/accounts/automations/verify_account/database/postgresql/main.yml b/apps/accounts/automations/verify_account/database/postgresql/main.yml index 564749425..24fdd6cb6 100644 --- a/apps/accounts/automations/verify_account/database/postgresql/main.yml +++ b/apps/accounts/automations/verify_account/database/postgresql/main.yml @@ -2,6 +2,11 @@ gather_facts: no vars: ansible_python_interpreter: /opt/py3/bin/python + check_ssl: "{{ jms_asset.spec_info.use_ssl }}" + check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Verify account @@ -11,5 +16,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" db: "{{ jms_asset.spec_info.db_name }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" register: result failed_when: not result.is_available diff --git a/apps/assets/automations/gather_facts/database/mysql/main.yml b/apps/assets/automations/gather_facts/database/mysql/main.yml index 348a2150d..24d0acde4 100644 --- a/apps/assets/automations/gather_facts/database/mysql/main.yml +++ b/apps/assets/automations/gather_facts/database/mysql/main.yml @@ -3,6 +3,9 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Get info @@ -12,9 +15,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" filter: version register: db_info diff --git a/apps/assets/automations/gather_facts/database/postgresql/main.yml b/apps/assets/automations/gather_facts/database/postgresql/main.yml index c35d2ab7b..e7bea6002 100644 --- a/apps/assets/automations/gather_facts/database/postgresql/main.yml +++ b/apps/assets/automations/gather_facts/database/postgresql/main.yml @@ -2,6 +2,11 @@ gather_facts: no vars: ansible_python_interpreter: /opt/py3/bin/python + check_ssl: "{{ jms_asset.spec_info.use_ssl }}" + check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Get info @@ -11,6 +16,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" register: db_info - name: Define info by set_fact diff --git a/apps/assets/automations/ping/database/mysql/main.yml b/apps/assets/automations/ping/database/mysql/main.yml index f99333bdb..2a05ee2ab 100644 --- a/apps/assets/automations/ping/database/mysql/main.yml +++ b/apps/assets/automations/ping/database/mysql/main.yml @@ -3,6 +3,9 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Test MySQL connection @@ -12,7 +15,7 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" check_hostname: "{{ check_ssl if check_ssl else omit }}" - ca_cert: "{{ jms_asset.secret_info.ca_cert | default(omit) if check_ssl else omit }}" - client_cert: "{{ jms_asset.secret_info.client_cert | default(omit) if check_ssl else omit }}" - client_key: "{{ jms_asset.secret_info.client_key | default(omit) if check_ssl else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" + client_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + client_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" filter: version diff --git a/apps/assets/automations/ping/database/postgresql/main.yml b/apps/assets/automations/ping/database/postgresql/main.yml index bf50d7a2b..3b29340e0 100644 --- a/apps/assets/automations/ping/database/postgresql/main.yml +++ b/apps/assets/automations/ping/database/postgresql/main.yml @@ -2,6 +2,11 @@ gather_facts: no vars: ansible_python_interpreter: /opt/py3/bin/python + check_ssl: "{{ jms_asset.spec_info.use_ssl }}" + check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" + ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" + ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" tasks: - name: Test PostgreSQL connection @@ -11,5 +16,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" + ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" + ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" + ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" register: result failed_when: not result.is_available From c2784c44adae38940f7ec77d55c5a07baa6b1cb1 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Wed, 4 Sep 2024 15:49:59 +0800 Subject: [PATCH 45/98] feat: LDAP HA --- apps/authentication/backends/ldap.py | 126 ++++++---- apps/i18n/core/zh/LC_MESSAGES/django.po | 274 +++++++++++++-------- apps/jumpserver/conf.py | 20 ++ apps/jumpserver/settings/auth.py | 41 ++- apps/settings/api/ldap.py | 6 +- apps/settings/api/settings.py | 1 + apps/settings/serializers/auth/__init__.py | 1 + apps/settings/serializers/auth/base.py | 1 + apps/settings/serializers/auth/ldap_ha.py | 94 +++++++ apps/settings/tasks/ldap.py | 115 ++++++--- apps/settings/utils/ldap.py | 68 ++--- apps/settings/ws.py | 67 +++-- apps/users/models/user/_source.py | 2 + 13 files changed, 564 insertions(+), 252 deletions(-) create mode 100644 apps/settings/serializers/auth/ldap_ha.py diff --git a/apps/authentication/backends/ldap.py b/apps/authentication/backends/ldap.py index 616052af2..26ae2bb31 100644 --- a/apps/authentication/backends/ldap.py +++ b/apps/authentication/backends/ldap.py @@ -1,6 +1,6 @@ # coding:utf-8 # - +import abc import ldap from django.conf import settings from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist @@ -15,13 +15,16 @@ from .base import JMSBaseAuthBackend logger = _LDAPConfig.get_logger() -class LDAPAuthorizationBackend(JMSBaseAuthBackend, LDAPBackend): - """ - Override this class to override _LDAPUser to LDAPUser - """ - @staticmethod - def is_enabled(): - return settings.AUTH_LDAP +class LDAPBaseBackend(LDAPBackend): + + @abc.abstractmethod + def is_enabled(self): + raise NotImplementedError('is_enabled') + + @property + @abc.abstractmethod + def is_user_login_only_in_users(self): + raise NotImplementedError('is_authenticated') def get_or_build_user(self, username, ldap_user): """ @@ -56,38 +59,6 @@ class LDAPAuthorizationBackend(JMSBaseAuthBackend, LDAPBackend): return user, built - def pre_check(self, username, password): - if not settings.AUTH_LDAP: - error = 'Not enabled auth ldap' - return False, error - if not username: - error = 'Username is None' - return False, error - if not password: - error = 'Password is None' - return False, error - if settings.AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS: - user_model = self.get_user_model() - exist = user_model.objects.filter(username=username).exists() - if not exist: - error = 'user ({}) is not in the user list'.format(username) - return False, error - return True, '' - - def authenticate(self, request=None, username=None, password=None, **kwargs): - logger.info('Authentication LDAP backend') - if username is None or password is None: - logger.info('No username or password') - return None - match, msg = self.pre_check(username, password) - if not match: - logger.info('Authenticate failed: {}'.format(msg)) - return None - ldap_user = LDAPUser(self, username=username.strip(), request=request) - user = self.authenticate_ldap_user(ldap_user, password) - logger.info('Authenticate user: {}'.format(user)) - return user if self.user_can_authenticate(user) else None - def get_user(self, user_id): user = None try: @@ -111,6 +82,67 @@ class LDAPAuthorizationBackend(JMSBaseAuthBackend, LDAPBackend): user = ldap_user.populate_user() return user + def authenticate(self, request=None, username=None, password=None, **kwargs): + logger.info('Authentication LDAP backend') + if username is None or password is None: + logger.info('No username or password') + return None + match, msg = self.pre_check(username, password) + if not match: + logger.info('Authenticate failed: {}'.format(msg)) + return None + ldap_user = LDAPUser(self, username=username.strip(), request=request) + user = self.authenticate_ldap_user(ldap_user, password) + logger.info('Authenticate user: {}'.format(user)) + return user if self.user_can_authenticate(user) else None + + def pre_check(self, username, password): + if not self.is_enabled(): + error = 'Not enabled auth ldap' + return False, error + if not username: + error = 'Username is None' + return False, error + if not password: + error = 'Password is None' + return False, error + if self.is_user_login_only_in_users: + user_model = self.get_user_model() + exist = user_model.objects.filter(username=username).exists() + if not exist: + error = 'user ({}) is not in the user list'.format(username) + return False, error + return True, '' + + +class LDAPAuthorizationBackend(JMSBaseAuthBackend, LDAPBaseBackend): + """ + Override this class to override _LDAPUser to LDAPUser + """ + + @staticmethod + def is_enabled(): + return settings.AUTH_LDAP + + @property + def is_user_login_only_in_users(self): + return settings.AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS + + +class LDAPHAAuthorizationBackend(JMSBaseAuthBackend, LDAPBaseBackend): + """ + Override this class to override _LDAPUser to LDAPUser + """ + settings_prefix = "AUTH_LDAP_HA_" + + @staticmethod + def is_enabled(): + return settings.AUTH_LDAP_HA + + @property + def is_user_login_only_in_users(self): + return settings.AUTH_LDAP_HA_USER_LOGIN_ONLY_IN_USERS + class LDAPUser(_LDAPUser): @@ -126,13 +158,18 @@ class LDAPUser(_LDAPUser): configuration in the settings.py file is configured with a `lambda` problem value """ - + if isinstance(self.backend, LDAPAuthorizationBackend): + search_filter = settings.AUTH_LDAP_SEARCH_FILTER + search_ou = settings.AUTH_LDAP_SEARCH_OU + else: + search_filter = settings.AUTH_LDAP_HA_SEARCH_FILTER + search_ou = settings.AUTH_LDAP_HA_SEARCH_OU user_search_union = [ LDAPSearch( USER_SEARCH, ldap.SCOPE_SUBTREE, - settings.AUTH_LDAP_SEARCH_FILTER + search_filter ) - for USER_SEARCH in str(settings.AUTH_LDAP_SEARCH_OU).split("|") + for USER_SEARCH in str(search_ou).split("|") ] search = LDAPSearchUnion(*user_search_union) @@ -169,7 +206,8 @@ class LDAPUser(_LDAPUser): else: value = is_true(value) except LookupError: - logger.warning("{} does not have a value for the attribute {}".format(self.dn, attr)) + logger.warning( + "{} does not have a value for the attribute {}".format(self.dn, attr)) else: if not hasattr(self._user, field): continue diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 0699f9316..2beb7c7eb 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-10 16:58+0800\n" +"POT-Creation-Date: 2024-09-11 18:15+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -124,9 +124,10 @@ msgstr "成功: %s, 失败: %s, 总数: %s" #: authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 -#: settings/serializers/msg.py:37 settings/serializers/terminal.py:28 -#: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142 -#: users/forms/profile.py:21 users/serializers/user.py:144 +#: settings/serializers/auth/ldap_ha.py:34 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: terminal/serializers/storage.py:142 users/forms/profile.py:21 +#: users/serializers/user.py:144 #: users/templates/users/_msg_user_created.html:13 #: users/templates/users/user_password_verify.html:18 #: xpack/plugins/cloud/serializers/account_attrs.py:28 @@ -549,7 +550,8 @@ msgstr "SSH 密钥推送方式" #: accounts/models/automations/gather_account.py:58 #: accounts/serializers/account/backup.py:40 #: accounts/serializers/automations/change_secret.py:58 -#: settings/serializers/auth/ldap.py:100 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:100 +#: settings/serializers/auth/ldap_ha.py:82 settings/serializers/msg.py:45 msgid "Recipient" msgstr "收件人" @@ -707,8 +709,8 @@ msgstr "密码规则" #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 #: authentication/serializers/connect_token_secret.py:169 labels/models.py:11 -#: ops/mixin.py:28 ops/models/adhoc.py:20 ops/models/celery.py:15 -#: ops/models/celery.py:81 ops/models/job.py:142 ops/models/playbook.py:28 +#: ops/mixin.py:28 ops/models/adhoc.py:19 ops/models/celery.py:15 +#: ops/models/celery.py:81 ops/models/job.py:142 ops/models/playbook.py:30 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 @@ -1037,8 +1039,8 @@ msgid "" msgstr "关联平台,可配置推送参数,如果不关联,将使用默认参数" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 -#: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 +#: ops/models/job.py:158 ops/models/playbook.py:33 rbac/models/role.py:37 #: settings/models.py:40 terminal/models/applet/applet.py:46 #: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 #: terminal/models/component/endpoint.py:25 @@ -2974,9 +2976,9 @@ msgstr "用户会话" msgid "Offline user session" msgstr "下线用户会话" -#: audits/serializers.py:33 ops/models/adhoc.py:25 ops/models/base.py:16 +#: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 #: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:151 -#: ops/models/job.py:240 ops/models/playbook.py:30 +#: ops/models/job.py:240 ops/models/playbook.py:32 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "创建者" @@ -3031,7 +3033,7 @@ msgstr "认证令牌" #: audits/signal_handlers/login_log.py:37 authentication/notifications.py:73 #: authentication/views/login.py:78 notifications/backends/__init__.py:11 #: settings/serializers/auth/wecom.py:11 settings/serializers/auth/wecom.py:16 -#: users/models/user/__init__.py:122 users/models/user/_source.py:18 +#: users/models/user/__init__.py:122 users/models/user/_source.py:19 msgid "WeCom" msgstr "企业微信" @@ -3039,21 +3041,21 @@ msgstr "企业微信" #: authentication/views/login.py:90 notifications/backends/__init__.py:14 #: settings/serializers/auth/feishu.py:12 #: settings/serializers/auth/feishu.py:14 users/models/user/__init__.py:128 -#: users/models/user/_source.py:20 +#: users/models/user/_source.py:21 msgid "FeiShu" msgstr "飞书" #: audits/signal_handlers/login_log.py:40 authentication/views/login.py:102 #: authentication/views/slack.py:79 notifications/backends/__init__.py:16 #: settings/serializers/auth/slack.py:11 settings/serializers/auth/slack.py:13 -#: users/models/user/__init__.py:134 users/models/user/_source.py:22 +#: users/models/user/__init__.py:134 users/models/user/_source.py:23 msgid "Slack" msgstr "Slack" #: audits/signal_handlers/login_log.py:41 authentication/views/dingtalk.py:151 #: authentication/views/login.py:84 notifications/backends/__init__.py:12 #: settings/serializers/auth/dingtalk.py:11 users/models/user/__init__.py:125 -#: users/models/user/_source.py:19 +#: users/models/user/_source.py:20 msgid "DingTalk" msgstr "钉钉" @@ -3500,7 +3502,7 @@ msgstr "设置手机号码启用" msgid "Clear phone number to disable" msgstr "清空手机号码禁用" -#: authentication/middleware.py:94 settings/utils/ldap.py:681 +#: authentication/middleware.py:94 settings/utils/ldap.py:691 msgid "Authentication failed (before login check failed): {}" msgstr "认证失败 (登录前检查失败): {}" @@ -3818,7 +3820,7 @@ msgstr "代码错误" #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:502 +#: jumpserver/conf.py:522 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4578,16 +4580,16 @@ msgstr "不能包含特殊字符" msgid "The mobile phone number format is incorrect" msgstr "手机号格式不正确" -#: jumpserver/conf.py:496 +#: jumpserver/conf.py:516 #, python-brace-format msgid "The verification code is: {code}" msgstr "验证码为: {code}" -#: jumpserver/conf.py:501 +#: jumpserver/conf.py:521 msgid "Create account successfully" msgstr "创建账号成功" -#: jumpserver/conf.py:503 +#: jumpserver/conf.py:523 msgid "Your account has been created successfully" msgstr "你的账号已创建成功" @@ -4749,31 +4751,31 @@ msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "正在创建任务,无法中断,请稍后重试。" -#: ops/api/playbook.py:39 +#: ops/api/playbook.py:50 msgid "Currently playbook is being used in a job" msgstr "当前 playbook 正在作业中使用" -#: ops/api/playbook.py:97 +#: ops/api/playbook.py:113 msgid "Unsupported file content" msgstr "不支持的文件内容" -#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193 +#: ops/api/playbook.py:115 ops/api/playbook.py:161 ops/api/playbook.py:209 msgid "Invalid file path" msgstr "无效的文件路径" -#: ops/api/playbook.py:171 +#: ops/api/playbook.py:187 msgid "This file can not be rename" msgstr "该文件不能重命名" -#: ops/api/playbook.py:190 +#: ops/api/playbook.py:206 msgid "File already exists" msgstr "文件已存在" -#: ops/api/playbook.py:208 +#: ops/api/playbook.py:224 msgid "File key is required" msgstr "文件密钥该字段是必填项。" -#: ops/api/playbook.py:211 +#: ops/api/playbook.py:227 msgid "This file can not be delete" msgstr "无法删除此文件" @@ -4817,7 +4819,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "命令" -#: ops/const.py:39 ops/models/job.py:149 ops/models/playbook.py:88 +#: ops/const.py:39 ops/models/job.py:149 ops/models/playbook.py:91 msgid "Playbook" msgstr "Playbook" @@ -4881,21 +4883,31 @@ msgstr "超时" msgid "Command execution disabled" msgstr "命令执行已禁用" +#: ops/const.py:86 +msgctxt "scope" +msgid "Public" +msgstr "公有 + +#: ops/const.py:87 +msgid "Private" +msgstr "私有" + #: ops/exception.py:6 msgid "no valid program entry found." msgstr "没有可用程序入口" #: ops/mixin.py:30 ops/mixin.py:110 settings/serializers/auth/ldap.py:73 +#: settings/serializers/auth/ldap_ha.py:55 msgid "Periodic run" msgstr "周期执行" #: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116 -#: settings/serializers/auth/ldap.py:80 +#: settings/serializers/auth/ldap.py:80 settings/serializers/auth/ldap_ha.py:62 msgid "Interval" msgstr "间隔" #: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113 -#: settings/serializers/auth/ldap.py:77 +#: settings/serializers/auth/ldap.py:77 settings/serializers/auth/ldap_ha.py:59 msgid "Crontab" msgstr "Crontab" @@ -4915,19 +4927,25 @@ msgstr "输入在 {} - {} 范围之间" msgid "Require interval or crontab setting" msgstr "需要周期或定期设置" -#: ops/models/adhoc.py:21 +#: ops/models/adhoc.py:20 msgid "Pattern" msgstr "模式" -#: ops/models/adhoc.py:23 ops/models/job.py:146 +#: ops/models/adhoc.py:22 ops/models/job.py:146 msgid "Module" msgstr "模块" -#: ops/models/adhoc.py:24 ops/models/celery.py:82 ops/models/job.py:144 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:144 #: terminal/models/component/task.py:14 msgid "Args" msgstr "参数" +#: ops/models/adhoc.py:26 ops/models/playbook.py:36 ops/serializers/mixin.py:10 +#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 +#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 +msgid "Scope" +msgstr "范围" + #: ops/models/base.py:19 msgid "Account policy" msgstr "账号策略" @@ -5015,11 +5033,11 @@ msgstr "Material 类型" msgid "Job Execution" msgstr "作业执行" -#: ops/models/playbook.py:33 +#: ops/models/playbook.py:35 msgid "CreateMethod" msgstr "创建方式" -#: ops/models/playbook.py:34 +#: ops/models/playbook.py:37 msgid "VCS URL" msgstr "VCS URL" @@ -5262,7 +5280,7 @@ msgstr "请选择一个组织后再保存" #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91 #: rbac/const.py:7 rbac/models/rolebinding.py:56 -#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:52 +#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 #: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 @@ -5578,11 +5596,6 @@ msgstr "内容类型" msgid "Permissions" msgstr "授权" -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 -msgid "Scope" -msgstr "范围" - #: rbac/models/role.py:46 rbac/models/rolebinding.py:52 #: users/models/user/__init__.py:66 msgid "Role" @@ -5736,7 +5749,7 @@ msgstr "邮件已经发送{}, 请检查" msgid "Test smtp setting" msgstr "测试 smtp 设置" -#: settings/api/ldap.py:90 +#: settings/api/ldap.py:92 msgid "" "Users are not synchronized, please click the user synchronization button" msgstr "用户未同步,请点击同步用户按钮" @@ -5834,58 +5847,62 @@ msgid "LDAP Auth" msgstr "LDAP 认证" #: settings/serializers/auth/base.py:14 +msgid "LDAP Auth HA" +msgstr "LDAP HA 认证" + +#: settings/serializers/auth/base.py:15 msgid "CAS Auth" msgstr "CAS 认证" -#: settings/serializers/auth/base.py:15 +#: settings/serializers/auth/base.py:16 msgid "OPENID Auth" msgstr "OIDC 认证" -#: settings/serializers/auth/base.py:16 +#: settings/serializers/auth/base.py:17 msgid "SAML2 Auth" msgstr "SAML2 认证" -#: settings/serializers/auth/base.py:17 +#: settings/serializers/auth/base.py:18 msgid "OAuth2 Auth" msgstr "OAuth2 认证" -#: settings/serializers/auth/base.py:18 +#: settings/serializers/auth/base.py:19 msgid "RADIUS Auth" msgstr "RADIUS 认证" -#: settings/serializers/auth/base.py:19 +#: settings/serializers/auth/base.py:20 msgid "DingTalk Auth" msgstr "钉钉 认证" -#: settings/serializers/auth/base.py:20 +#: settings/serializers/auth/base.py:21 msgid "FeiShu Auth" msgstr "飞书 认证" -#: settings/serializers/auth/base.py:21 +#: settings/serializers/auth/base.py:22 msgid "Lark Auth" msgstr "Lark 认证" -#: settings/serializers/auth/base.py:22 +#: settings/serializers/auth/base.py:23 msgid "Slack Auth" msgstr "Slack 认证" -#: settings/serializers/auth/base.py:23 +#: settings/serializers/auth/base.py:24 msgid "WeCom Auth" msgstr "企业微信 认证" -#: settings/serializers/auth/base.py:24 +#: settings/serializers/auth/base.py:25 msgid "SSO Auth" msgstr "SSO 令牌认证" -#: settings/serializers/auth/base.py:25 +#: settings/serializers/auth/base.py:26 msgid "Passkey Auth" msgstr "Passkey 认证" -#: settings/serializers/auth/base.py:27 +#: settings/serializers/auth/base.py:28 msgid "Email suffix" msgstr "邮件后缀" -#: settings/serializers/auth/base.py:29 +#: settings/serializers/auth/base.py:30 msgid "" "After third-party user authentication is successful, if the third-party " "authentication service platform does not return the user's email " @@ -5895,19 +5912,19 @@ msgstr "" "第三方用户认证成功后,若第三方认证服务平台未返回该用户的邮箱信息,系统将自动" "以此邮箱后缀创建用户" -#: settings/serializers/auth/base.py:36 +#: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" msgstr "忘记密码链接" -#: settings/serializers/auth/base.py:37 +#: settings/serializers/auth/base.py:38 msgid "The URL for Forgotten Password on the user login page" msgstr "用户登录页面忘记密码的 URL" -#: settings/serializers/auth/base.py:40 +#: settings/serializers/auth/base.py:41 msgid "Login redirection" msgstr "启用登录跳转提示" -#: settings/serializers/auth/base.py:42 +#: settings/serializers/auth/base.py:43 msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " @@ -5916,7 +5933,7 @@ msgstr "" "当管理员启用第三方重定向身份验证时,在用户重定向到第三方身份验证之前是否显示 " "Flash 页面" -#: settings/serializers/auth/base.py:54 +#: settings/serializers/auth/base.py:55 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." @@ -5928,7 +5945,7 @@ msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 -#: settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:26 settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "服务端地址" @@ -5955,9 +5972,10 @@ msgstr "启用属性映射" #: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 -#: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 -#: settings/serializers/auth/slack.py:18 settings/serializers/auth/wecom.py:18 +#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/ldap_ha.py:48 +#: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 +#: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 +#: settings/serializers/auth/wecom.py:18 msgid "User attribute" msgstr "映射属性" @@ -5999,7 +6017,7 @@ msgstr "" "用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是飞书服务用户属" "性名称" -#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:21 +#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22 msgid "Lark" msgstr "" @@ -6019,38 +6037,38 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "LDAP 服务域名" -#: settings/serializers/auth/ldap.py:48 +#: settings/serializers/auth/ldap.py:48 settings/serializers/auth/ldap_ha.py:30 msgid "Bind DN" msgstr "绑定 DN" -#: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:31 msgid "Binding Distinguished Name" msgstr "绑定目录管理员" -#: settings/serializers/auth/ldap.py:53 +#: settings/serializers/auth/ldap.py:53 settings/serializers/auth/ldap_ha.py:35 msgid "Binding password" msgstr "绑定密码" -#: settings/serializers/auth/ldap.py:56 +#: settings/serializers/auth/ldap.py:56 settings/serializers/auth/ldap_ha.py:38 msgid "Search OU" msgstr "用户 OU" -#: settings/serializers/auth/ldap.py:58 +#: settings/serializers/auth/ldap.py:58 settings/serializers/auth/ldap_ha.py:40 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "用户搜索库,如果有多个OU,可以用`|`符号分隔" -#: settings/serializers/auth/ldap.py:62 +#: settings/serializers/auth/ldap.py:62 settings/serializers/auth/ldap_ha.py:44 msgid "Search filter" msgstr "用户过滤器" -#: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:45 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "可能的选项是(cn或uid或sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:68 +#: settings/serializers/auth/ldap.py:68 settings/serializers/auth/ldap_ha.py:50 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" @@ -6058,11 +6076,11 @@ msgstr "" "用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 LDAP 服务用户" "属性名称" -#: settings/serializers/auth/ldap.py:84 +#: settings/serializers/auth/ldap.py:84 settings/serializers/auth/ldap_ha.py:66 msgid "Connect timeout (s)" msgstr "连接超时时间 (秒)" -#: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap.py:89 settings/serializers/auth/ldap_ha.py:71 msgid "User DN cache timeout (s)" msgstr "User DN 缓存超时时间 (秒)" @@ -6076,10 +6094,29 @@ msgstr "" "对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度
如果" "用户 OU 架构有调整,点击提交即可清除用户 DN 缓存" -#: settings/serializers/auth/ldap.py:97 +#: settings/serializers/auth/ldap.py:97 settings/serializers/auth/ldap_ha.py:79 msgid "Search paged size (piece)" msgstr "搜索分页数量 (条)" +#: settings/serializers/auth/ldap_ha.py:23 +#: settings/serializers/auth/ldap_ha.py:85 +msgid "LDAP HA" +msgstr "LDAP 认证" + +#: settings/serializers/auth/ldap_ha.py:27 +msgid "LDAP HA server URI" +msgstr "LDAP HA 服务域名" + +#: settings/serializers/auth/ldap_ha.py:73 +msgid "" +"Caching the User DN obtained during user login authentication can " +"effectivelyimprove the speed of user authentication., 0 means no cache
If " +"the user OU structure has been adjusted, click Submit to clear the user DN " +"cache" +msgstr "" +"对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度
如果" +"用户 OU 架构有调整,点击提交即可清除用户 DN 缓存" + #: settings/serializers/auth/oauth2.py:19 #: settings/serializers/auth/oauth2.py:22 msgid "OAuth2" @@ -7085,11 +7122,11 @@ msgid "" "in the workbench" msgstr "*! 如果启用,具有 RBAC 权限的用户将能够使用工作台中的所有工具" -#: settings/tasks/ldap.py:29 +#: settings/tasks/ldap.py:72 msgid "Periodic import ldap user" msgstr "周期导入 LDAP 用户" -#: settings/tasks/ldap.py:31 +#: settings/tasks/ldap.py:74 settings/tasks/ldap.py:86 msgid "" "\n" " When LDAP auto-sync is configured, this task will be invoked to " @@ -7099,11 +7136,16 @@ msgstr "" "\n" "当设置了LDAP自动同步,将调用该任务进行用户同步" -#: settings/tasks/ldap.py:74 +#: settings/tasks/ldap.py:84 + +msgid "Periodic import ldap ha user" +msgstr "周期导入 LDAP HA 用户" + +#: settings/tasks/ldap.py:120 msgid "Registration periodic import ldap user task" msgstr "注册周期导入 LDAP 用户 任务" -#: settings/tasks/ldap.py:76 +#: settings/tasks/ldap.py:122 msgid "" "\n" " When LDAP auto-sync parameters change, such as Crontab parameters, " @@ -7113,7 +7155,23 @@ msgid "" msgstr "" "\n" "当设置了LDAP自动同步参数发生变化时,比如Crontab参数,重新注册或更新ldap同步任" -"务调用该任务" +"务将调用该任务" + +#: settings/tasks/ldap.py:138 +msgid "Registration periodic import ldap ha user task" +msgstr "注册周期导入 LDAP HA 用户 任务" + +#: settings/tasks/ldap.py:140 +msgid "" +"\n" +" When LDAP HA auto-sync parameters change, such as Crontab " +"parameters, the LDAP HA sync task \n" +" will be re-registered or updated, and this task will be invoked\n" +" " +msgstr "" +"\n" +"当设置了LDAP HA 自动同步参数发生变化时,比如Crontab参数,重新注册或更新ldap ha 同步任" +"务将调用该任务" #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" @@ -7131,108 +7189,108 @@ msgstr "已同步用户" msgid "No user synchronization required" msgstr "没有用户需要同步" -#: settings/utils/ldap.py:496 +#: settings/utils/ldap.py:509 msgid "ldap:// or ldaps:// protocol is used." msgstr "使用 ldap:// 或 ldaps:// 协议" -#: settings/utils/ldap.py:507 +#: settings/utils/ldap.py:520 msgid "Host or port is disconnected: {}" msgstr "主机或端口不可连接: {}" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:522 msgid "The port is not the port of the LDAP service: {}" msgstr "端口不是LDAP服务端口: {}" -#: settings/utils/ldap.py:511 +#: settings/utils/ldap.py:524 msgid "Please add certificate: {}" msgstr "请添加证书" -#: settings/utils/ldap.py:515 settings/utils/ldap.py:542 -#: settings/utils/ldap.py:572 settings/utils/ldap.py:600 +#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 +#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 msgid "Unknown error: {}" msgstr "未知错误: {}" -#: settings/utils/ldap.py:529 +#: settings/utils/ldap.py:542 msgid "Bind DN or Password incorrect" msgstr "绑定DN或密码错误" -#: settings/utils/ldap.py:536 +#: settings/utils/ldap.py:549 msgid "Please enter Bind DN: {}" msgstr "请输入绑定DN: {}" -#: settings/utils/ldap.py:538 +#: settings/utils/ldap.py:551 msgid "Please enter Password: {}" msgstr "请输入密码: {}" -#: settings/utils/ldap.py:540 +#: settings/utils/ldap.py:553 msgid "Please enter correct Bind DN and Password: {}" msgstr "请输入正确的绑定DN和密码: {}" -#: settings/utils/ldap.py:558 +#: settings/utils/ldap.py:571 msgid "Invalid User OU or User search filter: {}" msgstr "不合法的用户OU或用户过滤器: {}" -#: settings/utils/ldap.py:589 +#: settings/utils/ldap.py:602 msgid "LDAP User attr map not include: {}" msgstr "LDAP属性映射没有包含: {}" -#: settings/utils/ldap.py:596 +#: settings/utils/ldap.py:609 msgid "LDAP User attr map is not dict" msgstr "LDAP属性映射不合法" -#: settings/utils/ldap.py:615 +#: settings/utils/ldap.py:628 msgid "LDAP authentication is not enabled" msgstr "LDAP认证没有启用" -#: settings/utils/ldap.py:633 +#: settings/utils/ldap.py:646 msgid "Error (Invalid LDAP server): {}" msgstr "错误 (不合法的LDAP服务器地址): {}" -#: settings/utils/ldap.py:635 +#: settings/utils/ldap.py:648 msgid "Error (Invalid Bind DN): {}" msgstr "错误 (不合法的绑定DN): {}" -#: settings/utils/ldap.py:637 +#: settings/utils/ldap.py:650 msgid "Error (Invalid LDAP User attr map): {}" msgstr "错误 (不合法的LDAP属性映射): {}" -#: settings/utils/ldap.py:639 +#: settings/utils/ldap.py:652 msgid "Error (Invalid User OU or User search filter): {}" msgstr "错误 (不合法的用户OU或用户过滤器): {}" -#: settings/utils/ldap.py:641 +#: settings/utils/ldap.py:654 msgid "Error (Not enabled LDAP authentication): {}" msgstr "错误 (没有启用LDAP认证): {}" -#: settings/utils/ldap.py:643 +#: settings/utils/ldap.py:656 msgid "Error (Unknown): {}" msgstr "错误 (未知): {}" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:659 msgid "Succeed: Match {} users" msgstr "成功匹配 {} 个用户" -#: settings/utils/ldap.py:679 +#: settings/utils/ldap.py:689 msgid "Authentication failed (configuration incorrect): {}" msgstr "认证失败 (配置错误): {}" -#: settings/utils/ldap.py:683 +#: settings/utils/ldap.py:693 msgid "Authentication failed (username or password incorrect): {}" msgstr "认证失败 (用户名或密码不正确): {}" -#: settings/utils/ldap.py:685 +#: settings/utils/ldap.py:695 msgid "Authentication failed (Unknown): {}" msgstr "认证失败: (未知): {}" -#: settings/utils/ldap.py:688 +#: settings/utils/ldap.py:698 msgid "Authentication success: {}" msgstr "认证成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:201 msgid "No LDAP user was found" msgstr "没有获取到 LDAP 用户" -#: settings/ws.py:209 +#: settings/ws.py:207 msgid "Total {}, success {}, failure {}" msgstr "总共 {},成功 {},失败 {}" diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index c352f7739..0e5843560 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -288,6 +288,26 @@ class Config(dict): 'AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS': False, 'AUTH_LDAP_OPTIONS_OPT_REFERRALS': -1, + # Auth LDAP HA settings + 'AUTH_LDAP_HA': False, + 'AUTH_LDAP_HA_SERVER_URI': 'ldap://localhost:389', + 'AUTH_LDAP_HA_BIND_DN': 'cn=admin,dc=jumpserver,dc=org', + 'AUTH_LDAP_HA_BIND_PASSWORD': '', + 'AUTH_LDAP_HA_SEARCH_OU': 'ou=tech,dc=jumpserver,dc=org', + 'AUTH_LDAP_HA_SEARCH_FILTER': '(cn=%(user)s)', + 'AUTH_LDAP_HA_START_TLS': False, + 'AUTH_LDAP_HA_USER_ATTR_MAP': {"username": "cn", "name": "sn", "email": "mail"}, + 'AUTH_LDAP_HA_CONNECT_TIMEOUT': 10, + 'AUTH_LDAP_HA_CACHE_TIMEOUT': 3600 * 24 * 30, + 'AUTH_LDAP_HA_SEARCH_PAGED_SIZE': 1000, + 'AUTH_LDAP_HA_SYNC_IS_PERIODIC': False, + 'AUTH_LDAP_HA_SYNC_INTERVAL': None, + 'AUTH_LDAP_HA_SYNC_CRONTAB': None, + 'AUTH_LDAP_HA_SYNC_ORG_IDS': [DEFAULT_ID], + 'AUTH_LDAP_HA_SYNC_RECEIVERS': [], + 'AUTH_LDAP_HA_USER_LOGIN_ONLY_IN_USERS': False, + 'AUTH_LDAP_HA_OPTIONS_OPT_REFERRALS': -1, + # OpenID 配置参数 # OpenID 公有配置参数 (version <= 1.5.8 或 version >= 1.5.8) 'AUTH_OPENID': False, diff --git a/apps/jumpserver/settings/auth.py b/apps/jumpserver/settings/auth.py index c75a2f275..2385962b1 100644 --- a/apps/jumpserver/settings/auth.py +++ b/apps/jumpserver/settings/auth.py @@ -53,6 +53,44 @@ AUTH_LDAP_SYNC_ORG_IDS = CONFIG.AUTH_LDAP_SYNC_ORG_IDS AUTH_LDAP_SYNC_RECEIVERS = CONFIG.AUTH_LDAP_SYNC_RECEIVERS AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS = CONFIG.AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS +# Auth LDAP HA settings +AUTH_LDAP_HA = CONFIG.AUTH_LDAP_HA +AUTH_LDAP_HA_SERVER_URI = CONFIG.AUTH_LDAP_HA_SERVER_URI +AUTH_LDAP_HA_BIND_DN = CONFIG.AUTH_LDAP_HA_BIND_DN +AUTH_LDAP_HA_BIND_PASSWORD = CONFIG.AUTH_LDAP_HA_BIND_PASSWORD +AUTH_LDAP_HA_SEARCH_OU = CONFIG.AUTH_LDAP_HA_SEARCH_OU +AUTH_LDAP_HA_SEARCH_FILTER = CONFIG.AUTH_LDAP_HA_SEARCH_FILTER +AUTH_LDAP_HA_START_TLS = CONFIG.AUTH_LDAP_HA_START_TLS +AUTH_LDAP_HA_USER_ATTR_MAP = CONFIG.AUTH_LDAP_HA_USER_ATTR_MAP +AUTH_LDAP_HA_USER_QUERY_FIELD = 'username' +AUTH_LDAP_HA_GLOBAL_OPTIONS = { + ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_NEVER, + ldap.OPT_REFERRALS: CONFIG.AUTH_LDAP_HA_OPTIONS_OPT_REFERRALS +} +LDAP_HA_CACERT_FILE = os.path.join(PROJECT_DIR, "data", "certs", "ldap_ha_ca.pem") +if os.path.isfile(LDAP_HA_CACERT_FILE): + AUTH_LDAP_HA_GLOBAL_OPTIONS[ldap.OPT_X_TLS_CACERTFILE] = LDAP_CACERT_FILE +LDAP_HA_CERT_FILE = os.path.join(PROJECT_DIR, "data", "certs", "ldap_ha_cert.pem") +if os.path.isfile(LDAP_HA_CERT_FILE): + AUTH_LDAP_HA_GLOBAL_OPTIONS[ldap.OPT_X_TLS_CERTFILE] = LDAP_HA_CERT_FILE +LDAP_HA_KEY_FILE = os.path.join(PROJECT_DIR, "data", "certs", "ldap_ha_cert.key") +if os.path.isfile(LDAP_HA_KEY_FILE): + AUTH_LDAP_HA_GLOBAL_OPTIONS[ldap.OPT_X_TLS_KEYFILE] = LDAP_HA_KEY_FILE +AUTH_LDAP_HA_CONNECTION_OPTIONS = { + ldap.OPT_TIMEOUT: CONFIG.AUTH_LDAP_HA_CONNECT_TIMEOUT, + ldap.OPT_NETWORK_TIMEOUT: CONFIG.AUTH_LDAP_HA_CONNECT_TIMEOUT +} +AUTH_LDAP_HA_CACHE_TIMEOUT = CONFIG.AUTH_LDAP_HA_CACHE_TIMEOUT +AUTH_LDAP_HA_ALWAYS_UPDATE_USER = True + +AUTH_LDAP_HA_SEARCH_PAGED_SIZE = CONFIG.AUTH_LDAP_HA_SEARCH_PAGED_SIZE +AUTH_LDAP_HA_SYNC_IS_PERIODIC = CONFIG.AUTH_LDAP_HA_SYNC_IS_PERIODIC +AUTH_LDAP_HA_SYNC_INTERVAL = CONFIG.AUTH_LDAP_HA_SYNC_INTERVAL +AUTH_LDAP_HA_SYNC_CRONTAB = CONFIG.AUTH_LDAP_HA_SYNC_CRONTAB +AUTH_LDAP_HA_SYNC_ORG_IDS = CONFIG.AUTH_LDAP_HA_SYNC_ORG_IDS +AUTH_LDAP_HA_SYNC_RECEIVERS = CONFIG.AUTH_LDAP_HA_SYNC_RECEIVERS +AUTH_LDAP_HA_USER_LOGIN_ONLY_IN_USERS = CONFIG.AUTH_LDAP_HA_USER_LOGIN_ONLY_IN_USERS + # ============================================================================== # 认证 OpenID 配置参数 # 参考: https://django-oidc-rp.readthedocs.io/en/stable/settings.html @@ -212,6 +250,7 @@ RBAC_BACKEND = 'rbac.backends.RBACBackend' AUTH_BACKEND_MODEL = 'authentication.backends.base.JMSModelBackend' AUTH_BACKEND_PUBKEY = 'authentication.backends.pubkey.PublicKeyAuthBackend' AUTH_BACKEND_LDAP = 'authentication.backends.ldap.LDAPAuthorizationBackend' +AUTH_BACKEND_LDAP_HA = 'authentication.backends.ldap.LDAPHAAuthorizationBackend' AUTH_BACKEND_OIDC_PASSWORD = 'authentication.backends.oidc.OIDCAuthPasswordBackend' AUTH_BACKEND_OIDC_CODE = 'authentication.backends.oidc.OIDCAuthCodeBackend' AUTH_BACKEND_RADIUS = 'authentication.backends.radius.RadiusBackend' @@ -232,7 +271,7 @@ AUTHENTICATION_BACKENDS = [ # 只做权限校验 RBAC_BACKEND, # 密码形式 - AUTH_BACKEND_MODEL, AUTH_BACKEND_PUBKEY, AUTH_BACKEND_LDAP, AUTH_BACKEND_RADIUS, + AUTH_BACKEND_MODEL, AUTH_BACKEND_PUBKEY, AUTH_BACKEND_LDAP, AUTH_BACKEND_LDAP_HA, AUTH_BACKEND_RADIUS, # 跳转形式 AUTH_BACKEND_CAS, AUTH_BACKEND_OIDC_PASSWORD, AUTH_BACKEND_OIDC_CODE, AUTH_BACKEND_SAML2, AUTH_BACKEND_OAUTH2, diff --git a/apps/settings/api/ldap.py b/apps/settings/api/ldap.py index 3c596cf19..1f853060b 100644 --- a/apps/settings/api/ldap.py +++ b/apps/settings/api/ldap.py @@ -26,12 +26,14 @@ class LDAPUserListApi(generics.ListAPIView): def get_queryset_from_cache(self): search_value = self.request.query_params.get('search') - users = LDAPCacheUtil().search(search_value=search_value) + category = self.request.query_params.get('category') + users = LDAPCacheUtil(category=category).search(search_value=search_value) return users def get_queryset_from_server(self): search_value = self.request.query_params.get('search') - users = LDAPServerUtil().search(search_value=search_value) + category = self.request.query_params.get('category') + users = LDAPServerUtil(category=category).search(search_value=search_value) return users def get_queryset(self): diff --git a/apps/settings/api/settings.py b/apps/settings/api/settings.py index d543bbb2c..dfd5653d7 100644 --- a/apps/settings/api/settings.py +++ b/apps/settings/api/settings.py @@ -36,6 +36,7 @@ class SettingsApi(generics.RetrieveUpdateAPIView): 'security_password': serializers.SecurityPasswordRuleSerializer, 'security_login_limit': serializers.SecurityLoginLimitSerializer, 'ldap': serializers.LDAPSettingSerializer, + 'ldap_ha': serializers.LDAPHASettingSerializer, 'email': serializers.EmailSettingSerializer, 'email_content': serializers.EmailContentSettingSerializer, 'wecom': serializers.WeComSettingSerializer, diff --git a/apps/settings/serializers/auth/__init__.py b/apps/settings/serializers/auth/__init__.py index b5f567618..c1d6ab8f2 100644 --- a/apps/settings/serializers/auth/__init__.py +++ b/apps/settings/serializers/auth/__init__.py @@ -4,6 +4,7 @@ from .dingtalk import * from .feishu import * from .lark import * from .ldap import * +from .ldap_ha import * from .oauth2 import * from .oidc import * from .passkey import * diff --git a/apps/settings/serializers/auth/base.py b/apps/settings/serializers/auth/base.py index abfbf79b4..771ea6162 100644 --- a/apps/settings/serializers/auth/base.py +++ b/apps/settings/serializers/auth/base.py @@ -11,6 +11,7 @@ class AuthSettingSerializer(serializers.Serializer): PREFIX_TITLE = _('Authentication') AUTH_LDAP = serializers.BooleanField(required=False, label=_('LDAP Auth')) + AUTH_LDAP_HA = serializers.BooleanField(required=False, label=_('LDAP Auth HA')) AUTH_CAS = serializers.BooleanField(required=False, label=_('CAS Auth')) AUTH_OPENID = serializers.BooleanField(required=False, label=_('OPENID Auth')) AUTH_SAML2 = serializers.BooleanField(default=False, label=_("SAML2 Auth")) diff --git a/apps/settings/serializers/auth/ldap_ha.py b/apps/settings/serializers/auth/ldap_ha.py new file mode 100644 index 000000000..c653beeda --- /dev/null +++ b/apps/settings/serializers/auth/ldap_ha.py @@ -0,0 +1,94 @@ +from django.utils.translation import gettext_lazy as _ +from rest_framework import serializers + +from common.serializers.fields import EncryptedField +from .base import OrgListField + +__all__ = ['LDAPHATestConfigSerializer', 'LDAPHASettingSerializer'] + + +class LDAPHATestConfigSerializer(serializers.Serializer): + AUTH_LDAP_HA_SERVER_URI = serializers.CharField(max_length=1024) + AUTH_LDAP_HA_BIND_DN = serializers.CharField(max_length=1024, required=False, allow_blank=True) + AUTH_LDAP_HA_BIND_PASSWORD = EncryptedField(required=False, allow_blank=True) + AUTH_LDAP_HA_SEARCH_OU = serializers.CharField() + AUTH_LDAP_HA_SEARCH_FILTER = serializers.CharField() + AUTH_LDAP_HA_USER_ATTR_MAP = serializers.JSONField() + AUTH_LDAP_HA_START_TLS = serializers.BooleanField(required=False) + AUTH_LDAP_HA = serializers.BooleanField(required=False) + + +class LDAPHASettingSerializer(serializers.Serializer): + # encrypt_fields 现在使用 write_only 来判断了 + PREFIX_TITLE = _('LDAP HA') + + AUTH_LDAP_HA_SERVER_URI = serializers.CharField( + required=True, max_length=1024, label=_('Server'), + help_text=_('LDAP HA server URI') + ) + AUTH_LDAP_HA_BIND_DN = serializers.CharField( + required=False, max_length=1024, label=_('Bind DN'), + help_text=_('Binding Distinguished Name') + ) + AUTH_LDAP_HA_BIND_PASSWORD = EncryptedField( + max_length=1024, required=False, label=_('Password'), + help_text=_('Binding password') + ) + AUTH_LDAP_HA_SEARCH_OU = serializers.CharField( + max_length=1024, allow_blank=True, required=False, label=_('Search OU'), + help_text=_( + 'User Search Base, if there are multiple OUs, you can separate them with the `|` symbol' + ) + ) + AUTH_LDAP_HA_SEARCH_FILTER = serializers.CharField( + max_length=1024, required=True, label=_('Search filter'), + help_text=_('Selection could include (cn|uid|sAMAccountName=%(user)s)') + ) + AUTH_LDAP_HA_USER_ATTR_MAP = serializers.JSONField( + required=True, label=_('User attribute'), + help_text=_( + 'User attribute mapping, where the `key` is the JumpServer user attribute name and the ' + '`value` is the LDAP service user attribute name' + ) + ) + AUTH_LDAP_HA_SYNC_IS_PERIODIC = serializers.BooleanField( + required=False, label=_('Periodic run') + ) + AUTH_LDAP_HA_SYNC_CRONTAB = serializers.CharField( + required=False, max_length=128, allow_null=True, allow_blank=True, + label=_('Crontab') + ) + AUTH_LDAP_HA_SYNC_INTERVAL = serializers.IntegerField( + required=False, default=24, allow_null=True, label=_('Interval') + ) + AUTH_LDAP_HA_CONNECT_TIMEOUT = serializers.IntegerField( + min_value=1, max_value=300, + required=False, label=_('Connect timeout (s)'), + ) + AUTH_LDAP_HA_CACHE_TIMEOUT = serializers.IntegerField( + min_value=0, max_value=3600 * 24 * 30 * 12, + default=3600 * 24 * 30, + required=False, label=_('User DN cache timeout (s)'), + help_text=_( + 'Caching the User DN obtained during user login authentication can effectively' + 'improve the speed of user authentication., 0 means no cache
' + 'If the user OU structure has been adjusted, click Submit to clear the user DN cache' + ) + ) + AUTH_LDAP_HA_SEARCH_PAGED_SIZE = serializers.IntegerField( + required=False, label=_('Search paged size (piece)') + ) + AUTH_LDAP_HA_SYNC_RECEIVERS = serializers.ListField( + required=False, label=_('Recipient'), max_length=36 + ) + + AUTH_LDAP_HA = serializers.BooleanField(required=False, label=_('LDAP HA')) + AUTH_LDAP_HA_SYNC_ORG_IDS = OrgListField() + + def post_save(self): + keys = ['AUTH_LDAP_HA_SYNC_IS_PERIODIC', 'AUTH_LDAP_HA_SYNC_INTERVAL', 'AUTH_LDAP_HA_SYNC_CRONTAB'] + kwargs = {k: self.validated_data[k] for k in keys if k in self.validated_data} + if not kwargs: + return + from settings.tasks import import_ldap_ha_user_periodic + import_ldap_ha_user_periodic(**kwargs) diff --git a/apps/settings/tasks/ldap.py b/apps/settings/tasks/ldap.py index 86faa47cb..8a455cfaa 100644 --- a/apps/settings/tasks/ldap.py +++ b/apps/settings/tasks/ldap.py @@ -1,5 +1,4 @@ # coding: utf-8 -# import time from celery import shared_task from django.conf import settings @@ -16,45 +15,44 @@ from settings.notifications import LDAPImportMessage from users.models import User from ..utils import LDAPSyncUtil, LDAPServerUtil, LDAPImportUtil -__all__ = ['sync_ldap_user', 'import_ldap_user_periodic', 'import_ldap_user'] +__all__ = [ + 'sync_ldap_user', 'import_ldap_user_periodic', 'import_ldap_ha_user_periodic', + 'import_ldap_user', 'import_ldap_ha_user' +] logger = get_logger(__file__) -def sync_ldap_user(): - LDAPSyncUtil().perform_sync() +def sync_ldap_user(category='ldap'): + LDAPSyncUtil(category=category).perform_sync() -@shared_task( - verbose_name=_('Periodic import ldap user'), - description=_( - """ - When LDAP auto-sync is configured, this task will be invoked to synchronize users - """ - ) -) -def import_ldap_user(): +def perform_import(category, util_server): start_time = time.time() time_start_display = local_now_display() - logger.info("Start import ldap user task") - util_server = LDAPServerUtil() + logger.info(f"Start import {category} ldap user task") + util_import = LDAPImportUtil() users = util_server.search() + if settings.XPACK_ENABLED: - org_ids = settings.AUTH_LDAP_SYNC_ORG_IDS + org_ids = getattr(settings, f"AUTH_{category.upper()}_SYNC_ORG_IDS") default_org = None else: - # 社区版默认导入Default组织 org_ids = [Organization.DEFAULT_ID] default_org = Organization.default() + orgs = list(set([Organization.get_instance(org_id, default=default_org) for org_id in org_ids])) new_users, errors = util_import.perform_import(users, orgs) + if errors: - logger.error("Imported LDAP users errors: {}".format(errors)) + logger.error(f"Imported {category} LDAP users errors: {errors}") else: - logger.info('Imported {} users successfully'.format(len(users))) - if settings.AUTH_LDAP_SYNC_RECEIVERS: - user_ids = settings.AUTH_LDAP_SYNC_RECEIVERS + logger.info(f"Imported {len(users)} {category} users successfully") + + receivers_setting = f"AUTH_{category.upper()}_SYNC_RECEIVERS" + if getattr(settings, receivers_setting, None): + user_ids = getattr(settings, receivers_setting) recipient_list = User.objects.filter(id__in=list(user_ids)) end_time = time.time() extra_kwargs = { @@ -71,33 +69,84 @@ def import_ldap_user(): @shared_task( - verbose_name=_('Registration periodic import ldap user task'), + verbose_name=_('Periodic import ldap user'), description=_( """ - When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task - will be re-registered or updated, and this task will be invoked + When LDAP auto-sync is configured, this task will be invoked to synchronize users """ ) ) -@after_app_ready_start -def import_ldap_user_periodic(**kwargs): - task_name = 'import_ldap_user_periodic' - interval = kwargs.get('AUTH_LDAP_SYNC_INTERVAL', settings.AUTH_LDAP_SYNC_INTERVAL) - enabled = kwargs.get('AUTH_LDAP_SYNC_IS_PERIODIC', settings.AUTH_LDAP_SYNC_IS_PERIODIC) - crontab = kwargs.get('AUTH_LDAP_SYNC_CRONTAB', settings.AUTH_LDAP_SYNC_CRONTAB) +def import_ldap_user(): + perform_import('ldap', LDAPServerUtil()) + + +@shared_task( + verbose_name=_('Periodic import ldap ha user'), + description=_( + """ + When LDAP auto-sync is configured, this task will be invoked to synchronize users + """ + ) +) +def import_ldap_ha_user(): + perform_import('ldap_ha', LDAPServerUtil(category='ldap_ha')) + + +def register_periodic_task(task_name, task_func, interval_key, enabled_key, crontab_key, **kwargs): + interval = kwargs.get(interval_key, settings.AUTH_LDAP_SYNC_INTERVAL) + enabled = kwargs.get(enabled_key, settings.AUTH_LDAP_SYNC_IS_PERIODIC) + crontab = kwargs.get(crontab_key, settings.AUTH_LDAP_SYNC_CRONTAB) + if isinstance(interval, int): interval = interval * 3600 else: interval = None + if crontab: - # 优先使用 crontab - interval = None + interval = None # 优先使用 crontab + tasks = { task_name: { - 'task': import_ldap_user.name, + 'task': task_func.name, 'interval': interval, 'crontab': crontab, 'enabled': enabled } } create_or_update_celery_periodic_tasks(tasks) + + +@shared_task( + verbose_name=_('Registration periodic import ldap user task'), + description=_( + """ + When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task + will be re-registered or updated, and this task will be invoked + """ + ) +) +@after_app_ready_start +def import_ldap_user_periodic(**kwargs): + register_periodic_task( + 'import_ldap_user_periodic', import_ldap_user, + 'AUTH_LDAP_SYNC_INTERVAL', 'AUTH_LDAP_SYNC_IS_PERIODIC', + 'AUTH_LDAP_SYNC_CRONTAB', **kwargs + ) + + +@shared_task( + verbose_name=_('Registration periodic import ldap ha user task'), + description=_( + """ + When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task + will be re-registered or updated, and this task will be invoked + """ + ) +) +@after_app_ready_start +def import_ldap_ha_user_periodic(**kwargs): + register_periodic_task( + 'import_ldap_ha_user_periodic', import_ldap_ha_user, + 'AUTH_LDAP_HA_SYNC_INTERVAL', 'AUTH_LDAP_HA_SYNC_IS_PERIODIC', + 'AUTH_LDAP_HA_SYNC_CRONTAB', **kwargs + ) diff --git a/apps/settings/utils/ldap.py b/apps/settings/utils/ldap.py index 6f0fc97de..ca0a4f75a 100644 --- a/apps/settings/utils/ldap.py +++ b/apps/settings/utils/ldap.py @@ -24,7 +24,8 @@ from ldap3.core.exceptions import ( LDAPAttributeError, ) -from authentication.backends.ldap import LDAPAuthorizationBackend, LDAPUser +from authentication.backends.ldap import LDAPAuthorizationBackend, LDAPUser, \ + LDAPHAAuthorizationBackend from common.const import LDAP_AD_ACCOUNT_DISABLE from common.db.utils import close_old_connections from common.utils import timeit, get_logger @@ -46,7 +47,7 @@ LDAP_USE_CACHE_FLAGS = [1, '1', 'true', 'True', True] class LDAPConfig(object): - def __init__(self, config=None): + def __init__(self, config=None, category='ldap'): self.server_uri = None self.bind_dn = None self.password = None @@ -55,6 +56,7 @@ class LDAPConfig(object): self.search_filter = None self.attr_map = None self.auth_ldap = None + self.category = category if isinstance(config, dict): self.load_from_config(config) else: @@ -71,25 +73,26 @@ class LDAPConfig(object): self.auth_ldap = config.get('auth_ldap') def load_from_settings(self): - self.server_uri = settings.AUTH_LDAP_SERVER_URI - self.bind_dn = settings.AUTH_LDAP_BIND_DN - self.password = settings.AUTH_LDAP_BIND_PASSWORD - self.use_ssl = settings.AUTH_LDAP_START_TLS - self.search_ou = settings.AUTH_LDAP_SEARCH_OU - self.search_filter = settings.AUTH_LDAP_SEARCH_FILTER - self.attr_map = settings.AUTH_LDAP_USER_ATTR_MAP - self.auth_ldap = settings.AUTH_LDAP + prefix = 'AUTH_LDAP' if self.category == 'ldap' else 'AUTH_LDAP_HA' + self.server_uri = getattr(settings, f"{prefix}_SERVER_URI") + self.bind_dn = getattr(settings, f"{prefix}_BIND_DN") + self.password = getattr(settings, f"{prefix}_BIND_PASSWORD") + self.use_ssl = getattr(settings, f"{prefix}_START_TLS") + self.search_ou = getattr(settings, f"{prefix})_SEARCH_OU") + self.search_filter = getattr(settings, f"{prefix}_SEARCH_FILTER") + self.attr_map = getattr(settings, f"{prefix}_USER_ATTR_MAP") + self.auth_ldap = getattr(settings, prefix) class LDAPServerUtil(object): - def __init__(self, config=None): + def __init__(self, config=None, category='ldap'): if isinstance(config, dict): self.config = LDAPConfig(config=config) elif isinstance(config, LDAPConfig): self.config = config else: - self.config = LDAPConfig() + self.config = LDAPConfig(category=category) self._conn = None self._paged_size = self.get_paged_size() self.search_users = None @@ -230,25 +233,29 @@ class LDAPServerUtil(object): class LDAPCacheUtil(object): - CACHE_KEY_USERS = 'CACHE_KEY_LDAP_USERS' - def __init__(self): + def __init__(self, category='ldap'): self.search_users = None self.search_value = None + self.category = category + if self.category == 'ldap': + self.cache_key_users = 'CACHE_KEY_LDAP_USERS' + else: + self.cache_key_users = 'CACHE_KEY_LDAP_HA_USERS' def set_users(self, users): logger.info('Set ldap users to cache, count: {}'.format(len(users))) - cache.set(self.CACHE_KEY_USERS, users, None) + cache.set(self.cache_key_users, users, None) def get_users(self): - users = cache.get(self.CACHE_KEY_USERS) + users = cache.get(self.cache_key_users) count = users if users is None else len(users) logger.info('Get ldap users from cache, count: {}'.format(count)) return users def delete_users(self): logger.info('Delete ldap users from cache') - cache.delete(self.CACHE_KEY_USERS) + cache.delete(self.cache_key_users) def filter_users(self, users): if users is None: @@ -288,10 +295,11 @@ class LDAPSyncUtil(object): TASK_STATUS_IS_RUNNING = 'RUNNING' TASK_STATUS_IS_OVER = 'OVER' - def __init__(self): - self.server_util = LDAPServerUtil() - self.cache_util = LDAPCacheUtil() + def __init__(self, category='ldap'): + self.server_util = LDAPServerUtil(category=category) + self.cache_util = LDAPCacheUtil(category=category) self.task_error_msg = None + self.category = category def clear_cache(self): logger.info('Clear ldap sync cache') @@ -347,7 +355,7 @@ class LDAPSyncUtil(object): def perform_sync(self): logger.info('Start perform sync ldap users from server to cache') try: - ok, msg = LDAPTestUtil().test_config() + ok, msg = LDAPTestUtil(category=self.category).test_config() if not ok: raise self.LDAPSyncUtilException(msg) self.sync() @@ -377,6 +385,7 @@ class LDAPImportUtil(object): user['email'] = self.get_user_email(user) if user['username'] not in ['admin']: user['source'] = User.Source.ldap.value + user.pop('status', None) obj, created = User.objects.update_or_create( username=user['username'], defaults=user ) @@ -476,9 +485,13 @@ class LDAPTestUtil(object): class LDAPBeforeLoginCheckError(LDAPExceptionError): pass - def __init__(self, config=None): - self.config = LDAPConfig(config) + def __init__(self, config=None, category='ldap'): + self.config = LDAPConfig(config, category) self.user_entries = [] + if category == 'ldap': + self.backend = LDAPAuthorizationBackend() + else: + self.backend = LDAPHAAuthorizationBackend() def _test_connection_bind(self, authentication=None, user=None, password=None): server = Server(self.config.server_uri) @@ -656,15 +669,12 @@ class LDAPTestUtil(object): if not cache.get(CACHE_KEY_LDAP_TEST_CONFIG_TASK_STATUS): self.test_config() - backend = LDAPAuthorizationBackend() - ok, msg = backend.pre_check(username, password) + ok, msg = self.backend.pre_check(username, password) if not ok: raise self.LDAPBeforeLoginCheckError(msg) - @staticmethod - def _test_login_auth(username, password): - backend = LDAPAuthorizationBackend() - ldap_user = LDAPUser(backend, username=username.strip()) + def _test_login_auth(self, username, password): + ldap_user = LDAPUser(self.backend, username=username.strip()) ldap_user._authenticate_user_dn(password) def _test_login(self, username, password): diff --git a/apps/settings/ws.py b/apps/settings/ws.py index e5762e1f5..586a7d4e4 100644 --- a/apps/settings/ws.py +++ b/apps/settings/ws.py @@ -3,16 +3,17 @@ import json import asyncio -from asgiref.sync import sync_to_async from channels.generic.websocket import AsyncJsonWebsocketConsumer from django.core.cache import cache from django.conf import settings from django.utils.translation import gettext_lazy as _, activate from django.utils import translation +from urllib.parse import parse_qs from common.db.utils import close_old_connections from common.utils import get_logger from settings.serializers import ( + LDAPHATestConfigSerializer, LDAPTestConfigSerializer, LDAPTestLoginSerializer ) @@ -101,8 +102,12 @@ class ToolsWebsocket(AsyncJsonWebsocketConsumer): class LdapWebsocket(AsyncJsonWebsocketConsumer): + category: str + async def connect(self): user = self.scope["user"] + query = parse_qs(self.scope['query_string'].decode()) + self.category = query.get('category', ['ldap'])[0] if user.is_authenticated: await self.accept() else: @@ -125,30 +130,21 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): await self.close() close_old_connections() - @staticmethod - def get_ldap_config(serializer): - server_uri = serializer.validated_data["AUTH_LDAP_SERVER_URI"] - bind_dn = serializer.validated_data["AUTH_LDAP_BIND_DN"] - password = serializer.validated_data["AUTH_LDAP_BIND_PASSWORD"] - use_ssl = serializer.validated_data.get("AUTH_LDAP_START_TLS", False) - search_ou = serializer.validated_data["AUTH_LDAP_SEARCH_OU"] - search_filter = serializer.validated_data["AUTH_LDAP_SEARCH_FILTER"] - attr_map = serializer.validated_data["AUTH_LDAP_USER_ATTR_MAP"] - auth_ldap = serializer.validated_data.get('AUTH_LDAP', False) - - if not password: - password = settings.AUTH_LDAP_BIND_PASSWORD + def get_ldap_config(self, serializer): + prefix = 'AUTH_LDAP_' if self.category == 'ldap' else 'AUTH_LDAP_HA_' config = { - 'server_uri': server_uri, - 'bind_dn': bind_dn, - 'password': password, - 'use_ssl': use_ssl, - 'search_ou': search_ou, - 'search_filter': search_filter, - 'attr_map': attr_map, - 'auth_ldap': auth_ldap + 'server_uri': serializer.validated_data.get(f"{prefix}SERVER_URI"), + 'bind_dn': serializer.validated_data.get(f"{prefix}BIND_DN"), + 'password': (serializer.validated_data.get(f"{prefix}BIND_PASSWORD") or + getattr(settings, f"{prefix}BIND_PASSWORD")), + 'use_ssl': serializer.validated_data.get(f"{prefix}START_TLS", False), + 'search_ou': serializer.validated_data.get(f"{prefix}SEARCH_OU"), + 'search_filter': serializer.validated_data.get(f"{prefix}SEARCH_FILTER"), + 'attr_map': serializer.validated_data.get(f"{prefix}USER_ATTR_MAP"), + 'auth_ldap': serializer.validated_data.get(f"{prefix.rstrip('_')}", False) } + return config @staticmethod @@ -160,7 +156,10 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): cache.set(task_key, TASK_STATUS_IS_OVER, ttl) def run_testing_config(self, data): - serializer = LDAPTestConfigSerializer(data=data) + if self.category == 'ldap': + serializer = LDAPTestConfigSerializer(data=data) + else: + serializer = LDAPHATestConfigSerializer(data=data) if not serializer.is_valid(): self.send_msg(msg=f'error: {str(serializer.errors)}') config = self.get_ldap_config(serializer) @@ -175,14 +174,13 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): self.send_msg(msg=f'error: {str(serializer.errors)}') username = serializer.validated_data['username'] password = serializer.validated_data['password'] - ok, msg = LDAPTestUtil().test_login(username, password) + ok, msg = LDAPTestUtil(category=self.category).test_login(username, password) return ok, msg - @staticmethod - def run_sync_user(data): - sync_util = LDAPSyncUtil() + def run_sync_user(self, data): + sync_util = LDAPSyncUtil(category=self.category) sync_util.clear_cache() - sync_ldap_user() + sync_ldap_user(category=self.category) msg = sync_util.get_task_error_msg() ok = False if msg else True return ok, msg @@ -215,7 +213,7 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): return ok, msg def set_users_status(self, import_users, errors): - util = LDAPCacheUtil() + util = LDAPCacheUtil(category=self.category) all_users = util.get_users() import_usernames = [u['username'] for u in import_users] errors_mapper = {k: v for err in errors for k, v in err.items()} @@ -225,7 +223,7 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): user['status'] = {'error': errors_mapper[username]} elif username in import_usernames: user['status'] = ImportStatus.ok - LDAPCacheUtil().set_users(all_users) + LDAPCacheUtil(category=self.category).set_users(all_users) @staticmethod def get_orgs(org_ids): @@ -235,12 +233,11 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): orgs = [current_org] return orgs - @staticmethod - def get_ldap_users(username_list, cache_police): + def get_ldap_users(self, username_list, cache_police): if '*' in username_list: - users = LDAPServerUtil().search() + users = LDAPServerUtil(category=self.category).search() elif cache_police in LDAP_USE_CACHE_FLAGS: - users = LDAPCacheUtil().search(search_users=username_list) + users = LDAPCacheUtil(category=self.category).search(search_users=username_list) else: - users = LDAPServerUtil().search(search_users=username_list) + users = LDAPServerUtil(category=self.category).search(search_users=username_list) return users diff --git a/apps/users/models/user/_source.py b/apps/users/models/user/_source.py index 2840caa8a..2c7237c80 100644 --- a/apps/users/models/user/_source.py +++ b/apps/users/models/user/_source.py @@ -10,6 +10,7 @@ from django.utils.translation import gettext_lazy as _ class Source(models.TextChoices): local = "local", _("Local") ldap = "ldap", "LDAP/AD" + ldap_ha = "ldap_ha", "LDAP/AD (HA)" openid = "openid", "OpenID" radius = "radius", "Radius" cas = "cas", "CAS" @@ -55,6 +56,7 @@ class SourceMixin: mapper = { cls.Source.local: True, cls.Source.ldap: settings.AUTH_LDAP, + cls.Source.ldap_ha: settings.AUTH_LDAP_HA, cls.Source.openid: settings.AUTH_OPENID, cls.Source.radius: settings.AUTH_RADIUS, cls.Source.cas: settings.AUTH_CAS, From ab529fd22c8d3681eceb320fdaa4892dd16fb233 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 12 Sep 2024 10:00:55 +0800 Subject: [PATCH 46/98] fix: i18n compilemessages error --- apps/i18n/core/zh/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 2beb7c7eb..6adb8eab2 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -4886,7 +4886,7 @@ msgstr "命令执行已禁用" #: ops/const.py:86 msgctxt "scope" msgid "Public" -msgstr "公有 +msgstr "公有" #: ops/const.py:87 msgid "Private" From b00f3a851c65cd0ceca47b47c38fc1d193237dc7 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 12 Sep 2024 10:19:40 +0800 Subject: [PATCH 47/98] perf: Third-party user login failed --- apps/users/signal_handlers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/users/signal_handlers.py b/apps/users/signal_handlers.py index 27c629efc..ae3117ef3 100644 --- a/apps/users/signal_handlers.py +++ b/apps/users/signal_handlers.py @@ -52,6 +52,8 @@ def user_authenticated_handle(user, created, source, attrs=None, **kwargs): if created: user.source = source user.save() + + if created and isinstance(attrs, dict): org_ids = bind_user_to_org_role(user) group_names = attrs.get('groups') bind_user_to_group(org_ids, group_names, user) From 4f9158b2adcb97b7ac07fdb51528d2f4beabb1c9 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 12 Sep 2024 10:31:02 +0800 Subject: [PATCH 48/98] fix: ldap test config msg error --- apps/settings/utils/ldap.py | 2 +- apps/settings/ws.py | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/settings/utils/ldap.py b/apps/settings/utils/ldap.py index ca0a4f75a..e896c190e 100644 --- a/apps/settings/utils/ldap.py +++ b/apps/settings/utils/ldap.py @@ -78,7 +78,7 @@ class LDAPConfig(object): self.bind_dn = getattr(settings, f"{prefix}_BIND_DN") self.password = getattr(settings, f"{prefix}_BIND_PASSWORD") self.use_ssl = getattr(settings, f"{prefix}_START_TLS") - self.search_ou = getattr(settings, f"{prefix})_SEARCH_OU") + self.search_ou = getattr(settings, f"{prefix}_SEARCH_OU") self.search_filter = getattr(settings, f"{prefix}_SEARCH_FILTER") self.attr_map = getattr(settings, f"{prefix}_USER_ATTR_MAP") self.auth_ldap = getattr(settings, prefix) diff --git a/apps/settings/ws.py b/apps/settings/ws.py index 586a7d4e4..6dca2f0a2 100644 --- a/apps/settings/ws.py +++ b/apps/settings/ws.py @@ -117,12 +117,15 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): data = json.loads(text_data) msg_type = data.pop('msg_type', 'testing_config') try: - tool_func = getattr(self, f'run_{msg_type.lower()}') - ok, msg = await asyncio.to_thread(tool_func, data) + ok, msg = await asyncio.to_thread(self.run_func, f'run_{msg_type.lower()}', data) await self.send_msg(ok, msg) except Exception as error: await self.send_msg(msg='Exception: %s' % error) + def run_func(self, func_name, data): + with translation.override(getattr(self.scope['user'], 'lang', settings.LANGUAGE_CODE)): + return getattr(self, func_name)(data) + async def send_msg(self, ok=True, msg=''): await self.send_json({'ok': ok, 'msg': f'{msg}'}) @@ -186,11 +189,6 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): return ok, msg def run_import_user(self, data): - lang = getattr(self.scope['user'], 'lang', settings.LANGUAGE_CODE) - with translation.override(lang): - return self._run_import_user(data) - - def _run_import_user(self, data): ok = False org_ids = data.get('org_ids') username_list = data.get('username_list', []) From cd76294e81cf688472144e8feee3654c1c0128ac Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 12 Sep 2024 16:00:55 +0800 Subject: [PATCH 49/98] fix: migrate ops adhoc and playbook unique_together error --- ...03_alter_adhoc_unique_together_and_more.py | 29 +++++++++- apps/users/migrations/0001_initial.py | 56 +++++++++++++------ 2 files changed, 68 insertions(+), 17 deletions(-) diff --git a/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py b/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py index 610e19330..cbe7233a1 100644 --- a/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py +++ b/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py @@ -2,16 +2,43 @@ from django.conf import settings from django.db import migrations, models +from orgs.models import Organization -class Migration(migrations.Migration): +def migrate_ops_adhoc_and_playbook_name(apps, schema_editor): + Adhoc = apps.get_model('ops', 'adhoc') + Playbook = apps.get_model('ops', 'playbook') + adhocs_to_update = Adhoc.objects.exclude(org_id=Organization.DEFAULT_ID) + for adhoc in adhocs_to_update: + try: + org = Organization.objects.get(id=adhoc.org_id) + suffix = f'({org.name})' + except Exception as e: + suffix = f'({str(adhoc.id)[:6]})' + + adhoc.name = f'{adhoc.name}{suffix}' + Adhoc.objects.bulk_update(adhocs_to_update, ['name']) + + playbooks_to_update = Playbook.objects.exclude(org_id=Organization.DEFAULT_ID) + for playbook in playbooks_to_update: + try: + org = Organization.objects.get(id=playbook.org_id) + suffix = f'({org.name})' + except Exception as e: + suffix = f'({str(playbook.id)[:6]})' + playbook.name = f'{playbook.name}{suffix}' + playbook.save() + Playbook.objects.bulk_update(playbooks_to_update, ['name']) + +class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('ops', '0002_celerytask'), ] operations = [ + migrations.RunPython(migrate_ops_adhoc_and_playbook_name), migrations.AlterUniqueTogether( name='adhoc', unique_together={('name', 'creator')}, diff --git a/apps/users/migrations/0001_initial.py b/apps/users/migrations/0001_initial.py index 4a9ced4ba..5b47304b2 100644 --- a/apps/users/migrations/0001_initial.py +++ b/apps/users/migrations/0001_initial.py @@ -35,7 +35,6 @@ def add_default_admin(apps, schema_editor): class Migration(migrations.Migration): - initial = True dependencies = [ @@ -50,7 +49,9 @@ class Migration(migrations.Migration): ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('is_active', models.BooleanField(default=True, + help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', + verbose_name='active')), ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('username', models.CharField(max_length=128, unique=True, verbose_name='Username')), @@ -60,33 +61,49 @@ class Migration(migrations.Migration): ('is_service_account', models.BooleanField(default=False, verbose_name='Is service account')), ('avatar', models.ImageField(null=True, upload_to='avatar', verbose_name='Avatar')), ('wechat', common.db.fields.EncryptCharField(blank=True, max_length=128, verbose_name='Wechat')), - ('phone', common.db.fields.EncryptCharField(blank=True, max_length=128, null=True, verbose_name='Phone')), - ('mfa_level', models.SmallIntegerField(choices=[(0, "Disabled"), (1, "Enabled"), (2, "Force enabled")], default=0, verbose_name='MFA')), - ('otp_secret_key', common.db.fields.EncryptCharField(blank=True, max_length=128, null=True, verbose_name='OTP secret key')), + ('phone', + common.db.fields.EncryptCharField(blank=True, max_length=128, null=True, verbose_name='Phone')), + ('mfa_level', + models.SmallIntegerField(choices=[(0, "Disabled"), (1, "Enabled"), (2, "Force enabled")], default=0, + verbose_name='MFA')), + ('otp_secret_key', common.db.fields.EncryptCharField(blank=True, max_length=128, null=True, + verbose_name='OTP secret key')), ('private_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Private key')), ('public_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Public key')), ('comment', models.TextField(blank=True, null=True, verbose_name='Comment')), ('is_first_login', models.BooleanField(default=True, verbose_name='Is first login')), - ('date_expired', models.DateTimeField(blank=True, db_index=True, default=common.utils.django.date_expired_default, null=True, verbose_name='Date expired')), + ('date_expired', + models.DateTimeField(blank=True, db_index=True, default=common.utils.django.date_expired_default, + null=True, verbose_name='Date expired')), ('created_by', models.CharField(blank=True, default='', max_length=30, verbose_name='Created by')), ('updated_by', models.CharField(blank=True, default='', max_length=30, verbose_name='Updated by')), - ('date_password_last_updated', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date password last updated')), + ('date_password_last_updated', + models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date password last updated')), ('need_update_password', models.BooleanField(default=False, verbose_name='Need update password')), - ('source', models.CharField(choices=[('local', 'Local'), ('ldap', 'LDAP/AD'), ('openid', 'OpenID'), ('radius', 'Radius'), ('cas', 'CAS'), ('saml2', 'SAML2'), ('oauth2', 'OAuth2'), ('wecom', 'WeCom'), ('dingtalk', 'DingTalk'), ('feishu', 'FeiShu'), ('lark', 'Lark'), ('slack', 'Slack'), ('custom', 'Custom')], default='local', max_length=30, verbose_name='Source')), + ('source', models.CharField( + choices=[('local', 'Local'), ('ldap', 'LDAP/AD'), ('ldap_ha', 'LDAP/AD (HA)'), ('openid', 'OpenID'), + ('radius', 'Radius'), ('cas', 'CAS'), ('saml2', 'SAML2'), ('oauth2', 'OAuth2'), + ('wecom', 'WeCom'), ('dingtalk', 'DingTalk'), ('feishu', 'FeiShu'), ('lark', 'Lark'), + ('slack', 'Slack'), ('custom', 'Custom')], default='local', max_length=30, + verbose_name='Source')), ('wecom_id', models.CharField(default=None, max_length=128, null=True, verbose_name='WeCom')), ('dingtalk_id', models.CharField(default=None, max_length=128, null=True, verbose_name='DingTalk')), ('feishu_id', models.CharField(default=None, max_length=128, null=True, verbose_name='FeiShu')), ('lark_id', models.CharField(default=None, max_length=128, null=True, verbose_name='Lark')), ('slack_id', models.CharField(default=None, max_length=128, null=True, verbose_name='Slack')), - ('date_api_key_last_used', models.DateTimeField(blank=True, null=True, verbose_name='Date api key used')), + ('date_api_key_last_used', + models.DateTimeField(blank=True, null=True, verbose_name='Date api key used')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ], options={ 'verbose_name': 'User', 'ordering': ['username'], - 'permissions': [('invite_user', 'Can invite user'), ('remove_user', 'Can remove user'), ('match_user', 'Can match user')], + 'permissions': [('invite_user', 'Can invite user'), ('remove_user', 'Can remove user'), + ('match_user', 'Can match user')], }, - bases=(users.models.user.AuthMixin, users.models.user.SourceMixin, users.models.user.TokenMixin, users.models.user.RoleMixin, users.models.user.MFAMixin, users.models.user.JSONFilterMixin, models.Model), + bases=(users.models.user.AuthMixin, users.models.user.SourceMixin, users.models.user.TokenMixin, + users.models.user.RoleMixin, users.models.user.MFAMixin, users.models.user.JSONFilterMixin, + models.Model), managers=[ ('objects', users.models.user.UserManager()), ], @@ -97,7 +114,9 @@ class Migration(migrations.Migration): ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('password', models.CharField(max_length=128)), ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')), - ('user', models.ForeignKey(on_delete=common.db.models.CASCADE_SIGNAL_SKIP, related_name='history_passwords', to=settings.AUTH_USER_MODEL, verbose_name='User')), + ('user', + models.ForeignKey(on_delete=common.db.models.CASCADE_SIGNAL_SKIP, related_name='history_passwords', + to=settings.AUTH_USER_MODEL, verbose_name='User')), ], options={ 'verbose_name': 'User password history', @@ -112,7 +131,8 @@ class Migration(migrations.Migration): ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('name', models.CharField(max_length=128, verbose_name='Name')), ], options={ @@ -124,12 +144,15 @@ class Migration(migrations.Migration): migrations.AddField( model_name='user', name='groups', - field=models.ManyToManyField(blank=True, related_name='users', to='users.usergroup', verbose_name='User group'), + field=models.ManyToManyField(blank=True, related_name='users', to='users.usergroup', + verbose_name='User group'), ), migrations.AddField( model_name='user', name='user_permissions', - field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions'), + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', + related_name='user_set', related_query_name='user', to='auth.permission', + verbose_name='user permissions'), ), migrations.CreateModel( name='Preference', @@ -139,7 +162,8 @@ class Migration(migrations.Migration): ('category', models.CharField(max_length=128, verbose_name='Category')), ('value', models.TextField(blank=True, default='', verbose_name='Value')), ('encrypted', models.BooleanField(default=False, verbose_name='Encrypted')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='preferences', to=settings.AUTH_USER_MODEL, verbose_name='Users')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='preferences', + to=settings.AUTH_USER_MODEL, verbose_name='Users')), ], options={ 'verbose_name': 'Preference', From 542e64278ff513475517672dbf44108c1eb186a7 Mon Sep 17 00:00:00 2001 From: Bai Date: Thu, 12 Sep 2024 16:25:36 +0800 Subject: [PATCH 50/98] perf: fix migrate adhoc playbook --- ...03_alter_adhoc_unique_together_and_more.py | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py b/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py index cbe7233a1..98087c86a 100644 --- a/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py +++ b/apps/ops/migrations/0003_alter_adhoc_unique_together_and_more.py @@ -8,26 +8,19 @@ from orgs.models import Organization def migrate_ops_adhoc_and_playbook_name(apps, schema_editor): Adhoc = apps.get_model('ops', 'adhoc') Playbook = apps.get_model('ops', 'playbook') + Organization = apps.get_model('orgs', 'Organization') + org_id_name_mapper = {str(org.id): org.name for org in Organization.objects.all()} + adhocs_to_update = Adhoc.objects.exclude(org_id=Organization.DEFAULT_ID) for adhoc in adhocs_to_update: - try: - org = Organization.objects.get(id=adhoc.org_id) - suffix = f'({org.name})' - except Exception as e: - suffix = f'({str(adhoc.id)[:6]})' - - adhoc.name = f'{adhoc.name}{suffix}' + suffix = org_id_name_mapper.get(str(adhoc.org_id), str(adhoc.id)[:6]) + adhoc.name = f'{adhoc.name} ({suffix})' Adhoc.objects.bulk_update(adhocs_to_update, ['name']) playbooks_to_update = Playbook.objects.exclude(org_id=Organization.DEFAULT_ID) for playbook in playbooks_to_update: - try: - org = Organization.objects.get(id=playbook.org_id) - suffix = f'({org.name})' - except Exception as e: - suffix = f'({str(playbook.id)[:6]})' - playbook.name = f'{playbook.name}{suffix}' - playbook.save() + suffix = org_id_name_mapper.get(str(playbook.org_id), str(playbook.id)[:6]) + playbook.name = f'{playbook.name} ({suffix})' Playbook.objects.bulk_update(playbooks_to_update, ['name']) From f19e3fedbdde02ad929813a5141c7798fa169a1d Mon Sep 17 00:00:00 2001 From: Aaron3S Date: Thu, 12 Sep 2024 18:38:16 +0800 Subject: [PATCH 51/98] feat: add chen i18n --- apps/i18n/chen/en.json | 5 ++++- apps/i18n/chen/zh.json | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/i18n/chen/en.json b/apps/i18n/chen/en.json index dbb7953f0..ba0347f7c 100644 --- a/apps/i18n/chen/en.json +++ b/apps/i18n/chen/en.json @@ -67,5 +67,8 @@ "Version": "Version", "ViewData": "View data", "WaitCommandReviewMessage": "The review request has been initiated, please wait for the review results", - "initializingDatasourceFailedMessage": "Connection failed, please check if the database connection configuration is correct" + "initializingDatasourceFailedMessage": "Connection failed, please check if the database connection configuration is correct", + "Warning": "Warning", + "ExecutionCanceled": "Execution Canceled", + "CommandWarningDialogMessage": "The command you executed is risky and an alert notification will be sent to the administrator. Do you want to continue?" } \ No newline at end of file diff --git a/apps/i18n/chen/zh.json b/apps/i18n/chen/zh.json index 523475168..51ec43446 100644 --- a/apps/i18n/chen/zh.json +++ b/apps/i18n/chen/zh.json @@ -67,5 +67,8 @@ "Version": "版本", "ViewData": "查看数据", "WaitCommandReviewMessage": "复核请求已发起, 请等待复核结果", - "initializingDatasourceFailedMessage": "连接失败,请检查数据库连接配置是否正确" + "initializingDatasourceFailedMessage": "连接失败,请检查数据库连接配置是否正确", + "Warning": "警告", + "ExecutionCanceled": "执行已取消", + "CommandWarningDialogMessage": "您执行的命令存在风险,警报通知将发送给管理员。是否继续?" } \ No newline at end of file From 1b4114fd5f9cabd37be57055f0f01d0ffd8e303b Mon Sep 17 00:00:00 2001 From: Aaron3S Date: Thu, 12 Sep 2024 18:45:41 +0800 Subject: [PATCH 52/98] perf: Optimize chen translation --- apps/i18n/chen/zh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/i18n/chen/zh.json b/apps/i18n/chen/zh.json index 51ec43446..62ae1aaa6 100644 --- a/apps/i18n/chen/zh.json +++ b/apps/i18n/chen/zh.json @@ -70,5 +70,5 @@ "initializingDatasourceFailedMessage": "连接失败,请检查数据库连接配置是否正确", "Warning": "警告", "ExecutionCanceled": "执行已取消", - "CommandWarningDialogMessage": "您执行的命令存在风险,警报通知将发送给管理员。是否继续?" + "CommandWarningDialogMessage": "您执行的命令存在风险,告警通知将发送给管理员。是否继续?" } \ No newline at end of file From ee8d7cdcacc5d1f2e988b4979b6fd87c2e58cdf6 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 12 Sep 2024 17:50:01 +0800 Subject: [PATCH 53/98] perf: Upgrade ansible postgresql --- Dockerfile-base | 4 ++++ .../automations/change_secret/database/mysql/main.yml | 2 +- .../automations/change_secret/database/postgresql/main.yml | 2 +- .../automations/gather_accounts/database/mysql/main.yml | 2 +- .../automations/gather_accounts/database/postgresql/main.yml | 2 +- .../accounts/automations/push_account/database/mysql/main.yml | 2 +- .../automations/push_account/database/postgresql/main.yml | 2 +- .../automations/remove_account/database/mysql/main.yml | 2 +- .../automations/remove_account/database/postgresql/main.yml | 2 +- .../automations/verify_account/database/mysql/main.yml | 2 +- .../automations/verify_account/database/postgresql/main.yml | 2 +- apps/assets/automations/base/manager.py | 1 + apps/assets/automations/gather_facts/database/mysql/main.yml | 2 +- .../automations/gather_facts/database/postgresql/main.yml | 2 +- apps/assets/automations/ping/database/mysql/main.yml | 2 +- apps/assets/automations/ping/database/postgresql/main.yml | 2 +- requirements/collections.yml | 3 +++ 17 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 requirements/collections.yml diff --git a/Dockerfile-base b/Dockerfile-base index 732798d8b..3574cadb1 100644 --- a/Dockerfile-base +++ b/Dockerfile-base @@ -43,14 +43,18 @@ RUN set -ex \ WORKDIR /opt/jumpserver ARG PIP_MIRROR=https://pypi.org/simple +ENV ANSIBLE_COLLECTIONS_PATHS=/opt/py3/lib/python3.11/site-packages/ansible_collections + RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=core \ --mount=type=bind,source=poetry.lock,target=poetry.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ --mount=type=bind,source=utils/clean_site_packages.sh,target=clean_site_packages.sh \ + --mount=type=bind,source=requirements/collections.yml,target=collections.yml \ set -ex \ && python3 -m venv /opt/py3 \ && pip install poetry -i ${PIP_MIRROR} \ && poetry config virtualenvs.create false \ && . /opt/py3/bin/activate \ && poetry install --only main \ + && ansible-galaxy collection install -r collections.yml --force --ignore-certs \ && bash clean_site_packages.sh diff --git a/apps/accounts/automations/change_secret/database/mysql/main.yml b/apps/accounts/automations/change_secret/database/mysql/main.yml index 15648e76d..0d8452a4a 100644 --- a/apps/accounts/automations/change_secret/database/mysql/main.yml +++ b/apps/accounts/automations/change_secret/database/mysql/main.yml @@ -6,7 +6,7 @@ check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Test MySQL connection diff --git a/apps/accounts/automations/change_secret/database/postgresql/main.yml b/apps/accounts/automations/change_secret/database/postgresql/main.yml index b73baac4a..de7dfe019 100644 --- a/apps/accounts/automations/change_secret/database/postgresql/main.yml +++ b/apps/accounts/automations/change_secret/database/postgresql/main.yml @@ -6,7 +6,7 @@ check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Test PostgreSQL connection diff --git a/apps/accounts/automations/gather_accounts/database/mysql/main.yml b/apps/accounts/automations/gather_accounts/database/mysql/main.yml index 92121189d..37e446502 100644 --- a/apps/accounts/automations/gather_accounts/database/mysql/main.yml +++ b/apps/accounts/automations/gather_accounts/database/mysql/main.yml @@ -5,7 +5,7 @@ check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Get info diff --git a/apps/accounts/automations/gather_accounts/database/postgresql/main.yml b/apps/accounts/automations/gather_accounts/database/postgresql/main.yml index fd27ab132..10bd75fce 100644 --- a/apps/accounts/automations/gather_accounts/database/postgresql/main.yml +++ b/apps/accounts/automations/gather_accounts/database/postgresql/main.yml @@ -6,7 +6,7 @@ check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Get info diff --git a/apps/accounts/automations/push_account/database/mysql/main.yml b/apps/accounts/automations/push_account/database/mysql/main.yml index 15648e76d..0d8452a4a 100644 --- a/apps/accounts/automations/push_account/database/mysql/main.yml +++ b/apps/accounts/automations/push_account/database/mysql/main.yml @@ -6,7 +6,7 @@ check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Test MySQL connection diff --git a/apps/accounts/automations/push_account/database/postgresql/main.yml b/apps/accounts/automations/push_account/database/postgresql/main.yml index 3678e4fe2..7a12a4452 100644 --- a/apps/accounts/automations/push_account/database/postgresql/main.yml +++ b/apps/accounts/automations/push_account/database/postgresql/main.yml @@ -6,7 +6,7 @@ check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Test PostgreSQL connection diff --git a/apps/accounts/automations/remove_account/database/mysql/main.yml b/apps/accounts/automations/remove_account/database/mysql/main.yml index 07b84a58b..f877dfe18 100644 --- a/apps/accounts/automations/remove_account/database/mysql/main.yml +++ b/apps/accounts/automations/remove_account/database/mysql/main.yml @@ -5,7 +5,7 @@ check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: "Remove account" diff --git a/apps/accounts/automations/remove_account/database/postgresql/main.yml b/apps/accounts/automations/remove_account/database/postgresql/main.yml index 4738fcd04..20290fdb9 100644 --- a/apps/accounts/automations/remove_account/database/postgresql/main.yml +++ b/apps/accounts/automations/remove_account/database/postgresql/main.yml @@ -6,7 +6,7 @@ check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: "Remove account" diff --git a/apps/accounts/automations/verify_account/database/mysql/main.yml b/apps/accounts/automations/verify_account/database/mysql/main.yml index ab6a4d33b..2c4ae5c0b 100644 --- a/apps/accounts/automations/verify_account/database/mysql/main.yml +++ b/apps/accounts/automations/verify_account/database/mysql/main.yml @@ -5,7 +5,7 @@ check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Verify account diff --git a/apps/accounts/automations/verify_account/database/postgresql/main.yml b/apps/accounts/automations/verify_account/database/postgresql/main.yml index 24fdd6cb6..5f5aa4689 100644 --- a/apps/accounts/automations/verify_account/database/postgresql/main.yml +++ b/apps/accounts/automations/verify_account/database/postgresql/main.yml @@ -6,7 +6,7 @@ check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Verify account diff --git a/apps/assets/automations/base/manager.py b/apps/assets/automations/base/manager.py index c9de04baf..da3e2353f 100644 --- a/apps/assets/automations/base/manager.py +++ b/apps/assets/automations/base/manager.py @@ -170,6 +170,7 @@ class BasePlaybookManager: result = self.write_cert_to_file( os.path.join(cert_dir, f), specific.get(f) ) + os.chmod(result, 0o600) host['jms_asset']['secret_info'][f] = result return host diff --git a/apps/assets/automations/gather_facts/database/mysql/main.yml b/apps/assets/automations/gather_facts/database/mysql/main.yml index 24d0acde4..ac8c27ac2 100644 --- a/apps/assets/automations/gather_facts/database/mysql/main.yml +++ b/apps/assets/automations/gather_facts/database/mysql/main.yml @@ -5,7 +5,7 @@ check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Get info diff --git a/apps/assets/automations/gather_facts/database/postgresql/main.yml b/apps/assets/automations/gather_facts/database/postgresql/main.yml index e7bea6002..8a95cdba7 100644 --- a/apps/assets/automations/gather_facts/database/postgresql/main.yml +++ b/apps/assets/automations/gather_facts/database/postgresql/main.yml @@ -6,7 +6,7 @@ check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Get info diff --git a/apps/assets/automations/ping/database/mysql/main.yml b/apps/assets/automations/ping/database/mysql/main.yml index 2a05ee2ab..8326402cd 100644 --- a/apps/assets/automations/ping/database/mysql/main.yml +++ b/apps/assets/automations/ping/database/mysql/main.yml @@ -5,7 +5,7 @@ check_ssl: "{{ jms_asset.spec_info.use_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Test MySQL connection diff --git a/apps/assets/automations/ping/database/postgresql/main.yml b/apps/assets/automations/ping/database/postgresql/main.yml index 3b29340e0..5e072f63a 100644 --- a/apps/assets/automations/ping/database/postgresql/main.yml +++ b/apps/assets/automations/ping/database/postgresql/main.yml @@ -6,7 +6,7 @@ check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" - ssl_key: "{{ jms_asset.secret_info.client_cert | default('') }}" + ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" tasks: - name: Test PostgreSQL connection diff --git a/requirements/collections.yml b/requirements/collections.yml new file mode 100644 index 000000000..c6ab2ad91 --- /dev/null +++ b/requirements/collections.yml @@ -0,0 +1,3 @@ +collections: + - name: community.postgresql + version: 2.4.0 \ No newline at end of file From 1d280599aeb05a1a2596d399a9bb6424f603a310 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 12 Sep 2024 10:53:06 +0000 Subject: [PATCH 54/98] perf: Update Dockerfile with new base image tag --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0168efb66..81bf9261c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM jumpserver/core-base:20240909_110723 AS stage-build +FROM jumpserver/core-base:20240912_103924 AS stage-build ARG VERSION From c3798bfa95139d67fb12d2382b720aed51d8e6b6 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Fri, 13 Sep 2024 11:03:53 +0800 Subject: [PATCH 55/98] fix: Internal letter hyperlinks cannot be redirected --- apps/common/utils/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/utils/common.py b/apps/common/utils/common.py index 4715906df..cb4794b66 100644 --- a/apps/common/utils/common.py +++ b/apps/common/utils/common.py @@ -427,7 +427,7 @@ def is_macos(): def convert_html_to_markdown(html_str): h = html2text.HTML2Text() h.body_width = 0 - h.ignore_links = True + h.ignore_links = False markdown = h.handle(html_str) markdown = markdown.replace('\n\n', '\n') From 85129da942eefc92bdf20084d4254f754b78f28c Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Fri, 13 Sep 2024 17:44:26 +0800 Subject: [PATCH 56/98] perf: Postgresql add ssl mode --- .../database/postgresql/main.yml | 13 +- .../database/postgresql/main.yml | 5 +- .../push_account/database/postgresql/main.yml | 13 +- .../database/postgresql/main.yml | 5 +- .../database/postgresql/main.yml | 5 +- apps/accounts/tasks/automation.py | 16 +- apps/accounts/tasks/backup_account.py | 4 +- apps/accounts/tasks/push_account.py | 4 +- apps/accounts/tasks/remove_account.py | 12 +- apps/accounts/tasks/template.py | 6 +- apps/accounts/tasks/vault.py | 5 +- apps/accounts/tasks/verify_account.py | 4 +- .../gather_facts/database/postgresql/main.yml | 5 +- .../ping/database/postgresql/main.yml | 5 +- apps/assets/const/__init__.py | 1 + apps/assets/const/database.py | 9 + .../migrations/0006_database_pg_ssl_mode.py | 23 + apps/assets/models/asset/database.py | 5 + apps/assets/serializers/asset/database.py | 7 +- apps/assets/tasks/gather_facts.py | 6 +- apps/assets/tasks/nodes_amount.py | 23 +- apps/assets/tasks/ping.py | 5 +- apps/assets/tasks/ping_gateway.py | 5 +- apps/audits/tasks.py | 12 +- apps/authentication/tasks.py | 8 +- apps/common/tasks.py | 17 +- apps/common/utils/verify_code.py | 6 +- apps/i18n/chen/ja.json | 3 + apps/i18n/chen/zh_hant.json | 3 + apps/i18n/core/en/LC_MESSAGES/django.po | 882 +++++++-- apps/i18n/core/ja/LC_MESSAGES/django.po | 1704 +++++++++-------- apps/i18n/core/zh/LC_MESSAGES/django.po | 727 +++---- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 1362 ++++++++----- apps/i18n/koko/en.json | 7 +- apps/i18n/koko/ja.json | 5 + apps/i18n/koko/zh.json | 6 +- apps/i18n/koko/zh_hant.json | 5 + apps/i18n/lina/ja.json | 1 + apps/i18n/lina/zh_hant.json | 1 + apps/notifications/notifications.py | 7 +- apps/ops/tasks.py | 39 +- apps/perms/tasks.py | 12 +- apps/settings/tasks/ldap.py | 23 +- apps/terminal/tasks.py | 42 +- apps/users/signal_handlers.py | 6 +- apps/users/tasks.py | 30 +- 46 files changed, 2949 insertions(+), 2145 deletions(-) create mode 100644 apps/assets/migrations/0006_database_pg_ssl_mode.py diff --git a/apps/accounts/automations/change_secret/database/postgresql/main.yml b/apps/accounts/automations/change_secret/database/postgresql/main.yml index de7dfe019..34dea98b7 100644 --- a/apps/accounts/automations/change_secret/database/postgresql/main.yml +++ b/apps/accounts/automations/change_secret/database/postgresql/main.yml @@ -3,7 +3,6 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl }}" - check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" @@ -16,10 +15,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" register: result failed_when: not result.is_available @@ -37,10 +36,10 @@ db: "{{ jms_asset.spec_info.db_name }}" name: "{{ account.username }}" password: "{{ account.secret }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" role_attr_flags: LOGIN ignore_errors: true when: result is succeeded @@ -52,7 +51,7 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" db: "{{ jms_asset.spec_info.db_name }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" diff --git a/apps/accounts/automations/gather_accounts/database/postgresql/main.yml b/apps/accounts/automations/gather_accounts/database/postgresql/main.yml index 10bd75fce..0d2093aab 100644 --- a/apps/accounts/automations/gather_accounts/database/postgresql/main.yml +++ b/apps/accounts/automations/gather_accounts/database/postgresql/main.yml @@ -3,7 +3,6 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl }}" - check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" @@ -16,10 +15,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" filter: "roles" register: db_info diff --git a/apps/accounts/automations/push_account/database/postgresql/main.yml b/apps/accounts/automations/push_account/database/postgresql/main.yml index 7a12a4452..1a74d0cb0 100644 --- a/apps/accounts/automations/push_account/database/postgresql/main.yml +++ b/apps/accounts/automations/push_account/database/postgresql/main.yml @@ -3,7 +3,6 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl }}" - check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" @@ -16,10 +15,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" register: result failed_when: not result.is_available @@ -37,10 +36,10 @@ db: "{{ jms_asset.spec_info.db_name }}" name: "{{ account.username }}" password: "{{ account.secret }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" role_attr_flags: LOGIN ignore_errors: true when: result is succeeded @@ -53,10 +52,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" db: "{{ jms_asset.spec_info.db_name }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" when: - result is succeeded - change_info is succeeded diff --git a/apps/accounts/automations/remove_account/database/postgresql/main.yml b/apps/accounts/automations/remove_account/database/postgresql/main.yml index 20290fdb9..3aad331f2 100644 --- a/apps/accounts/automations/remove_account/database/postgresql/main.yml +++ b/apps/accounts/automations/remove_account/database/postgresql/main.yml @@ -3,7 +3,6 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl }}" - check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" @@ -17,8 +16,8 @@ login_port: "{{ jms_asset.port }}" db: "{{ jms_asset.spec_info.db_name }}" name: "{{ account.username }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" state: absent diff --git a/apps/accounts/automations/verify_account/database/postgresql/main.yml b/apps/accounts/automations/verify_account/database/postgresql/main.yml index 5f5aa4689..9667d335b 100644 --- a/apps/accounts/automations/verify_account/database/postgresql/main.yml +++ b/apps/accounts/automations/verify_account/database/postgresql/main.yml @@ -3,7 +3,6 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl }}" - check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" @@ -16,9 +15,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" db: "{{ jms_asset.spec_info.db_name }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" register: result failed_when: not result.is_available diff --git a/apps/accounts/tasks/automation.py b/apps/accounts/tasks/automation.py index 45eb45b2e..3d1eb0883 100644 --- a/apps/accounts/tasks/automation.py +++ b/apps/accounts/tasks/automation.py @@ -32,11 +32,9 @@ def task_activity_callback(self, pid, trigger, tp, *args, **kwargs): verbose_name=_('Account execute automation'), activity_callback=task_activity_callback, description=_( - """ - Unified execution entry for account automation tasks: when the system performs tasks + """Unified execution entry for account automation tasks: when the system performs tasks such as account push, password change, account verification, account collection, - and gateway account verification, all tasks are executed through this unified entry - """ + and gateway account verification, all tasks are executed through this unified entry""" ) ) def execute_account_automation_task(pid, trigger, tp): @@ -66,9 +64,7 @@ def record_task_activity_callback(self, record_ids, *args, **kwargs): verbose_name=_('Execute automation record'), activity_callback=record_task_activity_callback, description=_( - """ - When manually executing password change records, this task is used - """ + """When manually executing password change records, this task is used""" ) ) def execute_automation_record_task(record_ids, tp): @@ -99,16 +95,14 @@ def execute_automation_record_task(record_ids, tp): @shared_task( verbose_name=_('Clean change secret and push record period'), description=_( - """ - The system will periodically clean up unnecessary password change and push records, + """The system will periodically clean up unnecessary password change and push records, including their associated change tasks, execution logs, assets, and accounts. When any of these associated items are deleted, the corresponding password change and push records become invalid. Therefore, to maintain a clean and efficient database, the system will clean up expired records at 2 a.m daily, based on the interval specified by PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup mechanism helps free up storage space and enhances the security and overall performance - of data management - """ + of data management""" ) ) @register_as_period_task(crontab=CRONTAB_AT_AM_THREE) diff --git a/apps/accounts/tasks/backup_account.py b/apps/accounts/tasks/backup_account.py index d491c78f5..d7d708c86 100644 --- a/apps/accounts/tasks/backup_account.py +++ b/apps/accounts/tasks/backup_account.py @@ -26,9 +26,7 @@ def task_activity_callback(self, pid, trigger, *args, **kwargs): verbose_name=_('Execute account backup plan'), activity_callback=task_activity_callback, description=_( - """ - When performing scheduled or manual account backups, this task is used - """ + "When performing scheduled or manual account backups, this task is used" ) ) def execute_account_backup_task(pid, trigger, **kwargs): diff --git a/apps/accounts/tasks/push_account.py b/apps/accounts/tasks/push_account.py index 280d9b3a3..479b88c72 100644 --- a/apps/accounts/tasks/push_account.py +++ b/apps/accounts/tasks/push_account.py @@ -16,9 +16,7 @@ __all__ = [ verbose_name=_('Push accounts to assets'), activity_callback=lambda self, account_ids, *args, **kwargs: (account_ids, None), description=_( - """ - When creating or modifying an account requires account push, this task is executed - """ + "When creating or modifying an account requires account push, this task is executed" ) ) def push_accounts_to_assets_task(account_ids, params=None): diff --git a/apps/accounts/tasks/remove_account.py b/apps/accounts/tasks/remove_account.py index 60fe82327..f5f1936f5 100644 --- a/apps/accounts/tasks/remove_account.py +++ b/apps/accounts/tasks/remove_account.py @@ -25,10 +25,8 @@ __all__ = ['remove_accounts_task'] verbose_name=_('Remove account'), activity_callback=lambda self, gather_account_ids, *args, **kwargs: (gather_account_ids, None), description=_( - """ - When clicking "Sync deletion" in 'Console - Gather Account - Gathered accounts' this - task will be executed - """ + """When clicking "Sync deletion" in 'Console - Gather Account - Gathered accounts' this + task will be executed""" ) ) def remove_accounts_task(gather_account_ids): @@ -51,12 +49,10 @@ def remove_accounts_task(gather_account_ids): @shared_task( verbose_name=_('Clean historical accounts'), description=_( - """ - Each time an asset account is updated, a historical account is generated, so it is + """Each time an asset account is updated, a historical account is generated, so it is necessary to clean up the asset account history. The system will clean up excess account records at 2 a.m. daily based on the configuration in the "System settings - Features - - Account storage - Record limit - """ + Account storage - Record limit""" ) ) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) diff --git a/apps/accounts/tasks/template.py b/apps/accounts/tasks/template.py index c4c781557..578911c83 100644 --- a/apps/accounts/tasks/template.py +++ b/apps/accounts/tasks/template.py @@ -11,10 +11,8 @@ from orgs.utils import tmp_to_root_org, tmp_to_org verbose_name=_('Template sync info to related accounts'), activity_callback=lambda self, template_id, *args, **kwargs: (template_id, None), description=_( - """ - When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - - Accounts' this task will be executed - """ + """When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - + Accounts' this task will be executed""" ) ) def template_sync_related_accounts(template_id, user_id=None): diff --git a/apps/accounts/tasks/vault.py b/apps/accounts/tasks/vault.py index 2ef1f742c..128543ed3 100644 --- a/apps/accounts/tasks/vault.py +++ b/apps/accounts/tasks/vault.py @@ -31,10 +31,7 @@ def sync_instance(instance): @shared_task( verbose_name=_('Sync secret to vault'), description=_( - """ - When clicking 'Sync' in 'System Settings - Features - Account Storage' this task will - be executed - """ + "When clicking 'Sync' in 'System Settings - Features - Account Storage' this task will be executed" ) ) def sync_secret_to_vault(): diff --git a/apps/accounts/tasks/verify_account.py b/apps/accounts/tasks/verify_account.py index 88fd31049..be3e085b5 100644 --- a/apps/accounts/tasks/verify_account.py +++ b/apps/accounts/tasks/verify_account.py @@ -50,9 +50,7 @@ def verify_accounts_connectivity_util(accounts, task_name): verbose_name=_('Verify asset account availability'), activity_callback=lambda self, account_ids, *args, **kwargs: (account_ids, None), description=_( - """ - When clicking 'Test' in 'Console - Asset details - Accounts' this task will be executed - """ + "When clicking 'Test' in 'Console - Asset details - Accounts' this task will be executed" ) ) def verify_accounts_connectivity_task(account_ids): diff --git a/apps/assets/automations/gather_facts/database/postgresql/main.yml b/apps/assets/automations/gather_facts/database/postgresql/main.yml index 8a95cdba7..e730f8f85 100644 --- a/apps/assets/automations/gather_facts/database/postgresql/main.yml +++ b/apps/assets/automations/gather_facts/database/postgresql/main.yml @@ -3,7 +3,6 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl }}" - check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" @@ -16,10 +15,10 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" register: db_info - name: Define info by set_fact diff --git a/apps/assets/automations/ping/database/postgresql/main.yml b/apps/assets/automations/ping/database/postgresql/main.yml index 5e072f63a..3edc7daec 100644 --- a/apps/assets/automations/ping/database/postgresql/main.yml +++ b/apps/assets/automations/ping/database/postgresql/main.yml @@ -3,7 +3,6 @@ vars: ansible_python_interpreter: /opt/py3/bin/python check_ssl: "{{ jms_asset.spec_info.use_ssl }}" - check_ca: "{{ check_ssl and not jms_asset.spec_info.allow_invalid_cert }}" ca_cert: "{{ jms_asset.secret_info.ca_cert | default('') }}" ssl_cert: "{{ jms_asset.secret_info.client_cert | default('') }}" ssl_key: "{{ jms_asset.secret_info.client_key | default('') }}" @@ -16,9 +15,9 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" login_db: "{{ jms_asset.spec_info.db_name }}" - ca_cert: "{{ ca_cert if check_ca and ca_cert | length > 0 else omit }}" + ca_cert: "{{ ca_cert if check_ssl and ca_cert | length > 0 else omit }}" ssl_cert: "{{ ssl_cert if check_ssl and ssl_cert | length > 0 else omit }}" ssl_key: "{{ ssl_key if check_ssl and ssl_key | length > 0 else omit }}" - ssl_mode: "{{ 'verify-full' if check_ca else 'require' if check_ssl else 'prefer' }}" + ssl_mode: "{{ jms_asset.spec_info.pg_ssl_mode }}" register: result failed_when: not result.is_available diff --git a/apps/assets/const/__init__.py b/apps/assets/const/__init__.py index abf7e71b1..415179539 100644 --- a/apps/assets/const/__init__.py +++ b/apps/assets/const/__init__.py @@ -1,6 +1,7 @@ from .automation import * from .base import * from .category import * +from .database import * from .host import * from .platform import * from .protocol import * diff --git a/apps/assets/const/database.py b/apps/assets/const/database.py index 9457cc427..8acbdbb43 100644 --- a/apps/assets/const/database.py +++ b/apps/assets/const/database.py @@ -1,3 +1,5 @@ +from django.db.models import TextChoices + from .base import BaseType @@ -120,3 +122,10 @@ class DatabaseTypes(BaseType): cls.MYSQL, cls.MARIADB, cls.POSTGRESQL, cls.MONGODB, cls.REDIS, ] + + +class PostgresqlSSLMode(TextChoices): + PREFER = 'prefer', 'Prefer' + REQUIRE = 'require', 'Require' + VERIFY_CA = 'verify-ca', 'Verify CA' + VERIFY_FULL = 'verify-full', 'Verify Full' diff --git a/apps/assets/migrations/0006_database_pg_ssl_mode.py b/apps/assets/migrations/0006_database_pg_ssl_mode.py new file mode 100644 index 000000000..6382f2ea7 --- /dev/null +++ b/apps/assets/migrations/0006_database_pg_ssl_mode.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.13 on 2024-09-13 08:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('assets', '0005_myasset'), + ] + + operations = [ + migrations.AddField( + model_name='database', + name='pg_ssl_mode', + field=models.CharField(choices=[ + ('prefer', 'Prefer'), + ('require', 'Require'), + ('verify-ca', 'Verify CA'), + ('verify-full', 'Verify Full') + ], default='prefer', + max_length=16, verbose_name='Postgresql SSL mode'), + ), + ] diff --git a/apps/assets/models/asset/database.py b/apps/assets/models/asset/database.py index 12da55b30..b62a78f04 100644 --- a/apps/assets/models/asset/database.py +++ b/apps/assets/models/asset/database.py @@ -1,6 +1,7 @@ from django.db import models from django.utils.translation import gettext_lazy as _ +from assets.const import PostgresqlSSLMode from common.db.fields import EncryptTextField from .common import Asset @@ -12,6 +13,10 @@ class Database(Asset): client_cert = EncryptTextField(verbose_name=_("Client cert"), blank=True) client_key = EncryptTextField(verbose_name=_("Client key"), blank=True) allow_invalid_cert = models.BooleanField(default=False, verbose_name=_('Allow invalid cert')) + pg_ssl_mode = models.CharField( + max_length=16, choices=PostgresqlSSLMode.choices, + default=PostgresqlSSLMode.PREFER, verbose_name=_('Postgresql SSL mode') + ) def __str__(self): return '{}({}://{}/{})'.format(self.name, self.type, self.address, self.db_name) diff --git a/apps/assets/serializers/asset/database.py b/apps/assets/serializers/asset/database.py index d9a4bf1b0..84703b74f 100644 --- a/apps/assets/serializers/asset/database.py +++ b/apps/assets/serializers/asset/database.py @@ -16,9 +16,14 @@ class DatabaseSerializer(AssetSerializer): model = Database extra_fields = [ 'db_name', 'use_ssl', 'ca_cert', 'client_cert', - 'client_key', 'allow_invalid_cert' + 'client_key', 'allow_invalid_cert', 'pg_ssl_mode' ] fields = AssetSerializer.Meta.fields + extra_fields + extra_kwargs = { + 'ca_cert': {'help_text': _('CA cert help text')}, + 'pg_ssl_mode': {'help_text': _('Postgresql ssl model help text')}, + } + extra_kwargs.update(AssetSerializer.Meta.extra_kwargs) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/apps/assets/tasks/gather_facts.py b/apps/assets/tasks/gather_facts.py index 499c58995..60e7c9396 100644 --- a/apps/assets/tasks/gather_facts.py +++ b/apps/assets/tasks/gather_facts.py @@ -22,10 +22,8 @@ __all__ = [ verbose_name=_('Gather assets facts'), activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id), description=_( - """ - When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task - will be executed - """ + """When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task + will be executed""" ) ) def gather_assets_facts_task(asset_ids, org_id, task_name=None): diff --git a/apps/assets/tasks/nodes_amount.py b/apps/assets/tasks/nodes_amount.py index c660c314e..db435bd34 100644 --- a/apps/assets/tasks/nodes_amount.py +++ b/apps/assets/tasks/nodes_amount.py @@ -1,14 +1,13 @@ from celery import shared_task from django.utils.translation import gettext_lazy as _ -from orgs.models import Organization -from orgs.utils import tmp_to_org -from ops.celery.decorator import register_as_period_task from assets.utils import check_node_assets_amount - -from common.utils.lock import AcquireFailed -from common.utils import get_logger from common.const.crontab import CRONTAB_AT_AM_TWO +from common.utils import get_logger +from common.utils.lock import AcquireFailed +from ops.celery.decorator import register_as_period_task +from orgs.models import Organization +from orgs.utils import tmp_to_org logger = get_logger(__file__) @@ -16,11 +15,9 @@ logger = get_logger(__file__) @shared_task( verbose_name=_('Check the amount of assets under the node'), description=_( - """ - Manually verifying asset quantities updates the asset count for nodes under the + """Manually verifying asset quantities updates the asset count for nodes under the current organization. This task will be called in the following two cases: when updating - nodes and when the number of nodes exceeds 100 - """ + nodes and when the number of nodes exceeds 100""" ) ) def check_node_assets_amount_task(org_id=None): @@ -42,10 +39,8 @@ def check_node_assets_amount_task(org_id=None): @shared_task( verbose_name=_('Periodic check the amount of assets under the node'), description=_( - """ - Schedule the check_node_assets_amount_task to periodically update the asset count of - all nodes under all organizations - """ + """Schedule the check_node_assets_amount_task to periodically update the asset count of + all nodes under all organizations""" ) ) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) diff --git a/apps/assets/tasks/ping.py b/apps/assets/tasks/ping.py index e441a63a0..3d6d29bd9 100644 --- a/apps/assets/tasks/ping.py +++ b/apps/assets/tasks/ping.py @@ -21,10 +21,7 @@ __all__ = [ queue='ansible', activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id), description=_( - """ - When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' this task - will be executed - """ + "When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' this task will be executed" ) ) def test_assets_connectivity_task(asset_ids, org_id, task_name=None): diff --git a/apps/assets/tasks/ping_gateway.py b/apps/assets/tasks/ping_gateway.py index dad7a6a6e..4bdfc2cc7 100644 --- a/apps/assets/tasks/ping_gateway.py +++ b/apps/assets/tasks/ping_gateway.py @@ -20,10 +20,7 @@ __all__ = [ queue='ansible', activity_callback=lambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id), description=_( - """ - When clicking 'Test Connection' in 'Domain Details - Gateway' this task will be - executed - """ + "When clicking 'Test Connection' in 'Domain Details - Gateway' this task will be executed" ) ) def test_gateways_connectivity_task(asset_ids, org_id, local_port, task_name=None): diff --git a/apps/audits/tasks.py b/apps/audits/tasks.py index fddc8bc69..013141f82 100644 --- a/apps/audits/tasks.py +++ b/apps/audits/tasks.py @@ -131,12 +131,10 @@ def clean_expired_session_period(): @shared_task( verbose_name=_('Clean audits session task log'), description=_( - """ - Since the system generates login logs, operation logs, file upload logs, activity + """Since the system generates login logs, operation logs, file upload logs, activity logs, Celery execution logs, session recordings, command records, and password change logs, it will perform cleanup of records that exceed the time limit according to the - 'Tasks - Regular clean-up' in the system settings at 2 a.m daily - """ + 'Tasks - Regular clean-up' in the system settings at 2 a.m daily""" ) ) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) @@ -155,10 +153,8 @@ def clean_audits_log_period(): @shared_task( verbose_name=_('Upload FTP file to external storage'), description=_( - """ - If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be - synchronized to external storage - """ + """If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be + synchronized to external storage""" ) ) def upload_ftp_file_to_external_storage(ftp_log_id, file_name): diff --git a/apps/authentication/tasks.py b/apps/authentication/tasks.py index db7c9124a..acd940978 100644 --- a/apps/authentication/tasks.py +++ b/apps/authentication/tasks.py @@ -2,19 +2,17 @@ # from celery import shared_task -from ops.celery.decorator import register_as_period_task from django.contrib.sessions.models import Session from django.utils import timezone from django.utils.translation import gettext_lazy as _ +from ops.celery.decorator import register_as_period_task + @shared_task( verbose_name=_('Clean expired session'), description=_( - """ - Since user logins create sessions, the system will clean up expired sessions every 24 - hours - """ + "Since user logins create sessions, the system will clean up expired sessions every 24 hours" ) ) @register_as_period_task(interval=3600 * 24) diff --git a/apps/common/tasks.py b/apps/common/tasks.py index dd2645c9a..06f15a4c3 100644 --- a/apps/common/tasks.py +++ b/apps/common/tasks.py @@ -1,10 +1,10 @@ import os +import jms_storage from celery import shared_task from django.conf import settings from django.core.mail import send_mail, EmailMultiAlternatives, get_connection from django.utils.translation import gettext_lazy as _ -import jms_storage from .utils import get_logger @@ -32,9 +32,7 @@ def task_activity_callback(self, subject, message, recipient_list, *args, **kwar verbose_name=_("Send email"), activity_callback=task_activity_callback, description=_( - """ - This task will be executed when sending email notifications - """ + "This task will be executed when sending email notifications" ) ) def send_mail_async(*args, **kwargs): @@ -67,10 +65,8 @@ def send_mail_async(*args, **kwargs): verbose_name=_("Send email attachment"), activity_callback=task_activity_callback, description=_( - """ - When an account password is changed or an account backup generates attachments, - this task needs to be executed for sending emails and handling attachments - """ + """When an account password is changed or an account backup generates attachments, + this task needs to be executed for sending emails and handling attachments""" ) ) def send_mail_attachment_async(subject, message, recipient_list, attachment_list=None): @@ -97,10 +93,7 @@ def send_mail_attachment_async(subject, message, recipient_list, attachment_list @shared_task( verbose_name=_('Upload account backup to external storage'), description=_( - """ - When performing an account backup, this task needs to be executed to external storage - (SFTP) - """ + "When performing an account backup, this task needs to be executed to external storage (SFTP)" ) ) def upload_backup_to_obj_storage(recipient, upload_file): diff --git a/apps/common/utils/verify_code.py b/apps/common/utils/verify_code.py index 8dc575d6c..a5f6c668c 100644 --- a/apps/common/utils/verify_code.py +++ b/apps/common/utils/verify_code.py @@ -16,10 +16,8 @@ logger = get_logger(__file__) @shared_task( verbose_name=_('Send SMS code'), description=_( - """ - When resetting a password, forgetting a password, or verifying MFA, this task needs to - be executed to send SMS messages - """ + """When resetting a password, forgetting a password, or verifying MFA, this task needs to + be executed to send SMS messages""" ) ) def send_sms_async(target, code): diff --git a/apps/i18n/chen/ja.json b/apps/i18n/chen/ja.json index 981db677e..b04aca68a 100644 --- a/apps/i18n/chen/ja.json +++ b/apps/i18n/chen/ja.json @@ -9,6 +9,7 @@ "CommandReviewMessage": "入力されたコマンドはレビュー後に実行されます。レビューリクエストを送信しますか?", "CommandReviewRejectBy": "コマンドレビューが%sに拒否されました", "CommandReviewTimeoutError": "コマンドレビューがタイムアウトしました", + "CommandWarningDialogMessage": "あなたが実行したコマンドにはリスクがあり、警告通知が管理者に送信されます。続行しますか?", "Confirm": "確認", "ConnectError": "接続に失敗しました", "ConnectSuccess": "接続に成功しました", @@ -22,6 +23,7 @@ "ErrorMessage": "エラーメッセージ", "ExecuteError": "実行に失敗しました", "ExecuteSuccess": "実行に成功しました", + "ExecutionCanceled": "実行がキャンセルされました", "ExportALL": "すべてのデータをエクスポート", "ExportAll": "すべてエクスポート", "ExportCurrent": "現在のページをエクスポート", @@ -67,5 +69,6 @@ "Version": "バージョン", "ViewData": "データを見る", "WaitCommandReviewMessage": "レビューリクエストが送信されました。レビュー結果をお待ちください", + "Warning": "警告", "initializingDatasourceFailedMessage": "接続に失敗しました。データベース接続設定が正しいか確認してください" } \ No newline at end of file diff --git a/apps/i18n/chen/zh_hant.json b/apps/i18n/chen/zh_hant.json index 83eed337d..253fb449b 100644 --- a/apps/i18n/chen/zh_hant.json +++ b/apps/i18n/chen/zh_hant.json @@ -9,6 +9,7 @@ "CommandReviewMessage": "您輸入的命令需要覆核後才可以執行,是否發起覆核請求?", "CommandReviewRejectBy": "命令覆核被 %s 拒絕", "CommandReviewTimeoutError": "命令覆核超時", + "CommandWarningDialogMessage": "您進行的動作存在風險,警告通知將會寄給管理員。你確定要繼續嗎?", "Confirm": "確認", "ConnectError": "連接失敗", "ConnectSuccess": "連接成功", @@ -22,6 +23,7 @@ "ErrorMessage": "錯誤消息", "ExecuteError": "執行失敗", "ExecuteSuccess": "執行成功", + "ExecutionCanceled": "動作已取消", "ExportALL": "匯出所有資料", "ExportAll": "匯出全部", "ExportCurrent": "匯出當前頁面", @@ -67,5 +69,6 @@ "Version": "版本", "ViewData": "查看資料", "WaitCommandReviewMessage": "覆核請求已發起,請等待覆核結果", + "Warning": "警告。", "initializingDatasourceFailedMessage": "連接失敗,請檢查資料庫連接配置是否正確" } \ No newline at end of file diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index 3587e66bb..e0aecdcfc 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 16:05+0800\n" +"POT-Creation-Date: 2024-09-13 17:22+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -125,9 +125,10 @@ msgstr "" #: authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 -#: settings/serializers/msg.py:37 settings/serializers/terminal.py:28 -#: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142 -#: users/forms/profile.py:21 users/serializers/user.py:144 +#: settings/serializers/auth/ldap_ha.py:34 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: terminal/serializers/storage.py:142 users/forms/profile.py:21 +#: users/serializers/user.py:144 #: users/templates/users/_msg_user_created.html:13 #: users/templates/users/user_password_verify.html:18 #: xpack/plugins/cloud/serializers/account_attrs.py:28 @@ -208,8 +209,8 @@ msgstr "" msgid "Verify account" msgstr "" -#: accounts/const/automation.py:27 accounts/tasks/remove_account.py:24 -#: accounts/tasks/remove_account.py:33 +#: accounts/const/automation.py:27 accounts/tasks/remove_account.py:25 +#: accounts/tasks/remove_account.py:38 msgid "Remove account" msgstr "" @@ -311,7 +312,7 @@ msgid "Pending" msgstr "" #: accounts/const/vault.py:8 assets/const/category.py:12 -#: assets/models/asset/database.py:9 assets/models/asset/database.py:24 +#: assets/models/asset/database.py:10 assets/models/asset/database.py:29 msgid "Database" msgstr "" @@ -459,7 +460,7 @@ msgstr "" #: accounts/models/automations/backup_account.py:120 #: assets/models/automations/base.py:115 audits/models.py:65 -#: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:242 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:242 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:25 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -471,7 +472,7 @@ msgstr "" #: accounts/models/automations/backup_account.py:123 #: authentication/templates/authentication/_msg_oauth_bind.html:11 -#: notifications/notifications.py:194 +#: notifications/notifications.py:199 #: settings/templates/ldap/_msg_import_ldap_user.html:3 msgid "Time" msgstr "" @@ -550,7 +551,8 @@ msgstr "" #: accounts/models/automations/gather_account.py:58 #: accounts/serializers/account/backup.py:40 #: accounts/serializers/automations/change_secret.py:58 -#: settings/serializers/auth/ldap.py:100 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:100 +#: settings/serializers/auth/ldap_ha.py:82 settings/serializers/msg.py:45 msgid "Recipient" msgstr "Recipients" @@ -572,7 +574,7 @@ msgstr "" #: accounts/models/automations/change_secret.py:42 #: assets/models/automations/base.py:116 ops/models/base.py:56 -#: ops/models/celery.py:89 ops/models/job.py:243 +#: ops/models/celery.py:90 ops/models/job.py:243 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "" @@ -634,7 +636,7 @@ msgid "Address login" msgstr "" #: accounts/models/automations/gather_account.py:44 -#: accounts/tasks/gather_accounts.py:29 +#: accounts/tasks/gather_accounts.py:30 msgid "Gather asset accounts" msgstr "" @@ -708,8 +710,8 @@ msgstr "" #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 #: authentication/serializers/connect_token_secret.py:169 labels/models.py:11 -#: ops/mixin.py:21 ops/models/adhoc.py:20 ops/models/celery.py:15 -#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28 +#: ops/mixin.py:28 ops/models/adhoc.py:19 ops/models/celery.py:15 +#: ops/models/celery.py:81 ops/models/job.py:142 ops/models/playbook.py:30 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 @@ -879,7 +881,7 @@ msgstr "" msgid "Has secret" msgstr "" -#: accounts/serializers/account/account.py:272 ops/models/celery.py:83 +#: accounts/serializers/account/account.py:272 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" @@ -1027,8 +1029,8 @@ msgid "" msgstr "" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 -#: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 +#: ops/models/job.py:158 ops/models/playbook.py:33 rbac/models/role.py:37 #: settings/models.py:40 terminal/models/applet/applet.py:46 #: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 #: terminal/models/component/endpoint.py:25 @@ -1111,47 +1113,101 @@ msgstr "" msgid "Delete account: %s" msgstr "" -#: accounts/tasks/automation.py:31 +#: accounts/tasks/automation.py:32 msgid "Account execute automation" msgstr "" -#: accounts/tasks/automation.py:57 accounts/tasks/automation.py:62 +#: accounts/tasks/automation.py:35 +msgid "" +"Unified execution entry for account automation tasks: when the system " +"performs tasks \n" +" such as account push, password change, account verification, account " +"collection, \n" +" and gateway account verification, all tasks are executed through " +"this unified entry" +msgstr "" + +#: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72 msgid "Execute automation record" msgstr "" -#: accounts/tasks/automation.py:86 +#: accounts/tasks/automation.py:67 +msgid "When manually executing password change records, this task is used" +msgstr "" + +#: accounts/tasks/automation.py:96 msgid "Clean change secret and push record period" msgstr "" -#: accounts/tasks/automation.py:87 -msgid "Clean change secret and push record period description" +#: accounts/tasks/automation.py:98 +msgid "" +"The system will periodically clean up unnecessary password change and push " +"records, \n" +" including their associated change tasks, execution logs, assets, and " +"accounts. When any \n" +" of these associated items are deleted, the corresponding password " +"change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient " +"database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval " +"specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " +"This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and " +"overall performance \n" +" of data management" msgstr "" -"The system will periodically clean up unnecessary change secret records and " -"push records, including those associated with change tasks, execution " -"records, assets, and accounts. When any of these associated items are " -"deleted, the corresponding change secret and push records become invalid. " -"Therefore, to maintain a tidy and efficient database, the system " -"automatically cleans up these invalid records every 180 days by default. " -"This regular cleanup process helps free up storage space and improves the " -"security and overall performance of data management." -#: accounts/tasks/backup_account.py:25 +#: accounts/tasks/backup_account.py:26 msgid "Execute account backup plan" msgstr "" -#: accounts/tasks/gather_accounts.py:34 +#: accounts/tasks/backup_account.py:29 +msgid "When performing scheduled or manual account backups, this task is used" +msgstr "" + +#: accounts/tasks/gather_accounts.py:32 assets/tasks/automation.py:27 +#: orgs/tasks.py:11 terminal/tasks.py:33 +msgid "Unused" +msgstr "" + +#: accounts/tasks/gather_accounts.py:36 msgid "Gather assets accounts" msgstr "" -#: accounts/tasks/push_account.py:15 accounts/tasks/push_account.py:23 +#: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:27 msgid "Push accounts to assets" msgstr "" -#: accounts/tasks/remove_account.py:44 +#: accounts/tasks/push_account.py:19 +msgid "" +"When creating or modifying an account requires account push, this task is " +"executed" +msgstr "" + +#: accounts/tasks/remove_account.py:28 +msgid "" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " +"accounts' this \n" +" task will be executed" +msgstr "" + +#: accounts/tasks/remove_account.py:50 msgid "Clean historical accounts" msgstr "" -#: accounts/tasks/remove_account.py:76 +#: accounts/tasks/remove_account.py:52 +msgid "" +"Each time an asset account is updated, a historical account is generated, so " +"it is \n" +" necessary to clean up the asset account history. The system will " +"clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System " +"settings - Features - \n" +" Account storage - Record limit" +msgstr "" + +#: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." msgstr "" @@ -1159,15 +1215,34 @@ msgstr "" msgid "Template sync info to related accounts" msgstr "" -#: accounts/tasks/vault.py:31 +#: accounts/tasks/template.py:14 +msgid "" +"When clicking 'Sync new secret to accounts' in 'Console - Account - " +"Templates - \n" +" Accounts' this task will be executed" +msgstr "" + +#: accounts/tasks/vault.py:32 msgid "Sync secret to vault" msgstr "" -#: accounts/tasks/verify_account.py:49 +#: accounts/tasks/vault.py:34 +msgid "" +"When clicking 'Sync' in 'System Settings - Features - Account Storage' this " +"task will be executed" +msgstr "" + +#: accounts/tasks/verify_account.py:50 msgid "Verify asset account availability" msgstr "" -#: accounts/tasks/verify_account.py:55 +#: accounts/tasks/verify_account.py:53 +msgid "" +"When clicking 'Test' in 'Console - Asset details - Accounts' this task will " +"be executed" +msgstr "" + +#: accounts/tasks/verify_account.py:59 msgid "Verify accounts connectivity" msgstr "" @@ -1496,32 +1571,32 @@ msgstr "" msgid "App Assets" msgstr "Assets" -#: assets/automations/base/manager.py:187 +#: assets/automations/base/manager.py:188 msgid "{} disabled" msgstr "" -#: assets/automations/base/manager.py:250 +#: assets/automations/base/manager.py:251 msgid " - Platform {} ansible disabled" msgstr "" -#: assets/automations/base/manager.py:323 +#: assets/automations/base/manager.py:324 msgid ">>> Task preparation phase" msgstr "" -#: assets/automations/base/manager.py:326 +#: assets/automations/base/manager.py:327 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr "" -#: assets/automations/base/manager.py:328 +#: assets/automations/base/manager.py:329 msgid ">>> Start executing tasks" msgstr "" -#: assets/automations/base/manager.py:330 +#: assets/automations/base/manager.py:331 msgid ">>> No tasks need to be executed" msgstr "" -#: assets/automations/base/manager.py:335 +#: assets/automations/base/manager.py:336 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr "" @@ -1663,7 +1738,11 @@ msgstr "" #: assets/const/protocol.py:53 msgid "Netcat help text" -msgstr "Use netcat (nc) as a proxy tool to forward connections from the proxy server to the target host. This is useful in environments that do not support the SSH native proxy option (-W), or when more flexibility and timeout control are needed." +msgstr "" +"Use netcat (nc) as a proxy tool to forward connections from the proxy server " +"to the target host. This is useful in environments that do not support the " +"SSH native proxy option (-W), or when more flexibility and timeout control " +"are needed." #: assets/const/protocol.py:64 msgid "SFTP root" @@ -1733,7 +1812,7 @@ msgstr "" msgid "We will consider login success when we see this prompt" msgstr "" -#: assets/const/protocol.py:145 assets/models/asset/database.py:10 +#: assets/const/protocol.py:145 assets/models/asset/database.py:11 #: settings/serializers/msg.py:49 msgid "Use SSL" msgstr "" @@ -1870,22 +1949,26 @@ msgstr "" msgid "Custom asset" msgstr "" -#: assets/models/asset/database.py:11 +#: assets/models/asset/database.py:12 msgid "CA cert" msgstr "" -#: assets/models/asset/database.py:12 +#: assets/models/asset/database.py:13 msgid "Client cert" msgstr "" -#: assets/models/asset/database.py:13 +#: assets/models/asset/database.py:14 msgid "Client key" msgstr "" -#: assets/models/asset/database.py:14 +#: assets/models/asset/database.py:15 msgid "Allow invalid cert" msgstr "" +#: assets/models/asset/database.py:18 +msgid "Postgresql SSL mode" +msgstr "" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:92 msgid "Proxy" msgstr "" @@ -2244,6 +2327,25 @@ msgstr "" msgid "Default database" msgstr "" +#: assets/serializers/asset/database.py:23 +msgid "CA cert help text" +msgstr "" +"The Common Name (CN) field has been deprecated. Please use the Subject " +"Alternative Name (SAN) field to verify the domain name according to RFC 5280 " +"for better security." + +#: assets/serializers/asset/database.py:24 +msgid "Postgresql ssl model help text" +msgstr "" +"Prefer: I don't care about encryption, but I wish to pay the overhead of " +"encryption if the server supports it.Require: I want my data to be " +"encrypted, and I accept the overhead. I trust that the network will make " +"sure I always connect to the server I want.Verify CA: I want my data " +"encrypted, and I accept the overhead. I want to be sure that I connect to a " +"server that I trust.Verify Full: I want my data encrypted, and I accept the " +"overhead. I want to be sure that I connect to a server I trust, and that " +"it's the one I specify." + #: assets/serializers/asset/gpt.py:20 msgid "" "If the server cannot directly connect to the API address, you need set up an " @@ -2442,7 +2544,7 @@ msgstr "" msgid "Protocols is required" msgstr "" -#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:35 +#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:39 msgid "Test assets connectivity " msgstr "" @@ -2450,19 +2552,26 @@ msgstr "" msgid "Gather asset hardware info" msgstr "" -#: assets/tasks/automation.py:24 +#: assets/tasks/automation.py:25 msgid "Asset execute automation" msgstr "" -#: assets/tasks/gather_facts.py:21 assets/tasks/gather_facts.py:27 +#: assets/tasks/gather_facts.py:22 assets/tasks/gather_facts.py:32 msgid "Gather assets facts" msgstr "" -#: assets/tasks/gather_facts.py:39 +#: assets/tasks/gather_facts.py:25 +msgid "" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " +"this task \n" +" will be executed" +msgstr "" + +#: assets/tasks/gather_facts.py:44 msgid "Update assets hardware info: " msgstr "" -#: assets/tasks/gather_facts.py:47 +#: assets/tasks/gather_facts.py:52 msgid "Update node asset hardware information: " msgstr "" @@ -2470,28 +2579,56 @@ msgstr "" msgid "Check the amount of assets under the node" msgstr "" -#: assets/tasks/nodes_amount.py:28 +#: assets/tasks/nodes_amount.py:18 +msgid "" +"Manually verifying asset quantities updates the asset count for nodes under " +"the \n" +" current organization. This task will be called in the following two " +"cases: when updating \n" +" nodes and when the number of nodes exceeds 100" +msgstr "" + +#: assets/tasks/nodes_amount.py:34 msgid "" "The task of self-checking is already running and cannot be started repeatedly" msgstr "" -#: assets/tasks/nodes_amount.py:33 +#: assets/tasks/nodes_amount.py:40 msgid "Periodic check the amount of assets under the node" msgstr "" -#: assets/tasks/ping.py:20 assets/tasks/ping.py:26 +#: assets/tasks/nodes_amount.py:42 +msgid "" +"Schedule the check_node_assets_amount_task to periodically update the asset " +"count of \n" +" all nodes under all organizations" +msgstr "" + +#: assets/tasks/ping.py:20 assets/tasks/ping.py:30 msgid "Test assets connectivity" msgstr "" -#: assets/tasks/ping.py:42 +#: assets/tasks/ping.py:24 +msgid "" +"When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' " +"this task will be executed" +msgstr "" + +#: assets/tasks/ping.py:46 msgid "Test if the assets under the node are connectable " msgstr "" -#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:25 -#: assets/tasks/ping_gateway.py:34 +#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:29 +#: assets/tasks/ping_gateway.py:38 msgid "Test gateways connectivity" msgstr "" +#: assets/tasks/ping_gateway.py:23 +msgid "" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " +"be executed" +msgstr "" + #: assets/tasks/utils.py:16 msgid "Asset has been disabled, skipped: {}" msgstr "" @@ -2598,7 +2735,7 @@ msgstr "" msgid "Close" msgstr "" -#: audits/const.py:41 ops/models/celery.py:84 +#: audits/const.py:41 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" @@ -2759,9 +2896,9 @@ msgstr "" msgid "Offline user session" msgstr "" -#: audits/serializers.py:33 ops/models/adhoc.py:25 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:86 ops/models/job.py:151 -#: ops/models/job.py:240 ops/models/playbook.py:30 +#: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:151 +#: ops/models/job.py:240 ops/models/playbook.py:32 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "" @@ -2816,7 +2953,7 @@ msgstr "" #: audits/signal_handlers/login_log.py:37 authentication/notifications.py:73 #: authentication/views/login.py:78 notifications/backends/__init__.py:11 #: settings/serializers/auth/wecom.py:11 settings/serializers/auth/wecom.py:16 -#: users/models/user/__init__.py:122 users/models/user/_source.py:18 +#: users/models/user/__init__.py:122 users/models/user/_source.py:19 msgid "WeCom" msgstr "" @@ -2824,21 +2961,21 @@ msgstr "" #: authentication/views/login.py:90 notifications/backends/__init__.py:14 #: settings/serializers/auth/feishu.py:12 #: settings/serializers/auth/feishu.py:14 users/models/user/__init__.py:128 -#: users/models/user/_source.py:20 +#: users/models/user/_source.py:21 msgid "FeiShu" msgstr "" #: audits/signal_handlers/login_log.py:40 authentication/views/login.py:102 #: authentication/views/slack.py:79 notifications/backends/__init__.py:16 #: settings/serializers/auth/slack.py:11 settings/serializers/auth/slack.py:13 -#: users/models/user/__init__.py:134 users/models/user/_source.py:22 +#: users/models/user/__init__.py:134 users/models/user/_source.py:23 msgid "Slack" msgstr "" #: audits/signal_handlers/login_log.py:41 authentication/views/dingtalk.py:151 #: authentication/views/login.py:84 notifications/backends/__init__.py:12 #: settings/serializers/auth/dingtalk.py:11 users/models/user/__init__.py:125 -#: users/models/user/_source.py:19 +#: users/models/user/_source.py:20 msgid "DingTalk" msgstr "" @@ -2853,14 +2990,32 @@ msgstr "" msgid "Passkey" msgstr "" -#: audits/tasks.py:131 +#: audits/tasks.py:132 msgid "Clean audits session task log" msgstr "" -#: audits/tasks.py:145 +#: audits/tasks.py:134 +msgid "" +"Since the system generates login logs, operation logs, file upload logs, " +"activity \n" +" logs, Celery execution logs, session recordings, command records, " +"and password change \n" +" logs, it will perform cleanup of records that exceed the time limit " +"according to the \n" +" 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" +msgstr "" + +#: audits/tasks.py:154 msgid "Upload FTP file to external storage" msgstr "" +#: audits/tasks.py:156 +msgid "" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " +"management will be \n" +" synchronized to external storage" +msgstr "" + #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" msgstr "" @@ -3254,7 +3409,7 @@ msgstr "" msgid "Clear phone number to disable" msgstr "" -#: authentication/middleware.py:94 settings/utils/ldap.py:681 +#: authentication/middleware.py:94 settings/utils/ldap.py:691 msgid "Authentication failed (before login check failed): {}" msgstr "" @@ -3498,10 +3653,16 @@ msgstr "" msgid "Is valid" msgstr "Is Valid" -#: authentication/tasks.py:11 +#: authentication/tasks.py:13 msgid "Clean expired session" msgstr "" +#: authentication/tasks.py:15 +msgid "" +"Since user logins create sessions, the system will clean up expired sessions " +"every 24 hours" +msgstr "" + #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" msgstr "" @@ -3561,7 +3722,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:502 +#: jumpserver/conf.py:522 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4228,16 +4389,34 @@ msgstr "" msgid "Tags" msgstr "" -#: common/tasks.py:31 +#: common/tasks.py:32 msgid "Send email" msgstr "" -#: common/tasks.py:58 +#: common/tasks.py:35 +msgid "This task will be executed when sending email notifications" +msgstr "" + +#: common/tasks.py:65 msgid "Send email attachment" msgstr "" -#: common/tasks.py:80 terminal/tasks.py:58 -msgid "Upload session replay to external storage" +#: common/tasks.py:68 +msgid "" +"When an account password is changed or an account backup generates " +"attachments, \n" +" this task needs to be executed for sending emails and handling " +"attachments" +msgstr "" + +#: common/tasks.py:94 +msgid "Upload account backup to external storage" +msgstr "" + +#: common/tasks.py:96 +msgid "" +"When performing an account backup, this task needs to be executed to " +"external storage (SFTP)" msgstr "" #: common/utils/ip/geoip/utils.py:26 @@ -4253,10 +4432,17 @@ msgstr "" msgid "Hello %s" msgstr "" -#: common/utils/verify_code.py:16 +#: common/utils/verify_code.py:17 msgid "Send SMS code" msgstr "" +#: common/utils/verify_code.py:19 +msgid "" +"When resetting a password, forgetting a password, or verifying MFA, this " +"task needs to \n" +" be executed to send SMS messages" +msgstr "" + #: common/validators.py:16 msgid "Special char not allowed" msgstr "" @@ -4269,16 +4455,16 @@ msgstr "" msgid "The mobile phone number format is incorrect" msgstr "" -#: jumpserver/conf.py:496 +#: jumpserver/conf.py:516 #, python-brace-format msgid "The verification code is: {code}" msgstr "" -#: jumpserver/conf.py:501 +#: jumpserver/conf.py:521 msgid "Create account successfully" msgstr "" -#: jumpserver/conf.py:503 +#: jumpserver/conf.py:523 msgid "Your account has been created successfully" msgstr "" @@ -4368,15 +4554,22 @@ msgstr "" msgid "Publish the station message" msgstr "" -#: ops/ansible/inventory.py:106 ops/models/job.py:65 +#: notifications/notifications.py:48 +msgid "" +"This task needs to be executed for sending internal messages for system " +"alerts, \n" +" work orders, and other notifications" +msgstr "" + +#: ops/ansible/inventory.py:116 ops/models/job.py:65 msgid "No account available" msgstr "" -#: ops/ansible/inventory.py:286 +#: ops/ansible/inventory.py:296 msgid "Ansible disabled" msgstr "" -#: ops/ansible/inventory.py:302 +#: ops/ansible/inventory.py:312 msgid "Skip hosts below:" msgstr "" @@ -4424,31 +4617,31 @@ msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "" -#: ops/api/playbook.py:39 +#: ops/api/playbook.py:50 msgid "Currently playbook is being used in a job" msgstr "" -#: ops/api/playbook.py:97 +#: ops/api/playbook.py:113 msgid "Unsupported file content" msgstr "" -#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193 +#: ops/api/playbook.py:115 ops/api/playbook.py:161 ops/api/playbook.py:209 msgid "Invalid file path" msgstr "" -#: ops/api/playbook.py:171 +#: ops/api/playbook.py:187 msgid "This file can not be rename" msgstr "" -#: ops/api/playbook.py:190 +#: ops/api/playbook.py:206 msgid "File already exists" msgstr "" -#: ops/api/playbook.py:208 +#: ops/api/playbook.py:224 msgid "File key is required" msgstr "" -#: ops/api/playbook.py:211 +#: ops/api/playbook.py:227 msgid "This file can not be delete" msgstr "" @@ -4492,7 +4685,7 @@ msgstr "" msgid "Adhoc" msgstr "" -#: ops/const.py:39 ops/models/job.py:149 ops/models/playbook.py:88 +#: ops/const.py:39 ops/models/job.py:149 ops/models/playbook.py:91 msgid "Playbook" msgstr "" @@ -4556,53 +4749,69 @@ msgstr "" msgid "Command execution disabled" msgstr "" +#: ops/const.py:86 +msgctxt "scope" +msgid "Public" +msgstr "" + +#: ops/const.py:87 +msgid "Private" +msgstr "" + #: ops/exception.py:6 msgid "no valid program entry found." msgstr "" -#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:73 +#: ops/mixin.py:30 ops/mixin.py:110 settings/serializers/auth/ldap.py:73 +#: settings/serializers/auth/ldap_ha.py:55 msgid "Periodic run" msgstr "Periodic" -#: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108 -#: settings/serializers/auth/ldap.py:80 +#: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116 +#: settings/serializers/auth/ldap.py:80 settings/serializers/auth/ldap_ha.py:62 msgid "Interval" msgstr "" -#: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105 -#: settings/serializers/auth/ldap.py:77 +#: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113 +#: settings/serializers/auth/ldap.py:77 settings/serializers/auth/ldap_ha.py:59 msgid "Crontab" msgstr "" -#: ops/mixin.py:110 +#: ops/mixin.py:118 msgid "Run period" msgstr "Period" -#: ops/mixin.py:119 +#: ops/mixin.py:127 msgid "* Please enter a valid crontab expression" msgstr "" -#: ops/mixin.py:126 +#: ops/mixin.py:134 msgid "Range {} to {}" msgstr "" -#: ops/mixin.py:137 +#: ops/mixin.py:145 msgid "Require interval or crontab setting" msgstr "" -#: ops/models/adhoc.py:21 +#: ops/models/adhoc.py:20 msgid "Pattern" msgstr "" -#: ops/models/adhoc.py:23 ops/models/job.py:146 +#: ops/models/adhoc.py:22 ops/models/job.py:146 msgid "Module" msgstr "" -#: ops/models/adhoc.py:24 ops/models/celery.py:81 ops/models/job.py:144 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:144 #: terminal/models/component/task.py:14 msgid "Args" msgstr "" +#: ops/models/adhoc.py:26 ops/models/playbook.py:36 ops/serializers/mixin.py:10 +#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 +#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 +msgid "Scope" +msgstr "" + #: ops/models/base.py:19 msgid "Account policy" msgstr "" @@ -4629,23 +4838,23 @@ msgstr "" msgid "Date last publish" msgstr "" -#: ops/models/celery.py:70 +#: ops/models/celery.py:71 msgid "Celery Task" msgstr "" -#: ops/models/celery.py:73 +#: ops/models/celery.py:74 msgid "Can view task monitor" msgstr "" -#: ops/models/celery.py:82 terminal/models/component/task.py:15 +#: ops/models/celery.py:83 terminal/models/component/task.py:15 msgid "Kwargs" msgstr "" -#: ops/models/celery.py:87 +#: ops/models/celery.py:88 msgid "Date published" msgstr "" -#: ops/models/celery.py:112 +#: ops/models/celery.py:113 msgid "Celery Task Execution" msgstr "" @@ -4690,11 +4899,11 @@ msgstr "" msgid "Job Execution" msgstr "" -#: ops/models/playbook.py:33 +#: ops/models/playbook.py:35 msgid "CreateMethod" msgstr "" -#: ops/models/playbook.py:34 +#: ops/models/playbook.py:37 msgid "VCS URL" msgstr "" @@ -4758,34 +4967,87 @@ msgstr "" msgid "You do not have permission for the current job." msgstr "" -#: ops/tasks.py:50 +#: ops/tasks.py:51 msgid "Run ansible task" msgstr "" -#: ops/tasks.py:76 +#: ops/tasks.py:54 +msgid "" +"Execute scheduled adhoc and playbooks, periodically invoking the task for " +"execution" +msgstr "" + +#: ops/tasks.py:82 msgid "Run ansible task execution" msgstr "" -#: ops/tasks.py:89 +#: ops/tasks.py:85 +msgid "Execute the task when manually adhoc or playbooks" +msgstr "" + +#: ops/tasks.py:99 msgid "Clear celery periodic tasks" msgstr "" -#: ops/tasks.py:110 +#: ops/tasks.py:101 +msgid "At system startup, clean up celery tasks that no longer exist" +msgstr "" + +#: ops/tasks.py:125 msgid "Create or update periodic tasks" msgstr "" -#: ops/tasks.py:118 +#: ops/tasks.py:127 +msgid "" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, tasks will be " +"registered or the parameters \n" +" of scheduled tasks will be updated" +msgstr "" + +#: ops/tasks.py:140 msgid "Periodic check service performance" msgstr "" -#: ops/tasks.py:124 +#: ops/tasks.py:142 +msgid "" +"Check every hour whether each component is offline and whether the CPU, " +"memory, \n" +" and disk usage exceed the thresholds, and send an alert message to " +"the administrator" +msgstr "" + +#: ops/tasks.py:152 msgid "Clean up unexpected jobs" msgstr "" -#: ops/tasks.py:131 +#: ops/tasks.py:154 +msgid "" +"Due to exceptions caused by executing adhoc and playbooks in the Job " +"Center, \n" +" which result in the task status not being updated, the system will " +"clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and " +"mark these tasks as \n" +" failed" +msgstr "" + +#: ops/tasks.py:167 msgid "Clean job_execution db record" msgstr "" +#: ops/tasks.py:169 +msgid "" +"Due to the execution of adhoc and playbooks in the Job Center, execution " +"records will \n" +" be generated. The system will clean up records that exceed the " +"retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - " +"Regular clean-up - \n" +" Job execution retention days'" +msgstr "" + #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" msgstr "" @@ -4850,7 +5112,7 @@ msgstr "請選擇一個組織後再保存" #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91 #: rbac/const.py:7 rbac/models/rolebinding.py:56 -#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:52 +#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 #: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 @@ -4911,7 +5173,7 @@ msgstr "" msgid "Asset permissions amount" msgstr "" -#: orgs/tasks.py:9 +#: orgs/tasks.py:10 msgid "Refresh organization cache" msgstr "" @@ -5030,14 +5292,37 @@ msgstr "" msgid "Groups amount" msgstr "" -#: perms/tasks.py:27 +#: perms/tasks.py:28 msgid "Check asset permission expired" msgstr "" -#: perms/tasks.py:40 +#: perms/tasks.py:30 +msgid "" +"The cache of organizational collections, which have completed user " +"authorization tree \n" +" construction, will expire. Therefore, expired collections need to be " +"cleared from the \n" +" cache, and this task will be executed periodically based on the time " +"interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " +"config.txt" +msgstr "" + +#: perms/tasks.py:49 msgid "Send asset permission expired notification" msgstr "" +#: perms/tasks.py:51 +msgid "" +"Check every day at 10 a.m. and send a notification message to users " +"associated with \n" +" assets whose authorization is about to expire, as well as to the " +"organization's \n" +" administrators, 3 days in advance, to remind them that the asset " +"authorization will \n" +" expire in a few days" +msgstr "" + #: perms/templates/perms/_msg_item_permissions_expire.html:7 #: perms/templates/perms/_msg_permed_items_expire.html:7 #, python-format @@ -5127,11 +5412,6 @@ msgstr "" msgid "Permissions" msgstr "" -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 -msgid "Scope" -msgstr "" - #: rbac/models/role.py:46 rbac/models/rolebinding.py:52 #: users/models/user/__init__.py:66 msgid "Role" @@ -5285,7 +5565,7 @@ msgstr "" msgid "Test smtp setting" msgstr "" -#: settings/api/ldap.py:90 +#: settings/api/ldap.py:92 msgid "" "Users are not synchronized, please click the user synchronization button" msgstr "" @@ -5383,58 +5663,62 @@ msgid "LDAP Auth" msgstr "" #: settings/serializers/auth/base.py:14 -msgid "CAS Auth" +msgid "LDAP Auth HA" msgstr "" #: settings/serializers/auth/base.py:15 -msgid "OPENID Auth" +msgid "CAS Auth" msgstr "" #: settings/serializers/auth/base.py:16 -msgid "SAML2 Auth" +msgid "OPENID Auth" msgstr "" #: settings/serializers/auth/base.py:17 -msgid "OAuth2 Auth" +msgid "SAML2 Auth" msgstr "" #: settings/serializers/auth/base.py:18 -msgid "RADIUS Auth" +msgid "OAuth2 Auth" msgstr "" #: settings/serializers/auth/base.py:19 -msgid "DingTalk Auth" +msgid "RADIUS Auth" msgstr "" #: settings/serializers/auth/base.py:20 -msgid "FeiShu Auth" +msgid "DingTalk Auth" msgstr "" #: settings/serializers/auth/base.py:21 -msgid "Lark Auth" +msgid "FeiShu Auth" msgstr "" #: settings/serializers/auth/base.py:22 -msgid "Slack Auth" +msgid "Lark Auth" msgstr "" #: settings/serializers/auth/base.py:23 -msgid "WeCom Auth" +msgid "Slack Auth" msgstr "" #: settings/serializers/auth/base.py:24 -msgid "SSO Auth" +msgid "WeCom Auth" msgstr "" #: settings/serializers/auth/base.py:25 +msgid "SSO Auth" +msgstr "" + +#: settings/serializers/auth/base.py:26 msgid "Passkey Auth" msgstr "" -#: settings/serializers/auth/base.py:27 +#: settings/serializers/auth/base.py:28 msgid "Email suffix" msgstr "" -#: settings/serializers/auth/base.py:29 +#: settings/serializers/auth/base.py:30 msgid "" "After third-party user authentication is successful, if the third-party " "authentication service platform does not return the user's email " @@ -5442,26 +5726,26 @@ msgid "" "suffix" msgstr "" -#: settings/serializers/auth/base.py:36 +#: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" msgstr "" -#: settings/serializers/auth/base.py:37 +#: settings/serializers/auth/base.py:38 msgid "The URL for Forgotten Password on the user login page" msgstr "" -#: settings/serializers/auth/base.py:40 +#: settings/serializers/auth/base.py:41 msgid "Login redirection" msgstr "" -#: settings/serializers/auth/base.py:42 +#: settings/serializers/auth/base.py:43 msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" msgstr "" -#: settings/serializers/auth/base.py:54 +#: settings/serializers/auth/base.py:55 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." @@ -5472,7 +5756,7 @@ msgid "CAS" msgstr "" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 -#: settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:26 settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "" @@ -5499,9 +5783,10 @@ msgstr "" #: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 -#: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 -#: settings/serializers/auth/slack.py:18 settings/serializers/auth/wecom.py:18 +#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/ldap_ha.py:48 +#: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 +#: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 +#: settings/serializers/auth/wecom.py:18 msgid "User attribute" msgstr "" @@ -5537,7 +5822,7 @@ msgid "" "name and the `value` is the FeiShu service user attribute name" msgstr "" -#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:21 +#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22 msgid "Lark" msgstr "" @@ -5555,48 +5840,48 @@ msgstr "" msgid "LDAP server URI" msgstr "" -#: settings/serializers/auth/ldap.py:48 +#: settings/serializers/auth/ldap.py:48 settings/serializers/auth/ldap_ha.py:30 msgid "Bind DN" msgstr "" -#: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:31 msgid "Binding Distinguished Name" msgstr "" -#: settings/serializers/auth/ldap.py:53 +#: settings/serializers/auth/ldap.py:53 settings/serializers/auth/ldap_ha.py:35 msgid "Binding password" msgstr "" -#: settings/serializers/auth/ldap.py:56 +#: settings/serializers/auth/ldap.py:56 settings/serializers/auth/ldap_ha.py:38 msgid "Search OU" msgstr "" -#: settings/serializers/auth/ldap.py:58 +#: settings/serializers/auth/ldap.py:58 settings/serializers/auth/ldap_ha.py:40 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "" -#: settings/serializers/auth/ldap.py:62 +#: settings/serializers/auth/ldap.py:62 settings/serializers/auth/ldap_ha.py:44 msgid "Search filter" msgstr "" -#: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:45 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "" -#: settings/serializers/auth/ldap.py:68 +#: settings/serializers/auth/ldap.py:68 settings/serializers/auth/ldap_ha.py:50 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" -#: settings/serializers/auth/ldap.py:84 +#: settings/serializers/auth/ldap.py:84 settings/serializers/auth/ldap_ha.py:66 msgid "Connect timeout (s)" msgstr "" -#: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap.py:89 settings/serializers/auth/ldap_ha.py:71 msgid "User DN cache timeout (s)" msgstr "" @@ -5608,10 +5893,27 @@ msgid "" "the user DN cache" msgstr "" -#: settings/serializers/auth/ldap.py:97 +#: settings/serializers/auth/ldap.py:97 settings/serializers/auth/ldap_ha.py:79 msgid "Search paged size (piece)" msgstr "" +#: settings/serializers/auth/ldap_ha.py:23 +#: settings/serializers/auth/ldap_ha.py:85 +msgid "LDAP HA" +msgstr "" + +#: settings/serializers/auth/ldap_ha.py:27 +msgid "LDAP HA server URI" +msgstr "" + +#: settings/serializers/auth/ldap_ha.py:73 +msgid "" +"Caching the User DN obtained during user login authentication can " +"effectivelyimprove the speed of user authentication., 0 means no cache
If " +"the user OU structure has been adjusted, click Submit to clear the user DN " +"cache" +msgstr "" + #: settings/serializers/auth/oauth2.py:19 #: settings/serializers/auth/oauth2.py:22 msgid "OAuth2" @@ -6574,14 +6876,42 @@ msgid "" "in the workbench" msgstr "" -#: settings/tasks/ldap.py:28 +#: settings/tasks/ldap.py:73 msgid "Periodic import ldap user" msgstr "" -#: settings/tasks/ldap.py:66 +#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +msgid "" +"When LDAP auto-sync is configured, this task will be invoked to synchronize " +"users" +msgstr "" + +#: settings/tasks/ldap.py:83 +msgid "Periodic import ldap ha user" +msgstr "" + +#: settings/tasks/ldap.py:117 msgid "Registration periodic import ldap user task" msgstr "" +#: settings/tasks/ldap.py:119 +msgid "" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " +"sync task \n" +" will be re-registered or updated, and this task will be invoked" +msgstr "" + +#: settings/tasks/ldap.py:133 +msgid "Registration periodic import ldap ha user task" +msgstr "" + +#: settings/tasks/ldap.py:135 +msgid "" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " +"LDAP HA sync task \n" +" will be re-registered or updated, and this task will be invoked" +msgstr "" + #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" msgstr "" @@ -6598,108 +6928,108 @@ msgstr "" msgid "No user synchronization required" msgstr "" -#: settings/utils/ldap.py:496 +#: settings/utils/ldap.py:509 msgid "ldap:// or ldaps:// protocol is used." msgstr "" -#: settings/utils/ldap.py:507 +#: settings/utils/ldap.py:520 msgid "Host or port is disconnected: {}" msgstr "" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:522 msgid "The port is not the port of the LDAP service: {}" msgstr "" -#: settings/utils/ldap.py:511 +#: settings/utils/ldap.py:524 msgid "Please add certificate: {}" msgstr "" -#: settings/utils/ldap.py:515 settings/utils/ldap.py:542 -#: settings/utils/ldap.py:572 settings/utils/ldap.py:600 +#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 +#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 msgid "Unknown error: {}" msgstr "" -#: settings/utils/ldap.py:529 +#: settings/utils/ldap.py:542 msgid "Bind DN or Password incorrect" msgstr "" -#: settings/utils/ldap.py:536 +#: settings/utils/ldap.py:549 msgid "Please enter Bind DN: {}" msgstr "" -#: settings/utils/ldap.py:538 +#: settings/utils/ldap.py:551 msgid "Please enter Password: {}" msgstr "" -#: settings/utils/ldap.py:540 +#: settings/utils/ldap.py:553 msgid "Please enter correct Bind DN and Password: {}" msgstr "" -#: settings/utils/ldap.py:558 +#: settings/utils/ldap.py:571 msgid "Invalid User OU or User search filter: {}" msgstr "" -#: settings/utils/ldap.py:589 +#: settings/utils/ldap.py:602 msgid "LDAP User attr map not include: {}" msgstr "" -#: settings/utils/ldap.py:596 +#: settings/utils/ldap.py:609 msgid "LDAP User attr map is not dict" msgstr "" -#: settings/utils/ldap.py:615 +#: settings/utils/ldap.py:628 msgid "LDAP authentication is not enabled" msgstr "" -#: settings/utils/ldap.py:633 +#: settings/utils/ldap.py:646 msgid "Error (Invalid LDAP server): {}" msgstr "" -#: settings/utils/ldap.py:635 +#: settings/utils/ldap.py:648 msgid "Error (Invalid Bind DN): {}" msgstr "" -#: settings/utils/ldap.py:637 +#: settings/utils/ldap.py:650 msgid "Error (Invalid LDAP User attr map): {}" msgstr "" -#: settings/utils/ldap.py:639 +#: settings/utils/ldap.py:652 msgid "Error (Invalid User OU or User search filter): {}" msgstr "" -#: settings/utils/ldap.py:641 +#: settings/utils/ldap.py:654 msgid "Error (Not enabled LDAP authentication): {}" msgstr "" -#: settings/utils/ldap.py:643 +#: settings/utils/ldap.py:656 msgid "Error (Unknown): {}" msgstr "" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:659 msgid "Succeed: Match {} users" msgstr "" -#: settings/utils/ldap.py:679 +#: settings/utils/ldap.py:689 msgid "Authentication failed (configuration incorrect): {}" msgstr "" -#: settings/utils/ldap.py:683 +#: settings/utils/ldap.py:693 msgid "Authentication failed (username or password incorrect): {}" msgstr "" -#: settings/utils/ldap.py:685 +#: settings/utils/ldap.py:695 msgid "Authentication failed (Unknown): {}" msgstr "" -#: settings/utils/ldap.py:688 +#: settings/utils/ldap.py:698 msgid "Authentication success: {}" msgstr "" -#: settings/ws.py:203 +#: settings/ws.py:199 msgid "No LDAP user was found" msgstr "" -#: settings/ws.py:209 +#: settings/ws.py:205 msgid "Total {}, success {}, failure {}" msgstr "" @@ -6911,7 +7241,7 @@ msgstr "" msgid "Invalid" msgstr "" -#: terminal/api/component/storage.py:132 terminal/tasks.py:149 +#: terminal/api/component/storage.py:132 terminal/tasks.py:187 msgid "Test failure: {}" msgstr "" @@ -7425,7 +7755,7 @@ msgstr "" msgid "Command and replay storage" msgstr "Storage" -#: terminal/notifications.py:240 terminal/tasks.py:153 +#: terminal/notifications.py:240 terminal/tasks.py:191 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -7871,34 +8201,90 @@ msgstr "" msgid "storage is null" msgstr "" -#: terminal/tasks.py:31 +#: terminal/tasks.py:32 msgid "Periodic delete terminal status" msgstr "" -#: terminal/tasks.py:39 +#: terminal/tasks.py:43 msgid "Clean orphan session" msgstr "" -#: terminal/tasks.py:87 +#: terminal/tasks.py:45 +msgid "" +"Check every 10 minutes for asset connection sessions that have been inactive " +"for 3 \n" +" minutes and mark these sessions as completed" +msgstr "" + +#: terminal/tasks.py:68 +msgid "Upload session replay to external storage" +msgstr "" + +#: terminal/tasks.py:70 +msgid "" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " +"and \n" +" recordings will be uploaded to external storage" +msgstr "" + +#: terminal/tasks.py:102 msgid "Run applet host deployment" msgstr "" -#: terminal/tasks.py:97 +#: terminal/tasks.py:105 +msgid "" +"When deploying from the remote application publisher details page, and the " +"'Deploy' \n" +" button is clicked, this task will be executed" +msgstr "" + +#: terminal/tasks.py:116 msgid "Install applet" msgstr "" -#: terminal/tasks.py:108 +#: terminal/tasks.py:119 +msgid "" +"When the 'Deploy' button is clicked in the 'Remote Application' section of " +"the remote \n" +" application publisher details page, this task will be executed" +msgstr "" + +#: terminal/tasks.py:131 msgid "Uninstall applet" msgstr "" -#: terminal/tasks.py:119 +#: terminal/tasks.py:134 +msgid "" +"When the 'Uninstall' button is clicked in the 'Remote Application' section " +"of the \n" +" remote application publisher details page, this task will be executed" +msgstr "" + +#: terminal/tasks.py:146 msgid "Generate applet host accounts" msgstr "" -#: terminal/tasks.py:131 +#: terminal/tasks.py:149 +msgid "" +"When a remote publishing server is created and an account needs to be " +"created \n" +" automatically, this task will be executed" +msgstr "" + +#: terminal/tasks.py:163 msgid "Check command replay storage connectivity" msgstr "" +#: terminal/tasks.py:165 +msgid "" +"Check every day at midnight whether the external storage for commands and " +"recordings \n" +" is accessible. If it is not accessible, send a notification to the " +"recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - " +"Connectivity'" +msgstr "" + #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" msgstr "" @@ -8689,31 +9075,79 @@ msgid "" "administrator." msgstr "" -#: users/signal_handlers.py:193 +#: users/signal_handlers.py:196 msgid "Clean up expired user sessions" msgstr "" -#: users/tasks.py:25 +#: users/signal_handlers.py:198 +msgid "" +"After logging in via the web, a user session record is created. At 2 a.m. " +"every day, \n" +" the system cleans up inactive user devices" +msgstr "" + +#: users/tasks.py:26 msgid "Check password expired" msgstr "" -#: users/tasks.py:39 +#: users/tasks.py:28 +msgid "" +"Check every day at 10 AM whether the passwords of users in the system are " +"expired, \n" +" and send a notification 5 days in advance" +msgstr "" + +#: users/tasks.py:46 msgid "Periodic check password expired" msgstr "" -#: users/tasks.py:53 +#: users/tasks.py:48 +msgid "" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, it is necessary to " +"register or update the \n" +" parameters of the task that checks if passwords have expired" +msgstr "" + +#: users/tasks.py:67 msgid "Check user expired" msgstr "" -#: users/tasks.py:70 +#: users/tasks.py:69 +msgid "" +"Check every day at 10 AM whether the users in the system are expired, and " +"send a \n" +" notification 5 days in advance" +msgstr "" + +#: users/tasks.py:90 msgid "Periodic check user expired" msgstr "" -#: users/tasks.py:84 +#: users/tasks.py:92 +msgid "" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, it is necessary to " +"register or update the \n" +" parameters of the task that checks if users have expired" +msgstr "" + +#: users/tasks.py:111 msgid "Check unused users" msgstr "" -#: users/tasks.py:123 +#: users/tasks.py:113 +msgid "" +"At 2 a.m. every day, according to the configuration in \"System Settings - " +"Security - \n" +" Auth security - Auto disable threshold\" users who have not logged " +"in or whose API keys \n" +" have not been used for a long time will be disabled" +msgstr "" + +#: users/tasks.py:157 msgid "The user has not logged in recently and has been disabled." msgstr "" @@ -9200,7 +9634,7 @@ msgstr "" msgid "Set protocols \"%s\"" msgstr "" -#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:30 +#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:31 msgid "Run sync instance task" msgstr "" @@ -9673,10 +10107,25 @@ msgstr "" msgid "Instance count" msgstr "" -#: xpack/plugins/cloud/tasks.py:44 +#: xpack/plugins/cloud/tasks.py:33 +msgid "" +"Execute this task when manually or scheduled cloud synchronization tasks are " +"performed" +msgstr "" + +#: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" msgstr "" +#: xpack/plugins/cloud/tasks.py:52 +msgid "" +"Every day, according to the configuration in \"System Settings - Tasks - " +"Regular \n" +" clean-up - Cloud sync task history retention days\" the system will " +"clean up the execution \n" +" records generated by cloud synchronization" +msgstr "" + #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." msgstr "" @@ -9746,3 +10195,14 @@ msgstr "" #: xpack/plugins/license/models.py:86 msgid "Ultimate edition" msgstr "" + +#~ msgid "Clean change secret and push record period description" +#~ msgstr "" +#~ "The system will periodically clean up unnecessary change secret records " +#~ "and push records, including those associated with change tasks, execution " +#~ "records, assets, and accounts. When any of these associated items are " +#~ "deleted, the corresponding change secret and push records become invalid. " +#~ "Therefore, to maintain a tidy and efficient database, the system " +#~ "automatically cleans up these invalid records every 180 days by default. " +#~ "This regular cleanup process helps free up storage space and improves the " +#~ "security and overall performance of data management." diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index ad5c10c64..5f9423de2 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 16:05+0800\n" +"POT-Creation-Date: 2024-09-13 17:22+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -125,9 +125,10 @@ msgstr "成功: %s、失敗: %s、合計: %s" #: authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 -#: settings/serializers/msg.py:37 settings/serializers/terminal.py:28 -#: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142 -#: users/forms/profile.py:21 users/serializers/user.py:144 +#: settings/serializers/auth/ldap_ha.py:34 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: terminal/serializers/storage.py:142 users/forms/profile.py:21 +#: users/serializers/user.py:144 #: users/templates/users/_msg_user_created.html:13 #: users/templates/users/user_password_verify.html:18 #: xpack/plugins/cloud/serializers/account_attrs.py:28 @@ -187,7 +188,8 @@ msgstr "集めました" msgid "Template" msgstr "テンプレート" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "スキップ" @@ -208,8 +210,8 @@ msgstr "パスワードを変更する" msgid "Verify account" msgstr "アカウントを確認" -#: accounts/const/automation.py:27 accounts/tasks/remove_account.py:24 -#: accounts/tasks/remove_account.py:33 +#: accounts/const/automation.py:27 accounts/tasks/remove_account.py:25 +#: accounts/tasks/remove_account.py:38 msgid "Remove account" msgstr "アカウントの削除" @@ -311,7 +313,7 @@ msgid "Pending" msgstr "未定" #: accounts/const/vault.py:8 assets/const/category.py:12 -#: assets/models/asset/database.py:9 assets/models/asset/database.py:24 +#: assets/models/asset/database.py:10 assets/models/asset/database.py:29 msgid "Database" msgstr "データベース" @@ -390,8 +392,8 @@ msgstr "ソース ID" #: assets/serializers/gateway.py:33 audits/models.py:59 #: authentication/api/connection_token.py:411 ops/models/base.py:18 #: perms/models/asset_permission.py:75 settings/serializers/msg.py:33 -#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 -#: terminal/serializers/command.py:72 +#: terminal/backends/command/models.py:18 +#: terminal/models/session/session.py:34 terminal/serializers/command.py:72 #: terminal/templates/terminal/_msg_command_warning.html:8 #: terminal/templates/terminal/_msg_session_sharing.html:8 #: tickets/models/ticket/command_confirm.py:13 @@ -459,7 +461,7 @@ msgstr "アカウントバックアップ計画" #: accounts/models/automations/backup_account.py:120 #: assets/models/automations/base.py:115 audits/models.py:65 -#: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:242 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:242 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:25 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -471,7 +473,7 @@ msgstr "開始日" #: accounts/models/automations/backup_account.py:123 #: authentication/templates/authentication/_msg_oauth_bind.html:11 -#: notifications/notifications.py:194 +#: notifications/notifications.py:199 #: settings/templates/ldap/_msg_import_ldap_user.html:3 msgid "Time" msgstr "時間" @@ -550,7 +552,8 @@ msgstr "SSHキープッシュ方式" #: accounts/models/automations/gather_account.py:58 #: accounts/serializers/account/backup.py:40 #: accounts/serializers/automations/change_secret.py:58 -#: settings/serializers/auth/ldap.py:100 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:100 +#: settings/serializers/auth/ldap_ha.py:82 settings/serializers/msg.py:45 msgid "Recipient" msgstr "受信者" @@ -572,7 +575,7 @@ msgstr "開始日" #: accounts/models/automations/change_secret.py:42 #: assets/models/automations/base.py:116 ops/models/base.py:56 -#: ops/models/celery.py:89 ops/models/job.py:243 +#: ops/models/celery.py:90 ops/models/job.py:243 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "終了日" @@ -634,7 +637,7 @@ msgid "Address login" msgstr "最終ログインアドレス" #: accounts/models/automations/gather_account.py:44 -#: accounts/tasks/gather_accounts.py:29 +#: accounts/tasks/gather_accounts.py:30 msgid "Gather asset accounts" msgstr "アカウントのコレクション" @@ -708,15 +711,17 @@ msgstr "パスワードルール" #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 #: authentication/serializers/connect_token_secret.py:169 labels/models.py:11 -#: ops/mixin.py:21 ops/models/adhoc.py:20 ops/models/celery.py:15 -#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28 +#: ops/mixin.py:28 ops/models/adhoc.py:19 ops/models/celery.py:15 +#: ops/models/celery.py:81 ops/models/job.py:142 ops/models/playbook.py:30 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:85 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -777,8 +782,7 @@ msgstr "ユーザーと同じユーザー名" #: accounts/models/virtual.py:37 msgid "Non-asset account, Input username/password on connect" -msgstr "" -"アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" +msgstr "アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" #: accounts/models/virtual.py:38 msgid "The account username name same with user on connect" @@ -788,9 +792,7 @@ msgstr "接続時にユーザー名と同じユーザー名を使用します" msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "" -"ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタ" -"イプのアセットのみをサポートします" +msgstr "ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタイプのアセットのみをサポートします" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -800,9 +802,7 @@ msgstr "アカウントバックアップルートタスクの結果の通知" msgid "" "{} - The account backup passage task has been completed. See the attachment " "for details" -msgstr "" -"{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご" -"覧ください" +msgstr "{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご覧ください" #: accounts/notifications.py:25 msgid "" @@ -810,9 +810,8 @@ msgid "" "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" msgstr "" -"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定" -"されていません-個人情報にアクセスしてください-> プリファレンス設定の基本的な" -"ファイル暗号化パスワードの設定" +"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> " +"プリファレンス設定の基本的なファイル暗号化パスワードの設定" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -830,8 +829,7 @@ msgid "" "has not been set - please go to personal information -> set encryption " "password in preferences" msgstr "" -"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人" -"情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" +"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -869,9 +867,9 @@ msgstr "カテゴリ" #: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: authentication/serializers/connect_token_secret.py:126 +#: ops/models/job.py:150 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -889,7 +887,7 @@ msgstr "資産が存在しません" msgid "Has secret" msgstr "エスクローされたパスワード" -#: accounts/serializers/account/account.py:272 ops/models/celery.py:83 +#: accounts/serializers/account/account.py:272 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" @@ -943,9 +941,10 @@ msgstr "ID" #: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 -#: audits/models.py:90 audits/models.py:172 audits/models.py:271 -#: audits/serializers.py:171 authentication/models/connection_token.py:32 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:54 audits/models.py:90 audits/models.py:172 +#: audits/models.py:271 audits/serializers.py:171 +#: authentication/models/connection_token.py:32 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 @@ -995,8 +994,7 @@ msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." msgstr "" -"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの" -"場合は、`username@domain`のようになります。" +"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの場合は、`username@domain`のようになります。" #: accounts/serializers/account/template.py:13 msgid "Password length" @@ -1039,11 +1037,11 @@ msgid "" msgstr "关联平台,可以配置推送参数,如果不关联,则使用默认参数" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 -#: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:40 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:25 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:25 ops/models/job.py:158 ops/models/playbook.py:33 +#: rbac/models/role.py:37 settings/models.py:40 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:332 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 @@ -1058,14 +1056,13 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: " -"資産シークレット内の同じアカウント > ログインシークレット > 手動入力.
" -"セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定して" -"ください。 " +"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: 資産シークレット内の同じアカウント > ログインシークレット > " +"手動入力.
セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定してください。 " #: accounts/serializers/automations/base.py:23 #: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172 -#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47 +#: assets/serializers/automations/base.py:21 +#: perms/serializers/permission.py:47 msgid "Nodes" msgstr "ノード" @@ -1095,8 +1092,7 @@ msgstr "アカウントのユーザー名を入力してください" msgid "" "Secret parameter settings, currently only effective for assets of the host " "type." -msgstr "" -"パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" +msgstr "パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" #: accounts/serializers/automations/change_secret.py:84 msgid "* Please enter the correct password length" @@ -1126,47 +1122,94 @@ msgstr "アカウントを追加: %s" msgid "Delete account: %s" msgstr "アカウントを削除: %s" -#: accounts/tasks/automation.py:31 +#: accounts/tasks/automation.py:32 msgid "Account execute automation" msgstr "アカウント実行の自動化" -#: accounts/tasks/automation.py:57 accounts/tasks/automation.py:62 +#: accounts/tasks/automation.py:35 +msgid "" +"Unified execution entry for account automation tasks: when the system performs tasks \n" +" such as account push, password change, account verification, account collection, \n" +" and gateway account verification, all tasks are executed through this unified entry" +msgstr "" +"アカウント自動化タスクの一元的な実行入口で、システムがアカウントのプッシュ、パスワードの変更、アカウントの確認、アカウントの収集、ゲートウェイアカウントのバリデーションタスクを実行する際、統一して現行のタスクを実行します" + +#: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72 msgid "Execute automation record" msgstr "自動化レコードを実行する" -#: accounts/tasks/automation.py:86 +#: accounts/tasks/automation.py:67 +msgid "When manually executing password change records, this task is used" +msgstr "" +"パスワード変更記録を手動で実行する際は、このタスクを通じて実行します" + +#: accounts/tasks/automation.py:96 msgid "Clean change secret and push record period" msgstr "パスワード変更記録とプッシュ記録を定期的にクリアする" -#: accounts/tasks/automation.py:87 -msgid "Clean change secret and push record period description" +#: accounts/tasks/automation.py:98 +msgid "" +"The system will periodically clean up unnecessary password change and push records, \n" +" including their associated change tasks, execution logs, assets, and accounts. When any \n" +" of these associated items are deleted, the corresponding password change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and overall performance \n" +" of data management" msgstr "" -"システムは、変更タスク、実行レコード、資産、アカウントに関連するものを含め、" -"不要な変更シークレット レコードとプッシュ レコードを定期的にクリーンアップし" -"ます。これらの関連項目のいずれかが削除されると、対応する変更シークレット レ" -"コードとプッシュ レコードは無効になります。したがって、整然とした効率的なデー" -"タベースを維持するために、システムはデフォルトでこれらの無効なレコードを 180 " -"日ごとに自動的にクリーンアップします。この定期的なクリーンアップ プロセスによ" -"り、ストレージ領域が解放され、データ管理のセキュリティと全体的なパフォーマン" -"スが向上します。" - -#: accounts/tasks/backup_account.py:25 +"システムは定期的に不要なパスワード変更記録とプッシュ記録をクリーンアップします。これには、関連するパスワード変更タスク、実行記録、資産、アカウントが含まれます。これらの関連項目のいずれかが削除されると、対応するパスワード変更記録とプッシュ記録は無効となります。したがって、データベースの整理と高速運用のために、システム設定ファイルの config.txt の PERM_EXPIRED_CHECK_PERIODIC の時間間隔に従って毎日午前2時に時間を超えた記録をクリーニングします。この定期的なクリーニングメカニズムは、ストレージスペースの解放とデータ管理のセキュリティとパフォーマンスの向上の両方に役立ちます" + +#: accounts/tasks/backup_account.py:26 msgid "Execute account backup plan" msgstr "アカウントのバックアップ計画を実施する" -#: accounts/tasks/gather_accounts.py:34 +#: accounts/tasks/backup_account.py:29 +msgid "When performing scheduled or manual account backups, this task is used" +msgstr "" +"定時または手動でアカウントバックアップを実行する際は、このタスクを通じて実行します" + +#: accounts/tasks/gather_accounts.py:32 assets/tasks/automation.py:27 +#: orgs/tasks.py:11 terminal/tasks.py:33 +msgid "Unused" +msgstr "未使用" + +#: accounts/tasks/gather_accounts.py:36 msgid "Gather assets accounts" msgstr "資産の口座番号を収集する" -#: accounts/tasks/push_account.py:15 accounts/tasks/push_account.py:23 +#: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:27 msgid "Push accounts to assets" msgstr "アカウントをアセットにプッシュ:" -#: accounts/tasks/remove_account.py:44 +#: accounts/tasks/push_account.py:19 +msgid "" +"When creating or modifying an account requires account push, this task is " +"executed" +msgstr "" +"アカウントの作成、アカウントの変更を行う際、アカウントプッシュが必要な場合はこのタスクを実行します" + +#: accounts/tasks/remove_account.py:28 +msgid "" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" +" task will be executed" +msgstr "" +"コントロールパネル-オートメーション-アカウント収集-収集したアカウント-同期削除をクリックすると、このタスクが実行されます" + +#: accounts/tasks/remove_account.py:50 msgid "Clean historical accounts" msgstr "過去のアカウントをクリアする" -#: accounts/tasks/remove_account.py:76 +#: accounts/tasks/remove_account.py:52 +msgid "" +"Each time an asset account is updated, a historical account is generated, so it is \n" +" necessary to clean up the asset account history. The system will clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" +" Account storage - Record limit" +msgstr "" +"資産アカウントを更新するたびに、歴史的なアカウントが生成されるため、資産アカウントの履歴をクリーニングする必要があります。システムは、アカウントストレージ-レコード制限の設定に基づき、毎日午前2時に超過した数量のアカウントレコードをクリーニングします" + +#: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." msgstr "範囲外の履歴アカウントを削除する" @@ -1174,15 +1217,36 @@ msgstr "範囲外の履歴アカウントを削除する" msgid "Template sync info to related accounts" msgstr "関連するアカウントへの情報の同期" -#: accounts/tasks/vault.py:31 +#: accounts/tasks/template.py:14 +msgid "" +"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" +" Accounts' this task will be executed" +msgstr "" +"コントロールパネル-アカウントテンプレート-アカウント-同期アカウント情報更新をクリックして同期すると、このタスクが実行されます" + +#: accounts/tasks/vault.py:32 msgid "Sync secret to vault" msgstr "秘密をVaultに同期する" -#: accounts/tasks/verify_account.py:49 +#: accounts/tasks/vault.py:34 +msgid "" +"When clicking 'Sync' in 'System Settings - Features - Account Storage' this " +"task will be executed" +msgstr "" +"システム設定-機能設定-アカウントストレージをクリックして同期すると、このタスクが実行されます" + +#: accounts/tasks/verify_account.py:50 msgid "Verify asset account availability" msgstr "アセット アカウントの可用性を確認する" -#: accounts/tasks/verify_account.py:55 +#: accounts/tasks/verify_account.py:53 +msgid "" +"When clicking 'Test' in 'Console - Asset details - Accounts' this task will " +"be executed" +msgstr "" +"コントロールパネル-資産詳細-アカウントをクリックしてテストを実行すると、このタスクが実行されます" + +#: accounts/tasks/verify_account.py:59 msgid "Verify accounts connectivity" msgstr "アカウント接続のテスト" @@ -1211,16 +1275,13 @@ msgstr "尊敬する" msgid "" "Hello! The following is the failure of changing the password of your assets " "or pushing the account. Please check and handle it in time." -msgstr "" -"こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとお" -"りです。 時間内に確認して対処してください。" +msgstr "こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとおりです。 時間内に確認して対処してください。" #: accounts/utils.py:52 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." -msgstr "" -"パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." +msgstr "パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" #: accounts/utils.py:59 msgid "private key invalid or passphrase error" @@ -1390,9 +1451,9 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" -"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64 (ドメイン名サ" -"ポート)" +"* はすべて一致することを示します。例: " +"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64" +" (ドメイン名サポート)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1420,8 +1481,8 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" -"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" +"* はすべて一致することを示します。例: " +"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 @@ -1461,9 +1522,7 @@ msgid "" "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." msgstr "" -"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してくださ" -"い。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必" -"要な措置を講じてください。" +"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してください。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必要な措置を講じてください。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -1492,9 +1551,7 @@ msgstr "ユーザーエージェント" #: assets/api/asset/asset.py:181 msgid "Cannot create asset directly, you should create a host or other" -msgstr "" -"資産を直接作成することはできません。ホストまたはその他を作成する必要がありま" -"す" +msgstr "資産を直接作成することはできません。ホストまたはその他を作成する必要があります" #: assets/api/asset/asset.py:185 msgid "The number of assets exceeds the limit of 5000" @@ -1524,32 +1581,32 @@ msgstr "同じレベルのノード名を同じにすることはできません msgid "App Assets" msgstr "アプリ資産" -#: assets/automations/base/manager.py:187 +#: assets/automations/base/manager.py:188 msgid "{} disabled" msgstr "{} 無効" -#: assets/automations/base/manager.py:250 +#: assets/automations/base/manager.py:251 msgid " - Platform {} ansible disabled" msgstr " - プラットフォーム {} ansible 無効" -#: assets/automations/base/manager.py:323 +#: assets/automations/base/manager.py:324 msgid ">>> Task preparation phase" msgstr "タスク準備段階" -#: assets/automations/base/manager.py:326 +#: assets/automations/base/manager.py:327 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> バッチでタスクを実行、合計 {runner_count}" -#: assets/automations/base/manager.py:328 +#: assets/automations/base/manager.py:329 msgid ">>> Start executing tasks" msgstr ">>> タスクの実行を開始" -#: assets/automations/base/manager.py:330 +#: assets/automations/base/manager.py:331 msgid ">>> No tasks need to be executed" msgstr ">>> 実行する必要があるタスクはありません" -#: assets/automations/base/manager.py:335 +#: assets/automations/base/manager.py:336 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> 第 {index} バッチのタスクの実行を開始" @@ -1691,7 +1748,9 @@ msgstr "openssh 5.x または 6.x などの古い SSH バージョン" #: assets/const/protocol.py:53 msgid "Netcat help text" -msgstr "netcat (nc) をプロキシ ツールとして使用し、プロキシ サーバーからターゲット ホストに接続を転送します。 SSH ネイティブ エージェント オプション (-W) がサポートされていない環境、またはより柔軟なタイムアウト制御が必要な環境に最適です。" +msgstr "" +"netcat (nc) をプロキシ ツールとして使用し、プロキシ サーバーからターゲット ホストに接続を転送します。 SSH ネイティブ エージェント " +"オプション (-W) がサポートされていない環境、またはより柔軟なタイムアウト制御が必要な環境に最適です。" #: assets/const/protocol.py:64 msgid "SFTP root" @@ -1704,9 +1763,7 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントの" -"ユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}" -"ユーザーのユーザー名" +"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントのユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}ユーザーのユーザー名" #: assets/const/protocol.py:81 msgid "Console" @@ -1727,20 +1784,17 @@ msgstr "セキュリティ" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされて" -"いるセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します" -"
RDP
レガシーRDP暗号化。このモードは、通常、古い Windowsサーバーや標準" -"のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装され" -"たRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名と" -"パスワードを提供する必要があります
" +"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされているセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します
RDP
レガシーRDP暗号化。このモードは、通常、古い" +" " +"Windowsサーバーや標準のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装されたRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名とパスワードを提供する必要があります
" #: assets/const/protocol.py:106 msgid "AD domain" @@ -1770,7 +1824,7 @@ msgstr "成功プロンプト" msgid "We will consider login success when we see this prompt" msgstr "このプロンプトが表示されたらログイン成功とみなします" -#: assets/const/protocol.py:145 assets/models/asset/database.py:10 +#: assets/const/protocol.py:145 assets/models/asset/database.py:11 #: settings/serializers/msg.py:49 msgid "Use SSL" msgstr "SSLの使用" @@ -1816,9 +1870,7 @@ msgstr "安全モード" msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "" -"安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへ" -"のアクセスなど、一部の操作が無効になります" +msgstr "安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへのアクセスなど、一部の操作が無効になります" #: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -1909,22 +1961,26 @@ msgstr "資産ノードを変更できます" msgid "Custom asset" msgstr "カスタム アセット" -#: assets/models/asset/database.py:11 +#: assets/models/asset/database.py:12 msgid "CA cert" msgstr "CA 証明書" -#: assets/models/asset/database.py:12 +#: assets/models/asset/database.py:13 msgid "Client cert" msgstr "クライアント証明書" -#: assets/models/asset/database.py:13 +#: assets/models/asset/database.py:14 msgid "Client key" msgstr "クライアントキー" -#: assets/models/asset/database.py:14 +#: assets/models/asset/database.py:15 msgid "Allow invalid cert" msgstr "証明書チェックを無視" +#: assets/models/asset/database.py:18 +msgid "Postgresql SSL mode" +msgstr "PostgreSQL SSL モード" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:92 msgid "Proxy" msgstr "プロキシー" @@ -2222,9 +2278,7 @@ msgstr "%(value)s は偶数ではありません" msgid "" "Batch update platform in assets, skipping assets that do not meet platform " "type" -msgstr "" -"プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プ" -"ラットフォーム" +msgstr "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プラットフォーム" #: assets/serializers/asset/common.py:36 msgid "Protocols, format is [\"protocol/port\"]" @@ -2238,17 +2292,13 @@ msgstr "契約書、形式は 名前/ポート" msgid "" "Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " "\"secret_type\": \"password\"}]" -msgstr "" -"アカウント、形式は [{\"name\": \"x\", \"username\": \"x\", \"secret\": " -"\"x\", \"secret_type\": \"パスワード\"}]" +msgstr "アカウント、形式は [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"パスワード\"}]" #: assets/serializers/asset/common.py:135 msgid "" "Node path, format [\"/org_name/node_name\"], if node not exist, will create " "it" -msgstr "" -"ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作" -"成します" +msgstr "ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作成します" #: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 @@ -2289,13 +2339,25 @@ msgstr "無効なデータ" msgid "Default database" msgstr "デフォルト・データベース" +#: assets/serializers/asset/database.py:23 +msgid "CA cert help text" +msgstr "" +" Common Name (CN) フィールドは廃止されました。RFC 5280に基づき、Subject Alternative Name (SAN) " +"フィールドを使用してドメイン名を確認し、セキュリティを強化してください" + +#: assets/serializers/asset/database.py:24 +msgid "Postgresql ssl model help text" +msgstr "" +"Prefer:私は暗号化に関心はありませんが、サーバーが暗号化をサポートしているなら、私は暗号化のコストを支払うことを喜んでいます。Require:私のデータを暗号化してほしい、そのコストを受け入れます。私はネットワークが私が接続したいサーバーに常に接続できるように保証してくれると信じています。Verify" +" CA:私はデータが暗号化され、コストを受け入れます。私が信頼するサーバーに接続されていることを確認したい。Verify " +"Full:私はデータが暗号化され、コストを受け入れます。私が信頼するサーバーに接続されていること、そしてそれが私が指定したサーバーであることを確認したい" + #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" msgstr "" -"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要" -"があります。例: http(s)://host:port" +"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要があります。例: http(s)://host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2367,9 +2429,7 @@ msgstr "タイプ" msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." -msgstr "" -"ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続す" -"る際には、接続はゲートウェイを通してルーティングされます。" +msgstr "ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続する際には、接続はゲートウェイを通してルーティングされます。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 #: orgs/serializers.py:13 perms/serializers/permission.py:50 @@ -2440,9 +2500,7 @@ msgstr "アドレスからのポート" msgid "" "This protocol is primary, and it must be set when adding assets. " "Additionally, there can only be one primary protocol." -msgstr "" -"このプロトコルはプライマリであり、資産を追加するときに設定する必要がありま" -"す。また、プライマリプロトコルは1つしかありません" +msgstr "このプロトコルはプライマリであり、資産を追加するときに設定する必要があります。また、プライマリプロトコルは1つしかありません" #: assets/serializers/platform.py:102 msgid "This protocol is required, and it must be set when adding assets." @@ -2452,14 +2510,11 @@ msgstr "このプロトコルは必須であり、資産を追加するときに msgid "" "This protocol is default, when adding assets, it will be displayed by " "default." -msgstr "" -"このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されま" -"す" +msgstr "このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されます" #: assets/serializers/platform.py:108 msgid "This protocol is public, asset will show this protocol to user" -msgstr "" -"このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" +msgstr "このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" #: assets/serializers/platform.py:157 msgid "Help text" @@ -2479,9 +2534,8 @@ msgid "" "another, similar to logging in with a regular account and then switching to " "root" msgstr "" -"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに" -"切り替えます。これは、通常のアカウントでログインした後に root に切り替えるの" -"と似ています" +"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに切り替えます。これは、通常のアカウントでログインした後に root " +"に切り替えるのと似ています" #: assets/serializers/platform.py:205 msgid "Assets can be connected using a zone gateway" @@ -2499,7 +2553,7 @@ msgstr "タイプ このフィールドは必須です." msgid "Protocols is required" msgstr "同意が必要です" -#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:35 +#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:39 msgid "Test assets connectivity " msgstr "アセット接続のテスト。" @@ -2507,19 +2561,26 @@ msgstr "アセット接続のテスト。" msgid "Gather asset hardware info" msgstr "資産ハードウェア情報の収集" -#: assets/tasks/automation.py:24 +#: assets/tasks/automation.py:25 msgid "Asset execute automation" msgstr "アセット実行の自動化" -#: assets/tasks/gather_facts.py:21 assets/tasks/gather_facts.py:27 +#: assets/tasks/gather_facts.py:22 assets/tasks/gather_facts.py:32 msgid "Gather assets facts" msgstr "資産情報の収集" -#: assets/tasks/gather_facts.py:39 +#: assets/tasks/gather_facts.py:25 +msgid "" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" +" will be executed" +msgstr "" +"コントロールパネル資産詳細-基本設定をクリックしてハードウェア情報を更新すると、このタスクが実行されます" + +#: assets/tasks/gather_facts.py:44 msgid "Update assets hardware info: " msgstr "資産のハードウェア情報を更新する:" -#: assets/tasks/gather_facts.py:47 +#: assets/tasks/gather_facts.py:52 msgid "Update node asset hardware information: " msgstr "ノード資産のハードウェア情報を更新します。" @@ -2527,30 +2588,58 @@ msgstr "ノード資産のハードウェア情報を更新します。" msgid "Check the amount of assets under the node" msgstr "ノード下のアセット数を確認する" -#: assets/tasks/nodes_amount.py:28 +#: assets/tasks/nodes_amount.py:18 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" +"Manually verifying asset quantities updates the asset count for nodes under the \n" +" current organization. This task will be called in the following two cases: when updating \n" +" nodes and when the number of nodes exceeds 100" msgstr "" -"セルフチェックのタスクはすでに実行されており、繰り返し開始することはできませ" -"ん" +"手動で資産数を校正して現在の組織のノード資産数を更新する;ノードを更新する、ノード数が100を超えると、このタスクが呼び出されます" + +#: assets/tasks/nodes_amount.py:34 +msgid "" +"The task of self-checking is already running and cannot be started " +"repeatedly" +msgstr "セルフチェックのタスクはすでに実行されており、繰り返し開始することはできません" -#: assets/tasks/nodes_amount.py:33 +#: assets/tasks/nodes_amount.py:40 msgid "Periodic check the amount of assets under the node" msgstr "ノードの下にあるアセットの数を定期的に確認する" -#: assets/tasks/ping.py:20 assets/tasks/ping.py:26 +#: assets/tasks/nodes_amount.py:42 +msgid "" +"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" +" all nodes under all organizations" +msgstr "" +"check_node_assets_amount_taskタスクを定期的に呼び出し、すべての組織のすべてのノードの資産数を更新します" + +#: assets/tasks/ping.py:20 assets/tasks/ping.py:30 msgid "Test assets connectivity" msgstr "アセット接続のテスト。" -#: assets/tasks/ping.py:42 +#: assets/tasks/ping.py:24 +msgid "" +"When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' " +"this task will be executed" +msgstr "" +"資産詳細-基本設定をクリックして資産の接続性をテストすると、このタスクが実行されます" + +#: assets/tasks/ping.py:46 msgid "Test if the assets under the node are connectable " msgstr "ノード配下のアセットが接続できるかテストする" -#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:25 -#: assets/tasks/ping_gateway.py:34 +#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:29 +#: assets/tasks/ping_gateway.py:38 msgid "Test gateways connectivity" msgstr "ゲートウェイ接続のテスト。" +#: assets/tasks/ping_gateway.py:23 +msgid "" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" +" be executed" +msgstr "" +"ネットワーク詳細-ゲートウェイ-接続テストを実行する際に、このタスクを実行します" + #: assets/tasks/utils.py:16 msgid "Asset has been disabled, skipped: {}" msgstr "資産が無効化されました。スキップ: {}" @@ -2572,7 +2661,8 @@ msgid "App Audits" msgstr "監査" #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "文章の内容が長すぎる。Elasticsearchで操作履歴を保存する" #: audits/backends/db.py:108 @@ -2657,7 +2747,7 @@ msgstr "承認" msgid "Close" msgstr "閉じる" -#: audits/const.py:41 ops/models/celery.py:84 +#: audits/const.py:41 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" @@ -2665,8 +2755,8 @@ msgstr "終了" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:78 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:55 terminal/serializers/session.py:78 msgid "Terminal" msgstr "ターミナル" @@ -2705,7 +2795,8 @@ msgid "Job audit log" msgstr "ジョブ監査ログ" #: audits/models.py:56 audits/models.py:100 audits/models.py:175 -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:113 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:113 msgid "Remote addr" msgstr "リモートaddr" @@ -2818,9 +2909,9 @@ msgstr "ユーザーセッション" msgid "Offline user session" msgstr "オフラインユーザセッション" -#: audits/serializers.py:33 ops/models/adhoc.py:25 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:86 ops/models/job.py:151 -#: ops/models/job.py:240 ops/models/playbook.py:30 +#: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:151 +#: ops/models/job.py:240 ops/models/playbook.py:32 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "作成者" @@ -2875,7 +2966,7 @@ msgstr "認証トークン" #: audits/signal_handlers/login_log.py:37 authentication/notifications.py:73 #: authentication/views/login.py:78 notifications/backends/__init__.py:11 #: settings/serializers/auth/wecom.py:11 settings/serializers/auth/wecom.py:16 -#: users/models/user/__init__.py:122 users/models/user/_source.py:18 +#: users/models/user/__init__.py:122 users/models/user/_source.py:19 msgid "WeCom" msgstr "企業微信" @@ -2883,21 +2974,21 @@ msgstr "企業微信" #: authentication/views/login.py:90 notifications/backends/__init__.py:14 #: settings/serializers/auth/feishu.py:12 #: settings/serializers/auth/feishu.py:14 users/models/user/__init__.py:128 -#: users/models/user/_source.py:20 +#: users/models/user/_source.py:21 msgid "FeiShu" msgstr "本を飛ばす" #: audits/signal_handlers/login_log.py:40 authentication/views/login.py:102 #: authentication/views/slack.py:79 notifications/backends/__init__.py:16 #: settings/serializers/auth/slack.py:11 settings/serializers/auth/slack.py:13 -#: users/models/user/__init__.py:134 users/models/user/_source.py:22 +#: users/models/user/__init__.py:134 users/models/user/_source.py:23 msgid "Slack" msgstr "Slack" #: audits/signal_handlers/login_log.py:41 authentication/views/dingtalk.py:151 #: authentication/views/login.py:84 notifications/backends/__init__.py:12 #: settings/serializers/auth/dingtalk.py:11 users/models/user/__init__.py:125 -#: users/models/user/_source.py:19 +#: users/models/user/_source.py:20 msgid "DingTalk" msgstr "DingTalk" @@ -2912,14 +3003,31 @@ msgstr "仮パスワード" msgid "Passkey" msgstr "Passkey" -#: audits/tasks.py:131 +#: audits/tasks.py:132 msgid "Clean audits session task log" msgstr "資産監査セッションタスクログのクリーンアップ" -#: audits/tasks.py:145 +#: audits/tasks.py:134 +msgid "" +"Since the system generates login logs, operation logs, file upload logs, activity \n" +" logs, Celery execution logs, session recordings, command records, and password change \n" +" logs, it will perform cleanup of records that exceed the time limit according to the \n" +" 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" +msgstr "" +"システムはログインログ、操作ログ、ファイルアップロードログ、アクティビティログ、セルリー実行ログ、セッション録画、コマンド記録、パスワード変更ログを生成します。システムは、システム設定-" +"タスクリスト-定期クリーニング設定に基づき、毎日午前2時に時間を超えたものをクリーニングします" + +#: audits/tasks.py:154 msgid "Upload FTP file to external storage" msgstr "外部ストレージへのFTPファイルのアップロード" +#: audits/tasks.py:156 +msgid "" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" +" synchronized to external storage" +msgstr "" +"SERVER_REPLAY_STORAGEが設定されている場合は、ファイルマネージャーでアップロードしたファイルを外部ストレージに同期します" + #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" msgstr "最大10個のアクセスキーを作成できます" @@ -2935,9 +3043,7 @@ msgstr "この操作には、MFAを検証する必要があります" #: authentication/api/connection_token.py:265 msgid "Reusable connection token is not allowed, global setting not enabled" -msgstr "" -"再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効に" -"なっていません" +msgstr "再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効になっていません" #: authentication/api/connection_token.py:379 msgid "Anonymous account is not supported for this asset" @@ -2976,9 +3082,7 @@ msgstr "ユーザーにマッチしなかった" msgid "" "The user is from {}, please go to the corresponding system to change the " "password" -msgstr "" -"ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してくだ" -"さい。" +msgstr "ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してください。" #: authentication/api/password.py:65 #: authentication/templates/authentication/login.html:393 @@ -3009,8 +3113,7 @@ msgstr "無効なトークンヘッダー。記号文字列にはスペースを #: authentication/backends/drf.py:61 msgid "" "Invalid token header. Sign string should not contain invalid characters." -msgstr "" -"無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" +msgstr "無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" #: authentication/backends/drf.py:74 msgid "Invalid token or cache refreshed." @@ -3022,9 +3125,7 @@ msgstr "OpenID エラー" #: authentication/backends/oidc/views.py:175 msgid "Please check if a user with the same username or email already exists" -msgstr "" -"同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認して" -"ください" +msgstr "同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認してください" #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" @@ -3044,7 +3145,8 @@ msgstr "に追加" #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:26 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後に使用した日付" @@ -3119,34 +3221,27 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 " -"{times_try} 回試すこともできます (アカウントは {block_time} 分の間一時的に" -"ロックされます)" +"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 {times_try} 回試すこともできます (アカウントは " +"{block_time} 分の間一時的にロックされます)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" "The account has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "" -"アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後" -"にもう一度お試しください)" +msgstr "アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後にもう一度お試しください)" #: authentication/errors/const.py:51 msgid "" "The address has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "" -"IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行" -"してください)" +msgstr "IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行してください)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" -msgstr "" -"{error},{times_try} 回も試すことができます (アカウントは {block_time} 分の間" -"一時的にロックされます)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" +msgstr "{error},{times_try} 回も試すことができます (アカウントは {block_time} 分の間一時的にロックされます)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3233,8 +3328,7 @@ msgstr "ログインする前にパスワードを変更する必要がありま #: authentication/errors/redirect.py:101 authentication/mixins.py:337 msgid "Your password has expired, please reset before logging in" -msgstr "" -"パスワードの有効期限が切れました。ログインする前にリセットしてください。" +msgstr "パスワードの有効期限が切れました。ログインする前にリセットしてください。" #: authentication/forms.py:34 msgid "Auto-login" @@ -3275,8 +3369,7 @@ msgstr "カスタム MFA 検証コード" #: authentication/mfa/custom.py:56 msgid "MFA custom global enabled, cannot disable" -msgstr "" -"カスタム MFA はグローバルに有効になっており、無効にすることはできません" +msgstr "カスタム MFA はグローバルに有効になっており、無効にすることはできません" #: authentication/mfa/otp.py:7 msgid "OTP code invalid, or server time error" @@ -3331,7 +3424,7 @@ msgstr "電話番号を設定して有効にする" msgid "Clear phone number to disable" msgstr "無効にする電話番号をクリアする" -#: authentication/middleware.py:94 settings/utils/ldap.py:681 +#: authentication/middleware.py:94 settings/utils/ldap.py:691 msgid "Authentication failed (before login check failed): {}" msgstr "認証に失敗しました (ログインチェックが失敗する前): {}" @@ -3343,9 +3436,7 @@ msgstr "無効なユーザーです" msgid "" "The administrator has enabled 'Only allow login from user source'. \n" " The current user source is {}. Please contact the administrator." -msgstr "" -"管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユー" -"ザーソースは {} です。管理者に連絡してください。" +msgstr "管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユーザーソースは {} です。管理者に連絡してください。" #: authentication/mixins.py:273 msgid "The MFA type ({}) is not enabled" @@ -3558,11 +3649,9 @@ msgstr "タイプを作成" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" -msgstr "" -"作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度き" -"りです" +"Please download the private key after creation. Each private key can only be" +" downloaded once" +msgstr "作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度きりです" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 #: users/serializers/profile.py:133 users/serializers/profile.py:160 @@ -3579,10 +3668,17 @@ msgstr "Access IP" msgid "Is valid" msgstr "有効です" -#: authentication/tasks.py:11 +#: authentication/tasks.py:13 msgid "Clean expired session" msgstr "期限切れのセッションをクリアする" +#: authentication/tasks.py:15 +msgid "" +"Since user logins create sessions, the system will clean up expired sessions" +" every 24 hours" +msgstr "" +"ユーザーがシステムにログインするとセッションが生成されます。システムは24時間ごとに期限切れのセッションをクリーニングします" + #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" msgstr "APIキーリスト" @@ -3642,7 +3738,7 @@ msgstr "コードエラー" #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:502 +#: jumpserver/conf.py:522 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -3659,9 +3755,7 @@ msgstr "アカウントにリモートログイン動作があります。注意 msgid "" "If you suspect that the login behavior is abnormal, please modify the " "account password in time." -msgstr "" -"ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変" -"更してください。" +msgstr "ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変更してください。" #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" @@ -3675,9 +3769,7 @@ msgstr "操作が独自のものでない場合は、パスワードをバイン msgid "" "Please click the link below to reset your password, if not your request, " "concern your account security" -msgstr "" -"下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場" -"合は、アカウントのセキュリティに関係します。" +msgstr "下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場合は、アカウントのセキュリティに関係します。" #: authentication/templates/authentication/_msg_reset_password.html:10 msgid "Click here reset password" @@ -3722,9 +3814,7 @@ msgstr "ブラウザ" msgid "" "If the password update was not initiated by you, your account may have " "security issues" -msgstr "" -"パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題があ" -"る可能性があります" +msgstr "パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" #: authentication/templates/authentication/_msg_rest_password_success.html:14 #: authentication/templates/authentication/_msg_rest_public_key_success.html:14 @@ -3739,9 +3829,7 @@ msgstr "公開鍵が正常に更新されました" msgid "" "If the public key update was not initiated by you, your account may have " "security issues" -msgstr "" -"公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可" -"能性があります" +msgstr "公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" #: authentication/templates/authentication/auth_fail_flash_message_standalone.html:28 #: templates/flash_message_standalone.html:28 tickets/const.py:18 @@ -3752,9 +3840,7 @@ msgstr "キャンセル" msgid "" "Configuration file has problems and cannot be logged in. Please contact the " "administrator or view latest docs" -msgstr "" -"設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のド" -"キュメントを参照してください。" +msgstr "設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のドキュメントを参照してください。" #: authentication/templates/authentication/login.html:309 msgid "If you are administrator, you can update the config resolve it, set" @@ -3800,9 +3886,7 @@ msgstr "コピー成功" msgid "" "This page is not served over HTTPS. Please use HTTPS to ensure security of " "your credentials." -msgstr "" -"このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリ" -"ティを確保してください。" +msgstr "このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリティを確保してください。" #: authentication/templates/authentication/passkey.html:173 msgid "Do you want to retry ?" @@ -3931,11 +4015,9 @@ msgstr "ログアウト成功、ログインページを返す" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" -msgstr "" -"安全のため、クライアントでの自動リダイレクトログインはサポートされていませ" -"ん。クライアントで開く必要がある場合は、再度ログインしてください" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" +msgstr "安全のため、クライアントでの自動リダイレクトログインはサポートされていません。クライアントで開く必要がある場合は、再度ログインしてください" #: authentication/views/slack.py:35 authentication/views/slack.py:118 msgid "Slack Error" @@ -4041,13 +4123,12 @@ msgstr "Secret Keyを使用したフィールドの暗号化" #: common/db/fields.py:577 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 " -"{'type':'ids','ids':[]}或 #タイプ:属性、属性:[#名前:ip、照合:正確、" -"値:1.1.1.1}" +"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 {'type':'ids','ids':[]}或 " +"#タイプ:属性、属性:[#名前:ip、照合:正確、値:1.1.1.1}" #: common/db/fields.py:584 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4133,9 +4214,7 @@ msgstr "日付時刻形式 {}" msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" -msgstr "" -"選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。" -"選択肢は {}" +msgstr "選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。選択肢は {}" #: common/drf/renders/base.py:156 msgid "Choices, options {}" @@ -4152,9 +4231,7 @@ msgstr "タグ、形式: [\"キー:値\"]" #: common/drf/renders/base.py:162 msgid "" "Object, format name(id), name is optional for human read, id is requisite" -msgstr "" -"関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須で" -"す" +msgstr "関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須です" #: common/drf/renders/base.py:164 msgid "Object, format id" @@ -4164,15 +4241,11 @@ msgstr "関連項目、形式は id" msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" -msgstr "" -"多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいよう" -"に、idは必須です" +msgstr "多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいように、idは必須です" #: common/drf/renders/base.py:170 -msgid "" -"Labels, format [\"key:value\", ...], if label not exists, will create it" -msgstr "" -"タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します" +msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します" #: common/drf/renders/base.py:172 msgid "Objects, format [\"id\", ...]" @@ -4182,9 +4255,7 @@ msgstr "多関連項目、形式は [\"id\", ...]" msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" -msgstr "" -"{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワード" -"に暗号化パスワードを設定してください" +msgstr "{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワードに暗号化パスワードを設定してください" #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format @@ -4227,9 +4298,7 @@ msgstr "サポートされていません Elasticsearch8" msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" -msgstr "" -"接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してく" -"ださい" +msgstr "接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してください" #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" @@ -4339,17 +4408,36 @@ msgstr "無効なオプション: {}" msgid "Tags" msgstr "ラベル" -#: common/tasks.py:31 +#: common/tasks.py:32 msgid "Send email" msgstr "メールを送る" -#: common/tasks.py:58 +#: common/tasks.py:35 +msgid "This task will be executed when sending email notifications" +msgstr "" +"メールメッセージを送信するときは、このタスクを実行します" + +#: common/tasks.py:65 msgid "Send email attachment" msgstr "メールの添付ファイルを送信" -#: common/tasks.py:80 terminal/tasks.py:58 -msgid "Upload session replay to external storage" -msgstr "セッションの記録を外部ストレージにアップロードする" +#: common/tasks.py:68 +msgid "" +"When an account password is changed or an account backup generates attachments, \n" +" this task needs to be executed for sending emails and handling attachments" +msgstr "" +"アカウントのパスワードを変更したり、アカウントのバックアップが添付ファイルを生成したりすると、メールと添付ファイルを送信するためのタスクを実行する必要があります" + +#: common/tasks.py:94 +msgid "Upload account backup to external storage" +msgstr " セッション映像を外部ストレージにアップロードする" + +#: common/tasks.py:96 +msgid "" +"When performing an account backup, this task needs to be executed to " +"external storage (SFTP)" +msgstr "" +"アカウントのバックアップを実行するときに外部ストレージ(sftp)にアクセスするため、このタスクを実行します" #: common/utils/ip/geoip/utils.py:26 msgid "Invalid ip" @@ -4364,10 +4452,17 @@ msgstr "無効なアドレス。" msgid "Hello %s" msgstr "こんにちは %s" -#: common/utils/verify_code.py:16 +#: common/utils/verify_code.py:17 msgid "Send SMS code" msgstr "SMS 認証コードを送信する" +#: common/utils/verify_code.py:19 +msgid "" +"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" +" be executed to send SMS messages" +msgstr "" +"パスワードをリセットするか、パスワードを忘れるか、mfaを検証するときにSMSを送信する必要がある場合、このタスクを実行します" + #: common/validators.py:16 msgid "Special char not allowed" msgstr "特別なcharは許可されていません" @@ -4380,16 +4475,16 @@ msgstr "特殊文字を含むべきではない" msgid "The mobile phone number format is incorrect" msgstr "携帯電話番号の形式が正しくありません" -#: jumpserver/conf.py:496 +#: jumpserver/conf.py:516 #, python-brace-format msgid "The verification code is: {code}" msgstr "認証コードは: {code}" -#: jumpserver/conf.py:501 +#: jumpserver/conf.py:521 msgid "Create account successfully" msgstr "アカウントを正常に作成" -#: jumpserver/conf.py:503 +#: jumpserver/conf.py:523 msgid "Your account has been created successfully" msgstr "アカウントが正常に作成されました" @@ -4407,16 +4502,13 @@ msgid "" "configure nginx for url distribution,
If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要" -"があります。urlディストリビューションにnginxを設定します。
この" -"ページが表示されている場合は、nginxリスニングポートにアクセスしていないことを" -"証明してください。頑張ってください。" +"
" +"Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要があります。urlディストリビューションにnginxを設定します。
" +" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" -msgstr "" -"Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要がありま" -"す。" +msgstr "Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要があります。" #: jumpserver/views/other.py:90 msgid "" @@ -4424,10 +4516,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要が" -"あります。URL配布用にnginxを設定します。
このページが表示されて" -"いる場合は、nginxリスニングポートにアクセスしていないことを証明してください。" -"頑張ってください。" +"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要があります。URL配布用にnginxを設定します。
" +" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" #: labels/apps.py:8 msgid "App Labels" @@ -4489,15 +4579,22 @@ msgstr "システムメッセージ" msgid "Publish the station message" msgstr "投稿サイトニュース" -#: ops/ansible/inventory.py:106 ops/models/job.py:65 +#: notifications/notifications.py:48 +msgid "" +"This task needs to be executed for sending internal messages for system alerts, \n" +" work orders, and other notifications" +msgstr "" +"システムの警告やチケットなどを送信するためには、このタスクを実行します" + +#: ops/ansible/inventory.py:116 ops/models/job.py:65 msgid "No account available" msgstr "利用可能なアカウントがありません" -#: ops/ansible/inventory.py:286 +#: ops/ansible/inventory.py:296 msgid "Ansible disabled" msgstr "Ansible 無効" -#: ops/ansible/inventory.py:302 +#: ops/ansible/inventory.py:312 msgid "Skip hosts below:" msgstr "次のホストをスキップします: " @@ -4518,15 +4615,12 @@ msgstr "タスク実行パラメータエラー" msgid "" "Asset ({asset}) must have at least one of the following protocols added: " "SSH, SFTP, or WinRM" -msgstr "" -"資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加" -"する必要があります" +msgstr "資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加する必要があります" #: ops/api/job.py:84 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" -msgstr "" -"資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" +msgstr "資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" #: ops/api/job.py:85 #, python-brace-format @@ -4541,40 +4635,38 @@ msgstr "重複したファイルが存在する" #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" -msgstr "" -"ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択し" -"てください。" +msgstr "ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択してください。" #: ops/api/job.py:244 msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "タスクを作成中で、中断できません。後でもう一度お試しください。" -#: ops/api/playbook.py:39 +#: ops/api/playbook.py:50 msgid "Currently playbook is being used in a job" msgstr "現在プレイブックは1つのジョブで使用されています" -#: ops/api/playbook.py:97 +#: ops/api/playbook.py:113 msgid "Unsupported file content" msgstr "サポートされていないファイルの内容" -#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193 +#: ops/api/playbook.py:115 ops/api/playbook.py:161 ops/api/playbook.py:209 msgid "Invalid file path" msgstr "無効なファイルパス" -#: ops/api/playbook.py:171 +#: ops/api/playbook.py:187 msgid "This file can not be rename" msgstr "ファイル名を変更することはできません" -#: ops/api/playbook.py:190 +#: ops/api/playbook.py:206 msgid "File already exists" msgstr "ファイルは既に存在します。" -#: ops/api/playbook.py:208 +#: ops/api/playbook.py:224 msgid "File key is required" msgstr "ファイルキーこのフィールドは必須です" -#: ops/api/playbook.py:211 +#: ops/api/playbook.py:227 msgid "This file can not be delete" msgstr "このファイルを削除できません" @@ -4618,7 +4710,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "コマンド" -#: ops/const.py:39 ops/models/job.py:149 ops/models/playbook.py:88 +#: ops/const.py:39 ops/models/job.py:149 ops/models/playbook.py:91 msgid "Playbook" msgstr "Playbook" @@ -4682,53 +4774,72 @@ msgstr "タイムアウト" msgid "Command execution disabled" msgstr "コマンド実行が無効" +#: ops/const.py:86 +msgctxt "scope" +msgid "Public" +msgstr "公有" + +#: ops/const.py:87 +msgid "Private" +msgstr "私有" + #: ops/exception.py:6 msgid "no valid program entry found." msgstr "利用可能なプログラムポータルがありません" -#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:73 +#: ops/mixin.py:30 ops/mixin.py:110 settings/serializers/auth/ldap.py:73 +#: settings/serializers/auth/ldap_ha.py:55 msgid "Periodic run" msgstr "定期的なパフォーマンス" -#: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108 +#: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116 #: settings/serializers/auth/ldap.py:80 +#: settings/serializers/auth/ldap_ha.py:62 msgid "Interval" msgstr "間隔" -#: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105 +#: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113 #: settings/serializers/auth/ldap.py:77 +#: settings/serializers/auth/ldap_ha.py:59 msgid "Crontab" msgstr "含む" -#: ops/mixin.py:110 +#: ops/mixin.py:118 msgid "Run period" msgstr "ユーザーの実行" -#: ops/mixin.py:119 +#: ops/mixin.py:127 msgid "* Please enter a valid crontab expression" msgstr "* 有効なcrontab式を入力してください" -#: ops/mixin.py:126 +#: ops/mixin.py:134 msgid "Range {} to {}" msgstr "{} から {} までの範囲" -#: ops/mixin.py:137 +#: ops/mixin.py:145 msgid "Require interval or crontab setting" msgstr "定期的または定期的に設定を行う必要があります" -#: ops/models/adhoc.py:21 +#: ops/models/adhoc.py:20 msgid "Pattern" msgstr "パターン" -#: ops/models/adhoc.py:23 ops/models/job.py:146 +#: ops/models/adhoc.py:22 ops/models/job.py:146 msgid "Module" msgstr "モジュール" -#: ops/models/adhoc.py:24 ops/models/celery.py:81 ops/models/job.py:144 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:144 #: terminal/models/component/task.py:14 msgid "Args" msgstr "アルグ" +#: ops/models/adhoc.py:26 ops/models/playbook.py:36 +#: ops/serializers/mixin.py:10 rbac/models/role.py:31 +#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 +#: settings/serializers/auth/oauth2.py:37 +msgid "Scope" +msgstr "スコープ" + #: ops/models/base.py:19 msgid "Account policy" msgstr "アカウント ポリシー" @@ -4755,23 +4866,23 @@ msgstr "Summary" msgid "Date last publish" msgstr "発売日" -#: ops/models/celery.py:70 +#: ops/models/celery.py:71 msgid "Celery Task" msgstr "Celery タスク#タスク#" -#: ops/models/celery.py:73 +#: ops/models/celery.py:74 msgid "Can view task monitor" msgstr "タスクモニターを表示できます" -#: ops/models/celery.py:82 terminal/models/component/task.py:15 +#: ops/models/celery.py:83 terminal/models/component/task.py:15 msgid "Kwargs" msgstr "クワーグ" -#: ops/models/celery.py:87 +#: ops/models/celery.py:88 msgid "Date published" msgstr "発売日" -#: ops/models/celery.py:112 +#: ops/models/celery.py:113 msgid "Celery Task Execution" msgstr "Celery タスク実行" @@ -4816,11 +4927,11 @@ msgstr "Material を選択してオプションを設定します。" msgid "Job Execution" msgstr "ジョブ実行" -#: ops/models/playbook.py:33 +#: ops/models/playbook.py:35 msgid "CreateMethod" msgstr "创建方式" -#: ops/models/playbook.py:34 +#: ops/models/playbook.py:37 msgid "VCS URL" msgstr "VCS URL" @@ -4884,34 +4995,84 @@ msgstr "タスク ID" msgid "You do not have permission for the current job." msgstr "あなたは現在のジョブの権限を持っていません。" -#: ops/tasks.py:50 +#: ops/tasks.py:51 msgid "Run ansible task" msgstr "Ansible タスクを実行する" -#: ops/tasks.py:76 +#: ops/tasks.py:54 +msgid "" +"Execute scheduled adhoc and playbooks, periodically invoking the task for " +"execution" +msgstr "" +"タイムスケジュールのショートカットコマンドやplaybookを実行するときは、このタスクを呼び出します" + +#: ops/tasks.py:82 msgid "Run ansible task execution" msgstr "Ansible タスクの実行を開始する" -#: ops/tasks.py:89 +#: ops/tasks.py:85 +msgid "Execute the task when manually adhoc or playbooks" +msgstr "" +"手動でショートカットコマンドやplaybookを実行するときは、このタスクを実行します" + +#: ops/tasks.py:99 msgid "Clear celery periodic tasks" msgstr "タスクログを定期的にクリアする" -#: ops/tasks.py:110 +#: ops/tasks.py:101 +msgid "At system startup, clean up celery tasks that no longer exist" +msgstr "" +"システム起動時、既に存在しないceleryのタスクをクリーニングします" + +#: ops/tasks.py:125 msgid "Create or update periodic tasks" msgstr "定期的なタスクの作成または更新" -#: ops/tasks.py:118 +#: ops/tasks.py:127 +msgid "" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" +" of scheduled tasks will be updated" +msgstr "" +"バージョンがアップグレードされると、新しいタスクが追加され、タスクの名前や実行時間が変更される可能性があるため、システムが起動すると、タスクを登録したり、タスクのパラメータを更新したりします" + +#: ops/tasks.py:140 msgid "Periodic check service performance" msgstr "サービスのパフォーマンスを定期的に確認する" -#: ops/tasks.py:124 +#: ops/tasks.py:142 +msgid "" +"Check every hour whether each component is offline and whether the CPU, memory, \n" +" and disk usage exceed the thresholds, and send an alert message to the administrator" +msgstr "" +"毎時、各コンポーネントがオフラインになっていないか、CPU、メモリ、ディスク使用率が閾値を超えていないかをチェックし、管理者にメッセージで警告を送ります" + +#: ops/tasks.py:152 msgid "Clean up unexpected jobs" msgstr "例外ジョブのクリーンアップ" -#: ops/tasks.py:131 +#: ops/tasks.py:154 +msgid "" +"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" +" which result in the task status not being updated, the system will clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and mark these tasks as \n" +" failed" +msgstr "" +"ショートカットコマンドやplaybookを実行するジョブセンターでは異常が発生し、タスクの状態が更新されないことがあります。そのため、システムは毎時間、3時間以上終了していない異常なジョブをクリーニングし、タスクを失敗とマークします" + +#: ops/tasks.py:167 msgid "Clean job_execution db record" msgstr "ジョブセンター実行履歴のクリーンアップ" +#: ops/tasks.py:169 +msgid "" +"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" +" be generated. The system will clean up records that exceed the retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" +" Job execution retention days'" +msgstr "" +"ショートカットコマンドやplaybookを実行するジョブセンターでは、実行レコードが生成されます。システムは、システム設定-タスクリスト-定期的なクリーニング-ジョブセンター実行履歴の設定に基づき、毎日午前2時に保存期間を超過したレコードをクリーニングします。" + #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" msgstr "タスクログ" @@ -4960,8 +5121,7 @@ msgstr "現在の組織 ({}) は削除できません" msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" -msgstr "" -"LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" +msgstr "LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" #: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" @@ -4977,10 +5137,11 @@ msgstr "組織を選択してから保存してください" #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91 #: rbac/const.py:7 rbac/models/rolebinding.py:56 -#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:52 +#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:60 msgid "Organization" msgstr "組織" @@ -5038,7 +5199,7 @@ msgstr "アカウントを集める" msgid "Asset permissions amount" msgstr "資産権限" -#: orgs/tasks.py:9 +#: orgs/tasks.py:10 msgid "Refresh organization cache" msgstr "組織キャッシュを更新する" @@ -5144,8 +5305,8 @@ msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" msgstr "" -"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], " -"バーチャルオプション: @ALL, @SPEC, @USER, @ANON, @INPUT" +"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], バーチャルオプション: @ALL, " +"@SPEC, @USER, @ANON, @INPUT" #: perms/serializers/permission.py:38 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -5159,14 +5320,32 @@ msgstr "ユーザーグループ" msgid "Groups amount" msgstr "ユーザーグループの数" -#: perms/tasks.py:27 +#: perms/tasks.py:28 msgid "Check asset permission expired" msgstr "アセット認証ルールの有効期限が切れていることを確認する" -#: perms/tasks.py:40 +#: perms/tasks.py:30 +msgid "" +"The cache of organizational collections, which have completed user authorization tree \n" +" construction, will expire. Therefore, expired collections need to be cleared from the \n" +" cache, and this task will be executed periodically based on the time interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" +msgstr "" +"利用者権限ツリーの組織集合キャッシュは期限切れになるため、期限切れの集合をキャッシュからクリアする必要があります。このActionは、システム設定ファイルconfig.txt中のPERM_EXPIRED_CHECK_PERIODICの時間間隔に基づいて定期的に実行されます" + +#: perms/tasks.py:49 msgid "Send asset permission expired notification" msgstr "アセット許可の有効期限通知を送信する" +#: perms/tasks.py:51 +msgid "" +"Check every day at 10 a.m. and send a notification message to users associated with \n" +" assets whose authorization is about to expire, as well as to the organization's \n" +" administrators, 3 days in advance, to remind them that the asset authorization will \n" +" expire in a few days" +msgstr "" +"毎日午前10時にチェックを行い、資産の承認が近く期限切れになる利用者及びその組織の管理者に、資産が何日で期限切れになるかを3日前に通知を送ります" + #: perms/templates/perms/_msg_item_permissions_expire.html:7 #: perms/templates/perms/_msg_permed_items_expire.html:7 #, python-format @@ -5259,11 +5438,6 @@ msgstr "コンテンツタイプ" msgid "Permissions" msgstr "権限" -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 -msgid "Scope" -msgstr "スコープ" - #: rbac/models/role.py:46 rbac/models/rolebinding.py:52 #: users/models/user/__init__.py:66 msgid "Role" @@ -5289,8 +5463,7 @@ msgstr "全ての組織" msgid "" "User last role in org, can not be delete, you can remove user from org " "instead" -msgstr "" -"ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" +msgstr "ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" #: rbac/models/rolebinding.py:200 msgid "Organization role binding" @@ -5418,12 +5591,10 @@ msgstr "{}に送信されたテストメールを確認してください" msgid "Test smtp setting" msgstr "SMTP設定のテスト" -#: settings/api/ldap.py:90 +#: settings/api/ldap.py:92 msgid "" "Users are not synchronized, please click the user synchronization button" -msgstr "" -"ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてくださ" -"い。" +msgstr "ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてください。" #: settings/api/sms.py:142 msgid "Invalid SMS platform" @@ -5518,102 +5689,101 @@ msgid "LDAP Auth" msgstr "LDAP 認証" #: settings/serializers/auth/base.py:14 +msgid "LDAP Auth HA" +msgstr "LDAP HA 認証" + +#: settings/serializers/auth/base.py:15 msgid "CAS Auth" msgstr "CAS 認証" -#: settings/serializers/auth/base.py:15 +#: settings/serializers/auth/base.py:16 msgid "OPENID Auth" msgstr "OPENID 認証" -#: settings/serializers/auth/base.py:16 +#: settings/serializers/auth/base.py:17 msgid "SAML2 Auth" msgstr "SAML2 認証" -#: settings/serializers/auth/base.py:17 +#: settings/serializers/auth/base.py:18 msgid "OAuth2 Auth" msgstr "OAuth2 認証" -#: settings/serializers/auth/base.py:18 +#: settings/serializers/auth/base.py:19 msgid "RADIUS Auth" msgstr "RADIUS 認証" -#: settings/serializers/auth/base.py:19 +#: settings/serializers/auth/base.py:20 msgid "DingTalk Auth" msgstr "くぎ 認証" -#: settings/serializers/auth/base.py:20 +#: settings/serializers/auth/base.py:21 msgid "FeiShu Auth" msgstr "飛本 認証" -#: settings/serializers/auth/base.py:21 +#: settings/serializers/auth/base.py:22 msgid "Lark Auth" msgstr "Lark 認証" -#: settings/serializers/auth/base.py:22 +#: settings/serializers/auth/base.py:23 msgid "Slack Auth" msgstr "Slack 認証" -#: settings/serializers/auth/base.py:23 +#: settings/serializers/auth/base.py:24 msgid "WeCom Auth" msgstr "企業微信 認証" -#: settings/serializers/auth/base.py:24 +#: settings/serializers/auth/base.py:25 msgid "SSO Auth" msgstr "SSO Token 認証" -#: settings/serializers/auth/base.py:25 +#: settings/serializers/auth/base.py:26 msgid "Passkey Auth" msgstr "Passkey 認証" -#: settings/serializers/auth/base.py:27 +#: settings/serializers/auth/base.py:28 msgid "Email suffix" msgstr "メールのサフィックス" -#: settings/serializers/auth/base.py:29 +#: settings/serializers/auth/base.py:30 msgid "" "After third-party user authentication is successful, if the third-party " "authentication service platform does not return the user's email " "information, the system will automatically create the user using this email " "suffix" msgstr "" -"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユー" -"ザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィック" -"スでユーザーを作成します" +"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユーザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィックスでユーザーを作成します" -#: settings/serializers/auth/base.py:36 +#: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" msgstr "パスワードを忘れた場合のリンク" -#: settings/serializers/auth/base.py:37 +#: settings/serializers/auth/base.py:38 msgid "The URL for Forgotten Password on the user login page" msgstr "ユーザーログイン画面のパスワードを忘れた URL" -#: settings/serializers/auth/base.py:40 +#: settings/serializers/auth/base.py:41 msgid "Login redirection" msgstr "ログインリダイレクトの有効化msg" -#: settings/serializers/auth/base.py:42 +#: settings/serializers/auth/base.py:43 msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "" -"管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証" -"にリダイレクトされる前に Flash ページを表示するかどうか" +msgstr "管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証にリダイレクトされる前に Flash ページを表示するかどうか" -#: settings/serializers/auth/base.py:54 +#: settings/serializers/auth/base.py:55 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "" -"ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザー" -"は常にデフォルト組織に属します。" +msgstr "ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザーは常にデフォルト組織に属します。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 +#: settings/serializers/auth/ldap_ha.py:26 #: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "LDAPサーバー" @@ -5639,11 +5809,14 @@ msgstr "ユーザー名のプロパティ" msgid "Enable attributes map" msgstr "属性マップの有効化" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 -#: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 -#: settings/serializers/auth/slack.py:18 settings/serializers/auth/wecom.py:18 +#: settings/serializers/auth/ldap.py:66 +#: settings/serializers/auth/ldap_ha.py:48 +#: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 +#: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 +#: settings/serializers/auth/wecom.py:18 msgid "User attribute" msgstr "マッピングのプロパティ" @@ -5652,8 +5825,7 @@ msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、" -"`value` は JumpServer のユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、`value` は JumpServer のユーザー属性名です" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -5663,9 +5835,7 @@ msgstr "そうでない場合はユーザーを作成" msgid "" "After successful user authentication, if the user does not exist, " "automatically create the user" -msgstr "" -"ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成さ" -"れます" +msgstr "ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成されます" #: settings/serializers/auth/dingtalk.py:16 msgid "Dingtalk" @@ -5676,18 +5846,17 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は ディントーク サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は ディントーク " +"サービスのユーザー属性名です" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は フェイシュ サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は フェイシュ サービスのユーザー属性名です" -#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:21 +#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22 msgid "Lark" msgstr "" @@ -5696,8 +5865,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は Lark サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Lark サービスのユーザー属性名です" #: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" @@ -5708,50 +5876,58 @@ msgid "LDAP server URI" msgstr "FIDOサーバーID" #: settings/serializers/auth/ldap.py:48 +#: settings/serializers/auth/ldap_ha.py:30 msgid "Bind DN" msgstr "DN のバインド" #: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap_ha.py:31 msgid "Binding Distinguished Name" msgstr "バインドディレクトリ管理者" #: settings/serializers/auth/ldap.py:53 +#: settings/serializers/auth/ldap_ha.py:35 msgid "Binding password" msgstr "古いパスワード" #: settings/serializers/auth/ldap.py:56 +#: settings/serializers/auth/ldap_ha.py:38 msgid "Search OU" msgstr "システムアーキテクチャ" #: settings/serializers/auth/ldap.py:58 +#: settings/serializers/auth/ldap_ha.py:40 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" -msgstr "" -"ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" +msgstr "ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" #: settings/serializers/auth/ldap.py:62 +#: settings/serializers/auth/ldap_ha.py:44 msgid "Search filter" msgstr "ユーザー検索フィルター" #: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap_ha.py:45 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "選択は (cnまたはuidまたはsAMAccountName)=%(user)s)" #: settings/serializers/auth/ldap.py:68 +#: settings/serializers/auth/ldap_ha.py:50 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は LDAP サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は LDAP サービスのユーザー属性名です" #: settings/serializers/auth/ldap.py:84 +#: settings/serializers/auth/ldap_ha.py:66 msgid "Connect timeout (s)" msgstr "接続タイムアウト (秒)" #: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap_ha.py:71 msgid "User DN cache timeout (s)" msgstr "User DN キャッシュの有効期限 (秒)" @@ -5762,14 +5938,33 @@ msgid "" "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証" -"の速度を効果的に改善できます。
ユーザーの OU 構造が調整された場合は、提出" -"をクリックしてユーザーの DN キャッシュをクリアできます。" +"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証の速度を効果的に改善できます。
ユーザーの OU " +"構造が調整された場合は、提出をクリックしてユーザーの DN キャッシュをクリアできます。" #: settings/serializers/auth/ldap.py:97 +#: settings/serializers/auth/ldap_ha.py:79 msgid "Search paged size (piece)" msgstr "ページサイズを検索 (じょう)" +#: settings/serializers/auth/ldap_ha.py:23 +#: settings/serializers/auth/ldap_ha.py:85 +msgid "LDAP HA" +msgstr "LDAP 認証" + +#: settings/serializers/auth/ldap_ha.py:27 +msgid "LDAP HA server URI" +msgstr "LDAP HA サービスドメイン名" + +#: settings/serializers/auth/ldap_ha.py:73 +msgid "" +"Caching the User DN obtained during user login authentication can " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " +"cache" +msgstr "" +"ユーザーがログイン認証時にクエリされた User DN をキャッシュすることで、ユーザー認証の速度を効果的に向上させることができます
ユーザーの " +"OU 構造が調整された場合は、送信をクリックして User DN のキャッシュをクリアできます" + #: settings/serializers/auth/oauth2.py:19 #: settings/serializers/auth/oauth2.py:22 msgid "OAuth2" @@ -5815,7 +6010,8 @@ msgid "End session endpoint" msgstr "プロバイダーのセッション終了エンドポイント" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "ユーザーがログアウトすると、OAuth2 サーバからもログアウトします" #: settings/serializers/auth/oauth2.py:62 @@ -5823,11 +6019,11 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は OAuth2 サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OAuth2 " +"サービスのユーザー属性名です" -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "常にユーザーを更新" @@ -5860,8 +6056,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は OIDC サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OIDC サービスのユーザー属性名です" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -5879,9 +6074,7 @@ msgstr "Keycloakを使用する" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "" -"Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プ" -"ロトコルを使用する" +msgstr "Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プロトコルを使用する" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -5940,9 +6133,7 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストと" -"DOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切り" -"ます" +"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストとDOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切ります" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -5958,10 +6149,9 @@ msgid "OTP in RADIUS" msgstr "Radius のOTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" -msgstr "" -"* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用す" -"ることができる" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgstr "* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用することができる" #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 msgid "SAML2" @@ -5991,9 +6181,7 @@ msgstr "SP 証明書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -"ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`は" -"JumpServerのユーザー属性名)" +msgstr "ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`はJumpServerのユーザー属性名)" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -6004,8 +6192,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は Slack サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Slack サービスのユーザー属性名です" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -6070,13 +6257,11 @@ msgstr "ビジネス・タイプ(Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." msgstr "" -"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未" -"満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わない" -"でください。" +"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わないでください。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -6097,8 +6282,7 @@ msgstr "SSO Token認証の有効化" #: settings/serializers/auth/sso.py:17 msgid "Other service can using SSO token login to JumpServer without password" -msgstr "" -"他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" +msgstr "他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" #: settings/serializers/auth/sso.py:20 msgid "SSO auth key TTL" @@ -6114,8 +6298,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は エンタープライズ WeChat サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は エンタープライズ WeChat " +"サービスのユーザー属性名です" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -6123,11 +6307,9 @@ msgstr "サイトURL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" -msgstr "" -"サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常は" -"システムメール内のリンクに使用されます" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" +msgstr "サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常はシステムメール内のリンクに使用されます" #: settings/serializers/basic.py:18 msgid "User guide url" @@ -6152,9 +6334,7 @@ msgstr "ドキュメントリンク" #: settings/serializers/basic.py:27 msgid "" "Document URL refers to the address in the top navigation bar Help - Document" -msgstr "" -"ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ド" -"キュメント" +msgstr "ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ドキュメント" #: settings/serializers/basic.py:30 msgid "Support URL" @@ -6163,8 +6343,7 @@ msgstr "サポートリンク" #: settings/serializers/basic.py:31 msgid "" "Support URL refers to the address in the top navigation bar Help - Support" -msgstr "" -"サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" +msgstr "サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" #: settings/serializers/basic.py:44 msgid "Organization name already exists" @@ -6215,8 +6394,7 @@ msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." msgstr "" -"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (デー" -"タベースのバックアップに影響し、OSS などには影響しません)" +"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (データベースのバックアップに影響し、OSS などには影響しません)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -6260,9 +6438,8 @@ msgid "" "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、" -"所定の数を超える履歴アカウントを確認して削除します。 値が 999 以上の場合、履" -"歴アカウントの削除は実行されません。" +"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、所定の数を超える履歴アカウントを確認して削除します。 値が 999 " +"以上の場合、履歴アカウントの削除は実行されません。" #: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" @@ -6273,7 +6450,8 @@ msgid "GPT Base URL" msgstr "GPTアドレス" #: settings/serializers/feature.py:86 -msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" +msgid "" +"The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPTサービスの基本のURL。例えば:https://api.openai.com/v1" #: settings/serializers/feature.py:89 templates/_header_bar.html:96 @@ -6321,9 +6499,7 @@ msgstr "ユーザーの実行" #: settings/serializers/feature.py:124 msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" -msgstr "" -"ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行すること" -"を許可します" +msgstr "ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行することを許可します" #: settings/serializers/feature.py:128 msgid "Command blacklist" @@ -6349,9 +6525,7 @@ msgstr "仮想アプリケーション" msgid "" "Virtual applications, you can use the Linux operating system as an " "application server in remote applications." -msgstr "" -"仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレー" -"ティングシステムを使用できます。" +msgstr "仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレーティングシステムを使用できます。" #: settings/serializers/msg.py:24 msgid "SMTP" @@ -6363,9 +6537,7 @@ msgstr "" #: settings/serializers/msg.py:34 msgid "The user to be used for email server authentication" -msgstr "" -"メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアド" -"レスです" +msgstr "メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアドレスです" #: settings/serializers/msg.py:38 msgid "" @@ -6391,9 +6563,7 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどの" -"メール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用し" -"ます" +"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどのメール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用します" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -6403,9 +6573,7 @@ msgstr "TLSの使用" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "" -"SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的な" -"TLS接続を使用します、通常ポート587を使用します" +msgstr "SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的なTLS接続を使用します、通常ポート587を使用します" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -6413,11 +6581,9 @@ msgstr "件名プレフィックス" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" -msgstr "" -"ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを" -"正常に作成)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" +msgstr "ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを正常に作成)" #: settings/serializers/msg.py:73 msgid "Honorific" @@ -6425,17 +6591,14 @@ msgstr "ユーザー敬語の作成" #: settings/serializers/msg.py:74 msgid "Tips: When creating a user, send the honorific of the email (eg:Hello)" -msgstr "" -"ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" +msgstr "ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" #: settings/serializers/msg.py:80 #, python-brace-format msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "" -"ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}" -"{email}ラベルをサポートします。" +msgstr "ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}{email}ラベルをサポートします。" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -6452,9 +6615,7 @@ msgstr "グループ化されていないノードを表示" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" msgstr "" -"グループ化されていないノードに個別に許可された資産を配置し、資産が存在する" -"ノードが表示されないようにしますが、そのノードが許可されていないという質問に" -"質問" +"グループ化されていないノードに個別に許可された資産を配置し、資産が存在するノードが表示されないようにしますが、そのノードが許可されていないという質問に質問" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -6466,10 +6627,8 @@ msgid "" "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" msgstr "" -"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有" -"効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) 以内に、パスワー" -"ドの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信さ" -"れます。" +"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) " +"以内に、パスワードの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信されます。" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -6479,9 +6638,7 @@ msgstr "繰り返された履歴パスワードの数" msgid "" "Tip: When the user resets the password, it cannot be the previous n " "historical passwords of the user" -msgstr "" -"ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワード" -"にすることはできません" +msgstr "ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワードにすることはできません" #: settings/serializers/security.py:34 msgid "Minimum length (User)" @@ -6503,9 +6660,7 @@ msgstr "特別な" msgid "" "If the user has failed to log in for a limited number of times, no login is " "allowed during this time interval." -msgstr "" -"ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログイン" -"はできません。" +msgstr "ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログインはできません。" #: settings/serializers/security.py:63 settings/serializers/security.py:73 msgid "Login failures count" @@ -6531,9 +6686,7 @@ msgstr "単一デバイスログインのみ" msgid "" "After the user logs in on the new device, other logged-in devices will " "automatically log out" -msgstr "" -"ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動" -"的にログアウトします。" +msgstr "ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動的にログアウトします。" #: settings/serializers/security.py:95 msgid "Only exist user login" @@ -6546,9 +6699,8 @@ msgid "" "are allowed to log in and automatically create users (if the user does not " "exist)" msgstr "" -"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、" -"ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的" -"に作成されます (ユーザーが存在しない場合)。" +"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的に作成されます" +" (ユーザーが存在しない場合)。" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -6556,14 +6708,13 @@ msgstr "ソースログインからのみ" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効" -"な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべ" -"ての認証方法を特定の順序で認証します。 、直接ログインできます" +"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべての認証方法を特定の順序で認証します。" +" 、直接ログインできます" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -6614,8 +6765,7 @@ msgstr "ログインページのMFA" #: settings/serializers/security.py:144 msgid "Eu security regulations(GDPR) require MFA to be on the login page" -msgstr "" -"Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" +msgstr "Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" #: settings/serializers/security.py:148 msgid "Verify code TTL (second)" @@ -6633,9 +6783,7 @@ msgstr "ログイン動的コードの有効化" msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "" -"パスワードと追加コードは、検証のためにサードパーティの認証システムに送信され" -"ます" +msgstr "パスワードと追加コードは、検証のためにサードパーティの認証システムに送信されます" #: settings/serializers/security.py:158 msgid "Login captcha" @@ -6651,13 +6799,11 @@ msgstr "リモートログイン保護" #: settings/serializers/security.py:164 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" msgstr "" -"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断" -"します。アカウントが共通のログイン都市からログインしている場合、システムはリ" -"モートログインリマインダーを送信します" +"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断します。アカウントが共通のログイン都市からログインしている場合、システムはリモートログインリマインダーを送信します" #: settings/serializers/security.py:170 msgid "Auto Disable Threshold (day)" @@ -6667,9 +6813,7 @@ msgstr "未使用のユーザータイムアウト(日)" msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" -msgstr "" -"毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効に" -"します" +msgstr "毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効にします" #: settings/serializers/security.py:191 msgid "Watermark" @@ -6714,8 +6858,7 @@ msgstr "セッション共有" #: settings/serializers/security.py:213 msgid "Enabled, Allows user active session to be shared with other users" -msgstr "" -"ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" +msgstr "ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" #: settings/serializers/security.py:219 msgid "Insecure command alert" @@ -6744,30 +6887,24 @@ msgstr "ターミナルレジスタの有効化" #: settings/serializers/terminal.py:24 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" -msgstr "" -"ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティ" -"のためにこれを無効にする必要があります" +"Allow component register, after all component setup, you should disable this" +" for security" +msgstr "ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティのためにこれを無効にする必要があります" #: settings/serializers/terminal.py:30 msgid "" "* Allow users to log in to the KoKo component via password authentication" -msgstr "" -"* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可" -"する" +msgstr "* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可する" #: settings/serializers/terminal.py:36 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" -"* 公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第" -"三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバ" -"から削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべ" -"きです。" +"* " +"公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバから削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべきです。" #: settings/serializers/terminal.py:43 msgid "Asset sorting" @@ -6779,23 +6916,21 @@ msgstr "ページサイズを一覧表示" #: settings/serializers/terminal.py:51 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" -"
有効化した場合、Luna ページでは資産への接続時にDBクライアントの起動方法" -"を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna " +"ページでは資産への接続時にDBクライアントの起動方法を表示します。" #: settings/serializers/terminal.py:59 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" -"
有効化した場合、Luna ページでは資産への接続時にrdp ファイルのダウンロー" -"ドボタンとRDPクライアントの起動方法を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna ページでは資産への接続時にrdp " +"ファイルのダウンロードボタンとRDPクライアントの起動方法を表示します。" #: settings/serializers/terminal.py:66 msgid "Client connection" @@ -6804,11 +6939,11 @@ msgstr "クライアント接続" #: settings/serializers/terminal.py:68 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" +"Luna page will display the SSH client launch method when connecting to " +"assets" msgstr "" -"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効" -"化した場合、Luna ページでは資産への接続時にSSHクライアントの起動方法を表示し" -"ます。" +"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効化した場合、Luna " +"ページでは資産への接続時にSSHクライアントの起動方法を表示します。" #: settings/serializers/tool.py:10 msgid "Tool" @@ -6820,20 +6955,47 @@ msgstr "ワークベンチのツール" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" -msgstr "" -"* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにしま" -"す" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" +msgstr "* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにします" -#: settings/tasks/ldap.py:28 +#: settings/tasks/ldap.py:73 msgid "Periodic import ldap user" msgstr "LDAP ユーザーを定期的にインポートする" -#: settings/tasks/ldap.py:66 +#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +msgid "" +"When LDAP auto-sync is configured, this task will be invoked to synchronize " +"users" +msgstr "" +"LDAPの自動同期が設定されている場合、このActionを呼び出して利用者の同期を行います" + +#: settings/tasks/ldap.py:83 +msgid "Periodic import ldap ha user" +msgstr "LDAP HA ユーザーの定期インポート" + +#: settings/tasks/ldap.py:117 msgid "Registration periodic import ldap user task" msgstr "登録サイクルLDAPユーザータスクのインポート" +#: settings/tasks/ldap.py:119 +msgid "" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" +" will be re-registered or updated, and this task will be invoked" +msgstr "" +"LDAPの自動同期パラメーターが変更された場合、たとえばCrontabパラメーターが変更され、ldap同期Actionの再登録または更新が必要になった場合、そのActionはこのActionを呼び出します" + +#: settings/tasks/ldap.py:133 +msgid "Registration periodic import ldap ha user task" +msgstr "LDAP HA ユーザーの定期インポートタスクの登録" + +#: settings/tasks/ldap.py:135 +msgid "" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" +" will be re-registered or updated, and this task will be invoked" +msgstr "" +"LDAP HA自動同期パラメーターが変更された場合、Crontabパラメーターなど、ldap ha同期Actionを再登録または更新する際にはこのActionを呼び出します" + #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" msgstr "同期タスクが完了しました" @@ -6850,108 +7012,108 @@ msgstr "同期されたユーザー" msgid "No user synchronization required" msgstr "ユーザーの同期は必要ありません" -#: settings/utils/ldap.py:496 +#: settings/utils/ldap.py:509 msgid "ldap:// or ldaps:// protocol is used." msgstr "ldap:// または ldaps:// プロトコルが使用されます。" -#: settings/utils/ldap.py:507 +#: settings/utils/ldap.py:520 msgid "Host or port is disconnected: {}" msgstr "ホストまたはポートが切断されました: {}" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:522 msgid "The port is not the port of the LDAP service: {}" msgstr "ポートはLDAPサービスのポートではありません: {}" -#: settings/utils/ldap.py:511 +#: settings/utils/ldap.py:524 msgid "Please add certificate: {}" msgstr "証明書を追加してください: {}" -#: settings/utils/ldap.py:515 settings/utils/ldap.py:542 -#: settings/utils/ldap.py:572 settings/utils/ldap.py:600 +#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 +#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 msgid "Unknown error: {}" msgstr "不明なエラー: {}" -#: settings/utils/ldap.py:529 +#: settings/utils/ldap.py:542 msgid "Bind DN or Password incorrect" msgstr "DNまたはパスワードのバインドが正しくありません" -#: settings/utils/ldap.py:536 +#: settings/utils/ldap.py:549 msgid "Please enter Bind DN: {}" msgstr "バインドDN: {} を入力してください" -#: settings/utils/ldap.py:538 +#: settings/utils/ldap.py:551 msgid "Please enter Password: {}" msgstr "パスワードを入力してください: {}" -#: settings/utils/ldap.py:540 +#: settings/utils/ldap.py:553 msgid "Please enter correct Bind DN and Password: {}" msgstr "正しいバインドDNとパスワードを入力してください: {}" -#: settings/utils/ldap.py:558 +#: settings/utils/ldap.py:571 msgid "Invalid User OU or User search filter: {}" msgstr "無効なユーザー OU またはユーザー検索フィルター: {}" -#: settings/utils/ldap.py:589 +#: settings/utils/ldap.py:602 msgid "LDAP User attr map not include: {}" msgstr "LDAP ユーザーattrマップは含まれません: {}" -#: settings/utils/ldap.py:596 +#: settings/utils/ldap.py:609 msgid "LDAP User attr map is not dict" msgstr "LDAPユーザーattrマップはdictではありません" -#: settings/utils/ldap.py:615 +#: settings/utils/ldap.py:628 msgid "LDAP authentication is not enabled" msgstr "LDAP 認証が有効になっていない" -#: settings/utils/ldap.py:633 +#: settings/utils/ldap.py:646 msgid "Error (Invalid LDAP server): {}" msgstr "エラー (LDAPサーバーが無効): {}" -#: settings/utils/ldap.py:635 +#: settings/utils/ldap.py:648 msgid "Error (Invalid Bind DN): {}" msgstr "エラー (DNのバインドが無効): {}" -#: settings/utils/ldap.py:637 +#: settings/utils/ldap.py:650 msgid "Error (Invalid LDAP User attr map): {}" msgstr "エラー (LDAPユーザーattrマップが無効): {}" -#: settings/utils/ldap.py:639 +#: settings/utils/ldap.py:652 msgid "Error (Invalid User OU or User search filter): {}" msgstr "エラー (ユーザーOUまたはユーザー検索フィルターが無効): {}" -#: settings/utils/ldap.py:641 +#: settings/utils/ldap.py:654 msgid "Error (Not enabled LDAP authentication): {}" msgstr "エラー (LDAP認証が有効化されていません): {}" -#: settings/utils/ldap.py:643 +#: settings/utils/ldap.py:656 msgid "Error (Unknown): {}" msgstr "エラー (不明): {}" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:659 msgid "Succeed: Match {} users" msgstr "成功: {} 人のユーザーに一致" -#: settings/utils/ldap.py:679 +#: settings/utils/ldap.py:689 msgid "Authentication failed (configuration incorrect): {}" msgstr "認証に失敗しました (設定が正しくありません): {}" -#: settings/utils/ldap.py:683 +#: settings/utils/ldap.py:693 msgid "Authentication failed (username or password incorrect): {}" msgstr "認証に失敗しました (ユーザー名またはパスワードが正しくありません): {}" -#: settings/utils/ldap.py:685 +#: settings/utils/ldap.py:695 msgid "Authentication failed (Unknown): {}" msgstr "認証に失敗しました (不明): {}" -#: settings/utils/ldap.py:688 +#: settings/utils/ldap.py:698 msgid "Authentication success: {}" msgstr "認証成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:199 msgid "No LDAP user was found" msgstr "LDAPユーザーが取得されませんでした" -#: settings/ws.py:209 +#: settings/ws.py:205 msgid "Total {}, success {}, failure {}" msgstr "合計 {},成功 {},失敗 {}" @@ -6966,9 +7128,7 @@ msgstr "インポート" #: templates/_csv_import_modal.html:12 msgid "Download the imported template or use the exported CSV file format" -msgstr "" -"インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形" -"式を使用する" +msgstr "インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" #: templates/_csv_import_modal.html:13 msgid "Download the import template" @@ -6984,9 +7144,7 @@ msgstr "ファイルを選択してください" #: templates/_csv_update_modal.html:12 msgid "Download the update template or use the exported CSV file format" -msgstr "" -"更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用す" -"る" +msgstr "更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" #: templates/_csv_update_modal.html:13 msgid "Download the update template" @@ -7027,8 +7185,7 @@ msgid "" " " msgstr "" "\n" -" アカウントが期限切れになったので、管理者に連絡してくださ" -"い。 " +" アカウントが期限切れになったので、管理者に連絡してください。 " #: templates/_message.html:13 msgid "Your account will at" @@ -7042,13 +7199,11 @@ msgstr "期限切れです。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" パスワードが期限切れになりましたので、クリックしてください " -" リンク パスワードの更新\n" +" パスワードが期限切れになりましたので、クリックしてください リンク パスワードの更新\n" " " #: templates/_message.html:30 @@ -7059,39 +7214,33 @@ msgstr "あなたのパスワードは" #, python-format msgid "" "\n" -" please click this " -"link to update your password.\n" +" please click this link to update your password.\n" " " msgstr "" "\n" -" クリックしてください リンク パスワードの更新\n" +" クリックしてください リンク パスワードの更新\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" +" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" +" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -7123,9 +7272,8 @@ msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" msgstr "" -"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起す" -"るために使用されており、現在はRDP SSHクライアントのみをサポートしています。" -"「Telnetは将来的にサポートする" +"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起するために使用されており、現在はRDP " +"SSHクライアントのみをサポートしています。「Telnetは将来的にサポートする" #: templates/resource_download.html:35 msgid "Microsoft" @@ -7139,9 +7287,7 @@ msgstr "公式" msgid "" "macOS needs to download the client to connect RDP asset, which comes with " "Windows" -msgstr "" -"MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロード" -"する必要があります" +msgstr "MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロードする必要があります" #: templates/resource_download.html:45 msgid "Windows Remote application publisher tools" @@ -7151,9 +7297,7 @@ msgstr "Windowsリモートアプリケーション発行者ツール" msgid "" "OpenSSH is a program used to connect remote applications in the Windows " "Remote Application Publisher" -msgstr "" -"OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続する" -"プログラムです" +msgstr "OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続するプログラムです" #: templates/resource_download.html:53 msgid "Offline video player" @@ -7193,7 +7337,7 @@ msgstr "コマンドストア" msgid "Invalid" msgstr "無効" -#: terminal/api/component/storage.py:132 terminal/tasks.py:149 +#: terminal/api/component/storage.py:132 terminal/tasks.py:187 msgid "Test failure: {}" msgstr "テスト失敗: {}" @@ -7575,7 +7719,8 @@ msgstr "セッション再生をダウンロードできます" msgid "Account ID" msgstr "アカウント ID" -#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:37 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "ログイン元" @@ -7624,8 +7769,8 @@ msgstr "アクションパーミッション" msgid "Origin" msgstr "ソース" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:261 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:261 msgid "Session sharing" msgstr "セッション共有" @@ -7707,7 +7852,7 @@ msgstr "レベル" msgid "Command and replay storage" msgstr "コマンド及び録画記憶" -#: terminal/notifications.py:240 terminal/tasks.py:153 +#: terminal/notifications.py:240 terminal/tasks.py:191 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -7738,21 +7883,16 @@ msgstr "コア サービス アドレス" #: terminal/serializers/applet_host.py:40 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリー" -"ス マシンとコア サービスが同じネットワーク セグメント上にある場合は、イントラ" -"ネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト " -"URL を入力します。
例: https://172.16.10.110 または https://dev." -"jumpserver.com" +"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリース マシンとコア サービスが同じネットワーク " +"セグメント上にある場合は、イントラネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト URL を入力します。
例: " +"https://172.16.10.110 または https://dev.jumpserver.com" #: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -7794,9 +7934,7 @@ msgstr "最大切断時間(ミリ秒)" msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "" -"ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時" -"間を設定します(60000ミリ秒後にセッションをログオフ)。" +msgstr "ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時間を設定します(60000ミリ秒後にセッションをログオフ)。" #: terminal/serializers/applet_host.py:71 msgid "RDS Remote App Logoff Time Limit (ms)" @@ -7804,11 +7942,10 @@ msgstr "RDSリモートアプリケーションのログアウト時間制限( #: terminal/serializers/applet_host.py:73 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." msgstr "" -"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ" -"時間を設定します(0ミリ秒、セッションを即座にログオフ)。" +"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ時間を設定します(0ミリ秒、セッションを即座にログオフ)。" #: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 @@ -7817,17 +7954,13 @@ msgstr "ロードステータス" #: terminal/serializers/applet_host.py:96 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" -"これらのアカウントは、公開されたアプリケーションに接続するために使用されま" -"す。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専" -"用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公" -"開されています。アプリケーションが複数のオープンをサポートしていない場合、お" -"よび特別なものが使用されている場合、公開アカウントが使用されます。" +"これらのアカウントは、公開されたアプリケーションに接続するために使用されます。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公開されています。アプリケーションが複数のオープンをサポートしていない場合、および特別なものが使用されている場合、公開アカウントが使用されます。" #: terminal/serializers/applet_host.py:103 msgid "The number of public accounts created automatically" @@ -7839,9 +7972,8 @@ msgid "" "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項" -"目 CACHE_LOGIN_PASSWORD_ENABLED=true を設定してサービスを再起動して有効にして" -"ください。" +"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項目 CACHE_LOGIN_PASSWORD_ENABLED=true " +"を設定してサービスを再起動して有効にしてください。" #: terminal/serializers/applet_host.py:148 msgid "Install applets" @@ -7891,9 +8023,7 @@ msgstr "Oracle がリッスンするポート範囲" msgid "" "Oracle proxy server listen port is dynamic, Each additional Oracle database " "instance adds a port listener" -msgstr "" -"Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データ" -"ベースインスタンスはポートリスナーを追加します" +msgstr "Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データベースインスタンスはポートリスナーを追加します" #: terminal/serializers/endpoint.py:38 msgid "" @@ -7901,22 +8031,19 @@ msgid "" "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" msgstr "" -"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラ" -"ウザのアクセス アドレスが使用されます (デフォルトのエンドポイントではホストの" -"変更は許可されません)。" +"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラウザのアクセス アドレスが使用されます " +"(デフォルトのエンドポイントではホストの変更は許可されません)。" #: terminal/serializers/endpoint.py:64 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "このIP範囲内のアセットは、以下のエンドポイントを使用して接続されます" #: terminal/serializers/endpoint.py:65 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" -msgstr "" -"異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用" -"して実装します" +msgstr "異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用して実装します" #: terminal/serializers/endpoint.py:69 msgid "Asset IP" @@ -8013,8 +8140,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www." -"jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" +"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www.jumpserver.a.com:9100, " +"http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -8045,9 +8172,7 @@ msgid "" "set as the default storage, will make new Component use the current storage " "by default, without affecting existing Component" msgstr "" -"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレー" -"ジをデフォルトで使用するようになりますが、既存のコンポーネントには影響しませ" -"ん" +"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレージをデフォルトで使用するようになりますが、既存のコンポーネントには影響しません" #: terminal/serializers/task.py:9 msgid "Session id" @@ -8182,34 +8307,88 @@ msgstr "許可が期限切れです" msgid "storage is null" msgstr "ストレージが空です" -#: terminal/tasks.py:31 +#: terminal/tasks.py:32 msgid "Periodic delete terminal status" msgstr "端末の状態を定期的にクリーンアップする" -#: terminal/tasks.py:39 +#: terminal/tasks.py:43 msgid "Clean orphan session" msgstr "オフライン セッションをクリアする" -#: terminal/tasks.py:87 +#: terminal/tasks.py:45 +msgid "" +"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" +" minutes and mark these sessions as completed" +msgstr "" +"毎10分ごとに、3分間非活動状態の資産接続セッションを確認し、これらのセッションを完了とマークします" + +#: terminal/tasks.py:68 +msgid "Upload session replay to external storage" +msgstr "セッションの記録を外部ストレージにアップロードする" + +#: terminal/tasks.py:70 +msgid "" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" +" recordings will be uploaded to external storage" +msgstr "" +"SERVER_REPLAY_STORAGEが設定されている場合、ファイル管理を通じてアップロードされたファイルを外部ストレージに同期します" + +#: terminal/tasks.py:102 msgid "Run applet host deployment" msgstr "アプリケーション マシンの展開を実行する" -#: terminal/tasks.py:97 +#: terminal/tasks.py:105 +msgid "" +"When deploying from the remote application publisher details page, and the 'Deploy' \n" +" button is clicked, this task will be executed" +msgstr "" +"デプロイメントシステムの展開時に、このActionが実行されます" + +#: terminal/tasks.py:116 msgid "Install applet" msgstr "アプリをインストールする" -#: terminal/tasks.py:108 +#: terminal/tasks.py:119 +msgid "" +"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" +" application publisher details page, this task will be executed" +msgstr "" +"リモートアプリケーションの詳細-リモートアプリケーションの展開時に、このActionが実行されます" + +#: terminal/tasks.py:131 msgid "Uninstall applet" msgstr "アプリをアンインストールする" -#: terminal/tasks.py:119 +#: terminal/tasks.py:134 +msgid "" +"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" +" remote application publisher details page, this task will be executed" +msgstr "" +"リモートアプリケーションの詳細-リモートアプリケーションのアンインストール時に、このActionが実行されます" + +#: terminal/tasks.py:146 msgid "Generate applet host accounts" msgstr "リモートアプリケーション上のアカウントを収集する" -#: terminal/tasks.py:131 +#: terminal/tasks.py:149 +msgid "" +"When a remote publishing server is created and an account needs to be created \n" +" automatically, this task will be executed" +msgstr "" +"リモートパブリッシャーを作成した後、自動でアカウントを作成する必要がある場合、このActionが実行されます" + +#: terminal/tasks.py:163 msgid "Check command replay storage connectivity" msgstr "チェックコマンドと録画ストレージの接続性" +#: terminal/tasks.py:165 +msgid "" +"Check every day at midnight whether the external storage for commands and recordings \n" +" is accessible. If it is not accessible, send a notification to the recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" +msgstr "" +"毎日午前0時に、コマンドと映像の外部ストレージが接続可能かどうかを確認します。接続できない場合は、システム設定-通知設定-メッセージ訂閱-コマンドと映像ストレージ設定の受け取り人に送信します" + #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" msgstr "表示" @@ -8221,16 +8400,13 @@ msgid "" "administrator to open more ports." msgstr "" "利用可能なポートと一致しません。データベースの数が、データベース プロキシ " -"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開" -"くには、管理者に連絡してください。" +"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開くには、管理者に連絡してください。" #: terminal/utils/db_port_mapper.py:116 msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "" -"使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の" -"制限を確認して変更してください. " +"No ports can be used, check and modify the limit on the number of ports that" +" Magnus listens on in the configuration file." +msgstr "使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の制限を確認して変更してください. " #: terminal/utils/db_port_mapper.py:118 msgid "All available port count: {}, Already use port count: {}" @@ -8292,9 +8468,7 @@ msgstr "チケットはすでに閉じています" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "" -"チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: " -"{}" +msgstr "チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -8528,9 +8702,7 @@ msgstr "承認" #: tickets/views/approve.py:44 msgid "" "This ticket does not exist, the process has ended, or this link has expired" -msgstr "" -"このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効に" -"なっています" +msgstr "このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効になっています" #: tickets/views/approve.py:72 msgid "Click the button below to approve or reject" @@ -8646,8 +8818,7 @@ msgid "" "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" msgstr "" -"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入りま" -"す。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" +"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入ります。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" #: users/forms/profile.py:59 msgid "* Enable MFA to make the account more secure." @@ -8655,12 +8826,11 @@ msgstr "* アカウントをより安全にするためにMFAを有効にしま #: users/forms/profile.py:68 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" msgstr "" -"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報" -"を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" +"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" #: users/forms/profile.py:82 users/serializers/preference/lina.py:21 msgid "New password" @@ -8813,12 +8983,10 @@ msgstr "ターミナルテーマ名" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" -"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含" -"まれている場合、このパスワードで解読します。
例:アカウントのバックアップ" -"ファイル、アカウントのパスワード変更結果ファイル" +"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含まれている場合、このパスワードで解読します。
例:アカウントのバックアップファイル、アカウントのパスワード変更結果ファイル" #: users/serializers/preference/lina.py:39 users/serializers/profile.py:48 msgid "The newly set password is inconsistent" @@ -8866,9 +9034,7 @@ msgid "" "remote computer to fit the window size of the client computer when the " "window is resized." msgstr "" -"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコン" -"ピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように" -"拡大または縮小するかどうかを決定します。" +"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコンピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように拡大または縮小するかどうかを決定します。" # msgid "" # "Determines whether the client computer should scale the content on the " @@ -8920,10 +9086,9 @@ msgstr "システムの役割" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" -msgstr "" -"システムロールはシステムレベルのロールであり、すべての組織で有効になります" +"System roles are roles at the system level, and they will take effect across" +" all organizations" +msgstr "システムロールはシステムレベルのロールであり、すべての組織で有効になります" #: users/serializers/user.py:61 msgid "Org roles" @@ -8993,9 +9158,7 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。" -"セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザ" -"を制限することができます。" +"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザを制限することができます。" #: users/serializers/user.py:266 msgid "Superuser" @@ -9019,10 +9182,9 @@ msgstr "認証" #: users/serializers/user.py:426 msgid "" -"* For security, only a partial of users is displayed. You can search for more" -msgstr "" -"* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを" -"検索することができます" +"* For security, only a partial of users is displayed. You can search for " +"more" +msgstr "* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを検索することができます" #: users/serializers/user.py:461 msgid "name not unique" @@ -9031,37 +9193,78 @@ msgstr "名前が一意ではない" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." -msgstr "" -"管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザー" -"はユーザーリストにありません。管理者に連絡してください。" +" and the current user is not in the user list. Please contact the administrator." +msgstr "管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザーはユーザーリストにありません。管理者に連絡してください。" -#: users/signal_handlers.py:193 +#: users/signal_handlers.py:196 msgid "Clean up expired user sessions" msgstr "期限切れのユーザー・セッションのパージ" -#: users/tasks.py:25 +#: users/signal_handlers.py:198 +msgid "" +"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" +" the system cleans up inactive user devices" +msgstr "" +"webでログインすると、利用者のセッションのオンライン記録が生じます。毎日午前2時に、オンラインではない利用者デバイスをクリアします" + +#: users/tasks.py:26 msgid "Check password expired" msgstr "パスワードの有効期限が切れていることを確認する" -#: users/tasks.py:39 +#: users/tasks.py:28 +msgid "" +"Check every day at 10 AM whether the passwords of users in the system are expired, \n" +" and send a notification 5 days in advance" +msgstr "" +"毎日午前10時にチェックし、システム内の利用者のパスワードが期限切れになっているかどうかを確認し、5日前に通知を送ります" + +#: users/tasks.py:46 msgid "Periodic check password expired" msgstr "定期認証パスワードの有効期限" -#: users/tasks.py:53 +#: users/tasks.py:48 +msgid "" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" +" parameters of the task that checks if passwords have expired" +msgstr "" +"バージョンが進化するにつれて、新たなActionが追加されたり、Actionの名前、実行時間が変更されたりする可能性があります。そのため、システムが起動するときに、パスワードの期限切れを確認するActionのパラメータを登録または更新します" + +#: users/tasks.py:67 msgid "Check user expired" msgstr "ユーザーの有効期限が切れていることを確認する" -#: users/tasks.py:70 +#: users/tasks.py:69 +msgid "" +"Check every day at 10 AM whether the users in the system are expired, and send a \n" +" notification 5 days in advance" +msgstr "毎日午前10時に確認し、システム内のユーザーが期限切れになっているか確認し、5日前に通知を送信します" + +#: users/tasks.py:90 msgid "Periodic check user expired" msgstr "ユーザーの有効期限の定期的な検出" -#: users/tasks.py:84 +#: users/tasks.py:92 +msgid "" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" +" parameters of the task that checks if users have expired" +msgstr "" +"バージョンのイテレーションに伴い、新たなタスクが追加されたり、タスクの名称、実行時間が変更される可能性があるため、システム起動時に、登録または更新されたユーザーが期限切れのタスクのパラメータをチェックします" + +#: users/tasks.py:111 msgid "Check unused users" msgstr "未使用のユーザーのチェック" -#: users/tasks.py:123 +#: users/tasks.py:113 +msgid "" +"At 2 a.m. every day, according to the configuration in \"System Settings - Security - \n" +" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" +" have not been used for a long time will be disabled" +msgstr "" +"毎日午前2時、システム設定-セキュリティ設定-非アクティブユーザー自動無効化設定に基づき、長時間ログインしないユーザーやapi_keyを使用しないユーザーを無効にします" + +#: users/tasks.py:157 msgid "The user has not logged in recently and has been disabled." msgstr "ユーザーは最近ログインしておらず、無効になっています。" @@ -9073,8 +9276,7 @@ msgstr "アカウントの有効期限は" msgid "" "In order not to affect your normal work, please contact the administrator " "for confirmation." -msgstr "" -"通常の作業に影響を与えないように、確認のために管理者に連絡してください。" +msgstr "通常の作業に影響を与えないように、確認のために管理者に連絡してください。" #: users/templates/users/_msg_password_expire_reminder.html:7 msgid "Your password will expire in" @@ -9084,9 +9286,7 @@ msgstr "パスワードは" msgid "" "For your account security, please click on the link below to update your " "password in time" -msgstr "" -"アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間" -"内に更新してください" +msgstr "アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間内に更新してください" #: users/templates/users/_msg_password_expire_reminder.html:11 msgid "Click here update password" @@ -9094,8 +9294,7 @@ msgstr "ここをクリック更新パスワード" #: users/templates/users/_msg_password_expire_reminder.html:16 msgid "If your password has expired, please click the link below to" -msgstr "" -"パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" +msgstr "パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" #: users/templates/users/_msg_reset_mfa.html:7 msgid "Your MFA has been reset by site administrator" @@ -9195,11 +9394,9 @@ msgstr "ワンタイムパスワード認証子のバインド" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" -msgstr "" -"MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コード" -"でスキャンします。" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" +msgstr "MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コードでスキャンします。" #: users/templates/users/user_otp_enable_bind.html:22 #: users/templates/users/user_verify_mfa.html:27 @@ -9214,9 +9411,7 @@ msgstr "アプリのインストール" msgid "" "Download and install the MFA Authenticator application on your phone or " "applet of WeChat" -msgstr "" -"携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウン" -"ロードしてインストールします" +msgstr "携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウンロードしてインストールします" #: users/templates/users/user_otp_enable_install_app.html:18 msgid "Android downloads" @@ -9230,9 +9425,7 @@ msgstr "IPhoneのダウンロード" msgid "" "After installation, click the next step to enter the binding page (if " "installed, go to the next step directly)." -msgstr "" -"インストール後、次のステップをクリックしてバインディングページに入ります (イ" -"ンストールされている場合は、次のステップに直接進みます)。" +msgstr "インストール後、次のステップをクリックしてバインディングページに入ります (インストールされている場合は、次のステップに直接進みます)。" #: users/templates/users/user_password_verify.html:8 #: users/templates/users/user_password_verify.html:9 @@ -9247,8 +9440,7 @@ msgstr "認証" msgid "" "The account protection has been opened, please complete the following " "operations according to the prompts" -msgstr "" -"アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" +msgstr "アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" #: users/templates/users/user_verify_mfa.html:17 msgid "Open MFA Authenticator and enter the 6-bit dynamic code" @@ -9260,8 +9452,7 @@ msgstr "すでにバインド済み" #: users/views/profile/otp.py:107 msgid "MFA already bound, disable first, then bound" -msgstr "" -"MFAはすでにバインドされており、最初に無効にしてからバインドされています。" +msgstr "MFAはすでにバインドされており、最初に無効にしてからバインドされています。" #: users/views/profile/otp.py:134 msgid "OTP enable success" @@ -9289,11 +9480,9 @@ msgstr "パスワード無効" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" -msgstr "" -"ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが" -"許可され、パスワードの変更はサポートされていません: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" +msgstr "ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが許可され、パスワードの変更はサポートされていません: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 msgid "Token invalid or expired" @@ -9525,9 +9714,7 @@ msgstr "インスタンス \"%s\" の同期に失敗しました" msgid "" "The updated platform of asset \"%s\" is inconsistent with the original " "platform type. Skip platform and protocol updates" -msgstr "" -"更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プ" -"ラットフォームとプロトコルの更新をスキップ" +msgstr "更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プラットフォームとプロトコルの更新をスキップ" #: xpack/plugins/cloud/manager.py:392 #, python-format @@ -9564,7 +9751,7 @@ msgstr "アカウント \"%s\" の設定" msgid "Set protocols \"%s\"" msgstr "プロトコル \"%s\" の設定" -#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:30 +#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:31 msgid "Run sync instance task" msgstr "同期インスタンス タスクを実行する" @@ -9658,7 +9845,8 @@ msgstr "インスタンス" msgid "Sync instance detail" msgstr "同期インスタンスの詳細" -#: xpack/plugins/cloud/models.py:311 xpack/plugins/cloud/serializers/task.py:77 +#: xpack/plugins/cloud/models.py:311 +#: xpack/plugins/cloud/serializers/task.py:77 msgid "Rule relation" msgstr "条件関係" @@ -9714,7 +9902,8 @@ msgstr "ルール一致" msgid "Rule value" msgstr "ルール値" -#: xpack/plugins/cloud/models.py:381 xpack/plugins/cloud/serializers/task.py:80 +#: xpack/plugins/cloud/models.py:381 +#: xpack/plugins/cloud/serializers/task.py:80 msgid "Strategy rule" msgstr "戦略ルール" @@ -9730,7 +9919,8 @@ msgstr "アクション属性" msgid "Action value" msgstr "アクション値" -#: xpack/plugins/cloud/models.py:407 xpack/plugins/cloud/serializers/task.py:83 +#: xpack/plugins/cloud/models.py:407 +#: xpack/plugins/cloud/serializers/task.py:83 msgid "Strategy action" msgstr "戦略アクション" @@ -10008,9 +10198,8 @@ msgid "" "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." msgstr "" -"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが" -"実行されると、有効な IP アドレスのみが同期されます。
ポートが0の場合、す" -"べてのIPアドレスが有効です。" +"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが実行されると、有効な IP アドレスのみが同期されます。 " +"
ポートが0の場合、すべてのIPアドレスが有効です。" #: xpack/plugins/cloud/serializers/account_attrs.py:190 msgid "Hostname prefix" @@ -10040,10 +10229,25 @@ msgstr "実行回数" msgid "Instance count" msgstr "インスタンス数" -#: xpack/plugins/cloud/tasks.py:44 +#: xpack/plugins/cloud/tasks.py:33 +msgid "" +"Execute this task when manually or scheduled cloud synchronization tasks are" +" performed" +msgstr "" +"手動で、定時にクラウド同期タスクを実行する時にこのタスクを実行します" + +#: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" msgstr "同期インスタンス タスクの実行記録を定期的にクリアする" +#: xpack/plugins/cloud/tasks.py:52 +msgid "" +"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" +" records generated by cloud synchronization" +msgstr "" +"毎日、システム設定-タスクリスト-定期的なクリーニング設定-クラウド同期記録設定に基づき、クラウド同期によって生成された実行記録をクリーニングします。" + #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." msgstr "デフォルトの復元に成功しました。" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 6adb8eab2..1138d59e2 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-11 18:15+0800\n" +"POT-Creation-Date: 2024-09-13 17:38+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -209,7 +209,7 @@ msgid "Verify account" msgstr "验证账号" #: accounts/const/automation.py:27 accounts/tasks/remove_account.py:25 -#: accounts/tasks/remove_account.py:40 +#: accounts/tasks/remove_account.py:38 msgid "Remove account" msgstr "移除账号" @@ -311,7 +311,7 @@ msgid "Pending" msgstr "待定的" #: accounts/const/vault.py:8 assets/const/category.py:12 -#: assets/models/asset/database.py:9 assets/models/asset/database.py:24 +#: assets/models/asset/database.py:10 assets/models/asset/database.py:29 msgid "Database" msgstr "数据库" @@ -471,7 +471,7 @@ msgstr "开始日期" #: accounts/models/automations/backup_account.py:123 #: authentication/templates/authentication/_msg_oauth_bind.html:11 -#: notifications/notifications.py:202 +#: notifications/notifications.py:199 #: settings/templates/ldap/_msg_import_ldap_user.html:3 msgid "Time" msgstr "时间" @@ -1130,41 +1130,32 @@ msgstr "账号执行自动化" #: accounts/tasks/automation.py:35 msgid "" -"\n" -" Unified execution entry for account automation tasks: when the " -"system performs tasks \n" +"Unified execution entry for account automation tasks: when the system " +"performs tasks \n" " such as account push, password change, account verification, account " "collection, \n" " and gateway account verification, all tasks are executed through " -"this unified entry\n" -" " +"this unified entry" msgstr "" -"\n" "账号自动化任务统一执行入口,当系统执行账号推送,更改密码,验证账号,收集账" "号,验证网关账号任务时,统一通过当前任务执行" -#: accounts/tasks/automation.py:66 accounts/tasks/automation.py:76 +#: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72 msgid "Execute automation record" msgstr "自动化执行记录" -#: accounts/tasks/automation.py:69 -msgid "" -"\n" -" When manually executing password change records, this task is used\n" -" " -msgstr "" -"\n" -"当手动执行改密记录时,通过该任务执行" +#: accounts/tasks/automation.py:67 +msgid "When manually executing password change records, this task is used" +msgstr "当手动执行改密记录时,通过该任务执行" -#: accounts/tasks/automation.py:100 +#: accounts/tasks/automation.py:96 msgid "Clean change secret and push record period" msgstr "周期清理改密记录和推送记录" -#: accounts/tasks/automation.py:102 +#: accounts/tasks/automation.py:98 msgid "" -"\n" -" The system will periodically clean up unnecessary password change " -"and push records, \n" +"The system will periodically clean up unnecessary password change and push " +"records, \n" " including their associated change tasks, execution logs, assets, and " "accounts. When any \n" " of these associated items are deleted, the corresponding password " @@ -1177,10 +1168,8 @@ msgid "" "This periodic cleanup \n" " mechanism helps free up storage space and enhances the security and " "overall performance \n" -" of data management\n" -" " +" of data management" msgstr "" -"\n" "系统会定期清理不再需要的改密记录和推送记录,包括那些关联的改密任务、执行记" "录、资产和账号。当这些关联项中的任意一个被删除时,对应的改密和推送记录将变为" "无效。因此,为了保持数据库的整洁和高效运行,根据系统配置文件 config.txt 中 " @@ -1192,14 +1181,8 @@ msgid "Execute account backup plan" msgstr "执行账号备份计划" #: accounts/tasks/backup_account.py:29 -msgid "" -"\n" -" When performing scheduled or manual account backups, this task is " -"used\n" -" " -msgstr "" -"\n" -"定时或手动执行账号备份时,通过该任务执行" +msgid "When performing scheduled or manual account backups, this task is used" +msgstr "定时或手动执行账号备份时,通过该任务执行" #: accounts/tasks/gather_accounts.py:32 assets/tasks/automation.py:27 #: orgs/tasks.py:11 terminal/tasks.py:33 @@ -1210,52 +1193,41 @@ msgstr "未使用" msgid "Gather assets accounts" msgstr "收集资产上的账号" -#: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:29 +#: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:27 msgid "Push accounts to assets" msgstr "推送账号到资产" #: accounts/tasks/push_account.py:19 msgid "" -"\n" -" When creating or modifying an account requires account push, this " -"task is executed\n" -" " -msgstr "" -"\n" -"当创建账号,修改账号时,需要账号推送时执行该任务" +"When creating or modifying an account requires account push, this task is " +"executed" +msgstr "当创建账号,修改账号时,需要账号推送时执行该任务" #: accounts/tasks/remove_account.py:28 msgid "" -"\n" -" When clicking \"Sync deletion\" in 'Console - Gather Account - " -"Gathered accounts' this \n" -" task will be executed\n" -" " -msgstr "" -"\n" -"当在控制台-自动化-账号收集-收集的账号-点击同步删除会执行该任务" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " +"accounts' this \n" +" task will be executed" +msgstr "当在控制台-自动化-账号收集-收集的账号-点击同步删除会执行该任务" -#: accounts/tasks/remove_account.py:52 +#: accounts/tasks/remove_account.py:50 msgid "Clean historical accounts" msgstr "清理历史账号" -#: accounts/tasks/remove_account.py:54 +#: accounts/tasks/remove_account.py:52 msgid "" -"\n" -" Each time an asset account is updated, a historical account is " -"generated, so it is \n" +"Each time an asset account is updated, a historical account is generated, so " +"it is \n" " necessary to clean up the asset account history. The system will " "clean up excess account \n" " records at 2 a.m. daily based on the configuration in the \"System " "settings - Features - \n" -" Account storage - Record limit\n" -" " +" Account storage - Record limit" msgstr "" -"\n" "由于每次更新资产账号,都会生成历史账号,所以需要清理资产账号的历史。系统会根" "据账号存储-记录限制的配置,每天凌晨2点对于超出的数量的账号记录进行清理" -#: accounts/tasks/remove_account.py:93 +#: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." msgstr "删除超出范围的历史帐户。" @@ -1265,14 +1237,10 @@ msgstr "同步信息到关联的账号" #: accounts/tasks/template.py:14 msgid "" -"\n" -" When clicking 'Sync new secret to accounts' in 'Console - Account - " +"When clicking 'Sync new secret to accounts' in 'Console - Account - " "Templates - \n" -" Accounts' this task will be executed\n" -" " -msgstr "" -"\n" -"当在控制台-账号模板-账号-同步更新账号信息点击同步时,执行该任务" +" Accounts' this task will be executed" +msgstr "当在控制台-账号模板-账号-同步更新账号信息点击同步时,执行该任务" #: accounts/tasks/vault.py:32 msgid "Sync secret to vault" @@ -1280,14 +1248,9 @@ msgstr "同步密文到 vault" #: accounts/tasks/vault.py:34 msgid "" -"\n" -" When clicking 'Sync' in 'System Settings - Features - Account " -"Storage' this task will \n" -" be executed\n" -" " -msgstr "" -"\n" -"在系统设置-功能设置-账号存储点击同步时,执行该任务" +"When clicking 'Sync' in 'System Settings - Features - Account Storage' this " +"task will be executed" +msgstr "在系统设置-功能设置-账号存储点击同步时,执行该任务" #: accounts/tasks/verify_account.py:50 msgid "Verify asset account availability" @@ -1295,15 +1258,11 @@ msgstr "验证资产账号可用性" #: accounts/tasks/verify_account.py:53 msgid "" -"\n" -" When clicking 'Test' in 'Console - Asset details - Accounts' this " -"task will be executed\n" -" " -msgstr "" -"\n" -"当在控制台-资产详情-账号点击测试执行该任务" +"When clicking 'Test' in 'Console - Asset details - Accounts' this task will " +"be executed" +msgstr "当在控制台-资产详情-账号点击测试执行该任务" -#: accounts/tasks/verify_account.py:61 +#: accounts/tasks/verify_account.py:59 msgid "Verify accounts connectivity" msgstr "测试账号可连接性" @@ -1638,32 +1597,32 @@ msgstr "同级别节点名字不能重复" msgid "App Assets" msgstr "资产管理" -#: assets/automations/base/manager.py:187 +#: assets/automations/base/manager.py:188 msgid "{} disabled" msgstr "{} 已禁用" -#: assets/automations/base/manager.py:250 +#: assets/automations/base/manager.py:251 msgid " - Platform {} ansible disabled" msgstr " - 平台 {} Ansible 已禁用, 无法执行任务" -#: assets/automations/base/manager.py:323 +#: assets/automations/base/manager.py:324 msgid ">>> Task preparation phase" msgstr ">>> 任务准备阶段" -#: assets/automations/base/manager.py:326 +#: assets/automations/base/manager.py:327 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> 分次执行任务,总共 {runner_count}" -#: assets/automations/base/manager.py:328 +#: assets/automations/base/manager.py:329 msgid ">>> Start executing tasks" msgstr ">>> 开始执行任务" -#: assets/automations/base/manager.py:330 +#: assets/automations/base/manager.py:331 msgid ">>> No tasks need to be executed" msgstr ">>> 没有需要执行的任务" -#: assets/automations/base/manager.py:335 +#: assets/automations/base/manager.py:336 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> 开始执行第 {index} 批任务" @@ -1883,7 +1842,7 @@ msgstr "成功提示" msgid "We will consider login success when we see this prompt" msgstr "当我们看到这个提示时,我们将认为登录成功" -#: assets/const/protocol.py:145 assets/models/asset/database.py:10 +#: assets/const/protocol.py:145 assets/models/asset/database.py:11 #: settings/serializers/msg.py:49 msgid "Use SSL" msgstr "使用 SSL" @@ -2021,22 +1980,26 @@ msgstr "可以修改资产节点" msgid "Custom asset" msgstr "自定义资产" -#: assets/models/asset/database.py:11 +#: assets/models/asset/database.py:12 msgid "CA cert" msgstr "CA 证书" -#: assets/models/asset/database.py:12 +#: assets/models/asset/database.py:13 msgid "Client cert" msgstr "客户端证书" -#: assets/models/asset/database.py:13 +#: assets/models/asset/database.py:14 msgid "Client key" msgstr "客户端密钥" -#: assets/models/asset/database.py:14 +#: assets/models/asset/database.py:15 msgid "Allow invalid cert" msgstr "忽略证书校验" +#: assets/models/asset/database.py:18 +msgid "Postgresql SSL mode" +msgstr "PostgreSQL SSL 模式" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:92 msgid "Proxy" msgstr "代理" @@ -2399,6 +2362,21 @@ msgstr "无效的数据" msgid "Default database" msgstr "默认数据库" +#: assets/serializers/asset/database.py:23 +msgid "CA cert help text" +msgstr "" +"Common Name (CN) 字段已被弃用,请根据 RFC 5280 使用 Subject Alternative Name " +"(SAN) 字段来验证域名,以提高安全性。" + +#: assets/serializers/asset/database.py:24 +msgid "Postgresql ssl model help text" +msgstr "" +"Prefer:我不关心加密,但如果服务器支持加密,我愿意支付加密的开销。Require:我" +"希望我的数据被加密,我接受开销。我相信网络将确保我始终连接到我想要的服务器。" +"Verify CA:我希望我的数据被加密,我接受开销。我想确保我连接到我信任的服务器。" +"Verify Full:我希望我的数据被加密,我接受开销。我想确保我连接到我信任的服务" +"器,并且它是我指定的服务器。" + #: assets/serializers/asset/gpt.py:20 msgid "" "If the server cannot directly connect to the API address, you need set up an " @@ -2601,7 +2579,7 @@ msgstr "类型 该字段是必填项。" msgid "Protocols is required" msgstr "协议是必填的" -#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:42 +#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:39 msgid "Test assets connectivity " msgstr "测试资产可连接性" @@ -2613,101 +2591,81 @@ msgstr "收集资产硬件信息" msgid "Asset execute automation" msgstr "资产执行自动化" -#: assets/tasks/gather_facts.py:22 assets/tasks/gather_facts.py:34 +#: assets/tasks/gather_facts.py:22 assets/tasks/gather_facts.py:32 msgid "Gather assets facts" msgstr "收集资产信息" #: assets/tasks/gather_facts.py:25 msgid "" -"\n" -" When clicking 'Refresh hardware info' in 'Console - Asset Details - " -"Basic' this task \n" -" will be executed\n" -" " -msgstr "" -"\n" -"当在控制台资产详情-基本设置点击更新硬件信息执行该任务" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " +"this task \n" +" will be executed" +msgstr "当在控制台资产详情-基本设置点击更新硬件信息执行该任务" -#: assets/tasks/gather_facts.py:46 +#: assets/tasks/gather_facts.py:44 msgid "Update assets hardware info: " msgstr "更新资产硬件信息" -#: assets/tasks/gather_facts.py:54 +#: assets/tasks/gather_facts.py:52 msgid "Update node asset hardware information: " msgstr "更新节点资产硬件信息: " -#: assets/tasks/nodes_amount.py:17 +#: assets/tasks/nodes_amount.py:16 msgid "Check the amount of assets under the node" msgstr "检查节点下资产数量" -#: assets/tasks/nodes_amount.py:19 +#: assets/tasks/nodes_amount.py:18 msgid "" -"\n" -" Manually verifying asset quantities updates the asset count for " -"nodes under the \n" +"Manually verifying asset quantities updates the asset count for nodes under " +"the \n" " current organization. This task will be called in the following two " "cases: when updating \n" -" nodes and when the number of nodes exceeds 100\n" -" " +" nodes and when the number of nodes exceeds 100" msgstr "" -"\n" "手动校对资产数量更新当前组织下的节点资产数量;更新节点,当节点数大于100这两种" "情况会调用该任务" -#: assets/tasks/nodes_amount.py:37 +#: assets/tasks/nodes_amount.py:34 msgid "" "The task of self-checking is already running and cannot be started repeatedly" msgstr "自检程序已经在运行,不能重复启动" -#: assets/tasks/nodes_amount.py:43 +#: assets/tasks/nodes_amount.py:40 msgid "Periodic check the amount of assets under the node" msgstr "周期性检查节点下资产数量" -#: assets/tasks/nodes_amount.py:45 +#: assets/tasks/nodes_amount.py:42 msgid "" -"\n" -" Schedule the check_node_assets_amount_task to periodically update " -"the asset count of \n" -" all nodes under all organizations\n" -" " +"Schedule the check_node_assets_amount_task to periodically update the asset " +"count of \n" +" all nodes under all organizations" msgstr "" -"\n" "定时调用check_node_assets_amount_task任务,更新所有组织下所有节点的资产数量" -#: assets/tasks/ping.py:20 assets/tasks/ping.py:33 +#: assets/tasks/ping.py:20 assets/tasks/ping.py:30 msgid "Test assets connectivity" msgstr "测试资产可连接性" #: assets/tasks/ping.py:24 msgid "" -"\n" -" When clicking 'Test Asset Connectivity' in 'Asset Details - Basic " -"Settings' this task \n" -" will be executed\n" -" " -msgstr "" -"\n" -"当资产详情-基本设置点击测试资产可连接性 执行该任务" +"When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' " +"this task will be executed" +msgstr "当资产详情-基本设置点击测试资产可连接性 执行该任务" -#: assets/tasks/ping.py:49 +#: assets/tasks/ping.py:46 msgid "Test if the assets under the node are connectable " msgstr "测试节点下资产是否可连接" -#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:32 -#: assets/tasks/ping_gateway.py:41 +#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:29 +#: assets/tasks/ping_gateway.py:38 msgid "Test gateways connectivity" msgstr "测试网关可连接性" #: assets/tasks/ping_gateway.py:23 msgid "" -"\n" -" When clicking 'Test Connection' in 'Domain Details - Gateway' this " -"task will be \n" -" executed\n" -" " -msgstr "" -"\n" -"当在网域详情-网关-测试连接时执行该任务" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " +"be executed" +msgstr "当在网域详情-网关-测试连接时执行该任务" #: assets/tasks/utils.py:16 msgid "Asset has been disabled, skipped: {}" @@ -3076,34 +3034,28 @@ msgstr "清理资产审计会话任务日志" #: audits/tasks.py:134 msgid "" -"\n" -" Since the system generates login logs, operation logs, file upload " -"logs, activity \n" +"Since the system generates login logs, operation logs, file upload logs, " +"activity \n" " logs, Celery execution logs, session recordings, command records, " "and password change \n" " logs, it will perform cleanup of records that exceed the time limit " "according to the \n" -" 'Tasks - Regular clean-up' in the system settings at 2 a.m daily\n" -" " +" 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" msgstr "" -"\n" "由于系统会产生登录日志,操作日志,文件上传日志,活动日志,celery执行日志,会" "话录像和命令记录,改密日志,所以系统会根据系统设置-任务列表-定期清理配置,对" "于超出时间的于每天凌晨2点进行清理" -#: audits/tasks.py:156 +#: audits/tasks.py:154 msgid "Upload FTP file to external storage" msgstr "上传 FTP 文件到外部存储" -#: audits/tasks.py:158 +#: audits/tasks.py:156 msgid "" -"\n" -" If SERVER_REPLAY_STORAGE is configured, files uploaded through file " +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " "management will be \n" -" synchronized to external storage\n" -" " +" synchronized to external storage" msgstr "" -"\n" "如果设置了SERVER_REPLAY_STORAGE,将通过文件管理上传的文件同步到外部存储" #: authentication/api/access_key.py:39 @@ -3746,20 +3698,15 @@ msgstr "IP 白名单" msgid "Is valid" msgstr "是否有效" -#: authentication/tasks.py:12 +#: authentication/tasks.py:13 msgid "Clean expired session" msgstr "清除过期会话" -#: authentication/tasks.py:14 +#: authentication/tasks.py:15 msgid "" -"\n" -" Since user logins create sessions, the system will clean up expired " -"sessions every 24 \n" -" hours\n" -" " -msgstr "" -"\n" -"由于用户登录系统会产生会话,系统会每24小时清理已经过期的会话" +"Since user logins create sessions, the system will clean up expired sessions " +"every 24 hours" +msgstr "由于用户登录系统会产生会话,系统会每24小时清理已经过期的会话" #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" @@ -4501,44 +4448,30 @@ msgid "Send email" msgstr "发件邮件" #: common/tasks.py:35 -msgid "" -"\n" -" This task will be executed when sending email notifications\n" -" " -msgstr "" -"\n" -"发送邮件消息时执行该任务" +msgid "This task will be executed when sending email notifications" +msgstr "发送邮件消息时执行该任务" -#: common/tasks.py:67 +#: common/tasks.py:65 msgid "Send email attachment" msgstr "发送邮件附件" -#: common/tasks.py:70 +#: common/tasks.py:68 msgid "" -"\n" -" When an account password is changed or an account backup generates " +"When an account password is changed or an account backup generates " "attachments, \n" " this task needs to be executed for sending emails and handling " -"attachments\n" -" " -msgstr "" -"\n" -"当账号改密,账号备份产生附件,需要对发送邮件及附件,执行该任务" +"attachments" +msgstr "当账号改密,账号备份产生附件,需要对发送邮件及附件,执行该任务" -#: common/tasks.py:98 +#: common/tasks.py:94 msgid "Upload account backup to external storage" msgstr "上传会话录像到外部存储" -#: common/tasks.py:100 +#: common/tasks.py:96 msgid "" -"\n" -" When performing an account backup, this task needs to be executed to " -"external storage \n" -" (SFTP)\n" -" " -msgstr "" -"\n" -"当执行账号备份,需要到外部存储(sftp),执行该任务" +"When performing an account backup, this task needs to be executed to " +"external storage (SFTP)" +msgstr "当执行账号备份,需要到外部存储(sftp),执行该任务" #: common/utils/ip/geoip/utils.py:26 msgid "Invalid ip" @@ -4559,14 +4492,10 @@ msgstr "发送短信验证码" #: common/utils/verify_code.py:19 msgid "" -"\n" -" When resetting a password, forgetting a password, or verifying MFA, " -"this task needs to \n" -" be executed to send SMS messages\n" -" " -msgstr "" -"\n" -"当重置密码,忘记密码,验证mfa时,需要发送短信时执行该任务" +"When resetting a password, forgetting a password, or verifying MFA, this " +"task needs to \n" +" be executed to send SMS messages" +msgstr "当重置密码,忘记密码,验证mfa时,需要发送短信时执行该任务" #: common/validators.py:16 msgid "Special char not allowed" @@ -4680,20 +4609,16 @@ msgstr "{} 订阅" msgid "System message" msgstr "系统信息" -#: notifications/notifications.py:47 +#: notifications/notifications.py:46 msgid "Publish the station message" msgstr "发布站内消息" -#: notifications/notifications.py:49 +#: notifications/notifications.py:48 msgid "" -"\n" -" This task needs to be executed for sending internal messages for " -"system alerts, \n" -" work orders, and other notifications\n" -" " -msgstr "" -"\n" -"系统一些告警,工单等需要发送站内信时执行该任务" +"This task needs to be executed for sending internal messages for system " +"alerts, \n" +" work orders, and other notifications" +msgstr "系统一些告警,工单等需要发送站内信时执行该任务" #: ops/ansible/inventory.py:116 ops/models/job.py:65 msgid "No account available" @@ -5101,118 +5026,92 @@ msgstr "任务 ID" msgid "You do not have permission for the current job." msgstr "你没有当前作业的权限。" -#: ops/tasks.py:52 +#: ops/tasks.py:51 msgid "Run ansible task" msgstr "运行 Ansible 任务" -#: ops/tasks.py:55 +#: ops/tasks.py:54 msgid "" -"\n" -" Execute scheduled adhoc and playbooks, periodically invoking the " -"task for execution\n" -" " -msgstr "" -"\n" -"当执行定时的快捷命令,playbook,定时调用该任务执行" +"Execute scheduled adhoc and playbooks, periodically invoking the task for " +"execution" +msgstr "当执行定时的快捷命令,playbook,定时调用该任务执行" -#: ops/tasks.py:85 +#: ops/tasks.py:82 msgid "Run ansible task execution" msgstr "开始执行 Ansible 任务" -#: ops/tasks.py:88 -msgid "" -"\n" -" Execute the task when manually adhoc or playbooks\n" -" " -msgstr "" -"\n" -"手动执行快捷命令,playbook时执行该任务" +#: ops/tasks.py:85 +msgid "Execute the task when manually adhoc or playbooks" +msgstr "手动执行快捷命令,playbook时执行该任务" -#: ops/tasks.py:104 +#: ops/tasks.py:99 msgid "Clear celery periodic tasks" msgstr "清理周期任务" -#: ops/tasks.py:106 -msgid "" -"\n" -" At system startup, clean up celery tasks that no longer exist\n" -" " -msgstr "" -"\n" -"系统启动时,清理已经不存在的celery任务" +#: ops/tasks.py:101 +msgid "At system startup, clean up celery tasks that no longer exist" +msgstr "系统启动时,清理已经不存在的celery任务" -#: ops/tasks.py:132 +#: ops/tasks.py:125 msgid "Create or update periodic tasks" msgstr "创建或更新周期任务" -#: ops/tasks.py:134 +#: ops/tasks.py:127 msgid "" -"\n" -" With version iterations, new tasks may be added, or task names and " -"execution times may \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" " be modified. Therefore, upon system startup, tasks will be " "registered or the parameters \n" -" of scheduled tasks will be updated\n" -" " +" of scheduled tasks will be updated" msgstr "" -"\n" "随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动" "时,,将会注册任务或者更新定时任务参数" -#: ops/tasks.py:149 +#: ops/tasks.py:140 msgid "Periodic check service performance" msgstr "周期检测服务性能" -#: ops/tasks.py:151 +#: ops/tasks.py:142 msgid "" -"\n" -" Check every hour whether each component is offline and whether the " -"CPU, memory, \n" +"Check every hour whether each component is offline and whether the CPU, " +"memory, \n" " and disk usage exceed the thresholds, and send an alert message to " -"the administrator\n" -" " +"the administrator" msgstr "" -"\n" "每小时检测各组件是否离线,cpu,内存,硬盘使用率是否超过阈值,向管理员发送消息" "预警" -#: ops/tasks.py:163 +#: ops/tasks.py:152 msgid "Clean up unexpected jobs" msgstr "清理异常作业" -#: ops/tasks.py:165 +#: ops/tasks.py:154 msgid "" -"\n" -" Due to exceptions caused by executing adhoc and playbooks in the Job " +"Due to exceptions caused by executing adhoc and playbooks in the Job " "Center, \n" " which result in the task status not being updated, the system will " "clean up abnormal jobs \n" " that have not been completed for more than 3 hours every hour and " "mark these tasks as \n" -" failed\n" -" " +" failed" msgstr "" -"\n" "由于作业中心执行快捷命令,playbook会产生异常,任务状态未更新完成,系统将每小" "时执行清理超3小时未完成的异常作业,并将任务标记失败" -#: ops/tasks.py:180 +#: ops/tasks.py:167 msgid "Clean job_execution db record" msgstr "清理作业中心执行历史" -#: ops/tasks.py:182 +#: ops/tasks.py:169 msgid "" -"\n" -" Due to the execution of adhoc and playbooks in the Job Center, " -"execution records will \n" +"Due to the execution of adhoc and playbooks in the Job Center, execution " +"records will \n" " be generated. The system will clean up records that exceed the " "retention period every day \n" " at 2 a.m., based on the configuration of 'System Settings - Tasks - " "Regular clean-up - \n" -" Job execution retention days'\n" -" " +" Job execution retention days'" msgstr "" -"\n" "由于作业中心执行快捷命令,playbook,会产生j执行记录,系统会根据系统设置-任务" "列表-定期清理-作业中心执行历史配置,每天凌晨2点对超出保存时间的记录进行清理" @@ -5468,39 +5367,33 @@ msgstr "校验资产授权规则已过期" #: perms/tasks.py:30 msgid "" -"\n" -" The cache of organizational collections, which have completed user " +"The cache of organizational collections, which have completed user " "authorization tree \n" " construction, will expire. Therefore, expired collections need to be " "cleared from the \n" " cache, and this task will be executed periodically based on the time " "interval specified \n" " by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " -"config.txt\n" -" " +"config.txt" msgstr "" -"\n" "用户授权树已经构建完成的组织集合缓存会过期,所以需要将过期的集合从缓存中清理" "掉,根据系统配置文件 config.txt 中 PERM_EXPIRED_CHECK_PERIODIC 的时间间隔定时" "执行该任务" -#: perms/tasks.py:51 +#: perms/tasks.py:49 msgid "Send asset permission expired notification" msgstr "发送资产权限过期通知" -#: perms/tasks.py:53 +#: perms/tasks.py:51 msgid "" -"\n" -" Check every day at 10 a.m. and send a notification message to users " +"Check every day at 10 a.m. and send a notification message to users " "associated with \n" " assets whose authorization is about to expire, as well as to the " "organization's \n" " administrators, 3 days in advance, to remind them that the asset " "authorization will \n" -" expire in a few days\n" -" " +" expire in a few days" msgstr "" -"\n" "每天上午10点检查,对资产授权即将过期的所关联的用户及该组织管理员提前三天发送" "消息通知,提示资产还有几天即将过期" @@ -7122,56 +7015,45 @@ msgid "" "in the workbench" msgstr "*! 如果启用,具有 RBAC 权限的用户将能够使用工作台中的所有工具" -#: settings/tasks/ldap.py:72 +#: settings/tasks/ldap.py:73 msgid "Periodic import ldap user" msgstr "周期导入 LDAP 用户" -#: settings/tasks/ldap.py:74 settings/tasks/ldap.py:86 +#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 msgid "" -"\n" -" When LDAP auto-sync is configured, this task will be invoked to " -"synchronize users\n" -" " -msgstr "" -"\n" -"当设置了LDAP自动同步,将调用该任务进行用户同步" - -#: settings/tasks/ldap.py:84 +"When LDAP auto-sync is configured, this task will be invoked to synchronize " +"users" +msgstr "当设置了LDAP自动同步,将调用该任务进行用户同步" +#: settings/tasks/ldap.py:83 msgid "Periodic import ldap ha user" msgstr "周期导入 LDAP HA 用户" -#: settings/tasks/ldap.py:120 +#: settings/tasks/ldap.py:117 msgid "Registration periodic import ldap user task" msgstr "注册周期导入 LDAP 用户 任务" -#: settings/tasks/ldap.py:122 +#: settings/tasks/ldap.py:119 msgid "" -"\n" -" When LDAP auto-sync parameters change, such as Crontab parameters, " -"the LDAP sync task \n" -" will be re-registered or updated, and this task will be invoked\n" -" " +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " +"sync task \n" +" will be re-registered or updated, and this task will be invoked" msgstr "" -"\n" "当设置了LDAP自动同步参数发生变化时,比如Crontab参数,重新注册或更新ldap同步任" "务将调用该任务" -#: settings/tasks/ldap.py:138 +#: settings/tasks/ldap.py:133 msgid "Registration periodic import ldap ha user task" msgstr "注册周期导入 LDAP HA 用户 任务" -#: settings/tasks/ldap.py:140 +#: settings/tasks/ldap.py:135 msgid "" -"\n" -" When LDAP HA auto-sync parameters change, such as Crontab " -"parameters, the LDAP HA sync task \n" -" will be re-registered or updated, and this task will be invoked\n" -" " +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " +"LDAP HA sync task \n" +" will be re-registered or updated, and this task will be invoked" msgstr "" -"\n" -"当设置了LDAP HA 自动同步参数发生变化时,比如Crontab参数,重新注册或更新ldap ha 同步任" -"务将调用该任务" +"当设置了LDAP HA 自动同步参数发生变化时,比如Crontab参数,重新注册或更新ldap " +"ha 同步任务将调用该任务" #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" @@ -7286,11 +7168,11 @@ msgstr "认证失败: (未知): {}" msgid "Authentication success: {}" msgstr "认证成功: {}" -#: settings/ws.py:201 +#: settings/ws.py:199 msgid "No LDAP user was found" msgstr "没有获取到 LDAP 用户" -#: settings/ws.py:207 +#: settings/ws.py:205 msgid "Total {}, success {}, failure {}" msgstr "总共 {},成功 {},失败 {}" @@ -7356,13 +7238,16 @@ msgid "Logout" msgstr "注销登录" #: templates/_message.html:6 +#, fuzzy +#| msgid "" +#| " Your account has expired, please contact the " +#| "administrator.\n" +#| " " msgid "" "\n" " Your account has expired, please contact the administrator.\n" " " -msgstr "" -"\n" -" 您的账号已经过期,请联系管理员。 " +msgstr " 您的账号已经过期,请联系管理员。 " #: templates/_message.html:13 msgid "Your account will at" @@ -7522,7 +7407,7 @@ msgstr "命令存储" msgid "Invalid" msgstr "无效" -#: terminal/api/component/storage.py:132 terminal/tasks.py:201 +#: terminal/api/component/storage.py:132 terminal/tasks.py:187 msgid "Test failure: {}" msgstr "测试失败: {}" @@ -8036,7 +7921,7 @@ msgstr "级别" msgid "Command and replay storage" msgstr "命令及录像存储" -#: terminal/notifications.py:240 terminal/tasks.py:205 +#: terminal/notifications.py:240 terminal/tasks.py:191 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -8512,107 +8397,80 @@ msgstr "清除离线会话" #: terminal/tasks.py:45 msgid "" -"\n" -" Check every 10 minutes for asset connection sessions that have been " -"inactive for 3 \n" -" minutes and mark these sessions as completed\n" -" " -msgstr "" -"\n" -"每10分钟检查3分钟未活跃的资产连接会话,将这些会话标记未已完成" +"Check every 10 minutes for asset connection sessions that have been inactive " +"for 3 \n" +" minutes and mark these sessions as completed" +msgstr "每10分钟检查3分钟未活跃的资产连接会话,将这些会话标记未已完成" -#: terminal/tasks.py:70 +#: terminal/tasks.py:68 msgid "Upload session replay to external storage" msgstr "上传会话录像到外部存储" -#: terminal/tasks.py:72 +#: terminal/tasks.py:70 msgid "" -"\n" -" If SERVER_REPLAY_STORAGE is configured in the config.txt, session " -"commands and \n" -" recordings will be uploaded to external storage\n" -" " +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " +"and \n" +" recordings will be uploaded to external storage" msgstr "" -"\n" "如果设置了SERVER_REPLAY_STORAGE,将通过文件管理上传的文件同步到外部存储" -#: terminal/tasks.py:106 +#: terminal/tasks.py:102 msgid "Run applet host deployment" msgstr "运行应用机部署" -#: terminal/tasks.py:109 +#: terminal/tasks.py:105 msgid "" -"\n" -" When deploying from the remote application publisher details page, " -"and the 'Deploy' \n" -" button is clicked, this task will be executed\n" -" " -msgstr "" -"\n" -"发布机部署,点击部署时,执行该任务" +"When deploying from the remote application publisher details page, and the " +"'Deploy' \n" +" button is clicked, this task will be executed" +msgstr "发布机部署,点击部署时,执行该任务" -#: terminal/tasks.py:122 +#: terminal/tasks.py:116 msgid "Install applet" msgstr "安装应用" -#: terminal/tasks.py:125 +#: terminal/tasks.py:119 msgid "" -"\n" -" When the 'Deploy' button is clicked in the 'Remote Application' " -"section of the remote \n" -" application publisher details page, this task will be executed\n" -" " -msgstr "" -"\n" -"当远程应用发布机详情-远程应用,点击部署时,执行该任务" +"When the 'Deploy' button is clicked in the 'Remote Application' section of " +"the remote \n" +" application publisher details page, this task will be executed" +msgstr "当远程应用发布机详情-远程应用,点击部署时,执行该任务" -#: terminal/tasks.py:139 +#: terminal/tasks.py:131 msgid "Uninstall applet" msgstr "卸载应用" -#: terminal/tasks.py:142 +#: terminal/tasks.py:134 msgid "" -"\n" -" When the 'Uninstall' button is clicked in the 'Remote Application' " -"section of the \n" -" remote application publisher details page, this task will be " -"executed\n" -" " -msgstr "" -"\n" -"当远程应用发布机详情-远程应用,点击卸载时,执行该任务" +"When the 'Uninstall' button is clicked in the 'Remote Application' section " +"of the \n" +" remote application publisher details page, this task will be executed" +msgstr "当远程应用发布机详情-远程应用,点击卸载时,执行该任务" -#: terminal/tasks.py:156 +#: terminal/tasks.py:146 msgid "Generate applet host accounts" msgstr "收集远程应用上的账号" -#: terminal/tasks.py:159 +#: terminal/tasks.py:149 msgid "" -"\n" -" When a remote publishing server is created and an account needs to " -"be created \n" -" automatically, this task will be executed\n" -" " -msgstr "" -"\n" -"当创建远程发布机后,需要自动创建账号时,执行该任务" +"When a remote publishing server is created and an account needs to be " +"created \n" +" automatically, this task will be executed" +msgstr "当创建远程发布机后,需要自动创建账号时,执行该任务" -#: terminal/tasks.py:175 +#: terminal/tasks.py:163 msgid "Check command replay storage connectivity" msgstr "检查命令及录像存储可连接性 " -#: terminal/tasks.py:177 +#: terminal/tasks.py:165 msgid "" -"\n" -" Check every day at midnight whether the external storage for " -"commands and recordings \n" +"Check every day at midnight whether the external storage for commands and " +"recordings \n" " is accessible. If it is not accessible, send a notification to the " "recipients specified \n" " in 'System Settings - Notifications - Subscription - Storage - " -"Connectivity'\n" -" " +"Connectivity'" msgstr "" -"\n" "每天凌晨0点检查命令及录像外部存储是否可连接,不可连接发送给:系统设置-通知设" "置-消息订阅-命令及录像存储设置的接收人" @@ -9424,19 +9282,16 @@ msgid "" msgstr "" "管理员已开启'仅允许已存在用户登录',当前用户不在用户列表中,请联系管理员。" -#: users/signal_handlers.py:194 +#: users/signal_handlers.py:196 msgid "Clean up expired user sessions" msgstr "清除过期的用户会话" -#: users/signal_handlers.py:196 +#: users/signal_handlers.py:198 msgid "" -"\n" -" After logging in via the web, a user session record is created. At 2 " -"a.m. every day, \n" -" the system cleans up inactive user devices\n" -" " +"After logging in via the web, a user session record is created. At 2 a.m. " +"every day, \n" +" the system cleans up inactive user devices" msgstr "" -"\n" "使用web登录后,会产生用户会话在线记录,每天凌晨2点,清理未在线的用户设备" #: users/tasks.py:26 @@ -9445,85 +9300,68 @@ msgstr "校验密码已过期" #: users/tasks.py:28 msgid "" -"\n" -" Check every day at 10 AM whether the passwords of users in the " -"system are expired, \n" -" and send a notification 5 days in advance\n" -" " -msgstr "" -"\n" -"每天上午10点检查,系统中用户的密码是否过期,提前5天发送通知" +"Check every day at 10 AM whether the passwords of users in the system are " +"expired, \n" +" and send a notification 5 days in advance" +msgstr "每天上午10点检查,系统中用户的密码是否过期,提前5天发送通知" -#: users/tasks.py:48 +#: users/tasks.py:46 msgid "Periodic check password expired" msgstr "周期校验密码过期" -#: users/tasks.py:50 +#: users/tasks.py:48 msgid "" -"\n" -" With version iterations, new tasks may be added, or task names and " -"execution times may \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" " be modified. Therefore, upon system startup, it is necessary to " "register or update the \n" -" parameters of the task that checks if passwords have expired\n" -" " +" parameters of the task that checks if passwords have expired" msgstr "" -"\n" "随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动时," "注册或者更新校验密码已过期任务的参数" -#: users/tasks.py:71 +#: users/tasks.py:67 msgid "Check user expired" msgstr "校验用户已过期" -#: users/tasks.py:73 +#: users/tasks.py:69 msgid "" -"\n" -" Check every day at 10 AM whether the users in the system are " -"expired, and send a \n" -" notification 5 days in advance\n" -" " -msgstr "" -"\n" -"每天上午10点检查,系统中的用户是否过期,提前5天发送通知" +"Check every day at 10 AM whether the users in the system are expired, and " +"send a \n" +" notification 5 days in advance" +msgstr "每天上午10点检查,系统中的用户是否过期,提前5天发送通知" -#: users/tasks.py:96 +#: users/tasks.py:90 msgid "Periodic check user expired" msgstr "周期检测用户过期" -#: users/tasks.py:98 +#: users/tasks.py:92 msgid "" -"\n" -" With version iterations, new tasks may be added, or task names and " -"execution times may \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" " be modified. Therefore, upon system startup, it is necessary to " "register or update the \n" -" parameters of the task that checks if users have expired\n" -" " +" parameters of the task that checks if users have expired" msgstr "" -"\n" "随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动时," "注册或者更新校验用户已过期任务的参数" -#: users/tasks.py:119 +#: users/tasks.py:111 msgid "Check unused users" msgstr "检查未使用的用户" -#: users/tasks.py:121 +#: users/tasks.py:113 msgid "" -"\n" -" At 2 a.m. every day, according to the configuration in \"System " -"Settings - Security - \n" +"At 2 a.m. every day, according to the configuration in \"System Settings - " +"Security - \n" " Auth security - Auto disable threshold\" users who have not logged " "in or whose API keys \n" -" have not been used for a long time will be disabled\n" -" " +" have not been used for a long time will be disabled" msgstr "" -"\n" "每天凌晨2点,根据系统配置-安全设置-不活跃用户自动禁用配置,对长时间不登录或" "api_key不使用的用户进行禁用" -#: users/tasks.py:167 +#: users/tasks.py:157 msgid "The user has not logged in recently and has been disabled." msgstr "该用户最近未登录,已被禁用。" @@ -10489,29 +10327,22 @@ msgstr "实例个数" #: xpack/plugins/cloud/tasks.py:33 msgid "" -"\n" -" Execute this task when manually or scheduled cloud synchronization " -"tasks are performed\n" -" " -msgstr "" -"\n" -"手动,定时执行云同步任务时执行该任务" +"Execute this task when manually or scheduled cloud synchronization tasks are " +"performed" +msgstr "手动,定时执行云同步任务时执行该任务" -#: xpack/plugins/cloud/tasks.py:52 +#: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" msgstr "定期清除同步实例任务执行记录" -#: xpack/plugins/cloud/tasks.py:54 +#: xpack/plugins/cloud/tasks.py:52 msgid "" -"\n" -" Every day, according to the configuration in \"System Settings - " -"Tasks - Regular \n" +"Every day, according to the configuration in \"System Settings - Tasks - " +"Regular \n" " clean-up - Cloud sync task history retention days\" the system will " "clean up the execution \n" -" records generated by cloud synchronization\n" -" " +" records generated by cloud synchronization" msgstr "" -"\n" "每天根据系统设置-任务列表-定期清理配置-云同步记录配置,对云同步产生的执行记录" "进行清理" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 36c3ac3dd..97191c5f9 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-09 16:05+0800\n" +"POT-Creation-Date: 2024-09-13 17:22+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -16,8 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.3\n" -"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://" -"zhconvert.org\n" +"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://zhconvert.org\n" #: accounts/api/automations/base.py:79 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" @@ -126,9 +125,10 @@ msgstr "成功: %s, 失敗: %s, 總數: %s" #: authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 -#: settings/serializers/msg.py:37 settings/serializers/terminal.py:28 -#: terminal/serializers/storage.py:123 terminal/serializers/storage.py:142 -#: users/forms/profile.py:21 users/serializers/user.py:144 +#: settings/serializers/auth/ldap_ha.py:34 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: terminal/serializers/storage.py:142 users/forms/profile.py:21 +#: users/serializers/user.py:144 #: users/templates/users/_msg_user_created.html:13 #: users/templates/users/user_password_verify.html:18 #: xpack/plugins/cloud/serializers/account_attrs.py:28 @@ -188,7 +188,8 @@ msgstr "收集" msgid "Template" msgstr "模板" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "跳過" @@ -209,8 +210,8 @@ msgstr "更改密碼" msgid "Verify account" msgstr "驗證帳號" -#: accounts/const/automation.py:27 accounts/tasks/remove_account.py:24 -#: accounts/tasks/remove_account.py:33 +#: accounts/const/automation.py:27 accounts/tasks/remove_account.py:25 +#: accounts/tasks/remove_account.py:38 msgid "Remove account" msgstr "移除帳號" @@ -312,7 +313,7 @@ msgid "Pending" msgstr "待定的" #: accounts/const/vault.py:8 assets/const/category.py:12 -#: assets/models/asset/database.py:9 assets/models/asset/database.py:24 +#: assets/models/asset/database.py:10 assets/models/asset/database.py:29 msgid "Database" msgstr "資料庫" @@ -391,8 +392,8 @@ msgstr "來源 ID" #: assets/serializers/gateway.py:33 audits/models.py:59 #: authentication/api/connection_token.py:411 ops/models/base.py:18 #: perms/models/asset_permission.py:75 settings/serializers/msg.py:33 -#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 -#: terminal/serializers/command.py:72 +#: terminal/backends/command/models.py:18 +#: terminal/models/session/session.py:34 terminal/serializers/command.py:72 #: terminal/templates/terminal/_msg_command_warning.html:8 #: terminal/templates/terminal/_msg_session_sharing.html:8 #: tickets/models/ticket/command_confirm.py:13 @@ -460,7 +461,7 @@ msgstr "帳號備份計劃" #: accounts/models/automations/backup_account.py:120 #: assets/models/automations/base.py:115 audits/models.py:65 -#: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:242 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:242 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:25 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -472,7 +473,7 @@ msgstr "開始日期" #: accounts/models/automations/backup_account.py:123 #: authentication/templates/authentication/_msg_oauth_bind.html:11 -#: notifications/notifications.py:194 +#: notifications/notifications.py:199 #: settings/templates/ldap/_msg_import_ldap_user.html:3 msgid "Time" msgstr "時間" @@ -551,7 +552,8 @@ msgstr "SSH 金鑰推送方式" #: accounts/models/automations/gather_account.py:58 #: accounts/serializers/account/backup.py:40 #: accounts/serializers/automations/change_secret.py:58 -#: settings/serializers/auth/ldap.py:100 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:100 +#: settings/serializers/auth/ldap_ha.py:82 settings/serializers/msg.py:45 msgid "Recipient" msgstr "收件人" @@ -573,7 +575,7 @@ msgstr "開始日期" #: accounts/models/automations/change_secret.py:42 #: assets/models/automations/base.py:116 ops/models/base.py:56 -#: ops/models/celery.py:89 ops/models/job.py:243 +#: ops/models/celery.py:90 ops/models/job.py:243 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "結束日期" @@ -635,7 +637,7 @@ msgid "Address login" msgstr "最後登入地址" #: accounts/models/automations/gather_account.py:44 -#: accounts/tasks/gather_accounts.py:29 +#: accounts/tasks/gather_accounts.py:30 msgid "Gather asset accounts" msgstr "收集帳號" @@ -709,15 +711,17 @@ msgstr "密碼規則" #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 #: authentication/serializers/connect_token_secret.py:169 labels/models.py:11 -#: ops/mixin.py:21 ops/models/adhoc.py:20 ops/models/celery.py:15 -#: ops/models/celery.py:80 ops/models/job.py:142 ops/models/playbook.py:28 +#: ops/mixin.py:28 ops/models/adhoc.py:19 ops/models/celery.py:15 +#: ops/models/celery.py:81 ops/models/job.py:142 ops/models/playbook.py:30 #: ops/serializers/job.py:18 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:85 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -792,8 +796,7 @@ msgstr "登錄資產時,帳號使用者名稱與使用者使用者名稱相同 msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "" -"連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" +msgstr "連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -810,9 +813,7 @@ msgid "" "{} - The account backup passage task has been completed: the encryption " "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" -msgstr "" -"{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中" -"設置文件加密密碼" +msgstr "{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中設置文件加密密碼" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -829,9 +830,7 @@ msgid "" "{} - The encryption change task has been completed: the encryption password " "has not been set - please go to personal information -> set encryption " "password in preferences" -msgstr "" -"{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密" -"碼" +msgstr "{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密碼" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -869,9 +868,9 @@ msgstr "類別" #: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: authentication/serializers/connect_token_secret.py:126 +#: ops/models/job.py:150 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -889,7 +888,7 @@ msgstr "資產不存在" msgid "Has secret" msgstr "已託管密碼" -#: accounts/serializers/account/account.py:272 ops/models/celery.py:83 +#: accounts/serializers/account/account.py:272 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" @@ -943,9 +942,10 @@ msgstr "ID" #: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 -#: audits/models.py:90 audits/models.py:172 audits/models.py:271 -#: audits/serializers.py:171 authentication/models/connection_token.py:32 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:54 audits/models.py:90 audits/models.py:172 +#: audits/models.py:271 audits/serializers.py:171 +#: authentication/models/connection_token.py:32 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 @@ -994,9 +994,7 @@ msgstr "密鑰密碼" msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." -msgstr "" -"提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 " -"username@domain" +msgstr "提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 username@domain" #: accounts/serializers/account/template.py:13 msgid "Password length" @@ -1039,11 +1037,11 @@ msgid "" msgstr "關聯平台,可配置推送參數,如果不關聯,將使用默認參數" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:26 -#: ops/models/job.py:158 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:40 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:25 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:25 ops/models/job.py:158 ops/models/playbook.py:33 +#: rbac/models/role.py:37 settings/models.py:40 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:332 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 @@ -1058,13 +1056,13 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號" -"密碼 > 登錄密碼 > 手動輸入
為了安全起見,請設置配置項 " -"CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" +"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號密碼 > 登錄密碼 > 手動輸入
" +"為了安全起見,請設置配置項 CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" #: accounts/serializers/automations/base.py:23 #: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172 -#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47 +#: assets/serializers/automations/base.py:21 +#: perms/serializers/permission.py:47 msgid "Nodes" msgstr "節點" @@ -1124,43 +1122,93 @@ msgstr "添加帳號: %s" msgid "Delete account: %s" msgstr "刪除帳號: %s" -#: accounts/tasks/automation.py:31 +#: accounts/tasks/automation.py:32 msgid "Account execute automation" msgstr "帳號執行自動化" -#: accounts/tasks/automation.py:57 accounts/tasks/automation.py:62 +#: accounts/tasks/automation.py:35 +msgid "" +"Unified execution entry for account automation tasks: when the system performs tasks \n" +" such as account push, password change, account verification, account collection, \n" +" and gateway account verification, all tasks are executed through this unified entry" +msgstr "帳號自動化任務統一執行入口,當系統執行帳號推送,更改密碼,驗證帳號,收集帳號,驗證網關帳號任務時,統一透過當前任務執行" + +#: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72 msgid "Execute automation record" msgstr "自動化執行記錄" -#: accounts/tasks/automation.py:86 +#: accounts/tasks/automation.py:67 +msgid "When manually executing password change records, this task is used" +msgstr "" +"當手動執行改密記錄時,透過該任務執行" + +#: accounts/tasks/automation.py:96 msgid "Clean change secret and push record period" msgstr "週期清理改密記錄和推送記錄" -#: accounts/tasks/automation.py:87 -msgid "Clean change secret and push record period description" +#: accounts/tasks/automation.py:98 +msgid "" +"The system will periodically clean up unnecessary password change and push records, \n" +" including their associated change tasks, execution logs, assets, and accounts. When any \n" +" of these associated items are deleted, the corresponding password change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and overall performance \n" +" of data management" msgstr "" -"系統會定期清理不必要的變更密文記錄和推播記錄,包括與變更任務、執行記錄、資" -"產、帳戶相關的記錄。當任何這些關聯項被刪除時,相應的變更秘密和推送記錄將變得" -"無效。因此,為了保持資料庫整潔、高效,系統預設每180天自動清理一次這些無效記" -"錄。這種定期清理過程有助於釋放儲存空間並提高資料管理的安全性和整體效能。" +"系統會定期清理不再需要的改密記錄和推送記錄,包括那些關聯的改密任務、執行記錄、資產和帳號。當這些關聯項中的任意一個被刪除時,對應的改密和推送記錄將變為無效。因此,為了保持資料庫的整潔和高效運行,根據系統配置文件 config.txt 中 PERM_EXPIRED_CHECK_PERIODIC 的時間間隔對於超出時間的於每天凌晨2點進行清理。這種定期清理機制不僅有助於釋放存儲空間,還能提高數據管理的安全和整體性能" -#: accounts/tasks/backup_account.py:25 +#: accounts/tasks/backup_account.py:26 msgid "Execute account backup plan" msgstr "執行帳號備份計劃" -#: accounts/tasks/gather_accounts.py:34 +#: accounts/tasks/backup_account.py:29 +msgid "When performing scheduled or manual account backups, this task is used" +msgstr "" +"定時或手動執行帳號備份時,透過該任務執行" + +#: accounts/tasks/gather_accounts.py:32 assets/tasks/automation.py:27 +#: orgs/tasks.py:11 terminal/tasks.py:33 +msgid "Unused" +msgstr "未使用" + +#: accounts/tasks/gather_accounts.py:36 msgid "Gather assets accounts" msgstr "收集資產上的帳號" -#: accounts/tasks/push_account.py:15 accounts/tasks/push_account.py:23 +#: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:27 msgid "Push accounts to assets" msgstr "推送帳號到資產" -#: accounts/tasks/remove_account.py:44 +#: accounts/tasks/push_account.py:19 +msgid "" +"When creating or modifying an account requires account push, this task is " +"executed" +msgstr "" +"當創建帳號,修改帳號時,需要帳號推送時執行該任務" + +#: accounts/tasks/remove_account.py:28 +msgid "" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" +" task will be executed" +msgstr "" +"當在控制台-自動化-帳號收集-收集的帳號-點擊同步刪除會執行該任務" + +#: accounts/tasks/remove_account.py:50 msgid "Clean historical accounts" msgstr "清理歷史帳號" -#: accounts/tasks/remove_account.py:76 +#: accounts/tasks/remove_account.py:52 +msgid "" +"Each time an asset account is updated, a historical account is generated, so it is \n" +" necessary to clean up the asset account history. The system will clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" +" Account storage - Record limit" +msgstr "" +"由於每次更新資產帳號,都會產生歷史帳號,所以需要清理資產帳號的歷史。系統會根據帳號儲存-記錄限制的配置,每天凌晨2點對於超出的數量的帳號記錄進行清理" + +#: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." msgstr "刪除超出範圍的歷史帳戶。" @@ -1168,15 +1216,36 @@ msgstr "刪除超出範圍的歷史帳戶。" msgid "Template sync info to related accounts" msgstr "同步資訊到關聯的帳號" -#: accounts/tasks/vault.py:31 +#: accounts/tasks/template.py:14 +msgid "" +"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" +" Accounts' this task will be executed" +msgstr "" +"當在控制台-帳號模板-帳號-同步更新帳號信息點擊同步時,執行該任務" + +#: accounts/tasks/vault.py:32 msgid "Sync secret to vault" msgstr "同步密文到 vault" -#: accounts/tasks/verify_account.py:49 +#: accounts/tasks/vault.py:34 +msgid "" +"When clicking 'Sync' in 'System Settings - Features - Account Storage' this " +"task will be executed" +msgstr "" +"在系統設定-功能設定-帳號儲存點擊同步時,執行該任務" + +#: accounts/tasks/verify_account.py:50 msgid "Verify asset account availability" msgstr "驗證資產帳號可用性" -#: accounts/tasks/verify_account.py:55 +#: accounts/tasks/verify_account.py:53 +msgid "" +"When clicking 'Test' in 'Console - Asset details - Accounts' this task will " +"be executed" +msgstr "" +"當在控制台-資產詳情-帳號點擊測試執行該任務" + +#: accounts/tasks/verify_account.py:59 msgid "Verify accounts connectivity" msgstr "測試帳號可連接性" @@ -1209,8 +1278,8 @@ msgstr "你好! 以下是資產改密或推送帳戶失敗的情況。 請及 #: accounts/utils.py:52 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." msgstr "如果密碼以 `{{` 開始,並且以 `}}` 結束,則該密碼是不允許的。" #: accounts/utils.py:59 @@ -1381,8 +1450,8 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" -"db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " +"2001:db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1410,8 +1479,8 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" -"db8:2de::e13, 2001:db8:1a:1110::/64" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " +"2001:db8:2de::e13, 2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 @@ -1450,9 +1519,7 @@ msgid "" "Please review the login activity to ensure the security and proper usage of " "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." -msgstr "" -"請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任" -"何可疑行為,請立即採取必要的行動。" +msgstr "請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任何可疑行為,請立即採取必要的行動。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -1511,32 +1578,32 @@ msgstr "同級別節點名字不能重複" msgid "App Assets" msgstr "資產管理" -#: assets/automations/base/manager.py:187 +#: assets/automations/base/manager.py:188 msgid "{} disabled" msgstr "{} 已禁用" -#: assets/automations/base/manager.py:250 +#: assets/automations/base/manager.py:251 msgid " - Platform {} ansible disabled" msgstr " - 平台 {} Ansible 已禁用, 無法執行任務" -#: assets/automations/base/manager.py:323 +#: assets/automations/base/manager.py:324 msgid ">>> Task preparation phase" msgstr ">>> 任務準備階段" -#: assets/automations/base/manager.py:326 +#: assets/automations/base/manager.py:327 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> 分次執行任務,總共 {runner_count}" -#: assets/automations/base/manager.py:328 +#: assets/automations/base/manager.py:329 msgid ">>> Start executing tasks" msgstr ">>> 開始執行任務" -#: assets/automations/base/manager.py:330 +#: assets/automations/base/manager.py:331 msgid ">>> No tasks need to be executed" msgstr ">>> 沒有需要執行的任務" -#: assets/automations/base/manager.py:335 +#: assets/automations/base/manager.py:336 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> 開始執行第 {index} 批任務" @@ -1678,7 +1745,9 @@ msgstr "舊的 SSH 版本,例如 openssh 5.x 或 6.x" #: assets/const/protocol.py:53 msgid "Netcat help text" -msgstr "使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支援 SSH 原生代理選項 (-W) 的環境,或需要更多靈活性和逾時控制的場景。" +msgstr "" +"使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支援 SSH 原生代理選項 (-W) " +"的環境,或需要更多靈活性和逾時控制的場景。" #: assets/const/protocol.py:64 msgid "SFTP root" @@ -1691,8 +1760,7 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶" -"的主目錄
-${USER}用戶的使用者名稱" +"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶的主目錄
-${USER}用戶的使用者名稱" #: assets/const/protocol.py:81 msgid "Console" @@ -1713,18 +1781,17 @@ msgstr "安全" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式" -"
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 Windows 伺服器或需要標準 " -"Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP 認證和加密
NLA
此" -"模式使用 TLS 加密,並要求提前提供用戶名和密碼
" +"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 " +"Windows 伺服器或需要標準 Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP " +"認證和加密
NLA
此模式使用 TLS 加密,並要求提前提供用戶名和密碼
" #: assets/const/protocol.py:106 msgid "AD domain" @@ -1754,7 +1821,7 @@ msgstr "成功提示" msgid "We will consider login success when we see this prompt" msgstr "當我們看到這個提示時,我們將認為登錄成功" -#: assets/const/protocol.py:145 assets/models/asset/database.py:10 +#: assets/const/protocol.py:145 assets/models/asset/database.py:11 #: settings/serializers/msg.py:49 msgid "Use SSL" msgstr "使用 SSL" @@ -1800,8 +1867,7 @@ msgstr "安全模式" msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "" -"當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" +msgstr "當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" #: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -1892,22 +1958,26 @@ msgstr "可以修改資產節點" msgid "Custom asset" msgstr "自訂資產" -#: assets/models/asset/database.py:11 +#: assets/models/asset/database.py:12 msgid "CA cert" msgstr "CA 證書" -#: assets/models/asset/database.py:12 +#: assets/models/asset/database.py:13 msgid "Client cert" msgstr "用戶端證書" -#: assets/models/asset/database.py:13 +#: assets/models/asset/database.py:14 msgid "Client key" msgstr "用戶端金鑰" -#: assets/models/asset/database.py:14 +#: assets/models/asset/database.py:15 msgid "Allow invalid cert" msgstr "忽略證書校驗" +#: assets/models/asset/database.py:18 +msgid "Postgresql SSL mode" +msgstr "PostgreSQL SSL 模式" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:92 msgid "Proxy" msgstr "代理" @@ -2221,9 +2291,7 @@ msgstr "協定,格式為 名稱/連接埠" msgid "" "Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " "\"secret_type\": \"password\"}]" -msgstr "" -"帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " -"\"secret_type\": \"password\"}]" +msgstr "帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"password\"}]" #: assets/serializers/asset/common.py:135 msgid "" @@ -2270,13 +2338,24 @@ msgstr "無效的數據" msgid "Default database" msgstr "默認資料庫" +#: assets/serializers/asset/database.py:23 +msgid "CA cert help text" +msgstr "" +"Common Name (CN) 字段已被棄用,請根據 RFC 5280 使用 Subject Alternative Name (SAN) " +"字段來驗證網域名,以提高安全性。" + +#: assets/serializers/asset/database.py:24 +msgid "Postgresql ssl model help text" +msgstr "" +"Prefer:我不在乎是否加密,但如果伺服器支持加密,我願意支付加密的費用。Require:我希望我的資料被加密,我可以承擔那個費用。我相信網路將確保我始終連接到我想要的伺服器。Verify" +" CA:我希望我的資料被加密,我可以承擔那個費用。我想要確認我連接到我信任的伺服器。Verify " +"Full:我希望我的資料被加密,我接受負擔。我想確保我連接到我信任的伺服器,並且它是我指定的伺服器。" + #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" -msgstr "" -"如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://" -"host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" +msgstr "如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2452,9 +2531,7 @@ msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " "root" -msgstr "" -"在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切" -"換到 root 一樣" +msgstr "在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切換到 root 一樣" #: assets/serializers/platform.py:205 msgid "Assets can be connected using a zone gateway" @@ -2472,7 +2549,7 @@ msgstr "類型 該欄位是必填項。" msgid "Protocols is required" msgstr "協議是必填的" -#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:35 +#: assets/signal_handlers/asset.py:26 assets/tasks/ping.py:39 msgid "Test assets connectivity " msgstr "測試資產可連接性" @@ -2480,19 +2557,26 @@ msgstr "測試資產可連接性" msgid "Gather asset hardware info" msgstr "收集資產硬體資訊" -#: assets/tasks/automation.py:24 +#: assets/tasks/automation.py:25 msgid "Asset execute automation" msgstr "資產執行自動化" -#: assets/tasks/gather_facts.py:21 assets/tasks/gather_facts.py:27 +#: assets/tasks/gather_facts.py:22 assets/tasks/gather_facts.py:32 msgid "Gather assets facts" msgstr "收集資產資訊" -#: assets/tasks/gather_facts.py:39 +#: assets/tasks/gather_facts.py:25 +msgid "" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" +" will be executed" +msgstr "" +"當在控制台資產詳情-基本設定點擊更新硬體資訊執行該任務" + +#: assets/tasks/gather_facts.py:44 msgid "Update assets hardware info: " msgstr "更新資產硬體資訊" -#: assets/tasks/gather_facts.py:47 +#: assets/tasks/gather_facts.py:52 msgid "Update node asset hardware information: " msgstr "更新節點資產硬體資訊: " @@ -2500,28 +2584,58 @@ msgstr "更新節點資產硬體資訊: " msgid "Check the amount of assets under the node" msgstr "檢查節點下資產數量" -#: assets/tasks/nodes_amount.py:28 +#: assets/tasks/nodes_amount.py:18 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" +"Manually verifying asset quantities updates the asset count for nodes under the \n" +" current organization. This task will be called in the following two cases: when updating \n" +" nodes and when the number of nodes exceeds 100" +msgstr "" +"手動校對資產數量更新當前組織下的節點資產數量;更新節點,當節點數大於100這兩種情況會呼叫該任務" + +#: assets/tasks/nodes_amount.py:34 +msgid "" +"The task of self-checking is already running and cannot be started " +"repeatedly" msgstr "自檢程序已經在運行,不能重複啟動" -#: assets/tasks/nodes_amount.py:33 +#: assets/tasks/nodes_amount.py:40 msgid "Periodic check the amount of assets under the node" msgstr "週期性檢查節點下資產數量" -#: assets/tasks/ping.py:20 assets/tasks/ping.py:26 +#: assets/tasks/nodes_amount.py:42 +msgid "" +"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" +" all nodes under all organizations" +msgstr "" +"定時調用check_node_assets_amount_task任務,更新所有組織下所有節點的資產數量" + +#: assets/tasks/ping.py:20 assets/tasks/ping.py:30 msgid "Test assets connectivity" msgstr "測試資產可連接性" -#: assets/tasks/ping.py:42 +#: assets/tasks/ping.py:24 +msgid "" +"When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' " +"this task will be executed" +msgstr "" +"當資產詳情-基本設定點擊測試資產可連結性 執行該任務" + +#: assets/tasks/ping.py:46 msgid "Test if the assets under the node are connectable " msgstr "測試節點下資產是否可連接" -#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:25 -#: assets/tasks/ping_gateway.py:34 +#: assets/tasks/ping_gateway.py:19 assets/tasks/ping_gateway.py:29 +#: assets/tasks/ping_gateway.py:38 msgid "Test gateways connectivity" msgstr "測試網關可連接性" +#: assets/tasks/ping_gateway.py:23 +msgid "" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" +" be executed" +msgstr "" +"當在網域詳情-網關-測試連線時執行該任務" + #: assets/tasks/utils.py:16 msgid "Asset has been disabled, skipped: {}" msgstr "資產已經被禁用, 跳過: {}" @@ -2543,7 +2657,8 @@ msgid "App Audits" msgstr "日志审计" #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "文字內容太長。請使用 Elasticsearch 儲存操作日誌" #: audits/backends/db.py:108 @@ -2628,7 +2743,7 @@ msgstr "同意" msgid "Close" msgstr "關閉" -#: audits/const.py:41 ops/models/celery.py:84 +#: audits/const.py:41 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" @@ -2636,8 +2751,8 @@ msgstr "結束" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:78 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:55 terminal/serializers/session.py:78 msgid "Terminal" msgstr "終端" @@ -2676,7 +2791,8 @@ msgid "Job audit log" msgstr "作業審計日誌" #: audits/models.py:56 audits/models.py:100 audits/models.py:175 -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:113 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:113 msgid "Remote addr" msgstr "遠端地址" @@ -2789,9 +2905,9 @@ msgstr "用戶會話" msgid "Offline user session" msgstr "下線用戶會話" -#: audits/serializers.py:33 ops/models/adhoc.py:25 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:86 ops/models/job.py:151 -#: ops/models/job.py:240 ops/models/playbook.py:30 +#: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:151 +#: ops/models/job.py:240 ops/models/playbook.py:32 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "創建者" @@ -2846,7 +2962,7 @@ msgstr "認證令牌" #: audits/signal_handlers/login_log.py:37 authentication/notifications.py:73 #: authentication/views/login.py:78 notifications/backends/__init__.py:11 #: settings/serializers/auth/wecom.py:11 settings/serializers/auth/wecom.py:16 -#: users/models/user/__init__.py:122 users/models/user/_source.py:18 +#: users/models/user/__init__.py:122 users/models/user/_source.py:19 msgid "WeCom" msgstr "企業微信" @@ -2854,21 +2970,21 @@ msgstr "企業微信" #: authentication/views/login.py:90 notifications/backends/__init__.py:14 #: settings/serializers/auth/feishu.py:12 #: settings/serializers/auth/feishu.py:14 users/models/user/__init__.py:128 -#: users/models/user/_source.py:20 +#: users/models/user/_source.py:21 msgid "FeiShu" msgstr "飛書" #: audits/signal_handlers/login_log.py:40 authentication/views/login.py:102 #: authentication/views/slack.py:79 notifications/backends/__init__.py:16 #: settings/serializers/auth/slack.py:11 settings/serializers/auth/slack.py:13 -#: users/models/user/__init__.py:134 users/models/user/_source.py:22 +#: users/models/user/__init__.py:134 users/models/user/_source.py:23 msgid "Slack" msgstr "Slack" #: audits/signal_handlers/login_log.py:41 authentication/views/dingtalk.py:151 #: authentication/views/login.py:84 notifications/backends/__init__.py:12 #: settings/serializers/auth/dingtalk.py:11 users/models/user/__init__.py:125 -#: users/models/user/_source.py:19 +#: users/models/user/_source.py:20 msgid "DingTalk" msgstr "釘釘" @@ -2883,14 +2999,31 @@ msgstr "臨時密碼" msgid "Passkey" msgstr "Passkey" -#: audits/tasks.py:131 +#: audits/tasks.py:132 msgid "Clean audits session task log" msgstr "清理資產審計會話任務日誌" -#: audits/tasks.py:145 +#: audits/tasks.py:134 +msgid "" +"Since the system generates login logs, operation logs, file upload logs, activity \n" +" logs, Celery execution logs, session recordings, command records, and password change \n" +" logs, it will perform cleanup of records that exceed the time limit according to the \n" +" 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" +msgstr "" +"由於系統會產生登錄日誌,操作日誌,文件上傳日誌,活動日誌,celery執行日誌,會話錄製和命令記錄,改密日誌,所以系統會根據系統設置-任務列表-" +"定期清理配置,對於超出時間的於每天凌晨2點進行清理" + +#: audits/tasks.py:154 msgid "Upload FTP file to external storage" msgstr "上傳 FTP 文件到外部儲存" +#: audits/tasks.py:156 +msgid "" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" +" synchronized to external storage" +msgstr "" +"如果設置了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部儲存" + #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" msgstr "最多可以創建10個訪問金鑰" @@ -3008,7 +3141,8 @@ msgstr "附加" #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:26 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後使用日期" @@ -3083,8 +3217,7 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳" -"號將被臨時 鎖定 {block_time} 分鐘)" +"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳號將被臨時 鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" @@ -3101,10 +3234,9 @@ msgstr "IP 已被鎖定 (請聯絡管理員解鎖或 {} 分鐘後重試)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" -msgstr "" -"{error},您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" +msgstr "{error},您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3287,7 +3419,7 @@ msgstr "設置手機號碼啟用" msgid "Clear phone number to disable" msgstr "清空手機號碼禁用" -#: authentication/middleware.py:94 settings/utils/ldap.py:681 +#: authentication/middleware.py:94 settings/utils/ldap.py:691 msgid "Authentication failed (before login check failed): {}" msgstr "認證失敗 (登錄前檢查失敗): {}" @@ -3512,8 +3644,8 @@ msgstr "創建類型" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" +"Please download the private key after creation. Each private key can only be" +" downloaded once" msgstr "創建完成後請下載私鑰,每個私鑰僅有一次下載機會" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 @@ -3531,10 +3663,17 @@ msgstr "IP 白名單" msgid "Is valid" msgstr "是否有效" -#: authentication/tasks.py:11 +#: authentication/tasks.py:13 msgid "Clean expired session" msgstr "清除過期會話" +#: authentication/tasks.py:15 +msgid "" +"Since user logins create sessions, the system will clean up expired sessions" +" every 24 hours" +msgstr "" +"由於用戶登錄系統會產生會話,系統會每24小時清理已經過期的會話" + #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" msgstr "API Key列表" @@ -3594,7 +3733,7 @@ msgstr "代碼錯誤" #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:502 +#: jumpserver/conf.py:522 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -3871,10 +4010,9 @@ msgstr "退出登錄成功,返回到登入頁面" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" -msgstr "" -"為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" +msgstr "為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" #: authentication/views/slack.py:35 authentication/views/slack.py:118 msgid "Slack Error" @@ -3980,13 +4118,12 @@ msgstr "加密的欄位" #: common/db/fields.py:577 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 " -"{'type': 'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': " -"'1.1.1.1'}}" +"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 {'type': " +"'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': '1.1.1.1'}}" #: common/db/fields.py:584 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4099,12 +4236,10 @@ msgstr "關聯項,格式是 id" msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" -msgstr "" -"多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的" +msgstr "多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的" #: common/drf/renders/base.py:170 -msgid "" -"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "標籤,格式: [\"鍵:值\", ...], 如果標籤不存在,將創建它" #: common/drf/renders/base.py:172 @@ -4270,18 +4405,37 @@ msgstr "標籤" # msgid "Labels" # msgstr "標籤管理" -#: common/tasks.py:31 +#: common/tasks.py:32 msgid "Send email" msgstr "發件郵件" -#: common/tasks.py:58 +#: common/tasks.py:35 +msgid "This task will be executed when sending email notifications" +msgstr "" +"發送郵件訊息時執行該任務" + +#: common/tasks.py:65 msgid "Send email attachment" msgstr "發送郵件附件" -#: common/tasks.py:80 terminal/tasks.py:58 -msgid "Upload session replay to external storage" +#: common/tasks.py:68 +msgid "" +"When an account password is changed or an account backup generates attachments, \n" +" this task needs to be executed for sending emails and handling attachments" +msgstr "" +"當帳號改密,帳號備份產生附件,需要對發送郵件及附件,執行該任務" + +#: common/tasks.py:94 +msgid "Upload account backup to external storage" msgstr "上傳會話錄影到外部儲存" +#: common/tasks.py:96 +msgid "" +"When performing an account backup, this task needs to be executed to " +"external storage (SFTP)" +msgstr "" +"當執行帳號備份,需要到外部儲存(sftp),執行該任務" + #: common/utils/ip/geoip/utils.py:26 msgid "Invalid ip" msgstr "無效 IP" @@ -4295,10 +4449,17 @@ msgstr "無效地址" msgid "Hello %s" msgstr "你好 %s" -#: common/utils/verify_code.py:16 +#: common/utils/verify_code.py:17 msgid "Send SMS code" msgstr "傳簡訊驗證碼" +#: common/utils/verify_code.py:19 +msgid "" +"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" +" be executed to send SMS messages" +msgstr "" +"當重設密碼,忘記密碼,驗證mfa時,需要發送短信時執行該任務" + #: common/validators.py:16 msgid "Special char not allowed" msgstr "不能包含特殊字元" @@ -4311,16 +4472,16 @@ msgstr "不能包含特殊字元" msgid "The mobile phone number format is incorrect" msgstr "手機號碼格式不正確" -#: jumpserver/conf.py:496 +#: jumpserver/conf.py:516 #, python-brace-format msgid "The verification code is: {code}" msgstr "驗證碼為: {code}" -#: jumpserver/conf.py:501 +#: jumpserver/conf.py:521 msgid "Create account successfully" msgstr "創建帳號成功" -#: jumpserver/conf.py:503 +#: jumpserver/conf.py:523 msgid "Your account has been created successfully" msgstr "你的帳號已創建成功" @@ -4338,8 +4499,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Luna是單獨部署的一個程序,你需要部署luna,koko,
如果你看到了" -"這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Luna是單獨部署的一個程序,你需要部署luna,koko, " +"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" @@ -4351,8 +4512,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發,
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發, " +"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: labels/apps.py:8 msgid "App Labels" @@ -4414,15 +4575,22 @@ msgstr "系統資訊" msgid "Publish the station message" msgstr "發布站內消息" -#: ops/ansible/inventory.py:106 ops/models/job.py:65 +#: notifications/notifications.py:48 +msgid "" +"This task needs to be executed for sending internal messages for system alerts, \n" +" work orders, and other notifications" +msgstr "" +"系統一些告警,工單等需要發送站內信時執行該任務" + +#: ops/ansible/inventory.py:116 ops/models/job.py:65 msgid "No account available" msgstr "無可用帳號" -#: ops/ansible/inventory.py:286 +#: ops/ansible/inventory.py:296 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:302 +#: ops/ansible/inventory.py:312 msgid "Skip hosts below:" msgstr "跳過以下主機: " @@ -4470,31 +4638,31 @@ msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "正在創建任務,無法中斷,請稍後重試。" -#: ops/api/playbook.py:39 +#: ops/api/playbook.py:50 msgid "Currently playbook is being used in a job" msgstr "當前 playbook 正在作業中使用" -#: ops/api/playbook.py:97 +#: ops/api/playbook.py:113 msgid "Unsupported file content" msgstr "不支持的文件內容" -#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193 +#: ops/api/playbook.py:115 ops/api/playbook.py:161 ops/api/playbook.py:209 msgid "Invalid file path" msgstr "無效的文件路徑" -#: ops/api/playbook.py:171 +#: ops/api/playbook.py:187 msgid "This file can not be rename" msgstr "該文件不能重命名" -#: ops/api/playbook.py:190 +#: ops/api/playbook.py:206 msgid "File already exists" msgstr "文件已存在" -#: ops/api/playbook.py:208 +#: ops/api/playbook.py:224 msgid "File key is required" msgstr "文件金鑰該欄位是必填項。" -#: ops/api/playbook.py:211 +#: ops/api/playbook.py:227 msgid "This file can not be delete" msgstr "無法刪除此文件" @@ -4538,7 +4706,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "命令" -#: ops/const.py:39 ops/models/job.py:149 ops/models/playbook.py:88 +#: ops/const.py:39 ops/models/job.py:149 ops/models/playbook.py:91 msgid "Playbook" msgstr "Playbook" @@ -4602,53 +4770,72 @@ msgstr "超時" msgid "Command execution disabled" msgstr "命令執行禁用" +#: ops/const.py:86 +msgctxt "scope" +msgid "Public" +msgstr "公有" + +#: ops/const.py:87 +msgid "Private" +msgstr "私有" + #: ops/exception.py:6 msgid "no valid program entry found." msgstr "沒有可用程序入口" -#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:73 +#: ops/mixin.py:30 ops/mixin.py:110 settings/serializers/auth/ldap.py:73 +#: settings/serializers/auth/ldap_ha.py:55 msgid "Periodic run" msgstr "週期性執行" -#: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108 +#: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116 #: settings/serializers/auth/ldap.py:80 +#: settings/serializers/auth/ldap_ha.py:62 msgid "Interval" msgstr "間隔" -#: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105 +#: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113 #: settings/serializers/auth/ldap.py:77 +#: settings/serializers/auth/ldap_ha.py:59 msgid "Crontab" msgstr "Crontab" -#: ops/mixin.py:110 +#: ops/mixin.py:118 msgid "Run period" msgstr "執行週期" -#: ops/mixin.py:119 +#: ops/mixin.py:127 msgid "* Please enter a valid crontab expression" msgstr "* 請輸入有效的 crontab 表達式" -#: ops/mixin.py:126 +#: ops/mixin.py:134 msgid "Range {} to {}" msgstr "輸入在 {} - {} 範圍之間" -#: ops/mixin.py:137 +#: ops/mixin.py:145 msgid "Require interval or crontab setting" msgstr "需要週期或定期設定" -#: ops/models/adhoc.py:21 +#: ops/models/adhoc.py:20 msgid "Pattern" msgstr "模式" -#: ops/models/adhoc.py:23 ops/models/job.py:146 +#: ops/models/adhoc.py:22 ops/models/job.py:146 msgid "Module" msgstr "模組" -#: ops/models/adhoc.py:24 ops/models/celery.py:81 ops/models/job.py:144 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:144 #: terminal/models/component/task.py:14 msgid "Args" msgstr "參數" +#: ops/models/adhoc.py:26 ops/models/playbook.py:36 +#: ops/serializers/mixin.py:10 rbac/models/role.py:31 +#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 +#: settings/serializers/auth/oauth2.py:37 +msgid "Scope" +msgstr "範圍" + # msgid "Creator" # msgstr "創建者" #: ops/models/base.py:19 @@ -4677,23 +4864,23 @@ msgstr "匯總" msgid "Date last publish" msgstr "發布日期" -#: ops/models/celery.py:70 +#: ops/models/celery.py:71 msgid "Celery Task" msgstr "Celery 任務" -#: ops/models/celery.py:73 +#: ops/models/celery.py:74 msgid "Can view task monitor" msgstr "可以查看任務監控" -#: ops/models/celery.py:82 terminal/models/component/task.py:15 +#: ops/models/celery.py:83 terminal/models/component/task.py:15 msgid "Kwargs" msgstr "其它參數" -#: ops/models/celery.py:87 +#: ops/models/celery.py:88 msgid "Date published" msgstr "發布日期" -#: ops/models/celery.py:112 +#: ops/models/celery.py:113 msgid "Celery Task Execution" msgstr "Celery 任務執行" @@ -4738,11 +4925,11 @@ msgstr "Material 類型" msgid "Job Execution" msgstr "作業執行" -#: ops/models/playbook.py:33 +#: ops/models/playbook.py:35 msgid "CreateMethod" msgstr "創建方式" -#: ops/models/playbook.py:34 +#: ops/models/playbook.py:37 msgid "VCS URL" msgstr "VCS URL" @@ -4806,34 +4993,84 @@ msgstr "任務 ID" msgid "You do not have permission for the current job." msgstr "你沒有當前作業的權限。" -#: ops/tasks.py:50 +#: ops/tasks.py:51 msgid "Run ansible task" msgstr "運行 Ansible 任務" -#: ops/tasks.py:76 +#: ops/tasks.py:54 +msgid "" +"Execute scheduled adhoc and playbooks, periodically invoking the task for " +"execution" +msgstr "" +"當執行定時的快捷命令,playbook,定時呼叫該任務執行" + +#: ops/tasks.py:82 msgid "Run ansible task execution" msgstr "開始執行 Ansible 任務" -#: ops/tasks.py:89 +#: ops/tasks.py:85 +msgid "Execute the task when manually adhoc or playbooks" +msgstr "" +"手動執行快捷命令,playbook時執行該任務" + +#: ops/tasks.py:99 msgid "Clear celery periodic tasks" msgstr "清理週期任務" -#: ops/tasks.py:110 +#: ops/tasks.py:101 +msgid "At system startup, clean up celery tasks that no longer exist" +msgstr "" +"系統啟動時,清理已經不存在的celery任務" + +#: ops/tasks.py:125 msgid "Create or update periodic tasks" msgstr "創建或更新週期任務" -#: ops/tasks.py:118 +#: ops/tasks.py:127 +msgid "" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" +" of scheduled tasks will be updated" +msgstr "" +"隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時,,將會註冊任務或者更新定時任務參數" + +#: ops/tasks.py:140 msgid "Periodic check service performance" msgstr "週期檢測服務性能" -#: ops/tasks.py:124 +#: ops/tasks.py:142 +msgid "" +"Check every hour whether each component is offline and whether the CPU, memory, \n" +" and disk usage exceed the thresholds, and send an alert message to the administrator" +msgstr "" +"每小時檢測各組件是否離線,cpu,內存,硬盤使用率是否超過閾值,向管理員發送訊息預警" + +#: ops/tasks.py:152 msgid "Clean up unexpected jobs" msgstr "清理異常作業" -#: ops/tasks.py:131 +#: ops/tasks.py:154 +msgid "" +"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" +" which result in the task status not being updated, the system will clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and mark these tasks as \n" +" failed" +msgstr "" +"由於作業中心執行快捷命令,playbook會產生異常,任務狀態未更新完成,系統將每小時執行清理超3小時未完成的異常作業,並將任務標記失敗" + +#: ops/tasks.py:167 msgid "Clean job_execution db record" msgstr "清理作業中心執行歷史" +#: ops/tasks.py:169 +msgid "" +"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" +" be generated. The system will clean up records that exceed the retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" +" Job execution retention days'" +msgstr "" +"由於作業中心執行快捷命令,playbook,會產生j執行記錄,系統會根據系統設置-任務列表-定期清理-作業中心執行歷史配置,每天凌晨2點對超出保存時間的記錄進行清理" + #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" msgstr "任務列表" @@ -4898,10 +5135,11 @@ msgstr "請選擇一個組織後再保存" #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91 #: rbac/const.py:7 rbac/models/rolebinding.py:56 -#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:52 +#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:60 msgid "Organization" msgstr "組織" @@ -4959,7 +5197,7 @@ msgstr "網關數量" msgid "Asset permissions amount" msgstr "資產授權數量" -#: orgs/tasks.py:9 +#: orgs/tasks.py:10 msgid "Refresh organization cache" msgstr "刷新組織快取" @@ -5064,9 +5302,7 @@ msgstr "組織 ({}) 的資產授權" msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" -msgstr "" -"帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, " -"@USER, @ANON, @INPUT" +msgstr "帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, @USER, @ANON, @INPUT" #: perms/serializers/permission.py:38 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -5080,14 +5316,33 @@ msgstr "使用者群組" msgid "Groups amount" msgstr "使用者組數量" -#: perms/tasks.py:27 +#: perms/tasks.py:28 msgid "Check asset permission expired" msgstr "校驗資產授權規則已過期" -#: perms/tasks.py:40 +#: perms/tasks.py:30 +msgid "" +"The cache of organizational collections, which have completed user authorization tree \n" +" construction, will expire. Therefore, expired collections need to be cleared from the \n" +" cache, and this task will be executed periodically based on the time interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" +msgstr "" +"使用者授權樹已經建製完成的組織集合快取會過期,因此需要將過期的集合從快取中清理掉,根據系統設定檔 config.txt 中的 " +"PERM_EXPIRED_CHECK_PERIODIC 的時間間隔定時執行該Action" + +#: perms/tasks.py:49 msgid "Send asset permission expired notification" msgstr "發送資產權限過期通知" +#: perms/tasks.py:51 +msgid "" +"Check every day at 10 a.m. and send a notification message to users associated with \n" +" assets whose authorization is about to expire, as well as to the organization's \n" +" administrators, 3 days in advance, to remind them that the asset authorization will \n" +" expire in a few days" +msgstr "" +"每天早上10點檢查,對於即將過期的資產授權相關聯的使用者及該組織管理員提前三天發送訊息通知,提示資產還有幾天即將過期" + #: perms/templates/perms/_msg_item_permissions_expire.html:7 #: perms/templates/perms/_msg_permed_items_expire.html:7 #, python-format @@ -5180,11 +5435,6 @@ msgstr "內容類型" msgid "Permissions" msgstr "授權" -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 -msgid "Scope" -msgstr "範圍" - #: rbac/models/role.py:46 rbac/models/rolebinding.py:52 #: users/models/user/__init__.py:66 msgid "Role" @@ -5338,7 +5588,7 @@ msgstr "郵件已經發送{}, 請檢查" msgid "Test smtp setting" msgstr "測試 smtp 設定" -#: settings/api/ldap.py:90 +#: settings/api/ldap.py:92 msgid "" "Users are not synchronized, please click the user synchronization button" msgstr "用戶未同步,請點擊同步用戶按鈕" @@ -5436,100 +5686,100 @@ msgid "LDAP Auth" msgstr "LDAP 認證" #: settings/serializers/auth/base.py:14 +msgid "LDAP Auth HA" +msgstr "LDAP HA 認證" + +#: settings/serializers/auth/base.py:15 msgid "CAS Auth" msgstr "CAS 認證" -#: settings/serializers/auth/base.py:15 +#: settings/serializers/auth/base.py:16 msgid "OPENID Auth" msgstr "OIDC 認證" -#: settings/serializers/auth/base.py:16 +#: settings/serializers/auth/base.py:17 msgid "SAML2 Auth" msgstr "SAML2 認證" -#: settings/serializers/auth/base.py:17 +#: settings/serializers/auth/base.py:18 msgid "OAuth2 Auth" msgstr "OAuth2 認證" -#: settings/serializers/auth/base.py:18 +#: settings/serializers/auth/base.py:19 msgid "RADIUS Auth" msgstr "RADIUS 認證" -#: settings/serializers/auth/base.py:19 +#: settings/serializers/auth/base.py:20 msgid "DingTalk Auth" msgstr "釘釘 認證" -#: settings/serializers/auth/base.py:20 +#: settings/serializers/auth/base.py:21 msgid "FeiShu Auth" msgstr "飛書 認證" -#: settings/serializers/auth/base.py:21 +#: settings/serializers/auth/base.py:22 msgid "Lark Auth" msgstr "Lark 認證" -#: settings/serializers/auth/base.py:22 +#: settings/serializers/auth/base.py:23 msgid "Slack Auth" msgstr "Slack 認證" -#: settings/serializers/auth/base.py:23 +#: settings/serializers/auth/base.py:24 msgid "WeCom Auth" msgstr "企業微信 認證" -#: settings/serializers/auth/base.py:24 +#: settings/serializers/auth/base.py:25 msgid "SSO Auth" msgstr "SSO 令牌認證" -#: settings/serializers/auth/base.py:25 +#: settings/serializers/auth/base.py:26 msgid "Passkey Auth" msgstr "Passkey 認證" -#: settings/serializers/auth/base.py:27 +#: settings/serializers/auth/base.py:28 msgid "Email suffix" msgstr "郵件後綴" -#: settings/serializers/auth/base.py:29 +#: settings/serializers/auth/base.py:30 msgid "" "After third-party user authentication is successful, if the third-party " "authentication service platform does not return the user's email " "information, the system will automatically create the user using this email " "suffix" -msgstr "" -"第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系" -"統將自動以此電子信箱後綴建立使用者" +msgstr "第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系統將自動以此電子信箱後綴建立使用者" -#: settings/serializers/auth/base.py:36 +#: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" msgstr "忘記密碼連結" -#: settings/serializers/auth/base.py:37 +#: settings/serializers/auth/base.py:38 msgid "The URL for Forgotten Password on the user login page" msgstr "使用者登入頁面忘記密碼的 URL" -#: settings/serializers/auth/base.py:40 +#: settings/serializers/auth/base.py:41 msgid "Login redirection" msgstr "啟用登入跳轉提示" -#: settings/serializers/auth/base.py:42 +#: settings/serializers/auth/base.py:43 msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "" -"Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前" -"是否顯示 Flash 頁面" +msgstr "Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前是否顯示 Flash 頁面" -#: settings/serializers/auth/base.py:54 +#: settings/serializers/auth/base.py:55 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "" -"建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" +msgstr "建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 +#: settings/serializers/auth/ldap_ha.py:26 #: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "服務端地址" @@ -5555,11 +5805,14 @@ msgstr "使用者名稱屬性" msgid "Enable attributes map" msgstr "啟用屬性映射" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/oauth2.py:60 -#: settings/serializers/auth/oidc.py:39 settings/serializers/auth/saml2.py:35 -#: settings/serializers/auth/slack.py:18 settings/serializers/auth/wecom.py:18 +#: settings/serializers/auth/ldap.py:66 +#: settings/serializers/auth/ldap_ha.py:48 +#: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 +#: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 +#: settings/serializers/auth/wecom.py:18 msgid "User attribute" msgstr "映射屬性" @@ -5567,9 +5820,7 @@ msgstr "映射屬性" msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer " -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -5589,19 +5840,15 @@ msgstr "啟用釘釘認證" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使" -"用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使用者屬性名稱" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使" -"用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使用者屬性名稱" -#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:21 +#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22 msgid "Lark" msgstr "" @@ -5609,9 +5856,7 @@ msgstr "" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務" -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務使用者屬性名稱" #: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" @@ -5622,49 +5867,57 @@ msgid "LDAP server URI" msgstr "LDAP 服務域名" #: settings/serializers/auth/ldap.py:48 +#: settings/serializers/auth/ldap_ha.py:30 msgid "Bind DN" msgstr "綁定 DN" #: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap_ha.py:31 msgid "Binding Distinguished Name" msgstr "綁定的 DN" #: settings/serializers/auth/ldap.py:53 +#: settings/serializers/auth/ldap_ha.py:35 msgid "Binding password" msgstr "原來的密碼" #: settings/serializers/auth/ldap.py:56 +#: settings/serializers/auth/ldap_ha.py:38 msgid "Search OU" msgstr "系統架構" #: settings/serializers/auth/ldap.py:58 +#: settings/serializers/auth/ldap_ha.py:40 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "使用者搜尋庫,如果有多個OU,可以用`|`符號分隔" #: settings/serializers/auth/ldap.py:62 +#: settings/serializers/auth/ldap_ha.py:44 msgid "Search filter" msgstr "用戶過濾器" #: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap_ha.py:45 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "可能的選項是(cn或uid或sAMAccountName=%(user)s)" #: settings/serializers/auth/ldap.py:68 +#: settings/serializers/auth/ldap_ha.py:50 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務" -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務使用者屬性名稱" #: settings/serializers/auth/ldap.py:84 +#: settings/serializers/auth/ldap_ha.py:66 msgid "Connect timeout (s)" msgstr "連接超時時間 (秒)" #: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap_ha.py:71 msgid "User DN cache timeout (s)" msgstr "快取逾時時間 (秒)" @@ -5675,13 +5928,32 @@ msgid "" "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果" -"用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存" +"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存" #: settings/serializers/auth/ldap.py:97 +#: settings/serializers/auth/ldap_ha.py:79 msgid "Search paged size (piece)" msgstr "搜索分頁數量 (條)" +#: settings/serializers/auth/ldap_ha.py:23 +#: settings/serializers/auth/ldap_ha.py:85 +msgid "LDAP HA" +msgstr "LDAP 認證" + +#: settings/serializers/auth/ldap_ha.py:27 +msgid "LDAP HA server URI" +msgstr "LDAP HA 服務網域名" + +#: settings/serializers/auth/ldap_ha.py:73 +msgid "" +"Caching the User DN obtained during user login authentication can " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " +"cache" +msgstr "" +"對使用者登入驗證時查詢出的 User DN 進行快取,可以有效提升使用者驗證的速度
如果使用者 OU 架構有調整,點擊提交即可清除使用者 DN " +"快取" + #: settings/serializers/auth/oauth2.py:19 #: settings/serializers/auth/oauth2.py:22 msgid "OAuth2" @@ -5727,19 +5999,18 @@ msgid "End session endpoint" msgstr "Logout session endpoint address" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "當使用者退出時,他們也會從 OAuth2 伺服器退出" #: settings/serializers/auth/oauth2.py:62 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服" -"務使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服務使用者屬性名稱" -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "總是更新用戶資訊" @@ -5771,9 +6042,7 @@ msgstr "Ignore SSL certificate verification" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" -msgstr "" -"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務" -"使用者屬性名稱" +msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務使用者屬性名稱" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -5791,8 +6060,7 @@ msgstr "使用 Keycloak" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "" -"使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" +msgstr "使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -5851,8 +6119,7 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 " -"DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" +"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -5868,7 +6135,8 @@ msgid "OTP in RADIUS" msgstr "Use Radius OTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" msgstr "* 在 RADIUS 中使用 OTP 意味著使用者可以利用 RADIUS 作為 MFA 的方法 " #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 @@ -5899,9 +6167,7 @@ msgstr "SP 證書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -" 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 " -"JumpServer 使用者屬性名稱" +msgstr " 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -5911,9 +6177,7 @@ msgstr "當使用者登出時,他們也會從 SAML2 伺服器登出" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服" -"務使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服務使用者屬性名稱" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -5978,12 +6242,10 @@ msgstr "業務型態(Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." -msgstr "" -"模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 " -"{code}, 有效期為5分鐘。請不要洩露給其他人。" +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." +msgstr "模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 {code}, 有效期為5分鐘。請不要洩露給其他人。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -6019,9 +6281,7 @@ msgstr "單位: 秒" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" -msgstr "" -"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服" -"務使用者屬性名稱" +msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服務使用者屬性名稱" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -6029,8 +6289,8 @@ msgstr "目前網站 URL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" msgstr "站點 URL 是目前產品服務的外部可訪問地址,通常在系統郵件的連結中使用" #: settings/serializers/basic.py:18 @@ -6115,8 +6375,7 @@ msgstr "會話日誌 (天)" msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." -msgstr "" -"會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" +msgstr "會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -6160,8 +6419,7 @@ msgid "" "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷" -"史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" +"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" #: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" @@ -6172,7 +6430,8 @@ msgid "GPT Base URL" msgstr "GPT 地址" #: settings/serializers/feature.py:86 -msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" +msgid "" +"The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPT 服務的基礎 URL。例如:https://api.openai.com/v1" #: settings/serializers/feature.py:89 templates/_header_bar.html:96 @@ -6284,8 +6543,7 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這" -"種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" +"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -6295,9 +6553,7 @@ msgstr "使用 TLS" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "" -"與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 " -"587 上" +msgstr "與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 587 上" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -6305,8 +6561,8 @@ msgstr "主題前綴" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" msgstr "提示: 創建用戶時,發送設置密碼郵件的主題 (例如: 創建用戶成功)" #: settings/serializers/msg.py:73 @@ -6322,8 +6578,7 @@ msgstr "提示: 創建用戶時,發送設置密碼郵件的敬語 (例如: 你 msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "" -"提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" +msgstr "提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -6339,9 +6594,7 @@ msgstr "顯示未分組節點" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" -msgstr "" -"放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問" -"題" +msgstr "放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問題" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -6352,9 +6605,7 @@ msgid "" "If the user does not update the password during the time, the user password " "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" -msgstr "" -"如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過" -"期前5天內由系統 (每天)自動發送給用戶" +msgstr "如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過期前5天內由系統 (每天)自動發送給用戶" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -6424,9 +6675,7 @@ msgid "" "users of other authentication methods except local authentication methods " "are allowed to log in and automatically create users (if the user does not " "exist)" -msgstr "" -"如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方" -"式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" +msgstr "如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -6434,13 +6683,12 @@ msgstr "僅從用戶來源登錄" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順" -"序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" +"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -6509,9 +6757,7 @@ msgstr "啟用登入附加碼" msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "" -"密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密" -"碼+6位數字 完成認證" +msgstr "密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密碼+6位數字 完成認證" #: settings/serializers/security.py:158 msgid "Login captcha" @@ -6527,12 +6773,10 @@ msgstr "異地登入通知" #: settings/serializers/security.py:164 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" -msgstr "" -"根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地" -"登錄提醒" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" +msgstr "根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地登錄提醒" #: settings/serializers/security.py:170 msgid "Auto Disable Threshold (day)" @@ -6616,8 +6860,8 @@ msgstr "元件註冊" #: settings/serializers/terminal.py:24 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" +"Allow component register, after all component setup, you should disable this" +" for security" msgstr "是否允許元件註冊,當所有終端啟動後,為了安全應該關閉" #: settings/serializers/terminal.py:30 @@ -6629,11 +6873,11 @@ msgstr "* 允許用戶透過密碼驗證登入KoKo元件" msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" -"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)" -"已啟用,則應禁用此選項,以防止用戶從 AD/LDAP 伺服器中刪除後再次登入" +"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)已啟用,則應禁用此選項,以防止用戶從 AD/LDAP " +"伺服器中刪除後再次登入" #: settings/serializers/terminal.py:43 msgid "Asset sorting" @@ -6645,21 +6889,18 @@ msgstr "資產列表每頁數量" #: settings/serializers/terminal.py:51 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" -msgstr "" -"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" -"產時顯示 DB 客戶端啟動方法" +msgstr "* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示 DB 客戶端啟動方法" #: settings/serializers/terminal.py:59 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" -"產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" +"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" #: settings/serializers/terminal.py:66 msgid "Client connection" @@ -6668,10 +6909,9 @@ msgstr "客戶端連接" #: settings/serializers/terminal.py:68 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" -msgstr "" -"* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界" -"面將顯示 SSH 客戶端啟動方法" +"Luna page will display the SSH client launch method when connecting to " +"assets" +msgstr "* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界面將顯示 SSH 客戶端啟動方法" #: settings/serializers/tool.py:10 msgid "Tool" @@ -6683,18 +6923,47 @@ msgstr "工作台中的工具" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" msgstr "*! 如果啟用,具有 RBAC 權限的用戶將能夠使用工作台中的所有工具" -#: settings/tasks/ldap.py:28 +#: settings/tasks/ldap.py:73 msgid "Periodic import ldap user" msgstr "週期匯入 LDAP 用戶" -#: settings/tasks/ldap.py:66 +#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +msgid "" +"When LDAP auto-sync is configured, this task will be invoked to synchronize " +"users" +msgstr "" +"設置了LDAP自動同步後,將呼叫該Action進行使用者同步" + +#: settings/tasks/ldap.py:83 +msgid "Periodic import ldap ha user" +msgstr "周期導入 LDAP HA 使用者" + +#: settings/tasks/ldap.py:117 msgid "Registration periodic import ldap user task" msgstr "註冊週期匯入 LDAP 用戶 任務" +#: settings/tasks/ldap.py:119 +msgid "" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" +" will be re-registered or updated, and this task will be invoked" +msgstr "" +"設置了LDAP自動同步參數變動時,像是Crontab參數,重新註冊或更新ldap同步Action將呼叫該Action" + +#: settings/tasks/ldap.py:133 +msgid "Registration periodic import ldap ha user task" +msgstr "註冊周期導入 LDAP HA 使用者 Action" + +#: settings/tasks/ldap.py:135 +msgid "" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" +" will be re-registered or updated, and this task will be invoked" +msgstr "" +"設置了LDAP HA自動同步參數變動時,像是Crontab參數,重新註冊或更新ldap ha同步Action將呼叫該Action" + #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" msgstr "同步動作完成" @@ -6711,108 +6980,108 @@ msgstr "已同步用戶" msgid "No user synchronization required" msgstr "沒有用戶需要同步" -#: settings/utils/ldap.py:496 +#: settings/utils/ldap.py:509 msgid "ldap:// or ldaps:// protocol is used." msgstr "使用 ldap:// 或 ldaps:// 協議" -#: settings/utils/ldap.py:507 +#: settings/utils/ldap.py:520 msgid "Host or port is disconnected: {}" msgstr "主機或埠不可連接: {}" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:522 msgid "The port is not the port of the LDAP service: {}" msgstr "埠不是LDAP服務埠: {}" -#: settings/utils/ldap.py:511 +#: settings/utils/ldap.py:524 msgid "Please add certificate: {}" msgstr "請添加證書" -#: settings/utils/ldap.py:515 settings/utils/ldap.py:542 -#: settings/utils/ldap.py:572 settings/utils/ldap.py:600 +#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 +#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 msgid "Unknown error: {}" msgstr "未知錯誤: {}" -#: settings/utils/ldap.py:529 +#: settings/utils/ldap.py:542 msgid "Bind DN or Password incorrect" msgstr "綁定DN或密碼錯誤" -#: settings/utils/ldap.py:536 +#: settings/utils/ldap.py:549 msgid "Please enter Bind DN: {}" msgstr "請輸入綁定DN: {}" -#: settings/utils/ldap.py:538 +#: settings/utils/ldap.py:551 msgid "Please enter Password: {}" msgstr "請輸入密碼: {}" -#: settings/utils/ldap.py:540 +#: settings/utils/ldap.py:553 msgid "Please enter correct Bind DN and Password: {}" msgstr "請輸入正確的綁定DN和密碼: {}" -#: settings/utils/ldap.py:558 +#: settings/utils/ldap.py:571 msgid "Invalid User OU or User search filter: {}" msgstr "不合法的用戶OU或用戶過濾器: {}" -#: settings/utils/ldap.py:589 +#: settings/utils/ldap.py:602 msgid "LDAP User attr map not include: {}" msgstr "LDAP屬性映射沒有包含: {}" -#: settings/utils/ldap.py:596 +#: settings/utils/ldap.py:609 msgid "LDAP User attr map is not dict" msgstr "LDAP屬性映射不合法" -#: settings/utils/ldap.py:615 +#: settings/utils/ldap.py:628 msgid "LDAP authentication is not enabled" msgstr "LDAP認證沒有啟用" -#: settings/utils/ldap.py:633 +#: settings/utils/ldap.py:646 msgid "Error (Invalid LDAP server): {}" msgstr "錯誤 (不合法的LDAP伺服器地址): {}" -#: settings/utils/ldap.py:635 +#: settings/utils/ldap.py:648 msgid "Error (Invalid Bind DN): {}" msgstr "錯誤 (不合法的綁定DN): {}" -#: settings/utils/ldap.py:637 +#: settings/utils/ldap.py:650 msgid "Error (Invalid LDAP User attr map): {}" msgstr "錯誤 (不合法的LDAP屬性映射): {}" -#: settings/utils/ldap.py:639 +#: settings/utils/ldap.py:652 msgid "Error (Invalid User OU or User search filter): {}" msgstr "錯誤 (不合法的用戶OU或用戶過濾器): {}" -#: settings/utils/ldap.py:641 +#: settings/utils/ldap.py:654 msgid "Error (Not enabled LDAP authentication): {}" msgstr "錯誤 (沒有啟用LDAP認證): {}" -#: settings/utils/ldap.py:643 +#: settings/utils/ldap.py:656 msgid "Error (Unknown): {}" msgstr "錯誤 (未知): {}" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:659 msgid "Succeed: Match {} users" msgstr "成功配對 {} 個用戶" -#: settings/utils/ldap.py:679 +#: settings/utils/ldap.py:689 msgid "Authentication failed (configuration incorrect): {}" msgstr "認證失敗 (配置錯誤): {}" -#: settings/utils/ldap.py:683 +#: settings/utils/ldap.py:693 msgid "Authentication failed (username or password incorrect): {}" msgstr "認證失敗 (使用者名稱或密碼不正確): {}" -#: settings/utils/ldap.py:685 +#: settings/utils/ldap.py:695 msgid "Authentication failed (Unknown): {}" msgstr "認證失敗: (未知): {}" -#: settings/utils/ldap.py:688 +#: settings/utils/ldap.py:698 msgid "Authentication success: {}" msgstr "認證成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:199 msgid "No LDAP user was found" msgstr "沒有取得到 LDAP 用戶" -#: settings/ws.py:209 +#: settings/ws.py:205 msgid "Total {}, success {}, failure {}" msgstr "總共 {},成功 {},失敗 {}" @@ -6898,13 +7167,11 @@ msgstr "過期。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" 您的密碼已經過期,請點擊 連結 更新密碼\n" +" 您的密碼已經過期,請點擊 連結 更新密碼\n" " " #: templates/_message.html:30 @@ -6915,39 +7182,33 @@ msgstr "您的密碼將於" #, python-format msgid "" "\n" -" please click this " -"link to update your password.\n" +" please click this link to update your password.\n" " " msgstr "" "\n" -" 請點擊 連結 更" -"新密碼\n" +" 請點擊 連結 更新密碼\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" 你的資訊不完整,請點擊 連結 " -" 補充完整\n" +" 你的資訊不完整,請點擊 連結 補充完整\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" 您的SSH金鑰沒有設置或已失效,請點擊 連結 更新\n" +" 您的SSH金鑰沒有設置或已失效,請點擊 連結 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -6978,9 +7239,7 @@ msgstr "用戶端" msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" -msgstr "" -"JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH " -"用戶端,Telnet 會在未來支持" +msgstr "JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH 用戶端,Telnet 會在未來支持" #: templates/resource_download.html:35 msgid "Microsoft" @@ -7044,7 +7303,7 @@ msgstr "命令儲存" msgid "Invalid" msgstr "無效" -#: terminal/api/component/storage.py:132 terminal/tasks.py:149 +#: terminal/api/component/storage.py:132 terminal/tasks.py:187 msgid "Test failure: {}" msgstr "測試失敗: {}" @@ -7426,7 +7685,8 @@ msgstr "可以下載會話錄影" msgid "Account ID" msgstr "帳號" -#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:37 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "登錄來源" @@ -7475,8 +7735,8 @@ msgstr "操作權限" msgid "Origin" msgstr "來源" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:261 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:261 msgid "Session sharing" msgstr "會話分享" @@ -7558,7 +7818,7 @@ msgstr "級別" msgid "Command and replay storage" msgstr "命令及錄影儲存" -#: terminal/notifications.py:240 terminal/tasks.py:153 +#: terminal/notifications.py:240 terminal/tasks.py:191 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -7589,19 +7849,15 @@ msgstr "Core 服務地址" #: terminal/serializers/applet_host.py:40 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段," -"建議填寫內網地址,否則填寫當前站點 URL
例如:https://172.16.10.110 or " -"https://dev.jumpserver.com" +"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段,建議填寫內網地址,否則填寫當前站點 " +"URL
例如:https://172.16.10.110 or https://dev.jumpserver.com" #: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -7643,9 +7899,7 @@ msgstr "RDS 最大斷開時間(毫秒)" msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "" -"提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒" -"後註銷會話)" +msgstr "提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒後註銷會話)" #: terminal/serializers/applet_host.py:71 msgid "RDS Remote App Logoff Time Limit (ms)" @@ -7653,11 +7907,9 @@ msgstr "RDS 遠程應用註銷時間限制(毫秒)" #: terminal/serializers/applet_host.py:73 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." -msgstr "" -"提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即" -"註銷會話)" +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." +msgstr "提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即註銷會話)" #: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 @@ -7666,16 +7918,15 @@ msgstr "負載狀態" #: terminal/serializers/applet_host.py:96 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" -"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用" -"戶都有一個專用帳號。 另一種是公共的,當應用不支持多開且專用的已經被使用時,會" -"使用公共帳號連接;
注意: 如果不開啟自動創建帳號, 當前發布機僅能被指定標" -"簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" +"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用戶都有一個專用帳號。 " +"另一種是公共的,當應用不支持多開且專用的已經被使用時,會使用公共帳號連接;
注意: 如果不開啟自動創建帳號, " +"當前發布機僅能被指定標簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" #: terminal/serializers/applet_host.py:103 msgid "The number of public accounts created automatically" @@ -7687,8 +7938,7 @@ msgid "" "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 " -"CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" +"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" #: terminal/serializers/applet_host.py:148 msgid "Install applets" @@ -7738,23 +7988,19 @@ msgstr "Oracle 埠範圍" msgid "" "Oracle proxy server listen port is dynamic, Each additional Oracle database " "instance adds a port listener" -msgstr "" -"Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠" -"監聽" +msgstr "Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠監聽" #: terminal/serializers/endpoint.py:38 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" -msgstr "" -"連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許" -"修改主機)" +msgstr "連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許修改主機)" #: terminal/serializers/endpoint.py:64 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "該 IP 範圍內的資產,將使用下面的端點進行連接" #: terminal/serializers/endpoint.py:65 @@ -7857,8 +8103,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"如果有多個主機,請用逗號 (,) 分隔它們。
(例如:http://www.jumpserver.a." -"com:9100,http://www.jumpserver.b.com:9100)" +"如果有多個主機,請用逗號 (,) " +"分隔它們。
(例如:http://www.jumpserver.a.com:9100,http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -8023,34 +8269,88 @@ msgstr "授權已過期" msgid "storage is null" msgstr "儲存為空" -#: terminal/tasks.py:31 +#: terminal/tasks.py:32 msgid "Periodic delete terminal status" msgstr "週期清理終端狀態" -#: terminal/tasks.py:39 +#: terminal/tasks.py:43 msgid "Clean orphan session" msgstr "清除離線會話" -#: terminal/tasks.py:87 +#: terminal/tasks.py:45 +msgid "" +"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" +" minutes and mark these sessions as completed" +msgstr "" +"每10分鐘檢查3分鐘未活躍的資產連結會話,將這些會話標記未已完成" + +#: terminal/tasks.py:68 +msgid "Upload session replay to external storage" +msgstr "上傳會話錄影到外部儲存" + +#: terminal/tasks.py:70 +msgid "" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" +" recordings will be uploaded to external storage" +msgstr "" +"如果設置了SERVER_REPLAY_STORAGE,將透過檔案管理上傳的檔案同步到外部儲存" + +#: terminal/tasks.py:102 msgid "Run applet host deployment" msgstr "運行應用機部署" -#: terminal/tasks.py:97 +#: terminal/tasks.py:105 +msgid "" +"When deploying from the remote application publisher details page, and the 'Deploy' \n" +" button is clicked, this task will be executed" +msgstr "" +"發布機部署,點擊部署時,執行該Action" + +#: terminal/tasks.py:116 msgid "Install applet" msgstr "安裝應用" -#: terminal/tasks.py:108 +#: terminal/tasks.py:119 +msgid "" +"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" +" application publisher details page, this task will be executed" +msgstr "" +"當遠端應用發布機的詳細資訊-遠端應用,點擊部署時,執行該Action" + +#: terminal/tasks.py:131 msgid "Uninstall applet" msgstr "卸載應用" -#: terminal/tasks.py:119 +#: terminal/tasks.py:134 +msgid "" +"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" +" remote application publisher details page, this task will be executed" +msgstr "" +"當遠端應用發布機的詳細資訊-遠端應用,點擊移除時,執行該Action" + +#: terminal/tasks.py:146 msgid "Generate applet host accounts" msgstr "收集遠程應用上的帳號" -#: terminal/tasks.py:131 +#: terminal/tasks.py:149 +msgid "" +"When a remote publishing server is created and an account needs to be created \n" +" automatically, this task will be executed" +msgstr "" +"當創建遠程發布機後,需要自動創建帳號時,執行該Action" + +#: terminal/tasks.py:163 msgid "Check command replay storage connectivity" msgstr "檢查命令及錄影儲存可連接性 " +#: terminal/tasks.py:165 +msgid "" +"Check every day at midnight whether the external storage for commands and recordings \n" +" is accessible. If it is not accessible, send a notification to the recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" +msgstr "" +"每天凌晨0點檢查命令及錄像外部儲存是否能夠連接,無法連接時發送給:系統設定-通知設定-訊息訂閱-命令及錄像儲存設定的接收人" + #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" msgstr "查看" @@ -8060,14 +8360,12 @@ msgid "" "No available port is matched. The number of databases may have exceeded the " "number of ports open to the database agent service, Contact the " "administrator to open more ports." -msgstr "" -"未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管" -"理員開放更多埠。" +msgstr "未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管理員開放更多埠。" #: terminal/utils/db_port_mapper.py:116 msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." +"No ports can be used, check and modify the limit on the number of ports that" +" Magnus listens on in the configuration file." msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。" #: terminal/utils/db_port_mapper.py:118 @@ -8130,8 +8428,7 @@ msgstr "工單已經關閉" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "" -"通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" +msgstr "通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -8480,9 +8777,7 @@ msgid "" "When enabled, you will enter the MFA binding process the next time you log " "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" -msgstr "" -"啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速" -"修改->設置 MFA 多因子認證)中直接綁定!" +msgstr "啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速修改->設置 MFA 多因子認證)中直接綁定!" #: users/forms/profile.py:59 msgid "* Enable MFA to make the account more secure." @@ -8490,12 +8785,10 @@ msgstr "* 啟用 MFA 多因子認證,使帳號更加安全。" #: users/forms/profile.py:68 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" -msgstr "" -"為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:" -"設置複雜密碼,並啟用 MFA 多因子認證)" +msgstr "為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:設置複雜密碼,並啟用 MFA 多因子認證)" #: users/forms/profile.py:82 users/serializers/preference/lina.py:21 msgid "New password" @@ -8648,8 +8941,8 @@ msgstr "終端主題名稱" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" "File Encryption Password, when the system sends mails containing file " "attachments, use this password for decryption.
For example: Account " @@ -8702,9 +8995,7 @@ msgid "" "Determines whether the client computer should scale the content on the " "remote computer to fit the window size of the client computer when the " "window is resized." -msgstr "" -"確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機" -"的窗口大小" +msgstr "確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機的窗口大小" #: users/serializers/preference/luna.py:59 msgid "Remote app connect method" @@ -8748,10 +9039,11 @@ msgstr "系統角色" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" +"System roles are roles at the system level, and they will take effect across" +" all organizations" msgstr "" -"System role is a system-level role, it will be effective in all organizations" +"System role is a system-level role, it will be effective in all " +"organizations" #: users/serializers/user.py:61 msgid "Org roles" @@ -8762,8 +9054,8 @@ msgid "" "Org roles are roles at the organization level, and they will only take " "effect within current organization" msgstr "" -"Organization role is an organization-level role, it is only effective within " -"the current organization" +"Organization role is an organization-level role, it is only effective within" +" the current organization" #: users/serializers/user.py:70 msgid "Organizations and roles" @@ -8823,8 +9115,8 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"User origin identifies the location where the user was created. It can be AD " -"or other sources. Security settings can restrict users to log in to the " +"User origin identifies the location where the user was created. It can be AD" +" or other sources. Security settings can restrict users to log in to the " "system only from designated sources." #: users/serializers/user.py:266 @@ -8849,7 +9141,8 @@ msgstr "認證" #: users/serializers/user.py:426 msgid "" -"* For security, only a partial of users is displayed. You can search for more" +"* For security, only a partial of users is displayed. You can search for " +"more" msgstr "" "*For security reasons, only a portion of users is displayed. You can search " "for more" @@ -8861,36 +9154,78 @@ msgstr "名稱重複" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." -msgstr "" -"管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" +" and the current user is not in the user list. Please contact the administrator." +msgstr "管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" -#: users/signal_handlers.py:193 +#: users/signal_handlers.py:196 msgid "Clean up expired user sessions" msgstr "清除過期的用戶會話" -#: users/tasks.py:25 +#: users/signal_handlers.py:198 +msgid "" +"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" +" the system cleans up inactive user devices" +msgstr "" +"使用web登入後,會產生使用者會話在線紀錄,每天凌晨2點,清理未在線的使用者設備" + +#: users/tasks.py:26 msgid "Check password expired" msgstr "校驗密碼已過期" -#: users/tasks.py:39 +#: users/tasks.py:28 +msgid "" +"Check every day at 10 AM whether the passwords of users in the system are expired, \n" +" and send a notification 5 days in advance" +msgstr "" +"每天早上10點檢查,系統中使用者的密碼是否過期,提前5天發送通知" + +#: users/tasks.py:46 msgid "Periodic check password expired" msgstr "週期校驗密碼過期" -#: users/tasks.py:53 +#: users/tasks.py:48 +msgid "" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" +" parameters of the task that checks if passwords have expired" +msgstr "" +"隨著版本迭代,可能會新增Action或者修改Action的名稱,執行時間,所以在系統啟動時,註冊或者更新檢驗密碼已過期Action的參數" + +#: users/tasks.py:67 msgid "Check user expired" msgstr "校驗用戶已過期" -#: users/tasks.py:70 +#: users/tasks.py:69 +msgid "" +"Check every day at 10 AM whether the users in the system are expired, and send a \n" +" notification 5 days in advance" +msgstr "每天上午10點檢查,系統中的使用者是否過期,提前5天發送通知" + +#: users/tasks.py:90 msgid "Periodic check user expired" msgstr "週期檢測用戶過期" -#: users/tasks.py:84 +#: users/tasks.py:92 +msgid "" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" +" parameters of the task that checks if users have expired" +msgstr "" +"隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時,註冊或者更新檢驗使用者已過期任務的參數" + +#: users/tasks.py:111 msgid "Check unused users" msgstr "檢查未使用的用戶" -#: users/tasks.py:123 +#: users/tasks.py:113 +msgid "" +"At 2 a.m. every day, according to the configuration in \"System Settings - Security - \n" +" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" +" have not been used for a long time will be disabled" +msgstr "" +"每天凌晨2點,根據系統配置-安全設置-不活躍使用者自動禁用配置,對長時間不登錄或api_key不使用的使用者進行禁用" + +#: users/tasks.py:157 msgid "The user has not logged in recently and has been disabled." msgstr "該用戶最近未登錄,已被禁用。" @@ -9022,8 +9357,8 @@ msgstr "綁定MFA驗證器" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" msgstr "使用 MFA 驗證器應用掃描以下二維碼,獲取6位驗證碼" #: users/templates/users/user_otp_enable_bind.html:22 @@ -9108,8 +9443,8 @@ msgstr "使用者名稱或密碼無效" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" msgstr "非本地用戶僅允許從第三方平台登錄,不支持修改密碼: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 @@ -9333,8 +9668,7 @@ msgstr "同步地區" #: xpack/plugins/cloud/manager.py:115 #, python-format msgid "Get instances of region \"%s\" error, error: %s" -msgstr "" -"An error occurred while getting the instances of Region \"%s\", Error: %s" +msgstr "An error occurred while getting the instances of Region \"%s\", Error: %s" #: xpack/plugins/cloud/manager.py:157 #, python-format @@ -9385,7 +9719,7 @@ msgstr "刪除帳號: %s" msgid "Set protocols \"%s\"" msgstr "設定協議 \"%s\"" -#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:30 +#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:31 msgid "Run sync instance task" msgstr "執行同步實例任務" @@ -9479,7 +9813,8 @@ msgstr "實例" msgid "Sync instance detail" msgstr "同步實例詳情" -#: xpack/plugins/cloud/models.py:311 xpack/plugins/cloud/serializers/task.py:77 +#: xpack/plugins/cloud/models.py:311 +#: xpack/plugins/cloud/serializers/task.py:77 msgid "Rule relation" msgstr "條件關係" @@ -9535,7 +9870,8 @@ msgstr "規則匹配" msgid "Rule value" msgstr "規則值" -#: xpack/plugins/cloud/models.py:381 xpack/plugins/cloud/serializers/task.py:80 +#: xpack/plugins/cloud/models.py:381 +#: xpack/plugins/cloud/serializers/task.py:80 msgid "Strategy rule" msgstr "條件" @@ -9551,7 +9887,8 @@ msgstr "動作屬性" msgid "Action value" msgstr "動作值" -#: xpack/plugins/cloud/models.py:407 xpack/plugins/cloud/serializers/task.py:83 +#: xpack/plugins/cloud/models.py:407 +#: xpack/plugins/cloud/serializers/task.py:83 msgid "Strategy action" msgstr "動作" @@ -9828,9 +10165,7 @@ msgid "" "The port is used to detect the validity of the IP address. When the " "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." -msgstr "" -"埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如" -"果埠為 0,則表示所有 IP 地址均有效。" +msgstr "埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如果埠為 0,則表示所有 IP 地址均有效。" #: xpack/plugins/cloud/serializers/account_attrs.py:190 msgid "Hostname prefix" @@ -9860,10 +10195,25 @@ msgstr "執行次數" msgid "Instance count" msgstr "實例個數" -#: xpack/plugins/cloud/tasks.py:44 +#: xpack/plugins/cloud/tasks.py:33 +msgid "" +"Execute this task when manually or scheduled cloud synchronization tasks are" +" performed" +msgstr "" +"手動,定時執行雲同步任務時執行該任務" + +#: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" msgstr "定期清除同步實例任務執行記錄" +#: xpack/plugins/cloud/tasks.py:52 +msgid "" +"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" +" records generated by cloud synchronization" +msgstr "" +"每天根據系統設置-任務列表-定期清理配置-雲同步記錄配置,對雲同步產生的執行記錄進行清理" + #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." msgstr "恢復默認成功!" diff --git a/apps/i18n/koko/en.json b/apps/i18n/koko/en.json index e4165597d..bd02311c7 100644 --- a/apps/i18n/koko/en.json +++ b/apps/i18n/koko/en.json @@ -62,5 +62,10 @@ "VerifyCode": "Verify Code", "WaitFileTransfer": "Wait file transfer to finish", "WebSocketClosed": "WebSocket closed", - "Writable": "Writable" + "Writable": "Writable", + "Reconnect": "Reconnect", + "Close Current Tab": "Close Current Tab", + "Close All Tabs": "Close All Tabs", + "Clone Connect": "Clone Connect", + "Custom Setting": "Custom Setting" } \ No newline at end of file diff --git a/apps/i18n/koko/ja.json b/apps/i18n/koko/ja.json index 4ef320f8e..47f426463 100644 --- a/apps/i18n/koko/ja.json +++ b/apps/i18n/koko/ja.json @@ -1,6 +1,9 @@ { "ActionPerm": "アクション権限", "Cancel": "キャンセル", + "Clone Connect": "ウィンドウをコピー", + "Close All Tabs": "すべてを閉じる", + "Close Current Tab": "現在を閉じる", "Confirm": "確認", "ConfirmBtn": "確定", "Connect": "接続", @@ -8,6 +11,7 @@ "CopyShareURLSuccess": "レプリケーション共有住所成功", "CreateLink": "シェアリンクの作成", "CreateSuccess": "作成に成功しました", + "Custom Setting": "カスタム設定", "DownArrow": "下向き矢印", "Download": "ダウンロード", "DownloadSuccess": "ダウンロードに成功しました", @@ -33,6 +37,7 @@ "Paste": "貼り付け", "PauseSession": "セッションを一時停止", "ReadOnly": "読み取り専用", + "Reconnect": "再接続", "Refresh": "リフレッシュ", "Remove": "削除", "RemoveShareUser": "あなたはすでに共有セッションから削除されました」という意味です", diff --git a/apps/i18n/koko/zh.json b/apps/i18n/koko/zh.json index 1e241c03e..450305a04 100644 --- a/apps/i18n/koko/zh.json +++ b/apps/i18n/koko/zh.json @@ -62,5 +62,9 @@ "VerifyCode": "验证码", "WaitFileTransfer": "等待文件传输结束", "WebSocketClosed": "WebSocket 已关闭", - "Writable": "读写" + "Reconnect": "重新连接", + "Close Current Tab": "关闭当前", + "Close All Tabs": "关闭所有", + "Clone Connect": "复制窗口", + "Custom Setting": "自定义设置" } \ No newline at end of file diff --git a/apps/i18n/koko/zh_hant.json b/apps/i18n/koko/zh_hant.json index 545f35c19..8fe8cfee0 100644 --- a/apps/i18n/koko/zh_hant.json +++ b/apps/i18n/koko/zh_hant.json @@ -1,6 +1,9 @@ { "ActionPerm": "操作權限", "Cancel": "取消", + "Clone Connect": "複製視窗", + "Close All Tabs": "關閉全部", + "Close Current Tab": "關閉當前", "Confirm": "確認", "ConfirmBtn": "確定", "Connect": "連接", @@ -8,6 +11,7 @@ "CopyShareURLSuccess": "複製分享地址成功", "CreateLink": "創建分享連結", "CreateSuccess": "創建成功", + "Custom Setting": "自訂設定", "DownArrow": "向下箭頭", "Download": "下載", "DownloadSuccess": "下載成功", @@ -33,6 +37,7 @@ "Paste": "貼上", "PauseSession": "暫停此會話", "ReadOnly": "只讀", + "Reconnect": "重新連線", "Refresh": "刷新", "Remove": "移除", "RemoveShareUser": "你已經被移除共享會話", diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json index a3edc71fd..a0f0af624 100644 --- a/apps/i18n/lina/ja.json +++ b/apps/i18n/lina/ja.json @@ -1255,6 +1255,7 @@ "TaskID": "タスク ID", "TaskList": "タスク一覧", "TaskMonitor": "タスクモニタリング", + "TaskPath": "タスクパス", "TechnologyConsult": "技術相談", "TempPasswordTip": "一時的なパスワードの有効期間は300秒で、使用後すぐに無効になります", "TempToken": "一時的なパスワード", diff --git a/apps/i18n/lina/zh_hant.json b/apps/i18n/lina/zh_hant.json index 500c74591..e4b00112a 100644 --- a/apps/i18n/lina/zh_hant.json +++ b/apps/i18n/lina/zh_hant.json @@ -1600,6 +1600,7 @@ "TaskID": "任務 ID", "TaskList": "工作列表", "TaskMonitor": "任務監控", + "TaskPath": "任務路徑", "TechnologyConsult": "技術諮詢", "TempPassword": "臨時密碼有效期為 300 秒,使用後立刻失效", "TempPasswordTip": "臨時密碼有效時間為 300 秒,使用後立即失效", diff --git a/apps/notifications/notifications.py b/apps/notifications/notifications.py index abde60768..13df6932a 100644 --- a/apps/notifications/notifications.py +++ b/apps/notifications/notifications.py @@ -1,7 +1,6 @@ import textwrap import traceback from itertools import chain -from typing import Iterable from celery import shared_task from django.utils.translation import gettext_lazy as _ @@ -46,10 +45,8 @@ class MessageType(type): @shared_task( verbose_name=_('Publish the station message'), description=_( - """ - This task needs to be executed for sending internal messages for system alerts, - work orders, and other notifications - """ + """This task needs to be executed for sending internal messages for system alerts, + work orders, and other notifications""" ) ) def publish_task(receive_user_ids, backends_msg_mapper): diff --git a/apps/ops/tasks.py b/apps/ops/tasks.py index 3ec35a042..31d9ee38d 100644 --- a/apps/ops/tasks.py +++ b/apps/ops/tasks.py @@ -1,6 +1,5 @@ # coding: utf-8 import datetime -import time from celery import shared_task from celery.exceptions import SoftTimeLimitExceeded @@ -13,7 +12,7 @@ from common.utils import get_logger, get_object_or_none, get_log_keep_day from ops.celery import app from orgs.utils import tmp_to_org, tmp_to_root_org from .celery.decorator import ( - register_as_period_task, after_app_ready_start, after_app_shutdown_clean_periodic + register_as_period_task, after_app_ready_start ) from .celery.utils import ( create_or_update_celery_periodic_tasks, get_celery_periodic_task, @@ -52,9 +51,7 @@ def _run_ops_job_execution(execution): verbose_name=_("Run ansible task"), activity_callback=job_task_activity_callback, description=_( - """ - Execute scheduled adhoc and playbooks, periodically invoking the task for execution - """ + "Execute scheduled adhoc and playbooks, periodically invoking the task for execution" ) ) def run_ops_job(job_id): @@ -85,9 +82,7 @@ def job_execution_task_activity_callback(self, execution_id, *args, **kwargs): verbose_name=_("Run ansible task execution"), activity_callback=job_execution_task_activity_callback, description=_( - """ - Execute the task when manually adhoc or playbooks - """ + "Execute the task when manually adhoc or playbooks" ) ) def run_ops_job_execution(execution_id, **kwargs): @@ -103,9 +98,7 @@ def run_ops_job_execution(execution_id, **kwargs): @shared_task( verbose_name=_('Clear celery periodic tasks'), description=_( - """ - At system startup, clean up celery tasks that no longer exist - """ + "At system startup, clean up celery tasks that no longer exist" ) ) @after_app_ready_start @@ -131,11 +124,9 @@ def clean_celery_periodic_tasks(): @shared_task( verbose_name=_('Create or update periodic tasks'), description=_( - """ - With version iterations, new tasks may be added, or task names and execution times may + """With version iterations, new tasks may be added, or task names and execution times may be modified. Therefore, upon system startup, tasks will be registered or the parameters - of scheduled tasks will be updated - """ + of scheduled tasks will be updated""" ) ) @after_app_ready_start @@ -148,10 +139,8 @@ def create_or_update_registered_periodic_tasks(): @shared_task( verbose_name=_("Periodic check service performance"), description=_( - """ - Check every hour whether each component is offline and whether the CPU, memory, - and disk usage exceed the thresholds, and send an alert message to the administrator - """ + """Check every hour whether each component is offline and whether the CPU, memory, + and disk usage exceed the thresholds, and send an alert message to the administrator""" ) ) @register_as_period_task(interval=3600) @@ -162,12 +151,10 @@ def check_server_performance_period(): @shared_task( verbose_name=_("Clean up unexpected jobs"), description=_( - """ - Due to exceptions caused by executing adhoc and playbooks in the Job Center, + """Due to exceptions caused by executing adhoc and playbooks in the Job Center, which result in the task status not being updated, the system will clean up abnormal jobs that have not been completed for more than 3 hours every hour and mark these tasks as - failed - """ + failed""" ) ) @register_as_period_task(interval=3600) @@ -179,12 +166,10 @@ def clean_up_unexpected_jobs(): @shared_task( verbose_name=_('Clean job_execution db record'), description=_( - """ - Due to the execution of adhoc and playbooks in the Job Center, execution records will + """Due to the execution of adhoc and playbooks in the Job Center, execution records will be generated. The system will clean up records that exceed the retention period every day at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - - Job execution retention days' - """ + Job execution retention days'""" ) ) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) diff --git a/apps/perms/tasks.py b/apps/perms/tasks.py index d9e45a9f1..f52348060 100644 --- a/apps/perms/tasks.py +++ b/apps/perms/tasks.py @@ -27,12 +27,10 @@ logger = get_logger(__file__) @shared_task( verbose_name=_('Check asset permission expired'), description=_( - """ - The cache of organizational collections, which have completed user authorization tree + """The cache of organizational collections, which have completed user authorization tree construction, will expire. Therefore, expired collections need to be cleared from the cache, and this task will be executed periodically based on the time interval specified - by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt - """ + by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt""" ) ) @register_as_period_task(interval=settings.PERM_EXPIRED_CHECK_PERIODIC) @@ -50,12 +48,10 @@ def check_asset_permission_expired(): @shared_task( verbose_name=_('Send asset permission expired notification'), description=_( - """ - Check every day at 10 a.m. and send a notification message to users associated with + """Check every day at 10 a.m. and send a notification message to users associated with assets whose authorization is about to expire, as well as to the organization's administrators, 3 days in advance, to remind them that the asset authorization will - expire in a few days - """ + expire in a few days""" ) ) @register_as_period_task(crontab=CRONTAB_AT_AM_TEN) diff --git a/apps/settings/tasks/ldap.py b/apps/settings/tasks/ldap.py index 8a455cfaa..6694cf54c 100644 --- a/apps/settings/tasks/ldap.py +++ b/apps/settings/tasks/ldap.py @@ -1,5 +1,6 @@ # coding: utf-8 import time + from celery import shared_task from django.conf import settings from django.utils.translation import gettext_lazy as _ @@ -8,7 +9,7 @@ from common.utils import get_logger from common.utils.timezone import local_now_display from ops.celery.decorator import after_app_ready_start from ops.celery.utils import ( - create_or_update_celery_periodic_tasks, disable_celery_periodic_task + create_or_update_celery_periodic_tasks ) from orgs.models import Organization from settings.notifications import LDAPImportMessage @@ -71,9 +72,7 @@ def perform_import(category, util_server): @shared_task( verbose_name=_('Periodic import ldap user'), description=_( - """ - When LDAP auto-sync is configured, this task will be invoked to synchronize users - """ + "When LDAP auto-sync is configured, this task will be invoked to synchronize users" ) ) def import_ldap_user(): @@ -83,9 +82,7 @@ def import_ldap_user(): @shared_task( verbose_name=_('Periodic import ldap ha user'), description=_( - """ - When LDAP auto-sync is configured, this task will be invoked to synchronize users - """ + "When LDAP auto-sync is configured, this task will be invoked to synchronize users" ) ) def import_ldap_ha_user(): @@ -119,10 +116,8 @@ def register_periodic_task(task_name, task_func, interval_key, enabled_key, cron @shared_task( verbose_name=_('Registration periodic import ldap user task'), description=_( - """ - When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task - will be re-registered or updated, and this task will be invoked - """ + """When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task + will be re-registered or updated, and this task will be invoked""" ) ) @after_app_ready_start @@ -137,10 +132,8 @@ def import_ldap_user_periodic(**kwargs): @shared_task( verbose_name=_('Registration periodic import ldap ha user task'), description=_( - """ - When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task - will be re-registered or updated, and this task will be invoked - """ + """When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task + will be re-registered or updated, and this task will be invoked""" ) ) @after_app_ready_start diff --git a/apps/terminal/tasks.py b/apps/terminal/tasks.py index 4ed25b0f0..dc60f59c3 100644 --- a/apps/terminal/tasks.py +++ b/apps/terminal/tasks.py @@ -42,10 +42,8 @@ def delete_terminal_status_period(): @shared_task( verbose_name=_('Clean orphan session'), description=_( - """ - Check every 10 minutes for asset connection sessions that have been inactive for 3 - minutes and mark these sessions as completed - """ + """Check every 10 minutes for asset connection sessions that have been inactive for 3 + minutes and mark these sessions as completed""" ) ) @register_as_period_task(interval=600) @@ -69,10 +67,8 @@ def clean_orphan_session(): @shared_task( verbose_name=_('Upload session replay to external storage'), description=_( - """ - If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and - recordings will be uploaded to external storage - """ + """If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and + recordings will be uploaded to external storage""" ) ) def upload_session_replay_to_external_storage(session_id): @@ -106,10 +102,8 @@ def upload_session_replay_to_external_storage(session_id): verbose_name=_('Run applet host deployment'), activity_callback=lambda self, did, *args, **kwargs: ([did],), description=_( - """ - When deploying from the remote application publisher details page, and the 'Deploy' - button is clicked, this task will be executed - """ + """When deploying from the remote application publisher details page, and the 'Deploy' + button is clicked, this task will be executed""" ) ) def run_applet_host_deployment(did, install_applets): @@ -122,10 +116,8 @@ def run_applet_host_deployment(did, install_applets): verbose_name=_('Install applet'), activity_callback=lambda self, ids, applet_id, *args, **kwargs: (ids,), description=_( - """ - When the 'Deploy' button is clicked in the 'Remote Application' section of the remote - application publisher details page, this task will be executed - """ + """When the 'Deploy' button is clicked in the 'Remote Application' section of the remote + application publisher details page, this task will be executed""" ) ) def run_applet_host_deployment_install_applet(ids, applet_id): @@ -139,10 +131,8 @@ def run_applet_host_deployment_install_applet(ids, applet_id): verbose_name=_('Uninstall applet'), activity_callback=lambda self, ids, applet_id, *args, **kwargs: (ids,), description=_( - """ - When the 'Uninstall' button is clicked in the 'Remote Application' section of the - remote application publisher details page, this task will be executed - """ + """When the 'Uninstall' button is clicked in the 'Remote Application' section of the + remote application publisher details page, this task will be executed""" ) ) def run_applet_host_deployment_uninstall_applet(ids, applet_id): @@ -156,10 +146,8 @@ def run_applet_host_deployment_uninstall_applet(ids, applet_id): verbose_name=_('Generate applet host accounts'), activity_callback=lambda self, host_id, *args, **kwargs: ([host_id],), description=_( - """ - When a remote publishing server is created and an account needs to be created - automatically, this task will be executed - """ + """When a remote publishing server is created and an account needs to be created + automatically, this task will be executed""" ) ) def applet_host_generate_accounts(host_id): @@ -174,11 +162,9 @@ def applet_host_generate_accounts(host_id): @shared_task( verbose_name=_('Check command replay storage connectivity'), description=_( - """ - Check every day at midnight whether the external storage for commands and recordings + """Check every day at midnight whether the external storage for commands and recordings is accessible. If it is not accessible, send a notification to the recipients specified - in 'System Settings - Notifications - Subscription - Storage - Connectivity' - """ + in 'System Settings - Notifications - Subscription - Storage - Connectivity'""" ) ) @register_as_period_task(crontab='0 0 * * *') diff --git a/apps/users/signal_handlers.py b/apps/users/signal_handlers.py index ae3117ef3..91445f799 100644 --- a/apps/users/signal_handlers.py +++ b/apps/users/signal_handlers.py @@ -195,10 +195,8 @@ def on_ldap_create_user(sender, user, ldap_user, **kwargs): @shared_task( verbose_name=_('Clean up expired user sessions'), description=_( - """ - After logging in via the web, a user session record is created. At 2 a.m. every day, - the system cleans up inactive user devices - """ + """After logging in via the web, a user session record is created. At 2 a.m. every day, + the system cleans up inactive user devices""" ) ) @register_as_period_task(crontab=CRONTAB_AT_AM_TWO) diff --git a/apps/users/tasks.py b/apps/users/tasks.py index a9ba74a4d..97526f1df 100644 --- a/apps/users/tasks.py +++ b/apps/users/tasks.py @@ -25,10 +25,8 @@ logger = get_logger(__file__) @shared_task( verbose_name=_('Check password expired'), description=_( - """ - Check every day at 10 AM whether the passwords of users in the system are expired, - and send a notification 5 days in advance - """ + """Check every day at 10 AM whether the passwords of users in the system are expired, + and send a notification 5 days in advance""" ) ) def check_password_expired(): @@ -47,11 +45,9 @@ def check_password_expired(): @shared_task( verbose_name=_('Periodic check password expired'), description=_( - """ - With version iterations, new tasks may be added, or task names and execution times may + """With version iterations, new tasks may be added, or task names and execution times may be modified. Therefore, upon system startup, it is necessary to register or update the - parameters of the task that checks if passwords have expired - """ + parameters of the task that checks if passwords have expired""" ) ) @after_app_ready_start @@ -70,10 +66,8 @@ def check_password_expired_periodic(): @shared_task( verbose_name=_('Check user expired'), description=_( - """ - Check every day at 10 AM whether the users in the system are expired, and send a - notification 5 days in advance - """ + """Check every day at 10 AM whether the users in the system are expired, and send a + notification 5 days in advance""" ) ) def check_user_expired(): @@ -95,11 +89,9 @@ def check_user_expired(): @shared_task( verbose_name=_('Periodic check user expired'), description=_( - """ - With version iterations, new tasks may be added, or task names and execution times may + """With version iterations, new tasks may be added, or task names and execution times may be modified. Therefore, upon system startup, it is necessary to register or update the - parameters of the task that checks if users have expired - """ + parameters of the task that checks if users have expired""" ) ) @after_app_ready_start @@ -118,11 +110,9 @@ def check_user_expired_periodic(): @shared_task( verbose_name=_('Check unused users'), description=_( - """ - At 2 a.m. every day, according to the configuration in "System Settings - Security - + """At 2 a.m. every day, according to the configuration in "System Settings - Security - Auth security - Auto disable threshold" users who have not logged in or whose API keys - have not been used for a long time will be disabled - """ + have not been used for a long time will be disabled""" ) ) @register_as_period_task(crontab=CRONTAB_AT_PM_TWO) From 9cb9e7328bd143248b34bb1c8c1f92fd53dda86b Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Fri, 13 Sep 2024 18:32:06 +0800 Subject: [PATCH 57/98] fix: Translate Account already exists --- apps/accounts/serializers/account/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/accounts/serializers/account/account.py b/apps/accounts/serializers/account/account.py index 691961f3e..74c8ce3b1 100644 --- a/apps/accounts/serializers/account/account.py +++ b/apps/accounts/serializers/account/account.py @@ -178,7 +178,7 @@ class AccountCreateUpdateSerializerMixin(serializers.Serializer): instance.save() return instance, 'updated' else: - raise serializers.ValidationError('Account already exists') + raise serializers.ValidationError(_('Account already exists')) def create(self, validated_data): push_now = validated_data.pop('push_now', None) From e997236159cb649244663518d3d3f6011389f4b1 Mon Sep 17 00:00:00 2001 From: Bai Date: Fri, 13 Sep 2024 17:47:57 +0800 Subject: [PATCH 58/98] perf: Modify gunicorn log file rotate yesterday dir --- apps/jumpserver/rewriting/logging.py | 20 ++++++++++++++++++++ apps/jumpserver/settings/logging.py | 21 +++++++++------------ 2 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 apps/jumpserver/rewriting/logging.py diff --git a/apps/jumpserver/rewriting/logging.py b/apps/jumpserver/rewriting/logging.py new file mode 100644 index 000000000..3a7d1c0ff --- /dev/null +++ b/apps/jumpserver/rewriting/logging.py @@ -0,0 +1,20 @@ +import os +from logging.handlers import TimedRotatingFileHandler +from datetime import datetime, timedelta + + +class DailyTimedRotatingFileHandler(TimedRotatingFileHandler): + def rotator(self, source, dest): + """ Override the original method to rotate the log file daily.""" + dest = self._get_rotate_dest_filename(source) + if os.path.exists(source) and not os.path.exists(dest): + # 存在多个服务进程时, 保证只有一个进程成功 rotate + os.rename(source, dest) + + @staticmethod + def _get_rotate_dest_filename(source): + date_yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') + path = [os.path.dirname(source), date_yesterday, os.path.basename(source)] + filename = os.path.join(*path) + os.makedirs(os.path.dirname(filename), exist_ok=True) + return filename diff --git a/apps/jumpserver/settings/logging.py b/apps/jumpserver/settings/logging.py index 4fad5f641..74585d168 100644 --- a/apps/jumpserver/settings/logging.py +++ b/apps/jumpserver/settings/logging.py @@ -50,37 +50,33 @@ LOGGING = { 'file': { 'encoding': 'utf8', 'level': 'DEBUG', - 'class': 'logging.handlers.RotatingFileHandler', - 'maxBytes': 1024 * 1024 * 100, - 'backupCount': 7, + 'class': 'jumpserver.rewriting.logging.DailyTimedRotatingFileHandler', + 'when': 'midnight', 'formatter': 'main', 'filename': JUMPSERVER_LOG_FILE, }, 'ansible_logs': { 'encoding': 'utf8', 'level': 'DEBUG', - 'class': 'logging.handlers.RotatingFileHandler', + 'class': 'jumpserver.rewriting.logging.DailyTimedRotatingFileHandler', + 'when': 'midnight', 'formatter': 'main', - 'maxBytes': 1024 * 1024 * 100, - 'backupCount': 7, 'filename': ANSIBLE_LOG_FILE, }, 'drf_exception': { 'encoding': 'utf8', 'level': 'DEBUG', - 'class': 'logging.handlers.RotatingFileHandler', + 'class': 'jumpserver.rewriting.logging.DailyTimedRotatingFileHandler', + 'when': 'midnight', 'formatter': 'exception', - 'maxBytes': 1024 * 1024 * 100, - 'backupCount': 7, 'filename': DRF_EXCEPTION_LOG_FILE, }, 'unexpected_exception': { 'encoding': 'utf8', 'level': 'DEBUG', - 'class': 'logging.handlers.RotatingFileHandler', + 'class': 'jumpserver.rewriting.logging.DailyTimedRotatingFileHandler', + 'when': 'midnight', 'formatter': 'exception', - 'maxBytes': 1024 * 1024 * 100, - 'backupCount': 7, 'filename': UNEXPECTED_EXCEPTION_LOG_FILE, }, 'syslog': { @@ -155,3 +151,4 @@ if CONFIG.SYSLOG_ADDR != '' and len(CONFIG.SYSLOG_ADDR.split(':')) == 2: if not os.path.isdir(LOG_DIR): os.makedirs(LOG_DIR, mode=0o755) + From 50f075cc7ecb7c2ee3024a1cdebe11d58316de20 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 13 Sep 2024 14:35:12 +0800 Subject: [PATCH 59/98] fix: Historical sessions download failed --- apps/terminal/serializers/session.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/terminal/serializers/session.py b/apps/terminal/serializers/session.py index 91928431d..99c4e9511 100644 --- a/apps/terminal/serializers/session.py +++ b/apps/terminal/serializers/session.py @@ -64,8 +64,9 @@ class SessionSerializer(BulkOrgResourceModelSerializer): return fields def pop_fields_if_need(self, fields): - if self.context['request'].method != "GET": - fields.pop("command_amount") + request = self.context.get('request') + if request and request.method != 'GET': + fields.pop("command_amount", None) def validate_asset(self, value): max_length = self.Meta.model.asset.field.max_length From 5beebaf51ca366aad51d5926c1e343c318bfa10b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 13 Sep 2024 06:52:06 +0000 Subject: [PATCH 60/98] perf: Update Dockerfile with new base image tag --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 81bf9261c..718feddb9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM jumpserver/core-base:20240912_103924 AS stage-build +FROM jumpserver/core-base:20240913_063833 AS stage-build ARG VERSION From b042f006889fa5fb95e12ec5ad319efd48009c94 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 13 Sep 2024 18:16:27 +0800 Subject: [PATCH 61/98] fix: command search input error --- apps/common/plugins/es.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/common/plugins/es.py b/apps/common/plugins/es.py index c4b2d0921..df53d3f46 100644 --- a/apps/common/plugins/es.py +++ b/apps/common/plugins/es.py @@ -409,8 +409,13 @@ class QuerySet(DJQuerySet): if not filter_calls: return {} names, multi_args, multi_kwargs = zip(*filter_calls) + args = { + key: value + for arg in multi_args if arg + for key, value in arg[0].children + } kwargs = reduce(lambda x, y: {**x, **y}, multi_kwargs, {}) - + kwargs.update(args) striped_kwargs = {} for k, v in kwargs.items(): k = k.replace('__exact', '') From ab29df5991d6e133724dfe49509ff47a94f2df0a Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Fri, 13 Sep 2024 19:02:50 +0800 Subject: [PATCH 62/98] fix: command search input error --- apps/i18n/core/zh/LC_MESSAGES/django.po | 41 ++++++++++++++----------- apps/users/tasks.py | 4 +-- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 1138d59e2..c5644a78e 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 17:38+0800\n" +"POT-Creation-Date: 2024-09-13 18:57+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -853,6 +853,11 @@ msgstr "参数" msgid "Exist policy" msgstr "账号存在策略" +#: accounts/serializers/account/account.py:181 +#: accounts/serializers/account/account.py:339 +msgid "Account already exists" +msgstr "账号已存在" + #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 @@ -913,10 +918,6 @@ msgstr "已修改" msgid "Assets" msgstr "资产" -#: accounts/serializers/account/account.py:339 -msgid "Account already exists" -msgstr "账号已存在" - #: accounts/serializers/account/account.py:389 #, python-format msgid "Asset does not support this secret type: %s" @@ -5065,7 +5066,7 @@ msgid "" " of scheduled tasks will be updated" msgstr "" "随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动" -"时,,将会注册任务或者更新定时任务参数" +"时,将会注册任务或者更新定时任务参数" #: ops/tasks.py:140 msgid "Periodic check service performance" @@ -5112,7 +5113,7 @@ msgid "" "Regular clean-up - \n" " Job execution retention days'" msgstr "" -"由于作业中心执行快捷命令,playbook,会产生j执行记录,系统会根据系统设置-任务" +"由于作业中心执行快捷命令,playbook,会产生执行记录,系统会根据系统设置-任务" "列表-定期清理-作业中心执行历史配置,每天凌晨2点对超出保存时间的记录进行清理" #: ops/templates/ops/celery_task_log.html:4 @@ -9326,10 +9327,10 @@ msgstr "校验用户已过期" #: users/tasks.py:69 msgid "" -"Check every day at 10 AM whether the users in the system are expired, and " +"Check every day at 2 p.m whether the users in the system are expired, and " "send a \n" " notification 5 days in advance" -msgstr "每天上午10点检查,系统中的用户是否过期,提前5天发送通知" +msgstr "每天下午2点检查,系统中的用户是否过期,提前5天发送通知" #: users/tasks.py:90 msgid "Periodic check user expired" @@ -9352,13 +9353,13 @@ msgstr "检查未使用的用户" #: users/tasks.py:113 msgid "" -"At 2 a.m. every day, according to the configuration in \"System Settings - " +"At 2 p.m. every day, according to the configuration in \"System Settings - " "Security - \n" " Auth security - Auto disable threshold\" users who have not logged " "in or whose API keys \n" " have not been used for a long time will be disabled" msgstr "" -"每天凌晨2点,根据系统配置-安全设置-不活跃用户自动禁用配置,对长时间不登录或" +"每天下午2点,根据系统配置-安全设置-不活跃用户自动禁用配置,对长时间不登录或" "api_key不使用的用户进行禁用" #: users/tasks.py:157 @@ -10327,21 +10328,25 @@ msgstr "实例个数" #: xpack/plugins/cloud/tasks.py:33 msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are " -"performed" +"\n" +" Execute this task when manually or scheduled cloud synchronization " +"tasks are performed\n" +" " msgstr "手动,定时执行云同步任务时执行该任务" -#: xpack/plugins/cloud/tasks.py:50 +#: xpack/plugins/cloud/tasks.py:52 msgid "Period clean sync instance task execution" msgstr "定期清除同步实例任务执行记录" -#: xpack/plugins/cloud/tasks.py:52 +#: xpack/plugins/cloud/tasks.py:54 msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - " -"Regular \n" +"\n" +" Every day, according to the configuration in \"System Settings - " +"Tasks - Regular \n" " clean-up - Cloud sync task history retention days\" the system will " "clean up the execution \n" -" records generated by cloud synchronization" +" records generated by cloud synchronization\n" +" " msgstr "" "每天根据系统设置-任务列表-定期清理配置-云同步记录配置,对云同步产生的执行记录" "进行清理" diff --git a/apps/users/tasks.py b/apps/users/tasks.py index 97526f1df..d84de6727 100644 --- a/apps/users/tasks.py +++ b/apps/users/tasks.py @@ -66,7 +66,7 @@ def check_password_expired_periodic(): @shared_task( verbose_name=_('Check user expired'), description=_( - """Check every day at 10 AM whether the users in the system are expired, and send a + """Check every day at 2 p.m whether the users in the system are expired, and send a notification 5 days in advance""" ) ) @@ -110,7 +110,7 @@ def check_user_expired_periodic(): @shared_task( verbose_name=_('Check unused users'), description=_( - """At 2 a.m. every day, according to the configuration in "System Settings - Security - + """At 2 p.m. every day, according to the configuration in "System Settings - Security - Auth security - Auto disable threshold" users who have not logged in or whose API keys have not been used for a long time will be disabled""" ) From 3eee84a34e97746f9bb41d7f8d8d25a4dd61e8a2 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 12 Sep 2024 17:37:22 +0800 Subject: [PATCH 63/98] fix: delete ReplayStorage error --- apps/terminal/models/component/storage.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/terminal/models/component/storage.py b/apps/terminal/models/component/storage.py index 985fc1012..fb714d35b 100644 --- a/apps/terminal/models/component/storage.py +++ b/apps/terminal/models/component/storage.py @@ -127,9 +127,7 @@ class CommandStorage(CommonStorageModelMixin, JMSBaseModel): logger.error(f"Command storage `{self.type}` not support") return Command.objects.none() - def save( - self, force_insert=False, force_update=False, using=None, update_fields=None - ): + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): super().save( force_insert=force_insert, force_update=force_update, @@ -205,10 +203,10 @@ class ReplayStorage(CommonStorageModelMixin, JMSBaseModel): src = os.path.join(settings.BASE_DIR, "common", target) return storage.is_valid(src, target) - def is_use(self): + def used_by(self): return Terminal.objects.filter( replay_storage=self.name, is_deleted=False - ).exists() + ) class Meta: verbose_name = _("Replay storage") From e531b040efcbdda9ed7d1c78cc5d64211b99e7c5 Mon Sep 17 00:00:00 2001 From: wangruidong Date: Fri, 13 Sep 2024 22:24:07 +0800 Subject: [PATCH 64/98] fix: compilemessages error --- apps/i18n/core/zh/LC_MESSAGES/django.po | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index c5644a78e..8b5e8e162 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -10332,7 +10332,9 @@ msgid "" " Execute this task when manually or scheduled cloud synchronization " "tasks are performed\n" " " -msgstr "手动,定时执行云同步任务时执行该任务" +msgstr "" +"\n" +"手动,定时执行云同步任务时执行该任务" #: xpack/plugins/cloud/tasks.py:52 msgid "Period clean sync instance task execution" @@ -10348,6 +10350,7 @@ msgid "" " records generated by cloud synchronization\n" " " msgstr "" +"\n" "每天根据系统设置-任务列表-定期清理配置-云同步记录配置,对云同步产生的执行记录" "进行清理" From 3828e89cf88bc7bb1eaa7e8940694d6429a270cb Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Sat, 14 Sep 2024 14:45:59 +0800 Subject: [PATCH 65/98] fix: Windows rdp ping fail --- apps/libs/ansible/modules/rdp_ping.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/libs/ansible/modules/rdp_ping.py b/apps/libs/ansible/modules/rdp_ping.py index bfbac2211..6271fc859 100644 --- a/apps/libs/ansible/modules/rdp_ping.py +++ b/apps/libs/ansible/modules/rdp_ping.py @@ -70,8 +70,8 @@ class RDPConnectionManager: connection_details = { 'hostname': self.params['login_host'], 'port': self.params['login_port'], - 'username': self.params['username'], - 'password': self.params['password'] + 'username': self.params['login_user'], + 'password': self.params['login_password'] } return connection_details From fa6b4a5b63c717d1b028c0d092a1e1fc0da23f37 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Sat, 14 Sep 2024 15:32:52 +0800 Subject: [PATCH 66/98] perf: KOKO zh translate --- apps/i18n/koko/zh.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/i18n/koko/zh.json b/apps/i18n/koko/zh.json index 450305a04..db0cc86f2 100644 --- a/apps/i18n/koko/zh.json +++ b/apps/i18n/koko/zh.json @@ -63,6 +63,7 @@ "WaitFileTransfer": "等待文件传输结束", "WebSocketClosed": "WebSocket 已关闭", "Reconnect": "重新连接", + "Writable": "可写", "Close Current Tab": "关闭当前", "Close All Tabs": "关闭所有", "Clone Connect": "复制窗口", From 3dd828d70394fe3fb2b99d62a3ec5a0394b25b98 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 15:27:17 +0800 Subject: [PATCH 67/98] perf: workflow build base image --- .github/workflows/build-base-image.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 0c3750575..087336688 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -4,10 +4,6 @@ on: push: branches: - 'pr*' - paths: - - 'poetry.lock' - - 'pyproject.toml' - - 'Dockerfile-base' jobs: build-and-push: @@ -17,6 +13,15 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Check for changes + run: | + if git diff --name-only HEAD^ dev | grep -E 'poetry.lock|pyproject.toml|Dockerfile-base|package.json|go.mod|yarn.lock|pom.xml|install_deps.sh'; then + echo "Changes detected, proceeding with the job." + else + echo "No relevant changes detected, exiting." + exit 0 + fi + - name: Set up QEMU uses: docker/setup-qemu-action@v3 From 8b0073333bca14abc7cf5d529ab852ae7f9b8740 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 16:12:32 +0800 Subject: [PATCH 68/98] perf: change git workflow --- .github/workflows/build-base-image.yml | 27 ++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 087336688..1b3366b7c 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -6,22 +6,29 @@ on: - 'pr*' jobs: - build-and-push: + check_change: runs-on: ubuntu-latest - + outputs: + should_skip: ${{ steps.set_skip_flag.outputs.should_skip }} # 输出 should_skip 标志 steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Check for changes + - name: Check conditions + id: set_skip_flag run: | - if git diff --name-only HEAD^ dev | grep -E 'poetry.lock|pyproject.toml|Dockerfile-base|package.json|go.mod|yarn.lock|pom.xml|install_deps.sh'; then - echo "Changes detected, proceeding with the job." + if git diff --name-only dev | grep -E 'poetry.lock|pyproject.toml|Dockerfile-base|package.json|go.mod|yarn.lock|pom.xml|install_deps.sh';then + echo "Found deps file changes" else - echo "No relevant changes detected, exiting." - exit 0 + echo "Not found deps file changes, skip build" + echo "::set-output name=should_skip::true" # 根据条件设置输出 fi + build-and-push: + runs-on: ubuntu-latest + needs: check_skip # 依赖 check_skip job 的执行结果 + if: needs.check_skip.outputs.should_skip != 'true' + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up QEMU uses: docker/setup-qemu-action@v3 From 534af0abf0a469fd47ba0ed7f2ddaf841386f8dc Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 16:28:26 +0800 Subject: [PATCH 69/98] perf: build workflow --- .github/workflows/build-base-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 1b3366b7c..70cb72159 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -23,8 +23,8 @@ jobs: build-and-push: runs-on: ubuntu-latest - needs: check_skip # 依赖 check_skip job 的执行结果 - if: needs.check_skip.outputs.should_skip != 'true' + needs: check_change # 依赖 check_skip job 的执行结果 + if: needs.check_change.outputs.should_skip != 'true' steps: - name: Checkout repository uses: actions/checkout@v4 From b54da7d3b38679350072dab5093114929fa4abe9 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 16:39:42 +0800 Subject: [PATCH 70/98] perf: workflow build base image --- .github/workflows/build-base-image.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 70cb72159..ef0d91cad 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -11,6 +11,9 @@ jobs: outputs: should_skip: ${{ steps.set_skip_flag.outputs.should_skip }} # 输出 should_skip 标志 steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Check conditions id: set_skip_flag run: | From 3bb51b39c41cd9113e52a51a55379ad0bcea6c15 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 16:49:59 +0800 Subject: [PATCH 71/98] perf: github action fetch branches --- .github/workflows/build-base-image.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index ef0d91cad..dec5b8466 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -6,13 +6,18 @@ on: - 'pr*' jobs: - check_change: + check-deps-change: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.set_skip_flag.outputs.should_skip }} # 输出 should_skip 标志 steps: - - name: Checkout repository - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v2 + with: + fetch-depth: 0 # 确保检出完整历史 + + - name: Fetch all branches + run: git fetch --all # 拉取所有分支 - name: Check conditions id: set_skip_flag @@ -26,8 +31,8 @@ jobs: build-and-push: runs-on: ubuntu-latest - needs: check_change # 依赖 check_skip job 的执行结果 - if: needs.check_change.outputs.should_skip != 'true' + needs: check-deps-change # 依赖 check_skip job 的执行结果 + if: needs.check-deps-change.outputs.should_skip != 'true' steps: - name: Checkout repository uses: actions/checkout@v4 From 24255b69eeebb028c4091e90407ead19f21d319d Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 16:56:41 +0800 Subject: [PATCH 72/98] perf: diff with head not dev --- .github/workflows/build-base-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index dec5b8466..91450e4de 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -22,7 +22,7 @@ jobs: - name: Check conditions id: set_skip_flag run: | - if git diff --name-only dev | grep -E 'poetry.lock|pyproject.toml|Dockerfile-base|package.json|go.mod|yarn.lock|pom.xml|install_deps.sh';then + if git diff --name-only HEAD^ HEAD | grep -E 'poetry.lock|pyproject.toml|Dockerfile-base|package.json|go.mod|yarn.lock|pom.xml|install_deps.sh';then echo "Found deps file changes" else echo "Not found deps file changes, skip build" From b125297c37c2d148dad14d92901e1989df2cb03a Mon Sep 17 00:00:00 2001 From: Bai Date: Sat, 14 Sep 2024 16:53:20 +0800 Subject: [PATCH 73/98] feat: GitHub Actions add compilemessages checked --- .github/workflows/check-compilemessages.yml | 49 +++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/check-compilemessages.yml diff --git a/.github/workflows/check-compilemessages.yml b/.github/workflows/check-compilemessages.yml new file mode 100644 index 000000000..089fe3279 --- /dev/null +++ b/.github/workflows/check-compilemessages.yml @@ -0,0 +1,49 @@ +name: Check I18n files CompileMessages + +on: + pull_request: + branches: + - 'dev' + paths: + - 'apps/i18n/core/**/*.po' + types: + - opened + - synchronize + - reopened +jobs: + compile-messages-check: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install system dependencies + run: sudo apt-get update && sudo apt-get install -y libsasl2-dev python3-dev libldap2-dev libssl-dev gettext + + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3 - + echo "export PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV + + - name: Install dependencies + run: | + poetry install + echo "VENV_PATH=$(poetry env info --path)" >> $GITHUB_ENV + + - name: Set up environment + run: | + cp config_example.yml config.yml + sed -i 's/SECRET_KEY:.*/SECRET_KEY: ABC/' config.yml + sed -i 's/BOOTSTRAP_TOKEN:.*/BOOTSTRAP_TOKEN: ABC/' config.yml + + - name: Run compilemessages + run: | + source $VENV_PATH/bin/activate + cd apps + python manage.py compilemessages From 41a3e8924884235b5cb1a5bfdc6b99470217a190 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Sat, 14 Sep 2024 17:21:49 +0800 Subject: [PATCH 74/98] chore: using pull pull request not push event (#14164) * perf: diff with head not dev * chore: using pull pull request not push event --------- Co-authored-by: ibuler --- .github/workflows/build-base-image.yml | 43 ++++++++++---------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 91450e4de..4dd1902fb 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -1,38 +1,27 @@ name: Build and Push Base Image on: - push: + pull_request: branches: - - 'pr*' + - 'dev' + - 'v*' + paths: + - poetry.lock + - pyproject.toml + - Dockerfile-base + - package.json + - go.mod + - yarn.lock + - pom.xml + - install_deps.sh + types: + - opened + - synchronize + - reopened jobs: - check-deps-change: - runs-on: ubuntu-latest - outputs: - should_skip: ${{ steps.set_skip_flag.outputs.should_skip }} # 输出 should_skip 标志 - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 # 确保检出完整历史 - - - name: Fetch all branches - run: git fetch --all # 拉取所有分支 - - - name: Check conditions - id: set_skip_flag - run: | - if git diff --name-only HEAD^ HEAD | grep -E 'poetry.lock|pyproject.toml|Dockerfile-base|package.json|go.mod|yarn.lock|pom.xml|install_deps.sh';then - echo "Found deps file changes" - else - echo "Not found deps file changes, skip build" - echo "::set-output name=should_skip::true" # 根据条件设置输出 - fi - build-and-push: runs-on: ubuntu-latest - needs: check-deps-change # 依赖 check_skip job 的执行结果 - if: needs.check-deps-change.outputs.should_skip != 'true' steps: - name: Checkout repository uses: actions/checkout@v4 From 2fd50d242529d2a031c1f1c9f5fd0acb52db30e3 Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 14 Sep 2024 17:32:56 +0800 Subject: [PATCH 75/98] perf: update compilemessages check ci --- .github/workflows/check-compilemessages.yml | 38 ++++++--------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/.github/workflows/check-compilemessages.yml b/.github/workflows/check-compilemessages.yml index 089fe3279..fd032b99b 100644 --- a/.github/workflows/check-compilemessages.yml +++ b/.github/workflows/check-compilemessages.yml @@ -18,32 +18,14 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.11' - - - name: Install system dependencies - run: sudo apt-get update && sudo apt-get install -y libsasl2-dev python3-dev libldap2-dev libssl-dev gettext - - - name: Install Poetry - run: | - curl -sSL https://install.python-poetry.org | python3 - - echo "export PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - - name: Install dependencies - run: | - poetry install - echo "VENV_PATH=$(poetry env info --path)" >> $GITHUB_ENV - - - name: Set up environment - run: | - cp config_example.yml config.yml - sed -i 's/SECRET_KEY:.*/SECRET_KEY: ABC/' config.yml - sed -i 's/BOOTSTRAP_TOKEN:.*/BOOTSTRAP_TOKEN: ABC/' config.yml - - - name: Run compilemessages - run: | - source $VENV_PATH/bin/activate - cd apps - python manage.py compilemessages + - name: Build and check compilemessages + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64 + push: false + file: Dockerfile + target: stage-build + tags: jumpserver/core:stage-build From 7da82242fe880068e199e7c2ceb706f90dbf4d53 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 17:46:10 +0800 Subject: [PATCH 76/98] perf: github action workflow --- .github/workflows/build-base-image.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 4dd1902fb..764555294 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -62,6 +62,7 @@ jobs: run: | git config --global user.name 'github-actions[bot]' git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git checkout -b ${{ github.event.pull_request.head.ref }} git add Dockerfile git commit -m "perf: Update Dockerfile with new base image tag" git push From 134f1a440c3c0d36324b38933c151d98d7e4ad93 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 4 Sep 2024 19:13:33 +0800 Subject: [PATCH 77/98] perf: replay part file download --- apps/common/storage/base.py | 35 ++++++---- apps/common/storage/replay.py | 83 +++++++++++++++++++++++- apps/ops/signal_handlers.py | 3 +- apps/terminal/api/session/session.py | 38 +++++++---- apps/terminal/models/session/session.py | 38 ++++++++--- apps/terminal/serializers/session.py | 2 +- apps/terminal/signal_handlers/session.py | 2 +- apps/terminal/tasks.py | 21 ++++++ 8 files changed, 180 insertions(+), 42 deletions(-) diff --git a/apps/common/storage/base.py b/apps/common/storage/base.py index cb1d1b5b7..99ddc51ba 100644 --- a/apps/common/storage/base.py +++ b/apps/common/storage/base.py @@ -1,15 +1,32 @@ import os import jms_storage - from django.conf import settings +from django.core.files.storage import default_storage -from terminal.models import default_storage, ReplayStorage from common.utils import get_logger, make_dirs +from terminal.models import ReplayStorage logger = get_logger(__name__) +def get_multi_object_storage(): + replay_storages = ReplayStorage.objects.all() + configs = {} + for storage in replay_storages: + if storage.type_sftp: + continue + if storage.type_null_or_server: + continue + configs[storage.name] = storage.config + if settings.SERVER_REPLAY_STORAGE: + configs['SERVER_REPLAY_STORAGE'] = settings.SERVER_REPLAY_STORAGE + if not configs: + return None + storage = jms_storage.get_multi_object_storage(configs) + return storage + + class BaseStorageHandler(object): NAME = '' @@ -24,20 +41,10 @@ class BaseStorageHandler(object): raise NotImplementedError def download(self): - replay_storages = ReplayStorage.objects.all() - configs = {} - for storage in replay_storages: - if storage.type_sftp: - continue - if storage.type_null_or_server: - continue - configs[storage.name] = storage.config - if settings.SERVER_REPLAY_STORAGE: - configs['SERVER_REPLAY_STORAGE'] = settings.SERVER_REPLAY_STORAGE - if not configs: + storage = get_multi_object_storage() + if not storage: msg = f"Not found {self.NAME} file, and not remote storage set" return None, msg - storage = jms_storage.get_multi_object_storage(configs) remote_path, local_path = self.get_file_path(storage=storage) if not remote_path: diff --git a/apps/common/storage/replay.py b/apps/common/storage/replay.py index 63b58c6cd..de1a56e82 100644 --- a/apps/common/storage/replay.py +++ b/apps/common/storage/replay.py @@ -1,7 +1,15 @@ +import json +import os +import tarfile from itertools import chain -from terminal.models import default_storage -from .base import BaseStorageHandler +from django.core.files.storage import default_storage + +from common.utils import make_dirs, get_logger +from terminal.models import Session +from .base import BaseStorageHandler, get_multi_object_storage + +logger = get_logger(__name__) class ReplayStorageHandler(BaseStorageHandler): @@ -29,3 +37,74 @@ class ReplayStorageHandler(BaseStorageHandler): url = default_storage.url(_local_path) return _local_path, url return None, f'{self.NAME} not found.' + + +class SessionPartReplayStorageHandler(object): + Name = 'SessionPartReplayStorageHandler' + + def __init__(self, obj: Session): + self.obj = obj + + def find_local_part_file_path(self, part_filename): + local_path = self.obj.get_replay_part_file_local_storage_path(part_filename) + if default_storage.exists(local_path): + url = default_storage.url(local_path) + return local_path, url + return None, '{} not found.'.format(part_filename) + + def download_part_file(self, part_filename): + storage = get_multi_object_storage() + if not storage: + msg = "Not found {} file, and not remote storage set".format(part_filename) + return None, msg + local_path = self.obj.get_replay_part_file_local_storage_path(part_filename) + remote_path = self.obj.get_replay_part_file_relative_path(part_filename) + + # 保存到storage的路径 + target_path = os.path.join(default_storage.base_location, local_path) + + target_dir = os.path.dirname(target_path) + if not os.path.isdir(target_dir): + make_dirs(target_dir, exist_ok=True) + + ok, err = storage.download(remote_path, target_path) + if not ok: + msg = 'Failed download {} file: {}'.format(part_filename, err) + logger.error(msg) + return None, msg + url = default_storage.url(local_path) + return local_path, url + + def get_part_file_path_url(self, part_filename): + local_path, url = self.find_local_part_file_path(part_filename) + if local_path is None: + local_path, url = self.download_part_file(part_filename) + return local_path, url + + def prepare_offline_tar_file(self): + replay_meta_filename = '{}.replay.json'.format(self.obj.id) + meta_local_path, url_or_error = self.get_part_file_path_url(replay_meta_filename) + if not meta_local_path: + raise FileNotFoundError(f'{replay_meta_filename} not found: {url_or_error}') + meta_local_abs_path = os.path.join(default_storage.base_location, meta_local_path) + with open(meta_local_abs_path, 'r') as f: + meta_data = json.load(f) + if not meta_data: + raise FileNotFoundError(f'{replay_meta_filename} is empty') + part_filenames = [part_file.get('name') for part_file in meta_data.get('files', [])] + for part_filename in part_filenames: + if not part_filename: + continue + local_path, url_or_error = self.get_part_file_path_url(part_filename) + if not local_path: + raise FileNotFoundError(f'{part_filename} not found: {url_or_error}') + dir_path = os.path.dirname(meta_local_abs_path) + offline_filename = '{}.tar'.format(self.obj.id) + offline_filename_abs_path = os.path.join(dir_path, offline_filename) + if not os.path.exists(offline_filename_abs_path): + with tarfile.open(offline_filename_abs_path, 'w') as f: + f.add(str(meta_local_abs_path), arcname=replay_meta_filename) + for part_filename in part_filenames: + local_abs_path = os.path.join(dir_path, part_filename) + f.add(local_abs_path, arcname=part_filename) + return open(offline_filename_abs_path, 'rb') diff --git a/apps/ops/signal_handlers.py b/apps/ops/signal_handlers.py index 3fe956bf0..a3361e035 100644 --- a/apps/ops/signal_handlers.py +++ b/apps/ops/signal_handlers.py @@ -16,9 +16,9 @@ from common.signals import django_ready from common.utils.connection import RedisPubSub from jumpserver.utils import get_current_request from orgs.utils import get_current_org_id, set_current_org +from .ansible.runner import interface from .celery import app from .models import CeleryTaskExecution, CeleryTask, Job -from .ansible.runner import interface logger = get_logger(__name__) @@ -63,6 +63,7 @@ def check_registered_tasks(*args, **kwargs): 'common.utils.verify_code.send_sms_async', 'assets.tasks.nodes_amount.check_node_assets_amount_period_task', 'users.tasks.check_user_expired', 'orgs.tasks.refresh_org_cache_task', 'terminal.tasks.upload_session_replay_to_external_storage', 'terminal.tasks.clean_orphan_session', + 'terminal.tasks.upload_session_replay_file_to_external_storage', 'audits.tasks.clean_audits_log_period', 'authentication.tasks.clean_django_sessions' ] diff --git a/apps/terminal/api/session/session.py b/apps/terminal/api/session/session.py index 44b49615c..249b07602 100644 --- a/apps/terminal/api/session/session.py +++ b/apps/terminal/api/session/session.py @@ -23,7 +23,7 @@ from common.drf.filters import BaseFilterSet from common.drf.filters import DatetimeRangeFilterBackend from common.drf.renders import PassthroughRenderer from common.permissions import IsServiceAccount -from common.storage.replay import ReplayStorageHandler +from common.storage.replay import ReplayStorageHandler, SessionPartReplayStorageHandler from common.utils import data_to_json, is_uuid, i18n_fmt from common.utils import get_logger, get_object_or_none from common.views.mixins import RecordViewLogMixin @@ -124,33 +124,37 @@ class SessionViewSet(RecordViewLogMixin, OrgBulkModelViewSet): os.chdir(current_dir) return file - def get_storage(self): - return ReplayStorageHandler(self.get_object()) - @action(methods=[GET], detail=True, renderer_classes=(PassthroughRenderer,), url_path='replay/download', url_name='replay-download') def download(self, request, *args, **kwargs): - storage = self.get_storage() + session = self.get_object() + storage = ReplayStorageHandler(session) local_path, url = storage.get_file_path_url() if local_path is None: # url => error message return Response({'error': url}, status=404) - file = self.prepare_offline_file(storage.obj, local_path) + # 如果获取的录像文件类型是 .replay.json 则使用 part 的方式下载 + if url.endswith('.replay.json'): + # part 的方式录像存储, 通过 part_storage 的方式下载 + part_storage = SessionPartReplayStorageHandler(session) + file = part_storage.prepare_offline_tar_file() + else: + file = self.prepare_offline_file(session, local_path) response = FileResponse(file) response['Content-Type'] = 'application/octet-stream' # 这里要注意哦,网上查到的方法都是response['Content-Disposition']='attachment;filename="filename.py"', # 但是如果文件名是英文名没问题,如果文件名包含中文,下载下来的文件名会被改为url中的path。 - filename = escape_uri_path('{}.tar'.format(storage.obj.id)) + filename = escape_uri_path('{}.tar'.format(session.id)) disposition = "attachment; filename*=UTF-8''{}".format(filename) response["Content-Disposition"] = disposition detail = i18n_fmt( - REPLAY_OP, self.request.user, _('Download'), str(storage.obj) + REPLAY_OP, self.request.user, _('Download'), str(session) ) self.record_logs( - [storage.obj.asset_id], ActionChoices.download, detail, - model=Session, resource_display=str(storage.obj) + [session.asset_id], ActionChoices.download, detail, + model=Session, resource_display=str(session) ) return response @@ -197,7 +201,7 @@ class SessionViewSet(RecordViewLogMixin, OrgBulkModelViewSet): # so we need to use select_for_update only for have not prefetch_related and annotate queryset = queryset.select_for_update() return queryset - + def perform_create(self, serializer): if hasattr(self.request.user, 'terminal'): serializer.validated_data["terminal"] = self.request.user.terminal @@ -245,6 +249,9 @@ class SessionReplayViewSet(AsyncApiMixin, RecordViewLogMixin, viewsets.ViewSet): tp = 'asciicast' elif url.endswith('.replay.mp4'): tp = 'mp4' + elif url.endswith('replay.json'): + # 新版本将返回元数据信息 + tp = 'parts' elif (getattr(session.terminal, 'type', None) in all_guacamole_types) or \ (session.protocol in ('rdp', 'vnc')): tp = 'guacamole' @@ -281,9 +288,14 @@ class SessionReplayViewSet(AsyncApiMixin, RecordViewLogMixin, viewsets.ViewSet): def retrieve(self, request, *args, **kwargs): session_id = kwargs.get('pk') session = get_object_or_404(Session, id=session_id) + part_filename = request.query_params.get('part_filename') + if part_filename: + storage = SessionPartReplayStorageHandler(session) + local_path, url = storage.get_part_file_path_url(part_filename) + else: + storage = ReplayStorageHandler(session) + local_path, url = storage.get_file_path_url() - storage = ReplayStorageHandler(session) - local_path, url = storage.get_file_path_url() if local_path is None: # url => error message return Response({"error": url}, status=404) diff --git a/apps/terminal/models/session/session.py b/apps/terminal/models/session/session.py index ab9acaed7..fa47ca36b 100644 --- a/apps/terminal/models/session/session.py +++ b/apps/terminal/models/session/session.py @@ -51,7 +51,7 @@ class Session(OrgModelMixin): upload_to = 'replay' ACTIVE_CACHE_KEY_PREFIX = 'SESSION_ACTIVE_{}' LOCK_CACHE_KEY_PREFIX = 'TOGGLE_LOCKED_SESSION_{}' - SUFFIX_MAP = {1: '.gz', 2: '.replay.gz', 3: '.cast.gz', 4: '.replay.mp4'} + SUFFIX_MAP = {2: '.replay.gz', 3: '.cast.gz', 4: '.replay.mp4', 5: '.replay.json'} DEFAULT_SUFFIXES = ['.replay.gz', '.cast.gz', '.gz', '.replay.mp4'] # Todo: 将来干掉 local_path, 使用 default storage 实现 @@ -75,22 +75,22 @@ class Session(OrgModelMixin): """ local_path: replay/2021-12-08/session_id.cast.gz 通过后缀名获取本地存储的录像文件路径 - :param suffix: .cast.gz | '.replay.gz' | '.gz' + :param suffix: .cast.gz | '.replay.gz' :return: """ rel_path = self.get_relative_path_by_suffix(suffix) - if suffix == '.gz': - # 兼容 v1 的版本 - return rel_path return os.path.join(self.upload_to, rel_path) def get_relative_path_by_suffix(self, suffix='.cast.gz'): """ relative_path: 2021-12-08/session_id.cast.gz 通过后缀名获取外部存储录像文件路径 - :param suffix: .cast.gz | '.replay.gz' | '.gz' + :param suffix: .cast.gz | '.replay.gz' | '.replay.json' :return: """ + if suffix == '.replay.json': + meta_filename = str(self.id) + suffix + return self.get_replay_part_file_relative_path(meta_filename) date = self.date_start.strftime('%Y-%m-%d') return os.path.join(date, str(self.id) + suffix) @@ -172,17 +172,35 @@ class Session(OrgModelMixin): display = self.terminal.name if self.terminal else '' return display + def get_replay_dir_relative_path(self): + date = self.date_start.strftime('%Y-%m-%d') + return os.path.join(date, str(self.id)) + + def get_replay_part_file_relative_path(self, filename): + return os.path.join(self.get_replay_dir_relative_path(), filename) + + def get_replay_part_file_local_storage_path(self, filename): + return os.path.join(self.upload_to, self.get_replay_part_file_relative_path(filename)) + def save_replay_to_storage_with_version(self, f, version=2): - suffix = self.SUFFIX_MAP.get(version, '.cast.gz') - local_path = self.get_local_storage_path_by_suffix(suffix) + if version <= 4: + # compatible old API and deprecated in future version + suffix = self.SUFFIX_MAP.get(version, '.cast.gz') + rel_path = self.get_relative_path_by_suffix(suffix) + local_path = self.get_local_storage_path_by_suffix(suffix) + else: + # 文件名依赖 上传的文件名,不再使用默认的文件名 + filename = f.name + rel_path = self.get_replay_part_file_relative_path(filename) + local_path = self.get_replay_part_file_local_storage_path(filename) try: name = default_storage.save(local_path, f) except OSError as e: return None, e if settings.SERVER_REPLAY_STORAGE: - from terminal.tasks import upload_session_replay_to_external_storage - upload_session_replay_to_external_storage.delay(str(self.id)) + from terminal.tasks import upload_session_replay_file_to_external_storage + upload_session_replay_file_to_external_storage.delay(str(self.id), local_path, rel_path) return name, None @classmethod diff --git a/apps/terminal/serializers/session.py b/apps/terminal/serializers/session.py index 99c4e9511..d54111c89 100644 --- a/apps/terminal/serializers/session.py +++ b/apps/terminal/serializers/session.py @@ -84,7 +84,7 @@ class SessionDisplaySerializer(SessionSerializer): class ReplaySerializer(serializers.Serializer): file = serializers.FileField(allow_empty_file=True) - version = serializers.IntegerField(write_only=True, required=False, min_value=2, max_value=4) + version = serializers.IntegerField(write_only=True, required=False, min_value=2, max_value=5) class SessionJoinValidateSerializer(serializers.Serializer): diff --git a/apps/terminal/signal_handlers/session.py b/apps/terminal/signal_handlers/session.py index c67fcab77..4c79de9ed 100644 --- a/apps/terminal/signal_handlers/session.py +++ b/apps/terminal/signal_handlers/session.py @@ -5,7 +5,7 @@ from terminal.models import Session @receiver(pre_save, sender=Session) -def on_session_pre_save(sender, instance, **kwargs): +def on_session_pre_save(sender, instance,**kwargs): if instance.need_update_cmd_amount: instance.cmd_amount = instance.compute_command_amount() diff --git a/apps/terminal/tasks.py b/apps/terminal/tasks.py index dc60f59c3..f1d2978a5 100644 --- a/apps/terminal/tasks.py +++ b/apps/terminal/tasks.py @@ -98,6 +98,27 @@ def upload_session_replay_to_external_storage(session_id): return +@shared_task( + verbose_name=_('Upload session replay part file to external storage'), + description=_( + """If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and + recordings will be uploaded to external storage""" + )) +def upload_session_replay_file_to_external_storage(session_id, local_path, remote_path): + abs_path = default_storage.path(local_path) + ok, err = server_replay_storage.upload(abs_path, remote_path) + if not ok: + logger.error(f'Session replay file {local_path} upload to external error: {err}') + return + + try: + default_storage.delete(local_path) + except: + pass + return + + + @shared_task( verbose_name=_('Run applet host deployment'), activity_callback=lambda self, did, *args, **kwargs: ([did],), From ed6de83e8c6ca8cc9bc2a1eeab659f864e51b41c Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 18:07:59 +0800 Subject: [PATCH 78/98] perf: workflow push with full name --- .github/workflows/build-base-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 764555294..2c2efa825 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -65,6 +65,6 @@ jobs: git checkout -b ${{ github.event.pull_request.head.ref }} git add Dockerfile git commit -m "perf: Update Dockerfile with new base image tag" - git push + git push origin ${{ github.event.pull_request.head.ref }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 99c3696d963c67ba5f86a614364dc60d8c2327c0 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Sat, 14 Sep 2024 18:15:12 +0800 Subject: [PATCH 79/98] fix: Failed to import csv data --- apps/common/drf/parsers/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/drf/parsers/base.py b/apps/common/drf/parsers/base.py index b4cbd1825..9240f7a80 100644 --- a/apps/common/drf/parsers/base.py +++ b/apps/common/drf/parsers/base.py @@ -167,7 +167,7 @@ class BaseFileParser(BaseParser): rows = list(rows) if not rows: return rows - if rows[0][0] == '#Help': + if rows[0][0].startswith('#Help'): rows.pop(0) return rows From 29e233e71524296ce98cb02df031ca8ac8d95ea2 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Sat, 14 Sep 2024 16:57:46 +0800 Subject: [PATCH 80/98] perf: RemoteApp machine deployOption translate --- apps/i18n/core/zh/LC_MESSAGES/django.po | 86 +++++++++++++----------- apps/terminal/serializers/applet_host.py | 9 +-- 2 files changed, 51 insertions(+), 44 deletions(-) diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 8b5e8e162..2d3fc4b3f 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 18:57+0800\n" +"POT-Creation-Date: 2024-09-14 16:55+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -585,7 +585,7 @@ msgstr "结束日期" #: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:147 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:225 @@ -877,7 +877,7 @@ msgstr "类别" #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 #: terminal/models/component/storage.py:58 -#: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 +#: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 #: tickets/models/flow.py:42 tickets/models/ticket/apply_application.py:16 @@ -1675,7 +1675,7 @@ msgid "Gather facts" msgstr "收集资产信息" #: assets/const/base.py:32 audits/const.py:58 -#: terminal/serializers/applet_host.py:34 users/models/user/_auth.py:32 +#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32 msgid "Disabled" msgstr "禁用" @@ -2181,7 +2181,7 @@ msgstr "设置" #: assets/models/platform.py:38 audits/const.py:59 #: authentication/backends/passkey/models.py:11 settings/models.py:39 -#: terminal/serializers/applet_host.py:35 users/models/user/_auth.py:33 +#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "启用" @@ -2783,7 +2783,7 @@ msgstr "结束" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:78 +#: terminal/serializers/session.py:79 msgid "Terminal" msgstr "终端" @@ -5065,8 +5065,8 @@ msgid "" "registered or the parameters \n" " of scheduled tasks will be updated" msgstr "" -"随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动" -"时,将会注册任务或者更新定时任务参数" +"随着版本迭代,可能会新增任务或者修改任务的名称,执行时间,所以在系统启动时," +"将会注册任务或者更新定时任务参数" #: ops/tasks.py:140 msgid "Periodic check service performance" @@ -5113,8 +5113,8 @@ msgid "" "Regular clean-up - \n" " Job execution retention days'" msgstr "" -"由于作业中心执行快捷命令,playbook,会产生执行记录,系统会根据系统设置-任务" -"列表-定期清理-作业中心执行历史配置,每天凌晨2点对超出保存时间的记录进行清理" +"由于作业中心执行快捷命令,playbook,会产生执行记录,系统会根据系统设置-任务列" +"表-定期清理-作业中心执行历史配置,每天凌晨2点对超出保存时间的记录进行清理" #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" @@ -7601,7 +7601,7 @@ msgstr "版本" msgid "Can concurrent" msgstr "可以并发" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:178 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "主机" @@ -7632,7 +7632,7 @@ msgstr "宿主机" msgid "Applet Publication" msgstr "应用发布" -#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:80 +#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:81 msgid "Deploy options" msgstr "部署参数" @@ -7744,12 +7744,12 @@ msgstr "线程数" msgid "Boot Time" msgstr "运行时间" -#: terminal/models/component/storage.py:146 +#: terminal/models/component/storage.py:144 #: terminal/models/component/terminal.py:91 msgid "Command storage" msgstr "命令存储" -#: terminal/models/component/storage.py:214 +#: terminal/models/component/storage.py:212 #: terminal/models/component/terminal.py:92 msgid "Replay storage" msgstr "录像存储" @@ -7798,7 +7798,7 @@ msgstr "登录来源" msgid "Replay" msgstr "回放" -#: terminal/models/session/session.py:48 terminal/serializers/session.py:77 +#: terminal/models/session/session.py:48 terminal/serializers/session.py:78 msgid "Command amount" msgstr "命令数量" @@ -7938,19 +7938,19 @@ msgstr "无效的存储" msgid "Icon" msgstr "图标" -#: terminal/serializers/applet_host.py:26 +#: terminal/serializers/applet_host.py:24 msgid "Per Device (Device number limit)" -msgstr "" +msgstr "每用户 (限制设备数量)" -#: terminal/serializers/applet_host.py:27 +#: terminal/serializers/applet_host.py:25 msgid "Per User (User number limit)" -msgstr "" +msgstr "每设备 (限制用户数量)" -#: terminal/serializers/applet_host.py:39 +#: terminal/serializers/applet_host.py:37 msgid "Core API" msgstr "Core 服务地址" -#: terminal/serializers/applet_host.py:40 +#: terminal/serializers/applet_host.py:38 msgid "" " \n" " Tips: The application release machine communicates with the Core " @@ -7968,43 +7968,49 @@ msgstr "" "建议填写内网地址,否则填写当前站点 URL
例如:https://172.16.10.110 or " "https://dev.jumpserver.com" -#: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207 +#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" msgstr "忽略证书认证" -#: terminal/serializers/applet_host.py:50 +#: terminal/serializers/applet_host.py:48 msgid "Existing RDS license" msgstr "已有 RDS 许可证" -#: terminal/serializers/applet_host.py:51 +#: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" +"如果不存在,RDS 将处于试用模式,试用期为 120 天。详情" -#: terminal/serializers/applet_host.py:54 +#: terminal/serializers/applet_host.py:55 msgid "RDS License Server" msgstr "RDS 许可服务器" -#: terminal/serializers/applet_host.py:56 +#: terminal/serializers/applet_host.py:57 msgid "RDS Licensing Mode" msgstr "RDS 授权模式" -#: terminal/serializers/applet_host.py:59 +#: terminal/serializers/applet_host.py:60 msgid "RDS Single Session Per User" msgstr "RDS 单用户单会话" -#: terminal/serializers/applet_host.py:60 +#: terminal/serializers/applet_host.py:61 msgid "" "Tips: A RDS user can have only one session at a time. If set, when next " "login connected, previous session will be disconnected." msgstr "" +"提示:RDS 用户一次只能有一个会话。如果设置了,当下一次登录连接时,之前的会话" +"将会被断开" -#: terminal/serializers/applet_host.py:64 +#: terminal/serializers/applet_host.py:65 msgid "RDS Max Disconnection Time (ms)" msgstr "RDS 最大断开时间(毫秒)" -#: terminal/serializers/applet_host.py:66 +#: terminal/serializers/applet_host.py:67 msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." @@ -8012,11 +8018,11 @@ msgstr "" "提示:设置某个已断开连接的会话在服务器上能保持活动状态的最长时间(60000 毫秒" "后注销会话)" -#: terminal/serializers/applet_host.py:71 +#: terminal/serializers/applet_host.py:72 msgid "RDS Remote App Logoff Time Limit (ms)" msgstr "RDS 远程应用注销时间限制(毫秒)" -#: terminal/serializers/applet_host.py:73 +#: terminal/serializers/applet_host.py:74 msgid "" "Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " "programs (0 milliseconds, log off the session immediately)." @@ -8024,12 +8030,12 @@ msgstr "" "提示:关闭所有 RemoteApp 程序之后设置 RemoteAPP 会话的注销时间(0 毫秒,立即" "注销会话)" -#: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47 +#: terminal/serializers/applet_host.py:83 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 msgid "Load status" msgstr "负载状态" -#: terminal/serializers/applet_host.py:96 +#: terminal/serializers/applet_host.py:97 msgid "" "These accounts are used to connect to the published application, the account " "is now divided into two types, one is dedicated to each account, each user " @@ -8042,11 +8048,11 @@ msgstr "" "使用公共账号连接;
注意: 如果不开启自动创建账号, 当前发布机仅能被指定标" "签的资产调度到,默认不会放到调度池中,且需要手动维护账号" -#: terminal/serializers/applet_host.py:103 +#: terminal/serializers/applet_host.py:104 msgid "The number of public accounts created automatically" msgstr "公用账号自动创建的数量" -#: terminal/serializers/applet_host.py:106 +#: terminal/serializers/applet_host.py:107 msgid "" "Connect to the host using the same account first. For security reasons, " "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " @@ -8055,15 +8061,15 @@ msgstr "" "优先使用同名账号连接发布机。为了安全,需配置文件中开启配置 " "CACHE_LOGIN_PASSWORD_ENABLED=true, 修改后重启服务" -#: terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet_host.py:149 msgid "Install applets" msgstr "安装应用" -#: terminal/serializers/applet_host.py:178 +#: terminal/serializers/applet_host.py:179 msgid "Host ID" msgstr "主机 ID" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:180 msgid "Applet ID" msgstr "远程应用 ID" diff --git a/apps/terminal/serializers/applet_host.py b/apps/terminal/serializers/applet_host.py index e625fc84f..1a674613f 100644 --- a/apps/terminal/serializers/applet_host.py +++ b/apps/terminal/serializers/applet_host.py @@ -18,8 +18,6 @@ __all__ = [ 'AppletHostStartupSerializer', 'AppletSetupSerializer' ] -RDS_LICENSE_DOC_URL = 'https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/rds-client-access-license' - class DeployOptionsSerializer(serializers.Serializer): LICENSE_MODE_CHOICES = ( @@ -48,8 +46,11 @@ class DeployOptionsSerializer(serializers.Serializer): IGNORE_VERIFY_CERTS = serializers.BooleanField(default=True, label=_("Ignore Certificate Verification")) RDS_Licensing = serializers.BooleanField( default=False, label=_("Existing RDS license"), - help_text=_('If not exist, the RDS will be in trial mode, and the trial period is 120 days. ' - 'Detail').format(RDS_LICENSE_DOC_URL) + help_text=_( + 'If not exist, the RDS will be in trial mode, and the trial period is 120 days. Detail' + ) ) RDS_LicenseServer = serializers.CharField(default='127.0.0.1', label=_('RDS License Server'), max_length=1024) RDS_LicensingMode = serializers.ChoiceField( From d6888776e7d60867ceb7818618d6757bb0b616e1 Mon Sep 17 00:00:00 2001 From: zhaojisen <1301338853@qq.com> Date: Sat, 14 Sep 2024 15:54:07 +0800 Subject: [PATCH 81/98] perf: translate --- apps/i18n/luna/en.json | 4 +++- apps/i18n/luna/zh.json | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/i18n/luna/en.json b/apps/i18n/luna/en.json index 6ef7ceb66..d5334f687 100644 --- a/apps/i18n/luna/en.json +++ b/apps/i18n/luna/en.json @@ -220,5 +220,7 @@ "start time": "start time", "success": "success", "system user": "system user", - "user": "user" + "user": "user", + "recordingIsBeingDownloaded": "Recording is being downloaded, please wait.", + "Play List": "Play List" } \ No newline at end of file diff --git a/apps/i18n/luna/zh.json b/apps/i18n/luna/zh.json index bbf7f122e..005992ca4 100644 --- a/apps/i18n/luna/zh.json +++ b/apps/i18n/luna/zh.json @@ -218,5 +218,7 @@ "start time": "开始时间", "success": "成功", "system user": "系统用户", - "user": "用户" + "user": "用户", + "recordingIsBeingDownloaded": "录像正在下载中,请稍候", + "Play List": "播放列表" } \ No newline at end of file From 755a124b509fbc08efc9c8003e2f4b19dcc6f9e5 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 14 Sep 2024 18:30:36 +0800 Subject: [PATCH 82/98] perf: checkout repo --- .github/workflows/build-base-image.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 2c2efa825..73be7b005 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -25,6 +25,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} - name: Set up QEMU uses: docker/setup-qemu-action@v3 @@ -62,7 +64,6 @@ jobs: run: | git config --global user.name 'github-actions[bot]' git config --global user.email 'github-actions[bot]@users.noreply.github.com' - git checkout -b ${{ github.event.pull_request.head.ref }} git add Dockerfile git commit -m "perf: Update Dockerfile with new base image tag" git push origin ${{ github.event.pull_request.head.ref }} From 4e719ecacd4958170e3e8f549b384b8e56669865 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Wed, 18 Sep 2024 15:00:41 +0800 Subject: [PATCH 83/98] perf: TimerExecution translate --- apps/i18n/lina/en.json | 3 ++- apps/i18n/lina/zh.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index 6e454af30..4494ee93f 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -1019,7 +1019,7 @@ "RunCommand": "Run command", "RunJob": "Run job", "RunSucceed": "Task successfully completed", - "RunTaskManually": "Manually execute", + "RunTaskManually": "Manually execution", "RunasHelpText": "Enter username for running script", "RunasPolicy": "Account policy", "RunasPolicyHelpText": "When there are no users currently running on the asset, what account selection strategy should be adopted. skip: do not execute. prioritize privileged accounts: if there are privileged accounts, select them first; if not, select regular accounts. only privileged accounts: select only from privileged accounts; if none exist, do not execute.", @@ -1254,6 +1254,7 @@ "Timeout": "Timeout", "TimeoutHelpText": "When this value is -1, no timeout is specified.", "Timer": "Timer", + "TimerExecution": "Timer execution", "Title": "Title", "To": "To", "Today": "Today", diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index 45106c025..00884db00 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -1256,7 +1256,8 @@ "TimeExpression": "时间表达式", "Timeout": "超时", "TimeoutHelpText": "当此值为-1时,不指定超时时间", - "Timer": "定时执行", + "Timer": "定时", + "TimerExecution": "定时执行", "Title": "标题", "To": "至", "Today": "今天", From ef2b12fa0f6d45876b82ef41352ac3937cedae8b Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Wed, 18 Sep 2024 18:25:25 +0800 Subject: [PATCH 84/98] perf: Export template with prompts --- apps/accounts/serializers/account/account.py | 1 + apps/assets/serializers/asset/custom.py | 1 + apps/assets/serializers/platform.py | 4 ++++ apps/common/drf/renders/base.py | 9 +++++---- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/accounts/serializers/account/account.py b/apps/accounts/serializers/account/account.py index 74c8ce3b1..a6d31671b 100644 --- a/apps/accounts/serializers/account/account.py +++ b/apps/accounts/serializers/account/account.py @@ -247,6 +247,7 @@ class AccountSerializer(AccountCreateUpdateSerializerMixin, BaseAccountSerialize 'name': {'required': False}, 'source_id': {'required': False, 'allow_null': True}, } + fields_unimport_template = ['params'] @classmethod def setup_eager_loading(cls, queryset): diff --git a/apps/assets/serializers/asset/custom.py b/apps/assets/serializers/asset/custom.py index 151597b44..457c425d6 100644 --- a/apps/assets/serializers/asset/custom.py +++ b/apps/assets/serializers/asset/custom.py @@ -16,6 +16,7 @@ class CustomSerializer(AssetSerializer): class Meta(AssetSerializer.Meta): model = Custom fields = AssetSerializer.Meta.fields + ['custom_info'] + fields_unimport_template = ['custom_info'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/apps/assets/serializers/platform.py b/apps/assets/serializers/platform.py index 2eb5a44b2..38c8bd134 100644 --- a/apps/assets/serializers/platform.py +++ b/apps/assets/serializers/platform.py @@ -147,6 +147,10 @@ class PlatformProtocolSerializer(serializers.ModelSerializer): name, port = data.split('/') return {'name': name, 'port': port} + @staticmethod + def get_render_help_text(): + return _('Protocols, format is ["protocol/port"]') + class PlatformCustomField(serializers.Serializer): TYPE_CHOICES = [(t, t) for t, c in type_field_map.items()] diff --git a/apps/common/drf/renders/base.py b/apps/common/drf/renders/base.py index b7361c729..db081c3d3 100644 --- a/apps/common/drf/renders/base.py +++ b/apps/common/drf/renders/base.py @@ -48,17 +48,18 @@ class BaseFileRenderer(BaseRenderer): def get_rendered_fields(self): fields = self.serializer.fields + meta = getattr(self.serializer, 'Meta', None) if self.template == 'import': fields = [v for k, v in fields.items() if not v.read_only and k != "org_id" and k != 'id'] + fields_unimport = getattr(meta, 'fields_unimport_template', []) + fields = [v for v in fields if v.field_name not in fields_unimport] elif self.template == 'update': fields = [v for k, v in fields.items() if not v.read_only and k != "org_id"] else: fields = [v for k, v in fields.items() if not v.write_only and k != "org_id"] - meta = getattr(self.serializer, 'Meta', None) - if meta: - fields_unexport = getattr(meta, 'fields_unexport', []) - fields = [v for v in fields if v.field_name not in fields_unexport] + fields_unexport = getattr(meta, 'fields_unexport', []) + fields = [v for v in fields if v.field_name not in fields_unexport] return fields @staticmethod From 513508654b2f1e5566d21f994c295a9d4613f45b Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Wed, 18 Sep 2024 16:58:58 +0800 Subject: [PATCH 85/98] fix: minio test failed --- utils/clean_site_packages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/clean_site_packages.sh b/utils/clean_site_packages.sh index 47f7358ba..2a579dea9 100644 --- a/utils/clean_site_packages.sh +++ b/utils/clean_site_packages.sh @@ -4,7 +4,7 @@ lib_path="/opt/py3/lib/python3.11/site-packages" # 清理不需要的模块 -need_clean="jedi botocore/data" +need_clean="jedi" for i in $need_clean; do rm -rf "${lib_path}/${i}" done From 0dc9214f9819b8d02b428f585f497910f348bddd Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Wed, 18 Sep 2024 10:43:41 +0800 Subject: [PATCH 86/98] fix: LDAP HA the login log did not record the authentication backend --- apps/users/models/user/_source.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/users/models/user/_source.py b/apps/users/models/user/_source.py index 2c7237c80..e7e0dd21f 100644 --- a/apps/users/models/user/_source.py +++ b/apps/users/models/user/_source.py @@ -35,6 +35,7 @@ class SourceMixin: settings.AUTH_BACKEND_PUBKEY, ], Source.ldap: [settings.AUTH_BACKEND_LDAP], + Source.ldap_ha: [settings.AUTH_BACKEND_LDAP_HA], Source.openid: [ settings.AUTH_BACKEND_OIDC_PASSWORD, settings.AUTH_BACKEND_OIDC_CODE, From 37ca4a46eeeeaf66aca732b120273feee2c8aa81 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 19 Sep 2024 09:52:20 +0800 Subject: [PATCH 87/98] perf: add clean_site_packages.sh file path to build-base-image.yml --- .github/workflows/build-base-image.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index 73be7b005..d63d8070d 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -14,6 +14,7 @@ on: - yarn.lock - pom.xml - install_deps.sh + - clean_site_packages.sh types: - opened - synchronize From 744a5cd0e37481b1cd7b4053dd5d9d99ec4192c1 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 19 Sep 2024 09:52:20 +0800 Subject: [PATCH 88/98] perf: Modify relative file path --- .github/workflows/build-base-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-base-image.yml b/.github/workflows/build-base-image.yml index d63d8070d..df0e667aa 100644 --- a/.github/workflows/build-base-image.yml +++ b/.github/workflows/build-base-image.yml @@ -14,7 +14,7 @@ on: - yarn.lock - pom.xml - install_deps.sh - - clean_site_packages.sh + - utils/clean_site_packages.sh types: - opened - synchronize From e373a79d63b42146931fc6d381da94dea0e0ee51 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 19 Sep 2024 10:44:46 +0800 Subject: [PATCH 89/98] perf: Gateway type asset filter --- apps/assets/api/asset/asset.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/assets/api/asset/asset.py b/apps/assets/api/asset/asset.py index bfac3ec1c..d3bcdb785 100644 --- a/apps/assets/api/asset/asset.py +++ b/apps/assets/api/asset/asset.py @@ -22,6 +22,7 @@ from common.drf.filters import BaseFilterSet, AttrRulesFilterBackend from common.utils import get_logger, is_uuid from orgs.mixins import generics from orgs.mixins.api import OrgBulkModelViewSet +from ...const import GATEWAY_NAME from ...notifications import BulkUpdatePlatformSkipAssetUserMsg logger = get_logger(__file__) @@ -71,6 +72,8 @@ class AssetFilterSet(BaseFilterSet): def filter_platform(queryset, name, value): if value.isdigit(): return queryset.filter(platform_id=value) + elif value == GATEWAY_NAME: + return queryset.filter(platform__name__istartswith=GATEWAY_NAME) else: return queryset.filter(platform__name=value) From 3dde80a60aa6ca4b0300bccf24298da92af5e031 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Wed, 18 Sep 2024 18:09:21 +0800 Subject: [PATCH 90/98] fix: Password reset is only required for AUTH_BACKEND_MODEL --- apps/authentication/mixins.py | 7 +++++++ apps/users/models/user/_auth.py | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/authentication/mixins.py b/apps/authentication/mixins.py index dd7713432..f1bbadcac 100644 --- a/apps/authentication/mixins.py +++ b/apps/authentication/mixins.py @@ -301,6 +301,7 @@ class MFAMixin: class AuthPostCheckMixin: + @classmethod def generate_reset_password_url_with_flash_msg(cls, user, message): reset_passwd_url = reverse('authentication:reset-password') @@ -319,6 +320,8 @@ class AuthPostCheckMixin: @classmethod def _check_passwd_is_too_simple(cls, user: User, password): + if not user.is_auth_backend_model(): + return if user.check_passwd_too_simple(password): message = _('Your password is too simple, please change it for security') url = cls.generate_reset_password_url_with_flash_msg(user, message=message) @@ -326,6 +329,8 @@ class AuthPostCheckMixin: @classmethod def _check_passwd_need_update(cls, user: User): + if not user.is_auth_backend_model(): + return if user.check_need_update_password(): message = _('You should to change your password before login') url = cls.generate_reset_password_url_with_flash_msg(user, message) @@ -333,6 +338,8 @@ class AuthPostCheckMixin: @classmethod def _check_password_require_reset_or_not(cls, user: User): + if not user.is_auth_backend_model(): + return if user.password_has_expired: message = _('Your password has expired, please reset before logging in') url = cls.generate_reset_password_url_with_flash_msg(user, message) diff --git a/apps/users/models/user/_auth.py b/apps/users/models/user/_auth.py index 94d03c097..a3f8ef234 100644 --- a/apps/users/models/user/_auth.py +++ b/apps/users/models/user/_auth.py @@ -233,13 +233,17 @@ class AuthMixin: return True return False - def check_passwd_too_simple(self, password): - backend = getattr(self, 'backend', None) + @staticmethod + def check_passwd_too_simple(password): simple_passwords = ['admin', 'ChangeMe'] - if backend == settings.AUTH_BACKEND_MODEL and password in simple_passwords: + if password in simple_passwords: return True return False + def is_auth_backend_model(self): + backend = getattr(self, 'backend', None) + return backend == settings.AUTH_BACKEND_MODEL + @staticmethod def get_public_key_md5(key): try: From e47bdc093e5b186efb63f58c206ab09df1e153b3 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 19 Sep 2024 09:55:47 +0800 Subject: [PATCH 91/98] perf: trigger core base image build --- utils/clean_site_packages.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/clean_site_packages.sh b/utils/clean_site_packages.sh index 2a579dea9..c6e692f6b 100644 --- a/utils/clean_site_packages.sh +++ b/utils/clean_site_packages.sh @@ -1,5 +1,4 @@ #!/bin/bash -# lib_path="/opt/py3/lib/python3.11/site-packages" From 26420b78f893ba945d329cb264ce7d64d1a9602c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 19 Sep 2024 02:53:54 +0000 Subject: [PATCH 92/98] perf: Update Dockerfile with new base image tag --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 718feddb9..b8ffe29e4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM jumpserver/core-base:20240913_063833 AS stage-build +FROM jumpserver/core-base:20240919_024156 AS stage-build ARG VERSION From 59c87483e64bcc165d4a309bf338c48638613256 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 19 Sep 2024 11:00:36 +0800 Subject: [PATCH 93/98] perf: filter gateway with new params --- apps/accounts/tasks/verify_account.py | 5 ++-- apps/assets/api/asset/asset.py | 34 ++++++++++++++++----------- apps/assets/models/asset/common.py | 7 ++++++ apps/assets/models/domain.py | 2 +- apps/assets/models/gateway.py | 4 ---- apps/assets/serializers/domain.py | 2 +- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/apps/accounts/tasks/verify_account.py b/apps/accounts/tasks/verify_account.py index be3e085b5..d6526ec12 100644 --- a/apps/accounts/tasks/verify_account.py +++ b/apps/accounts/tasks/verify_account.py @@ -4,7 +4,6 @@ from django.utils.translation import gettext_noop from accounts.const import AutomationTypes from accounts.tasks.common import quickstart_automation_by_snapshot -from assets.const import GATEWAY_NAME from common.utils import get_logger from orgs.utils import org_aware_func @@ -32,13 +31,13 @@ def verify_accounts_connectivity_util(accounts, task_name): asset_ids = [a.asset_id for a in accounts] assets = Asset.objects.filter(id__in=asset_ids) - gateways = assets.filter(platform__name=GATEWAY_NAME) + gateways = assets.gateways() verify_connectivity_util( gateways, AutomationTypes.verify_gateway_account, accounts, task_name ) - common_assets = assets.exclude(platform__name=GATEWAY_NAME) + common_assets = assets.gateways(0) verify_connectivity_util( common_assets, AutomationTypes.verify_account, accounts, task_name diff --git a/apps/assets/api/asset/asset.py b/apps/assets/api/asset/asset.py index d3bcdb785..849b5f3ad 100644 --- a/apps/assets/api/asset/asset.py +++ b/apps/assets/api/asset/asset.py @@ -2,10 +2,10 @@ # from collections import defaultdict -import django_filters from django.conf import settings from django.shortcuts import get_object_or_404 from django.utils.translation import gettext as _ +from django_filters import rest_framework as drf_filters from rest_framework import status from rest_framework.decorators import action from rest_framework.response import Response @@ -33,31 +33,32 @@ __all__ = [ class AssetFilterSet(BaseFilterSet): - platform = django_filters.CharFilter(method='filter_platform') - exclude_platform = django_filters.CharFilter(field_name="platform__name", lookup_expr='exact', exclude=True) - domain = django_filters.CharFilter(method='filter_domain') - type = django_filters.CharFilter(field_name="platform__type", lookup_expr="exact") - category = django_filters.CharFilter(field_name="platform__category", lookup_expr="exact") - protocols = django_filters.CharFilter(method='filter_protocols') - domain_enabled = django_filters.BooleanFilter( + platform = drf_filters.CharFilter(method='filter_platform') + is_gateway = drf_filters.BooleanFilter(method='filter_is_gateway') + exclude_platform = drf_filters.CharFilter(field_name="platform__name", lookup_expr='exact', exclude=True) + domain = drf_filters.CharFilter(method='filter_domain') + type = drf_filters.CharFilter(field_name="platform__type", lookup_expr="exact") + category = drf_filters.CharFilter(field_name="platform__category", lookup_expr="exact") + protocols = drf_filters.CharFilter(method='filter_protocols') + domain_enabled = drf_filters.BooleanFilter( field_name="platform__domain_enabled", lookup_expr="exact" ) - ping_enabled = django_filters.BooleanFilter( + ping_enabled = drf_filters.BooleanFilter( field_name="platform__automation__ping_enabled", lookup_expr="exact" ) - gather_facts_enabled = django_filters.BooleanFilter( + gather_facts_enabled = drf_filters.BooleanFilter( field_name="platform__automation__gather_facts_enabled", lookup_expr="exact" ) - change_secret_enabled = django_filters.BooleanFilter( + change_secret_enabled = drf_filters.BooleanFilter( field_name="platform__automation__change_secret_enabled", lookup_expr="exact" ) - push_account_enabled = django_filters.BooleanFilter( + push_account_enabled = drf_filters.BooleanFilter( field_name="platform__automation__push_account_enabled", lookup_expr="exact" ) - verify_account_enabled = django_filters.BooleanFilter( + verify_account_enabled = drf_filters.BooleanFilter( field_name="platform__automation__verify_account_enabled", lookup_expr="exact" ) - gather_accounts_enabled = django_filters.BooleanFilter( + gather_accounts_enabled = drf_filters.BooleanFilter( field_name="platform__automation__gather_accounts_enabled", lookup_expr="exact" ) @@ -77,6 +78,11 @@ class AssetFilterSet(BaseFilterSet): else: return queryset.filter(platform__name=value) + @staticmethod + def filter_is_gateway(queryset, name, value): + queryset = queryset.gateways(value) + return queryset + @staticmethod def filter_domain(queryset, name, value): if is_uuid(value): diff --git a/apps/assets/models/asset/common.py b/apps/assets/models/asset/common.py index 7388f27a8..833d8f1be 100644 --- a/apps/assets/models/asset/common.py +++ b/apps/assets/models/asset/common.py @@ -38,6 +38,13 @@ class AssetQuerySet(models.QuerySet): def valid(self): return self.active() + def gateways(self, is_gateway=1): + kwargs = {'platform__name__startswith': 'Gateway'} + if is_gateway: + return self.filter(**kwargs) + else: + return self.exclude(**kwargs) + def has_protocol(self, name): return self.filter(protocols__contains=name) diff --git a/apps/assets/models/domain.py b/apps/assets/models/domain.py index 0c75e22b7..4a9311aed 100644 --- a/apps/assets/models/domain.py +++ b/apps/assets/models/domain.py @@ -31,7 +31,7 @@ class Domain(LabeledMixin, JMSOrgBaseModel): @lazyproperty def assets_amount(self): - return self.assets.exclude(platform__name='Gateway').count() + return self.assets.gateways(0).count() def random_gateway(self): gateways = [gw for gw in self.active_gateways if gw.is_connective] diff --git a/apps/assets/models/gateway.py b/apps/assets/models/gateway.py index 9f23cb5fc..7e9f10da7 100644 --- a/apps/assets/models/gateway.py +++ b/apps/assets/models/gateway.py @@ -33,10 +33,6 @@ class Gateway(Host): proxy = True verbose_name = _("Gateway") - def save(self, *args, **kwargs): - self.platform = self.default_platform() - return super().save(*args, **kwargs) - @classmethod def default_platform(cls): return Platform.objects.get(name=GATEWAY_NAME, internal=True) diff --git a/apps/assets/serializers/domain.py b/apps/assets/serializers/domain.py index bba7e7310..e538a3d0c 100644 --- a/apps/assets/serializers/domain.py +++ b/apps/assets/serializers/domain.py @@ -68,7 +68,7 @@ class DomainListSerializer(DomainSerializer): @classmethod def setup_eager_loading(cls, queryset): queryset = queryset.annotate( - assets_amount=Count('assets', filter=~Q(assets__platform__name='Gateway'), distinct=True), + assets_amount=Count('assets', filter=~Q(assets__platform__name__startswith='Gateway'), distinct=True), ) return queryset From db5bf046fc87e898b49407f665f017a7001c5cba Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 19 Sep 2024 11:58:45 +0800 Subject: [PATCH 94/98] perf: Bind user group support str --- apps/users/signal_handlers.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/users/signal_handlers.py b/apps/users/signal_handlers.py index 91445f799..b8fb37085 100644 --- a/apps/users/signal_handlers.py +++ b/apps/users/signal_handlers.py @@ -247,6 +247,9 @@ def bind_user_to_org_role(user): def bind_user_to_group(org_ids, group_names, user): + if isinstance(group_names, str): + group_names = [group_names] + if not isinstance(group_names, list): return From b53968ac0059cfac1c27beb11f7f4934af63b511 Mon Sep 17 00:00:00 2001 From: Bai Date: Thu, 19 Sep 2024 11:27:24 +0800 Subject: [PATCH 95/98] delete: ansible log in logging.py --- apps/jumpserver/settings/logging.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/apps/jumpserver/settings/logging.py b/apps/jumpserver/settings/logging.py index 74585d168..23d15d970 100644 --- a/apps/jumpserver/settings/logging.py +++ b/apps/jumpserver/settings/logging.py @@ -8,7 +8,6 @@ LOG_DIR = os.path.join(PROJECT_DIR, 'data', 'logs') JUMPSERVER_LOG_FILE = os.path.join(LOG_DIR, 'jumpserver.log') DRF_EXCEPTION_LOG_FILE = os.path.join(LOG_DIR, 'drf_exception.log') UNEXPECTED_EXCEPTION_LOG_FILE = os.path.join(LOG_DIR, 'unexpected_exception.log') -ANSIBLE_LOG_FILE = os.path.join(LOG_DIR, 'ansible.log') GUNICORN_LOG_FILE = os.path.join(LOG_DIR, 'gunicorn.log') LOG_LEVEL = CONFIG.LOG_LEVEL @@ -55,14 +54,6 @@ LOGGING = { 'formatter': 'main', 'filename': JUMPSERVER_LOG_FILE, }, - 'ansible_logs': { - 'encoding': 'utf8', - 'level': 'DEBUG', - 'class': 'jumpserver.rewriting.logging.DailyTimedRotatingFileHandler', - 'when': 'midnight', - 'formatter': 'main', - 'filename': ANSIBLE_LOG_FILE, - }, 'drf_exception': { 'encoding': 'utf8', 'level': 'DEBUG', @@ -113,10 +104,6 @@ LOGGING = { 'handlers': ['unexpected_exception'], 'level': LOG_LEVEL, }, - 'ops.ansible_api': { - 'handlers': ['console', 'ansible_logs'], - 'level': LOG_LEVEL, - }, 'django_auth_ldap': { 'handlers': ['console', 'file'], 'level': "INFO", From d34b65890fadd77245f83b993ebcef14f288c092 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 19 Sep 2024 14:37:59 +0800 Subject: [PATCH 96/98] fix: import account failed --- apps/common/drf/parsers/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/drf/parsers/base.py b/apps/common/drf/parsers/base.py index 9240f7a80..07126b541 100644 --- a/apps/common/drf/parsers/base.py +++ b/apps/common/drf/parsers/base.py @@ -108,7 +108,7 @@ class BaseFileParser(BaseParser): if not matched: return v obj_name, obj_id = matched.groups() - if len(obj_id) < 36: + if obj_id.isdigit(): obj_id = int(obj_id) return {'pk': obj_id, 'name': obj_name} From 4c957dd03b8930f00de8f4a1cf67e2691869ed47 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 19 Sep 2024 16:51:43 +0800 Subject: [PATCH 97/98] perf: Password rule import csv help_text --- apps/accounts/serializers/account/template.py | 11 + apps/i18n/core/en/LC_MESSAGES/django.po | 336 ++-- apps/i18n/core/ja/LC_MESSAGES/django.po | 1664 ++++++++++------- apps/i18n/core/zh/LC_MESSAGES/django.po | 253 +-- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 1290 +++++++------ 5 files changed, 2085 insertions(+), 1469 deletions(-) diff --git a/apps/accounts/serializers/account/template.py b/apps/accounts/serializers/account/template.py index fc6ccefeb..5a0529b2d 100644 --- a/apps/accounts/serializers/account/template.py +++ b/apps/accounts/serializers/account/template.py @@ -19,6 +19,16 @@ class PasswordRulesSerializer(serializers.Serializer): default='', allow_blank=True, max_length=16, label=_('Exclude symbol') ) + @staticmethod + def get_render_help_text(): + return _("""length is the length of the password, and the range is 8 to 30. +lowercase indicates whether the password contains lowercase letters, +uppercase indicates whether it contains uppercase letters, +digit indicates whether it contains numbers, and symbol indicates whether it contains special symbols. +exclude_symbols is used to exclude specific symbols. You can fill in the symbol characters to be excluded (up to 16). +If you do not need to exclude symbols, you can leave it blank. +default: {"length": 16, "lowercase": true, "uppercase": true, "digit": true, "symbol": true, "exclude_symbols": ""}""") + class AccountTemplateSerializer(BaseAccountSerializer): password_rules = PasswordRulesSerializer(required=False, label=_('Password rules')) @@ -46,6 +56,7 @@ class AccountTemplateSerializer(BaseAccountSerializer): 'required': False }, } + fields_unimport_template = ['push_params'] @staticmethod def generate_secret(attrs): diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index e0aecdcfc..1c9fab98d 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 17:22+0800\n" +"POT-Creation-Date: 2024-09-19 16:31+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -341,14 +341,14 @@ msgstr "" #: accounts/models/account.py:49 #: accounts/models/automations/gather_account.py:16 #: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:271 +#: accounts/serializers/account/account.py:272 #: accounts/serializers/account/gathered_account.py:10 #: accounts/serializers/automations/change_secret.py:111 #: accounts/serializers/automations/change_secret.py:143 #: accounts/templates/accounts/asset_account_change_info.html:7 #: accounts/templates/accounts/change_secret_failed_info.html:11 -#: acls/serializers/base.py:123 assets/models/asset/common.py:95 -#: assets/models/asset/common.py:355 assets/models/cmd_filter.py:36 +#: acls/serializers/base.py:123 assets/models/asset/common.py:102 +#: assets/models/asset/common.py:362 assets/models/cmd_filter.py:36 #: audits/models.py:58 authentication/models/connection_token.py:36 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:32 terminal/notifications.py:155 @@ -361,8 +361,8 @@ msgstr "" #: accounts/models/account.py:53 accounts/models/template.py:16 #: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:281 -#: accounts/serializers/account/template.py:27 +#: accounts/serializers/account/account.py:282 +#: accounts/serializers/account/template.py:37 #: authentication/serializers/connect_token_secret.py:50 msgid "Su from" msgstr "Switch from" @@ -586,7 +586,7 @@ msgstr "" #: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:147 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:225 @@ -595,7 +595,7 @@ msgid "Status" msgstr "" #: accounts/models/automations/change_secret.py:46 -#: accounts/serializers/account/account.py:273 +#: accounts/serializers/account/account.py:274 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:8 #: authentication/templates/authentication/passkey.html:173 @@ -671,7 +671,7 @@ msgid "Verify asset account" msgstr "" #: accounts/models/base.py:37 accounts/models/base.py:67 -#: accounts/serializers/account/account.py:463 +#: accounts/serializers/account/account.py:464 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:47 #: authentication/serializers/connect_token_secret.py:42 @@ -693,19 +693,19 @@ msgstr "" msgid "Secret strategy" msgstr "" -#: accounts/models/base.py:44 accounts/serializers/account/template.py:24 +#: accounts/models/base.py:44 accounts/serializers/account/template.py:34 #: accounts/serializers/automations/change_secret.py:46 msgid "Password rules" msgstr "" #: accounts/models/base.py:64 accounts/serializers/account/virtual.py:20 #: acls/models/base.py:35 acls/models/base.py:96 acls/models/command_acl.py:21 -#: acls/serializers/base.py:35 assets/models/asset/common.py:93 -#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 +#: acls/serializers/base.py:35 assets/models/asset/common.py:100 +#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 -#: assets/serializers/platform.py:273 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:157 +#: assets/serializers/platform.py:277 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 @@ -845,10 +845,15 @@ msgstr "" msgid "Exist policy" msgstr "" +#: accounts/serializers/account/account.py:181 +#: accounts/serializers/account/account.py:340 +msgid "Account already exists" +msgstr "" + #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 -#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 -#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 +#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:172 +#: assets/serializers/platform.py:278 perms/serializers/user_permission.py:26 #: settings/models.py:37 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -858,13 +863,13 @@ msgstr "" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 -#: assets/serializers/platform.py:167 audits/serializers.py:53 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:159 +#: assets/serializers/platform.py:171 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 #: terminal/models/component/storage.py:58 -#: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 +#: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 #: tickets/models/flow.py:42 tickets/models/ticket/apply_application.py:16 @@ -877,26 +882,26 @@ msgstr "" msgid "Asset not found" msgstr "" -#: accounts/serializers/account/account.py:262 +#: accounts/serializers/account/account.py:263 msgid "Has secret" msgstr "" -#: accounts/serializers/account/account.py:272 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:273 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "" -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:275 msgid "Changed" msgstr "" -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:285 #: accounts/serializers/automations/base.py:22 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:19 #: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 -#: assets/serializers/platform.py:176 assets/serializers/platform.py:208 +#: assets/serializers/platform.py:180 assets/serializers/platform.py:212 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 #: perms/serializers/permission.py:46 @@ -905,34 +910,30 @@ msgstr "" msgid "Assets" msgstr "" -#: accounts/serializers/account/account.py:339 -msgid "Account already exists" -msgstr "" - -#: accounts/serializers/account/account.py:389 +#: accounts/serializers/account/account.py:390 #, python-format msgid "Asset does not support this secret type: %s" msgstr "" -#: accounts/serializers/account/account.py:421 +#: accounts/serializers/account/account.py:422 msgid "Account has exist" msgstr "" -#: accounts/serializers/account/account.py:458 +#: accounts/serializers/account/account.py:459 #: accounts/serializers/account/base.py:93 -#: accounts/serializers/account/template.py:72 +#: accounts/serializers/account/template.py:83 #: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "" -#: accounts/serializers/account/account.py:464 +#: accounts/serializers/account/account.py:465 #: authentication/serializers/connect_token_secret.py:159 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "" -#: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 +#: accounts/serializers/account/account.py:475 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 #: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 @@ -954,7 +955,7 @@ msgstr "" msgid "User" msgstr "" -#: accounts/serializers/account/account.py:475 +#: accounts/serializers/account/account.py:476 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:158 terminal/notifications.py:207 msgid "Date" @@ -1014,15 +1015,29 @@ msgstr "" msgid "Exclude symbol" msgstr "" -#: accounts/serializers/account/template.py:39 +#: accounts/serializers/account/template.py:24 +msgid "" +"length is the length of the password, and the range is 8 to 30.\n" +"lowercase indicates whether the password contains lowercase letters, \n" +"uppercase indicates whether it contains uppercase letters,\n" +"digit indicates whether it contains numbers, and symbol indicates whether it " +"contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the " +"symbol characters to be excluded (up to 16). \n" +"If you do not need to exclude symbols, you can leave it blank.\n" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " +"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +msgstr "" + +#: accounts/serializers/account/template.py:49 msgid "Secret generation strategy for account creation" msgstr "" -#: accounts/serializers/account/template.py:40 +#: accounts/serializers/account/template.py:50 msgid "Whether to automatically push the account to the asset" msgstr "" -#: accounts/serializers/account/template.py:43 +#: accounts/serializers/account/template.py:53 msgid "" "Associated platform, you can configure push parameters. If not associated, " "default parameters will be used" @@ -1050,7 +1065,7 @@ msgid "" msgstr "" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:172 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47 msgid "Nodes" msgstr "" @@ -1232,17 +1247,17 @@ msgid "" "task will be executed" msgstr "" -#: accounts/tasks/verify_account.py:50 +#: accounts/tasks/verify_account.py:49 msgid "Verify asset account availability" msgstr "" -#: accounts/tasks/verify_account.py:53 +#: accounts/tasks/verify_account.py:52 msgid "" "When clicking 'Test' in 'Console - Asset details - Accounts' this task will " "be executed" msgstr "" -#: accounts/tasks/verify_account.py:59 +#: accounts/tasks/verify_account.py:58 msgid "Verify accounts connectivity" msgstr "" @@ -1327,7 +1342,7 @@ msgstr "" msgid "Reviewers" msgstr "" -#: acls/models/base.py:43 assets/models/asset/common.py:171 +#: acls/models/base.py:43 assets/models/asset/common.py:178 #: authentication/models/access_key.py:25 #: authentication/models/connection_token.py:53 #: authentication/models/ssh_key.py:13 @@ -1479,7 +1494,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:149 xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "" @@ -1539,11 +1554,11 @@ msgstr "" msgid "User agent" msgstr "" -#: assets/api/asset/asset.py:181 +#: assets/api/asset/asset.py:190 msgid "Cannot create asset directly, you should create a host or other" msgstr "" -#: assets/api/asset/asset.py:185 +#: assets/api/asset/asset.py:194 msgid "The number of assets exceeds the limit of 5000" msgstr "" @@ -1648,7 +1663,7 @@ msgid "Gather facts" msgstr "" #: assets/const/base.py:32 audits/const.py:58 -#: terminal/serializers/applet_host.py:34 users/models/user/_auth.py:32 +#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32 msgid "Disabled" msgstr "" @@ -1897,51 +1912,51 @@ msgstr "" msgid "Cloud" msgstr "" -#: assets/models/asset/common.py:94 assets/models/platform.py:16 +#: assets/models/asset/common.py:101 assets/models/platform.py:16 #: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77 #: settings/serializers/msg.py:31 terminal/serializers/storage.py:133 #: xpack/plugins/cloud/serializers/account_attrs.py:73 msgid "Port" msgstr "" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "" -#: assets/models/asset/common.py:162 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:149 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 msgid "Platform" msgstr "" -#: assets/models/asset/common.py:166 assets/models/domain.py:22 +#: assets/models/asset/common.py:173 assets/models/domain.py:22 msgid "Zone" msgstr "" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:408 +#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:408 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "" -#: assets/models/asset/common.py:173 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "" -#: assets/models/asset/common.py:358 +#: assets/models/asset/common.py:365 msgid "Can refresh asset hardware info" msgstr "" -#: assets/models/asset/common.py:359 +#: assets/models/asset/common.py:366 msgid "Can test asset connectivity" msgstr "" -#: assets/models/asset/common.py:360 +#: assets/models/asset/common.py:367 msgid "Can match asset" msgstr "" -#: assets/models/asset/common.py:361 +#: assets/models/asset/common.py:368 msgid "Can change asset nodes" msgstr "" @@ -2078,7 +2093,7 @@ msgstr "" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 -#: assets/serializers/platform.py:154 +#: assets/serializers/platform.py:158 #: authentication/serializers/connect_token_secret.py:124 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 @@ -2129,7 +2144,7 @@ msgstr "" msgid "Required" msgstr "" -#: assets/models/platform.py:19 assets/serializers/platform.py:156 +#: assets/models/platform.py:19 assets/serializers/platform.py:160 #: terminal/models/component/storage.py:28 #: xpack/plugins/cloud/providers/nutanix.py:30 msgid "Default" @@ -2147,7 +2162,7 @@ msgstr "" #: assets/models/platform.py:38 audits/const.py:59 #: authentication/backends/passkey/models.py:11 settings/models.py:39 -#: terminal/serializers/applet_host.py:35 users/models/user/_auth.py:33 +#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "" @@ -2237,23 +2252,23 @@ msgstr "" msgid "Internal" msgstr "Builtin" -#: assets/models/platform.py:102 assets/serializers/platform.py:166 +#: assets/models/platform.py:102 assets/serializers/platform.py:170 msgid "Charset" msgstr "" -#: assets/models/platform.py:104 assets/serializers/platform.py:204 +#: assets/models/platform.py:104 assets/serializers/platform.py:208 msgid "Gateway enabled" msgstr "" -#: assets/models/platform.py:106 assets/serializers/platform.py:197 +#: assets/models/platform.py:106 assets/serializers/platform.py:201 msgid "Su enabled" msgstr "Switch account enabled" -#: assets/models/platform.py:107 assets/serializers/platform.py:172 +#: assets/models/platform.py:107 assets/serializers/platform.py:176 msgid "Su method" msgstr "Switch account method" -#: assets/models/platform.py:108 assets/serializers/platform.py:175 +#: assets/models/platform.py:108 assets/serializers/platform.py:179 msgid "Custom fields" msgstr "" @@ -2268,7 +2283,7 @@ msgid "" "type" msgstr "" -#: assets/serializers/asset/common.py:36 +#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:152 msgid "Protocols, format is [\"protocol/port\"]" msgstr "" @@ -2288,7 +2303,7 @@ msgid "" "it" msgstr "" -#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:173 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 @@ -2424,7 +2439,7 @@ msgid "" "the zone, the connection is routed through the gateway." msgstr "" -#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 +#: assets/serializers/domain.py:24 assets/serializers/platform.py:181 #: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "" @@ -2509,38 +2524,38 @@ msgstr "" msgid "This protocol is public, asset will show this protocol to user" msgstr "" -#: assets/serializers/platform.py:157 +#: assets/serializers/platform.py:161 msgid "Help text" msgstr "" -#: assets/serializers/platform.py:158 +#: assets/serializers/platform.py:162 msgid "Choices" msgstr "" -#: assets/serializers/platform.py:170 +#: assets/serializers/platform.py:174 msgid "Automation" msgstr "" -#: assets/serializers/platform.py:199 +#: assets/serializers/platform.py:203 msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " "root" msgstr "" -#: assets/serializers/platform.py:205 +#: assets/serializers/platform.py:209 msgid "Assets can be connected using a zone gateway" msgstr "" -#: assets/serializers/platform.py:207 +#: assets/serializers/platform.py:211 msgid "Default Domain" msgstr "" -#: assets/serializers/platform.py:229 +#: assets/serializers/platform.py:233 msgid "type is required" msgstr "" -#: assets/serializers/platform.py:244 +#: assets/serializers/platform.py:248 msgid "Protocols is required" msgstr "" @@ -2685,7 +2700,7 @@ msgstr "" #: audits/const.py:18 audits/const.py:28 #: ops/templates/ops/celery_task_log.html:86 -#: terminal/api/session/session.py:149 +#: terminal/api/session/session.py:153 msgid "Download" msgstr "" @@ -2693,7 +2708,7 @@ msgstr "" msgid "Rename dir" msgstr "" -#: audits/const.py:23 rbac/tree.py:266 terminal/api/session/session.py:274 +#: audits/const.py:23 rbac/tree.py:266 terminal/api/session/session.py:281 #: terminal/templates/terminal/_msg_command_warning.html:18 #: terminal/templates/terminal/_msg_session_sharing.html:10 #: xpack/plugins/cloud/manager.py:84 @@ -2744,7 +2759,7 @@ msgstr "" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 -#: terminal/serializers/session.py:78 +#: terminal/serializers/session.py:79 msgid "Terminal" msgstr "" @@ -3057,7 +3072,7 @@ msgstr "" msgid "Current user not support mfa type: {}" msgstr "" -#: authentication/api/password.py:33 terminal/api/session/session.py:322 +#: authentication/api/password.py:33 terminal/api/session/session.py:334 #: users/views/profile/reset.py:63 msgid "User does not exist: {}" msgstr "" @@ -3303,15 +3318,15 @@ msgstr "" msgid "Please wait for %s seconds before retry" msgstr "" -#: authentication/errors/redirect.py:85 authentication/mixins.py:323 +#: authentication/errors/redirect.py:85 authentication/mixins.py:326 msgid "Your password is too simple, please change it for security" msgstr "" -#: authentication/errors/redirect.py:93 authentication/mixins.py:330 +#: authentication/errors/redirect.py:93 authentication/mixins.py:335 msgid "You should to change your password before login" msgstr "" -#: authentication/errors/redirect.py:101 authentication/mixins.py:337 +#: authentication/errors/redirect.py:101 authentication/mixins.py:344 msgid "Your password has expired, please reset before logging in" msgstr "" @@ -3427,7 +3442,7 @@ msgstr "" msgid "The MFA type ({}) is not enabled" msgstr "" -#: authentication/mixins.py:313 +#: authentication/mixins.py:314 msgid "Please change your password" msgstr "" @@ -4170,69 +4185,69 @@ msgstr "" msgid "Invalid excel file" msgstr "" -#: common/drf/renders/base.py:137 +#: common/drf/renders/base.py:138 msgid "Yes/No" msgstr "" -#: common/drf/renders/base.py:140 +#: common/drf/renders/base.py:141 msgid "Text, max length {}" msgstr "" -#: common/drf/renders/base.py:142 +#: common/drf/renders/base.py:143 msgid "Long text, no length limit" msgstr "" -#: common/drf/renders/base.py:144 +#: common/drf/renders/base.py:145 msgid "Number, min {} max {}" msgstr "" -#: common/drf/renders/base.py:147 +#: common/drf/renders/base.py:148 msgid "Datetime format {}" msgstr "" -#: common/drf/renders/base.py:153 +#: common/drf/renders/base.py:154 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" msgstr "" -#: common/drf/renders/base.py:156 +#: common/drf/renders/base.py:157 msgid "Choices, options {}" msgstr "" -#: common/drf/renders/base.py:158 +#: common/drf/renders/base.py:159 msgid "Phone number, format +8612345678901" msgstr "" -#: common/drf/renders/base.py:160 +#: common/drf/renders/base.py:161 msgid "Label, format [\"key:value\"]" msgstr "" -#: common/drf/renders/base.py:162 +#: common/drf/renders/base.py:163 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "" -#: common/drf/renders/base.py:164 +#: common/drf/renders/base.py:165 msgid "Object, format id" msgstr "" -#: common/drf/renders/base.py:168 +#: common/drf/renders/base.py:169 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" msgstr "" -#: common/drf/renders/base.py:170 +#: common/drf/renders/base.py:171 msgid "" "Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "" -#: common/drf/renders/base.py:172 +#: common/drf/renders/base.py:173 msgid "Objects, format [\"id\", ...]" msgstr "" -#: common/drf/renders/base.py:270 +#: common/drf/renders/base.py:271 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -7241,7 +7256,7 @@ msgstr "" msgid "Invalid" msgstr "" -#: terminal/api/component/storage.py:132 terminal/tasks.py:187 +#: terminal/api/component/storage.py:132 terminal/tasks.py:208 msgid "Test failure: {}" msgstr "" @@ -7262,15 +7277,15 @@ msgstr "" msgid "User %s %s session %s replay" msgstr "" -#: terminal/api/session/session.py:314 +#: terminal/api/session/session.py:326 msgid "Session does not exist: {}" msgstr "" -#: terminal/api/session/session.py:317 +#: terminal/api/session/session.py:329 msgid "Session is finished or the protocol not supported" msgstr "" -#: terminal/api/session/session.py:330 +#: terminal/api/session/session.py:342 msgid "User does not have permission" msgstr "" @@ -7434,7 +7449,7 @@ msgstr "" msgid "Can concurrent" msgstr "" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:178 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "" @@ -7465,7 +7480,7 @@ msgstr "" msgid "Applet Publication" msgstr "" -#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:80 +#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:81 msgid "Deploy options" msgstr "" @@ -7577,12 +7592,12 @@ msgstr "" msgid "Boot Time" msgstr "" -#: terminal/models/component/storage.py:146 +#: terminal/models/component/storage.py:144 #: terminal/models/component/terminal.py:91 msgid "Command storage" msgstr "" -#: terminal/models/component/storage.py:214 +#: terminal/models/component/storage.py:212 #: terminal/models/component/terminal.py:92 msgid "Replay storage" msgstr "" @@ -7631,7 +7646,7 @@ msgstr "" msgid "Replay" msgstr "" -#: terminal/models/session/session.py:48 terminal/serializers/session.py:77 +#: terminal/models/session/session.py:48 terminal/serializers/session.py:78 msgid "Command amount" msgstr "" @@ -7639,23 +7654,23 @@ msgstr "" msgid "Error reason" msgstr "" -#: terminal/models/session/session.py:290 +#: terminal/models/session/session.py:308 msgid "Session record" msgstr "" -#: terminal/models/session/session.py:292 +#: terminal/models/session/session.py:310 msgid "Can monitor session" msgstr "" -#: terminal/models/session/session.py:293 +#: terminal/models/session/session.py:311 msgid "Can share session" msgstr "" -#: terminal/models/session/session.py:294 +#: terminal/models/session/session.py:312 msgid "Can terminate session" msgstr "" -#: terminal/models/session/session.py:295 +#: terminal/models/session/session.py:313 msgid "Can validate session action perm" msgstr "" @@ -7755,7 +7770,7 @@ msgstr "" msgid "Command and replay storage" msgstr "Storage" -#: terminal/notifications.py:240 terminal/tasks.py:191 +#: terminal/notifications.py:240 terminal/tasks.py:212 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -7771,19 +7786,19 @@ msgstr "" msgid "Icon" msgstr "" -#: terminal/serializers/applet_host.py:26 +#: terminal/serializers/applet_host.py:24 msgid "Per Device (Device number limit)" msgstr "" -#: terminal/serializers/applet_host.py:27 +#: terminal/serializers/applet_host.py:25 msgid "Per User (User number limit)" msgstr "" -#: terminal/serializers/applet_host.py:39 +#: terminal/serializers/applet_host.py:37 msgid "Core API" msgstr "" -#: terminal/serializers/applet_host.py:40 +#: terminal/serializers/applet_host.py:38 msgid "" " \n" " Tips: The application release machine communicates with the Core " @@ -7797,64 +7812,65 @@ msgid "" " " msgstr "" -#: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207 +#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" msgstr "" -#: terminal/serializers/applet_host.py:50 +#: terminal/serializers/applet_host.py:48 msgid "Existing RDS license" msgstr "" -#: terminal/serializers/applet_host.py:51 +#: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" -#: terminal/serializers/applet_host.py:54 +#: terminal/serializers/applet_host.py:55 msgid "RDS License Server" msgstr "" -#: terminal/serializers/applet_host.py:56 +#: terminal/serializers/applet_host.py:57 msgid "RDS Licensing Mode" msgstr "" -#: terminal/serializers/applet_host.py:59 +#: terminal/serializers/applet_host.py:60 msgid "RDS Single Session Per User" msgstr "" -#: terminal/serializers/applet_host.py:60 +#: terminal/serializers/applet_host.py:61 msgid "" "Tips: A RDS user can have only one session at a time. If set, when next " "login connected, previous session will be disconnected." msgstr "" -#: terminal/serializers/applet_host.py:64 +#: terminal/serializers/applet_host.py:65 msgid "RDS Max Disconnection Time (ms)" msgstr "" -#: terminal/serializers/applet_host.py:66 +#: terminal/serializers/applet_host.py:67 msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." msgstr "" -#: terminal/serializers/applet_host.py:71 +#: terminal/serializers/applet_host.py:72 msgid "RDS Remote App Logoff Time Limit (ms)" msgstr "" -#: terminal/serializers/applet_host.py:73 +#: terminal/serializers/applet_host.py:74 msgid "" "Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " "programs (0 milliseconds, log off the session immediately)." msgstr "" -#: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47 +#: terminal/serializers/applet_host.py:83 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 msgid "Load status" msgstr "" -#: terminal/serializers/applet_host.py:96 +#: terminal/serializers/applet_host.py:97 msgid "" "These accounts are used to connect to the published application, the account " "is now divided into two types, one is dedicated to each account, each user " @@ -7863,26 +7879,26 @@ msgid "" "be used to connect" msgstr "" -#: terminal/serializers/applet_host.py:103 +#: terminal/serializers/applet_host.py:104 msgid "The number of public accounts created automatically" msgstr "" -#: terminal/serializers/applet_host.py:106 +#: terminal/serializers/applet_host.py:107 msgid "" "Connect to the host using the same account first. For security reasons, " "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -#: terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet_host.py:149 msgid "Install applets" msgstr "" -#: terminal/serializers/applet_host.py:178 +#: terminal/serializers/applet_host.py:179 msgid "Host ID" msgstr "" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:180 msgid "Applet ID" msgstr "" @@ -8220,7 +8236,7 @@ msgstr "" msgid "Upload session replay to external storage" msgstr "" -#: terminal/tasks.py:70 +#: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" "If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " "and \n" @@ -8228,54 +8244,58 @@ msgid "" msgstr "" #: terminal/tasks.py:102 +msgid "Upload session replay part file to external storage" +msgstr "" + +#: terminal/tasks.py:123 msgid "Run applet host deployment" msgstr "" -#: terminal/tasks.py:105 +#: terminal/tasks.py:126 msgid "" "When deploying from the remote application publisher details page, and the " "'Deploy' \n" " button is clicked, this task will be executed" msgstr "" -#: terminal/tasks.py:116 +#: terminal/tasks.py:137 msgid "Install applet" msgstr "" -#: terminal/tasks.py:119 +#: terminal/tasks.py:140 msgid "" "When the 'Deploy' button is clicked in the 'Remote Application' section of " "the remote \n" " application publisher details page, this task will be executed" msgstr "" -#: terminal/tasks.py:131 +#: terminal/tasks.py:152 msgid "Uninstall applet" msgstr "" -#: terminal/tasks.py:134 +#: terminal/tasks.py:155 msgid "" "When the 'Uninstall' button is clicked in the 'Remote Application' section " "of the \n" " remote application publisher details page, this task will be executed" msgstr "" -#: terminal/tasks.py:146 +#: terminal/tasks.py:167 msgid "Generate applet host accounts" msgstr "" -#: terminal/tasks.py:149 +#: terminal/tasks.py:170 msgid "" "When a remote publishing server is created and an account needs to be " "created \n" " automatically, this task will be executed" msgstr "" -#: terminal/tasks.py:163 +#: terminal/tasks.py:184 msgid "Check command replay storage connectivity" msgstr "" -#: terminal/tasks.py:165 +#: terminal/tasks.py:186 msgid "" "Check every day at midnight whether the external storage for commands and " "recordings \n" @@ -9116,7 +9136,7 @@ msgstr "" #: users/tasks.py:69 msgid "" -"Check every day at 10 AM whether the users in the system are expired, and " +"Check every day at 2 p.m whether the users in the system are expired, and " "send a \n" " notification 5 days in advance" msgstr "" @@ -9140,7 +9160,7 @@ msgstr "" #: users/tasks.py:113 msgid "" -"At 2 a.m. every day, according to the configuration in \"System Settings - " +"At 2 p.m. every day, according to the configuration in \"System Settings - " "Security - \n" " Auth security - Auto disable threshold\" users who have not logged " "in or whose API keys \n" @@ -10109,21 +10129,25 @@ msgstr "" #: xpack/plugins/cloud/tasks.py:33 msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are " -"performed" +"\n" +" Execute this task when manually or scheduled cloud synchronization " +"tasks are performed\n" +" " msgstr "" -#: xpack/plugins/cloud/tasks.py:50 +#: xpack/plugins/cloud/tasks.py:52 msgid "Period clean sync instance task execution" msgstr "" -#: xpack/plugins/cloud/tasks.py:52 +#: xpack/plugins/cloud/tasks.py:54 msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - " -"Regular \n" +"\n" +" Every day, according to the configuration in \"System Settings - " +"Tasks - Regular \n" " clean-up - Cloud sync task history retention days\" the system will " "clean up the execution \n" -" records generated by cloud synchronization" +" records generated by cloud synchronization\n" +" " msgstr "" #: xpack/plugins/interface/api.py:52 diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 5f9423de2..fa9a02acf 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 17:22+0800\n" +"POT-Creation-Date: 2024-09-19 16:31+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -188,8 +188,7 @@ msgstr "集めました" msgid "Template" msgstr "テンプレート" -#: accounts/const/account.py:32 ops/const.py:46 -#: xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "スキップ" @@ -342,14 +341,14 @@ msgstr "ユーザー %s がパスワードを閲覧/導き出しました" #: accounts/models/account.py:49 #: accounts/models/automations/gather_account.py:16 #: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:271 +#: accounts/serializers/account/account.py:272 #: accounts/serializers/account/gathered_account.py:10 #: accounts/serializers/automations/change_secret.py:111 #: accounts/serializers/automations/change_secret.py:143 #: accounts/templates/accounts/asset_account_change_info.html:7 #: accounts/templates/accounts/change_secret_failed_info.html:11 -#: acls/serializers/base.py:123 assets/models/asset/common.py:95 -#: assets/models/asset/common.py:355 assets/models/cmd_filter.py:36 +#: acls/serializers/base.py:123 assets/models/asset/common.py:102 +#: assets/models/asset/common.py:362 assets/models/cmd_filter.py:36 #: audits/models.py:58 authentication/models/connection_token.py:36 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:32 terminal/notifications.py:155 @@ -362,8 +361,8 @@ msgstr "資産" #: accounts/models/account.py:53 accounts/models/template.py:16 #: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:281 -#: accounts/serializers/account/template.py:27 +#: accounts/serializers/account/account.py:282 +#: accounts/serializers/account/template.py:37 #: authentication/serializers/connect_token_secret.py:50 msgid "Su from" msgstr "から切り替え" @@ -392,8 +391,8 @@ msgstr "ソース ID" #: assets/serializers/gateway.py:33 audits/models.py:59 #: authentication/api/connection_token.py:411 ops/models/base.py:18 #: perms/models/asset_permission.py:75 settings/serializers/msg.py:33 -#: terminal/backends/command/models.py:18 -#: terminal/models/session/session.py:34 terminal/serializers/command.py:72 +#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 +#: terminal/serializers/command.py:72 #: terminal/templates/terminal/_msg_command_warning.html:8 #: terminal/templates/terminal/_msg_session_sharing.html:8 #: tickets/models/ticket/command_confirm.py:13 @@ -587,7 +586,7 @@ msgstr "終了日" #: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:147 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:225 @@ -596,7 +595,7 @@ msgid "Status" msgstr "ステータス" #: accounts/models/automations/change_secret.py:46 -#: accounts/serializers/account/account.py:273 +#: accounts/serializers/account/account.py:274 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:8 #: authentication/templates/authentication/passkey.html:173 @@ -672,7 +671,7 @@ msgid "Verify asset account" msgstr "アカウントの確認" #: accounts/models/base.py:37 accounts/models/base.py:67 -#: accounts/serializers/account/account.py:463 +#: accounts/serializers/account/account.py:464 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:47 #: authentication/serializers/connect_token_secret.py:42 @@ -694,19 +693,19 @@ msgstr "ひみつ" msgid "Secret strategy" msgstr "鍵ポリシー" -#: accounts/models/base.py:44 accounts/serializers/account/template.py:24 +#: accounts/models/base.py:44 accounts/serializers/account/template.py:34 #: accounts/serializers/automations/change_secret.py:46 msgid "Password rules" msgstr "パスワードルール" #: accounts/models/base.py:64 accounts/serializers/account/virtual.py:20 #: acls/models/base.py:35 acls/models/base.py:96 acls/models/command_acl.py:21 -#: acls/serializers/base.py:35 assets/models/asset/common.py:93 -#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 +#: acls/serializers/base.py:35 assets/models/asset/common.py:100 +#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 -#: assets/serializers/platform.py:273 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:157 +#: assets/serializers/platform.py:277 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 @@ -717,11 +716,9 @@ msgstr "パスワードルール" #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 -#: terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 -#: terminal/models/component/storage.py:26 -#: terminal/models/component/task.py:13 +#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:85 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -782,7 +779,8 @@ msgstr "ユーザーと同じユーザー名" #: accounts/models/virtual.py:37 msgid "Non-asset account, Input username/password on connect" -msgstr "アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" +msgstr "" +"アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" #: accounts/models/virtual.py:38 msgid "The account username name same with user on connect" @@ -792,7 +790,9 @@ msgstr "接続時にユーザー名と同じユーザー名を使用します" msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタイプのアセットのみをサポートします" +msgstr "" +"ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタ" +"イプのアセットのみをサポートします" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -802,7 +802,9 @@ msgstr "アカウントバックアップルートタスクの結果の通知" msgid "" "{} - The account backup passage task has been completed. See the attachment " "for details" -msgstr "{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご覧ください" +msgstr "" +"{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご" +"覧ください" #: accounts/notifications.py:25 msgid "" @@ -810,8 +812,9 @@ msgid "" "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" msgstr "" -"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> " -"プリファレンス設定の基本的なファイル暗号化パスワードの設定" +"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定" +"されていません-個人情報にアクセスしてください-> プリファレンス設定の基本的な" +"ファイル暗号化パスワードの設定" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -829,7 +832,8 @@ msgid "" "has not been set - please go to personal information -> set encryption " "password in preferences" msgstr "" -"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" +"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人" +"情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -851,10 +855,15 @@ msgstr "パラメータ" msgid "Exist policy" msgstr "アカウントの存在ポリシー" +#: accounts/serializers/account/account.py:181 +#: accounts/serializers/account/account.py:340 +msgid "Account already exists" +msgstr "アカウントはすでに存在しています" + #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 -#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 -#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 +#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:172 +#: assets/serializers/platform.py:278 perms/serializers/user_permission.py:26 #: settings/models.py:37 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -864,13 +873,13 @@ msgstr "カテゴリ" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 -#: assets/serializers/platform.py:167 audits/serializers.py:53 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:159 +#: assets/serializers/platform.py:171 audits/serializers.py:53 #: audits/serializers.py:170 -#: authentication/serializers/connect_token_secret.py:126 -#: ops/models/job.py:150 perms/serializers/user_permission.py:27 -#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 -#: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 +#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 +#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 +#: terminal/models/component/storage.py:58 +#: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 #: tickets/models/flow.py:42 tickets/models/ticket/apply_application.py:16 @@ -883,26 +892,26 @@ msgstr "タイプ" msgid "Asset not found" msgstr "資産が存在しません" -#: accounts/serializers/account/account.py:262 +#: accounts/serializers/account/account.py:263 msgid "Has secret" msgstr "エスクローされたパスワード" -#: accounts/serializers/account/account.py:272 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:273 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "状態" -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:275 msgid "Changed" msgstr "編集済み" -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:285 #: accounts/serializers/automations/base.py:22 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:19 #: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 -#: assets/serializers/platform.py:176 assets/serializers/platform.py:208 +#: assets/serializers/platform.py:180 assets/serializers/platform.py:212 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 #: perms/serializers/permission.py:46 @@ -911,40 +920,35 @@ msgstr "編集済み" msgid "Assets" msgstr "資産" -#: accounts/serializers/account/account.py:339 -msgid "Account already exists" -msgstr "アカウントはすでに存在しています" - -#: accounts/serializers/account/account.py:389 +#: accounts/serializers/account/account.py:390 #, python-format msgid "Asset does not support this secret type: %s" msgstr "アセットはアカウント タイプをサポートしていません: %s" -#: accounts/serializers/account/account.py:421 +#: accounts/serializers/account/account.py:422 msgid "Account has exist" msgstr "アカウントはすでに存在しています" -#: accounts/serializers/account/account.py:458 +#: accounts/serializers/account/account.py:459 #: accounts/serializers/account/base.py:93 -#: accounts/serializers/account/template.py:72 +#: accounts/serializers/account/template.py:83 #: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特別情報" -#: accounts/serializers/account/account.py:464 +#: accounts/serializers/account/account.py:465 #: authentication/serializers/connect_token_secret.py:159 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 +#: accounts/serializers/account/account.py:475 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 -#: audits/models.py:54 audits/models.py:90 audits/models.py:172 -#: audits/models.py:271 audits/serializers.py:171 -#: authentication/models/connection_token.py:32 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 +#: audits/models.py:90 audits/models.py:172 audits/models.py:271 +#: audits/serializers.py:171 authentication/models/connection_token.py:32 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 @@ -961,7 +965,7 @@ msgstr "ID" msgid "User" msgstr "ユーザー" -#: accounts/serializers/account/account.py:475 +#: accounts/serializers/account/account.py:476 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:158 terminal/notifications.py:207 msgid "Date" @@ -994,7 +998,8 @@ msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." msgstr "" -"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの場合は、`username@domain`のようになります。" +"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの" +"場合は、`username@domain`のようになります。" #: accounts/serializers/account/template.py:13 msgid "Password length" @@ -1022,26 +1027,45 @@ msgstr "特殊記号" msgid "Exclude symbol" msgstr "除外文字" -#: accounts/serializers/account/template.py:39 +#: accounts/serializers/account/template.py:24 +msgid "" +"length is the length of the password, and the range is 8 to 30.\n" +"lowercase indicates whether the password contains lowercase letters, \n" +"uppercase indicates whether it contains uppercase letters,\n" +"digit indicates whether it contains numbers, and symbol indicates whether it " +"contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the " +"symbol characters to be excluded (up to 16). \n" +"If you do not need to exclude symbols, you can leave it blank.\n" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " +"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +msgstr "" +"length はパスワードの長さで、範囲は 8 ~ 30 です。" +"小文字はパスワードに小文字が含まれるかどうかを示し、大文字はパスワードに大文字が含まれるかどうかを示します。" +"digit は数字が含まれているかどうかを示し、symbol は特殊記号が含まれているかどうかを示します。" +"exclude_symbols は、特定のシンボルを除外するために使用します (最大 16 文字)。シンボルを除外する必要がない場合は、空白のままにすることができます。" +"デフォルト: {\"長さ\": 16、\"小文字\": true、\"大文字\": true、\"数字\": true、\"シンボル\": true、\"exclude_symbols\": \"\"}" + +#: accounts/serializers/account/template.py:49 msgid "Secret generation strategy for account creation" msgstr "账号创建时,密文生成策略" -#: accounts/serializers/account/template.py:40 +#: accounts/serializers/account/template.py:50 msgid "Whether to automatically push the account to the asset" msgstr "是否自动推送账号到资产" -#: accounts/serializers/account/template.py:43 +#: accounts/serializers/account/template.py:53 msgid "" "Associated platform, you can configure push parameters. If not associated, " "default parameters will be used" msgstr "关联平台,可以配置推送参数,如果不关联,则使用默认参数" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 -#: ops/models/adhoc.py:25 ops/models/job.py:158 ops/models/playbook.py:33 -#: rbac/models/role.py:37 settings/models.py:40 -#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:332 -#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:25 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 +#: ops/models/job.py:158 ops/models/playbook.py:33 rbac/models/role.py:37 +#: settings/models.py:40 terminal/models/applet/applet.py:46 +#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 +#: terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 @@ -1056,13 +1080,14 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: 資産シークレット内の同じアカウント > ログインシークレット > " -"手動入力.
セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定してください。 " +"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: " +"資産シークレット内の同じアカウント > ログインシークレット > 手動入力.
" +"セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定して" +"ください。 " #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172 -#: assets/serializers/automations/base.py:21 -#: perms/serializers/permission.py:47 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:172 +#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47 msgid "Nodes" msgstr "ノード" @@ -1092,7 +1117,8 @@ msgstr "アカウントのユーザー名を入力してください" msgid "" "Secret parameter settings, currently only effective for assets of the host " "type." -msgstr "パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" +msgstr "" +"パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" #: accounts/serializers/automations/change_secret.py:84 msgid "* Please enter the correct password length" @@ -1128,11 +1154,16 @@ msgstr "アカウント実行の自動化" #: accounts/tasks/automation.py:35 msgid "" -"Unified execution entry for account automation tasks: when the system performs tasks \n" -" such as account push, password change, account verification, account collection, \n" -" and gateway account verification, all tasks are executed through this unified entry" +"Unified execution entry for account automation tasks: when the system " +"performs tasks \n" +" such as account push, password change, account verification, account " +"collection, \n" +" and gateway account verification, all tasks are executed through " +"this unified entry" msgstr "" -"アカウント自動化タスクの一元的な実行入口で、システムがアカウントのプッシュ、パスワードの変更、アカウントの確認、アカウントの収集、ゲートウェイアカウントのバリデーションタスクを実行する際、統一して現行のタスクを実行します" +"アカウント自動化タスクの一元的な実行入口で、システムがアカウントのプッシュ、" +"パスワードの変更、アカウントの確認、アカウントの収集、ゲートウェイアカウント" +"のバリデーションタスクを実行する際、統一して現行のタスクを実行します" #: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72 msgid "Execute automation record" @@ -1140,8 +1171,7 @@ msgstr "自動化レコードを実行する" #: accounts/tasks/automation.py:67 msgid "When manually executing password change records, this task is used" -msgstr "" -"パスワード変更記録を手動で実行する際は、このタスクを通じて実行します" +msgstr "パスワード変更記録を手動で実行する際は、このタスクを通じて実行します" #: accounts/tasks/automation.py:96 msgid "Clean change secret and push record period" @@ -1149,16 +1179,30 @@ msgstr "パスワード変更記録とプッシュ記録を定期的にクリア #: accounts/tasks/automation.py:98 msgid "" -"The system will periodically clean up unnecessary password change and push records, \n" -" including their associated change tasks, execution logs, assets, and accounts. When any \n" -" of these associated items are deleted, the corresponding password change and push records \n" -" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" -" clean up expired records at 2 a.m daily, based on the interval specified by \n" -" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" -" mechanism helps free up storage space and enhances the security and overall performance \n" +"The system will periodically clean up unnecessary password change and push " +"records, \n" +" including their associated change tasks, execution logs, assets, and " +"accounts. When any \n" +" of these associated items are deleted, the corresponding password " +"change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient " +"database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval " +"specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " +"This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and " +"overall performance \n" " of data management" msgstr "" -"システムは定期的に不要なパスワード変更記録とプッシュ記録をクリーンアップします。これには、関連するパスワード変更タスク、実行記録、資産、アカウントが含まれます。これらの関連項目のいずれかが削除されると、対応するパスワード変更記録とプッシュ記録は無効となります。したがって、データベースの整理と高速運用のために、システム設定ファイルの config.txt の PERM_EXPIRED_CHECK_PERIODIC の時間間隔に従って毎日午前2時に時間を超えた記録をクリーニングします。この定期的なクリーニングメカニズムは、ストレージスペースの解放とデータ管理のセキュリティとパフォーマンスの向上の両方に役立ちます" +"システムは定期的に不要なパスワード変更記録とプッシュ記録をクリーンアップしま" +"す。これには、関連するパスワード変更タスク、実行記録、資産、アカウントが含ま" +"れます。これらの関連項目のいずれかが削除されると、対応するパスワード変更記録" +"とプッシュ記録は無効となります。したがって、データベースの整理と高速運用のた" +"めに、システム設定ファイルの config.txt の PERM_EXPIRED_CHECK_PERIODIC の時間" +"間隔に従って毎日午前2時に時間を超えた記録をクリーニングします。この定期的なク" +"リーニングメカニズムは、ストレージスペースの解放とデータ管理のセキュリティと" +"パフォーマンスの向上の両方に役立ちます" #: accounts/tasks/backup_account.py:26 msgid "Execute account backup plan" @@ -1167,7 +1211,8 @@ msgstr "アカウントのバックアップ計画を実施する" #: accounts/tasks/backup_account.py:29 msgid "When performing scheduled or manual account backups, this task is used" msgstr "" -"定時または手動でアカウントバックアップを実行する際は、このタスクを通じて実行します" +"定時または手動でアカウントバックアップを実行する際は、このタスクを通じて実行" +"します" #: accounts/tasks/gather_accounts.py:32 assets/tasks/automation.py:27 #: orgs/tasks.py:11 terminal/tasks.py:33 @@ -1187,14 +1232,17 @@ msgid "" "When creating or modifying an account requires account push, this task is " "executed" msgstr "" -"アカウントの作成、アカウントの変更を行う際、アカウントプッシュが必要な場合はこのタスクを実行します" +"アカウントの作成、アカウントの変更を行う際、アカウントプッシュが必要な場合は" +"このタスクを実行します" #: accounts/tasks/remove_account.py:28 msgid "" -"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " +"accounts' this \n" " task will be executed" msgstr "" -"コントロールパネル-オートメーション-アカウント収集-収集したアカウント-同期削除をクリックすると、このタスクが実行されます" +"コントロールパネル-オートメーション-アカウント収集-収集したアカウント-同期削" +"除をクリックすると、このタスクが実行されます" #: accounts/tasks/remove_account.py:50 msgid "Clean historical accounts" @@ -1202,12 +1250,18 @@ msgstr "過去のアカウントをクリアする" #: accounts/tasks/remove_account.py:52 msgid "" -"Each time an asset account is updated, a historical account is generated, so it is \n" -" necessary to clean up the asset account history. The system will clean up excess account \n" -" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" +"Each time an asset account is updated, a historical account is generated, so " +"it is \n" +" necessary to clean up the asset account history. The system will " +"clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System " +"settings - Features - \n" " Account storage - Record limit" msgstr "" -"資産アカウントを更新するたびに、歴史的なアカウントが生成されるため、資産アカウントの履歴をクリーニングする必要があります。システムは、アカウントストレージ-レコード制限の設定に基づき、毎日午前2時に超過した数量のアカウントレコードをクリーニングします" +"資産アカウントを更新するたびに、歴史的なアカウントが生成されるため、資産アカ" +"ウントの履歴をクリーニングする必要があります。システムは、アカウントストレー" +"ジ-レコード制限の設定に基づき、毎日午前2時に超過した数量のアカウントレコード" +"をクリーニングします" #: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." @@ -1219,10 +1273,12 @@ msgstr "関連するアカウントへの情報の同期" #: accounts/tasks/template.py:14 msgid "" -"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" +"When clicking 'Sync new secret to accounts' in 'Console - Account - " +"Templates - \n" " Accounts' this task will be executed" msgstr "" -"コントロールパネル-アカウントテンプレート-アカウント-同期アカウント情報更新をクリックして同期すると、このタスクが実行されます" +"コントロールパネル-アカウントテンプレート-アカウント-同期アカウント情報更新を" +"クリックして同期すると、このタスクが実行されます" #: accounts/tasks/vault.py:32 msgid "Sync secret to vault" @@ -1233,20 +1289,22 @@ msgid "" "When clicking 'Sync' in 'System Settings - Features - Account Storage' this " "task will be executed" msgstr "" -"システム設定-機能設定-アカウントストレージをクリックして同期すると、このタスクが実行されます" +"システム設定-機能設定-アカウントストレージをクリックして同期すると、このタス" +"クが実行されます" -#: accounts/tasks/verify_account.py:50 +#: accounts/tasks/verify_account.py:49 msgid "Verify asset account availability" msgstr "アセット アカウントの可用性を確認する" -#: accounts/tasks/verify_account.py:53 +#: accounts/tasks/verify_account.py:52 msgid "" "When clicking 'Test' in 'Console - Asset details - Accounts' this task will " "be executed" msgstr "" -"コントロールパネル-資産詳細-アカウントをクリックしてテストを実行すると、このタスクが実行されます" +"コントロールパネル-資産詳細-アカウントをクリックしてテストを実行すると、この" +"タスクが実行されます" -#: accounts/tasks/verify_account.py:59 +#: accounts/tasks/verify_account.py:58 msgid "Verify accounts connectivity" msgstr "アカウント接続のテスト" @@ -1275,13 +1333,16 @@ msgstr "尊敬する" msgid "" "Hello! The following is the failure of changing the password of your assets " "or pushing the account. Please check and handle it in time." -msgstr "こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとおりです。 時間内に確認して対処してください。" +msgstr "" +"こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとお" +"りです。 時間内に確認して対処してください。" #: accounts/utils.py:52 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not" -" allowed." -msgstr "パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" +"If the password starts with {{` and ends with }} `, then the password is not " +"allowed." +msgstr "" +"パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" #: accounts/utils.py:59 msgid "private key invalid or passphrase error" @@ -1331,7 +1392,7 @@ msgstr "1-100、低い値は最初に一致します" msgid "Reviewers" msgstr "レビュー担当者" -#: acls/models/base.py:43 assets/models/asset/common.py:171 +#: acls/models/base.py:43 assets/models/asset/common.py:178 #: authentication/models/access_key.py:25 #: authentication/models/connection_token.py:53 #: authentication/models/ssh_key.py:13 @@ -1451,9 +1512,9 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* はすべて一致することを示します。例: " -"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64" -" (ドメイン名サポート)" +"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" +"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64 (ドメイン名サ" +"ポート)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1481,14 +1542,14 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* はすべて一致することを示します。例: " -"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" +"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" +"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:149 xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1522,7 +1583,9 @@ msgid "" "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." msgstr "" -"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してください。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必要な措置を講じてください。" +"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してくださ" +"い。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必" +"要な措置を講じてください。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -1549,11 +1612,13 @@ msgstr "ログイン都市" msgid "User agent" msgstr "ユーザーエージェント" -#: assets/api/asset/asset.py:181 +#: assets/api/asset/asset.py:190 msgid "Cannot create asset directly, you should create a host or other" -msgstr "資産を直接作成することはできません。ホストまたはその他を作成する必要があります" +msgstr "" +"資産を直接作成することはできません。ホストまたはその他を作成する必要がありま" +"す" -#: assets/api/asset/asset.py:185 +#: assets/api/asset/asset.py:194 msgid "The number of assets exceeds the limit of 5000" msgstr "資産の数が5000の制限を超えています" @@ -1658,7 +1723,7 @@ msgid "Gather facts" msgstr "資産情報の収集" #: assets/const/base.py:32 audits/const.py:58 -#: terminal/serializers/applet_host.py:34 users/models/user/_auth.py:32 +#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32 msgid "Disabled" msgstr "無効" @@ -1749,8 +1814,9 @@ msgstr "openssh 5.x または 6.x などの古い SSH バージョン" #: assets/const/protocol.py:53 msgid "Netcat help text" msgstr "" -"netcat (nc) をプロキシ ツールとして使用し、プロキシ サーバーからターゲット ホストに接続を転送します。 SSH ネイティブ エージェント " -"オプション (-W) がサポートされていない環境、またはより柔軟なタイムアウト制御が必要な環境に最適です。" +"netcat (nc) をプロキシ ツールとして使用し、プロキシ サーバーからターゲット ホ" +"ストに接続を転送します。 SSH ネイティブ エージェント オプション (-W) がサポー" +"トされていない環境、またはより柔軟なタイムアウト制御が必要な環境に最適です。" #: assets/const/protocol.py:64 msgid "SFTP root" @@ -1763,7 +1829,9 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントのユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}ユーザーのユーザー名" +"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントの" +"ユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}" +"ユーザーのユーザー名" #: assets/const/protocol.py:81 msgid "Console" @@ -1784,17 +1852,20 @@ msgstr "セキュリティ" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the" -" security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the " +"security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされているセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します
RDP
レガシーRDP暗号化。このモードは、通常、古い" -" " -"Windowsサーバーや標準のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装されたRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名とパスワードを提供する必要があります
" +"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされて" +"いるセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します" +"
RDP
レガシーRDP暗号化。このモードは、通常、古い Windowsサーバーや標準" +"のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装され" +"たRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名と" +"パスワードを提供する必要があります
" #: assets/const/protocol.py:106 msgid "AD domain" @@ -1870,7 +1941,9 @@ msgstr "安全モード" msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへのアクセスなど、一部の操作が無効になります" +msgstr "" +"安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへ" +"のアクセスなど、一部の操作が無効になります" #: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -1909,51 +1982,51 @@ msgstr "この機能は一時的にサポートされていません" msgid "Cloud" msgstr "クラウド サービス" -#: assets/models/asset/common.py:94 assets/models/platform.py:16 +#: assets/models/asset/common.py:101 assets/models/platform.py:16 #: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77 #: settings/serializers/msg.py:31 terminal/serializers/storage.py:133 #: xpack/plugins/cloud/serializers/account_attrs.py:73 msgid "Port" msgstr "ポート" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "アドレス" -#: assets/models/asset/common.py:162 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:149 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 msgid "Platform" msgstr "プラットフォーム" -#: assets/models/asset/common.py:166 assets/models/domain.py:22 +#: assets/models/asset/common.py:173 assets/models/domain.py:22 msgid "Zone" msgstr "ゾーン" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:408 +#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:408 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "資産ハードウェア情報の収集" -#: assets/models/asset/common.py:173 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "カスタム属性" -#: assets/models/asset/common.py:358 +#: assets/models/asset/common.py:365 msgid "Can refresh asset hardware info" msgstr "資産ハードウェア情報を更新できます" -#: assets/models/asset/common.py:359 +#: assets/models/asset/common.py:366 msgid "Can test asset connectivity" msgstr "資産接続をテストできます" -#: assets/models/asset/common.py:360 +#: assets/models/asset/common.py:367 msgid "Can match asset" msgstr "アセットを一致させることができます" -#: assets/models/asset/common.py:361 +#: assets/models/asset/common.py:368 msgid "Can change asset nodes" msgstr "資産ノードを変更できます" @@ -2090,7 +2163,7 @@ msgstr "値" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 -#: assets/serializers/platform.py:154 +#: assets/serializers/platform.py:158 #: authentication/serializers/connect_token_secret.py:124 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 @@ -2141,7 +2214,7 @@ msgstr "主要" msgid "Required" msgstr "必要" -#: assets/models/platform.py:19 assets/serializers/platform.py:156 +#: assets/models/platform.py:19 assets/serializers/platform.py:160 #: terminal/models/component/storage.py:28 #: xpack/plugins/cloud/providers/nutanix.py:30 msgid "Default" @@ -2159,7 +2232,7 @@ msgstr "設定" #: assets/models/platform.py:38 audits/const.py:59 #: authentication/backends/passkey/models.py:11 settings/models.py:39 -#: terminal/serializers/applet_host.py:35 users/models/user/_auth.py:33 +#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "有効化" @@ -2249,23 +2322,23 @@ msgstr "メタ" msgid "Internal" msgstr "ビルトイン" -#: assets/models/platform.py:102 assets/serializers/platform.py:166 +#: assets/models/platform.py:102 assets/serializers/platform.py:170 msgid "Charset" msgstr "シャーセット" -#: assets/models/platform.py:104 assets/serializers/platform.py:204 +#: assets/models/platform.py:104 assets/serializers/platform.py:208 msgid "Gateway enabled" msgstr "ゲートウェイが有効になりました" -#: assets/models/platform.py:106 assets/serializers/platform.py:197 +#: assets/models/platform.py:106 assets/serializers/platform.py:201 msgid "Su enabled" msgstr "アカウントの切り替えを有効にする" -#: assets/models/platform.py:107 assets/serializers/platform.py:172 +#: assets/models/platform.py:107 assets/serializers/platform.py:176 msgid "Su method" msgstr "アカウントの切り替え方法" -#: assets/models/platform.py:108 assets/serializers/platform.py:175 +#: assets/models/platform.py:108 assets/serializers/platform.py:179 msgid "Custom fields" msgstr "カスタムフィールド" @@ -2278,9 +2351,11 @@ msgstr "%(value)s は偶数ではありません" msgid "" "Batch update platform in assets, skipping assets that do not meet platform " "type" -msgstr "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プラットフォーム" +msgstr "" +"プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プ" +"ラットフォーム" -#: assets/serializers/asset/common.py:36 +#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:152 msgid "Protocols, format is [\"protocol/port\"]" msgstr "契約書、形式は[\"契約書/ポート\"]" @@ -2292,15 +2367,19 @@ msgstr "契約書、形式は 名前/ポート" msgid "" "Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " "\"secret_type\": \"password\"}]" -msgstr "アカウント、形式は [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"パスワード\"}]" +msgstr "" +"アカウント、形式は [{\"name\": \"x\", \"username\": \"x\", \"secret\": " +"\"x\", \"secret_type\": \"パスワード\"}]" #: assets/serializers/asset/common.py:135 msgid "" "Node path, format [\"/org_name/node_name\"], if node not exist, will create " "it" -msgstr "ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作成します" +msgstr "" +"ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作" +"成します" -#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:173 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 @@ -2342,22 +2421,29 @@ msgstr "デフォルト・データベース" #: assets/serializers/asset/database.py:23 msgid "CA cert help text" msgstr "" -" Common Name (CN) フィールドは廃止されました。RFC 5280に基づき、Subject Alternative Name (SAN) " -"フィールドを使用してドメイン名を確認し、セキュリティを強化してください" +" Common Name (CN) フィールドは廃止されました。RFC 5280に基づき、Subject " +"Alternative Name (SAN) フィールドを使用してドメイン名を確認し、セキュリティを" +"強化してください" #: assets/serializers/asset/database.py:24 msgid "Postgresql ssl model help text" msgstr "" -"Prefer:私は暗号化に関心はありませんが、サーバーが暗号化をサポートしているなら、私は暗号化のコストを支払うことを喜んでいます。Require:私のデータを暗号化してほしい、そのコストを受け入れます。私はネットワークが私が接続したいサーバーに常に接続できるように保証してくれると信じています。Verify" -" CA:私はデータが暗号化され、コストを受け入れます。私が信頼するサーバーに接続されていることを確認したい。Verify " -"Full:私はデータが暗号化され、コストを受け入れます。私が信頼するサーバーに接続されていること、そしてそれが私が指定したサーバーであることを確認したい" +"Prefer:私は暗号化に関心はありませんが、サーバーが暗号化をサポートしているな" +"ら、私は暗号化のコストを支払うことを喜んでいます。Require:私のデータを暗号化" +"してほしい、そのコストを受け入れます。私はネットワークが私が接続したいサー" +"バーに常に接続できるように保証してくれると信じています。Verify CA:私はデータ" +"が暗号化され、コストを受け入れます。私が信頼するサーバーに接続されていること" +"を確認したい。Verify Full:私はデータが暗号化され、コストを受け入れます。私が" +"信頼するサーバーに接続されていること、そしてそれが私が指定したサーバーである" +"ことを確認したい" #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an" -" HTTP proxy. e.g. http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an " +"HTTP proxy. e.g. http(s)://host:port" msgstr "" -"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要があります。例: http(s)://host:port" +"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要" +"があります。例: http(s)://host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2429,9 +2515,11 @@ msgstr "タイプ" msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." -msgstr "ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続する際には、接続はゲートウェイを通してルーティングされます。" +msgstr "" +"ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続す" +"る際には、接続はゲートウェイを通してルーティングされます。" -#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 +#: assets/serializers/domain.py:24 assets/serializers/platform.py:181 #: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "資産数量" @@ -2500,7 +2588,9 @@ msgstr "アドレスからのポート" msgid "" "This protocol is primary, and it must be set when adding assets. " "Additionally, there can only be one primary protocol." -msgstr "このプロトコルはプライマリであり、資産を追加するときに設定する必要があります。また、プライマリプロトコルは1つしかありません" +msgstr "" +"このプロトコルはプライマリであり、資産を追加するときに設定する必要がありま" +"す。また、プライマリプロトコルは1つしかありません" #: assets/serializers/platform.py:102 msgid "This protocol is required, and it must be set when adding assets." @@ -2510,46 +2600,50 @@ msgstr "このプロトコルは必須であり、資産を追加するときに msgid "" "This protocol is default, when adding assets, it will be displayed by " "default." -msgstr "このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されます" +msgstr "" +"このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されま" +"す" #: assets/serializers/platform.py:108 msgid "This protocol is public, asset will show this protocol to user" -msgstr "このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" +msgstr "" +"このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" -#: assets/serializers/platform.py:157 +#: assets/serializers/platform.py:161 msgid "Help text" msgstr "ヘルプ" -#: assets/serializers/platform.py:158 +#: assets/serializers/platform.py:162 msgid "Choices" msgstr "せんたく" -#: assets/serializers/platform.py:170 +#: assets/serializers/platform.py:174 msgid "Automation" msgstr "オートメーション" -#: assets/serializers/platform.py:199 +#: assets/serializers/platform.py:203 msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " "root" msgstr "" -"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに切り替えます。これは、通常のアカウントでログインした後に root " -"に切り替えるのと似ています" +"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに" +"切り替えます。これは、通常のアカウントでログインした後に root に切り替えるの" +"と似ています" -#: assets/serializers/platform.py:205 +#: assets/serializers/platform.py:209 msgid "Assets can be connected using a zone gateway" msgstr "資産はゾーンゲートウェイを使用して接続できます" -#: assets/serializers/platform.py:207 +#: assets/serializers/platform.py:211 msgid "Default Domain" msgstr "デフォルト ドメイン" -#: assets/serializers/platform.py:229 +#: assets/serializers/platform.py:233 msgid "type is required" msgstr "タイプ このフィールドは必須です." -#: assets/serializers/platform.py:244 +#: assets/serializers/platform.py:248 msgid "Protocols is required" msgstr "同意が必要です" @@ -2571,10 +2665,12 @@ msgstr "資産情報の収集" #: assets/tasks/gather_facts.py:25 msgid "" -"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " +"this task \n" " will be executed" msgstr "" -"コントロールパネル資産詳細-基本設定をクリックしてハードウェア情報を更新すると、このタスクが実行されます" +"コントロールパネル資産詳細-基本設定をクリックしてハードウェア情報を更新する" +"と、このタスクが実行されます" #: assets/tasks/gather_facts.py:44 msgid "Update assets hardware info: " @@ -2590,17 +2686,21 @@ msgstr "ノード下のアセット数を確認する" #: assets/tasks/nodes_amount.py:18 msgid "" -"Manually verifying asset quantities updates the asset count for nodes under the \n" -" current organization. This task will be called in the following two cases: when updating \n" +"Manually verifying asset quantities updates the asset count for nodes under " +"the \n" +" current organization. This task will be called in the following two " +"cases: when updating \n" " nodes and when the number of nodes exceeds 100" msgstr "" -"手動で資産数を校正して現在の組織のノード資産数を更新する;ノードを更新する、ノード数が100を超えると、このタスクが呼び出されます" +"手動で資産数を校正して現在の組織のノード資産数を更新する;ノードを更新する、" +"ノード数が100を超えると、このタスクが呼び出されます" #: assets/tasks/nodes_amount.py:34 msgid "" -"The task of self-checking is already running and cannot be started " -"repeatedly" -msgstr "セルフチェックのタスクはすでに実行されており、繰り返し開始することはできません" +"The task of self-checking is already running and cannot be started repeatedly" +msgstr "" +"セルフチェックのタスクはすでに実行されており、繰り返し開始することはできませ" +"ん" #: assets/tasks/nodes_amount.py:40 msgid "Periodic check the amount of assets under the node" @@ -2608,10 +2708,12 @@ msgstr "ノードの下にあるアセットの数を定期的に確認する" #: assets/tasks/nodes_amount.py:42 msgid "" -"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" +"Schedule the check_node_assets_amount_task to periodically update the asset " +"count of \n" " all nodes under all organizations" msgstr "" -"check_node_assets_amount_taskタスクを定期的に呼び出し、すべての組織のすべてのノードの資産数を更新します" +"check_node_assets_amount_taskタスクを定期的に呼び出し、すべての組織のすべての" +"ノードの資産数を更新します" #: assets/tasks/ping.py:20 assets/tasks/ping.py:30 msgid "Test assets connectivity" @@ -2622,7 +2724,8 @@ msgid "" "When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' " "this task will be executed" msgstr "" -"資産詳細-基本設定をクリックして資産の接続性をテストすると、このタスクが実行されます" +"資産詳細-基本設定をクリックして資産の接続性をテストすると、このタスクが実行さ" +"れます" #: assets/tasks/ping.py:46 msgid "Test if the assets under the node are connectable " @@ -2635,10 +2738,11 @@ msgstr "ゲートウェイ接続のテスト。" #: assets/tasks/ping_gateway.py:23 msgid "" -"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" -" be executed" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " +"be executed" msgstr "" -"ネットワーク詳細-ゲートウェイ-接続テストを実行する際に、このタスクを実行します" +"ネットワーク詳細-ゲートウェイ-接続テストを実行する際に、このタスクを実行しま" +"す" #: assets/tasks/utils.py:16 msgid "Asset has been disabled, skipped: {}" @@ -2661,8 +2765,7 @@ msgid "App Audits" msgstr "監査" #: audits/backends/db.py:17 -msgid "" -"The text content is too long. Use Elasticsearch to store operation logs" +msgid "The text content is too long. Use Elasticsearch to store operation logs" msgstr "文章の内容が長すぎる。Elasticsearchで操作履歴を保存する" #: audits/backends/db.py:108 @@ -2697,7 +2800,7 @@ msgstr "Symlink" #: audits/const.py:18 audits/const.py:28 #: ops/templates/ops/celery_task_log.html:86 -#: terminal/api/session/session.py:149 +#: terminal/api/session/session.py:153 msgid "Download" msgstr "ダウンロード" @@ -2705,7 +2808,7 @@ msgstr "ダウンロード" msgid "Rename dir" msgstr "マップディレクトリ" -#: audits/const.py:23 rbac/tree.py:266 terminal/api/session/session.py:274 +#: audits/const.py:23 rbac/tree.py:266 terminal/api/session/session.py:281 #: terminal/templates/terminal/_msg_command_warning.html:18 #: terminal/templates/terminal/_msg_session_sharing.html:10 #: xpack/plugins/cloud/manager.py:84 @@ -2755,8 +2858,8 @@ msgstr "終了" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174 -#: terminal/models/virtualapp/provider.py:14 -#: terminal/serializers/session.py:55 terminal/serializers/session.py:78 +#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 +#: terminal/serializers/session.py:79 msgid "Terminal" msgstr "ターミナル" @@ -2795,8 +2898,7 @@ msgid "Job audit log" msgstr "ジョブ監査ログ" #: audits/models.py:56 audits/models.py:100 audits/models.py:175 -#: terminal/models/session/session.py:39 -#: terminal/models/session/sharing.py:113 +#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:113 msgid "Remote addr" msgstr "リモートaddr" @@ -3009,13 +3111,18 @@ msgstr "資産監査セッションタスクログのクリーンアップ" #: audits/tasks.py:134 msgid "" -"Since the system generates login logs, operation logs, file upload logs, activity \n" -" logs, Celery execution logs, session recordings, command records, and password change \n" -" logs, it will perform cleanup of records that exceed the time limit according to the \n" +"Since the system generates login logs, operation logs, file upload logs, " +"activity \n" +" logs, Celery execution logs, session recordings, command records, " +"and password change \n" +" logs, it will perform cleanup of records that exceed the time limit " +"according to the \n" " 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" msgstr "" -"システムはログインログ、操作ログ、ファイルアップロードログ、アクティビティログ、セルリー実行ログ、セッション録画、コマンド記録、パスワード変更ログを生成します。システムは、システム設定-" -"タスクリスト-定期クリーニング設定に基づき、毎日午前2時に時間を超えたものをクリーニングします" +"システムはログインログ、操作ログ、ファイルアップロードログ、アクティビティロ" +"グ、セルリー実行ログ、セッション録画、コマンド記録、パスワード変更ログを生成" +"します。システムは、システム設定-タスクリスト-定期クリーニング設定に基づき、" +"毎日午前2時に時間を超えたものをクリーニングします" #: audits/tasks.py:154 msgid "Upload FTP file to external storage" @@ -3023,10 +3130,12 @@ msgstr "外部ストレージへのFTPファイルのアップロード" #: audits/tasks.py:156 msgid "" -"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " +"management will be \n" " synchronized to external storage" msgstr "" -"SERVER_REPLAY_STORAGEが設定されている場合は、ファイルマネージャーでアップロードしたファイルを外部ストレージに同期します" +"SERVER_REPLAY_STORAGEが設定されている場合は、ファイルマネージャーでアップロー" +"ドしたファイルを外部ストレージに同期します" #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" @@ -3043,7 +3152,9 @@ msgstr "この操作には、MFAを検証する必要があります" #: authentication/api/connection_token.py:265 msgid "Reusable connection token is not allowed, global setting not enabled" -msgstr "再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効になっていません" +msgstr "" +"再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効に" +"なっていません" #: authentication/api/connection_token.py:379 msgid "Anonymous account is not supported for this asset" @@ -3069,7 +3180,7 @@ msgstr "ACL アクションはレビューです" msgid "Current user not support mfa type: {}" msgstr "現在のユーザーはmfaタイプをサポートしていません: {}" -#: authentication/api/password.py:33 terminal/api/session/session.py:322 +#: authentication/api/password.py:33 terminal/api/session/session.py:334 #: users/views/profile/reset.py:63 msgid "User does not exist: {}" msgstr "ユーザーが存在しない: {}" @@ -3082,7 +3193,9 @@ msgstr "ユーザーにマッチしなかった" msgid "" "The user is from {}, please go to the corresponding system to change the " "password" -msgstr "ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してください。" +msgstr "" +"ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してくだ" +"さい。" #: authentication/api/password.py:65 #: authentication/templates/authentication/login.html:393 @@ -3113,7 +3226,8 @@ msgstr "無効なトークンヘッダー。記号文字列にはスペースを #: authentication/backends/drf.py:61 msgid "" "Invalid token header. Sign string should not contain invalid characters." -msgstr "無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" +msgstr "" +"無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" #: authentication/backends/drf.py:74 msgid "Invalid token or cache refreshed." @@ -3125,7 +3239,9 @@ msgstr "OpenID エラー" #: authentication/backends/oidc/views.py:175 msgid "Please check if a user with the same username or email already exists" -msgstr "同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認してください" +msgstr "" +"同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認して" +"ください" #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" @@ -3145,8 +3261,7 @@ msgstr "に追加" #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:26 -#: authentication/models/private_token.py:8 -#: authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後に使用した日付" @@ -3221,27 +3336,34 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 {times_try} 回試すこともできます (アカウントは " -"{block_time} 分の間一時的にロックされます)" +"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 " +"{times_try} 回試すこともできます (アカウントは {block_time} 分の間一時的に" +"ロックされます)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" "The account has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後にもう一度お試しください)" +msgstr "" +"アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後" +"にもう一度お試しください)" #: authentication/errors/const.py:51 msgid "" "The address has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行してください)" +msgstr "" +"IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行" +"してください)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily" -" locked for {block_time} minutes)" -msgstr "{error},{times_try} 回も試すことができます (アカウントは {block_time} 分の間一時的にロックされます)" +"{error}, You can also try {times_try} times (The account will be temporarily " +"locked for {block_time} minutes)" +msgstr "" +"{error},{times_try} 回も試すことができます (アカウントは {block_time} 分の間" +"一時的にロックされます)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3318,17 +3440,18 @@ msgstr "パスワードが無効です" msgid "Please wait for %s seconds before retry" msgstr "%s 秒後に再試行してください" -#: authentication/errors/redirect.py:85 authentication/mixins.py:323 +#: authentication/errors/redirect.py:85 authentication/mixins.py:326 msgid "Your password is too simple, please change it for security" msgstr "パスワードがシンプルすぎるので、セキュリティのために変更してください" -#: authentication/errors/redirect.py:93 authentication/mixins.py:330 +#: authentication/errors/redirect.py:93 authentication/mixins.py:335 msgid "You should to change your password before login" msgstr "ログインする前にパスワードを変更する必要があります" -#: authentication/errors/redirect.py:101 authentication/mixins.py:337 +#: authentication/errors/redirect.py:101 authentication/mixins.py:344 msgid "Your password has expired, please reset before logging in" -msgstr "パスワードの有効期限が切れました。ログインする前にリセットしてください。" +msgstr "" +"パスワードの有効期限が切れました。ログインする前にリセットしてください。" #: authentication/forms.py:34 msgid "Auto-login" @@ -3369,7 +3492,8 @@ msgstr "カスタム MFA 検証コード" #: authentication/mfa/custom.py:56 msgid "MFA custom global enabled, cannot disable" -msgstr "カスタム MFA はグローバルに有効になっており、無効にすることはできません" +msgstr "" +"カスタム MFA はグローバルに有効になっており、無効にすることはできません" #: authentication/mfa/otp.py:7 msgid "OTP code invalid, or server time error" @@ -3436,13 +3560,15 @@ msgstr "無効なユーザーです" msgid "" "The administrator has enabled 'Only allow login from user source'. \n" " The current user source is {}. Please contact the administrator." -msgstr "管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユーザーソースは {} です。管理者に連絡してください。" +msgstr "" +"管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユー" +"ザーソースは {} です。管理者に連絡してください。" #: authentication/mixins.py:273 msgid "The MFA type ({}) is not enabled" msgstr "MFAタイプ ({}) が有効になっていない" -#: authentication/mixins.py:313 +#: authentication/mixins.py:314 msgid "Please change your password" msgstr "パスワードを変更してください" @@ -3649,9 +3775,11 @@ msgstr "タイプを作成" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be" -" downloaded once" -msgstr "作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度きりです" +"Please download the private key after creation. Each private key can only be " +"downloaded once" +msgstr "" +"作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度き" +"りです" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 #: users/serializers/profile.py:133 users/serializers/profile.py:160 @@ -3674,10 +3802,11 @@ msgstr "期限切れのセッションをクリアする" #: authentication/tasks.py:15 msgid "" -"Since user logins create sessions, the system will clean up expired sessions" -" every 24 hours" +"Since user logins create sessions, the system will clean up expired sessions " +"every 24 hours" msgstr "" -"ユーザーがシステムにログインするとセッションが生成されます。システムは24時間ごとに期限切れのセッションをクリーニングします" +"ユーザーがシステムにログインするとセッションが生成されます。システムは24時間" +"ごとに期限切れのセッションをクリーニングします" #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" @@ -3755,7 +3884,9 @@ msgstr "アカウントにリモートログイン動作があります。注意 msgid "" "If you suspect that the login behavior is abnormal, please modify the " "account password in time." -msgstr "ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変更してください。" +msgstr "" +"ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変" +"更してください。" #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" @@ -3769,7 +3900,9 @@ msgstr "操作が独自のものでない場合は、パスワードをバイン msgid "" "Please click the link below to reset your password, if not your request, " "concern your account security" -msgstr "下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場合は、アカウントのセキュリティに関係します。" +msgstr "" +"下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場" +"合は、アカウントのセキュリティに関係します。" #: authentication/templates/authentication/_msg_reset_password.html:10 msgid "Click here reset password" @@ -3814,7 +3947,9 @@ msgstr "ブラウザ" msgid "" "If the password update was not initiated by you, your account may have " "security issues" -msgstr "パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" +msgstr "" +"パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題があ" +"る可能性があります" #: authentication/templates/authentication/_msg_rest_password_success.html:14 #: authentication/templates/authentication/_msg_rest_public_key_success.html:14 @@ -3829,7 +3964,9 @@ msgstr "公開鍵が正常に更新されました" msgid "" "If the public key update was not initiated by you, your account may have " "security issues" -msgstr "公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" +msgstr "" +"公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可" +"能性があります" #: authentication/templates/authentication/auth_fail_flash_message_standalone.html:28 #: templates/flash_message_standalone.html:28 tickets/const.py:18 @@ -3840,7 +3977,9 @@ msgstr "キャンセル" msgid "" "Configuration file has problems and cannot be logged in. Please contact the " "administrator or view latest docs" -msgstr "設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のドキュメントを参照してください。" +msgstr "" +"設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のド" +"キュメントを参照してください。" #: authentication/templates/authentication/login.html:309 msgid "If you are administrator, you can update the config resolve it, set" @@ -3886,7 +4025,9 @@ msgstr "コピー成功" msgid "" "This page is not served over HTTPS. Please use HTTPS to ensure security of " "your credentials." -msgstr "このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリティを確保してください。" +msgstr "" +"このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリ" +"ティを確保してください。" #: authentication/templates/authentication/passkey.html:173 msgid "Do you want to retry ?" @@ -4015,9 +4156,11 @@ msgstr "ログアウト成功、ログインページを返す" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client." -" If you need to open it in the client, please log in again" -msgstr "安全のため、クライアントでの自動リダイレクトログインはサポートされていません。クライアントで開く必要がある場合は、再度ログインしてください" +"For your safety, automatic redirection login is not supported on the client. " +"If you need to open it in the client, please log in again" +msgstr "" +"安全のため、クライアントでの自動リダイレクトログインはサポートされていませ" +"ん。クライアントで開く必要がある場合は、再度ログインしてください" #: authentication/views/slack.py:35 authentication/views/slack.py:118 msgid "Slack Error" @@ -4123,12 +4266,13 @@ msgstr "Secret Keyを使用したフィールドの暗号化" #: common/db/fields.py:577 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" -" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " +"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 {'type':'ids','ids':[]}或 " -"#タイプ:属性、属性:[#名前:ip、照合:正確、値:1.1.1.1}" +"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 " +"{'type':'ids','ids':[]}或 #タイプ:属性、属性:[#名前:ip、照合:正確、" +"値:1.1.1.1}" #: common/db/fields.py:584 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4190,72 +4334,82 @@ msgstr "解析ファイルエラー: {}" msgid "Invalid excel file" msgstr "無効 excel 書類" -#: common/drf/renders/base.py:137 +#: common/drf/renders/base.py:138 msgid "Yes/No" msgstr "" -#: common/drf/renders/base.py:140 +#: common/drf/renders/base.py:141 msgid "Text, max length {}" msgstr "テキスト、最大長 {}" -#: common/drf/renders/base.py:142 +#: common/drf/renders/base.py:143 msgid "Long text, no length limit" msgstr "長文テキスト、長さ制限なし" -#: common/drf/renders/base.py:144 +#: common/drf/renders/base.py:145 msgid "Number, min {} max {}" msgstr "数字、最小 {} 最大 {}" -#: common/drf/renders/base.py:147 +#: common/drf/renders/base.py:148 msgid "Datetime format {}" msgstr "日付時刻形式 {}" -#: common/drf/renders/base.py:153 +#: common/drf/renders/base.py:154 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" -msgstr "選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。選択肢は {}" +msgstr "" +"選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。" +"選択肢は {}" -#: common/drf/renders/base.py:156 +#: common/drf/renders/base.py:157 msgid "Choices, options {}" msgstr "オプション、可能なオプションは {}" -#: common/drf/renders/base.py:158 +#: common/drf/renders/base.py:159 msgid "Phone number, format +8612345678901" msgstr "電話番号、形式 +8612345678901" -#: common/drf/renders/base.py:160 +#: common/drf/renders/base.py:161 msgid "Label, format [\"key:value\"]" msgstr "タグ、形式: [\"キー:値\"]" -#: common/drf/renders/base.py:162 +#: common/drf/renders/base.py:163 msgid "" "Object, format name(id), name is optional for human read, id is requisite" -msgstr "関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須です" +msgstr "" +"関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須で" +"す" -#: common/drf/renders/base.py:164 +#: common/drf/renders/base.py:165 msgid "Object, format id" msgstr "関連項目、形式は id" -#: common/drf/renders/base.py:168 +#: common/drf/renders/base.py:169 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" -msgstr "多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいように、idは必須です" +msgstr "" +"多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいよう" +"に、idは必須です" -#: common/drf/renders/base.py:170 -msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" -msgstr "タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します" +#: common/drf/renders/base.py:171 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "" +"タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します" -#: common/drf/renders/base.py:172 +#: common/drf/renders/base.py:173 msgid "Objects, format [\"id\", ...]" msgstr "多関連項目、形式は [\"id\", ...]" -#: common/drf/renders/base.py:270 +#: common/drf/renders/base.py:271 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" -msgstr "{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワードに暗号化パスワードを設定してください" +msgstr "" +"{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワード" +"に暗号化パスワードを設定してください" #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format @@ -4298,7 +4452,9 @@ msgstr "サポートされていません Elasticsearch8" msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" -msgstr "接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してください" +msgstr "" +"接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してく" +"ださい" #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" @@ -4414,8 +4570,7 @@ msgstr "メールを送る" #: common/tasks.py:35 msgid "This task will be executed when sending email notifications" -msgstr "" -"メールメッセージを送信するときは、このタスクを実行します" +msgstr "メールメッセージを送信するときは、このタスクを実行します" #: common/tasks.py:65 msgid "Send email attachment" @@ -4423,10 +4578,14 @@ msgstr "メールの添付ファイルを送信" #: common/tasks.py:68 msgid "" -"When an account password is changed or an account backup generates attachments, \n" -" this task needs to be executed for sending emails and handling attachments" +"When an account password is changed or an account backup generates " +"attachments, \n" +" this task needs to be executed for sending emails and handling " +"attachments" msgstr "" -"アカウントのパスワードを変更したり、アカウントのバックアップが添付ファイルを生成したりすると、メールと添付ファイルを送信するためのタスクを実行する必要があります" +"アカウントのパスワードを変更したり、アカウントのバックアップが添付ファイルを" +"生成したりすると、メールと添付ファイルを送信するためのタスクを実行する必要が" +"あります" #: common/tasks.py:94 msgid "Upload account backup to external storage" @@ -4437,7 +4596,8 @@ msgid "" "When performing an account backup, this task needs to be executed to " "external storage (SFTP)" msgstr "" -"アカウントのバックアップを実行するときに外部ストレージ(sftp)にアクセスするため、このタスクを実行します" +"アカウントのバックアップを実行するときに外部ストレージ(sftp)にアクセスする" +"ため、このタスクを実行します" #: common/utils/ip/geoip/utils.py:26 msgid "Invalid ip" @@ -4458,10 +4618,12 @@ msgstr "SMS 認証コードを送信する" #: common/utils/verify_code.py:19 msgid "" -"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" +"When resetting a password, forgetting a password, or verifying MFA, this " +"task needs to \n" " be executed to send SMS messages" msgstr "" -"パスワードをリセットするか、パスワードを忘れるか、mfaを検証するときにSMSを送信する必要がある場合、このタスクを実行します" +"パスワードをリセットするか、パスワードを忘れるか、mfaを検証するときにSMSを送" +"信する必要がある場合、このタスクを実行します" #: common/validators.py:16 msgid "Special char not allowed" @@ -4502,13 +4664,16 @@ msgid "" "configure nginx for url distribution,
If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
" -"Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要があります。urlディストリビューションにnginxを設定します。
" -" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" +"
Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要" +"があります。urlディストリビューションにnginxを設定します。
この" +"ページが表示されている場合は、nginxリスニングポートにアクセスしていないことを" +"証明してください。頑張ってください。" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" -msgstr "Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要があります。" +msgstr "" +"Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要がありま" +"す。" #: jumpserver/views/other.py:90 msgid "" @@ -4516,8 +4681,10 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要があります。URL配布用にnginxを設定します。
" -" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" +"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要が" +"あります。URL配布用にnginxを設定します。
このページが表示されて" +"いる場合は、nginxリスニングポートにアクセスしていないことを証明してください。" +"頑張ってください。" #: labels/apps.py:8 msgid "App Labels" @@ -4581,10 +4748,10 @@ msgstr "投稿サイトニュース" #: notifications/notifications.py:48 msgid "" -"This task needs to be executed for sending internal messages for system alerts, \n" +"This task needs to be executed for sending internal messages for system " +"alerts, \n" " work orders, and other notifications" -msgstr "" -"システムの警告やチケットなどを送信するためには、このタスクを実行します" +msgstr "システムの警告やチケットなどを送信するためには、このタスクを実行します" #: ops/ansible/inventory.py:116 ops/models/job.py:65 msgid "No account available" @@ -4615,12 +4782,15 @@ msgstr "タスク実行パラメータエラー" msgid "" "Asset ({asset}) must have at least one of the following protocols added: " "SSH, SFTP, or WinRM" -msgstr "資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加する必要があります" +msgstr "" +"資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加" +"する必要があります" #: ops/api/job.py:84 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" -msgstr "資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" +msgstr "" +"資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" #: ops/api/job.py:85 #, python-brace-format @@ -4635,7 +4805,9 @@ msgstr "重複したファイルが存在する" #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" -msgstr "ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択してください。" +msgstr "" +"ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択し" +"てください。" #: ops/api/job.py:244 msgid "" @@ -4793,14 +4965,12 @@ msgid "Periodic run" msgstr "定期的なパフォーマンス" #: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116 -#: settings/serializers/auth/ldap.py:80 -#: settings/serializers/auth/ldap_ha.py:62 +#: settings/serializers/auth/ldap.py:80 settings/serializers/auth/ldap_ha.py:62 msgid "Interval" msgstr "間隔" #: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113 -#: settings/serializers/auth/ldap.py:77 -#: settings/serializers/auth/ldap_ha.py:59 +#: settings/serializers/auth/ldap.py:77 settings/serializers/auth/ldap_ha.py:59 msgid "Crontab" msgstr "含む" @@ -4833,10 +5003,9 @@ msgstr "モジュール" msgid "Args" msgstr "アルグ" -#: ops/models/adhoc.py:26 ops/models/playbook.py:36 -#: ops/serializers/mixin.py:10 rbac/models/role.py:31 -#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 -#: settings/serializers/auth/oauth2.py:37 +#: ops/models/adhoc.py:26 ops/models/playbook.py:36 ops/serializers/mixin.py:10 +#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 +#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 msgid "Scope" msgstr "スコープ" @@ -5004,7 +5173,8 @@ msgid "" "Execute scheduled adhoc and playbooks, periodically invoking the task for " "execution" msgstr "" -"タイムスケジュールのショートカットコマンドやplaybookを実行するときは、このタスクを呼び出します" +"タイムスケジュールのショートカットコマンドやplaybookを実行するときは、このタ" +"スクを呼び出します" #: ops/tasks.py:82 msgid "Run ansible task execution" @@ -5013,7 +5183,8 @@ msgstr "Ansible タスクの実行を開始する" #: ops/tasks.py:85 msgid "Execute the task when manually adhoc or playbooks" msgstr "" -"手動でショートカットコマンドやplaybookを実行するときは、このタスクを実行します" +"手動でショートカットコマンドやplaybookを実行するときは、このタスクを実行しま" +"す" #: ops/tasks.py:99 msgid "Clear celery periodic tasks" @@ -5021,8 +5192,7 @@ msgstr "タスクログを定期的にクリアする" #: ops/tasks.py:101 msgid "At system startup, clean up celery tasks that no longer exist" -msgstr "" -"システム起動時、既に存在しないceleryのタスクをクリーニングします" +msgstr "システム起動時、既に存在しないceleryのタスクをクリーニングします" #: ops/tasks.py:125 msgid "Create or update periodic tasks" @@ -5030,11 +5200,15 @@ msgstr "定期的なタスクの作成または更新" #: ops/tasks.py:127 msgid "" -"With version iterations, new tasks may be added, or task names and execution times may \n" -" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, tasks will be " +"registered or the parameters \n" " of scheduled tasks will be updated" msgstr "" -"バージョンがアップグレードされると、新しいタスクが追加され、タスクの名前や実行時間が変更される可能性があるため、システムが起動すると、タスクを登録したり、タスクのパラメータを更新したりします" +"バージョンがアップグレードされると、新しいタスクが追加され、タスクの名前や実" +"行時間が変更される可能性があるため、システムが起動すると、タスクを登録した" +"り、タスクのパラメータを更新したりします" #: ops/tasks.py:140 msgid "Periodic check service performance" @@ -5042,10 +5216,13 @@ msgstr "サービスのパフォーマンスを定期的に確認する" #: ops/tasks.py:142 msgid "" -"Check every hour whether each component is offline and whether the CPU, memory, \n" -" and disk usage exceed the thresholds, and send an alert message to the administrator" +"Check every hour whether each component is offline and whether the CPU, " +"memory, \n" +" and disk usage exceed the thresholds, and send an alert message to " +"the administrator" msgstr "" -"毎時、各コンポーネントがオフラインになっていないか、CPU、メモリ、ディスク使用率が閾値を超えていないかをチェックし、管理者にメッセージで警告を送ります" +"毎時、各コンポーネントがオフラインになっていないか、CPU、メモリ、ディスク使用" +"率が閾値を超えていないかをチェックし、管理者にメッセージで警告を送ります" #: ops/tasks.py:152 msgid "Clean up unexpected jobs" @@ -5053,12 +5230,17 @@ msgstr "例外ジョブのクリーンアップ" #: ops/tasks.py:154 msgid "" -"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" -" which result in the task status not being updated, the system will clean up abnormal jobs \n" -" that have not been completed for more than 3 hours every hour and mark these tasks as \n" +"Due to exceptions caused by executing adhoc and playbooks in the Job " +"Center, \n" +" which result in the task status not being updated, the system will " +"clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and " +"mark these tasks as \n" " failed" msgstr "" -"ショートカットコマンドやplaybookを実行するジョブセンターでは異常が発生し、タスクの状態が更新されないことがあります。そのため、システムは毎時間、3時間以上終了していない異常なジョブをクリーニングし、タスクを失敗とマークします" +"ショートカットコマンドやplaybookを実行するジョブセンターでは異常が発生し、タ" +"スクの状態が更新されないことがあります。そのため、システムは毎時間、3時間以上" +"終了していない異常なジョブをクリーニングし、タスクを失敗とマークします" #: ops/tasks.py:167 msgid "Clean job_execution db record" @@ -5066,12 +5248,18 @@ msgstr "ジョブセンター実行履歴のクリーンアップ" #: ops/tasks.py:169 msgid "" -"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" -" be generated. The system will clean up records that exceed the retention period every day \n" -" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" +"Due to the execution of adhoc and playbooks in the Job Center, execution " +"records will \n" +" be generated. The system will clean up records that exceed the " +"retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - " +"Regular clean-up - \n" " Job execution retention days'" msgstr "" -"ショートカットコマンドやplaybookを実行するジョブセンターでは、実行レコードが生成されます。システムは、システム設定-タスクリスト-定期的なクリーニング-ジョブセンター実行履歴の設定に基づき、毎日午前2時に保存期間を超過したレコードをクリーニングします。" +"ショートカットコマンドやplaybookを実行するジョブセンターでは、実行レコードが" +"生成されます。システムは、システム設定-タスクリスト-定期的なクリーニング-ジョ" +"ブセンター実行履歴の設定に基づき、毎日午前2時に保存期間を超過したレコードをク" +"リーニングします。" #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" @@ -5121,7 +5309,8 @@ msgstr "現在の組織 ({}) は削除できません" msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" -msgstr "LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" +msgstr "" +"LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" #: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" @@ -5140,8 +5329,7 @@ msgstr "組織を選択してから保存してください" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 -#: tickets/serializers/ticket/ticket.py:60 +#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 msgid "Organization" msgstr "組織" @@ -5305,8 +5493,8 @@ msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" msgstr "" -"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], バーチャルオプション: @ALL, " -"@SPEC, @USER, @ANON, @INPUT" +"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], " +"バーチャルオプション: @ALL, @SPEC, @USER, @ANON, @INPUT" #: perms/serializers/permission.py:38 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -5326,12 +5514,19 @@ msgstr "アセット認証ルールの有効期限が切れていることを確 #: perms/tasks.py:30 msgid "" -"The cache of organizational collections, which have completed user authorization tree \n" -" construction, will expire. Therefore, expired collections need to be cleared from the \n" -" cache, and this task will be executed periodically based on the time interval specified \n" -" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" +"The cache of organizational collections, which have completed user " +"authorization tree \n" +" construction, will expire. Therefore, expired collections need to be " +"cleared from the \n" +" cache, and this task will be executed periodically based on the time " +"interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " +"config.txt" msgstr "" -"利用者権限ツリーの組織集合キャッシュは期限切れになるため、期限切れの集合をキャッシュからクリアする必要があります。このActionは、システム設定ファイルconfig.txt中のPERM_EXPIRED_CHECK_PERIODICの時間間隔に基づいて定期的に実行されます" +"利用者権限ツリーの組織集合キャッシュは期限切れになるため、期限切れの集合を" +"キャッシュからクリアする必要があります。このActionは、システム設定ファイル" +"config.txt中のPERM_EXPIRED_CHECK_PERIODICの時間間隔に基づいて定期的に実行され" +"ます" #: perms/tasks.py:49 msgid "Send asset permission expired notification" @@ -5339,12 +5534,16 @@ msgstr "アセット許可の有効期限通知を送信する" #: perms/tasks.py:51 msgid "" -"Check every day at 10 a.m. and send a notification message to users associated with \n" -" assets whose authorization is about to expire, as well as to the organization's \n" -" administrators, 3 days in advance, to remind them that the asset authorization will \n" +"Check every day at 10 a.m. and send a notification message to users " +"associated with \n" +" assets whose authorization is about to expire, as well as to the " +"organization's \n" +" administrators, 3 days in advance, to remind them that the asset " +"authorization will \n" " expire in a few days" msgstr "" -"毎日午前10時にチェックを行い、資産の承認が近く期限切れになる利用者及びその組織の管理者に、資産が何日で期限切れになるかを3日前に通知を送ります" +"毎日午前10時にチェックを行い、資産の承認が近く期限切れになる利用者及びその組" +"織の管理者に、資産が何日で期限切れになるかを3日前に通知を送ります" #: perms/templates/perms/_msg_item_permissions_expire.html:7 #: perms/templates/perms/_msg_permed_items_expire.html:7 @@ -5463,7 +5662,8 @@ msgstr "全ての組織" msgid "" "User last role in org, can not be delete, you can remove user from org " "instead" -msgstr "ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" +msgstr "" +"ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" #: rbac/models/rolebinding.py:200 msgid "Organization role binding" @@ -5594,7 +5794,9 @@ msgstr "SMTP設定のテスト" #: settings/api/ldap.py:92 msgid "" "Users are not synchronized, please click the user synchronization button" -msgstr "ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてください。" +msgstr "" +"ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてくださ" +"い。" #: settings/api/sms.py:142 msgid "Invalid SMS platform" @@ -5751,7 +5953,9 @@ msgid "" "information, the system will automatically create the user using this email " "suffix" msgstr "" -"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユーザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィックスでユーザーを作成します" +"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユー" +"ザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィック" +"スでユーザーを作成します" #: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" @@ -5770,21 +5974,24 @@ msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証にリダイレクトされる前に Flash ページを表示するかどうか" +msgstr "" +"管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証" +"にリダイレクトされる前に Flash ページを表示するかどうか" #: settings/serializers/auth/base.py:55 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザーは常にデフォルト組織に属します。" +msgstr "" +"ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザー" +"は常にデフォルト組織に属します。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 -#: settings/serializers/auth/ldap_ha.py:26 -#: settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:26 settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "LDAPサーバー" @@ -5809,11 +6016,9 @@ msgstr "ユーザー名のプロパティ" msgid "Enable attributes map" msgstr "属性マップの有効化" -#: settings/serializers/auth/cas.py:34 -#: settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:66 -#: settings/serializers/auth/ldap_ha.py:48 +#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/ldap_ha.py:48 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -5825,7 +6030,8 @@ msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、`value` は JumpServer のユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、" +"`value` は JumpServer のユーザー属性名です" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -5835,7 +6041,9 @@ msgstr "そうでない場合はユーザーを作成" msgid "" "After successful user authentication, if the user does not exist, " "automatically create the user" -msgstr "ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成されます" +msgstr "" +"ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成さ" +"れます" #: settings/serializers/auth/dingtalk.py:16 msgid "Dingtalk" @@ -5846,15 +6054,16 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は ディントーク " -"サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は ディントーク サービスのユーザー属性名です" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は フェイシュ サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は フェイシュ サービスのユーザー属性名です" #: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22 msgid "Lark" @@ -5865,7 +6074,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Lark サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は Lark サービスのユーザー属性名です" #: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" @@ -5875,59 +6085,51 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "FIDOサーバーID" -#: settings/serializers/auth/ldap.py:48 -#: settings/serializers/auth/ldap_ha.py:30 +#: settings/serializers/auth/ldap.py:48 settings/serializers/auth/ldap_ha.py:30 msgid "Bind DN" msgstr "DN のバインド" -#: settings/serializers/auth/ldap.py:49 -#: settings/serializers/auth/ldap_ha.py:31 +#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:31 msgid "Binding Distinguished Name" msgstr "バインドディレクトリ管理者" -#: settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:35 +#: settings/serializers/auth/ldap.py:53 settings/serializers/auth/ldap_ha.py:35 msgid "Binding password" msgstr "古いパスワード" -#: settings/serializers/auth/ldap.py:56 -#: settings/serializers/auth/ldap_ha.py:38 +#: settings/serializers/auth/ldap.py:56 settings/serializers/auth/ldap_ha.py:38 msgid "Search OU" msgstr "システムアーキテクチャ" -#: settings/serializers/auth/ldap.py:58 -#: settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:58 settings/serializers/auth/ldap_ha.py:40 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" -msgstr "ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" +msgstr "" +"ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" -#: settings/serializers/auth/ldap.py:62 -#: settings/serializers/auth/ldap_ha.py:44 +#: settings/serializers/auth/ldap.py:62 settings/serializers/auth/ldap_ha.py:44 msgid "Search filter" msgstr "ユーザー検索フィルター" -#: settings/serializers/auth/ldap.py:63 -#: settings/serializers/auth/ldap_ha.py:45 +#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:45 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "選択は (cnまたはuidまたはsAMAccountName)=%(user)s)" -#: settings/serializers/auth/ldap.py:68 -#: settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:68 settings/serializers/auth/ldap_ha.py:50 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は LDAP サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は LDAP サービスのユーザー属性名です" -#: settings/serializers/auth/ldap.py:84 -#: settings/serializers/auth/ldap_ha.py:66 +#: settings/serializers/auth/ldap.py:84 settings/serializers/auth/ldap_ha.py:66 msgid "Connect timeout (s)" msgstr "接続タイムアウト (秒)" -#: settings/serializers/auth/ldap.py:89 -#: settings/serializers/auth/ldap_ha.py:71 +#: settings/serializers/auth/ldap.py:89 settings/serializers/auth/ldap_ha.py:71 msgid "User DN cache timeout (s)" msgstr "User DN キャッシュの有効期限 (秒)" @@ -5938,11 +6140,11 @@ msgid "" "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証の速度を効果的に改善できます。
ユーザーの OU " -"構造が調整された場合は、提出をクリックしてユーザーの DN キャッシュをクリアできます。" +"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証" +"の速度を効果的に改善できます。
ユーザーの OU 構造が調整された場合は、提出" +"をクリックしてユーザーの DN キャッシュをクリアできます。" -#: settings/serializers/auth/ldap.py:97 -#: settings/serializers/auth/ldap_ha.py:79 +#: settings/serializers/auth/ldap.py:97 settings/serializers/auth/ldap_ha.py:79 msgid "Search paged size (piece)" msgstr "ページサイズを検索 (じょう)" @@ -5958,12 +6160,13 @@ msgstr "LDAP HA サービスドメイン名" #: settings/serializers/auth/ldap_ha.py:73 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If" -" the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If " +"the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" -"ユーザーがログイン認証時にクエリされた User DN をキャッシュすることで、ユーザー認証の速度を効果的に向上させることができます
ユーザーの " -"OU 構造が調整された場合は、送信をクリックして User DN のキャッシュをクリアできます" +"ユーザーがログイン認証時にクエリされた User DN をキャッシュすることで、ユー" +"ザー認証の速度を効果的に向上させることができます
ユーザーの OU 構造が調整" +"された場合は、送信をクリックして User DN のキャッシュをクリアできます" #: settings/serializers/auth/oauth2.py:19 #: settings/serializers/auth/oauth2.py:22 @@ -6010,8 +6213,7 @@ msgid "End session endpoint" msgstr "プロバイダーのセッション終了エンドポイント" #: settings/serializers/auth/oauth2.py:57 -msgid "" -"When the user signs out, they also be logged out from the OAuth2 server" +msgid "When the user signs out, they also be logged out from the OAuth2 server" msgstr "ユーザーがログアウトすると、OAuth2 サーバからもログアウトします" #: settings/serializers/auth/oauth2.py:62 @@ -6019,11 +6221,11 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OAuth2 " -"サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は OAuth2 サービスのユーザー属性名です" -#: settings/serializers/auth/oauth2.py:67 -#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 +#: settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "常にユーザーを更新" @@ -6056,7 +6258,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OIDC サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は OIDC サービスのユーザー属性名です" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -6074,7 +6277,9 @@ msgstr "Keycloakを使用する" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プロトコルを使用する" +msgstr "" +"Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プ" +"ロトコルを使用する" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -6133,7 +6338,9 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストとDOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切ります" +"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストと" +"DOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切り" +"ます" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -6149,9 +6356,10 @@ msgid "OTP in RADIUS" msgstr "Radius のOTP" #: settings/serializers/auth/radius.py:24 -msgid "" -"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" -msgstr "* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用することができる" +msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgstr "" +"* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用す" +"ることができる" #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 msgid "SAML2" @@ -6181,7 +6389,9 @@ msgstr "SP 証明書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`はJumpServerのユーザー属性名)" +msgstr "" +"ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`は" +"JumpServerのユーザー属性名)" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -6192,7 +6402,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Slack サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は Slack サービスのユーザー属性名です" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -6257,11 +6468,13 @@ msgstr "ビジネス・タイプ(Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed" -" 67 words. For example, your verification code is {code}, which is valid for" -" 5 minutes. Please do not disclose it to others." +"Template need contain {code} and Signature + template length does not exceed " +"67 words. For example, your verification code is {code}, which is valid for " +"5 minutes. Please do not disclose it to others." msgstr "" -"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わないでください。" +"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未" +"満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わない" +"でください。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -6282,7 +6495,8 @@ msgstr "SSO Token認証の有効化" #: settings/serializers/auth/sso.py:17 msgid "Other service can using SSO token login to JumpServer without password" -msgstr "他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" +msgstr "" +"他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" #: settings/serializers/auth/sso.py:20 msgid "SSO auth key TTL" @@ -6298,8 +6512,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は エンタープライズ WeChat " -"サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" +"`value` は エンタープライズ WeChat サービスのユーザー属性名です" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -6307,9 +6521,11 @@ msgstr "サイトURL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service" -" and is usually used in links in system emails" -msgstr "サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常はシステムメール内のリンクに使用されます" +"Site URL is the externally accessible address of the current product service " +"and is usually used in links in system emails" +msgstr "" +"サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常は" +"システムメール内のリンクに使用されます" #: settings/serializers/basic.py:18 msgid "User guide url" @@ -6334,7 +6550,9 @@ msgstr "ドキュメントリンク" #: settings/serializers/basic.py:27 msgid "" "Document URL refers to the address in the top navigation bar Help - Document" -msgstr "ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ドキュメント" +msgstr "" +"ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ド" +"キュメント" #: settings/serializers/basic.py:30 msgid "Support URL" @@ -6343,7 +6561,8 @@ msgstr "サポートリンク" #: settings/serializers/basic.py:31 msgid "" "Support URL refers to the address in the top navigation bar Help - Support" -msgstr "サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" +msgstr "" +"サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" #: settings/serializers/basic.py:44 msgid "Organization name already exists" @@ -6394,7 +6613,8 @@ msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." msgstr "" -"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (データベースのバックアップに影響し、OSS などには影響しません)" +"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (デー" +"タベースのバックアップに影響し、OSS などには影響しません)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -6438,8 +6658,9 @@ msgid "" "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、所定の数を超える履歴アカウントを確認して削除します。 値が 999 " -"以上の場合、履歴アカウントの削除は実行されません。" +"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、" +"所定の数を超える履歴アカウントを確認して削除します。 値が 999 以上の場合、履" +"歴アカウントの削除は実行されません。" #: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" @@ -6450,8 +6671,7 @@ msgid "GPT Base URL" msgstr "GPTアドレス" #: settings/serializers/feature.py:86 -msgid "" -"The base URL of the GPT service. For example: https://api.openai.com/v1" +msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPTサービスの基本のURL。例えば:https://api.openai.com/v1" #: settings/serializers/feature.py:89 templates/_header_bar.html:96 @@ -6499,7 +6719,9 @@ msgstr "ユーザーの実行" #: settings/serializers/feature.py:124 msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" -msgstr "ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行することを許可します" +msgstr "" +"ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行すること" +"を許可します" #: settings/serializers/feature.py:128 msgid "Command blacklist" @@ -6525,7 +6747,9 @@ msgstr "仮想アプリケーション" msgid "" "Virtual applications, you can use the Linux operating system as an " "application server in remote applications." -msgstr "仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレーティングシステムを使用できます。" +msgstr "" +"仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレー" +"ティングシステムを使用できます。" #: settings/serializers/msg.py:24 msgid "SMTP" @@ -6537,7 +6761,9 @@ msgstr "" #: settings/serializers/msg.py:34 msgid "The user to be used for email server authentication" -msgstr "メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアドレスです" +msgstr "" +"メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアド" +"レスです" #: settings/serializers/msg.py:38 msgid "" @@ -6563,7 +6789,9 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどのメール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用します" +"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどの" +"メール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用し" +"ます" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -6573,7 +6801,9 @@ msgstr "TLSの使用" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的なTLS接続を使用します、通常ポート587を使用します" +msgstr "" +"SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的な" +"TLS接続を使用します、通常ポート587を使用します" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -6581,9 +6811,11 @@ msgstr "件名プレフィックス" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account" -" successfully)" -msgstr "ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを正常に作成)" +"Tips: When creating a user, send the subject of the email (eg:Create account " +"successfully)" +msgstr "" +"ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを" +"正常に作成)" #: settings/serializers/msg.py:73 msgid "Honorific" @@ -6591,14 +6823,17 @@ msgstr "ユーザー敬語の作成" #: settings/serializers/msg.py:74 msgid "Tips: When creating a user, send the honorific of the email (eg:Hello)" -msgstr "ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" +msgstr "" +"ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" #: settings/serializers/msg.py:80 #, python-brace-format msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}{email}ラベルをサポートします。" +msgstr "" +"ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}" +"{email}ラベルをサポートします。" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -6615,7 +6850,9 @@ msgstr "グループ化されていないノードを表示" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" msgstr "" -"グループ化されていないノードに個別に許可された資産を配置し、資産が存在するノードが表示されないようにしますが、そのノードが許可されていないという質問に質問" +"グループ化されていないノードに個別に許可された資産を配置し、資産が存在する" +"ノードが表示されないようにしますが、そのノードが許可されていないという質問に" +"質問" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -6627,8 +6864,10 @@ msgid "" "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" msgstr "" -"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) " -"以内に、パスワードの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信されます。" +"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有" +"効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) 以内に、パスワー" +"ドの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信さ" +"れます。" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -6638,7 +6877,9 @@ msgstr "繰り返された履歴パスワードの数" msgid "" "Tip: When the user resets the password, it cannot be the previous n " "historical passwords of the user" -msgstr "ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワードにすることはできません" +msgstr "" +"ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワード" +"にすることはできません" #: settings/serializers/security.py:34 msgid "Minimum length (User)" @@ -6660,7 +6901,9 @@ msgstr "特別な" msgid "" "If the user has failed to log in for a limited number of times, no login is " "allowed during this time interval." -msgstr "ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログインはできません。" +msgstr "" +"ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログイン" +"はできません。" #: settings/serializers/security.py:63 settings/serializers/security.py:73 msgid "Login failures count" @@ -6686,7 +6929,9 @@ msgstr "単一デバイスログインのみ" msgid "" "After the user logs in on the new device, other logged-in devices will " "automatically log out" -msgstr "ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動的にログアウトします。" +msgstr "" +"ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動" +"的にログアウトします。" #: settings/serializers/security.py:95 msgid "Only exist user login" @@ -6699,8 +6944,9 @@ msgid "" "are allowed to log in and automatically create users (if the user does not " "exist)" msgstr "" -"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的に作成されます" -" (ユーザーが存在しない場合)。" +"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、" +"ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的" +"に作成されます (ユーザーが存在しない場合)。" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -6708,13 +6954,14 @@ msgstr "ソースログインからのみ" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging" -" in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging " +"in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべての認証方法を特定の順序で認証します。" -" 、直接ログインできます" +"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効" +"な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべ" +"ての認証方法を特定の順序で認証します。 、直接ログインできます" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -6765,7 +7012,8 @@ msgstr "ログインページのMFA" #: settings/serializers/security.py:144 msgid "Eu security regulations(GDPR) require MFA to be on the login page" -msgstr "Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" +msgstr "" +"Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" #: settings/serializers/security.py:148 msgid "Verify code TTL (second)" @@ -6783,7 +7031,9 @@ msgstr "ログイン動的コードの有効化" msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "パスワードと追加コードは、検証のためにサードパーティの認証システムに送信されます" +msgstr "" +"パスワードと追加コードは、検証のためにサードパーティの認証システムに送信され" +"ます" #: settings/serializers/security.py:158 msgid "Login captcha" @@ -6799,11 +7049,13 @@ msgstr "リモートログイン保護" #: settings/serializers/security.py:164 msgid "" -"The system determines whether the login IP address belongs to a common login" -" city. If the account is logged in from a common login city, the system " -"sends a remote login reminder" +"The system determines whether the login IP address belongs to a common login " +"city. If the account is logged in from a common login city, the system sends " +"a remote login reminder" msgstr "" -"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断します。アカウントが共通のログイン都市からログインしている場合、システムはリモートログインリマインダーを送信します" +"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断" +"します。アカウントが共通のログイン都市からログインしている場合、システムはリ" +"モートログインリマインダーを送信します" #: settings/serializers/security.py:170 msgid "Auto Disable Threshold (day)" @@ -6813,7 +7065,9 @@ msgstr "未使用のユーザータイムアウト(日)" msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" -msgstr "毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効にします" +msgstr "" +"毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効に" +"します" #: settings/serializers/security.py:191 msgid "Watermark" @@ -6858,7 +7112,8 @@ msgstr "セッション共有" #: settings/serializers/security.py:213 msgid "Enabled, Allows user active session to be shared with other users" -msgstr "ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" +msgstr "" +"ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" #: settings/serializers/security.py:219 msgid "Insecure command alert" @@ -6887,24 +7142,30 @@ msgstr "ターミナルレジスタの有効化" #: settings/serializers/terminal.py:24 msgid "" -"Allow component register, after all component setup, you should disable this" -" for security" -msgstr "ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティのためにこれを無効にする必要があります" +"Allow component register, after all component setup, you should disable this " +"for security" +msgstr "" +"ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティ" +"のためにこれを無効にする必要があります" #: settings/serializers/terminal.py:30 msgid "" "* Allow users to log in to the KoKo component via password authentication" -msgstr "* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可する" +msgstr "" +"* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可" +"する" #: settings/serializers/terminal.py:36 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in" -" after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in " +"after being deleted from the AD/LDAP server" msgstr "" -"* " -"公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバから削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべきです。" +"* 公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第" +"三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバ" +"から削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべ" +"きです。" #: settings/serializers/terminal.py:43 msgid "Asset sorting" @@ -6916,21 +7177,23 @@ msgstr "ページサイズを一覧表示" #: settings/serializers/terminal.py:51 msgid "" -"* You can individually configure the service address and port in the service" -" endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service " +"endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna " -"ページでは資産への接続時にDBクライアントの起動方法を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" +"
有効化した場合、Luna ページでは資産への接続時にDBクライアントの起動方法" +"を表示します。" #: settings/serializers/terminal.py:59 msgid "" -"* You can individually configure the service address and port in the service" -" endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service " +"endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna ページでは資産への接続時にrdp " -"ファイルのダウンロードボタンとRDPクライアントの起動方法を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" +"
有効化した場合、Luna ページでは資産への接続時にrdp ファイルのダウンロー" +"ドボタンとRDPクライアントの起動方法を表示します。" #: settings/serializers/terminal.py:66 msgid "Client connection" @@ -6939,11 +7202,11 @@ msgstr "クライアント接続" #: settings/serializers/terminal.py:68 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to " -"assets" +"Luna page will display the SSH client launch method when connecting to assets" msgstr "" -"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効化した場合、Luna " -"ページでは資産への接続時にSSHクライアントの起動方法を表示します。" +"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効" +"化した場合、Luna ページでは資産への接続時にSSHクライアントの起動方法を表示し" +"ます。" #: settings/serializers/tool.py:10 msgid "Tool" @@ -6955,9 +7218,11 @@ msgstr "ワークベンチのツール" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools" -" in the workbench" -msgstr "* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにします" +"*! If enabled, users with RBAC permissions will be able to utilize all tools " +"in the workbench" +msgstr "" +"* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにしま" +"す" #: settings/tasks/ldap.py:73 msgid "Periodic import ldap user" @@ -6968,7 +7233,8 @@ msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" msgstr "" -"LDAPの自動同期が設定されている場合、このActionを呼び出して利用者の同期を行います" +"LDAPの自動同期が設定されている場合、このActionを呼び出して利用者の同期を行い" +"ます" #: settings/tasks/ldap.py:83 msgid "Periodic import ldap ha user" @@ -6980,10 +7246,13 @@ msgstr "登録サイクルLDAPユーザータスクのインポート" #: settings/tasks/ldap.py:119 msgid "" -"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " +"sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" -"LDAPの自動同期パラメーターが変更された場合、たとえばCrontabパラメーターが変更され、ldap同期Actionの再登録または更新が必要になった場合、そのActionはこのActionを呼び出します" +"LDAPの自動同期パラメーターが変更された場合、たとえばCrontabパラメーターが変更" +"され、ldap同期Actionの再登録または更新が必要になった場合、そのActionはこの" +"Actionを呼び出します" #: settings/tasks/ldap.py:133 msgid "Registration periodic import ldap ha user task" @@ -6991,10 +7260,12 @@ msgstr "LDAP HA ユーザーの定期インポートタスクの登録" #: settings/tasks/ldap.py:135 msgid "" -"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " +"LDAP HA sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" -"LDAP HA自動同期パラメーターが変更された場合、Crontabパラメーターなど、ldap ha同期Actionを再登録または更新する際にはこのActionを呼び出します" +"LDAP HA自動同期パラメーターが変更された場合、Crontabパラメーターなど、ldap ha" +"同期Actionを再登録または更新する際にはこのActionを呼び出します" #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" @@ -7128,7 +7399,9 @@ msgstr "インポート" #: templates/_csv_import_modal.html:12 msgid "Download the imported template or use the exported CSV file format" -msgstr "インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" +msgstr "" +"インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形" +"式を使用する" #: templates/_csv_import_modal.html:13 msgid "Download the import template" @@ -7144,7 +7417,9 @@ msgstr "ファイルを選択してください" #: templates/_csv_update_modal.html:12 msgid "Download the update template or use the exported CSV file format" -msgstr "更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" +msgstr "" +"更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用す" +"る" #: templates/_csv_update_modal.html:13 msgid "Download the update template" @@ -7185,7 +7460,8 @@ msgid "" " " msgstr "" "\n" -" アカウントが期限切れになったので、管理者に連絡してください。 " +" アカウントが期限切れになったので、管理者に連絡してくださ" +"い。 " #: templates/_message.html:13 msgid "Your account will at" @@ -7199,11 +7475,13 @@ msgstr "期限切れです。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" パスワードが期限切れになりましたので、クリックしてください リンク パスワードの更新\n" +" パスワードが期限切れになりましたので、クリックしてください " +" リンク パスワードの更新\n" " " #: templates/_message.html:30 @@ -7214,33 +7492,39 @@ msgstr "あなたのパスワードは" #, python-format msgid "" "\n" -" please click this link to update your password.\n" +" please click this " +"link to update your password.\n" " " msgstr "" "\n" -" クリックしてください リンク パスワードの更新\n" +" クリックしてください リンク パスワードの更新\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" +" あなたの情報が不完全なので、クリックしてください。 リンク 補完\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" +" SSHキーが設定されていないか無効になっている場合は、 リンク 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -7272,8 +7556,9 @@ msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" msgstr "" -"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起するために使用されており、現在はRDP " -"SSHクライアントのみをサポートしています。「Telnetは将来的にサポートする" +"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起す" +"るために使用されており、現在はRDP SSHクライアントのみをサポートしています。" +"「Telnetは将来的にサポートする" #: templates/resource_download.html:35 msgid "Microsoft" @@ -7287,7 +7572,9 @@ msgstr "公式" msgid "" "macOS needs to download the client to connect RDP asset, which comes with " "Windows" -msgstr "MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロードする必要があります" +msgstr "" +"MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロード" +"する必要があります" #: templates/resource_download.html:45 msgid "Windows Remote application publisher tools" @@ -7297,7 +7584,9 @@ msgstr "Windowsリモートアプリケーション発行者ツール" msgid "" "OpenSSH is a program used to connect remote applications in the Windows " "Remote Application Publisher" -msgstr "OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続するプログラムです" +msgstr "" +"OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続する" +"プログラムです" #: templates/resource_download.html:53 msgid "Offline video player" @@ -7337,7 +7626,7 @@ msgstr "コマンドストア" msgid "Invalid" msgstr "無効" -#: terminal/api/component/storage.py:132 terminal/tasks.py:187 +#: terminal/api/component/storage.py:132 terminal/tasks.py:208 msgid "Test failure: {}" msgstr "テスト失敗: {}" @@ -7358,15 +7647,15 @@ msgstr "オンラインセッションを持つ" msgid "User %s %s session %s replay" msgstr "ユーザー%s %sこのセッション %s の録画です" -#: terminal/api/session/session.py:314 +#: terminal/api/session/session.py:326 msgid "Session does not exist: {}" msgstr "セッションが存在しません: {}" -#: terminal/api/session/session.py:317 +#: terminal/api/session/session.py:329 msgid "Session is finished or the protocol not supported" msgstr "セッションが終了したか、プロトコルがサポートされていません" -#: terminal/api/session/session.py:330 +#: terminal/api/session/session.py:342 msgid "User does not have permission" msgstr "ユーザーに権限がありません" @@ -7530,7 +7819,7 @@ msgstr "バージョン" msgid "Can concurrent" msgstr "同時実行可能" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:178 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "ホスト" @@ -7561,7 +7850,7 @@ msgstr "ホスト マシン" msgid "Applet Publication" msgstr "アプリケーションのリリース" -#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:80 +#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:81 msgid "Deploy options" msgstr "展開パラメーター" @@ -7673,12 +7962,12 @@ msgstr "スレッド" msgid "Boot Time" msgstr "ブート時間" -#: terminal/models/component/storage.py:146 +#: terminal/models/component/storage.py:144 #: terminal/models/component/terminal.py:91 msgid "Command storage" msgstr "コマンドストレージ" -#: terminal/models/component/storage.py:214 +#: terminal/models/component/storage.py:212 #: terminal/models/component/terminal.py:92 msgid "Replay storage" msgstr "再生ストレージ" @@ -7719,8 +8008,7 @@ msgstr "セッション再生をダウンロードできます" msgid "Account ID" msgstr "アカウント ID" -#: terminal/models/session/session.py:37 -#: terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:118 msgid "Login from" msgstr "ログイン元" @@ -7728,7 +8016,7 @@ msgstr "ログイン元" msgid "Replay" msgstr "リプレイ" -#: terminal/models/session/session.py:48 terminal/serializers/session.py:77 +#: terminal/models/session/session.py:48 terminal/serializers/session.py:78 msgid "Command amount" msgstr "コマンド量" @@ -7736,23 +8024,23 @@ msgstr "コマンド量" msgid "Error reason" msgstr "間違った理由" -#: terminal/models/session/session.py:290 +#: terminal/models/session/session.py:308 msgid "Session record" msgstr "セッション記録" -#: terminal/models/session/session.py:292 +#: terminal/models/session/session.py:310 msgid "Can monitor session" msgstr "セッションを監視できます" -#: terminal/models/session/session.py:293 +#: terminal/models/session/session.py:311 msgid "Can share session" msgstr "セッションを共有できます" -#: terminal/models/session/session.py:294 +#: terminal/models/session/session.py:312 msgid "Can terminate session" msgstr "セッションを終了できます" -#: terminal/models/session/session.py:295 +#: terminal/models/session/session.py:313 msgid "Can validate session action perm" msgstr "セッションアクションのパーマを検証できます" @@ -7769,8 +8057,8 @@ msgstr "アクションパーミッション" msgid "Origin" msgstr "ソース" -#: terminal/models/session/sharing.py:42 -#: terminal/models/session/sharing.py:100 terminal/notifications.py:261 +#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 +#: terminal/notifications.py:261 msgid "Session sharing" msgstr "セッション共有" @@ -7852,7 +8140,7 @@ msgstr "レベル" msgid "Command and replay storage" msgstr "コマンド及び録画記憶" -#: terminal/notifications.py:240 terminal/tasks.py:191 +#: terminal/notifications.py:240 terminal/tasks.py:212 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -7868,122 +8156,136 @@ msgstr "無効なストレージ" msgid "Icon" msgstr "アイコン" -#: terminal/serializers/applet_host.py:26 +#: terminal/serializers/applet_host.py:24 msgid "Per Device (Device number limit)" msgstr "" -#: terminal/serializers/applet_host.py:27 +#: terminal/serializers/applet_host.py:25 msgid "Per User (User number limit)" msgstr "" -#: terminal/serializers/applet_host.py:39 +#: terminal/serializers/applet_host.py:37 msgid "Core API" msgstr "コア サービス アドレス" -#: terminal/serializers/applet_host.py:40 +#: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core service. \n" -" If the release machine and the Core service are on the same network segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" +" Tips: The application release machine communicates with the Core " +"service. \n" +" If the release machine and the Core service are on the same network " +"segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in " +"the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリース マシンとコア サービスが同じネットワーク " -"セグメント上にある場合は、イントラネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト URL を入力します。
例: " -"https://172.16.10.110 または https://dev.jumpserver.com" +"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリー" +"ス マシンとコア サービスが同じネットワーク セグメント上にある場合は、イントラ" +"ネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト " +"URL を入力します。
例: https://172.16.10.110 または https://dev." +"jumpserver.com" -#: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207 +#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" msgstr "証明書の検証を無視する" -#: terminal/serializers/applet_host.py:50 +#: terminal/serializers/applet_host.py:48 msgid "Existing RDS license" msgstr "既存の RDS 証明書" -#: terminal/serializers/applet_host.py:51 +#: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" -#: terminal/serializers/applet_host.py:54 +#: terminal/serializers/applet_host.py:55 msgid "RDS License Server" msgstr "RDS ライセンス サーバー" -#: terminal/serializers/applet_host.py:56 +#: terminal/serializers/applet_host.py:57 msgid "RDS Licensing Mode" msgstr "RDS 認可モード" -#: terminal/serializers/applet_host.py:59 +#: terminal/serializers/applet_host.py:60 msgid "RDS Single Session Per User" msgstr "RDS シングル ユーザー シングル セッション" -#: terminal/serializers/applet_host.py:60 +#: terminal/serializers/applet_host.py:61 msgid "" "Tips: A RDS user can have only one session at a time. If set, when next " "login connected, previous session will be disconnected." msgstr "" -#: terminal/serializers/applet_host.py:64 +#: terminal/serializers/applet_host.py:65 msgid "RDS Max Disconnection Time (ms)" msgstr "最大切断時間(ミリ秒)" -#: terminal/serializers/applet_host.py:66 +#: terminal/serializers/applet_host.py:67 msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時間を設定します(60000ミリ秒後にセッションをログオフ)。" +msgstr "" +"ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時" +"間を設定します(60000ミリ秒後にセッションをログオフ)。" -#: terminal/serializers/applet_host.py:71 +#: terminal/serializers/applet_host.py:72 msgid "RDS Remote App Logoff Time Limit (ms)" msgstr "RDSリモートアプリケーションのログアウト時間制限(ミリ秒)" -#: terminal/serializers/applet_host.py:73 +#: terminal/serializers/applet_host.py:74 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" -" programs (0 milliseconds, log off the session immediately)." +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " +"programs (0 milliseconds, log off the session immediately)." msgstr "" -"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ時間を設定します(0ミリ秒、セッションを即座にログオフ)。" +"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ" +"時間を設定します(0ミリ秒、セッションを即座にログオフ)。" -#: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47 +#: terminal/serializers/applet_host.py:83 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 msgid "Load status" msgstr "ロードステータス" -#: terminal/serializers/applet_host.py:96 +#: terminal/serializers/applet_host.py:97 msgid "" -"These accounts are used to connect to the published application, the account" -" is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account " +"is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will" -" be used to connect" +"support multiple open and the special has been used, the public account will " +"be used to connect" msgstr "" -"これらのアカウントは、公開されたアプリケーションに接続するために使用されます。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公開されています。アプリケーションが複数のオープンをサポートしていない場合、および特別なものが使用されている場合、公開アカウントが使用されます。" +"これらのアカウントは、公開されたアプリケーションに接続するために使用されま" +"す。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専" +"用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公" +"開されています。アプリケーションが複数のオープンをサポートしていない場合、お" +"よび特別なものが使用されている場合、公開アカウントが使用されます。" -#: terminal/serializers/applet_host.py:103 +#: terminal/serializers/applet_host.py:104 msgid "The number of public accounts created automatically" msgstr "自動的に作成される公開アカウントの数" -#: terminal/serializers/applet_host.py:106 +#: terminal/serializers/applet_host.py:107 msgid "" "Connect to the host using the same account first. For security reasons, " "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項目 CACHE_LOGIN_PASSWORD_ENABLED=true " -"を設定してサービスを再起動して有効にしてください。" +"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項" +"目 CACHE_LOGIN_PASSWORD_ENABLED=true を設定してサービスを再起動して有効にして" +"ください。" -#: terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet_host.py:149 msgid "Install applets" msgstr "アプリをインストールする" -#: terminal/serializers/applet_host.py:178 +#: terminal/serializers/applet_host.py:179 msgid "Host ID" msgstr "ホスト ID" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:180 msgid "Applet ID" msgstr "リモートアプリケーション ID" @@ -8023,7 +8325,9 @@ msgstr "Oracle がリッスンするポート範囲" msgid "" "Oracle proxy server listen port is dynamic, Each additional Oracle database " "instance adds a port listener" -msgstr "Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データベースインスタンスはポートリスナーを追加します" +msgstr "" +"Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データ" +"ベースインスタンスはポートリスナーを追加します" #: terminal/serializers/endpoint.py:38 msgid "" @@ -8031,19 +8335,22 @@ msgid "" "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" msgstr "" -"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラウザのアクセス アドレスが使用されます " -"(デフォルトのエンドポイントではホストの変更は許可されません)。" +"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラ" +"ウザのアクセス アドレスが使用されます (デフォルトのエンドポイントではホストの" +"変更は許可されません)。" #: terminal/serializers/endpoint.py:64 msgid "" -"The assets within this IP range, the following endpoint will be used for the" -" connection" +"The assets within this IP range, the following endpoint will be used for the " +"connection" msgstr "このIP範囲内のアセットは、以下のエンドポイントを使用して接続されます" #: terminal/serializers/endpoint.py:65 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" -msgstr "異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用して実装します" +msgstr "" +"異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用" +"して実装します" #: terminal/serializers/endpoint.py:69 msgid "Asset IP" @@ -8140,8 +8447,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www.jumpserver.a.com:9100, " -"http://www.jumpserver.b.com:9100)" +"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www." +"jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -8172,7 +8479,9 @@ msgid "" "set as the default storage, will make new Component use the current storage " "by default, without affecting existing Component" msgstr "" -"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレージをデフォルトで使用するようになりますが、既存のコンポーネントには影響しません" +"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレー" +"ジをデフォルトで使用するようになりますが、既存のコンポーネントには影響しませ" +"ん" #: terminal/serializers/task.py:9 msgid "Session id" @@ -8317,77 +8626,96 @@ msgstr "オフライン セッションをクリアする" #: terminal/tasks.py:45 msgid "" -"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" +"Check every 10 minutes for asset connection sessions that have been inactive " +"for 3 \n" " minutes and mark these sessions as completed" msgstr "" -"毎10分ごとに、3分間非活動状態の資産接続セッションを確認し、これらのセッションを完了とマークします" +"毎10分ごとに、3分間非活動状態の資産接続セッションを確認し、これらのセッション" +"を完了とマークします" #: terminal/tasks.py:68 msgid "Upload session replay to external storage" msgstr "セッションの記録を外部ストレージにアップロードする" -#: terminal/tasks.py:70 +#: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" -"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " +"and \n" " recordings will be uploaded to external storage" msgstr "" -"SERVER_REPLAY_STORAGEが設定されている場合、ファイル管理を通じてアップロードされたファイルを外部ストレージに同期します" +"SERVER_REPLAY_STORAGEが設定されている場合、ファイル管理を通じてアップロードさ" +"れたファイルを外部ストレージに同期します" #: terminal/tasks.py:102 +msgid "Upload session replay part file to external storage" +msgstr "セッションリプレイパートファイルを外部ストレージにアップロードする" + +#: terminal/tasks.py:123 msgid "Run applet host deployment" msgstr "アプリケーション マシンの展開を実行する" -#: terminal/tasks.py:105 +#: terminal/tasks.py:126 msgid "" -"When deploying from the remote application publisher details page, and the 'Deploy' \n" +"When deploying from the remote application publisher details page, and the " +"'Deploy' \n" " button is clicked, this task will be executed" -msgstr "" -"デプロイメントシステムの展開時に、このActionが実行されます" +msgstr "デプロイメントシステムの展開時に、このActionが実行されます" -#: terminal/tasks.py:116 +#: terminal/tasks.py:137 msgid "Install applet" msgstr "アプリをインストールする" -#: terminal/tasks.py:119 +#: terminal/tasks.py:140 msgid "" -"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" +"When the 'Deploy' button is clicked in the 'Remote Application' section of " +"the remote \n" " application publisher details page, this task will be executed" msgstr "" -"リモートアプリケーションの詳細-リモートアプリケーションの展開時に、このActionが実行されます" +"リモートアプリケーションの詳細-リモートアプリケーションの展開時に、このAction" +"が実行されます" -#: terminal/tasks.py:131 +#: terminal/tasks.py:152 msgid "Uninstall applet" msgstr "アプリをアンインストールする" -#: terminal/tasks.py:134 +#: terminal/tasks.py:155 msgid "" -"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" +"When the 'Uninstall' button is clicked in the 'Remote Application' section " +"of the \n" " remote application publisher details page, this task will be executed" msgstr "" -"リモートアプリケーションの詳細-リモートアプリケーションのアンインストール時に、このActionが実行されます" +"リモートアプリケーションの詳細-リモートアプリケーションのアンインストール時" +"に、このActionが実行されます" -#: terminal/tasks.py:146 +#: terminal/tasks.py:167 msgid "Generate applet host accounts" msgstr "リモートアプリケーション上のアカウントを収集する" -#: terminal/tasks.py:149 +#: terminal/tasks.py:170 msgid "" -"When a remote publishing server is created and an account needs to be created \n" +"When a remote publishing server is created and an account needs to be " +"created \n" " automatically, this task will be executed" msgstr "" -"リモートパブリッシャーを作成した後、自動でアカウントを作成する必要がある場合、このActionが実行されます" +"リモートパブリッシャーを作成した後、自動でアカウントを作成する必要がある場" +"合、このActionが実行されます" -#: terminal/tasks.py:163 +#: terminal/tasks.py:184 msgid "Check command replay storage connectivity" msgstr "チェックコマンドと録画ストレージの接続性" -#: terminal/tasks.py:165 +#: terminal/tasks.py:186 msgid "" -"Check every day at midnight whether the external storage for commands and recordings \n" -" is accessible. If it is not accessible, send a notification to the recipients specified \n" -" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" +"Check every day at midnight whether the external storage for commands and " +"recordings \n" +" is accessible. If it is not accessible, send a notification to the " +"recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - " +"Connectivity'" msgstr "" -"毎日午前0時に、コマンドと映像の外部ストレージが接続可能かどうかを確認します。接続できない場合は、システム設定-通知設定-メッセージ訂閱-コマンドと映像ストレージ設定の受け取り人に送信します" +"毎日午前0時に、コマンドと映像の外部ストレージが接続可能かどうかを確認します。" +"接続できない場合は、システム設定-通知設定-メッセージ訂閱-コマンドと映像スト" +"レージ設定の受け取り人に送信します" #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" @@ -8400,13 +8728,16 @@ msgid "" "administrator to open more ports." msgstr "" "利用可能なポートと一致しません。データベースの数が、データベース プロキシ " -"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開くには、管理者に連絡してください。" +"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開" +"くには、管理者に連絡してください。" #: terminal/utils/db_port_mapper.py:116 msgid "" -"No ports can be used, check and modify the limit on the number of ports that" -" Magnus listens on in the configuration file." -msgstr "使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の制限を確認して変更してください. " +"No ports can be used, check and modify the limit on the number of ports that " +"Magnus listens on in the configuration file." +msgstr "" +"使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の" +"制限を確認して変更してください. " #: terminal/utils/db_port_mapper.py:118 msgid "All available port count: {}, Already use port count: {}" @@ -8468,7 +8799,9 @@ msgstr "チケットはすでに閉じています" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: {}" +msgstr "" +"チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: " +"{}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -8702,7 +9035,9 @@ msgstr "承認" #: tickets/views/approve.py:44 msgid "" "This ticket does not exist, the process has ended, or this link has expired" -msgstr "このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効になっています" +msgstr "" +"このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効に" +"なっています" #: tickets/views/approve.py:72 msgid "Click the button below to approve or reject" @@ -8818,7 +9153,8 @@ msgid "" "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" msgstr "" -"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入ります。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" +"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入りま" +"す。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" #: users/forms/profile.py:59 msgid "* Enable MFA to make the account more secure." @@ -8826,11 +9162,12 @@ msgstr "* アカウントをより安全にするためにMFAを有効にしま #: users/forms/profile.py:68 msgid "" -"In order to protect you and your company, please keep your account, password" -" and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password " +"and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" msgstr "" -"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" +"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報" +"を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" #: users/forms/profile.py:82 users/serializers/preference/lina.py:21 msgid "New password" @@ -8983,10 +9320,12 @@ msgstr "ターミナルテーマ名" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files," -" account password change results files" +"sends emails containing file attachments.
Such as: account backup files, " +"account password change results files" msgstr "" -"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含まれている場合、このパスワードで解読します。
例:アカウントのバックアップファイル、アカウントのパスワード変更結果ファイル" +"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含" +"まれている場合、このパスワードで解読します。
例:アカウントのバックアップ" +"ファイル、アカウントのパスワード変更結果ファイル" #: users/serializers/preference/lina.py:39 users/serializers/profile.py:48 msgid "The newly set password is inconsistent" @@ -9034,7 +9373,9 @@ msgid "" "remote computer to fit the window size of the client computer when the " "window is resized." msgstr "" -"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコンピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように拡大または縮小するかどうかを決定します。" +"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコン" +"ピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように" +"拡大または縮小するかどうかを決定します。" # msgid "" # "Determines whether the client computer should scale the content on the " @@ -9086,9 +9427,10 @@ msgstr "システムの役割" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across" -" all organizations" -msgstr "システムロールはシステムレベルのロールであり、すべての組織で有効になります" +"System roles are roles at the system level, and they will take effect across " +"all organizations" +msgstr "" +"システムロールはシステムレベルのロールであり、すべての組織で有効になります" #: users/serializers/user.py:61 msgid "Org roles" @@ -9158,7 +9500,9 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザを制限することができます。" +"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。" +"セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザ" +"を制限することができます。" #: users/serializers/user.py:266 msgid "Superuser" @@ -9182,9 +9526,10 @@ msgstr "認証" #: users/serializers/user.py:426 msgid "" -"* For security, only a partial of users is displayed. You can search for " -"more" -msgstr "* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを検索することができます" +"* For security, only a partial of users is displayed. You can search for more" +msgstr "" +"* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを" +"検索することができます" #: users/serializers/user.py:461 msgid "name not unique" @@ -9193,8 +9538,11 @@ msgstr "名前が一意ではない" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the administrator." -msgstr "管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザーはユーザーリストにありません。管理者に連絡してください。" +" and the current user is not in the user list. Please contact the " +"administrator." +msgstr "" +"管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザー" +"はユーザーリストにありません。管理者に連絡してください。" #: users/signal_handlers.py:196 msgid "Clean up expired user sessions" @@ -9202,10 +9550,12 @@ msgstr "期限切れのユーザー・セッションのパージ" #: users/signal_handlers.py:198 msgid "" -"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" +"After logging in via the web, a user session record is created. At 2 a.m. " +"every day, \n" " the system cleans up inactive user devices" msgstr "" -"webでログインすると、利用者のセッションのオンライン記録が生じます。毎日午前2時に、オンラインではない利用者デバイスをクリアします" +"webでログインすると、利用者のセッションのオンライン記録が生じます。毎日午前2" +"時に、オンラインではない利用者デバイスをクリアします" #: users/tasks.py:26 msgid "Check password expired" @@ -9213,10 +9563,12 @@ msgstr "パスワードの有効期限が切れていることを確認する" #: users/tasks.py:28 msgid "" -"Check every day at 10 AM whether the passwords of users in the system are expired, \n" +"Check every day at 10 AM whether the passwords of users in the system are " +"expired, \n" " and send a notification 5 days in advance" msgstr "" -"毎日午前10時にチェックし、システム内の利用者のパスワードが期限切れになっているかどうかを確認し、5日前に通知を送ります" +"毎日午前10時にチェックし、システム内の利用者のパスワードが期限切れになってい" +"るかどうかを確認し、5日前に通知を送ります" #: users/tasks.py:46 msgid "Periodic check password expired" @@ -9224,11 +9576,15 @@ msgstr "定期認証パスワードの有効期限" #: users/tasks.py:48 msgid "" -"With version iterations, new tasks may be added, or task names and execution times may \n" -" be modified. Therefore, upon system startup, it is necessary to register or update the \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, it is necessary to " +"register or update the \n" " parameters of the task that checks if passwords have expired" msgstr "" -"バージョンが進化するにつれて、新たなActionが追加されたり、Actionの名前、実行時間が変更されたりする可能性があります。そのため、システムが起動するときに、パスワードの期限切れを確認するActionのパラメータを登録または更新します" +"バージョンが進化するにつれて、新たなActionが追加されたり、Actionの名前、実行" +"時間が変更されたりする可能性があります。そのため、システムが起動するときに、" +"パスワードの期限切れを確認するActionのパラメータを登録または更新します" #: users/tasks.py:67 msgid "Check user expired" @@ -9236,9 +9592,12 @@ msgstr "ユーザーの有効期限が切れていることを確認する" #: users/tasks.py:69 msgid "" -"Check every day at 10 AM whether the users in the system are expired, and send a \n" +"Check every day at 2 p.m whether the users in the system are expired, and " +"send a \n" " notification 5 days in advance" -msgstr "毎日午前10時に確認し、システム内のユーザーが期限切れになっているか確認し、5日前に通知を送信します" +msgstr "" +"毎日午前10時に確認し、システム内のユーザーが期限切れになっているか確認し、5日" +"前に通知を送信します" #: users/tasks.py:90 msgid "Periodic check user expired" @@ -9246,11 +9605,15 @@ msgstr "ユーザーの有効期限の定期的な検出" #: users/tasks.py:92 msgid "" -"With version iterations, new tasks may be added, or task names and execution times may \n" -" be modified. Therefore, upon system startup, it is necessary to register or update the \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, it is necessary to " +"register or update the \n" " parameters of the task that checks if users have expired" msgstr "" -"バージョンのイテレーションに伴い、新たなタスクが追加されたり、タスクの名称、実行時間が変更される可能性があるため、システム起動時に、登録または更新されたユーザーが期限切れのタスクのパラメータをチェックします" +"バージョンのイテレーションに伴い、新たなタスクが追加されたり、タスクの名称、" +"実行時間が変更される可能性があるため、システム起動時に、登録または更新された" +"ユーザーが期限切れのタスクのパラメータをチェックします" #: users/tasks.py:111 msgid "Check unused users" @@ -9258,11 +9621,15 @@ msgstr "未使用のユーザーのチェック" #: users/tasks.py:113 msgid "" -"At 2 a.m. every day, according to the configuration in \"System Settings - Security - \n" -" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" +"At 2 p.m. every day, according to the configuration in \"System Settings - " +"Security - \n" +" Auth security - Auto disable threshold\" users who have not logged " +"in or whose API keys \n" " have not been used for a long time will be disabled" msgstr "" -"毎日午前2時、システム設定-セキュリティ設定-非アクティブユーザー自動無効化設定に基づき、長時間ログインしないユーザーやapi_keyを使用しないユーザーを無効にします" +"毎日午前2時、システム設定-セキュリティ設定-非アクティブユーザー自動無効化設定" +"に基づき、長時間ログインしないユーザーやapi_keyを使用しないユーザーを無効にし" +"ます" #: users/tasks.py:157 msgid "The user has not logged in recently and has been disabled." @@ -9276,7 +9643,8 @@ msgstr "アカウントの有効期限は" msgid "" "In order not to affect your normal work, please contact the administrator " "for confirmation." -msgstr "通常の作業に影響を与えないように、確認のために管理者に連絡してください。" +msgstr "" +"通常の作業に影響を与えないように、確認のために管理者に連絡してください。" #: users/templates/users/_msg_password_expire_reminder.html:7 msgid "Your password will expire in" @@ -9286,7 +9654,9 @@ msgstr "パスワードは" msgid "" "For your account security, please click on the link below to update your " "password in time" -msgstr "アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間内に更新してください" +msgstr "" +"アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間" +"内に更新してください" #: users/templates/users/_msg_password_expire_reminder.html:11 msgid "Click here update password" @@ -9294,7 +9664,8 @@ msgstr "ここをクリック更新パスワード" #: users/templates/users/_msg_password_expire_reminder.html:16 msgid "If your password has expired, please click the link below to" -msgstr "パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" +msgstr "" +"パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" #: users/templates/users/_msg_reset_mfa.html:7 msgid "Your MFA has been reset by site administrator" @@ -9394,9 +9765,11 @@ msgstr "ワンタイムパスワード認証子のバインド" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a " -"6-bit verification code" -msgstr "MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コードでスキャンします。" +"Use the MFA Authenticator application to scan the following qr code for a 6-" +"bit verification code" +msgstr "" +"MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コード" +"でスキャンします。" #: users/templates/users/user_otp_enable_bind.html:22 #: users/templates/users/user_verify_mfa.html:27 @@ -9411,7 +9784,9 @@ msgstr "アプリのインストール" msgid "" "Download and install the MFA Authenticator application on your phone or " "applet of WeChat" -msgstr "携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウンロードしてインストールします" +msgstr "" +"携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウン" +"ロードしてインストールします" #: users/templates/users/user_otp_enable_install_app.html:18 msgid "Android downloads" @@ -9425,7 +9800,9 @@ msgstr "IPhoneのダウンロード" msgid "" "After installation, click the next step to enter the binding page (if " "installed, go to the next step directly)." -msgstr "インストール後、次のステップをクリックしてバインディングページに入ります (インストールされている場合は、次のステップに直接進みます)。" +msgstr "" +"インストール後、次のステップをクリックしてバインディングページに入ります (イ" +"ンストールされている場合は、次のステップに直接進みます)。" #: users/templates/users/user_password_verify.html:8 #: users/templates/users/user_password_verify.html:9 @@ -9440,7 +9817,8 @@ msgstr "認証" msgid "" "The account protection has been opened, please complete the following " "operations according to the prompts" -msgstr "アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" +msgstr "" +"アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" #: users/templates/users/user_verify_mfa.html:17 msgid "Open MFA Authenticator and enter the 6-bit dynamic code" @@ -9452,7 +9830,8 @@ msgstr "すでにバインド済み" #: users/views/profile/otp.py:107 msgid "MFA already bound, disable first, then bound" -msgstr "MFAはすでにバインドされており、最初に無効にしてからバインドされています。" +msgstr "" +"MFAはすでにバインドされており、最初に無効にしてからバインドされています。" #: users/views/profile/otp.py:134 msgid "OTP enable success" @@ -9480,9 +9859,11 @@ msgstr "パスワード無効" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change" -" their passwords: {}" -msgstr "ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが許可され、パスワードの変更はサポートされていません: {}" +"Non-local users can log in only from third-party platforms and cannot change " +"their passwords: {}" +msgstr "" +"ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが" +"許可され、パスワードの変更はサポートされていません: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 msgid "Token invalid or expired" @@ -9714,7 +10095,9 @@ msgstr "インスタンス \"%s\" の同期に失敗しました" msgid "" "The updated platform of asset \"%s\" is inconsistent with the original " "platform type. Skip platform and protocol updates" -msgstr "更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プラットフォームとプロトコルの更新をスキップ" +msgstr "" +"更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プ" +"ラットフォームとプロトコルの更新をスキップ" #: xpack/plugins/cloud/manager.py:392 #, python-format @@ -9845,8 +10228,7 @@ msgstr "インスタンス" msgid "Sync instance detail" msgstr "同期インスタンスの詳細" -#: xpack/plugins/cloud/models.py:311 -#: xpack/plugins/cloud/serializers/task.py:77 +#: xpack/plugins/cloud/models.py:311 xpack/plugins/cloud/serializers/task.py:77 msgid "Rule relation" msgstr "条件関係" @@ -9902,8 +10284,7 @@ msgstr "ルール一致" msgid "Rule value" msgstr "ルール値" -#: xpack/plugins/cloud/models.py:381 -#: xpack/plugins/cloud/serializers/task.py:80 +#: xpack/plugins/cloud/models.py:381 xpack/plugins/cloud/serializers/task.py:80 msgid "Strategy rule" msgstr "戦略ルール" @@ -9919,8 +10300,7 @@ msgstr "アクション属性" msgid "Action value" msgstr "アクション値" -#: xpack/plugins/cloud/models.py:407 -#: xpack/plugins/cloud/serializers/task.py:83 +#: xpack/plugins/cloud/models.py:407 xpack/plugins/cloud/serializers/task.py:83 msgid "Strategy action" msgstr "戦略アクション" @@ -10198,8 +10578,9 @@ msgid "" "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." msgstr "" -"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが実行されると、有効な IP アドレスのみが同期されます。 " -"
ポートが0の場合、すべてのIPアドレスが有効です。" +"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが" +"実行されると、有効な IP アドレスのみが同期されます。
ポートが0の場合、す" +"べてのIPアドレスが有効です。" #: xpack/plugins/cloud/serializers/account_attrs.py:190 msgid "Hostname prefix" @@ -10231,22 +10612,29 @@ msgstr "インスタンス数" #: xpack/plugins/cloud/tasks.py:33 msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are" -" performed" -msgstr "" +"\n" +" Execute this task when manually or scheduled cloud synchronization " +"tasks are performed\n" +" " +msgstr "\n" "手動で、定時にクラウド同期タスクを実行する時にこのタスクを実行します" -#: xpack/plugins/cloud/tasks.py:50 +#: xpack/plugins/cloud/tasks.py:52 msgid "Period clean sync instance task execution" msgstr "同期インスタンス タスクの実行記録を定期的にクリアする" -#: xpack/plugins/cloud/tasks.py:52 +#: xpack/plugins/cloud/tasks.py:54 msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" -" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" -" records generated by cloud synchronization" -msgstr "" -"毎日、システム設定-タスクリスト-定期的なクリーニング設定-クラウド同期記録設定に基づき、クラウド同期によって生成された実行記録をクリーニングします。" +"\n" +" Every day, according to the configuration in \"System Settings - " +"Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will " +"clean up the execution \n" +" records generated by cloud synchronization\n" +" " +msgstr "\n" +"毎日、システム設定-タスクリスト-定期的なクリーニング設定-クラウド同期記録設定" +"に基づき、クラウド同期によって生成された実行記録をクリーニングします。" #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 2d3fc4b3f..8ee6c3536 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-14 16:55+0800\n" +"POT-Creation-Date: 2024-09-19 16:31+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -340,14 +340,14 @@ msgstr "用户 %s 查看/导出 了密码" #: accounts/models/account.py:49 #: accounts/models/automations/gather_account.py:16 #: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:271 +#: accounts/serializers/account/account.py:272 #: accounts/serializers/account/gathered_account.py:10 #: accounts/serializers/automations/change_secret.py:111 #: accounts/serializers/automations/change_secret.py:143 #: accounts/templates/accounts/asset_account_change_info.html:7 #: accounts/templates/accounts/change_secret_failed_info.html:11 -#: acls/serializers/base.py:123 assets/models/asset/common.py:95 -#: assets/models/asset/common.py:355 assets/models/cmd_filter.py:36 +#: acls/serializers/base.py:123 assets/models/asset/common.py:102 +#: assets/models/asset/common.py:362 assets/models/cmd_filter.py:36 #: audits/models.py:58 authentication/models/connection_token.py:36 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:32 terminal/notifications.py:155 @@ -360,8 +360,8 @@ msgstr "资产" #: accounts/models/account.py:53 accounts/models/template.py:16 #: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:281 -#: accounts/serializers/account/template.py:27 +#: accounts/serializers/account/account.py:282 +#: accounts/serializers/account/template.py:37 #: authentication/serializers/connect_token_secret.py:50 msgid "Su from" msgstr "切换自" @@ -594,7 +594,7 @@ msgid "Status" msgstr "状态" #: accounts/models/automations/change_secret.py:46 -#: accounts/serializers/account/account.py:273 +#: accounts/serializers/account/account.py:274 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:8 #: authentication/templates/authentication/passkey.html:173 @@ -670,7 +670,7 @@ msgid "Verify asset account" msgstr "账号验证" #: accounts/models/base.py:37 accounts/models/base.py:67 -#: accounts/serializers/account/account.py:463 +#: accounts/serializers/account/account.py:464 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:47 #: authentication/serializers/connect_token_secret.py:42 @@ -692,19 +692,19 @@ msgstr "密文" msgid "Secret strategy" msgstr "密文策略" -#: accounts/models/base.py:44 accounts/serializers/account/template.py:24 +#: accounts/models/base.py:44 accounts/serializers/account/template.py:34 #: accounts/serializers/automations/change_secret.py:46 msgid "Password rules" msgstr "密码规则" #: accounts/models/base.py:64 accounts/serializers/account/virtual.py:20 #: acls/models/base.py:35 acls/models/base.py:96 acls/models/command_acl.py:21 -#: acls/serializers/base.py:35 assets/models/asset/common.py:93 -#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 +#: acls/serializers/base.py:35 assets/models/asset/common.py:100 +#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 -#: assets/serializers/platform.py:273 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:157 +#: assets/serializers/platform.py:277 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 @@ -854,14 +854,14 @@ msgid "Exist policy" msgstr "账号存在策略" #: accounts/serializers/account/account.py:181 -#: accounts/serializers/account/account.py:339 +#: accounts/serializers/account/account.py:340 msgid "Account already exists" msgstr "账号已存在" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 -#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 -#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 +#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:172 +#: assets/serializers/platform.py:278 perms/serializers/user_permission.py:26 #: settings/models.py:37 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -871,8 +871,8 @@ msgstr "类别" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 -#: assets/serializers/platform.py:167 audits/serializers.py:53 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:159 +#: assets/serializers/platform.py:171 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 @@ -890,26 +890,26 @@ msgstr "类型" msgid "Asset not found" msgstr "资产不存在" -#: accounts/serializers/account/account.py:262 +#: accounts/serializers/account/account.py:263 msgid "Has secret" msgstr "已托管密码" -#: accounts/serializers/account/account.py:272 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:273 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "状态" -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:275 msgid "Changed" msgstr "已修改" -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:285 #: accounts/serializers/automations/base.py:22 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:19 #: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 -#: assets/serializers/platform.py:176 assets/serializers/platform.py:208 +#: assets/serializers/platform.py:180 assets/serializers/platform.py:212 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 #: perms/serializers/permission.py:46 @@ -918,30 +918,30 @@ msgstr "已修改" msgid "Assets" msgstr "资产" -#: accounts/serializers/account/account.py:389 +#: accounts/serializers/account/account.py:390 #, python-format msgid "Asset does not support this secret type: %s" msgstr "资产不支持账号类型: %s" -#: accounts/serializers/account/account.py:421 +#: accounts/serializers/account/account.py:422 msgid "Account has exist" msgstr "账号已存在" -#: accounts/serializers/account/account.py:458 +#: accounts/serializers/account/account.py:459 #: accounts/serializers/account/base.py:93 -#: accounts/serializers/account/template.py:72 +#: accounts/serializers/account/template.py:83 #: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特殊信息" -#: accounts/serializers/account/account.py:464 +#: accounts/serializers/account/account.py:465 #: authentication/serializers/connect_token_secret.py:159 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 +#: accounts/serializers/account/account.py:475 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 #: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 @@ -963,7 +963,7 @@ msgstr "ID" msgid "User" msgstr "用户" -#: accounts/serializers/account/account.py:475 +#: accounts/serializers/account/account.py:476 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:158 terminal/notifications.py:207 msgid "Date" @@ -1025,15 +1025,34 @@ msgstr "特殊字符" msgid "Exclude symbol" msgstr "排除字符" -#: accounts/serializers/account/template.py:39 +#: accounts/serializers/account/template.py:24 +msgid "" +"length is the length of the password, and the range is 8 to 30.\n" +"lowercase indicates whether the password contains lowercase letters, \n" +"uppercase indicates whether it contains uppercase letters,\n" +"digit indicates whether it contains numbers, and symbol indicates whether it " +"contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the " +"symbol characters to be excluded (up to 16). \n" +"If you do not need to exclude symbols, you can leave it blank.\n" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " +"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +msgstr "" +"length 是密码的长度,填写范围为 8 到 30。" +"lowercase 表示密码中是否包含小写字母,uppercase 表示是否包含大写字母," +"digit 表示是否包含数字,symbol 表示是否包含特殊符号。" +"exclude_symbols 用于排除特定符号,您可以填写要排除的符号字符(最多 16 个),如果无需排除符号,可以留空。" +"默认: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" + +#: accounts/serializers/account/template.py:49 msgid "Secret generation strategy for account creation" msgstr "密码生成策略,用于账号创建时,设置密码" -#: accounts/serializers/account/template.py:40 +#: accounts/serializers/account/template.py:50 msgid "Whether to automatically push the account to the asset" msgstr "是否自动推送账号到资产" -#: accounts/serializers/account/template.py:43 +#: accounts/serializers/account/template.py:53 msgid "" "Associated platform, you can configure push parameters. If not associated, " "default parameters will be used" @@ -1064,7 +1083,7 @@ msgstr "" "CACHE_LOGIN_PASSWORD_ENABLED=true,重启服务才能开启" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:172 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47 msgid "Nodes" msgstr "节点" @@ -1253,17 +1272,17 @@ msgid "" "task will be executed" msgstr "在系统设置-功能设置-账号存储点击同步时,执行该任务" -#: accounts/tasks/verify_account.py:50 +#: accounts/tasks/verify_account.py:49 msgid "Verify asset account availability" msgstr "验证资产账号可用性" -#: accounts/tasks/verify_account.py:53 +#: accounts/tasks/verify_account.py:52 msgid "" "When clicking 'Test' in 'Console - Asset details - Accounts' this task will " "be executed" msgstr "当在控制台-资产详情-账号点击测试执行该任务" -#: accounts/tasks/verify_account.py:59 +#: accounts/tasks/verify_account.py:58 msgid "Verify accounts connectivity" msgstr "测试账号可连接性" @@ -1348,7 +1367,7 @@ msgstr "优先级可选范围为 1-100 (数值越小越优先)" msgid "Reviewers" msgstr "审批人" -#: acls/models/base.py:43 assets/models/asset/common.py:171 +#: acls/models/base.py:43 assets/models/asset/common.py:178 #: authentication/models/access_key.py:25 #: authentication/models/connection_token.py:53 #: authentication/models/ssh_key.py:13 @@ -1504,7 +1523,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:149 xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1566,11 +1585,11 @@ msgstr "登录城市" msgid "User agent" msgstr "用户代理" -#: assets/api/asset/asset.py:181 +#: assets/api/asset/asset.py:190 msgid "Cannot create asset directly, you should create a host or other" msgstr "不能直接创建资产, 你应该创建主机或其他资产" -#: assets/api/asset/asset.py:185 +#: assets/api/asset/asset.py:194 msgid "The number of assets exceeds the limit of 5000" msgstr "资产数量超过了 5000 的限制" @@ -1929,51 +1948,51 @@ msgstr "暂时不支持此功能" msgid "Cloud" msgstr "云服务" -#: assets/models/asset/common.py:94 assets/models/platform.py:16 +#: assets/models/asset/common.py:101 assets/models/platform.py:16 #: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77 #: settings/serializers/msg.py:31 terminal/serializers/storage.py:133 #: xpack/plugins/cloud/serializers/account_attrs.py:73 msgid "Port" msgstr "端口" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "地址" -#: assets/models/asset/common.py:162 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:149 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 msgid "Platform" msgstr "平台" -#: assets/models/asset/common.py:166 assets/models/domain.py:22 +#: assets/models/asset/common.py:173 assets/models/domain.py:22 msgid "Zone" msgstr "网域" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:408 +#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:408 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集资产硬件信息" -#: assets/models/asset/common.py:173 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "自定义属性" -#: assets/models/asset/common.py:358 +#: assets/models/asset/common.py:365 msgid "Can refresh asset hardware info" msgstr "可以更新资产硬件信息" -#: assets/models/asset/common.py:359 +#: assets/models/asset/common.py:366 msgid "Can test asset connectivity" msgstr "可以测试资产连接性" -#: assets/models/asset/common.py:360 +#: assets/models/asset/common.py:367 msgid "Can match asset" msgstr "可以匹配资产" -#: assets/models/asset/common.py:361 +#: assets/models/asset/common.py:368 msgid "Can change asset nodes" msgstr "可以修改资产节点" @@ -2112,7 +2131,7 @@ msgstr "值" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 -#: assets/serializers/platform.py:154 +#: assets/serializers/platform.py:158 #: authentication/serializers/connect_token_secret.py:124 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 @@ -2163,7 +2182,7 @@ msgstr "主要的" msgid "Required" msgstr "必须的" -#: assets/models/platform.py:19 assets/serializers/platform.py:156 +#: assets/models/platform.py:19 assets/serializers/platform.py:160 #: terminal/models/component/storage.py:28 #: xpack/plugins/cloud/providers/nutanix.py:30 msgid "Default" @@ -2271,23 +2290,23 @@ msgstr "元数据" msgid "Internal" msgstr "内置" -#: assets/models/platform.py:102 assets/serializers/platform.py:166 +#: assets/models/platform.py:102 assets/serializers/platform.py:170 msgid "Charset" msgstr "编码" -#: assets/models/platform.py:104 assets/serializers/platform.py:204 +#: assets/models/platform.py:104 assets/serializers/platform.py:208 msgid "Gateway enabled" msgstr "启用网域" -#: assets/models/platform.py:106 assets/serializers/platform.py:197 +#: assets/models/platform.py:106 assets/serializers/platform.py:201 msgid "Su enabled" msgstr "启用账号切换" -#: assets/models/platform.py:107 assets/serializers/platform.py:172 +#: assets/models/platform.py:107 assets/serializers/platform.py:176 msgid "Su method" msgstr "账号切换方式" -#: assets/models/platform.py:108 assets/serializers/platform.py:175 +#: assets/models/platform.py:108 assets/serializers/platform.py:179 msgid "Custom fields" msgstr "自定义属性" @@ -2302,7 +2321,7 @@ msgid "" "type" msgstr "资产中批量更新平台,不符合平台类型跳过的资产" -#: assets/serializers/asset/common.py:36 +#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:152 msgid "Protocols, format is [\"protocol/port\"]" msgstr "协议,格式为 [\"协议/端口\"]" @@ -2324,7 +2343,7 @@ msgid "" "it" msgstr "节点路径,格式为 [\"/组织/节点名\"], 如果节点不存在,将创建它" -#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:173 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 @@ -2458,7 +2477,7 @@ msgid "" "the zone, the connection is routed through the gateway." msgstr "网关是网域的网络代理,当连接网域内的资产时,连接将通过网关进行路由。" -#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 +#: assets/serializers/domain.py:24 assets/serializers/platform.py:181 #: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "资产数量" @@ -2543,19 +2562,19 @@ msgstr "该协议是默认的,添加资产时,将默认显示" msgid "This protocol is public, asset will show this protocol to user" msgstr "该协议是公开的,资产将向用户显示该协议并可以连接使用" -#: assets/serializers/platform.py:157 +#: assets/serializers/platform.py:161 msgid "Help text" msgstr "帮助" -#: assets/serializers/platform.py:158 +#: assets/serializers/platform.py:162 msgid "Choices" msgstr "选择" -#: assets/serializers/platform.py:170 +#: assets/serializers/platform.py:174 msgid "Automation" msgstr "自动化" -#: assets/serializers/platform.py:199 +#: assets/serializers/platform.py:203 msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " @@ -2564,19 +2583,19 @@ msgstr "" "在访问资产时使用账户登录,然后自动切换到另一个账户,就像用普通账户登录然后切" "换到 root 一样" -#: assets/serializers/platform.py:205 +#: assets/serializers/platform.py:209 msgid "Assets can be connected using a zone gateway" msgstr "资产可以使用区域网关进行连接" -#: assets/serializers/platform.py:207 +#: assets/serializers/platform.py:211 msgid "Default Domain" msgstr "默认网域" -#: assets/serializers/platform.py:229 +#: assets/serializers/platform.py:233 msgid "type is required" msgstr "类型 该字段是必填项。" -#: assets/serializers/platform.py:244 +#: assets/serializers/platform.py:248 msgid "Protocols is required" msgstr "协议是必填的" @@ -2724,7 +2743,7 @@ msgstr "建立软链接" #: audits/const.py:18 audits/const.py:28 #: ops/templates/ops/celery_task_log.html:86 -#: terminal/api/session/session.py:149 +#: terminal/api/session/session.py:153 msgid "Download" msgstr "下载" @@ -2732,7 +2751,7 @@ msgstr "下载" msgid "Rename dir" msgstr "映射目录" -#: audits/const.py:23 rbac/tree.py:266 terminal/api/session/session.py:274 +#: audits/const.py:23 rbac/tree.py:266 terminal/api/session/session.py:281 #: terminal/templates/terminal/_msg_command_warning.html:18 #: terminal/templates/terminal/_msg_session_sharing.html:10 #: xpack/plugins/cloud/manager.py:84 @@ -3100,7 +3119,7 @@ msgstr "ACL 动作是复核" msgid "Current user not support mfa type: {}" msgstr "当前用户不支持 MFA 类型: {}" -#: authentication/api/password.py:33 terminal/api/session/session.py:322 +#: authentication/api/password.py:33 terminal/api/session/session.py:334 #: users/views/profile/reset.py:63 msgid "User does not exist: {}" msgstr "用户不存在: {}" @@ -3349,15 +3368,15 @@ msgstr "您的密码无效" msgid "Please wait for %s seconds before retry" msgstr "请在 %s 秒后重试" -#: authentication/errors/redirect.py:85 authentication/mixins.py:323 +#: authentication/errors/redirect.py:85 authentication/mixins.py:326 msgid "Your password is too simple, please change it for security" msgstr "你的密码过于简单,为了安全,请修改" -#: authentication/errors/redirect.py:93 authentication/mixins.py:330 +#: authentication/errors/redirect.py:93 authentication/mixins.py:335 msgid "You should to change your password before login" msgstr "登录完成前,请先修改密码" -#: authentication/errors/redirect.py:101 authentication/mixins.py:337 +#: authentication/errors/redirect.py:101 authentication/mixins.py:344 msgid "Your password has expired, please reset before logging in" msgstr "您的密码已过期,先修改再登录" @@ -3473,7 +3492,7 @@ msgstr "管理员已开启'仅允许从用户来源登录',当前用户来源 msgid "The MFA type ({}) is not enabled" msgstr "该 MFA ({}) 方式没有启用" -#: authentication/mixins.py:313 +#: authentication/mixins.py:314 msgid "Please change your password" msgstr "请修改密码" @@ -4222,70 +4241,70 @@ msgstr "解析文件错误: {}" msgid "Invalid excel file" msgstr "无效的 excel 文件" -#: common/drf/renders/base.py:137 +#: common/drf/renders/base.py:138 msgid "Yes/No" msgstr "" -#: common/drf/renders/base.py:140 +#: common/drf/renders/base.py:141 msgid "Text, max length {}" msgstr "文本,最大长度 {}" -#: common/drf/renders/base.py:142 +#: common/drf/renders/base.py:143 msgid "Long text, no length limit" msgstr "长文本,无长度限制" -#: common/drf/renders/base.py:144 +#: common/drf/renders/base.py:145 msgid "Number, min {} max {}" msgstr "数字,最小 {} 最大 {}" -#: common/drf/renders/base.py:147 +#: common/drf/renders/base.py:148 msgid "Datetime format {}" msgstr "日期时间格式 {}" -#: common/drf/renders/base.py:153 +#: common/drf/renders/base.py:154 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" msgstr "选项,格式: 名称(值),名称是可选的,方便阅读,值是必填的,可选项有 {}" -#: common/drf/renders/base.py:156 +#: common/drf/renders/base.py:157 msgid "Choices, options {}" msgstr "选项,可选项有 {}" -#: common/drf/renders/base.py:158 +#: common/drf/renders/base.py:159 msgid "Phone number, format +8612345678901" msgstr "手机号,格式 +8612345678901" -#: common/drf/renders/base.py:160 +#: common/drf/renders/base.py:161 msgid "Label, format [\"key:value\"]" msgstr "标签,格式: [\"键:值\"]" -#: common/drf/renders/base.py:162 +#: common/drf/renders/base.py:163 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "关联项,格式: 名称(id), 名称是可选的,方便阅读,id 是必填的" -#: common/drf/renders/base.py:164 +#: common/drf/renders/base.py:165 msgid "Object, format id" msgstr "关联项,格式是 id" -#: common/drf/renders/base.py:168 +#: common/drf/renders/base.py:169 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" msgstr "" "多关联项,格式: [\"名称(id)\", ...], 名称是可选的,方便阅读,id 是必填的" -#: common/drf/renders/base.py:170 +#: common/drf/renders/base.py:171 msgid "" "Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "标签,格式: [\"键:值\", ...], 如果标签不存在,将创建它" -#: common/drf/renders/base.py:172 +#: common/drf/renders/base.py:173 msgid "Objects, format [\"id\", ...]" msgstr "多关联项,格式是 [\"id\", ...]" -#: common/drf/renders/base.py:270 +#: common/drf/renders/base.py:271 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -7239,16 +7258,12 @@ msgid "Logout" msgstr "注销登录" #: templates/_message.html:6 -#, fuzzy -#| msgid "" -#| " Your account has expired, please contact the " -#| "administrator.\n" -#| " " msgid "" "\n" " Your account has expired, please contact the administrator.\n" " " -msgstr " 您的账号已经过期,请联系管理员。 " +msgstr "\n" +" 您的账号已经过期,请联系管理员。 " #: templates/_message.html:13 msgid "Your account will at" @@ -7408,7 +7423,7 @@ msgstr "命令存储" msgid "Invalid" msgstr "无效" -#: terminal/api/component/storage.py:132 terminal/tasks.py:187 +#: terminal/api/component/storage.py:132 terminal/tasks.py:208 msgid "Test failure: {}" msgstr "测试失败: {}" @@ -7429,15 +7444,15 @@ msgstr "有在线会话" msgid "User %s %s session %s replay" msgstr "用户 %s %s 了会话 %s 的录像" -#: terminal/api/session/session.py:314 +#: terminal/api/session/session.py:326 msgid "Session does not exist: {}" msgstr "会话不存在: {}" -#: terminal/api/session/session.py:317 +#: terminal/api/session/session.py:329 msgid "Session is finished or the protocol not supported" msgstr "会话已经完成或协议不支持" -#: terminal/api/session/session.py:330 +#: terminal/api/session/session.py:342 msgid "User does not have permission" msgstr "用户没有权限" @@ -7806,23 +7821,23 @@ msgstr "命令数量" msgid "Error reason" msgstr "错误原因" -#: terminal/models/session/session.py:290 +#: terminal/models/session/session.py:308 msgid "Session record" msgstr "会话记录" -#: terminal/models/session/session.py:292 +#: terminal/models/session/session.py:310 msgid "Can monitor session" msgstr "可以监控会话" -#: terminal/models/session/session.py:293 +#: terminal/models/session/session.py:311 msgid "Can share session" msgstr "可以分享会话" -#: terminal/models/session/session.py:294 +#: terminal/models/session/session.py:312 msgid "Can terminate session" msgstr "可以终断会话" -#: terminal/models/session/session.py:295 +#: terminal/models/session/session.py:313 msgid "Can validate session action perm" msgstr "可以验证会话动作权限" @@ -7922,7 +7937,7 @@ msgstr "级别" msgid "Command and replay storage" msgstr "命令及录像存储" -#: terminal/notifications.py:240 terminal/tasks.py:191 +#: terminal/notifications.py:240 terminal/tasks.py:212 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -8413,7 +8428,7 @@ msgstr "每10分钟检查3分钟未活跃的资产连接会话,将这些会话 msgid "Upload session replay to external storage" msgstr "上传会话录像到外部存储" -#: terminal/tasks.py:70 +#: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" "If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " "and \n" @@ -8422,54 +8437,58 @@ msgstr "" "如果设置了SERVER_REPLAY_STORAGE,将通过文件管理上传的文件同步到外部存储" #: terminal/tasks.py:102 +msgid "Upload session replay part file to external storage" +msgstr "将会话重播部分文件上传到外部存储" + +#: terminal/tasks.py:123 msgid "Run applet host deployment" msgstr "运行应用机部署" -#: terminal/tasks.py:105 +#: terminal/tasks.py:126 msgid "" "When deploying from the remote application publisher details page, and the " "'Deploy' \n" " button is clicked, this task will be executed" msgstr "发布机部署,点击部署时,执行该任务" -#: terminal/tasks.py:116 +#: terminal/tasks.py:137 msgid "Install applet" msgstr "安装应用" -#: terminal/tasks.py:119 +#: terminal/tasks.py:140 msgid "" "When the 'Deploy' button is clicked in the 'Remote Application' section of " "the remote \n" " application publisher details page, this task will be executed" msgstr "当远程应用发布机详情-远程应用,点击部署时,执行该任务" -#: terminal/tasks.py:131 +#: terminal/tasks.py:152 msgid "Uninstall applet" msgstr "卸载应用" -#: terminal/tasks.py:134 +#: terminal/tasks.py:155 msgid "" "When the 'Uninstall' button is clicked in the 'Remote Application' section " "of the \n" " remote application publisher details page, this task will be executed" msgstr "当远程应用发布机详情-远程应用,点击卸载时,执行该任务" -#: terminal/tasks.py:146 +#: terminal/tasks.py:167 msgid "Generate applet host accounts" msgstr "收集远程应用上的账号" -#: terminal/tasks.py:149 +#: terminal/tasks.py:170 msgid "" "When a remote publishing server is created and an account needs to be " "created \n" " automatically, this task will be executed" msgstr "当创建远程发布机后,需要自动创建账号时,执行该任务" -#: terminal/tasks.py:163 +#: terminal/tasks.py:184 msgid "Check command replay storage connectivity" msgstr "检查命令及录像存储可连接性 " -#: terminal/tasks.py:165 +#: terminal/tasks.py:186 msgid "" "Check every day at midnight whether the external storage for commands and " "recordings \n" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 97191c5f9..fa41cfb03 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 17:22+0800\n" +"POT-Creation-Date: 2024-09-19 16:31+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -16,7 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.3\n" -"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://zhconvert.org\n" +"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://" +"zhconvert.org\n" #: accounts/api/automations/base.py:79 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" @@ -188,8 +189,7 @@ msgstr "收集" msgid "Template" msgstr "模板" -#: accounts/const/account.py:32 ops/const.py:46 -#: xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "跳過" @@ -342,14 +342,14 @@ msgstr "用戶 %s 查看/匯出 了密碼" #: accounts/models/account.py:49 #: accounts/models/automations/gather_account.py:16 #: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:271 +#: accounts/serializers/account/account.py:272 #: accounts/serializers/account/gathered_account.py:10 #: accounts/serializers/automations/change_secret.py:111 #: accounts/serializers/automations/change_secret.py:143 #: accounts/templates/accounts/asset_account_change_info.html:7 #: accounts/templates/accounts/change_secret_failed_info.html:11 -#: acls/serializers/base.py:123 assets/models/asset/common.py:95 -#: assets/models/asset/common.py:355 assets/models/cmd_filter.py:36 +#: acls/serializers/base.py:123 assets/models/asset/common.py:102 +#: assets/models/asset/common.py:362 assets/models/cmd_filter.py:36 #: audits/models.py:58 authentication/models/connection_token.py:36 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:32 terminal/notifications.py:155 @@ -362,8 +362,8 @@ msgstr "資產" #: accounts/models/account.py:53 accounts/models/template.py:16 #: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:281 -#: accounts/serializers/account/template.py:27 +#: accounts/serializers/account/account.py:282 +#: accounts/serializers/account/template.py:37 #: authentication/serializers/connect_token_secret.py:50 msgid "Su from" msgstr "切換自" @@ -392,8 +392,8 @@ msgstr "來源 ID" #: assets/serializers/gateway.py:33 audits/models.py:59 #: authentication/api/connection_token.py:411 ops/models/base.py:18 #: perms/models/asset_permission.py:75 settings/serializers/msg.py:33 -#: terminal/backends/command/models.py:18 -#: terminal/models/session/session.py:34 terminal/serializers/command.py:72 +#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34 +#: terminal/serializers/command.py:72 #: terminal/templates/terminal/_msg_command_warning.html:8 #: terminal/templates/terminal/_msg_session_sharing.html:8 #: tickets/models/ticket/command_confirm.py:13 @@ -587,7 +587,7 @@ msgstr "結束日期" #: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:147 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:225 @@ -596,7 +596,7 @@ msgid "Status" msgstr "狀態" #: accounts/models/automations/change_secret.py:46 -#: accounts/serializers/account/account.py:273 +#: accounts/serializers/account/account.py:274 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:8 #: authentication/templates/authentication/passkey.html:173 @@ -672,7 +672,7 @@ msgid "Verify asset account" msgstr "帳號驗證" #: accounts/models/base.py:37 accounts/models/base.py:67 -#: accounts/serializers/account/account.py:463 +#: accounts/serializers/account/account.py:464 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:47 #: authentication/serializers/connect_token_secret.py:42 @@ -694,19 +694,19 @@ msgstr "金鑰" msgid "Secret strategy" msgstr "密文策略" -#: accounts/models/base.py:44 accounts/serializers/account/template.py:24 +#: accounts/models/base.py:44 accounts/serializers/account/template.py:34 #: accounts/serializers/automations/change_secret.py:46 msgid "Password rules" msgstr "密碼規則" #: accounts/models/base.py:64 accounts/serializers/account/virtual.py:20 #: acls/models/base.py:35 acls/models/base.py:96 acls/models/command_acl.py:21 -#: acls/serializers/base.py:35 assets/models/asset/common.py:93 -#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 +#: acls/serializers/base.py:35 assets/models/asset/common.py:100 +#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 -#: assets/serializers/platform.py:273 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:157 +#: assets/serializers/platform.py:277 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 @@ -717,11 +717,9 @@ msgstr "密碼規則" #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:35 settings/models.py:184 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 -#: terminal/models/component/endpoint.py:12 +#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:12 #: terminal/models/component/endpoint.py:109 -#: terminal/models/component/storage.py:26 -#: terminal/models/component/task.py:13 +#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:85 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -796,7 +794,8 @@ msgstr "登錄資產時,帳號使用者名稱與使用者使用者名稱相同 msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" +msgstr "" +"連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -813,7 +812,9 @@ msgid "" "{} - The account backup passage task has been completed: the encryption " "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" -msgstr "{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中設置文件加密密碼" +msgstr "" +"{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中" +"設置文件加密密碼" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -830,7 +831,9 @@ msgid "" "{} - The encryption change task has been completed: the encryption password " "has not been set - please go to personal information -> set encryption " "password in preferences" -msgstr "{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密碼" +msgstr "" +"{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密" +"碼" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -852,10 +855,15 @@ msgstr "參數" msgid "Exist policy" msgstr "帳號存在策略" +#: accounts/serializers/account/account.py:181 +#: accounts/serializers/account/account.py:340 +msgid "Account already exists" +msgstr "帳號已存在" + #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 -#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 -#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 +#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:172 +#: assets/serializers/platform.py:278 perms/serializers/user_permission.py:26 #: settings/models.py:37 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -865,13 +873,13 @@ msgstr "類別" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 -#: assets/serializers/platform.py:167 audits/serializers.py:53 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:159 +#: assets/serializers/platform.py:171 audits/serializers.py:53 #: audits/serializers.py:170 -#: authentication/serializers/connect_token_secret.py:126 -#: ops/models/job.py:150 perms/serializers/user_permission.py:27 -#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 -#: terminal/models/component/storage.py:154 terminal/serializers/applet.py:29 +#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 +#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 +#: terminal/models/component/storage.py:58 +#: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:23 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 #: tickets/models/flow.py:42 tickets/models/ticket/apply_application.py:16 @@ -884,26 +892,26 @@ msgstr "類型" msgid "Asset not found" msgstr "資產不存在" -#: accounts/serializers/account/account.py:262 +#: accounts/serializers/account/account.py:263 msgid "Has secret" msgstr "已託管密碼" -#: accounts/serializers/account/account.py:272 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:273 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "狀態" -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:275 msgid "Changed" msgstr "已修改" -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:285 #: accounts/serializers/automations/base.py:22 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:19 #: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 -#: assets/serializers/platform.py:176 assets/serializers/platform.py:208 +#: assets/serializers/platform.py:180 assets/serializers/platform.py:212 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 #: perms/serializers/permission.py:46 @@ -912,40 +920,35 @@ msgstr "已修改" msgid "Assets" msgstr "資產" -#: accounts/serializers/account/account.py:339 -msgid "Account already exists" -msgstr "帳號已存在" - -#: accounts/serializers/account/account.py:389 +#: accounts/serializers/account/account.py:390 #, python-format msgid "Asset does not support this secret type: %s" msgstr "資產不支持帳號類型: %s" -#: accounts/serializers/account/account.py:421 +#: accounts/serializers/account/account.py:422 msgid "Account has exist" msgstr "帳號已存在" -#: accounts/serializers/account/account.py:458 +#: accounts/serializers/account/account.py:459 #: accounts/serializers/account/base.py:93 -#: accounts/serializers/account/template.py:72 +#: accounts/serializers/account/template.py:83 #: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特殊資訊" -#: accounts/serializers/account/account.py:464 +#: accounts/serializers/account/account.py:465 #: authentication/serializers/connect_token_secret.py:159 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:474 acls/serializers/base.py:116 +#: accounts/serializers/account/account.py:475 acls/serializers/base.py:116 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 -#: audits/models.py:54 audits/models.py:90 audits/models.py:172 -#: audits/models.py:271 audits/serializers.py:171 -#: authentication/models/connection_token.py:32 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54 +#: audits/models.py:90 audits/models.py:172 audits/models.py:271 +#: audits/serializers.py:171 authentication/models/connection_token.py:32 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:55 perms/models/asset_permission.py:63 @@ -962,7 +965,7 @@ msgstr "ID" msgid "User" msgstr "用戶" -#: accounts/serializers/account/account.py:475 +#: accounts/serializers/account/account.py:476 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:158 terminal/notifications.py:207 msgid "Date" @@ -994,7 +997,9 @@ msgstr "密鑰密碼" msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." -msgstr "提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 username@domain" +msgstr "" +"提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 " +"username@domain" #: accounts/serializers/account/template.py:13 msgid "Password length" @@ -1022,26 +1027,45 @@ msgstr "特殊字元" msgid "Exclude symbol" msgstr "排除字元" -#: accounts/serializers/account/template.py:39 +#: accounts/serializers/account/template.py:24 +msgid "" +"length is the length of the password, and the range is 8 to 30.\n" +"lowercase indicates whether the password contains lowercase letters, \n" +"uppercase indicates whether it contains uppercase letters,\n" +"digit indicates whether it contains numbers, and symbol indicates whether it " +"contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the " +"symbol characters to be excluded (up to 16). \n" +"If you do not need to exclude symbols, you can leave it blank.\n" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " +"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +msgstr "" +"length 是密碼的長度,填入範圍為 8 到 30。" +"lowercase 表示密碼中是否包含小寫字母,uppercase 表示是否包含大寫字母," +"digit 表示是否包含數字,symbol 表示是否包含特殊符號。" +"exclude_symbols 用於排除特定符號,您可以填寫要排除的符號字元(最多 16 個),如果無需排除符號,可以留空。" +"預設: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" + +#: accounts/serializers/account/template.py:49 msgid "Secret generation strategy for account creation" msgstr "密碼生成策略,用於帳號創建時,設置密碼" -#: accounts/serializers/account/template.py:40 +#: accounts/serializers/account/template.py:50 msgid "Whether to automatically push the account to the asset" msgstr "是否自動推送帳號到資產" -#: accounts/serializers/account/template.py:43 +#: accounts/serializers/account/template.py:53 msgid "" "Associated platform, you can configure push parameters. If not associated, " "default parameters will be used" msgstr "關聯平台,可配置推送參數,如果不關聯,將使用默認參數" #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 -#: ops/models/adhoc.py:25 ops/models/job.py:158 ops/models/playbook.py:33 -#: rbac/models/role.py:37 settings/models.py:40 -#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:332 -#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:25 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 +#: ops/models/job.py:158 ops/models/playbook.py:33 rbac/models/role.py:37 +#: settings/models.py:40 terminal/models/applet/applet.py:46 +#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 +#: terminal/models/component/endpoint.py:25 #: terminal/models/component/endpoint.py:119 #: terminal/models/session/session.py:47 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 @@ -1056,13 +1080,13 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號密碼 > 登錄密碼 > 手動輸入
" -"為了安全起見,請設置配置項 CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" +"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號" +"密碼 > 登錄密碼 > 手動輸入
為了安全起見,請設置配置項 " +"CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172 -#: assets/serializers/automations/base.py:21 -#: perms/serializers/permission.py:47 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:172 +#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47 msgid "Nodes" msgstr "節點" @@ -1128,10 +1152,15 @@ msgstr "帳號執行自動化" #: accounts/tasks/automation.py:35 msgid "" -"Unified execution entry for account automation tasks: when the system performs tasks \n" -" such as account push, password change, account verification, account collection, \n" -" and gateway account verification, all tasks are executed through this unified entry" -msgstr "帳號自動化任務統一執行入口,當系統執行帳號推送,更改密碼,驗證帳號,收集帳號,驗證網關帳號任務時,統一透過當前任務執行" +"Unified execution entry for account automation tasks: when the system " +"performs tasks \n" +" such as account push, password change, account verification, account " +"collection, \n" +" and gateway account verification, all tasks are executed through " +"this unified entry" +msgstr "" +"帳號自動化任務統一執行入口,當系統執行帳號推送,更改密碼,驗證帳號,收集帳" +"號,驗證網關帳號任務時,統一透過當前任務執行" #: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72 msgid "Execute automation record" @@ -1139,8 +1168,7 @@ msgstr "自動化執行記錄" #: accounts/tasks/automation.py:67 msgid "When manually executing password change records, this task is used" -msgstr "" -"當手動執行改密記錄時,透過該任務執行" +msgstr "當手動執行改密記錄時,透過該任務執行" #: accounts/tasks/automation.py:96 msgid "Clean change secret and push record period" @@ -1148,16 +1176,27 @@ msgstr "週期清理改密記錄和推送記錄" #: accounts/tasks/automation.py:98 msgid "" -"The system will periodically clean up unnecessary password change and push records, \n" -" including their associated change tasks, execution logs, assets, and accounts. When any \n" -" of these associated items are deleted, the corresponding password change and push records \n" -" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" -" clean up expired records at 2 a.m daily, based on the interval specified by \n" -" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" -" mechanism helps free up storage space and enhances the security and overall performance \n" +"The system will periodically clean up unnecessary password change and push " +"records, \n" +" including their associated change tasks, execution logs, assets, and " +"accounts. When any \n" +" of these associated items are deleted, the corresponding password " +"change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient " +"database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval " +"specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " +"This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and " +"overall performance \n" " of data management" msgstr "" -"系統會定期清理不再需要的改密記錄和推送記錄,包括那些關聯的改密任務、執行記錄、資產和帳號。當這些關聯項中的任意一個被刪除時,對應的改密和推送記錄將變為無效。因此,為了保持資料庫的整潔和高效運行,根據系統配置文件 config.txt 中 PERM_EXPIRED_CHECK_PERIODIC 的時間間隔對於超出時間的於每天凌晨2點進行清理。這種定期清理機制不僅有助於釋放存儲空間,還能提高數據管理的安全和整體性能" +"系統會定期清理不再需要的改密記錄和推送記錄,包括那些關聯的改密任務、執行記" +"錄、資產和帳號。當這些關聯項中的任意一個被刪除時,對應的改密和推送記錄將變為" +"無效。因此,為了保持資料庫的整潔和高效運行,根據系統配置文件 config.txt 中 " +"PERM_EXPIRED_CHECK_PERIODIC 的時間間隔對於超出時間的於每天凌晨2點進行清理。這" +"種定期清理機制不僅有助於釋放存儲空間,還能提高數據管理的安全和整體性能" #: accounts/tasks/backup_account.py:26 msgid "Execute account backup plan" @@ -1165,8 +1204,7 @@ msgstr "執行帳號備份計劃" #: accounts/tasks/backup_account.py:29 msgid "When performing scheduled or manual account backups, this task is used" -msgstr "" -"定時或手動執行帳號備份時,透過該任務執行" +msgstr "定時或手動執行帳號備份時,透過該任務執行" #: accounts/tasks/gather_accounts.py:32 assets/tasks/automation.py:27 #: orgs/tasks.py:11 terminal/tasks.py:33 @@ -1185,15 +1223,14 @@ msgstr "推送帳號到資產" msgid "" "When creating or modifying an account requires account push, this task is " "executed" -msgstr "" -"當創建帳號,修改帳號時,需要帳號推送時執行該任務" +msgstr "當創建帳號,修改帳號時,需要帳號推送時執行該任務" #: accounts/tasks/remove_account.py:28 msgid "" -"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " +"accounts' this \n" " task will be executed" -msgstr "" -"當在控制台-自動化-帳號收集-收集的帳號-點擊同步刪除會執行該任務" +msgstr "當在控制台-自動化-帳號收集-收集的帳號-點擊同步刪除會執行該任務" #: accounts/tasks/remove_account.py:50 msgid "Clean historical accounts" @@ -1201,12 +1238,16 @@ msgstr "清理歷史帳號" #: accounts/tasks/remove_account.py:52 msgid "" -"Each time an asset account is updated, a historical account is generated, so it is \n" -" necessary to clean up the asset account history. The system will clean up excess account \n" -" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" +"Each time an asset account is updated, a historical account is generated, so " +"it is \n" +" necessary to clean up the asset account history. The system will " +"clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System " +"settings - Features - \n" " Account storage - Record limit" msgstr "" -"由於每次更新資產帳號,都會產生歷史帳號,所以需要清理資產帳號的歷史。系統會根據帳號儲存-記錄限制的配置,每天凌晨2點對於超出的數量的帳號記錄進行清理" +"由於每次更新資產帳號,都會產生歷史帳號,所以需要清理資產帳號的歷史。系統會根" +"據帳號儲存-記錄限制的配置,每天凌晨2點對於超出的數量的帳號記錄進行清理" #: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." @@ -1218,10 +1259,10 @@ msgstr "同步資訊到關聯的帳號" #: accounts/tasks/template.py:14 msgid "" -"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" +"When clicking 'Sync new secret to accounts' in 'Console - Account - " +"Templates - \n" " Accounts' this task will be executed" -msgstr "" -"當在控制台-帳號模板-帳號-同步更新帳號信息點擊同步時,執行該任務" +msgstr "當在控制台-帳號模板-帳號-同步更新帳號信息點擊同步時,執行該任務" #: accounts/tasks/vault.py:32 msgid "Sync secret to vault" @@ -1231,21 +1272,19 @@ msgstr "同步密文到 vault" msgid "" "When clicking 'Sync' in 'System Settings - Features - Account Storage' this " "task will be executed" -msgstr "" -"在系統設定-功能設定-帳號儲存點擊同步時,執行該任務" +msgstr "在系統設定-功能設定-帳號儲存點擊同步時,執行該任務" -#: accounts/tasks/verify_account.py:50 +#: accounts/tasks/verify_account.py:49 msgid "Verify asset account availability" msgstr "驗證資產帳號可用性" -#: accounts/tasks/verify_account.py:53 +#: accounts/tasks/verify_account.py:52 msgid "" "When clicking 'Test' in 'Console - Asset details - Accounts' this task will " "be executed" -msgstr "" -"當在控制台-資產詳情-帳號點擊測試執行該任務" +msgstr "當在控制台-資產詳情-帳號點擊測試執行該任務" -#: accounts/tasks/verify_account.py:59 +#: accounts/tasks/verify_account.py:58 msgid "Verify accounts connectivity" msgstr "測試帳號可連接性" @@ -1278,8 +1317,8 @@ msgstr "你好! 以下是資產改密或推送帳戶失敗的情況。 請及 #: accounts/utils.py:52 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not" -" allowed." +"If the password starts with {{` and ends with }} `, then the password is not " +"allowed." msgstr "如果密碼以 `{{` 開始,並且以 `}}` 結束,則該密碼是不允許的。" #: accounts/utils.py:59 @@ -1330,7 +1369,7 @@ msgstr "優先度可選範圍為 1-100 (數值越小越優先)" msgid "Reviewers" msgstr "審批人" -#: acls/models/base.py:43 assets/models/asset/common.py:171 +#: acls/models/base.py:43 assets/models/asset/common.py:178 #: authentication/models/access_key.py:25 #: authentication/models/connection_token.py:53 #: authentication/models/ssh_key.py:13 @@ -1450,8 +1489,8 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " -"2001:db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" +"db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1479,14 +1518,14 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " -"2001:db8:2de::e13, 2001:db8:1a:1110::/64" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" +"db8:2de::e13, 2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:149 xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1519,7 +1558,9 @@ msgid "" "Please review the login activity to ensure the security and proper usage of " "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." -msgstr "請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任何可疑行為,請立即採取必要的行動。" +msgstr "" +"請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任" +"何可疑行為,請立即採取必要的行動。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -1546,11 +1587,11 @@ msgstr "登錄城市" msgid "User agent" msgstr "用戶代理" -#: assets/api/asset/asset.py:181 +#: assets/api/asset/asset.py:190 msgid "Cannot create asset directly, you should create a host or other" msgstr "不能直接創建資產, 你應該創建主機或其他資產" -#: assets/api/asset/asset.py:185 +#: assets/api/asset/asset.py:194 msgid "The number of assets exceeds the limit of 5000" msgstr "資產數量超過 5000 的限制" @@ -1655,7 +1696,7 @@ msgid "Gather facts" msgstr "收集資產資訊" #: assets/const/base.py:32 audits/const.py:58 -#: terminal/serializers/applet_host.py:34 users/models/user/_auth.py:32 +#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32 msgid "Disabled" msgstr "禁用" @@ -1746,8 +1787,8 @@ msgstr "舊的 SSH 版本,例如 openssh 5.x 或 6.x" #: assets/const/protocol.py:53 msgid "Netcat help text" msgstr "" -"使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支援 SSH 原生代理選項 (-W) " -"的環境,或需要更多靈活性和逾時控制的場景。" +"使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支" +"援 SSH 原生代理選項 (-W) 的環境,或需要更多靈活性和逾時控制的場景。" #: assets/const/protocol.py:64 msgid "SFTP root" @@ -1760,7 +1801,8 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶的主目錄
-${USER}用戶的使用者名稱" +"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶" +"的主目錄
-${USER}用戶的使用者名稱" #: assets/const/protocol.py:81 msgid "Console" @@ -1781,17 +1823,18 @@ msgstr "安全" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the" -" security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the " +"security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 " -"Windows 伺服器或需要標準 Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP " -"認證和加密
NLA
此模式使用 TLS 加密,並要求提前提供用戶名和密碼
" +"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式" +"
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 Windows 伺服器或需要標準 " +"Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP 認證和加密
NLA
此" +"模式使用 TLS 加密,並要求提前提供用戶名和密碼
" #: assets/const/protocol.py:106 msgid "AD domain" @@ -1867,7 +1910,8 @@ msgstr "安全模式" msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" +msgstr "" +"當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" #: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -1906,51 +1950,51 @@ msgstr "暫時不支持此功能" msgid "Cloud" msgstr "雲服務" -#: assets/models/asset/common.py:94 assets/models/platform.py:16 +#: assets/models/asset/common.py:101 assets/models/platform.py:16 #: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77 #: settings/serializers/msg.py:31 terminal/serializers/storage.py:133 #: xpack/plugins/cloud/serializers/account_attrs.py:73 msgid "Port" msgstr "埠" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "地址" -#: assets/models/asset/common.py:162 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:149 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 msgid "Platform" msgstr "系統平台" -#: assets/models/asset/common.py:166 assets/models/domain.py:22 +#: assets/models/asset/common.py:173 assets/models/domain.py:22 msgid "Zone" msgstr "網域" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:408 +#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:408 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集資產硬體資訊" -#: assets/models/asset/common.py:173 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "自訂屬性" -#: assets/models/asset/common.py:358 +#: assets/models/asset/common.py:365 msgid "Can refresh asset hardware info" msgstr "可以更新資產硬體資訊" -#: assets/models/asset/common.py:359 +#: assets/models/asset/common.py:366 msgid "Can test asset connectivity" msgstr "可以測試資產連接性" -#: assets/models/asset/common.py:360 +#: assets/models/asset/common.py:367 msgid "Can match asset" msgstr "可以匹配資產" -#: assets/models/asset/common.py:361 +#: assets/models/asset/common.py:368 msgid "Can change asset nodes" msgstr "可以修改資產節點" @@ -2089,7 +2133,7 @@ msgstr "值" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 -#: assets/serializers/platform.py:154 +#: assets/serializers/platform.py:158 #: authentication/serializers/connect_token_secret.py:124 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 @@ -2140,7 +2184,7 @@ msgstr "主要的" msgid "Required" msgstr "必須的" -#: assets/models/platform.py:19 assets/serializers/platform.py:156 +#: assets/models/platform.py:19 assets/serializers/platform.py:160 #: terminal/models/component/storage.py:28 #: xpack/plugins/cloud/providers/nutanix.py:30 msgid "Default" @@ -2158,7 +2202,7 @@ msgstr "設置" #: assets/models/platform.py:38 audits/const.py:59 #: authentication/backends/passkey/models.py:11 settings/models.py:39 -#: terminal/serializers/applet_host.py:35 users/models/user/_auth.py:33 +#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33 msgid "Enabled" msgstr "啟用" @@ -2248,23 +2292,23 @@ msgstr "元數據" msgid "Internal" msgstr "內建" -#: assets/models/platform.py:102 assets/serializers/platform.py:166 +#: assets/models/platform.py:102 assets/serializers/platform.py:170 msgid "Charset" msgstr "編碼" -#: assets/models/platform.py:104 assets/serializers/platform.py:204 +#: assets/models/platform.py:104 assets/serializers/platform.py:208 msgid "Gateway enabled" msgstr "啟用網域" -#: assets/models/platform.py:106 assets/serializers/platform.py:197 +#: assets/models/platform.py:106 assets/serializers/platform.py:201 msgid "Su enabled" msgstr "啟用帳號切換" -#: assets/models/platform.py:107 assets/serializers/platform.py:172 +#: assets/models/platform.py:107 assets/serializers/platform.py:176 msgid "Su method" msgstr "帳號切換方式" -#: assets/models/platform.py:108 assets/serializers/platform.py:175 +#: assets/models/platform.py:108 assets/serializers/platform.py:179 msgid "Custom fields" msgstr "自訂屬性" @@ -2279,7 +2323,7 @@ msgid "" "type" msgstr "資產中批次更新平台,不符合平台類型跳過的資產" -#: assets/serializers/asset/common.py:36 +#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:152 msgid "Protocols, format is [\"protocol/port\"]" msgstr "協定,格式為 [\"協定/連接埠\"]" @@ -2291,7 +2335,9 @@ msgstr "協定,格式為 名稱/連接埠" msgid "" "Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " "\"secret_type\": \"password\"}]" -msgstr "帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"password\"}]" +msgstr "" +"帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" #: assets/serializers/asset/common.py:135 msgid "" @@ -2299,7 +2345,7 @@ msgid "" "it" msgstr "節點路徑,格式為 [\"/組織/節點名稱\"], 如果節點不存在,將創建它" -#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:173 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 @@ -2341,21 +2387,25 @@ msgstr "默認資料庫" #: assets/serializers/asset/database.py:23 msgid "CA cert help text" msgstr "" -"Common Name (CN) 字段已被棄用,請根據 RFC 5280 使用 Subject Alternative Name (SAN) " -"字段來驗證網域名,以提高安全性。" +"Common Name (CN) 字段已被棄用,請根據 RFC 5280 使用 Subject Alternative Name " +"(SAN) 字段來驗證網域名,以提高安全性。" #: assets/serializers/asset/database.py:24 msgid "Postgresql ssl model help text" msgstr "" -"Prefer:我不在乎是否加密,但如果伺服器支持加密,我願意支付加密的費用。Require:我希望我的資料被加密,我可以承擔那個費用。我相信網路將確保我始終連接到我想要的伺服器。Verify" -" CA:我希望我的資料被加密,我可以承擔那個費用。我想要確認我連接到我信任的伺服器。Verify " -"Full:我希望我的資料被加密,我接受負擔。我想確保我連接到我信任的伺服器,並且它是我指定的伺服器。" +"Prefer:我不在乎是否加密,但如果伺服器支持加密,我願意支付加密的費用。" +"Require:我希望我的資料被加密,我可以承擔那個費用。我相信網路將確保我始終連接" +"到我想要的伺服器。Verify CA:我希望我的資料被加密,我可以承擔那個費用。我想要" +"確認我連接到我信任的伺服器。Verify Full:我希望我的資料被加密,我接受負擔。我" +"想確保我連接到我信任的伺服器,並且它是我指定的伺服器。" #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an" -" HTTP proxy. e.g. http(s)://host:port" -msgstr "如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an " +"HTTP proxy. e.g. http(s)://host:port" +msgstr "" +"如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://" +"host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2429,7 +2479,7 @@ msgid "" "the zone, the connection is routed through the gateway." msgstr "網關是網域的網路代理,當連接網域內的資產時,連接將由網關進行路由。" -#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 +#: assets/serializers/domain.py:24 assets/serializers/platform.py:181 #: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "資產數量" @@ -2514,38 +2564,40 @@ msgstr "該協議是預設的,添加資產時,將默認顯示" msgid "This protocol is public, asset will show this protocol to user" msgstr "該協議是公開的,資產將向用戶顯示該協議並可以連接使用" -#: assets/serializers/platform.py:157 +#: assets/serializers/platform.py:161 msgid "Help text" msgstr "幫助" -#: assets/serializers/platform.py:158 +#: assets/serializers/platform.py:162 msgid "Choices" msgstr "選擇" -#: assets/serializers/platform.py:170 +#: assets/serializers/platform.py:174 msgid "Automation" msgstr "自動化" -#: assets/serializers/platform.py:199 +#: assets/serializers/platform.py:203 msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " "root" -msgstr "在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切換到 root 一樣" +msgstr "" +"在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切" +"換到 root 一樣" -#: assets/serializers/platform.py:205 +#: assets/serializers/platform.py:209 msgid "Assets can be connected using a zone gateway" msgstr "資產可以使用區域網關進行連接" -#: assets/serializers/platform.py:207 +#: assets/serializers/platform.py:211 msgid "Default Domain" msgstr "默認網域" -#: assets/serializers/platform.py:229 +#: assets/serializers/platform.py:233 msgid "type is required" msgstr "類型 該欄位是必填項。" -#: assets/serializers/platform.py:244 +#: assets/serializers/platform.py:248 msgid "Protocols is required" msgstr "協議是必填的" @@ -2567,10 +2619,10 @@ msgstr "收集資產資訊" #: assets/tasks/gather_facts.py:25 msgid "" -"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " +"this task \n" " will be executed" -msgstr "" -"當在控制台資產詳情-基本設定點擊更新硬體資訊執行該任務" +msgstr "當在控制台資產詳情-基本設定點擊更新硬體資訊執行該任務" #: assets/tasks/gather_facts.py:44 msgid "Update assets hardware info: " @@ -2586,16 +2638,18 @@ msgstr "檢查節點下資產數量" #: assets/tasks/nodes_amount.py:18 msgid "" -"Manually verifying asset quantities updates the asset count for nodes under the \n" -" current organization. This task will be called in the following two cases: when updating \n" +"Manually verifying asset quantities updates the asset count for nodes under " +"the \n" +" current organization. This task will be called in the following two " +"cases: when updating \n" " nodes and when the number of nodes exceeds 100" msgstr "" -"手動校對資產數量更新當前組織下的節點資產數量;更新節點,當節點數大於100這兩種情況會呼叫該任務" +"手動校對資產數量更新當前組織下的節點資產數量;更新節點,當節點數大於100這兩種" +"情況會呼叫該任務" #: assets/tasks/nodes_amount.py:34 msgid "" -"The task of self-checking is already running and cannot be started " -"repeatedly" +"The task of self-checking is already running and cannot be started repeatedly" msgstr "自檢程序已經在運行,不能重複啟動" #: assets/tasks/nodes_amount.py:40 @@ -2604,7 +2658,8 @@ msgstr "週期性檢查節點下資產數量" #: assets/tasks/nodes_amount.py:42 msgid "" -"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" +"Schedule the check_node_assets_amount_task to periodically update the asset " +"count of \n" " all nodes under all organizations" msgstr "" "定時調用check_node_assets_amount_task任務,更新所有組織下所有節點的資產數量" @@ -2617,8 +2672,7 @@ msgstr "測試資產可連接性" msgid "" "When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' " "this task will be executed" -msgstr "" -"當資產詳情-基本設定點擊測試資產可連結性 執行該任務" +msgstr "當資產詳情-基本設定點擊測試資產可連結性 執行該任務" #: assets/tasks/ping.py:46 msgid "Test if the assets under the node are connectable " @@ -2631,10 +2685,9 @@ msgstr "測試網關可連接性" #: assets/tasks/ping_gateway.py:23 msgid "" -"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" -" be executed" -msgstr "" -"當在網域詳情-網關-測試連線時執行該任務" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " +"be executed" +msgstr "當在網域詳情-網關-測試連線時執行該任務" #: assets/tasks/utils.py:16 msgid "Asset has been disabled, skipped: {}" @@ -2657,8 +2710,7 @@ msgid "App Audits" msgstr "日志审计" #: audits/backends/db.py:17 -msgid "" -"The text content is too long. Use Elasticsearch to store operation logs" +msgid "The text content is too long. Use Elasticsearch to store operation logs" msgstr "文字內容太長。請使用 Elasticsearch 儲存操作日誌" #: audits/backends/db.py:108 @@ -2693,7 +2745,7 @@ msgstr "建立軟連結" #: audits/const.py:18 audits/const.py:28 #: ops/templates/ops/celery_task_log.html:86 -#: terminal/api/session/session.py:149 +#: terminal/api/session/session.py:153 msgid "Download" msgstr "下載" @@ -2701,7 +2753,7 @@ msgstr "下載" msgid "Rename dir" msgstr "映射目錄" -#: audits/const.py:23 rbac/tree.py:266 terminal/api/session/session.py:274 +#: audits/const.py:23 rbac/tree.py:266 terminal/api/session/session.py:281 #: terminal/templates/terminal/_msg_command_warning.html:18 #: terminal/templates/terminal/_msg_session_sharing.html:10 #: xpack/plugins/cloud/manager.py:84 @@ -2751,8 +2803,8 @@ msgstr "結束" #: audits/const.py:46 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174 -#: terminal/models/virtualapp/provider.py:14 -#: terminal/serializers/session.py:55 terminal/serializers/session.py:78 +#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55 +#: terminal/serializers/session.py:79 msgid "Terminal" msgstr "終端" @@ -2791,8 +2843,7 @@ msgid "Job audit log" msgstr "作業審計日誌" #: audits/models.py:56 audits/models.py:100 audits/models.py:175 -#: terminal/models/session/session.py:39 -#: terminal/models/session/sharing.py:113 +#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:113 msgid "Remote addr" msgstr "遠端地址" @@ -3005,13 +3056,17 @@ msgstr "清理資產審計會話任務日誌" #: audits/tasks.py:134 msgid "" -"Since the system generates login logs, operation logs, file upload logs, activity \n" -" logs, Celery execution logs, session recordings, command records, and password change \n" -" logs, it will perform cleanup of records that exceed the time limit according to the \n" +"Since the system generates login logs, operation logs, file upload logs, " +"activity \n" +" logs, Celery execution logs, session recordings, command records, " +"and password change \n" +" logs, it will perform cleanup of records that exceed the time limit " +"according to the \n" " 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" msgstr "" -"由於系統會產生登錄日誌,操作日誌,文件上傳日誌,活動日誌,celery執行日誌,會話錄製和命令記錄,改密日誌,所以系統會根據系統設置-任務列表-" -"定期清理配置,對於超出時間的於每天凌晨2點進行清理" +"由於系統會產生登錄日誌,操作日誌,文件上傳日誌,活動日誌,celery執行日誌,會" +"話錄製和命令記錄,改密日誌,所以系統會根據系統設置-任務列表-定期清理配置,對" +"於超出時間的於每天凌晨2點進行清理" #: audits/tasks.py:154 msgid "Upload FTP file to external storage" @@ -3019,7 +3074,8 @@ msgstr "上傳 FTP 文件到外部儲存" #: audits/tasks.py:156 msgid "" -"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " +"management will be \n" " synchronized to external storage" msgstr "" "如果設置了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部儲存" @@ -3065,7 +3121,7 @@ msgstr "ACL 動作是覆核" msgid "Current user not support mfa type: {}" msgstr "當前用戶不支持 MFA 類型: {}" -#: authentication/api/password.py:33 terminal/api/session/session.py:322 +#: authentication/api/password.py:33 terminal/api/session/session.py:334 #: users/views/profile/reset.py:63 msgid "User does not exist: {}" msgstr "用戶不存在: {}" @@ -3141,8 +3197,7 @@ msgstr "附加" #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:26 -#: authentication/models/private_token.py:8 -#: authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後使用日期" @@ -3217,7 +3272,8 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳號將被臨時 鎖定 {block_time} 分鐘)" +"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳" +"號將被臨時 鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" @@ -3234,9 +3290,10 @@ msgstr "IP 已被鎖定 (請聯絡管理員解鎖或 {} 分鐘後重試)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily" -" locked for {block_time} minutes)" -msgstr "{error},您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" +"{error}, You can also try {times_try} times (The account will be temporarily " +"locked for {block_time} minutes)" +msgstr "" +"{error},您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3313,15 +3370,15 @@ msgstr "您的密碼無效" msgid "Please wait for %s seconds before retry" msgstr "請在 %s 秒後重試" -#: authentication/errors/redirect.py:85 authentication/mixins.py:323 +#: authentication/errors/redirect.py:85 authentication/mixins.py:326 msgid "Your password is too simple, please change it for security" msgstr "你的密碼過於簡單,為了安全,請修改" -#: authentication/errors/redirect.py:93 authentication/mixins.py:330 +#: authentication/errors/redirect.py:93 authentication/mixins.py:335 msgid "You should to change your password before login" msgstr "登錄完成前,請先修改密碼" -#: authentication/errors/redirect.py:101 authentication/mixins.py:337 +#: authentication/errors/redirect.py:101 authentication/mixins.py:344 msgid "Your password has expired, please reset before logging in" msgstr "您的密碼已過期,先修改再登錄" @@ -3437,7 +3494,7 @@ msgstr "管理員已開啟'僅允許從用戶來源登錄',當前用戶來源 msgid "The MFA type ({}) is not enabled" msgstr "該 MFA ({}) 方式沒有啟用" -#: authentication/mixins.py:313 +#: authentication/mixins.py:314 msgid "Please change your password" msgstr "請修改密碼" @@ -3644,8 +3701,8 @@ msgstr "創建類型" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be" -" downloaded once" +"Please download the private key after creation. Each private key can only be " +"downloaded once" msgstr "創建完成後請下載私鑰,每個私鑰僅有一次下載機會" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:161 @@ -3669,10 +3726,9 @@ msgstr "清除過期會話" #: authentication/tasks.py:15 msgid "" -"Since user logins create sessions, the system will clean up expired sessions" -" every 24 hours" -msgstr "" -"由於用戶登錄系統會產生會話,系統會每24小時清理已經過期的會話" +"Since user logins create sessions, the system will clean up expired sessions " +"every 24 hours" +msgstr "由於用戶登錄系統會產生會話,系統會每24小時清理已經過期的會話" #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" @@ -4010,9 +4066,10 @@ msgstr "退出登錄成功,返回到登入頁面" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client." -" If you need to open it in the client, please log in again" -msgstr "為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" +"For your safety, automatic redirection login is not supported on the client. " +"If you need to open it in the client, please log in again" +msgstr "" +"為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" #: authentication/views/slack.py:35 authentication/views/slack.py:118 msgid "Slack Error" @@ -4118,12 +4175,13 @@ msgstr "加密的欄位" #: common/db/fields.py:577 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" -" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " +"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 {'type': " -"'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': '1.1.1.1'}}" +"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 " +"{'type': 'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': " +"'1.1.1.1'}}" #: common/db/fields.py:584 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4185,68 +4243,70 @@ msgstr "解析文件錯誤: {}" msgid "Invalid excel file" msgstr "無效的 excel 文件" -#: common/drf/renders/base.py:137 +#: common/drf/renders/base.py:138 msgid "Yes/No" msgstr "" -#: common/drf/renders/base.py:140 +#: common/drf/renders/base.py:141 msgid "Text, max length {}" msgstr "文字,最大長度 {}" -#: common/drf/renders/base.py:142 +#: common/drf/renders/base.py:143 msgid "Long text, no length limit" msgstr "長文字,無長度限制" -#: common/drf/renders/base.py:144 +#: common/drf/renders/base.py:145 msgid "Number, min {} max {}" msgstr "數字,最小 {} 最大 {}" -#: common/drf/renders/base.py:147 +#: common/drf/renders/base.py:148 msgid "Datetime format {}" msgstr "日期時間格式 {}" -#: common/drf/renders/base.py:153 +#: common/drf/renders/base.py:154 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" msgstr "選項,格式: 名稱(值),名稱是可選的,方便閱讀,值是必填的,可選項有 {}" -#: common/drf/renders/base.py:156 +#: common/drf/renders/base.py:157 msgid "Choices, options {}" msgstr "選項,可選項有 {}" -#: common/drf/renders/base.py:158 +#: common/drf/renders/base.py:159 msgid "Phone number, format +8612345678901" msgstr "手機號碼,格式 +8612345678901" -#: common/drf/renders/base.py:160 +#: common/drf/renders/base.py:161 msgid "Label, format [\"key:value\"]" msgstr "標籤,格式: [\"鍵:值\"]" -#: common/drf/renders/base.py:162 +#: common/drf/renders/base.py:163 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "關聯項,格式: 名稱(id), 名稱是可選的,方便閱讀,id 是必填的" -#: common/drf/renders/base.py:164 +#: common/drf/renders/base.py:165 msgid "Object, format id" msgstr "關聯項,格式是 id" -#: common/drf/renders/base.py:168 +#: common/drf/renders/base.py:169 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" -msgstr "多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的" +msgstr "" +"多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的" -#: common/drf/renders/base.py:170 -msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" +#: common/drf/renders/base.py:171 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "標籤,格式: [\"鍵:值\", ...], 如果標籤不存在,將創建它" -#: common/drf/renders/base.py:172 +#: common/drf/renders/base.py:173 msgid "Objects, format [\"id\", ...]" msgstr "多關聯項,格式是 [\"id\", ...]" -#: common/drf/renders/base.py:270 +#: common/drf/renders/base.py:271 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4411,8 +4471,7 @@ msgstr "發件郵件" #: common/tasks.py:35 msgid "This task will be executed when sending email notifications" -msgstr "" -"發送郵件訊息時執行該任務" +msgstr "發送郵件訊息時執行該任務" #: common/tasks.py:65 msgid "Send email attachment" @@ -4420,10 +4479,11 @@ msgstr "發送郵件附件" #: common/tasks.py:68 msgid "" -"When an account password is changed or an account backup generates attachments, \n" -" this task needs to be executed for sending emails and handling attachments" -msgstr "" -"當帳號改密,帳號備份產生附件,需要對發送郵件及附件,執行該任務" +"When an account password is changed or an account backup generates " +"attachments, \n" +" this task needs to be executed for sending emails and handling " +"attachments" +msgstr "當帳號改密,帳號備份產生附件,需要對發送郵件及附件,執行該任務" #: common/tasks.py:94 msgid "Upload account backup to external storage" @@ -4433,8 +4493,7 @@ msgstr "上傳會話錄影到外部儲存" msgid "" "When performing an account backup, this task needs to be executed to " "external storage (SFTP)" -msgstr "" -"當執行帳號備份,需要到外部儲存(sftp),執行該任務" +msgstr "當執行帳號備份,需要到外部儲存(sftp),執行該任務" #: common/utils/ip/geoip/utils.py:26 msgid "Invalid ip" @@ -4455,10 +4514,10 @@ msgstr "傳簡訊驗證碼" #: common/utils/verify_code.py:19 msgid "" -"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" +"When resetting a password, forgetting a password, or verifying MFA, this " +"task needs to \n" " be executed to send SMS messages" -msgstr "" -"當重設密碼,忘記密碼,驗證mfa時,需要發送短信時執行該任務" +msgstr "當重設密碼,忘記密碼,驗證mfa時,需要發送短信時執行該任務" #: common/validators.py:16 msgid "Special char not allowed" @@ -4499,8 +4558,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Luna是單獨部署的一個程序,你需要部署luna,koko, " -"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Luna是單獨部署的一個程序,你需要部署luna,koko,
如果你看到了" +"這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" @@ -4512,8 +4571,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發, " -"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發,
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: labels/apps.py:8 msgid "App Labels" @@ -4577,10 +4636,10 @@ msgstr "發布站內消息" #: notifications/notifications.py:48 msgid "" -"This task needs to be executed for sending internal messages for system alerts, \n" +"This task needs to be executed for sending internal messages for system " +"alerts, \n" " work orders, and other notifications" -msgstr "" -"系統一些告警,工單等需要發送站內信時執行該任務" +msgstr "系統一些告警,工單等需要發送站內信時執行該任務" #: ops/ansible/inventory.py:116 ops/models/job.py:65 msgid "No account available" @@ -4789,14 +4848,12 @@ msgid "Periodic run" msgstr "週期性執行" #: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116 -#: settings/serializers/auth/ldap.py:80 -#: settings/serializers/auth/ldap_ha.py:62 +#: settings/serializers/auth/ldap.py:80 settings/serializers/auth/ldap_ha.py:62 msgid "Interval" msgstr "間隔" #: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113 -#: settings/serializers/auth/ldap.py:77 -#: settings/serializers/auth/ldap_ha.py:59 +#: settings/serializers/auth/ldap.py:77 settings/serializers/auth/ldap_ha.py:59 msgid "Crontab" msgstr "Crontab" @@ -4829,10 +4886,9 @@ msgstr "模組" msgid "Args" msgstr "參數" -#: ops/models/adhoc.py:26 ops/models/playbook.py:36 -#: ops/serializers/mixin.py:10 rbac/models/role.py:31 -#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 -#: settings/serializers/auth/oauth2.py:37 +#: ops/models/adhoc.py:26 ops/models/playbook.py:36 ops/serializers/mixin.py:10 +#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 +#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 msgid "Scope" msgstr "範圍" @@ -5001,8 +5057,7 @@ msgstr "運行 Ansible 任務" msgid "" "Execute scheduled adhoc and playbooks, periodically invoking the task for " "execution" -msgstr "" -"當執行定時的快捷命令,playbook,定時呼叫該任務執行" +msgstr "當執行定時的快捷命令,playbook,定時呼叫該任務執行" #: ops/tasks.py:82 msgid "Run ansible task execution" @@ -5010,8 +5065,7 @@ msgstr "開始執行 Ansible 任務" #: ops/tasks.py:85 msgid "Execute the task when manually adhoc or playbooks" -msgstr "" -"手動執行快捷命令,playbook時執行該任務" +msgstr "手動執行快捷命令,playbook時執行該任務" #: ops/tasks.py:99 msgid "Clear celery periodic tasks" @@ -5019,8 +5073,7 @@ msgstr "清理週期任務" #: ops/tasks.py:101 msgid "At system startup, clean up celery tasks that no longer exist" -msgstr "" -"系統啟動時,清理已經不存在的celery任務" +msgstr "系統啟動時,清理已經不存在的celery任務" #: ops/tasks.py:125 msgid "Create or update periodic tasks" @@ -5028,11 +5081,14 @@ msgstr "創建或更新週期任務" #: ops/tasks.py:127 msgid "" -"With version iterations, new tasks may be added, or task names and execution times may \n" -" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, tasks will be " +"registered or the parameters \n" " of scheduled tasks will be updated" msgstr "" -"隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時,,將會註冊任務或者更新定時任務參數" +"隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動" +"時,,將會註冊任務或者更新定時任務參數" #: ops/tasks.py:140 msgid "Periodic check service performance" @@ -5040,10 +5096,13 @@ msgstr "週期檢測服務性能" #: ops/tasks.py:142 msgid "" -"Check every hour whether each component is offline and whether the CPU, memory, \n" -" and disk usage exceed the thresholds, and send an alert message to the administrator" +"Check every hour whether each component is offline and whether the CPU, " +"memory, \n" +" and disk usage exceed the thresholds, and send an alert message to " +"the administrator" msgstr "" -"每小時檢測各組件是否離線,cpu,內存,硬盤使用率是否超過閾值,向管理員發送訊息預警" +"每小時檢測各組件是否離線,cpu,內存,硬盤使用率是否超過閾值,向管理員發送訊息" +"預警" #: ops/tasks.py:152 msgid "Clean up unexpected jobs" @@ -5051,12 +5110,16 @@ msgstr "清理異常作業" #: ops/tasks.py:154 msgid "" -"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" -" which result in the task status not being updated, the system will clean up abnormal jobs \n" -" that have not been completed for more than 3 hours every hour and mark these tasks as \n" +"Due to exceptions caused by executing adhoc and playbooks in the Job " +"Center, \n" +" which result in the task status not being updated, the system will " +"clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and " +"mark these tasks as \n" " failed" msgstr "" -"由於作業中心執行快捷命令,playbook會產生異常,任務狀態未更新完成,系統將每小時執行清理超3小時未完成的異常作業,並將任務標記失敗" +"由於作業中心執行快捷命令,playbook會產生異常,任務狀態未更新完成,系統將每小" +"時執行清理超3小時未完成的異常作業,並將任務標記失敗" #: ops/tasks.py:167 msgid "Clean job_execution db record" @@ -5064,12 +5127,16 @@ msgstr "清理作業中心執行歷史" #: ops/tasks.py:169 msgid "" -"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" -" be generated. The system will clean up records that exceed the retention period every day \n" -" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" +"Due to the execution of adhoc and playbooks in the Job Center, execution " +"records will \n" +" be generated. The system will clean up records that exceed the " +"retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - " +"Regular clean-up - \n" " Job execution retention days'" msgstr "" -"由於作業中心執行快捷命令,playbook,會產生j執行記錄,系統會根據系統設置-任務列表-定期清理-作業中心執行歷史配置,每天凌晨2點對超出保存時間的記錄進行清理" +"由於作業中心執行快捷命令,playbook,會產生j執行記錄,系統會根據系統設置-任務" +"列表-定期清理-作業中心執行歷史配置,每天凌晨2點對超出保存時間的記錄進行清理" #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" @@ -5138,8 +5205,7 @@ msgstr "請選擇一個組織後再保存" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 -#: tickets/serializers/ticket/ticket.py:60 +#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:60 msgid "Organization" msgstr "組織" @@ -5302,7 +5368,9 @@ msgstr "組織 ({}) 的資產授權" msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" -msgstr "帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, @USER, @ANON, @INPUT" +msgstr "" +"帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, " +"@USER, @ANON, @INPUT" #: perms/serializers/permission.py:38 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -5322,13 +5390,18 @@ msgstr "校驗資產授權規則已過期" #: perms/tasks.py:30 msgid "" -"The cache of organizational collections, which have completed user authorization tree \n" -" construction, will expire. Therefore, expired collections need to be cleared from the \n" -" cache, and this task will be executed periodically based on the time interval specified \n" -" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" +"The cache of organizational collections, which have completed user " +"authorization tree \n" +" construction, will expire. Therefore, expired collections need to be " +"cleared from the \n" +" cache, and this task will be executed periodically based on the time " +"interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " +"config.txt" msgstr "" -"使用者授權樹已經建製完成的組織集合快取會過期,因此需要將過期的集合從快取中清理掉,根據系統設定檔 config.txt 中的 " -"PERM_EXPIRED_CHECK_PERIODIC 的時間間隔定時執行該Action" +"使用者授權樹已經建製完成的組織集合快取會過期,因此需要將過期的集合從快取中清" +"理掉,根據系統設定檔 config.txt 中的 PERM_EXPIRED_CHECK_PERIODIC 的時間間隔定" +"時執行該Action" #: perms/tasks.py:49 msgid "Send asset permission expired notification" @@ -5336,12 +5409,16 @@ msgstr "發送資產權限過期通知" #: perms/tasks.py:51 msgid "" -"Check every day at 10 a.m. and send a notification message to users associated with \n" -" assets whose authorization is about to expire, as well as to the organization's \n" -" administrators, 3 days in advance, to remind them that the asset authorization will \n" +"Check every day at 10 a.m. and send a notification message to users " +"associated with \n" +" assets whose authorization is about to expire, as well as to the " +"organization's \n" +" administrators, 3 days in advance, to remind them that the asset " +"authorization will \n" " expire in a few days" msgstr "" -"每天早上10點檢查,對於即將過期的資產授權相關聯的使用者及該組織管理員提前三天發送訊息通知,提示資產還有幾天即將過期" +"每天早上10點檢查,對於即將過期的資產授權相關聯的使用者及該組織管理員提前三天" +"發送訊息通知,提示資產還有幾天即將過期" #: perms/templates/perms/_msg_item_permissions_expire.html:7 #: perms/templates/perms/_msg_permed_items_expire.html:7 @@ -5747,7 +5824,9 @@ msgid "" "authentication service platform does not return the user's email " "information, the system will automatically create the user using this email " "suffix" -msgstr "第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系統將自動以此電子信箱後綴建立使用者" +msgstr "" +"第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系" +"統將自動以此電子信箱後綴建立使用者" #: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" @@ -5766,21 +5845,23 @@ msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前是否顯示 Flash 頁面" +msgstr "" +"Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前" +"是否顯示 Flash 頁面" #: settings/serializers/auth/base.py:55 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" +msgstr "" +"建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 -#: settings/serializers/auth/ldap_ha.py:26 -#: settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:26 settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "服務端地址" @@ -5805,11 +5886,9 @@ msgstr "使用者名稱屬性" msgid "Enable attributes map" msgstr "啟用屬性映射" -#: settings/serializers/auth/cas.py:34 -#: settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:66 -#: settings/serializers/auth/ldap_ha.py:48 +#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/ldap_ha.py:48 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -5820,7 +5899,9 @@ msgstr "映射屬性" msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer " +"使用者屬性名稱" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -5840,13 +5921,17 @@ msgstr "啟用釘釘認證" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使" +"用者屬性名稱" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使" +"用者屬性名稱" #: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22 msgid "Lark" @@ -5856,7 +5941,9 @@ msgstr "" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務" +"使用者屬性名稱" #: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 msgid "LDAP" @@ -5866,58 +5953,50 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "LDAP 服務域名" -#: settings/serializers/auth/ldap.py:48 -#: settings/serializers/auth/ldap_ha.py:30 +#: settings/serializers/auth/ldap.py:48 settings/serializers/auth/ldap_ha.py:30 msgid "Bind DN" msgstr "綁定 DN" -#: settings/serializers/auth/ldap.py:49 -#: settings/serializers/auth/ldap_ha.py:31 +#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:31 msgid "Binding Distinguished Name" msgstr "綁定的 DN" -#: settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:35 +#: settings/serializers/auth/ldap.py:53 settings/serializers/auth/ldap_ha.py:35 msgid "Binding password" msgstr "原來的密碼" -#: settings/serializers/auth/ldap.py:56 -#: settings/serializers/auth/ldap_ha.py:38 +#: settings/serializers/auth/ldap.py:56 settings/serializers/auth/ldap_ha.py:38 msgid "Search OU" msgstr "系統架構" -#: settings/serializers/auth/ldap.py:58 -#: settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:58 settings/serializers/auth/ldap_ha.py:40 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "使用者搜尋庫,如果有多個OU,可以用`|`符號分隔" -#: settings/serializers/auth/ldap.py:62 -#: settings/serializers/auth/ldap_ha.py:44 +#: settings/serializers/auth/ldap.py:62 settings/serializers/auth/ldap_ha.py:44 msgid "Search filter" msgstr "用戶過濾器" -#: settings/serializers/auth/ldap.py:63 -#: settings/serializers/auth/ldap_ha.py:45 +#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:45 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "可能的選項是(cn或uid或sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:68 -#: settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:68 settings/serializers/auth/ldap_ha.py:50 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務" +"使用者屬性名稱" -#: settings/serializers/auth/ldap.py:84 -#: settings/serializers/auth/ldap_ha.py:66 +#: settings/serializers/auth/ldap.py:84 settings/serializers/auth/ldap_ha.py:66 msgid "Connect timeout (s)" msgstr "連接超時時間 (秒)" -#: settings/serializers/auth/ldap.py:89 -#: settings/serializers/auth/ldap_ha.py:71 +#: settings/serializers/auth/ldap.py:89 settings/serializers/auth/ldap_ha.py:71 msgid "User DN cache timeout (s)" msgstr "快取逾時時間 (秒)" @@ -5928,10 +6007,10 @@ msgid "" "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存" +"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果" +"用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存" -#: settings/serializers/auth/ldap.py:97 -#: settings/serializers/auth/ldap_ha.py:79 +#: settings/serializers/auth/ldap.py:97 settings/serializers/auth/ldap_ha.py:79 msgid "Search paged size (piece)" msgstr "搜索分頁數量 (條)" @@ -5947,12 +6026,12 @@ msgstr "LDAP HA 服務網域名" #: settings/serializers/auth/ldap_ha.py:73 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If" -" the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If " +"the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" -"對使用者登入驗證時查詢出的 User DN 進行快取,可以有效提升使用者驗證的速度
如果使用者 OU 架構有調整,點擊提交即可清除使用者 DN " -"快取" +"對使用者登入驗證時查詢出的 User DN 進行快取,可以有效提升使用者驗證的速度
" +"如果使用者 OU 架構有調整,點擊提交即可清除使用者 DN 快取" #: settings/serializers/auth/oauth2.py:19 #: settings/serializers/auth/oauth2.py:22 @@ -5999,18 +6078,19 @@ msgid "End session endpoint" msgstr "Logout session endpoint address" #: settings/serializers/auth/oauth2.py:57 -msgid "" -"When the user signs out, they also be logged out from the OAuth2 server" +msgid "When the user signs out, they also be logged out from the OAuth2 server" msgstr "當使用者退出時,他們也會從 OAuth2 伺服器退出" #: settings/serializers/auth/oauth2.py:62 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服" +"務使用者屬性名稱" -#: settings/serializers/auth/oauth2.py:67 -#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 +#: settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "總是更新用戶資訊" @@ -6042,7 +6122,9 @@ msgstr "Ignore SSL certificate verification" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" -msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務使用者屬性名稱" +msgstr "" +"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務" +"使用者屬性名稱" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -6060,7 +6142,8 @@ msgstr "使用 Keycloak" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" +msgstr "" +"使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -6119,7 +6202,8 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" +"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 " +"DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -6135,8 +6219,7 @@ msgid "OTP in RADIUS" msgstr "Use Radius OTP" #: settings/serializers/auth/radius.py:24 -msgid "" -"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" msgstr "* 在 RADIUS 中使用 OTP 意味著使用者可以利用 RADIUS 作為 MFA 的方法 " #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 @@ -6167,7 +6250,9 @@ msgstr "SP 證書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr " 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" +msgstr "" +" 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 " +"JumpServer 使用者屬性名稱" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -6177,7 +6262,9 @@ msgstr "當使用者登出時,他們也會從 SAML2 伺服器登出" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" -msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服務使用者屬性名稱" +msgstr "" +"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服" +"務使用者屬性名稱" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -6242,10 +6329,12 @@ msgstr "業務型態(Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed" -" 67 words. For example, your verification code is {code}, which is valid for" -" 5 minutes. Please do not disclose it to others." -msgstr "模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 {code}, 有效期為5分鐘。請不要洩露給其他人。" +"Template need contain {code} and Signature + template length does not exceed " +"67 words. For example, your verification code is {code}, which is valid for " +"5 minutes. Please do not disclose it to others." +msgstr "" +"模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 " +"{code}, 有效期為5分鐘。請不要洩露給其他人。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -6281,7 +6370,9 @@ msgstr "單位: 秒" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" -msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服務使用者屬性名稱" +msgstr "" +"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服" +"務使用者屬性名稱" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -6289,8 +6380,8 @@ msgstr "目前網站 URL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service" -" and is usually used in links in system emails" +"Site URL is the externally accessible address of the current product service " +"and is usually used in links in system emails" msgstr "站點 URL 是目前產品服務的外部可訪問地址,通常在系統郵件的連結中使用" #: settings/serializers/basic.py:18 @@ -6375,7 +6466,8 @@ msgstr "會話日誌 (天)" msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." -msgstr "會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" +msgstr "" +"會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -6419,7 +6511,8 @@ msgid "" "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" +"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷" +"史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" #: settings/serializers/feature.py:76 settings/serializers/feature.py:82 msgid "Chat AI" @@ -6430,8 +6523,7 @@ msgid "GPT Base URL" msgstr "GPT 地址" #: settings/serializers/feature.py:86 -msgid "" -"The base URL of the GPT service. For example: https://api.openai.com/v1" +msgid "The base URL of the GPT service. For example: https://api.openai.com/v1" msgstr "GPT 服務的基礎 URL。例如:https://api.openai.com/v1" #: settings/serializers/feature.py:89 templates/_header_bar.html:96 @@ -6543,7 +6635,8 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" +"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這" +"種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -6553,7 +6646,9 @@ msgstr "使用 TLS" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 587 上" +msgstr "" +"與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 " +"587 上" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -6561,8 +6656,8 @@ msgstr "主題前綴" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account" -" successfully)" +"Tips: When creating a user, send the subject of the email (eg:Create account " +"successfully)" msgstr "提示: 創建用戶時,發送設置密碼郵件的主題 (例如: 創建用戶成功)" #: settings/serializers/msg.py:73 @@ -6578,7 +6673,8 @@ msgstr "提示: 創建用戶時,發送設置密碼郵件的敬語 (例如: 你 msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" +msgstr "" +"提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -6594,7 +6690,9 @@ msgstr "顯示未分組節點" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" -msgstr "放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問題" +msgstr "" +"放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問" +"題" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -6605,7 +6703,9 @@ msgid "" "If the user does not update the password during the time, the user password " "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" -msgstr "如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過期前5天內由系統 (每天)自動發送給用戶" +msgstr "" +"如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過" +"期前5天內由系統 (每天)自動發送給用戶" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -6675,7 +6775,9 @@ msgid "" "users of other authentication methods except local authentication methods " "are allowed to log in and automatically create users (if the user does not " "exist)" -msgstr "如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" +msgstr "" +"如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方" +"式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -6683,12 +6785,13 @@ msgstr "僅從用戶來源登錄" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging" -" in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging " +"in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" +"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順" +"序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -6757,7 +6860,9 @@ msgstr "啟用登入附加碼" msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密碼+6位數字 完成認證" +msgstr "" +"密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密" +"碼+6位數字 完成認證" #: settings/serializers/security.py:158 msgid "Login captcha" @@ -6773,10 +6878,12 @@ msgstr "異地登入通知" #: settings/serializers/security.py:164 msgid "" -"The system determines whether the login IP address belongs to a common login" -" city. If the account is logged in from a common login city, the system " -"sends a remote login reminder" -msgstr "根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地登錄提醒" +"The system determines whether the login IP address belongs to a common login " +"city. If the account is logged in from a common login city, the system sends " +"a remote login reminder" +msgstr "" +"根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地" +"登錄提醒" #: settings/serializers/security.py:170 msgid "Auto Disable Threshold (day)" @@ -6860,8 +6967,8 @@ msgstr "元件註冊" #: settings/serializers/terminal.py:24 msgid "" -"Allow component register, after all component setup, you should disable this" -" for security" +"Allow component register, after all component setup, you should disable this " +"for security" msgstr "是否允許元件註冊,當所有終端啟動後,為了安全應該關閉" #: settings/serializers/terminal.py:30 @@ -6873,11 +6980,11 @@ msgstr "* 允許用戶透過密碼驗證登入KoKo元件" msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in" -" after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in " +"after being deleted from the AD/LDAP server" msgstr "" -"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)已啟用,則應禁用此選項,以防止用戶從 AD/LDAP " -"伺服器中刪除後再次登入" +"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)" +"已啟用,則應禁用此選項,以防止用戶從 AD/LDAP 伺服器中刪除後再次登入" #: settings/serializers/terminal.py:43 msgid "Asset sorting" @@ -6889,18 +6996,21 @@ msgstr "資產列表每頁數量" #: settings/serializers/terminal.py:51 msgid "" -"* You can individually configure the service address and port in the service" -" endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service " +"endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" -msgstr "* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示 DB 客戶端啟動方法" +msgstr "" +"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" +"產時顯示 DB 客戶端啟動方法" #: settings/serializers/terminal.py:59 msgid "" -"* You can individually configure the service address and port in the service" -" endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service " +"endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" +"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" +"產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" #: settings/serializers/terminal.py:66 msgid "Client connection" @@ -6909,9 +7019,10 @@ msgstr "客戶端連接" #: settings/serializers/terminal.py:68 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to " -"assets" -msgstr "* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界面將顯示 SSH 客戶端啟動方法" +"Luna page will display the SSH client launch method when connecting to assets" +msgstr "" +"* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界" +"面將顯示 SSH 客戶端啟動方法" #: settings/serializers/tool.py:10 msgid "Tool" @@ -6923,8 +7034,8 @@ msgstr "工作台中的工具" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools" -" in the workbench" +"*! If enabled, users with RBAC permissions will be able to utilize all tools " +"in the workbench" msgstr "*! 如果啟用,具有 RBAC 權限的用戶將能夠使用工作台中的所有工具" #: settings/tasks/ldap.py:73 @@ -6935,8 +7046,7 @@ msgstr "週期匯入 LDAP 用戶" msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" -msgstr "" -"設置了LDAP自動同步後,將呼叫該Action進行使用者同步" +msgstr "設置了LDAP自動同步後,將呼叫該Action進行使用者同步" #: settings/tasks/ldap.py:83 msgid "Periodic import ldap ha user" @@ -6948,10 +7058,12 @@ msgstr "註冊週期匯入 LDAP 用戶 任務" #: settings/tasks/ldap.py:119 msgid "" -"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " +"sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" -"設置了LDAP自動同步參數變動時,像是Crontab參數,重新註冊或更新ldap同步Action將呼叫該Action" +"設置了LDAP自動同步參數變動時,像是Crontab參數,重新註冊或更新ldap同步Action將" +"呼叫該Action" #: settings/tasks/ldap.py:133 msgid "Registration periodic import ldap ha user task" @@ -6959,10 +7071,12 @@ msgstr "註冊周期導入 LDAP HA 使用者 Action" #: settings/tasks/ldap.py:135 msgid "" -"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " +"LDAP HA sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" -"設置了LDAP HA自動同步參數變動時,像是Crontab參數,重新註冊或更新ldap ha同步Action將呼叫該Action" +"設置了LDAP HA自動同步參數變動時,像是Crontab參數,重新註冊或更新ldap ha同步" +"Action將呼叫該Action" #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" @@ -7167,11 +7281,13 @@ msgstr "過期。" #, python-format msgid "" "\n" -" Your password has expired, please click this link update password.\n" +" Your password has expired, please click this link update password.\n" " " msgstr "" "\n" -" 您的密碼已經過期,請點擊 連結 更新密碼\n" +" 您的密碼已經過期,請點擊 連結 更新密碼\n" " " #: templates/_message.html:30 @@ -7182,33 +7298,39 @@ msgstr "您的密碼將於" #, python-format msgid "" "\n" -" please click this link to update your password.\n" +" please click this " +"link to update your password.\n" " " msgstr "" "\n" -" 請點擊 連結 更新密碼\n" +" 請點擊 連結 更" +"新密碼\n" " " #: templates/_message.html:43 #, python-format msgid "" "\n" -" Your information was incomplete. Please click this link to complete your information.\n" +" Your information was incomplete. Please click this link to complete your information.\n" " " msgstr "" "\n" -" 你的資訊不完整,請點擊 連結 補充完整\n" +" 你的資訊不完整,請點擊 連結 " +" 補充完整\n" " " #: templates/_message.html:56 #, python-format msgid "" "\n" -" Your ssh public key not set or expired. Please click this link to update\n" +" Your ssh public key not set or expired. Please click this link to update\n" " " msgstr "" "\n" -" 您的SSH金鑰沒有設置或已失效,請點擊 連結 更新\n" +" 您的SSH金鑰沒有設置或已失效,請點擊 連結 更新\n" " " #: templates/_mfa_login_field.html:28 @@ -7239,7 +7361,9 @@ msgstr "用戶端" msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" -msgstr "JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH 用戶端,Telnet 會在未來支持" +msgstr "" +"JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH " +"用戶端,Telnet 會在未來支持" #: templates/resource_download.html:35 msgid "Microsoft" @@ -7303,7 +7427,7 @@ msgstr "命令儲存" msgid "Invalid" msgstr "無效" -#: terminal/api/component/storage.py:132 terminal/tasks.py:187 +#: terminal/api/component/storage.py:132 terminal/tasks.py:208 msgid "Test failure: {}" msgstr "測試失敗: {}" @@ -7324,15 +7448,15 @@ msgstr "有在線會話" msgid "User %s %s session %s replay" msgstr "用戶 %s %s 了會話 %s 的錄影" -#: terminal/api/session/session.py:314 +#: terminal/api/session/session.py:326 msgid "Session does not exist: {}" msgstr "會話不存在: {}" -#: terminal/api/session/session.py:317 +#: terminal/api/session/session.py:329 msgid "Session is finished or the protocol not supported" msgstr "會話已經完成或協議不支持" -#: terminal/api/session/session.py:330 +#: terminal/api/session/session.py:342 msgid "User does not have permission" msgstr "用戶沒有權限" @@ -7496,7 +7620,7 @@ msgstr "版本" msgid "Can concurrent" msgstr "可以並發" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:178 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "主機" @@ -7527,7 +7651,7 @@ msgstr "宿主機" msgid "Applet Publication" msgstr "應用發布" -#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:80 +#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:81 msgid "Deploy options" msgstr "部署參數" @@ -7639,12 +7763,12 @@ msgstr "執行緒數" msgid "Boot Time" msgstr "運行時間" -#: terminal/models/component/storage.py:146 +#: terminal/models/component/storage.py:144 #: terminal/models/component/terminal.py:91 msgid "Command storage" msgstr "命令儲存" -#: terminal/models/component/storage.py:214 +#: terminal/models/component/storage.py:212 #: terminal/models/component/terminal.py:92 msgid "Replay storage" msgstr "錄影儲存" @@ -7685,8 +7809,7 @@ msgstr "可以下載會話錄影" msgid "Account ID" msgstr "帳號" -#: terminal/models/session/session.py:37 -#: terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:37 terminal/models/session/sharing.py:118 msgid "Login from" msgstr "登錄來源" @@ -7694,7 +7817,7 @@ msgstr "登錄來源" msgid "Replay" msgstr "重播" -#: terminal/models/session/session.py:48 terminal/serializers/session.py:77 +#: terminal/models/session/session.py:48 terminal/serializers/session.py:78 msgid "Command amount" msgstr "命令數量" @@ -7702,23 +7825,23 @@ msgstr "命令數量" msgid "Error reason" msgstr "錯誤原因" -#: terminal/models/session/session.py:290 +#: terminal/models/session/session.py:308 msgid "Session record" msgstr "會話記錄" -#: terminal/models/session/session.py:292 +#: terminal/models/session/session.py:310 msgid "Can monitor session" msgstr "可以監控會話" -#: terminal/models/session/session.py:293 +#: terminal/models/session/session.py:311 msgid "Can share session" msgstr "可以分享會話" -#: terminal/models/session/session.py:294 +#: terminal/models/session/session.py:312 msgid "Can terminate session" msgstr "可以終斷會話" -#: terminal/models/session/session.py:295 +#: terminal/models/session/session.py:313 msgid "Can validate session action perm" msgstr "可以驗證會話動作權限" @@ -7735,8 +7858,8 @@ msgstr "操作權限" msgid "Origin" msgstr "來源" -#: terminal/models/session/sharing.py:42 -#: terminal/models/session/sharing.py:100 terminal/notifications.py:261 +#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 +#: terminal/notifications.py:261 msgid "Session sharing" msgstr "會話分享" @@ -7818,7 +7941,7 @@ msgstr "級別" msgid "Command and replay storage" msgstr "命令及錄影儲存" -#: terminal/notifications.py:240 terminal/tasks.py:191 +#: terminal/notifications.py:240 terminal/tasks.py:212 #: xpack/plugins/cloud/api.py:160 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 @@ -7834,121 +7957,132 @@ msgstr "無效的儲存" msgid "Icon" msgstr "圖示" -#: terminal/serializers/applet_host.py:26 +#: terminal/serializers/applet_host.py:24 msgid "Per Device (Device number limit)" msgstr "" -#: terminal/serializers/applet_host.py:27 +#: terminal/serializers/applet_host.py:25 msgid "Per User (User number limit)" msgstr "" -#: terminal/serializers/applet_host.py:39 +#: terminal/serializers/applet_host.py:37 msgid "Core API" msgstr "Core 服務地址" -#: terminal/serializers/applet_host.py:40 +#: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core service. \n" -" If the release machine and the Core service are on the same network segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" +" Tips: The application release machine communicates with the Core " +"service. \n" +" If the release machine and the Core service are on the same network " +"segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in " +"the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段,建議填寫內網地址,否則填寫當前站點 " -"URL
例如:https://172.16.10.110 or https://dev.jumpserver.com" +"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段," +"建議填寫內網地址,否則填寫當前站點 URL
例如:https://172.16.10.110 or " +"https://dev.jumpserver.com" -#: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207 +#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" msgstr "忽略證書認證" -#: terminal/serializers/applet_host.py:50 +#: terminal/serializers/applet_host.py:48 msgid "Existing RDS license" msgstr "已有 RDS 許可證" -#: terminal/serializers/applet_host.py:51 +#: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" -#: terminal/serializers/applet_host.py:54 +#: terminal/serializers/applet_host.py:55 msgid "RDS License Server" msgstr "RDS 許可伺服器" -#: terminal/serializers/applet_host.py:56 +#: terminal/serializers/applet_host.py:57 msgid "RDS Licensing Mode" msgstr "RDS 授權模式" -#: terminal/serializers/applet_host.py:59 +#: terminal/serializers/applet_host.py:60 msgid "RDS Single Session Per User" msgstr "RDS 單用戶單會話" -#: terminal/serializers/applet_host.py:60 +#: terminal/serializers/applet_host.py:61 msgid "" "Tips: A RDS user can have only one session at a time. If set, when next " "login connected, previous session will be disconnected." msgstr "" -#: terminal/serializers/applet_host.py:64 +#: terminal/serializers/applet_host.py:65 msgid "RDS Max Disconnection Time (ms)" msgstr "RDS 最大斷開時間(毫秒)" -#: terminal/serializers/applet_host.py:66 +#: terminal/serializers/applet_host.py:67 msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒後註銷會話)" +msgstr "" +"提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒" +"後註銷會話)" -#: terminal/serializers/applet_host.py:71 +#: terminal/serializers/applet_host.py:72 msgid "RDS Remote App Logoff Time Limit (ms)" msgstr "RDS 遠程應用註銷時間限制(毫秒)" -#: terminal/serializers/applet_host.py:73 +#: terminal/serializers/applet_host.py:74 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" -" programs (0 milliseconds, log off the session immediately)." -msgstr "提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即註銷會話)" +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " +"programs (0 milliseconds, log off the session immediately)." +msgstr "" +"提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即" +"註銷會話)" -#: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47 +#: terminal/serializers/applet_host.py:83 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 msgid "Load status" msgstr "負載狀態" -#: terminal/serializers/applet_host.py:96 +#: terminal/serializers/applet_host.py:97 msgid "" -"These accounts are used to connect to the published application, the account" -" is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account " +"is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will" -" be used to connect" +"support multiple open and the special has been used, the public account will " +"be used to connect" msgstr "" -"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用戶都有一個專用帳號。 " -"另一種是公共的,當應用不支持多開且專用的已經被使用時,會使用公共帳號連接;
注意: 如果不開啟自動創建帳號, " -"當前發布機僅能被指定標簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" +"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用" +"戶都有一個專用帳號。 另一種是公共的,當應用不支持多開且專用的已經被使用時,會" +"使用公共帳號連接;
注意: 如果不開啟自動創建帳號, 當前發布機僅能被指定標" +"簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" -#: terminal/serializers/applet_host.py:103 +#: terminal/serializers/applet_host.py:104 msgid "The number of public accounts created automatically" msgstr "公用帳號自動創建的數量" -#: terminal/serializers/applet_host.py:106 +#: terminal/serializers/applet_host.py:107 msgid "" "Connect to the host using the same account first. For security reasons, " "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" +"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 " +"CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" -#: terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet_host.py:149 msgid "Install applets" msgstr "安裝應用" -#: terminal/serializers/applet_host.py:178 +#: terminal/serializers/applet_host.py:179 msgid "Host ID" msgstr "主機 ID" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:180 msgid "Applet ID" msgstr "遠程應用 ID" @@ -7988,19 +8122,23 @@ msgstr "Oracle 埠範圍" msgid "" "Oracle proxy server listen port is dynamic, Each additional Oracle database " "instance adds a port listener" -msgstr "Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠監聽" +msgstr "" +"Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠" +"監聽" #: terminal/serializers/endpoint.py:38 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" -msgstr "連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許修改主機)" +msgstr "" +"連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許" +"修改主機)" #: terminal/serializers/endpoint.py:64 msgid "" -"The assets within this IP range, the following endpoint will be used for the" -" connection" +"The assets within this IP range, the following endpoint will be used for the " +"connection" msgstr "該 IP 範圍內的資產,將使用下面的端點進行連接" #: terminal/serializers/endpoint.py:65 @@ -8103,8 +8241,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"如果有多個主機,請用逗號 (,) " -"分隔它們。
(例如:http://www.jumpserver.a.com:9100,http://www.jumpserver.b.com:9100)" +"如果有多個主機,請用逗號 (,) 分隔它們。
(例如:http://www.jumpserver.a." +"com:9100,http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -8279,77 +8417,86 @@ msgstr "清除離線會話" #: terminal/tasks.py:45 msgid "" -"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" +"Check every 10 minutes for asset connection sessions that have been inactive " +"for 3 \n" " minutes and mark these sessions as completed" -msgstr "" -"每10分鐘檢查3分鐘未活躍的資產連結會話,將這些會話標記未已完成" +msgstr "每10分鐘檢查3分鐘未活躍的資產連結會話,將這些會話標記未已完成" #: terminal/tasks.py:68 msgid "Upload session replay to external storage" msgstr "上傳會話錄影到外部儲存" -#: terminal/tasks.py:70 +#: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" -"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " +"and \n" " recordings will be uploaded to external storage" msgstr "" "如果設置了SERVER_REPLAY_STORAGE,將透過檔案管理上傳的檔案同步到外部儲存" #: terminal/tasks.py:102 +msgid "Upload session replay part file to external storage" +msgstr "將會話重播部分檔案上傳到外部存儲" + +#: terminal/tasks.py:123 msgid "Run applet host deployment" msgstr "運行應用機部署" -#: terminal/tasks.py:105 +#: terminal/tasks.py:126 msgid "" -"When deploying from the remote application publisher details page, and the 'Deploy' \n" +"When deploying from the remote application publisher details page, and the " +"'Deploy' \n" " button is clicked, this task will be executed" -msgstr "" -"發布機部署,點擊部署時,執行該Action" +msgstr "發布機部署,點擊部署時,執行該Action" -#: terminal/tasks.py:116 +#: terminal/tasks.py:137 msgid "Install applet" msgstr "安裝應用" -#: terminal/tasks.py:119 +#: terminal/tasks.py:140 msgid "" -"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" +"When the 'Deploy' button is clicked in the 'Remote Application' section of " +"the remote \n" " application publisher details page, this task will be executed" -msgstr "" -"當遠端應用發布機的詳細資訊-遠端應用,點擊部署時,執行該Action" +msgstr "當遠端應用發布機的詳細資訊-遠端應用,點擊部署時,執行該Action" -#: terminal/tasks.py:131 +#: terminal/tasks.py:152 msgid "Uninstall applet" msgstr "卸載應用" -#: terminal/tasks.py:134 +#: terminal/tasks.py:155 msgid "" -"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" +"When the 'Uninstall' button is clicked in the 'Remote Application' section " +"of the \n" " remote application publisher details page, this task will be executed" -msgstr "" -"當遠端應用發布機的詳細資訊-遠端應用,點擊移除時,執行該Action" +msgstr "當遠端應用發布機的詳細資訊-遠端應用,點擊移除時,執行該Action" -#: terminal/tasks.py:146 +#: terminal/tasks.py:167 msgid "Generate applet host accounts" msgstr "收集遠程應用上的帳號" -#: terminal/tasks.py:149 +#: terminal/tasks.py:170 msgid "" -"When a remote publishing server is created and an account needs to be created \n" +"When a remote publishing server is created and an account needs to be " +"created \n" " automatically, this task will be executed" -msgstr "" -"當創建遠程發布機後,需要自動創建帳號時,執行該Action" +msgstr "當創建遠程發布機後,需要自動創建帳號時,執行該Action" -#: terminal/tasks.py:163 +#: terminal/tasks.py:184 msgid "Check command replay storage connectivity" msgstr "檢查命令及錄影儲存可連接性 " -#: terminal/tasks.py:165 +#: terminal/tasks.py:186 msgid "" -"Check every day at midnight whether the external storage for commands and recordings \n" -" is accessible. If it is not accessible, send a notification to the recipients specified \n" -" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" +"Check every day at midnight whether the external storage for commands and " +"recordings \n" +" is accessible. If it is not accessible, send a notification to the " +"recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - " +"Connectivity'" msgstr "" -"每天凌晨0點檢查命令及錄像外部儲存是否能夠連接,無法連接時發送給:系統設定-通知設定-訊息訂閱-命令及錄像儲存設定的接收人" +"每天凌晨0點檢查命令及錄像外部儲存是否能夠連接,無法連接時發送給:系統設定-通" +"知設定-訊息訂閱-命令及錄像儲存設定的接收人" #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" @@ -8360,12 +8507,14 @@ msgid "" "No available port is matched. The number of databases may have exceeded the " "number of ports open to the database agent service, Contact the " "administrator to open more ports." -msgstr "未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管理員開放更多埠。" +msgstr "" +"未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管" +"理員開放更多埠。" #: terminal/utils/db_port_mapper.py:116 msgid "" -"No ports can be used, check and modify the limit on the number of ports that" -" Magnus listens on in the configuration file." +"No ports can be used, check and modify the limit on the number of ports that " +"Magnus listens on in the configuration file." msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。" #: terminal/utils/db_port_mapper.py:118 @@ -8428,7 +8577,8 @@ msgstr "工單已經關閉" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" +msgstr "" +"通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -8777,7 +8927,9 @@ msgid "" "When enabled, you will enter the MFA binding process the next time you log " "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" -msgstr "啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速修改->設置 MFA 多因子認證)中直接綁定!" +msgstr "" +"啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速" +"修改->設置 MFA 多因子認證)中直接綁定!" #: users/forms/profile.py:59 msgid "* Enable MFA to make the account more secure." @@ -8785,10 +8937,12 @@ msgstr "* 啟用 MFA 多因子認證,使帳號更加安全。" #: users/forms/profile.py:68 msgid "" -"In order to protect you and your company, please keep your account, password" -" and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password " +"and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" -msgstr "為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:設置複雜密碼,並啟用 MFA 多因子認證)" +msgstr "" +"為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:" +"設置複雜密碼,並啟用 MFA 多因子認證)" #: users/forms/profile.py:82 users/serializers/preference/lina.py:21 msgid "New password" @@ -8941,8 +9095,8 @@ msgstr "終端主題名稱" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files," -" account password change results files" +"sends emails containing file attachments.
Such as: account backup files, " +"account password change results files" msgstr "" "File Encryption Password, when the system sends mails containing file " "attachments, use this password for decryption.
For example: Account " @@ -8995,7 +9149,9 @@ msgid "" "Determines whether the client computer should scale the content on the " "remote computer to fit the window size of the client computer when the " "window is resized." -msgstr "確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機的窗口大小" +msgstr "" +"確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機" +"的窗口大小" #: users/serializers/preference/luna.py:59 msgid "Remote app connect method" @@ -9039,11 +9195,10 @@ msgstr "系統角色" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across" -" all organizations" +"System roles are roles at the system level, and they will take effect across " +"all organizations" msgstr "" -"System role is a system-level role, it will be effective in all " -"organizations" +"System role is a system-level role, it will be effective in all organizations" #: users/serializers/user.py:61 msgid "Org roles" @@ -9054,8 +9209,8 @@ msgid "" "Org roles are roles at the organization level, and they will only take " "effect within current organization" msgstr "" -"Organization role is an organization-level role, it is only effective within" -" the current organization" +"Organization role is an organization-level role, it is only effective within " +"the current organization" #: users/serializers/user.py:70 msgid "Organizations and roles" @@ -9115,8 +9270,8 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"User origin identifies the location where the user was created. It can be AD" -" or other sources. Security settings can restrict users to log in to the " +"User origin identifies the location where the user was created. It can be AD " +"or other sources. Security settings can restrict users to log in to the " "system only from designated sources." #: users/serializers/user.py:266 @@ -9141,8 +9296,7 @@ msgstr "認證" #: users/serializers/user.py:426 msgid "" -"* For security, only a partial of users is displayed. You can search for " -"more" +"* For security, only a partial of users is displayed. You can search for more" msgstr "" "*For security reasons, only a portion of users is displayed. You can search " "for more" @@ -9154,8 +9308,10 @@ msgstr "名稱重複" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the administrator." -msgstr "管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" +" and the current user is not in the user list. Please contact the " +"administrator." +msgstr "" +"管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" #: users/signal_handlers.py:196 msgid "Clean up expired user sessions" @@ -9163,7 +9319,8 @@ msgstr "清除過期的用戶會話" #: users/signal_handlers.py:198 msgid "" -"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" +"After logging in via the web, a user session record is created. At 2 a.m. " +"every day, \n" " the system cleans up inactive user devices" msgstr "" "使用web登入後,會產生使用者會話在線紀錄,每天凌晨2點,清理未在線的使用者設備" @@ -9174,10 +9331,10 @@ msgstr "校驗密碼已過期" #: users/tasks.py:28 msgid "" -"Check every day at 10 AM whether the passwords of users in the system are expired, \n" +"Check every day at 10 AM whether the passwords of users in the system are " +"expired, \n" " and send a notification 5 days in advance" -msgstr "" -"每天早上10點檢查,系統中使用者的密碼是否過期,提前5天發送通知" +msgstr "每天早上10點檢查,系統中使用者的密碼是否過期,提前5天發送通知" #: users/tasks.py:46 msgid "Periodic check password expired" @@ -9185,11 +9342,14 @@ msgstr "週期校驗密碼過期" #: users/tasks.py:48 msgid "" -"With version iterations, new tasks may be added, or task names and execution times may \n" -" be modified. Therefore, upon system startup, it is necessary to register or update the \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, it is necessary to " +"register or update the \n" " parameters of the task that checks if passwords have expired" msgstr "" -"隨著版本迭代,可能會新增Action或者修改Action的名稱,執行時間,所以在系統啟動時,註冊或者更新檢驗密碼已過期Action的參數" +"隨著版本迭代,可能會新增Action或者修改Action的名稱,執行時間,所以在系統啟動" +"時,註冊或者更新檢驗密碼已過期Action的參數" #: users/tasks.py:67 msgid "Check user expired" @@ -9197,7 +9357,8 @@ msgstr "校驗用戶已過期" #: users/tasks.py:69 msgid "" -"Check every day at 10 AM whether the users in the system are expired, and send a \n" +"Check every day at 2 p.m whether the users in the system are expired, and " +"send a \n" " notification 5 days in advance" msgstr "每天上午10點檢查,系統中的使用者是否過期,提前5天發送通知" @@ -9207,11 +9368,14 @@ msgstr "週期檢測用戶過期" #: users/tasks.py:92 msgid "" -"With version iterations, new tasks may be added, or task names and execution times may \n" -" be modified. Therefore, upon system startup, it is necessary to register or update the \n" +"With version iterations, new tasks may be added, or task names and execution " +"times may \n" +" be modified. Therefore, upon system startup, it is necessary to " +"register or update the \n" " parameters of the task that checks if users have expired" msgstr "" -"隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時,註冊或者更新檢驗使用者已過期任務的參數" +"隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時," +"註冊或者更新檢驗使用者已過期任務的參數" #: users/tasks.py:111 msgid "Check unused users" @@ -9219,11 +9383,14 @@ msgstr "檢查未使用的用戶" #: users/tasks.py:113 msgid "" -"At 2 a.m. every day, according to the configuration in \"System Settings - Security - \n" -" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" +"At 2 p.m. every day, according to the configuration in \"System Settings - " +"Security - \n" +" Auth security - Auto disable threshold\" users who have not logged " +"in or whose API keys \n" " have not been used for a long time will be disabled" msgstr "" -"每天凌晨2點,根據系統配置-安全設置-不活躍使用者自動禁用配置,對長時間不登錄或api_key不使用的使用者進行禁用" +"每天凌晨2點,根據系統配置-安全設置-不活躍使用者自動禁用配置,對長時間不登錄或" +"api_key不使用的使用者進行禁用" #: users/tasks.py:157 msgid "The user has not logged in recently and has been disabled." @@ -9357,8 +9524,8 @@ msgstr "綁定MFA驗證器" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a " -"6-bit verification code" +"Use the MFA Authenticator application to scan the following qr code for a 6-" +"bit verification code" msgstr "使用 MFA 驗證器應用掃描以下二維碼,獲取6位驗證碼" #: users/templates/users/user_otp_enable_bind.html:22 @@ -9443,8 +9610,8 @@ msgstr "使用者名稱或密碼無效" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change" -" their passwords: {}" +"Non-local users can log in only from third-party platforms and cannot change " +"their passwords: {}" msgstr "非本地用戶僅允許從第三方平台登錄,不支持修改密碼: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 @@ -9668,7 +9835,8 @@ msgstr "同步地區" #: xpack/plugins/cloud/manager.py:115 #, python-format msgid "Get instances of region \"%s\" error, error: %s" -msgstr "An error occurred while getting the instances of Region \"%s\", Error: %s" +msgstr "" +"An error occurred while getting the instances of Region \"%s\", Error: %s" #: xpack/plugins/cloud/manager.py:157 #, python-format @@ -9813,8 +9981,7 @@ msgstr "實例" msgid "Sync instance detail" msgstr "同步實例詳情" -#: xpack/plugins/cloud/models.py:311 -#: xpack/plugins/cloud/serializers/task.py:77 +#: xpack/plugins/cloud/models.py:311 xpack/plugins/cloud/serializers/task.py:77 msgid "Rule relation" msgstr "條件關係" @@ -9870,8 +10037,7 @@ msgstr "規則匹配" msgid "Rule value" msgstr "規則值" -#: xpack/plugins/cloud/models.py:381 -#: xpack/plugins/cloud/serializers/task.py:80 +#: xpack/plugins/cloud/models.py:381 xpack/plugins/cloud/serializers/task.py:80 msgid "Strategy rule" msgstr "條件" @@ -9887,8 +10053,7 @@ msgstr "動作屬性" msgid "Action value" msgstr "動作值" -#: xpack/plugins/cloud/models.py:407 -#: xpack/plugins/cloud/serializers/task.py:83 +#: xpack/plugins/cloud/models.py:407 xpack/plugins/cloud/serializers/task.py:83 msgid "Strategy action" msgstr "動作" @@ -10165,7 +10330,9 @@ msgid "" "The port is used to detect the validity of the IP address. When the " "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." -msgstr "埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如果埠為 0,則表示所有 IP 地址均有效。" +msgstr "" +"埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如" +"果埠為 0,則表示所有 IP 地址均有效。" #: xpack/plugins/cloud/serializers/account_attrs.py:190 msgid "Hostname prefix" @@ -10197,22 +10364,29 @@ msgstr "實例個數" #: xpack/plugins/cloud/tasks.py:33 msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are" -" performed" -msgstr "" +"\n" +" Execute this task when manually or scheduled cloud synchronization " +"tasks are performed\n" +" " +msgstr "\n" "手動,定時執行雲同步任務時執行該任務" -#: xpack/plugins/cloud/tasks.py:50 +#: xpack/plugins/cloud/tasks.py:52 msgid "Period clean sync instance task execution" msgstr "定期清除同步實例任務執行記錄" -#: xpack/plugins/cloud/tasks.py:52 +#: xpack/plugins/cloud/tasks.py:54 msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" -" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" -" records generated by cloud synchronization" -msgstr "" -"每天根據系統設置-任務列表-定期清理配置-雲同步記錄配置,對雲同步產生的執行記錄進行清理" +"\n" +" Every day, according to the configuration in \"System Settings - " +"Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will " +"clean up the execution \n" +" records generated by cloud synchronization\n" +" " +msgstr "\n" +"每天根據系統設置-任務列表-定期清理配置-雲同步記錄配置,對雲同步產生的執行記錄" +"進行清理" #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." From 647736f4e309c7b277b07f68d062b4eabb33df77 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Thu, 19 Sep 2024 15:29:10 +0800 Subject: [PATCH 98/98] fix: SAML2 500 error caused by duplicate email or username --- apps/authentication/backends/saml2/views.py | 13 +++++++++++-- apps/i18n/core/zh/LC_MESSAGES/django.po | 21 ++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/apps/authentication/backends/saml2/views.py b/apps/authentication/backends/saml2/views.py index 22a5a9a68..abc79cf68 100644 --- a/apps/authentication/backends/saml2/views.py +++ b/apps/authentication/backends/saml2/views.py @@ -3,8 +3,10 @@ from urllib import parse from django.conf import settings from django.contrib import auth +from django.db import IntegrityError from django.http import HttpResponseRedirect, HttpResponse, HttpResponseServerError from django.urls import reverse +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.decorators.csrf import csrf_exempt from onelogin.saml2.auth import OneLogin_Saml2_Auth @@ -14,6 +16,7 @@ from onelogin.saml2.idp_metadata_parser import ( dict_deep_merge ) +from authentication.views.mixins import FlashMessageMixin from common.utils import get_logger from .settings import JmsSaml2Settings @@ -243,7 +246,7 @@ class Saml2EndSessionView(View, PrepareRequestMixin): return HttpResponseRedirect(logout_url) -class Saml2AuthCallbackView(View, PrepareRequestMixin): +class Saml2AuthCallbackView(View, PrepareRequestMixin, FlashMessageMixin): def post(self, request): log_prompt = "Process SAML2 POST requests: {}" @@ -272,7 +275,13 @@ class Saml2AuthCallbackView(View, PrepareRequestMixin): logger.debug(log_prompt.format('Process authenticate')) saml_user_data = self.get_attributes(saml_instance) - user = auth.authenticate(request=request, saml_user_data=saml_user_data) + try: + user = auth.authenticate(request=request, saml_user_data=saml_user_data) + except IntegrityError: + title = _("SAML2 Error") + msg = _('Please check if a user with the same username or email already exists') + response = self.get_failed_response('/', title, msg) + return response if user and user.is_valid: logger.debug(log_prompt.format('Login: {}'.format(user))) auth.login(self.request, user) diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 8ee6c3536..aba5997d7 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-19 16:31+0800\n" +"POT-Creation-Date: 2024-09-19 17:03+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -1038,11 +1038,12 @@ msgid "" "default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " "\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" msgstr "" -"length 是密码的长度,填写范围为 8 到 30。" -"lowercase 表示密码中是否包含小写字母,uppercase 表示是否包含大写字母," -"digit 表示是否包含数字,symbol 表示是否包含特殊符号。" -"exclude_symbols 用于排除特定符号,您可以填写要排除的符号字符(最多 16 个),如果无需排除符号,可以留空。" -"默认: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +"length 是密码的长度,填写范围为 8 到 30。lowercase 表示密码中是否包含小写字" +"母,uppercase 表示是否包含大写字母,digit 表示是否包含数字,symbol 表示是否包" +"含特殊符号。exclude_symbols 用于排除特定符号,您可以填写要排除的符号字符(最" +"多 16 个),如果无需排除符号,可以留空。默认: {\"length\": 16, " +"\"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, " +"\"exclude_symbols\": \"\"}" #: accounts/serializers/account/template.py:49 msgid "Secret generation strategy for account creation" @@ -3174,6 +3175,7 @@ msgid "OpenID Error" msgstr "OpenID 错误" #: authentication/backends/oidc/views.py:175 +#: authentication/backends/saml2/views.py:282 msgid "Please check if a user with the same username or email already exists" msgstr "请检查是否已经存在相同用户名或邮箱的用户" @@ -3203,6 +3205,10 @@ msgstr "最后使用日期" msgid "Credential ID" msgstr "凭证 ID" +#: authentication/backends/saml2/views.py:281 +msgid "SAML2 Error" +msgstr "SAML2 错误" + #: authentication/confirm/password.py:16 msgid "Authentication failed password incorrect" msgstr "认证失败 (用户名或密码不正确)" @@ -7262,7 +7268,8 @@ msgid "" "\n" " Your account has expired, please contact the administrator.\n" " " -msgstr "\n" +msgstr "" +"\n" " 您的账号已经过期,请联系管理员。 " #: templates/_message.html:13