From 7adea90169c777c18e697f36d06235f4cca2aa07 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Fri, 20 Feb 2026 09:29:03 -0500 Subject: [PATCH] Fixes for async snmp and SRLinux --- confluent_server/confluent/networking/lldp.py | 23 +++++++++++-------- confluent_server/confluent/snmputil.py | 13 ++++------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/confluent_server/confluent/networking/lldp.py b/confluent_server/confluent/networking/lldp.py index 3bc0a5c0..35697dbb 100644 --- a/confluent_server/confluent/networking/lldp.py +++ b/confluent_server/confluent/networking/lldp.py @@ -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: diff --git a/confluent_server/confluent/snmputil.py b/confluent_server/confluent/snmputil.py index 895e6d01..fd82fa07 100644 --- a/confluent_server/confluent/snmputil.py +++ b/confluent_server/confluent/snmputil.py @@ -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