Compare commits

..

4 Commits

Author SHA1 Message Date
e06eea68cd Added customizable poolig interval 2026-03-07 22:02:37 +01:00
c9d07e7cef Added timeout exception for timeoud handling 2026-03-07 22:00:53 +01:00
10d14a06db Added a custom exception for timeout handling 2026-03-07 22:00:38 +01:00
78d240a1fc Added timeout crash avoidance 2026-03-06 22:59:56 +01:00
5 changed files with 54 additions and 26 deletions

View File

@@ -71,7 +71,7 @@ async def idrac7_8PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue):
for oid, val in mainVarBinds:
print(f"{oid.prettyPrint()} = {val.prettyPrint()}")
try:
# Get PSU1 current, [PSU2 current], total board power draw in watts
currentsCurrentResults = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.600.30.1.6")
# PSU1 OID name, [PSU2 OID name], system board power draw
@@ -89,9 +89,14 @@ async def idrac7_8PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue):
hasCPU2 = any("cpu2" in str(thing).lower() for thing in sensorNamesResults.values())
hasPSU2 = any("ps2" in str(thing).lower() for thing in currentsNamesResults.values())
snmpEngine.close_dispatcher()
except SNMPTimeoutError as e:
print(f"{e}\nContinuing regardless...")
return 1
except RuntimeError as e:
print(f"SNMP error on {remoteIP}: {e}")
return 1
print(voltResult)
snmpEngine.close_dispatcher()
# Exhaust CPU1 and CPU2 temp

View File

@@ -1,6 +1,10 @@
import os, asyncio
from models.idracModel import snmpPyIDRACData
from models.snmpTimeOut import SNMPTimeoutError
from snmp.walker import walk_column_v3
from typing import Annotated, Final
# SNMP
@@ -56,6 +60,10 @@ async def idrac9PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue):
errorIndication, errorStatus, errorIndex, mainVarBinds = await iterator
if errorIndication:
if errorIndication == "No SNMP response received before timeout":
print(f"Host {remoteIP} timed out.\nContinuing...")
snmpEngine.close_dispatcher()
return 1
print(errorIndication)
elif errorStatus:
print(
@@ -69,6 +77,7 @@ async def idrac9PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue):
print(f"{oid.prettyPrint()} = {val.prettyPrint()}")
try:
# Get PSU1 current, [PSU2 current], total board power draw in watts
currentsCurrentResults = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.600.30.1.6")
@@ -82,9 +91,16 @@ async def idrac9PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue):
# .1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1
voltResult = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1")
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()
hasExhaust = any("exhaust" in str(thing).lower() for thing in sensorNamesResults.values())
hasCPU2 = any("cpu2" in str(thing).lower() for thing in sensorNamesResults.values())
hasPSU2 = any("ps2" in str(thing).lower() for thing in currentsNamesResults.values())

View File

@@ -18,6 +18,7 @@ try:
except:
raise Exception("No IDRAC hosts variable")
GET_INTERVAL: Final[int] = int(os.getenv("GET_INTERVAL", 60))
# Flightchecks-------------------------------------------
@@ -71,7 +72,7 @@ async def main():
# for CiscoIP in CISCO_HOST_LIST:
# tg.create_task(ciscoPoolRemote(CiscoIP, mainQueue))
await asyncio.sleep(20)
await asyncio.sleep(GET_INTERVAL)

View File

@@ -0,0 +1,2 @@
class SNMPTimeoutError(Exception):
pass

View File

@@ -2,6 +2,7 @@ import asyncio, os
from typing import Annotated, Final
# SNMP
from pysnmp.hlapi.v3arch.asyncio import *
from models.snmpTimeOut import SNMPTimeoutError
# SNMP ENV-------------------------------------------
ROUND_PREC: Final[int] = int(os.getenv("ROUND_PREC", 2))
@@ -53,6 +54,9 @@ async def walk_column_v3(snmpEngine, remoteIP: str, base_oid: str) -> dict:
lexicographicMode=False,
):
if errInd:
print(f"\n\n{errInd}\n\n")
if "No SNMP response received before timeout" in str(errInd):
raise SNMPTimeoutError(f"Host {remoteIP} timed out while walking {base_oid}")
raise RuntimeError(errInd)
if errStat:
raise RuntimeError(errStat.prettyPrint())