Files
SNMP-Influx-collector/cont/cisco/lob.py

114 lines
3.3 KiB
Python
Raw Normal View History

import os, asyncio
2026-03-17 19:38:27 +01:00
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
2026-03-17 19:38:27 +01:00
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)
2026-03-17 19:38:27 +01:00
# SNMPUSRDATA
USMUSRDATA = UsmUserData(
userName=SNMPUSER,
authKey=SNMPAUTHKEY,
privKey=SNMPPRIVKEY,
authProtocol=usmHMACSHAAuthProtocol,
privProtocol=usmAesCfb128Protocol,
)
snmpEngine = SnmpEngine()
2026-03-17 19:38:27 +01:00
iterator = get_cmd(
snmpEngine,
USMUSRDATA,
await UdpTransportTarget.create((remoteIP, SNMPORT)),
ContextData(),
# Get Hostname
2026-03-17 19:38:27 +01:00
ObjectType(ObjectIdentity(".1.3.6.1.2.1.1.5.0")), # 0
)
errorIndication, errorStatus, errorIndex, varBinds = await iterator
2026-03-17 19:38:27 +01:00
if errorIndication:
2026-03-17 19:38:27 +01:00
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]))
2026-03-17 19:38:27 +01:00
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()
2026-03-17 19:38:27 +01:00
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",
2026-03-17 19:38:27 +01:00
"device": "3750X",
"value": returObj,
2026-03-17 19:38:27 +01:00
"type": "C3750XciscoData"
}
2026-03-17 19:38:27 +01:00
await queueToInsrt.put(returnDict)