From 674eaef47a757869b3553c8745b946f9b1539a5e Mon Sep 17 00:00:00 2001 From: YuruC3 Date: Mon, 2 Mar 2026 20:03:24 +0100 Subject: [PATCH] Did a dynamic check to see what features a server has --- cont/funct.py | 284 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 170 insertions(+), 114 deletions(-) diff --git a/cont/funct.py b/cont/funct.py index 83f64e8..7462272 100644 --- a/cont/funct.py +++ b/cont/funct.py @@ -265,9 +265,11 @@ async def ciscoPoolRemote(remoteIP: str, queueToInsrt: asyncio.Queue): # IDRAC78 get data for snmpPyIDRACData class async def idrac7_8PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue): - snmpEngine = SnmpEngine() - iterator = get_cmd( + snmpEngine = SnmpEngine() + # try CPU2 as CPU1 is always there + + mainIterator = get_cmd( snmpEngine, # SNMPv1 = mpModel=0 (SNMPv2c would be mpModel=1) # CommunityData("public", mpModel=0), @@ -276,25 +278,11 @@ async def idrac7_8PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue): ContextData(), # Hostname (sysName.0) ObjectType(ObjectIdentity(".1.3.6.1.2.1.1.5.0")), #0 - - # PSU1 powerDraw and PSU2 powerDraw (Amps) - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.1")), #1 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.2")), #2 - # (Volts) - # ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1.31")), #3 - # ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1.32")), #4 - - # Get Inlet, Exhaust, CPU1, CPU2 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.1")), #3 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.2")), #4 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.3")), #5 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.4")), #6 - # Uptime in seconds - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.2.5.0")), #7 + ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.2.5.0")), #1 ) - errorIndication, errorStatus, errorIndex, varBinds = await iterator + errorIndication, errorStatus, errorIndex, mainVarBinds = await mainIterator if errorIndication: print(errorIndication) @@ -302,90 +290,127 @@ async def idrac7_8PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue): print( "{} at {}".format( errorStatus.prettyPrint(), - errorIndex and varBinds[int(errorIndex) - 1][0] or "?", + errorIndex and mainVarBinds[int(errorIndex) - 1][0] or "?", ) ) else: - for oid, val in varBinds: - print(f"{oid.prettyPrint()} = {val.prettyPrint()}") - - iterator2 = get_cmd( - snmpEngine, - # SNMPv1 = mpModel=0 (SNMPv2c would be mpModel=1) - # CommunityData("public", mpModel=0), - USMUSRDATA, - await UdpTransportTarget.create((remoteIP, SNMPORT)), - ContextData(), - # Hostname (sysName.0) - ObjectType(ObjectIdentity(".1.3.6.1.2.1.1.5.0")), #0 - - # PSU1 powerDraw and PSU2 powerDraw (Amps) - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.1")), #1 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.2")), #2 - # (Volts) - # ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1.31")), #3 - # ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1.32")), #4 - - # Get Inlet, Exhaust, CPU1, CPU2 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.1")), #3 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.2")), #4 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.3")), #5 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.4")), #6 - - # Uptime in seconds - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.2.5.0")), #7 - ) - - errorIndication2, errorStatus2, errorIndex2, varBinds2 = await iterator2 - - if errorIndication2: - print(errorIndication2) - elif errorStatus2: - print( - "{} at {}".format( - errorStatus2.prettyPrint(), - errorIndex2 and varBinds[int(errorIndex2) - 1][0] or "?", - ) - ) - else: - for oid, val in varBinds2: + for oid, val in mainVarBinds: print(f"{oid.prettyPrint()} = {val.prettyPrint()}") + # 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 + currentsNamesResults = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.600.30.1.8") + + # PSU1 voltage, [PSU2 voltage] + # psusVoltResult = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1") + # In reversed order. PSU1 OID name [PSU2 OID name] + # currentsNamesResults[-1] would be "PS2 Voltage 2" and currentsNamesResults[-2] would be "PS1 Voltage 1" IF two PSUs are installed. + # Otherwise currentsNamesResults[-1] would be "PS1 Voltage 1" + # psusNamesResult = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.600.20.1.8") + + # Inlet OID name .1, [Exhaust OID name], CPU1 temp OID name, [CPU2 tempOID name] + sensorNamesResults = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.700.20.1.8") + # Inlet temp, [Exhaust temp], CPU1 temp, [CPU2 temp] + sensorValuesResults = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.700.20.1.6") + + # .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") + 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()) + voltList = [] for thing in voltResult: voltList.append(voltResult[thing]) snmpEngine.close_dispatcher() - # print(varBinds[1][-1]) - # print(type(varBinds[1][-1])) + + # print("\n") + # print(remoteIP) + # print("\n") + # print(currentsCurrentResults, hasPSU2) + # print("\n") + # print(currentsNamesResults, hasCPU2) + # print("\n") + # print(psusVoltResult) + # print("\n") + # # print(psusNamesResult) + # # print("\n") + # print(sensorNamesResults) + # print("\n") + # print(sensorValuesResults, hasExhaust) + # print("\n") + + + # PSU2 values and board power + psu2PowerDraw = None + psu2Amperage = None + psu2Voltage = None + + if hasPSU2: + psu2PowerDraw = round((int(currentsCurrentResults[2]) / 10) * (int(voltList[1]) / 1000), ROUND_PREC) + psu2Amperage = int(currentsCurrentResults[2]) / 10 + psu2Voltage = round((int(voltList[1]) / 1000), ROUND_PREC) + boardPowerDraw = int(currentsCurrentResults[3]) + else: + boardPowerDraw = int(currentsCurrentResults[2]) + + # Exhaustm CPU1 and CPU2 temp + + exhaustTemp = None + cpu2Temp = None + if hasExhaust and hasCPU2: + exhaustTemp = int(sensorValuesResults[2]) / 10 + cpu1Temp = int(sensorValuesResults[3]) / 10 + cpu2Temp = int(sensorValuesResults[4]) / 10 + elif hasExhaust and not hasCPU2: + exhaustTemp = int(sensorValuesResults[2]) / 10 + cpu1Temp = int(sensorValuesResults[3]) / 10 + elif hasCPU2 and not hasExhaust: + cpu1Temp = int(sensorValuesResults[3]) / 10 + cpu2Temp = int(sensorValuesResults[4]) / 10 + else: + cpu1Temp = int(sensorValuesResults[2]) / 10 + + + + + + + # Prepare what to insert + + returnObj = snmpPyIDRACData( - hostname=varBinds[0][-1], + hostname=mainVarBinds[0][-1], # Hostname - powerDrawPSU1=round((int(varBinds[1][-1]) / 10) * (int(voltList[0]) / 1000), ROUND_PREC), - powerDrawPSU2=round((int(varBinds[2][-1]) / 10) * (int(voltList[1]) / 1000), ROUND_PREC), + powerDrawPSU1=round((int(currentsCurrentResults[1]) / 10) * (int(voltList[0]) / 1000), ROUND_PREC), + powerDrawPSU2=psu2PowerDraw, # PSU1 and PSU2 power draw in Watts + # board power draw + powerDrawBoard=boardPowerDraw, + voltagePSU1=round((int(voltList[0]) / 1000), ROUND_PREC), - voltagePSU2=round((int(voltList[1]) / 1000), ROUND_PREC), + voltagePSU2=psu2Voltage, # PSU1 and PSU2 voltages - inletTemp=int(varBinds[3][-1] / 10), - exhaustTemp=int(varBinds[4][-1] / 10), + inletTemp=(int(sensorValuesResults[1]) / 10), + exhaustTemp=exhaustTemp, # Inlet and Exhaust temp - cpu1Temp=int(varBinds[5][-1] / 10), - cpu2Temp=int(varBinds[6][-1] / 10), + cpu1Temp=cpu1Temp, + cpu2Temp=cpu2Temp, # CPU1 and CPU2 temp - uptimeS=int(varBinds[7][-1]), + uptimeS=int(mainVarBinds[1][-1]), # seconds - uptimeH=round(((int(varBinds[7][-1]) / 60) / 60), ROUND_PREC), + uptimeH=round(((int(mainVarBinds[1][-1]) / 60) / 60), ROUND_PREC), # seconds->minutes->hours - uptimeD=round((((int(varBinds[7][-1]) / 60) / 60) / 24), ROUND_PREC) + uptimeD=round((((int(mainVarBinds[1][-1]) / 60) / 60) / 24), ROUND_PREC) # seconds->minutes->hours->days ) @@ -405,37 +430,16 @@ async def idrac9PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue): iterator = get_cmd( snmpEngine, - # SNMPv1 = mpModel=0 (SNMPv2c would be mpModel=1) - # CommunityData("public", mpModel=0), USMUSRDATA, await UdpTransportTarget.create((remoteIP, SNMPORT)), ContextData(), # Hostname (sysName.0) ObjectType(ObjectIdentity(".1.3.6.1.2.1.1.5.0")), #0 - - # PSU1 powerDraw and PSU2 powerDraw (Amps) - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.1")), #1 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.2")), #2 - - # (Volts) nevermid, do not querry - # ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1.33")), #3 - # ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1.34")), #4 - - # Get Inlet, Exhaust, CPU1, CPU2 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.3")), #3 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.4")), #4 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.1")), #5 - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.2")), #6 - # Uptime in seconds - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.2.5.0")), #7 - - # Raw board power draw - ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.3")), #8 + ObjectType(ObjectIdentity(".1.3.6.1.4.1.674.10892.5.2.5.0")), #1 ) - - errorIndication, errorStatus, errorIndex, varBinds = await iterator + errorIndication, errorStatus, errorIndex, mainVarBinds = await iterator if errorIndication: print(errorIndication) @@ -443,51 +447,103 @@ async def idrac9PoolRemote_v3(remoteIP: str, queueToInsrt: asyncio.Queue): print( "{} at {}".format( errorStatus.prettyPrint(), - errorIndex and varBinds[int(errorIndex) - 1][0] or "?", + errorIndex and mainVarBinds[int(errorIndex) - 1][0] or "?", ) ) else: - for oid, val in varBinds: + for oid, val in mainVarBinds: print(f"{oid.prettyPrint()} = {val.prettyPrint()}") + + + # 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 + currentsNamesResults = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.600.30.1.8") + + # CPU1 OID name .1, [CPU2 OID name], Inlet temp OID name, [Exhaust temp OID name] + sensorNamesResults = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.700.20.1.8") + # CPU1 temp, [CPU2 temp], Inlet temp, [Exhaust temp] + sensorValuesResults = await walk_column_v3(snmpEngine, remoteIP, ".1.3.6.1.4.1.674.10892.5.4.700.20.1.6") + # .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") + snmpEngine.close_dispatcher() + voltList = [] for thing in voltResult: voltList.append(voltResult[thing]) - 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()) + + + # PSU2 values and board power + psu2PowerDraw = None + psu2Amperage = None + psu2Voltage = None + + if hasPSU2: + psu2PowerDraw = round((int(currentsCurrentResults[2]) / 10) * (int(voltList[1]) / 1000), ROUND_PREC) + psu2Amperage = int(currentsCurrentResults[2]) / 10 + psu2Voltage = round((int(voltList[1]) / 1000), ROUND_PREC) + boardPowerDraw = int(currentsCurrentResults[3]) + else: + boardPowerDraw = int(currentsCurrentResults[2]) + + # Exhaustm CPU1 and CPU2 temp + + exhaustTemp = None + inletTemp = None + cpu2Temp = None + if hasExhaust and hasCPU2: + exhaustTemp = int(sensorValuesResults[4]) / 10 + inletTemp = int(sensorValuesResults[3]) / 10 + cpu2Temp = int(sensorValuesResults[2]) / 10 + elif hasExhaust and not hasCPU2: + exhaustTemp = int(sensorValuesResults[3]) / 10 + inletTemp = int(sensorValuesResults[2]) / 10 + elif hasCPU2 and not hasExhaust: + inletTemp = int(sensorValuesResults[3]) / 10 + cpu2Temp = int(sensorValuesResults[2]) / 10 + else: + inletTemp = int(sensorValuesResults[2]) / 10 + + + + # print(varBinds[1][-1]) # print(type(varBinds[1][-1])) returnObj = snmpPyIDRACData( - hostname=varBinds[0][-1], + hostname=mainVarBinds[0][-1], # Hostname - powerDrawPSU1=round((int(varBinds[1][-1]) / 10) * (int(voltList[0]) / 1000), ROUND_PREC), - powerDrawPSU2=round((int(varBinds[2][-1]) / 10) * (int(voltList[1]) / 1000), ROUND_PREC), + powerDrawPSU1=round((int(currentsCurrentResults[1]) / 10) * (int(voltList[0]) / 1000), ROUND_PREC), + powerDrawPSU2=psu2PowerDraw, # PSU1 and PSU2 power draw in Watts - # Total board power consumption - powerDrawBoard=int(varBinds[8][-1]), + # board power draw + powerDrawBoard=boardPowerDraw, voltagePSU1=round((int(voltList[0]) / 1000), ROUND_PREC), - voltagePSU2=round((int(voltList[1]) / 1000), ROUND_PREC), + voltagePSU2=psu2Voltage, # PSU1 and PSU2 voltages - inletTemp=int(varBinds[3][-1] / 10), - exhaustTemp=int(varBinds[4][-1] / 10), + inletTemp=inletTemp, + exhaustTemp=exhaustTemp, # Inlet and Exhaust temp - cpu1Temp=int(varBinds[5][-1] / 10), - cpu2Temp=int(varBinds[6][-1] / 10), + cpu1Temp=int(sensorValuesResults[1]) / 10, + cpu2Temp=cpu2Temp, # CPU1 and CPU2 temp - uptimeS=int(varBinds[7][-1]), + uptimeS=int(mainVarBinds[1][-1]), # seconds - uptimeH=round(((int(varBinds[7][-1]) / 60) / 60), ROUND_PREC), + uptimeH=round(((int(mainVarBinds[1][-1]) / 60) / 60), ROUND_PREC), # seconds->minutes->hours - uptimeD=round((((int(varBinds[7][-1]) / 60) / 60) / 24), ROUND_PREC) + uptimeD=round((((int(mainVarBinds[1][-1]) / 60) / 60) / 24), ROUND_PREC) # seconds->minutes->hours->days )