mirror of https://github.com/jumpserver/jumpserver
parent
88afabdd1d
commit
d6aea54722
|
@ -17,7 +17,8 @@ class GatherAccountsManager(AccountBasePlaybookManager):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.host_asset_mapper = {}
|
self.host_asset_mapper = {}
|
||||||
self.gathered_accounts = []
|
self.asset_account_info = {}
|
||||||
|
|
||||||
self.asset_username_mapper = defaultdict(set)
|
self.asset_username_mapper = defaultdict(set)
|
||||||
self.is_sync_account = self.execution.snapshot.get('is_sync_account')
|
self.is_sync_account = self.execution.snapshot.get('is_sync_account')
|
||||||
|
|
||||||
|
@ -46,49 +47,58 @@ class GatherAccountsManager(AccountBasePlaybookManager):
|
||||||
data.append(d)
|
data.append(d)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def update_or_create_accounts(self, asset, result):
|
def collect_asset_account_info(self, asset, result):
|
||||||
data = self.generate_data(asset, result)
|
data = self.generate_data(asset, result)
|
||||||
with tmp_to_org(asset.org_id):
|
self.asset_account_info[asset] = data
|
||||||
GatheredAccount.objects.filter(asset=asset, present=True).update(present=False)
|
|
||||||
for d in data:
|
|
||||||
username = d['username']
|
|
||||||
gathered_account, __ = GatheredAccount.objects.update_or_create(
|
|
||||||
defaults=d, asset=asset, username=username,
|
|
||||||
)
|
|
||||||
self.gathered_accounts.append(gathered_account)
|
|
||||||
|
|
||||||
def on_host_success(self, host, result):
|
def on_host_success(self, host, result):
|
||||||
info = result.get('debug', {}).get('res', {}).get('info', {})
|
info = result.get('debug', {}).get('res', {}).get('info', {})
|
||||||
asset = self.host_asset_mapper.get(host)
|
asset = self.host_asset_mapper.get(host)
|
||||||
if asset and info:
|
if asset and info:
|
||||||
result = self.filter_success_result(asset.type, info)
|
result = self.filter_success_result(asset.type, info)
|
||||||
self.update_or_create_accounts(asset, result)
|
self.collect_asset_account_info(asset, result)
|
||||||
else:
|
else:
|
||||||
logger.error(f'Not found {host} info')
|
logger.error(f'Not found {host} info')
|
||||||
|
|
||||||
def run(self, *args, **kwargs):
|
def update_or_create_accounts(self):
|
||||||
super().run(*args, **kwargs)
|
for asset, data in self.asset_account_info.items():
|
||||||
self.send_email_if_need()
|
with tmp_to_org(asset.org_id):
|
||||||
|
gathered_accounts = []
|
||||||
|
GatheredAccount.objects.filter(asset=asset, present=True).update(present=False)
|
||||||
|
for d in data:
|
||||||
|
username = d['username']
|
||||||
|
gathered_account, __ = GatheredAccount.objects.update_or_create(
|
||||||
|
defaults=d, asset=asset, username=username,
|
||||||
|
)
|
||||||
|
gathered_accounts.append(gathered_account)
|
||||||
if not self.is_sync_account:
|
if not self.is_sync_account:
|
||||||
return
|
return
|
||||||
GatheredAccount.sync_accounts(self.gathered_accounts)
|
GatheredAccount.sync_accounts(gathered_accounts)
|
||||||
|
|
||||||
def send_email_if_need(self):
|
def run(self, *args, **kwargs):
|
||||||
|
super().run(*args, **kwargs)
|
||||||
|
users, change_info = self.generate_send_users_and_change_info()
|
||||||
|
self.update_or_create_accounts()
|
||||||
|
self.send_email_if_need(users, change_info)
|
||||||
|
|
||||||
|
def generate_send_users_and_change_info(self):
|
||||||
recipients = self.execution.recipients
|
recipients = self.execution.recipients
|
||||||
if not self.asset_username_mapper or not recipients:
|
if not self.asset_username_mapper or not recipients:
|
||||||
return
|
return None, None
|
||||||
|
|
||||||
users = User.objects.filter(id__in=recipients)
|
users = User.objects.filter(id__in=recipients)
|
||||||
if not users:
|
if not users:
|
||||||
return
|
return users, None
|
||||||
|
|
||||||
asset_ids = self.asset_username_mapper.keys()
|
asset_ids = self.asset_username_mapper.keys()
|
||||||
assets = Asset.objects.filter(id__in=asset_ids)
|
assets = Asset.objects.filter(id__in=asset_ids)
|
||||||
|
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_map = {str(asset.id): asset for asset in assets}
|
||||||
asset_qs = assets.values_list('id', 'accounts__username')
|
asset_id_username = list(assets.values_list('id', 'accounts__username'))
|
||||||
system_asset_username_mapper = defaultdict(set)
|
asset_id_username.extend(list(gather_accounts.values_list('asset_id', 'username')))
|
||||||
|
|
||||||
for asset_id, username in asset_qs:
|
system_asset_username_mapper = defaultdict(set)
|
||||||
|
for asset_id, username in asset_id_username:
|
||||||
system_asset_username_mapper[str(asset_id)].add(username)
|
system_asset_username_mapper[str(asset_id)].add(username)
|
||||||
|
|
||||||
change_info = {}
|
change_info = {}
|
||||||
|
@ -110,7 +120,11 @@ class GatherAccountsManager(AccountBasePlaybookManager):
|
||||||
'remove_usernames': ', '.join(remove_usernames),
|
'remove_usernames': ', '.join(remove_usernames),
|
||||||
}
|
}
|
||||||
|
|
||||||
if not change_info:
|
return users, change_info
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def send_email_if_need(users, change_info):
|
||||||
|
if not users or not change_info:
|
||||||
return
|
return
|
||||||
|
|
||||||
for user in users:
|
for user in users:
|
||||||
|
|
Loading…
Reference in New Issue