import os, asyncio from models.ciscoModel import C3750XciscoData from models.snmpTimeOut import SNMPTimeoutError from snmp.walker import walk_column_v3, walk_lobotomy_column_v3 from typing import Annotated, Final # SNMP from pysnmp.hlapi.v3arch.asyncio import * # Cisco async def lobGetRemote( remoteIP: str, queueToInsrt: asyncio.Queue, SNMPUSER: str, SNMPAUTHKEY: str, SNMPPRIVKEY: str, ROUND_PREC: int = 2, SNMPORT: int = 161 ): print("starting work on ", remoteIP) # SNMPUSRDATA USMUSRDATA = UsmUserData( userName=SNMPUSER, authKey=SNMPAUTHKEY, privKey=SNMPPRIVKEY, authProtocol=usmHMACSHAAuthProtocol, privProtocol=usmAesCfb128Protocol, ) snmpEngine = SnmpEngine() iterator = get_cmd( snmpEngine, USMUSRDATA, await UdpTransportTarget.create((remoteIP, SNMPORT)), ContextData(), # Get Hostname ObjectType(ObjectIdentity(".1.3.6.1.2.1.1.5.0")), # 0 ) errorIndication, errorStatus, errorIndex, varBinds = await iterator if errorIndication: print(f"\n\n{errorIndication}\n\n") if "No SNMP response received before timeout" in str(errorIndication): raise SNMPTimeoutError(f"Host {remoteIP} timed out while walking") raise RuntimeError(errorIndication) elif errorStatus: print( "{} at {}".format( errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or "?", ) ) else: for varBind in varBinds: print(" = ".join([x.prettyPrint() for x in varBind])) try: # System data systemData = await walk_lobotomy_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.9.9.13.1.3", SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY) # Uptime in seconds uptimeSeconds = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.6.3.10.2.1.3", SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY) # Last 5 second CPU usage last5SecCPUsage = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.9.2.1.56", SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY) # Last minute CPU usage last1MinCPUsage = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.9.2.1.58", SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY) # Last 5 minutes CPU usage last5MinCPUsage = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.9.2.1.58", SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY) except SNMPTimeoutError as e: print(f"{e}\nContinuing regardless...") return 1 except RuntimeError as e: print(f"SNMP error on {remoteIP}: {e}") return 1 snmpEngine.close_dispatcher() returObj = C3750XciscoData( hostname=varBinds[0][-1], systemStatus=systemData[0].split(" ")[2], #[2], systemTemp=systemData[1], #[2][-1], last5SecUsage=last5SecCPUsage[0], last1MinUsage=last1MinCPUsage[0], last5MinUsage=last5MinCPUsage[0], uptimeS=int(uptimeSeconds[0]) ) returnDict = { "source": "CISCO", "device": "3750X", "value": returObj, "type": "C3750XciscoData" } await queueToInsrt.put(returnDict)