mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-12-15 16:42:34 +00:00
Compare commits
10 Commits
pr@dev@top
...
v3.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07dfcc45bd | ||
|
|
012da07999 | ||
|
|
d6c22dd485 | ||
|
|
d1e5559a7b | ||
|
|
5fddd0b02b | ||
|
|
11232871a2 | ||
|
|
3f6c3c3dbb | ||
|
|
675516f6da | ||
|
|
234554060a | ||
|
|
afc7232bd9 |
@@ -81,7 +81,7 @@ class AccountAssetSerializer(serializers.ModelSerializer):
|
||||
|
||||
def to_internal_value(self, data):
|
||||
if isinstance(data, dict):
|
||||
i = data.get('id')
|
||||
i = data.get('id') or data.get('pk')
|
||||
else:
|
||||
i = data
|
||||
|
||||
|
||||
@@ -71,7 +71,8 @@ class AssetAccountSerializer(
|
||||
template = serializers.BooleanField(
|
||||
default=False, label=_("Template"), write_only=True
|
||||
)
|
||||
name = serializers.CharField(max_length=128, required=True, label=_("Name"))
|
||||
name = serializers.CharField(max_length=128, required=False, label=_("Name"))
|
||||
secret_type = serializers.CharField(max_length=64, default='password', label=_("Secret type"))
|
||||
|
||||
class Meta:
|
||||
model = Account
|
||||
|
||||
@@ -111,7 +111,7 @@ class BaseFileParser(BaseParser):
|
||||
return {'pk': obj_id, 'name': obj_name}
|
||||
|
||||
def parse_value(self, field, value):
|
||||
if value is '-':
|
||||
if value == '-' and field and field.allow_null:
|
||||
return None
|
||||
elif hasattr(field, 'to_file_internal_value'):
|
||||
value = field.to_file_internal_value(value)
|
||||
|
||||
@@ -139,12 +139,12 @@ class JMSInventory:
|
||||
self.make_ssh_account_vars(host, asset, account, automation, protocols, platform, gateway)
|
||||
return host
|
||||
|
||||
def get_asset_accounts(self, asset):
|
||||
from assets.const import Connectivity
|
||||
accounts = asset.accounts.filter(is_active=True).order_by('-privileged', '-date_updated')
|
||||
accounts_connectivity_ok = list(accounts.filter(connectivity=Connectivity.OK))
|
||||
accounts_connectivity_no = list(accounts.exclude(connectivity=Connectivity.OK))
|
||||
return accounts_connectivity_ok + accounts_connectivity_no
|
||||
def get_asset_sorted_accounts(self, asset):
|
||||
accounts = list(asset.accounts.filter(is_active=True))
|
||||
connectivity_score = {'ok': 2, '-': 1, 'err': 0}
|
||||
sort_key = lambda x: (x.privileged, connectivity_score.get(x.connectivity, 0), x.date_updated)
|
||||
accounts_sorted = sorted(accounts, key=sort_key, reverse=True)
|
||||
return accounts_sorted
|
||||
|
||||
@staticmethod
|
||||
def get_account_prefer(account_prefer):
|
||||
@@ -163,28 +163,23 @@ class JMSInventory:
|
||||
return account
|
||||
|
||||
def select_account(self, asset):
|
||||
accounts = self.get_asset_accounts(asset)
|
||||
if not accounts or self.account_policy == 'skip':
|
||||
accounts = self.get_asset_sorted_accounts(asset)
|
||||
if not accounts:
|
||||
return None
|
||||
account_selected = None
|
||||
|
||||
# 首先找到特权账号
|
||||
privileged_accounts = list(filter(lambda account: account.privileged, accounts))
|
||||
refer_account = self.get_refer_account(accounts)
|
||||
if refer_account:
|
||||
return refer_account
|
||||
|
||||
# 不同类型的账号选择,优先使用提供的名称
|
||||
refer_privileged_account = self.get_refer_account(privileged_accounts)
|
||||
if self.account_policy in ['privileged_only', 'privileged_first']:
|
||||
first_privileged = privileged_accounts[0] if privileged_accounts else None
|
||||
account_selected = refer_privileged_account or first_privileged
|
||||
|
||||
# 此策略不管是否匹配到账号都需强制返回
|
||||
if self.account_policy == 'privileged_only':
|
||||
account_selected = accounts[0]
|
||||
if self.account_policy == 'skip':
|
||||
return None
|
||||
elif self.account_policy == 'privileged_first':
|
||||
return account_selected
|
||||
|
||||
if not account_selected:
|
||||
account_selected = self.get_refer_account(accounts)
|
||||
|
||||
return account_selected or accounts[0]
|
||||
elif self.account_policy == 'privileged_only' and account_selected.privileged:
|
||||
return account_selected
|
||||
else:
|
||||
return None
|
||||
|
||||
def generate(self, path_dir):
|
||||
hosts = []
|
||||
|
||||
@@ -46,7 +46,7 @@ class JMSPermedInventory(JMSInventory):
|
||||
self.user = user
|
||||
self.assets_accounts_mapper = self.get_assets_accounts_mapper()
|
||||
|
||||
def get_asset_accounts(self, asset):
|
||||
def get_asset_sorted_accounts(self, asset):
|
||||
return self.assets_accounts_mapper.get(asset.id, [])
|
||||
|
||||
def get_assets_accounts_mapper(self):
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
|
||||
from django.db.models import Q, QuerySet
|
||||
from django.db.models import Q
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from rest_framework import serializers
|
||||
|
||||
@@ -119,7 +118,10 @@ class AssetPermissionSerializer(BulkOrgResourceModelSerializer):
|
||||
return
|
||||
assets = self.get_all_assets(nodes, assets)
|
||||
accounts = self.create_accounts(assets)
|
||||
push_accounts_to_assets_task.delay([str(account.id) for account in accounts])
|
||||
account_ids = [str(account.id) for account in accounts]
|
||||
slice_count = 20
|
||||
for i in range(0, len(account_ids), slice_count):
|
||||
push_accounts_to_assets_task.delay(account_ids[i:i + slice_count])
|
||||
|
||||
def validate_accounts(self, usernames: list[str]):
|
||||
template_ids = []
|
||||
|
||||
Reference in New Issue
Block a user