diff --git a/cicd_deploy.sh b/cicd_deploy.sh new file mode 100755 index 0000000..bdbca73 --- /dev/null +++ b/cicd_deploy.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +git pull origin main + +source /.venv/bin/activate + +pip install -r requirements.txt + +sudo systemctl stop ups-power.service +sudo systemctl start ups-power.service diff --git a/power.py b/power.py index 4dd69d7..989ca27 100644 --- a/power.py +++ b/power.py @@ -4,6 +4,7 @@ import logging import smtplib import asyncio import discord +import paramiko from ping3 import ping from nut2 import PyNUTClient from proxmoxer import ProxmoxAPI @@ -23,7 +24,8 @@ user_id = config.USER_ID pve_host = config.PVE_HOST pve_user = config.PVE_USER pve_pass = config.PVE_PASS -pve_nodes = ['pve', 'c530'] +servers = ['pve', 'c530'] +nas_ip = config.HOST1_IP wol_targets = { 'host1': {'mac': config.HOST1_MAC, 'ip': config.HOST1_IP}, @@ -89,16 +91,7 @@ def send_discord(message): await client.start(bot_token) asyncio.run(message_send()) -# Server Power Management -proxmox = ProxmoxAPI(pve_host, user=pve_user, password=pve_pass, verify_ssl=False) - -def shutdown_pve(node): - try: - proxmox.nodes(node).status.post(command='shutdown') - logger.warning(f"Node {node} is shutting down.") - except Exception as e: - logger.error(e) - +# UPS Monitor def monitor_ups(): client = PyNUTClient() try: @@ -111,8 +104,29 @@ def monitor_ups(): logger.error(f"Error communicating with NUT: {e}") return None +# Server Power Management +proxmox = ProxmoxAPI(pve_host, user=pve_user, password=pve_pass, verify_ssl=False) + +def shutdown_pve(node): + try: + proxmox.nodes(node).status.post(command='shutdown') + logger.warning(f"Node {node} is shutting down.") + except Exception as e: + logger.error(e) + +def shutdown_nas(): + try: + logger.warning("Nas is shutting down.") + client = paramiko.SSHClient() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + client.connect(nas_ip) + stdin, stdout, stderr = client.exec_command('sudo shutdown') + for line in stdout: + print(line.strip()) + except Exception as e: + logger.error(e) + def wake_up(battery): - if battery > 90: for target, addr in wol_targets.items(): mac = addr['mac'] ip = addr['ip'] @@ -134,7 +148,7 @@ def pwr_online(battery): logger.info(message) send_email(f"{ups_id}: Power On Line", message) send_discord(message) - if ups_id == "Server": + if ups_id == "Server" and battery > 90: wake_up(battery) def pwr_offline(battery): @@ -154,6 +168,11 @@ def batt_crit(battery): logger.warning(message) send_email(f"{ups_id} battery critical!!", message) send_discord(message) + if ups_id == "Server": + for node in servers: + shutdown_pve(node) + shutdown_nas() + time.sleep(300) # Main Loop def main(): @@ -176,7 +195,7 @@ def main(): if battery < 25: batt_crit(battery) if ups_id == "Server": - for node in pve_nodes: + for node in servers: shutdown_pve(node) time.sleep(300) else: diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1b402d5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +nut2 +ping3 +config +discord +paramiko +proxmoxer +wakeonlan \ No newline at end of file