apc_snmp_shutdown/apc.py
2024-08-13 04:17:30 +03:00

112 lines
3.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}")