From eeea0ebdfaa0a48aa805080d741242cf1b80a69f Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Sun, 22 Mar 2026 14:27:45 -0400 Subject: [PATCH] Add NUT UPS client installation for new cluster nodes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When freshStart.sh runs on a new PVE node, it now installs nut-client, configures MODE=netclient, and writes upsmon.conf pointing to monitor-02 as slave — prompts for NUT_PASSWORD during setup. Co-Authored-By: Claude Sonnet 4.6 --- freshStart.sh | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/freshStart.sh b/freshStart.sh index 793fa19..4d9101c 100644 --- a/freshStart.sh +++ b/freshStart.sh @@ -465,4 +465,75 @@ elif [[ "$PLATFORM" == "pve" ]]; then fi if [[ ! -s /etc/hwmonDaemon/.env ]] || grep -q "your_api_key_here" /etc/hwmonDaemon/.env 2>/dev/null; then echo "⚠️ REMINDER: Configure your API key in /etc/hwmonDaemon/.env" +fi + +# ============================================================================= +# NUT UPS Client — connects to monitor-02 (10.10.10.9) for UPS awareness +# ============================================================================= +if [[ "$PLATFORM" == "pve" ]]; then + echo "Installing NUT UPS monitoring client..." + + apt-get install -y nut-client + + mkdir -p /etc/nut + + # Fetch the NUT password from the server + NUT_ENV_URL="http://10.10.10.63:3000/LotusGuild/nut-ups/raw/branch/main/upsmon-client.conf.template" + + # Fetch the NUT password from monitor-02 (server holds the canonical password) + # We pull the client conf template and substitute the password inline. + # The password must be set manually or fetched here if you store it securely. + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo " NUT UPS Client Configuration" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo " Enter the NUT password (from /etc/nut/nut.env on monitor-02):" + read -r -s -p " NUT_PASSWORD: " NUT_CLIENT_PASS + echo "" + + if [[ -n "$NUT_CLIENT_PASS" ]]; then + # Write nut.conf (client mode) + cat > /etc/nut/nut.conf << 'NUTEOF' +MODE=netclient +NUTEOF + + # Fetch upsmon-client.conf.template and substitute password + if curl --max-time 15 --retry 2 -s "$NUT_ENV_URL" -o /tmp/upsmon-client.conf.template; then + sed "s/NUT_PASSWORD_PLACEHOLDER/${NUT_CLIENT_PASS}/g" \ + /tmp/upsmon-client.conf.template > /etc/nut/upsmon.conf + rm -f /tmp/upsmon-client.conf.template + else + # Fallback: write inline + cat > /etc/nut/upsmon.conf << UPSMONEOF +MONITOR apcups@10.10.10.9 1 upsmon_remote ${NUT_CLIENT_PASS} slave +MINSUPPLIES 1 +SHUTDOWNCMD "/sbin/poweroff" +POLLFREQ 5 +POLLFREQALERT 2 +RBWARNTIME 43200 +NOCOMMWARNTIME 300 +FINALDELAY 5 +NOTIFYFLAG ONLINE SYSLOG+WALL +NOTIFYFLAG ONBATT SYSLOG+WALL +NOTIFYFLAG LOWBATT SYSLOG+WALL +NOTIFYFLAG FSD SYSLOG+WALL +NOTIFYFLAG SHUTDOWN SYSLOG+WALL +NOTIFYFLAG NOCOMM SYSLOG+WALL +UPSMONEOF + fi + + chown root:nut /etc/nut/upsmon.conf 2>/dev/null || true + chmod 640 /etc/nut/upsmon.conf + + systemctl enable nut-monitor + if systemctl start nut-monitor 2>/dev/null; then + echo "✓ NUT client connected to UPS monitor on monitor-02" + else + echo "⚠️ NUT client installed but could not connect yet (monitor-02 may not be running NUT server)" + echo " It will connect automatically once nut-server is running on monitor-02." + fi + else + echo "⚠️ NUT password not provided — skipping NUT client setup." + echo " Run manually: apt install nut-client && configure /etc/nut/upsmon.conf" + fi fi \ No newline at end of file