Compare commits

...

29 Commits
dev ... v3.10.7

Author SHA1 Message Date
fit2bot
4f34ce5edb feat: Update v3.10.7 2024-03-26 11:42:08 +08:00
Bai
c49c394b5b perf: Update poetry.lock 2024-03-25 14:23:32 +08:00
wangruidong
a0f27a9476 fix: 修复 redis lock 导致 celery 异步任务卡住不执行的问题 2024-03-25 14:17:11 +08:00
Bai
5af6f89229 perf: Update poetry.lock 2024-03-22 17:24:21 +08:00
ibuler
adbd73182b fix: ansible playbook render and run in localhost 2024-03-22 17:05:56 +08:00
wangruidong
eb9f261459 fix: 作业命令用户隔离执行 2024-03-19 11:26:20 +08:00
wangruidong
c4d99ed8e2 fix: Another user can use this job id to spoof both the file name and
its contents
2024-03-18 14:21:46 +08:00
Bai
8d01c189f0 fix: 修复 Playbook 脚本文件问题 2024-03-14 11:40:42 +08:00
Bryan
a2701090de
fix: 修复连接 Token 时报错的问题((1139, "Got error empty (sub)expression from regexp")) (#12769) 2024-03-07 12:37:12 +08:00
wangruidong
4582aa0a09 fix: 个别页面搜索不生效的问题 2024-03-05 11:19:58 +08:00
wangruidong
c7c379479f fix: 个别页面搜索不生效的问题 2024-03-05 11:19:58 +08:00
wangruidong
ce4479c23e fix: 控制台-仪表盘会话用户,资产排名不对 2024-03-04 11:13:46 +08:00
Bryan
eedc2f1b41
Merge pull request #12734 from jumpserver/master
v3.10.4 (branch-v3.10)
2024-02-29 16:39:55 +08:00
Bryan
7ba24293d1
Merge pull request #12736 from jumpserver/pr@dev@master_fix
fix: 解决冲突
2024-02-29 16:38:43 +08:00
Bai
f10114c9ed fix: 解决冲突 2024-02-29 16:37:10 +08:00
Bryan
cf31cbfb07
Merge pull request #12729 from jumpserver/dev
v3.10.4
2024-02-29 16:19:59 +08:00
wangruidong
0edad24d5d fix: 资产过期消息提示发送失败 2024-02-04 11:41:48 +08:00
ibuler
1f1c1a9157 fix: 修复定时检测用户是否活跃任务无法执行的问题 2024-01-23 09:28:38 +00:00
feng
6c9d271ae1 fix: redis 密码有特殊字符celery beat启动失败 2024-01-22 06:18:34 +00:00
Bai
6ff852e225 perf: 修复 Count 时没有去重的问题 2024-01-22 06:16:25 +00:00
Bryan
baa75dc735
Merge pull request #12566 from jumpserver/master
v3.10.2
2024-01-17 07:34:28 -04:00
Bryan
8a9f0436b8
Merge pull request #12565 from jumpserver/dev
v3.10.2
2024-01-17 07:23:30 -04:00
Bryan
a9620a3cbe
Merge pull request #12461 from jumpserver/master
v3.10.1
2023-12-29 11:33:05 +05:00
Bryan
769e7dc8a0
Merge pull request #12460 from jumpserver/dev
v3.10.1
2023-12-29 11:20:36 +05:00
Bryan
2a70449411
Merge pull request #12458 from jumpserver/dev
v3.10.1
2023-12-29 11:01:13 +05:00
Bryan
8df720f19e
Merge pull request #12401 from jumpserver/dev
v3.10
2023-12-21 15:14:19 +05:00
老广
dabbb45f6e
Merge pull request #12144 from jumpserver/dev
v3.9.0
2023-11-16 18:23:05 +08:00
Bryan
ce24c1c3fd
Merge pull request #11914 from jumpserver/dev
v3.8.0
2023-10-19 03:37:39 -05:00
Bryan
3c54c82ce9
Merge pull request #11636 from jumpserver/dev
v3.7.0
2023-09-21 17:02:48 +08:00
20 changed files with 107 additions and 72 deletions

1
GITSHA Normal file
View File

@ -0,0 +1 @@
c49c394b5bb011373202b31aef3f29b53a25e10d

View File

@ -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

View File

@ -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')

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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()

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d04781f4f0b0de3ac5f707febb222e239553d6103bca0cec41ab2fd5ab044571
size 173799
oid sha256:1e0d36c8c54579103b6b550971fa4282581eb503c9499df55e37b0164391b607
size 173954

View File

@ -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 "利用できないアカウント"

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e66a6fa05d25f1c502f95001b5ff0d0a310affd32eac939fd7b840845028074f
size 142298
oid sha256:931e599c8b599a5b58754a6e64cb9aa0db3d69ed76a703d30fb455e9cc10996c
size 142396

View File

@ -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 "账号无效"

View File

@ -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()

View File

@ -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,

View File

@ -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:

View File

@ -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

View File

@ -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
View File

@ -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"

View File

@ -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"