112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
import subprocess
|
||
|
||
def snmp_get(ip, community, oid):
|
||
command = f"snmpget -v2c -O v -O q -c {community} {ip} {oid}"
|
||
result = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||
return result.stdout.strip().strip('"')
|
||
|
||
def interpret_flags(state_string):
|
||
if state_string == "UNKNOWN":
|
||
return "NMC имеет внутреннюю проблему коммуникации с ИБП."
|
||
|
||
flags_description = {
|
||
1: "Abnormal Condition Present",
|
||
2: "On Battery",
|
||
3: "Low Battery",
|
||
4: "On Line",
|
||
5: "Replace Battery",
|
||
6: "Serial Communication Established",
|
||
7: "AVR Boost Active",
|
||
8: "AVR Trim Active",
|
||
9: "Overload",
|
||
10: "Runtime Calibration",
|
||
11: "Batteries Discharged",
|
||
12: "Manual Bypass",
|
||
13: "Software Bypass",
|
||
14: "In Bypass due to Internal Fault",
|
||
15: "In Bypass due to Supply Failure",
|
||
16: "In Bypass due to Fan Failure",
|
||
17: "Sleeping on a Timer",
|
||
18: "Sleeping until Utility Power Returns",
|
||
19: "On",
|
||
20: "Rebooting",
|
||
21: "Battery Communication Lost",
|
||
22: "Graceful Shutdown Initiated",
|
||
23: "Smart Boost or Smart Trim Fault",
|
||
24: "Bad Output Voltage",
|
||
25: "Battery Charger Failure",
|
||
26: "High Battery Temperature",
|
||
27: "Warning Battery Temperature",
|
||
28: "Critical Battery Temperature",
|
||
29: "Self Test In Progress",
|
||
30: "Low Battery / On Battery",
|
||
31: "Graceful Shutdown Issued by Upstream Device",
|
||
32: "Graceful Shutdown Issued by Downstream Device",
|
||
33: "No Batteries Attached",
|
||
34: "Synchronized Command is in Progress",
|
||
35: "Synchronized Sleeping Command is in Progress",
|
||
36: "Synchronized Rebooting Command is in Progress",
|
||
37: "Inverter DC Imbalance",
|
||
38: "Transfer Relay Failure",
|
||
39: "Shutdown or Unable to Transfer",
|
||
40: "Low Battery Shutdown",
|
||
41: "Electronic Unit Fan Failure",
|
||
42: "Main Relay Failure",
|
||
43: "Bypass Relay Failure",
|
||
44: "Temporary Bypass",
|
||
45: "High Internal Temperature",
|
||
46: "Battery Temperature Sensor Fault",
|
||
47: "Input Out of Range for Bypass",
|
||
48: "DC Bus Overvoltage",
|
||
49: "PFC Failure",
|
||
50: "Critical Hardware Fault",
|
||
51: "Green Mode/ECO Mode",
|
||
52: "Hot Standby",
|
||
53: "Emergency Power Off (EPO) Activated",
|
||
54: "Load Alarm Violation",
|
||
55: "Bypass Phase Fault",
|
||
56: "UPS Internal Communication Failure",
|
||
57: "Efficiency Booster Mode",
|
||
58: "Off",
|
||
59: "Standby",
|
||
60: "Minor or Environment Alarm",
|
||
}
|
||
|
||
|
||
positions = [pos + 1 for pos, char in enumerate(state_string) if char == '1']
|
||
flags = [flags_description.get(pos, f"Flag {pos} not defined") for pos in positions]
|
||
|
||
return ", ".join(flags)
|
||
|
||
|
||
|
||
oids = {
|
||
"upsAdvBatteryCapacity": "1.3.6.1.4.1.318.1.1.1.2.2.1.0",
|
||
"upsAdvBatteryRunTimeRemaining": "1.3.6.1.4.1.318.1.1.1.2.2.3.0",
|
||
"upsAdvBatteryTemperature": "1.3.6.1.4.1.318.1.1.1.2.2.2.0",
|
||
"upsAdvOutputLoad": "1.3.6.1.4.1.318.1.1.1.4.2.3.0",
|
||
"upsBasicStateOutputState": "1.3.6.1.4.1.318.1.1.1.11.1.1.0",
|
||
"upsBasicIdentModel": "1.3.6.1.4.1.318.1.1.1.1.1.1.0"
|
||
|
||
}
|
||
|
||
|
||
def parse_time(time_str):
|
||
time_parts = time_str.split(":")[-4:]
|
||
days = int(time_parts[0])
|
||
hours = int(time_parts[1])
|
||
minutes = int(time_parts[2])
|
||
seconds = float(time_parts[3])
|
||
total_minutes = (days * 24 * 60) + (hours * 60) + minutes + (int(seconds // 60))
|
||
return total_minutes
|
||
|
||
|
||
for name, oid in oids.items():
|
||
response = snmp_get('10.31.41.46', 'public', oid)
|
||
if name == "upsBasicStateOutputState":
|
||
print(f"{name}: {interpret_flags(response)}")
|
||
elif name == "upsAdvBatteryRunTimeRemaining":
|
||
print(f"{name}: {parse_time(response)} minutes")
|
||
else:
|
||
print(f"{name}: {response}")
|