Skip to content

Commit b4453ba

Browse files
committed
fixes issue with revers lookups and python 3.14 #499
1 parent c6993ae commit b4453ba

5 files changed

Lines changed: 22 additions & 19 deletions

File tree

module/common/support.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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()}

module/netbox/inventory.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
# repository or visit: <https://opensource.org/licenses/MIT>.
99

1010
import json
11+
import asyncio
1112

1213
from module.netbox import *
1314
from module.common.misc import grab
@@ -428,7 +429,7 @@ def query_ptr_records_for_all_ips(self):
428429
continue
429430

430431
# get DNS names for IP addresses:
431-
records = perform_ptr_lookups(data.get("ips"), data.get("servers"))
432+
records = asyncio.run(perform_ptr_lookups(data.get("ips"), data.get("servers")))
432433

433434
for ip in self.get_all_items(NBIPAddress):
434435

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ license = "MIT"
1010
license-files = ["LICENSE.txt"]
1111
requires-python = ">=3.13"
1212
dependencies = [
13-
"aiodns>=4.0.0",
13+
"aiodns>=4.0.3",
1414
"hcloud>=2.20.0",
1515
"packaging>=26.2",
1616
"pyvmomi==9.1.0.0",
1717
"pyyaml>=6.0.3",
18-
"requests>=2.34.1",
18+
"requests>=2.34.2",
1919
"setuptools==82.0.1",
2020
"urllib3>=2.7.0",
2121
"wheel>=0.47.0",

requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
aiodns==4.0.0
1+
aiodns==4.0.3
22
certifi==2026.1.4
33
cffi==2.0.0
44
charset-normalizer==3.4.4
@@ -10,7 +10,7 @@ pycparser==3.0
1010
python-dateutil==2.9.0.post0
1111
pyvmomi==9.1.0.0
1212
pyyaml==6.0.3
13-
requests==2.34.1
13+
requests==2.34.2
1414
setuptools==82.0.1
1515
six==1.17.0
1616
urllib3==2.7.0

uv.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)