2
0
mirror of https://github.com/xcat2/confluent.git synced 2026-04-02 23:36:26 +00:00

Fixes for async snmp and SRLinux

This commit is contained in:
Jarrod Johnson
2026-02-20 09:29:03 -05:00
parent f28e6d32f3
commit 7adea90169
2 changed files with 17 additions and 19 deletions

View File

@@ -192,7 +192,7 @@ async def detect_backend(switch, verifier):
if retcode == 400 and apicheck.startswith(b'{"imdata":['):
_fastbackends[switch] = 'nxapi'
else:
rsp = wc.grab_json_response_with_status('/jsonrpc', {'dummy': 'data'}, returnheaders=True)
rsp = await wc.grab_response_with_status('/jsonrpc', {'dummy': 'data'}, expect_type='json')
if rsp[1] == 401 and rsp[2].get('WWW-Authenticate', '').startswith('Basic realm="SRLinux"'):
_fastbackends[switch] = 'srlinux'
return _fastbackends.get(switch, None)
@@ -300,41 +300,44 @@ async def _extract_neighbor_data_b(args):
pass
conn = snmp.Session(switch, password, user, privacy_protocol=privproto)
sid = None
for sysid in conn.walk('1.3.6.1.2.1.1.2'):
async for sysid in conn.walk('1.3.6.1.2.1.1.2'):
sid = str(sysid[1][6:])
_noaffluent.add(switch)
idxtoifname = {}
idxtoportid = {}
_chassisidbyswitch[switch] = sanitize(list(
conn.walk('1.0.8802.1.1.2.1.3.2'))[0][1])
for oidindex in conn.walk('1.0.8802.1.1.2.1.3.7.1.3'):
async for cid in conn.walk('1.0.8802.1.1.2.1.3.2'):
_chassisidbyswitch[switch] = sanitize(cid[1])
break
#_chassisidbyswitch[switch] = sanitize(list(
# conn.walk('1.0.8802.1.1.2.1.3.2'))[0][1])
async for oidindex in conn.walk('1.0.8802.1.1.2.1.3.7.1.3'):
idx = oidindex[0][-1]
idxtoportid[idx] = sanitize(oidindex[1])
for oidindex in conn.walk('1.0.8802.1.1.2.1.3.7.1.4'):
async for oidindex in conn.walk('1.0.8802.1.1.2.1.3.7.1.4'):
idx = oidindex[0][-1]
idxtoifname[idx] = _lldpdesc_to_ifname(sid, idx, str(oidindex[1]))
for remotedesc in conn.walk('1.0.8802.1.1.2.1.4.1.1.10'):
async for remotedesc in conn.walk('1.0.8802.1.1.2.1.4.1.1.10'):
iname = idxtoifname.get(remotedesc[0][-2],
idxtoportid.get(remotedesc[0][-2], None))
if iname is None:
continue
_init_lldp(lldpdata, iname, remotedesc[0][-2], idxtoportid, switch)
_extract_extended_desc(lldpdata[iname], remotedesc[1], user)
for remotename in conn.walk('1.0.8802.1.1.2.1.4.1.1.9'):
async for remotename in conn.walk('1.0.8802.1.1.2.1.4.1.1.9'):
iname = idxtoifname.get(remotename[0][-2],
idxtoportid.get(remotename[0][-2], None))
if iname is None:
continue
_init_lldp(lldpdata, iname, remotename[0][-2], idxtoportid, switch)
lldpdata[iname]['peername'] = str(remotename[1])
for remotename in conn.walk('1.0.8802.1.1.2.1.4.1.1.7'):
async for remotename in conn.walk('1.0.8802.1.1.2.1.4.1.1.7'):
iname = idxtoifname.get(remotename[0][-2],
idxtoportid.get(remotename[0][-2], None))
if iname is None:
continue
_init_lldp(lldpdata, iname, remotename[0][-2], idxtoportid, switch)
lldpdata[iname]['peerportid'] = sanitize(remotename[1])
for remoteid in conn.walk('1.0.8802.1.1.2.1.4.1.1.5'):
async for remoteid in conn.walk('1.0.8802.1.1.2.1.4.1.1.5'):
iname = idxtoifname.get(remoteid[0][-2],
idxtoportid.get(remoteid[0][-2], None))
if iname is None:

View File

@@ -25,20 +25,15 @@ import asyncio
import confluent.exceptions as exc
import socket
import pysnmp.hlapi.asyncio as snmp
import pysnmp.smi.rfc1902 as rfc1902
async def _get_transport(name):
# Annoyingly, pysnmp does not automatically determine ipv6 v ipv4
res = await asyncio.get_event_loop().getaddrinfo(name, 161, type=socket.SOCK_DGRAM)
if res[0][0] == socket.AF_INET6:
if asyn:
return _run_coro(snmp.Udp6TransportTarget.create(res[0][4], 2))
else:
return snmp.Udp6TransportTarget(res[0][4], 2)
return await snmp.Udp6TransportTarget.create(res[0][4], 2)
else:
if asyn:
return _run_coro(snmp.UdpTransportTarget.create(res[0][4], 2))
else:
return snmp.UdpTransportTarget(res[0][4], 2)
return await snmp.UdpTransportTarget.create(res[0][4], 2)
class Session(object):
@@ -98,7 +93,7 @@ class Session(object):
obj = snmp.ObjectType(snmp.ObjectIdentity(mib, field))
else:
obj = rfc1902.ObjectType(rfc1902.ObjectIdentity(oid))
walking = snmp.bulkCmd(self.eng, self.authdata, tp, ctx, 0, 10, obj,
walking = snmp.bulk_walk_cmd(self.eng, self.authdata, tp, ctx, 0, 10, obj,
lexicographicMode=False, lookupMib=resolvemib)
async for rsp in walking:
errstr, errnum, erridx, answers = rsp