114 lines
3.3 KiB
Python
114 lines
3.3 KiB
Python
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)
|