Skip to content

Commit 15b5917

Browse files
nikamirrrselldinesh
authored andcommitted
Fix IPv6 compatibility in snmp_facts.py (sonic-net#22411)
Signed-off-by: selldinesh <[email protected]>
1 parent bbdda72 commit 15b5917

1 file changed

Lines changed: 25 additions & 16 deletions

File tree

ansible/library/snmp_facts.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from pysnmp.hlapi.v3arch.asyncio import (
3737
cmdgen,
3838
UdpTransportTarget,
39+
Udp6TransportTarget,
3940
get_cmd,
4041
walk_cmd,
4142
SnmpEngine,
@@ -327,30 +328,38 @@ def lookup_operstatus(int_operstatus):
327328
return operstatus_options.get(int_operstatus, "")
328329

329330

330-
def _create_transport_target(host, port=161, timeout=20):
331-
"""Create appropriate transport target based on address family."""
331+
def is_ipv6_address(host):
332332
try:
333-
# Try to resolve the hostname and determine if it's IPv4 or IPv6
334-
addr_info = ipaddress.ip_address(host)
335-
if addr_info.version == 6:
336-
return cmdgen.Udp6TransportTarget((host, port), timeout=timeout)
337-
else:
338-
return cmdgen.UdpTransportTarget((host, port), timeout=timeout)
333+
return ipaddress.ip_address(host).version == 6
339334
except ValueError:
340-
# If host is not a direct IP, try to resolve it
341335
import socket
342336
try:
343337
# Try IPv4 first
344338
socket.inet_pton(socket.AF_INET, socket.gethostbyname(host))
345-
return cmdgen.UdpTransportTarget((host, port), timeout=timeout)
339+
return False
346340
except (socket.error, socket.gaierror):
347341
try:
348342
# Try IPv6
349343
socket.inet_pton(socket.AF_INET6, socket.getaddrinfo(host, None, socket.AF_INET6)[0][4][0])
350-
return cmdgen.Udp6TransportTarget((host, port), timeout=timeout)
344+
return True
351345
except (socket.error, socket.gaierror):
352-
# Default to IPv4 if resolution fails
353-
return cmdgen.UdpTransportTarget((host, port), timeout=timeout)
346+
return False
347+
348+
349+
async def _create_transport_target_async(host, port=161, timeout=20):
350+
"""Create appropriate transport target based on address family."""
351+
if is_ipv6_address(host):
352+
return await Udp6TransportTarget.create((host, port), timeout=timeout)
353+
else:
354+
return await UdpTransportTarget.create((host, port), timeout=timeout)
355+
356+
357+
def _create_transport_target(host, port=161, timeout=20):
358+
"""Create appropriate transport target based on address family."""
359+
if is_ipv6_address(host):
360+
return cmdgen.Udp6TransportTarget((host, port), timeout=timeout)
361+
else:
362+
return cmdgen.UdpTransportTarget((host, port), timeout=timeout)
354363

355364

356365
def decode_type(module, current_oid, val):
@@ -1166,9 +1175,9 @@ def _init_auth(self):
11661175
)
11671176

11681177
async def setup(self):
1169-
self.transport = await UdpTransportTarget.create(
1170-
(self.m_args['host'], 161),
1171-
timeout=self.m_args['timeout']
1178+
self.transport = await _create_transport_target_async(
1179+
self.m_args['host'], 161,
1180+
timeout=self.m_args['timeout']
11721181
)
11731182

11741183
async def _collect_system(self):

0 commit comments

Comments
 (0)