mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-04-29 20:04:10 +00:00
Compare commits
29 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4f34ce5edb | ||
|
c49c394b5b | ||
|
a0f27a9476 | ||
|
5af6f89229 | ||
|
adbd73182b | ||
|
eb9f261459 | ||
|
c4d99ed8e2 | ||
|
8d01c189f0 | ||
|
a2701090de | ||
|
4582aa0a09 | ||
|
c7c379479f | ||
|
ce4479c23e | ||
|
eedc2f1b41 | ||
|
7ba24293d1 | ||
|
f10114c9ed | ||
|
cf31cbfb07 | ||
|
0edad24d5d | ||
|
1f1c1a9157 | ||
|
6c9d271ae1 | ||
|
6ff852e225 | ||
|
baa75dc735 | ||
|
8a9f0436b8 | ||
|
a9620a3cbe | ||
|
769e7dc8a0 | ||
|
2a70449411 | ||
|
8df720f19e | ||
|
dabbb45f6e | ||
|
ce24c1c3fd | ||
|
3c54c82ce9 |
@ -18,8 +18,8 @@ __all__ = [
|
||||
|
||||
class AccountBackupPlanViewSet(OrgBulkModelViewSet):
|
||||
model = AccountBackupAutomation
|
||||
filter_fields = ('name',)
|
||||
search_fields = filter_fields
|
||||
filterset_fields = ('name',)
|
||||
search_fields = filterset_fields
|
||||
ordering = ('name',)
|
||||
serializer_class = serializers.AccountBackupSerializer
|
||||
|
||||
|
@ -20,8 +20,8 @@ __all__ = [
|
||||
class AutomationAssetsListApi(generics.ListAPIView):
|
||||
model = BaseAutomation
|
||||
serializer_class = serializers.AutomationAssetsSerializer
|
||||
filter_fields = ("name", "address")
|
||||
search_fields = filter_fields
|
||||
filterset_fields = ("name", "address")
|
||||
search_fields = filterset_fields
|
||||
|
||||
def get_object(self):
|
||||
pk = self.kwargs.get('pk')
|
||||
|
@ -24,8 +24,8 @@ __all__ = [
|
||||
|
||||
class ChangeSecretAutomationViewSet(OrgBulkModelViewSet):
|
||||
model = ChangeSecretAutomation
|
||||
filter_fields = ('name', 'secret_type', 'secret_strategy')
|
||||
search_fields = filter_fields
|
||||
filterset_fields = ('name', 'secret_type', 'secret_strategy')
|
||||
search_fields = filterset_fields
|
||||
serializer_class = serializers.ChangeSecretAutomationSerializer
|
||||
|
||||
|
||||
|
@ -20,8 +20,8 @@ __all__ = [
|
||||
|
||||
class GatherAccountsAutomationViewSet(OrgBulkModelViewSet):
|
||||
model = GatherAccountsAutomation
|
||||
filter_fields = ('name',)
|
||||
search_fields = filter_fields
|
||||
filterset_fields = ('name',)
|
||||
search_fields = filterset_fields
|
||||
serializer_class = serializers.GatherAccountAutomationSerializer
|
||||
|
||||
|
||||
|
@ -20,8 +20,8 @@ __all__ = [
|
||||
|
||||
class PushAccountAutomationViewSet(OrgBulkModelViewSet):
|
||||
model = PushAccountAutomation
|
||||
filter_fields = ('name', 'secret_type', 'secret_strategy')
|
||||
search_fields = filter_fields
|
||||
filterset_fields = ('name', 'secret_type', 'secret_strategy')
|
||||
search_fields = filterset_fields
|
||||
serializer_class = serializers.PushAccountAutomationSerializer
|
||||
|
||||
|
||||
|
@ -12,7 +12,7 @@ from sshtunnel import SSHTunnelForwarder
|
||||
|
||||
from assets.automations.methods import platform_automation_methods
|
||||
from common.utils import get_logger, lazyproperty, is_openssh_format_key, ssh_pubkey_gen
|
||||
from ops.ansible import JMSInventory, PlaybookRunner, DefaultCallback
|
||||
from ops.ansible import JMSInventory, SuperPlaybookRunner, DefaultCallback
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
@ -269,7 +269,7 @@ class BasePlaybookManager:
|
||||
if not playbook_path:
|
||||
continue
|
||||
|
||||
runer = PlaybookRunner(
|
||||
runer = SuperPlaybookRunner(
|
||||
inventory_path,
|
||||
playbook_path,
|
||||
self.runtime_dir,
|
||||
|
@ -73,6 +73,10 @@ class FamilyMixin:
|
||||
@classmethod
|
||||
def get_nodes_all_children(cls, nodes, with_self=True):
|
||||
pattern = cls.get_nodes_children_key_pattern(nodes, with_self=with_self)
|
||||
if not pattern:
|
||||
# 如果 pattern = ''
|
||||
# key__iregex 报错 (1139, "Got error 'empty (sub)expression' from regexp")
|
||||
return cls.objects.none()
|
||||
return Node.objects.filter(key__iregex=pattern)
|
||||
|
||||
@classmethod
|
||||
|
@ -8,7 +8,7 @@ __all__ = ['BASE_DIR', 'PROJECT_DIR', 'VERSION', 'CONFIG']
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
PROJECT_DIR = os.path.dirname(BASE_DIR)
|
||||
VERSION = '2.0.0'
|
||||
VERSION = 'v3.10.7'
|
||||
CONFIG = ConfigManager.load_user_config()
|
||||
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d04781f4f0b0de3ac5f707febb222e239553d6103bca0cec41ab2fd5ab044571
|
||||
size 173799
|
||||
oid sha256:1e0d36c8c54579103b6b550971fa4282581eb503c9499df55e37b0164391b607
|
||||
size 173954
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-02-27 16:09+0800\n"
|
||||
"POT-Creation-Date: 2024-03-19 11:12+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -1749,7 +1749,7 @@ msgid "Domain"
|
||||
msgstr "ドメイン"
|
||||
|
||||
#: assets/models/asset/common.py:165 assets/models/automations/base.py:18
|
||||
#: assets/models/cmd_filter.py:32 assets/models/node.py:549
|
||||
#: assets/models/cmd_filter.py:32 assets/models/node.py:553
|
||||
#: perms/models/asset_permission.py:72 perms/serializers/permission.py:37
|
||||
#: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:330
|
||||
msgid "Node"
|
||||
@ -1889,7 +1889,7 @@ msgstr "デフォルトアセットグループ"
|
||||
msgid "System"
|
||||
msgstr "システム"
|
||||
|
||||
#: assets/models/label.py:19 assets/models/node.py:535
|
||||
#: assets/models/label.py:19 assets/models/node.py:539
|
||||
#: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18
|
||||
#: assets/serializers/cagegory.py:24
|
||||
#: authentication/models/connection_token.py:29
|
||||
@ -1908,27 +1908,27 @@ msgstr "値"
|
||||
msgid "Label"
|
||||
msgstr "ラベル"
|
||||
|
||||
#: assets/models/node.py:165
|
||||
#: assets/models/node.py:169
|
||||
msgid "New node"
|
||||
msgstr "新しいノード"
|
||||
|
||||
#: assets/models/node.py:463 audits/backends/db.py:65 audits/backends/db.py:66
|
||||
#: assets/models/node.py:467 audits/backends/db.py:65 audits/backends/db.py:66
|
||||
msgid "empty"
|
||||
msgstr "空"
|
||||
|
||||
#: assets/models/node.py:534 perms/models/perm_node.py:28
|
||||
#: assets/models/node.py:538 perms/models/perm_node.py:28
|
||||
msgid "Key"
|
||||
msgstr "キー"
|
||||
|
||||
#: assets/models/node.py:536 assets/serializers/node.py:20
|
||||
#: assets/models/node.py:540 assets/serializers/node.py:20
|
||||
msgid "Full value"
|
||||
msgstr "フルバリュー"
|
||||
|
||||
#: assets/models/node.py:540 perms/models/perm_node.py:30
|
||||
#: assets/models/node.py:544 perms/models/perm_node.py:30
|
||||
msgid "Parent key"
|
||||
msgstr "親キー"
|
||||
|
||||
#: assets/models/node.py:552
|
||||
#: assets/models/node.py:556
|
||||
msgid "Can match node"
|
||||
msgstr "ノードを一致させることができます"
|
||||
|
||||
@ -4098,27 +4098,27 @@ msgstr "タスクを作成中で、中断できません。後でもう一度お
|
||||
msgid "Currently playbook is being used in a job"
|
||||
msgstr "現在プレイブックは1つのジョブで使用されています"
|
||||
|
||||
#: ops/api/playbook.py:93
|
||||
#: ops/api/playbook.py:97
|
||||
msgid "Unsupported file content"
|
||||
msgstr "サポートされていないファイルの内容"
|
||||
|
||||
#: ops/api/playbook.py:95 ops/api/playbook.py:141 ops/api/playbook.py:189
|
||||
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
|
||||
msgid "Invalid file path"
|
||||
msgstr "無効なファイルパス"
|
||||
|
||||
#: ops/api/playbook.py:167
|
||||
#: ops/api/playbook.py:171
|
||||
msgid "This file can not be rename"
|
||||
msgstr "ファイル名を変更することはできません"
|
||||
|
||||
#: ops/api/playbook.py:186
|
||||
#: ops/api/playbook.py:190
|
||||
msgid "File already exists"
|
||||
msgstr "ファイルは既に存在します。"
|
||||
|
||||
#: ops/api/playbook.py:204
|
||||
#: ops/api/playbook.py:208
|
||||
msgid "File key is required"
|
||||
msgstr "ファイルキーこのフィールドは必須です"
|
||||
|
||||
#: ops/api/playbook.py:207
|
||||
#: ops/api/playbook.py:211
|
||||
msgid "This file can not be delete"
|
||||
msgstr "このファイルを削除できません"
|
||||
|
||||
@ -4401,6 +4401,10 @@ msgstr "終了しました"
|
||||
msgid "Time cost"
|
||||
msgstr "時を過ごす"
|
||||
|
||||
#: ops/serializers/job.py:87
|
||||
msgid "You do not have permission for the current job."
|
||||
msgstr "あなたは現在のジョブの権限を持っていません。"
|
||||
|
||||
#: ops/tasks.py:37
|
||||
msgid "Run ansible task"
|
||||
msgstr "Ansible タスクを実行する"
|
||||
@ -8646,7 +8650,7 @@ msgstr "そして"
|
||||
msgid "Or"
|
||||
msgstr "または"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:57
|
||||
#: xpack/plugins/cloud/manager.py:56
|
||||
msgid "Account unavailable"
|
||||
msgstr "利用できないアカウント"
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e66a6fa05d25f1c502f95001b5ff0d0a310affd32eac939fd7b840845028074f
|
||||
size 142298
|
||||
oid sha256:931e599c8b599a5b58754a6e64cb9aa0db3d69ed76a703d30fb455e9cc10996c
|
||||
size 142396
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: JumpServer 0.3.3\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-02-27 16:09+0800\n"
|
||||
"POT-Creation-Date: 2024-03-19 11:12+0800\n"
|
||||
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
|
||||
"Last-Translator: ibuler <ibuler@qq.com>\n"
|
||||
"Language-Team: JumpServer team<ibuler@qq.com>\n"
|
||||
@ -1741,7 +1741,7 @@ msgid "Domain"
|
||||
msgstr "网域"
|
||||
|
||||
#: assets/models/asset/common.py:165 assets/models/automations/base.py:18
|
||||
#: assets/models/cmd_filter.py:32 assets/models/node.py:549
|
||||
#: assets/models/cmd_filter.py:32 assets/models/node.py:553
|
||||
#: perms/models/asset_permission.py:72 perms/serializers/permission.py:37
|
||||
#: tickets/models/ticket/apply_asset.py:14 xpack/plugins/cloud/models.py:330
|
||||
msgid "Node"
|
||||
@ -1881,7 +1881,7 @@ msgstr "默认资产组"
|
||||
msgid "System"
|
||||
msgstr "系统"
|
||||
|
||||
#: assets/models/label.py:19 assets/models/node.py:535
|
||||
#: assets/models/label.py:19 assets/models/node.py:539
|
||||
#: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18
|
||||
#: assets/serializers/cagegory.py:24
|
||||
#: authentication/models/connection_token.py:29
|
||||
@ -1900,27 +1900,27 @@ msgstr "值"
|
||||
msgid "Label"
|
||||
msgstr "标签"
|
||||
|
||||
#: assets/models/node.py:165
|
||||
#: assets/models/node.py:169
|
||||
msgid "New node"
|
||||
msgstr "新节点"
|
||||
|
||||
#: assets/models/node.py:463 audits/backends/db.py:65 audits/backends/db.py:66
|
||||
#: assets/models/node.py:467 audits/backends/db.py:65 audits/backends/db.py:66
|
||||
msgid "empty"
|
||||
msgstr "空"
|
||||
|
||||
#: assets/models/node.py:534 perms/models/perm_node.py:28
|
||||
#: assets/models/node.py:538 perms/models/perm_node.py:28
|
||||
msgid "Key"
|
||||
msgstr "键"
|
||||
|
||||
#: assets/models/node.py:536 assets/serializers/node.py:20
|
||||
#: assets/models/node.py:540 assets/serializers/node.py:20
|
||||
msgid "Full value"
|
||||
msgstr "全称"
|
||||
|
||||
#: assets/models/node.py:540 perms/models/perm_node.py:30
|
||||
#: assets/models/node.py:544 perms/models/perm_node.py:30
|
||||
msgid "Parent key"
|
||||
msgstr "ssh私钥"
|
||||
|
||||
#: assets/models/node.py:552
|
||||
#: assets/models/node.py:556
|
||||
msgid "Can match node"
|
||||
msgstr "可以匹配节点"
|
||||
|
||||
@ -4047,27 +4047,27 @@ msgstr "正在创建任务,无法中断,请稍后重试。"
|
||||
msgid "Currently playbook is being used in a job"
|
||||
msgstr "当前 playbook 正在作业中使用"
|
||||
|
||||
#: ops/api/playbook.py:93
|
||||
#: ops/api/playbook.py:97
|
||||
msgid "Unsupported file content"
|
||||
msgstr "不支持的文件内容"
|
||||
|
||||
#: ops/api/playbook.py:95 ops/api/playbook.py:141 ops/api/playbook.py:189
|
||||
#: ops/api/playbook.py:99 ops/api/playbook.py:145 ops/api/playbook.py:193
|
||||
msgid "Invalid file path"
|
||||
msgstr "无效的文件路径"
|
||||
|
||||
#: ops/api/playbook.py:167
|
||||
#: ops/api/playbook.py:171
|
||||
msgid "This file can not be rename"
|
||||
msgstr "该文件不能重命名"
|
||||
|
||||
#: ops/api/playbook.py:186
|
||||
#: ops/api/playbook.py:190
|
||||
msgid "File already exists"
|
||||
msgstr "文件已存在"
|
||||
|
||||
#: ops/api/playbook.py:204
|
||||
#: ops/api/playbook.py:208
|
||||
msgid "File key is required"
|
||||
msgstr "文件密钥该字段是必填项。"
|
||||
|
||||
#: ops/api/playbook.py:207
|
||||
#: ops/api/playbook.py:211
|
||||
msgid "This file can not be delete"
|
||||
msgstr "无法删除此文件"
|
||||
|
||||
@ -4350,6 +4350,10 @@ msgstr "是否完成"
|
||||
msgid "Time cost"
|
||||
msgstr "花费时间"
|
||||
|
||||
#: ops/serializers/job.py:87
|
||||
msgid "You do not have permission for the current job."
|
||||
msgstr "你没有当前作业的权限。"
|
||||
|
||||
#: ops/tasks.py:37
|
||||
msgid "Run ansible task"
|
||||
msgstr "运行 Ansible 任务"
|
||||
@ -8522,7 +8526,7 @@ msgstr "与"
|
||||
msgid "Or"
|
||||
msgstr "或"
|
||||
|
||||
#: xpack/plugins/cloud/manager.py:57
|
||||
#: xpack/plugins/cloud/manager.py:56
|
||||
msgid "Account unavailable"
|
||||
msgstr "账号无效"
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import os
|
||||
import uuid
|
||||
import shutil
|
||||
import uuid
|
||||
|
||||
import ansible_runner
|
||||
from django.conf import settings
|
||||
from django.utils._os import safe_join
|
||||
@ -43,6 +44,9 @@ class AdHocRunner:
|
||||
|
||||
if not os.path.exists(self.project_dir):
|
||||
os.mkdir(self.project_dir, 0o755)
|
||||
private_env = safe_join(self.project_dir, 'env')
|
||||
if os.path.exists(private_env):
|
||||
shutil.rmtree(private_env)
|
||||
|
||||
ansible_runner.run(
|
||||
timeout=self.timeout if self.timeout > 0 else None,
|
||||
@ -69,9 +73,13 @@ class PlaybookRunner:
|
||||
if not callback:
|
||||
callback = DefaultCallback()
|
||||
self.cb = callback
|
||||
self.envs = {}
|
||||
|
||||
def run(self, verbosity=0, **kwargs):
|
||||
verbosity = get_ansible_log_verbosity(verbosity)
|
||||
private_env = safe_join(self.project_dir, 'env')
|
||||
if os.path.exists(private_env):
|
||||
shutil.rmtree(private_env)
|
||||
|
||||
ansible_runner.run(
|
||||
private_data_dir=self.project_dir,
|
||||
@ -81,11 +89,18 @@ class PlaybookRunner:
|
||||
event_handler=self.cb.event_handler,
|
||||
status_handler=self.cb.status_handler,
|
||||
host_cwd=self.project_dir,
|
||||
envvars=self.envs,
|
||||
**kwargs
|
||||
)
|
||||
return self.cb
|
||||
|
||||
|
||||
class SuperPlaybookRunner(PlaybookRunner):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.envs = {"LOCAL_CONNECTION_ENABLED": "1"}
|
||||
|
||||
|
||||
class UploadFileRunner:
|
||||
def __init__(self, inventory, job_id, dest_path, callback=None):
|
||||
self.id = uuid.uuid4()
|
||||
|
@ -142,7 +142,7 @@ class JobViewSet(OrgBulkModelViewSet):
|
||||
status=400)
|
||||
|
||||
job_id = request.data.get('job_id', '')
|
||||
job = get_object_or_404(Job, pk=job_id)
|
||||
job = get_object_or_404(Job, pk=job_id, creator=request.user)
|
||||
job_args = json.loads(job.args)
|
||||
src_path_info = []
|
||||
upload_file_dir = safe_join(settings.DATA_DIR, 'job_upload_file', job_id)
|
||||
@ -225,7 +225,7 @@ class JobAssetDetail(APIView):
|
||||
|
||||
def get(self, request, **kwargs):
|
||||
execution_id = request.query_params.get('execution_id', '')
|
||||
execution = get_object_or_404(JobExecution, id=execution_id)
|
||||
execution = get_object_or_404(JobExecution, id=execution_id, creator=request.user)
|
||||
return Response(data=execution.assent_result_detail)
|
||||
|
||||
|
||||
@ -239,7 +239,7 @@ class JobExecutionTaskDetail(APIView):
|
||||
task_id = str(kwargs.get('task_id'))
|
||||
|
||||
with tmp_to_org(org):
|
||||
execution = get_object_or_404(JobExecution, task_id=task_id)
|
||||
execution = get_object_or_404(JobExecution, pk=task_id, creator=request.user)
|
||||
|
||||
return Response(data={
|
||||
'status': execution.status,
|
||||
|
@ -79,9 +79,13 @@ class PlaybookFileBrowserAPIView(APIView):
|
||||
}
|
||||
protected_files = ['root', 'main.yml']
|
||||
|
||||
def get_playbook(self, playbook_id):
|
||||
playbook = get_object_or_404(Playbook, id=playbook_id, creator=self.request.user)
|
||||
return playbook
|
||||
|
||||
def get(self, request, **kwargs):
|
||||
playbook_id = kwargs.get('pk')
|
||||
playbook = get_object_or_404(Playbook, id=playbook_id)
|
||||
playbook = self.get_playbook(playbook_id)
|
||||
work_path = playbook.work_dir
|
||||
file_key = request.query_params.get('key', '')
|
||||
if file_key:
|
||||
@ -101,7 +105,7 @@ class PlaybookFileBrowserAPIView(APIView):
|
||||
|
||||
def post(self, request, **kwargs):
|
||||
playbook_id = kwargs.get('pk')
|
||||
playbook = get_object_or_404(Playbook, id=playbook_id)
|
||||
playbook = self.get_playbook(playbook_id)
|
||||
work_path = playbook.work_dir
|
||||
|
||||
parent_key = request.data.get('key', '')
|
||||
@ -157,7 +161,7 @@ class PlaybookFileBrowserAPIView(APIView):
|
||||
|
||||
def patch(self, request, **kwargs):
|
||||
playbook_id = kwargs.get('pk')
|
||||
playbook = get_object_or_404(Playbook, id=playbook_id)
|
||||
playbook = self.get_playbook(playbook_id)
|
||||
work_path = playbook.work_dir
|
||||
|
||||
file_key = request.data.get('key', '')
|
||||
@ -197,7 +201,7 @@ class PlaybookFileBrowserAPIView(APIView):
|
||||
|
||||
def delete(self, request, **kwargs):
|
||||
playbook_id = kwargs.get('pk')
|
||||
playbook = get_object_or_404(Playbook, id=playbook_id)
|
||||
playbook = self.get_playbook(playbook_id)
|
||||
work_path = playbook.work_dir
|
||||
file_key = request.query_params.get('key', '')
|
||||
if not file_key:
|
||||
|
@ -81,3 +81,8 @@ class JobExecutionSerializer(BulkOrgResourceModelSerializer):
|
||||
fields = read_only_fields + [
|
||||
"job", "parameters", "creator"
|
||||
]
|
||||
|
||||
def validate_job(self, job_obj):
|
||||
if job_obj.creator != self.context['request'].user:
|
||||
raise serializers.ValidationError(_("You do not have permission for the current job."))
|
||||
return job_obj
|
||||
|
@ -9,7 +9,7 @@ from django.utils import timezone
|
||||
|
||||
from common.db.utils import safe_db_connection
|
||||
from common.utils import get_logger, random_string
|
||||
from ops.ansible import PlaybookRunner, JMSInventory
|
||||
from ops.ansible import SuperPlaybookRunner, JMSInventory
|
||||
from terminal.models import Applet, AppletHostDeployment
|
||||
|
||||
logger = get_logger(__name__)
|
||||
@ -114,7 +114,7 @@ class DeployAppletHostManager:
|
||||
def _run_playbook(self, generate_playbook: callable, **kwargs):
|
||||
inventory = self.generate_inventory()
|
||||
playbook = generate_playbook()
|
||||
runner = PlaybookRunner(
|
||||
runner = SuperPlaybookRunner(
|
||||
inventory=inventory, playbook=playbook, project_dir=self.run_dir
|
||||
)
|
||||
return runner.run(**kwargs)
|
||||
|
18
poetry.lock
generated
18
poetry.lock
generated
@ -480,7 +480,7 @@ description = "Radically simple IT automation"
|
||||
optional = false
|
||||
python-versions = ">=3.9"
|
||||
files = [
|
||||
{file = "ansible-2.14.1.2.zip", hash = "sha256:813b39d8e03d5ea23b47703b3ba4d0372f68141b33e2b1be28deb6ad28b31c73"},
|
||||
{file = "v2.14.1.4.zip", hash = "sha256:1805e06391223ac6198229a18f501f0e001e66c3b334cb7c5061e0ac810297d6"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -492,7 +492,7 @@ resolvelib = ">=0.5.3,<0.9.0"
|
||||
|
||||
[package.source]
|
||||
type = "url"
|
||||
url = "https://github.com/jumpserver/ansible/releases/download/v2.14.1.2/ansible-2.14.1.2.zip"
|
||||
url = "https://github.com/jumpserver/ansible/archive/refs/tags/v2.14.1.4.zip"
|
||||
|
||||
[[package]]
|
||||
name = "ansible-runner"
|
||||
@ -6402,26 +6402,24 @@ reference = "tsinghua"
|
||||
|
||||
[[package]]
|
||||
name = "redis"
|
||||
version = "4.6.0"
|
||||
version = "5.0.3"
|
||||
description = "Python client for Redis database and key-value store"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"},
|
||||
{file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"},
|
||||
{file = "v5.0.3.zip", hash = "sha256:2580c49b393568c11e8e14419558afd658edd9e9c74371d63613874bfe2c31c4"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""}
|
||||
async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""}
|
||||
|
||||
[package.extras]
|
||||
hiredis = ["hiredis (>=1.0.0)"]
|
||||
ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"]
|
||||
|
||||
[package.source]
|
||||
type = "legacy"
|
||||
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
||||
reference = "tsinghua"
|
||||
type = "url"
|
||||
url = "https://github.com/jumpserver-dev/redis-py/archive/refs/tags/v5.0.3.zip"
|
||||
|
||||
[[package]]
|
||||
name = "requests"
|
||||
@ -7869,4 +7867,4 @@ reference = "tsinghua"
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.11"
|
||||
content-hash = "9f9294b5efb21a24625429dddb084c8d7f53b4d9d7d41c534d249bc9ed512905"
|
||||
content-hash = "e1a6ab7c94316ee4542c13aefb118278e28a7ca2c118ecb5715343adee0c094d"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "jumpserver"
|
||||
version = "v3.9"
|
||||
version = "v3.10.7"
|
||||
description = "广受欢迎的开源堡垒机"
|
||||
authors = ["ibuler <ibuler@qq.com>"]
|
||||
license = "GPLv3"
|
||||
@ -11,7 +11,7 @@ python = "^3.11"
|
||||
cython = "3.0.0"
|
||||
aiofiles = "23.1.0"
|
||||
amqp = "5.1.1"
|
||||
ansible-core = { url = "https://github.com/jumpserver/ansible/releases/download/v2.14.1.2/ansible-2.14.1.2.zip" }
|
||||
ansible-core = { url = "https://github.com/jumpserver/ansible/archive/refs/tags/v2.14.1.4.zip" }
|
||||
ansible = "7.1.0"
|
||||
ansible-runner = "2.3.3"
|
||||
asn1crypto = "1.5.1"
|
||||
@ -125,7 +125,7 @@ pymysql = "1.1.0"
|
||||
django-redis = "5.3.0"
|
||||
python-redis-lock = "4.0.0"
|
||||
pyopenssl = "23.2.0"
|
||||
redis = "4.6.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"
|
||||
|
Loading…
Reference in New Issue
Block a user