@@ -44,7 +44,7 @@ def normalize_mac_address(mac_address=None):
4444 return mac_address
4545
4646
47- def perform_ptr_lookups (ips , dns_servers = None ):
47+ async def perform_ptr_lookups (ips , dns_servers = None ):
4848 """
4949 Perform DNS reverse lookups for IP addresses to find corresponding DNS name
5050
@@ -60,9 +60,7 @@ def perform_ptr_lookups(ips, dns_servers=None):
6060 dict: of {"ip": "hostname"} for requested ips, hostname will be None if no hostname returned
6161 """
6262
63- loop = asyncio .get_event_loop ()
64-
65- resolver = aiodns .DNSResolver (loop = loop )
63+ resolver = aiodns .DNSResolver ()
6664
6765 if dns_servers is not None :
6866 if isinstance (dns_servers , list ):
@@ -71,8 +69,12 @@ def perform_ptr_lookups(ips, dns_servers=None):
7169 else :
7270 log .error (f"List of provided DNS servers invalid: { dns_servers } " )
7371
74- queue = asyncio .gather (* (reverse_lookup (resolver , ip ) for ip in ips ))
75- results = loop .run_until_complete (queue )
72+ # TaskGroup is faster than gather in 3.14 and provides better error safety
73+ async with asyncio .TaskGroup () as tg :
74+ tasks = [tg .create_task (reverse_lookup (resolver , ip )) for ip in ips ]
75+
76+ # After the 'async with' block, all tasks are guaranteed complete
77+ results = [task .result () for task in tasks ]
7678
7779 # return dictionary instead of a list of dictionaries
7880 return {k : v for x in results for k , v in x .items ()}
0 commit comments