Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 25 additions & 16 deletions ansible/library/snmp_facts.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from pysnmp.hlapi.v3arch.asyncio import (
cmdgen,
UdpTransportTarget,
Udp6TransportTarget,
get_cmd,
walk_cmd,
SnmpEngine,
Expand Down Expand Up @@ -327,30 +328,38 @@ def lookup_operstatus(int_operstatus):
return operstatus_options.get(int_operstatus, "")


def _create_transport_target(host, port=161, timeout=20):
"""Create appropriate transport target based on address family."""
def is_ipv6_address(host):
try:
# Try to resolve the hostname and determine if it's IPv4 or IPv6
addr_info = ipaddress.ip_address(host)
if addr_info.version == 6:
return cmdgen.Udp6TransportTarget((host, port), timeout=timeout)
else:
return cmdgen.UdpTransportTarget((host, port), timeout=timeout)
return ipaddress.ip_address(host).version == 6
except ValueError:
# If host is not a direct IP, try to resolve it
import socket
try:
# Try IPv4 first
socket.inet_pton(socket.AF_INET, socket.gethostbyname(host))
return cmdgen.UdpTransportTarget((host, port), timeout=timeout)
return False
except (socket.error, socket.gaierror):
try:
# Try IPv6
socket.inet_pton(socket.AF_INET6, socket.getaddrinfo(host, None, socket.AF_INET6)[0][4][0])
return cmdgen.Udp6TransportTarget((host, port), timeout=timeout)
return True
except (socket.error, socket.gaierror):
# Default to IPv4 if resolution fails
return cmdgen.UdpTransportTarget((host, port), timeout=timeout)
return False


async def _create_transport_target_async(host, port=161, timeout=20):
"""Create appropriate transport target based on address family."""
if is_ipv6_address(host):
return await Udp6TransportTarget.create((host, port), timeout=timeout)
else:
return await UdpTransportTarget.create((host, port), timeout=timeout)


def _create_transport_target(host, port=161, timeout=20):
"""Create appropriate transport target based on address family."""
if is_ipv6_address(host):
return cmdgen.Udp6TransportTarget((host, port), timeout=timeout)
else:
return cmdgen.UdpTransportTarget((host, port), timeout=timeout)


def decode_type(module, current_oid, val):
Expand Down Expand Up @@ -1166,9 +1175,9 @@ def _init_auth(self):
)

async def setup(self):
self.transport = await UdpTransportTarget.create(
(self.m_args['host'], 161),
timeout=self.m_args['timeout']
self.transport = await _create_transport_target_async(
self.m_args['host'], 161,
timeout=self.m_args['timeout']
)

async def _collect_system(self):
Expand Down
Loading