mirror of https://github.com/jumpserver/jumpserver
perf: 测试资产可连接性选择账号策略优化 (#9954)
parent
ffe9dd1f95
commit
07eebd93fb
|
@ -17,7 +17,7 @@ class JMSInventory:
|
|||
:param account_policy: privileged_only, privileged_first, skip
|
||||
"""
|
||||
self.assets = self.clean_assets(assets)
|
||||
self.account_prefer = account_prefer
|
||||
self.account_prefer = self.get_account_prefer(account_prefer)
|
||||
self.account_policy = account_policy
|
||||
self.host_callback = host_callback
|
||||
self.exclude_hosts = {}
|
||||
|
@ -146,33 +146,45 @@ class JMSInventory:
|
|||
accounts_connectivity_no = list(accounts.exclude(connectivity=Connectivity.OK))
|
||||
return accounts_connectivity_ok + accounts_connectivity_no
|
||||
|
||||
@staticmethod
|
||||
def get_account_prefer(account_prefer):
|
||||
account_usernames = []
|
||||
if isinstance(account_prefer, str) and account_prefer:
|
||||
account_usernames = list(map(lambda x: x.lower(), account_prefer.split(',')))
|
||||
return account_usernames
|
||||
|
||||
def get_refer_account(self, accounts):
|
||||
account = None
|
||||
if accounts:
|
||||
account = list(filter(
|
||||
lambda a: a.username.lower() in self.account_prefer, accounts
|
||||
))
|
||||
account = account[0] if account else None
|
||||
return account
|
||||
|
||||
def select_account(self, asset):
|
||||
accounts = self.get_asset_accounts(asset)
|
||||
if not accounts:
|
||||
if not accounts or self.account_policy == 'skip':
|
||||
return None
|
||||
account_selected = None
|
||||
account_usernames = self.account_prefer
|
||||
|
||||
if isinstance(self.account_prefer, str) and account_usernames:
|
||||
account_usernames = self.account_prefer.split(',')
|
||||
|
||||
# 优先使用提供的名称
|
||||
if account_usernames:
|
||||
account_matched = list(filter(lambda account: account.username in account_usernames, accounts))
|
||||
account_selected = account_matched[0] if account_matched else None
|
||||
|
||||
if account_selected or self.account_policy == 'skip':
|
||||
return account_selected
|
||||
# 首先找到特权账号
|
||||
privileged_accounts = list(filter(lambda account: account.privileged, accounts))
|
||||
|
||||
# 不同类型的账号选择,优先使用提供的名称
|
||||
refer_privileged_account = self.get_refer_account(privileged_accounts)
|
||||
if self.account_policy in ['privileged_only', 'privileged_first']:
|
||||
account_selected = accounts[0] if accounts else None
|
||||
first_privileged = privileged_accounts[0] if privileged_accounts else None
|
||||
account_selected = refer_privileged_account or first_privileged
|
||||
|
||||
if account_selected:
|
||||
# 此策略不管是否匹配到账号都需强制返回
|
||||
if self.account_policy == 'privileged_only':
|
||||
return account_selected
|
||||
|
||||
if self.account_policy == 'privileged_first':
|
||||
account_selected = accounts[0] if accounts else None
|
||||
return account_selected
|
||||
if not account_selected:
|
||||
account_selected = self.get_refer_account(accounts)
|
||||
|
||||
return account_selected or accounts[0]
|
||||
|
||||
def generate(self, path_dir):
|
||||
hosts = []
|
||||
|
|
Loading…
Reference in New Issue