apc_snmp_shutdown/shutdown_ups.py

74 lines
2.7 KiB
Python
Raw Normal View History

2024-08-13 04:18:53 +03:00
import subprocess
import time
import requests
import socket
import os
2024-08-13 04:26:50 +03:00
import sys
2024-08-13 04:18:53 +03:00
def parse_time(time_str):
try:
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
except:
return False
def send_email(recipient, subject, body, sender):
email_message = f"Subject: {subject}\nFrom: {sender}\nTo: {recipient}\n\n{body}"
process = os.popen('/usr/sbin/sendmail -t', 'w')
process.write(email_message)
process.close()
def parse_states(states_str):
if len(states_str) < 2: return "Invalid input"
second_char = states_str[1]
if second_char == '0': return "on-line"
elif second_char == '1': return "on-battery"
else: return "Invalid input"
def run_command(command):
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
return result.stdout.strip()
2024-08-13 04:26:50 +03:00
def main(ups_ip, time_threshold, interval):
print("Starting UPS monitoring...")
while True:
oid_on_battery_time = "1.3.6.1.4.1.318.1.1.1.2.2.3.0"
result = run_command(f'/usr/bin/snmpget -v2c -O v -O q -c public {ups_ip} {oid_on_battery_time}')
time_on_battery = parse_time(result)
oid_states = "1.3.6.1.4.1.318.1.1.1.11.1.1.0"
result = run_command(f'/usr/bin/snmpget -v2c -O v -O q -c public {ups_ip} {oid_states}')
state = parse_states(result.strip('"'))
2024-08-13 04:18:53 +03:00
2024-08-13 04:26:50 +03:00
print(f"Time on battery: {time_on_battery} minutes, State: {state}")
2024-08-13 04:18:53 +03:00
2024-08-13 04:26:50 +03:00
if time_on_battery != False and time_on_battery < time_threshold:
if state == "on-battery":
shutdown_status = run_command('shutdown --show 2>&1')
if "No scheduled shutdown" in shutdown_status:
print("UPS is failing, shutting down in 60 seconds...")
send_email(f"{socket.gethostname()}@vvzvlad.xyz", "UPS is failing, shutting down in 60 seconds...", f"Proxmox node '{socket.gethostname()}': UPS is failing, shutting down in 60 seconds...", f"{socket.gethostname()}@vvzvlad.xyz")
run_command('sudo shutdown -h 1 "Shutting down due to UPS failure"')
2024-08-13 04:18:53 +03:00
if state == "on-battery":
2024-08-13 04:26:50 +03:00
time.sleep(5)
else:
time.sleep(interval)
if __name__ == "__main__":
if len(sys.argv) != 4:
print("Usage: script.py <ups_ip> <time_threshold> <interval>")
sys.exit(1)
ups_ip = sys.argv[1]
time_threshold = int(sys.argv[2])
interval = int(sys.argv[3])
main(ups_ip, time_threshold, interval)