import threading from pydantic import BaseModel from lib.logger import logger from providers.aws.aws_provider import generate_regional_clients ################### WAF class WAF: def __init__(self, audit_info): self.service = "waf-regional" self.session = audit_info.audit_session self.regional_clients = generate_regional_clients(self.service, audit_info) self.web_acls = [] self.__threading_call__(self.__list_web_acls__) self.__threading_call__(self.__list_resources_for_web_acl__) def __get_session__(self): return self.session def __threading_call__(self, call): threads = [] for regional_client in self.regional_clients.values(): threads.append(threading.Thread(target=call, args=(regional_client,))) for t in threads: t.start() for t in threads: t.join() def __list_web_acls__(self, regional_client): logger.info("WAF - Listing Regional Web ACLs...") try: for waf in regional_client.list_web_acls()["WebACLs"]: self.web_acls.append( WebAcl( name=waf["Name"], id=waf["WebACLId"], albs=[], region=regional_client.region, ) ) except Exception as error: logger.error( f"{regional_client.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}" ) def __list_resources_for_web_acl__(self, regional_client): logger.info("WAF - Describing resources...") try: for acl in self.web_acls: if acl.region == regional_client.region: for resource in regional_client.list_resources_for_web_acl( WebACLId=acl.id, ResourceType="APPLICATION_LOAD_BALANCER" )["ResourceArns"]: acl.albs.append(resource) except Exception as error: logger.error( f"{regional_client.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}" ) class WebAcl(BaseModel): name: str id: str albs: list[str] region: str