#!/bin/bash # /usr/local/bin/homelab_power_shutdown.sh # Staged graceful homelab shutdown orchestrator for Snarfnet set -uo pipefail log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [POWER-SHUTDOWN] $*" | tee -a /var/log/power-shutdown.log; } SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=3 -o BatchMode=yes" log "=== INITIATING HOMELAB TIERED SHUTDOWN ===" # ------------------------------------------------------------------ # TIER 1: Non-Essential Compute & AI Pis # ------------------------------------------------------------------ log "Stage 1: Halting AI Raspberry Pi stack (140.44.4.7, 140.44.4.8)..." ssh $SSH_OPTS root@140.44.4.7 "shutdown -h now" 2>/dev/null || true ssh $SSH_OPTS root@140.44.4.8 "shutdown -h now" 2>/dev/null || true # ------------------------------------------------------------------ # TIER 2: Docker Swarm NFS Workloads (NPM & Peanut) # ------------------------------------------------------------------ log "Stage 2: Stopping Swarm services mounting Synology NFS (NPM, Peanut)..." ssh $SSH_OPTS root@140.44.4.71 "docker service scale nginx-proxy-manager_app=0 nginx-proxy-manager_backup=0 peanut_peanut=0" 2>/dev/null || true sleep 5 # ------------------------------------------------------------------ # TIER 3: Harvester Guest VMs & Kubernetes Worker Nodes # ------------------------------------------------------------------ log "Stage 3: Shutting down Harvester guest VMs and K3s workers..." # Gracefully signal Harvester VMs ssh $SSH_OPTS root@140.44.4.81 "virsh list --name | xargs -r -n1 virsh shutdown" 2>/dev/null || true # Stop K3s agent on Aerodrome workers (clean Longhorn PVC detach) for ip in 140.44.4.22 140.44.4.23 140.44.4.24 140.44.4.25; do ssh $SSH_OPTS root@$ip "systemctl stop k3s-agent && sync && shutdown -h now" 2>/dev/null || true done # Stop K3s agent on Spaceport workers for ip in 140.44.4.51 140.44.4.52 140.44.4.53 140.44.4.54 140.44.4.55 140.44.4.56; do ssh $SSH_OPTS root@$ip "systemctl stop k3s-agent && sync && shutdown -h now" 2>/dev/null || true done sleep 15 # ------------------------------------------------------------------ # TIER 4: Storage Arrays (Synology DSM Safe Mode) # ------------------------------------------------------------------ log "Stage 4: Triggering Synology NAS Safe Mode (14.10.10.71, 14.10.10.72)..." ssh $SSH_OPTS admin@14.10.10.71 "synopoweroff" 2>/dev/null || true ssh $SSH_OPTS admin@14.10.10.72 "synopoweroff" 2>/dev/null || true sleep 20 # ------------------------------------------------------------------ # TIER 5: Control Planes & Swarm Managers # ------------------------------------------------------------------ log "Stage 5: Halting K3s control planes and Swarm managers..." # Spaceport Masters (140.44.4.41-44) for ip in 140.44.4.41 140.44.4.42 140.44.4.43 140.44.4.44; do ssh $SSH_OPTS root@$ip "k3s etcd-snapshot save && systemctl stop k3s && shutdown -h now" 2>/dev/null || true done # Aerodrome Masters (140.44.4.11-13) for ip in 140.44.4.11 140.44.4.12 140.44.4.13; do ssh $SSH_OPTS root@$ip "k3s etcd-snapshot save && systemctl stop k3s && shutdown -h now" 2>/dev/null || true done # Swarm Managers (140.44.4.71, 72, 74) for ip in 140.44.4.71 140.44.4.72 140.44.4.74; do ssh $SSH_OPTS root@$ip "sync && shutdown -h now" 2>/dev/null || true done # Harvester Baremetal Hypervisors (140.44.4.81-83) for ip in 140.44.4.81 140.44.4.82 140.44.4.83; do ssh $SSH_OPTS root@$ip "sync && shutdown -h now" 2>/dev/null || true done # ------------------------------------------------------------------ # TIER 6: Master Node Self-Cutoff (FSD) # ------------------------------------------------------------------ log "Stage 6: Executing final local halt and arming killpower..." touch /etc/killpower /sbin/shutdown -h +0