#!/bin/bash # # Script apelat de upssched pentru a gestiona evenimentele UPS # Trimite notificari email via PVE::Notify # # Creat: 2025-10-06 # Actualizat: 2026-01-13 - Adaugat notificari email LOGFILE=/var/log/ups-events.log UPS_NAME="nutdev1" TEMPLATE_DIR="/etc/pve/notification-templates/default" HOSTNAME=$(hostname) FQDN=$(hostname -f 2>/dev/null || hostname) log_event() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE } # Obtine status UPS get_ups_status() { upsc $UPS_NAME ups.status 2>/dev/null || echo "UNKNOWN" } get_battery_charge() { upsc $UPS_NAME battery.charge 2>/dev/null || echo "0" } get_input_voltage() { upsc $UPS_NAME input.voltage 2>/dev/null || echo "0" } get_battery_runtime() { local runtime=$(upsc $UPS_NAME battery.runtime 2>/dev/null) if [ -n "$runtime" ] && [ "$runtime" != "0" ]; then echo $((runtime / 60)) else echo "" fi } # Creeaza template-uri daca nu exista create_templates() { mkdir -p $TEMPLATE_DIR cat > "$TEMPLATE_DIR/ups-power-event-subject.txt.hbs" << 'EOFTEMPLATE' [{{ hostname }}] UPS {{ event_type }} - {{ event_title }} EOFTEMPLATE cat > "$TEMPLATE_DIR/ups-power-event-body.txt.hbs" << 'EOFTEMPLATE' ======================================== UPS POWER EVENT - {{ event_title }} ======================================== Hostname: {{ hostname }} Date: {{ event_date }} Event: {{ event_type }} {{ event_description }} UPS STATUS: ----------- Status: {{ ups_status }} Battery Charge: {{ battery_charge }}% Input Voltage: {{ input_voltage }}V {{#if battery_runtime}} Battery Runtime: {{ battery_runtime }} min {{/if}} {{#if action_taken}} ACTION: {{ action_taken }} {{/if}} {{#if next_steps}} NEXT STEPS: {{ next_steps }} {{/if}} ======================================== Log: /var/log/ups-events.log ======================================== EOFTEMPLATE cat > "$TEMPLATE_DIR/ups-power-event-body.html.hbs" << 'EOFTEMPLATE'

[UPS] {{ event_title }}

Hostname: {{ hostname }}
Date: {{ event_date }}
Event: {{ event_type }}

{{ event_description }}

UPS Status

Status
{{ ups_status }}
Battery
{{ battery_charge }}%
Input Voltage
{{ input_voltage }}V
{{#if action_taken}}

Action: {{ action_taken }}

{{/if}} {{#if next_steps}}

Next Steps: {{ next_steps }}

{{/if}}
EOFTEMPLATE log_event "Templates created in $TEMPLATE_DIR/" } # Trimite notificare email via PVE::Notify send_notification() { local EVENT_TYPE="$1" local EVENT_TITLE="$2" local EVENT_DESC="$3" local EVENT_CLASS="$4" local ALERT_TYPE="$5" local SEVERITY="$6" local ACTION="$7" local NEXT_STEPS="$8" # Verifica si creeaza template-uri if [ ! -f "$TEMPLATE_DIR/ups-power-event-subject.txt.hbs" ]; then create_templates fi # Obtine status UPS local UPS_STATUS=$(get_ups_status) local BATTERY_CHARGE=$(get_battery_charge) local INPUT_VOLTAGE=$(get_input_voltage) local BATTERY_RUNTIME=$(get_battery_runtime) local EVENT_DATE=$(date '+%Y-%m-%d %H:%M:%S') log_event "Sending $SEVERITY notification: $EVENT_TITLE" perl -I/usr/share/perl5 << EOFPERL 2>&1 | tee -a $LOGFILE use strict; use warnings; use PVE::Notify; my \$template_data = { 'hostname' => '$FQDN', 'event_date' => '$EVENT_DATE', 'event_type' => '$EVENT_TYPE', 'event_title' => '$EVENT_TITLE', 'event_description' => '$EVENT_DESC', 'event_class' => '$EVENT_CLASS', 'alert_type' => '$ALERT_TYPE', 'ups_status' => '$UPS_STATUS', 'battery_charge' => '$BATTERY_CHARGE', 'input_voltage' => '$INPUT_VOLTAGE', 'battery_runtime' => '$BATTERY_RUNTIME', 'action_taken' => '$ACTION', 'next_steps' => '$NEXT_STEPS' }; my \$fields = { 'hostname' => '$HOSTNAME', 'type' => 'ups-power-event' }; eval { PVE::Notify::notify('$SEVERITY', 'ups-power-event', \$template_data, \$fields); print "Email notification sent successfully\\n"; }; if (\$@) { print STDERR "Failed to send notification: \$@\\n"; } EOFPERL } # Handler principal case $1 in onbatt_start) log_event "==========================================" log_event "UPS EVENT: Trecere pe baterie - Timer 3 minute pornit" logger -t upssched-cmd "UPS switched to battery - 3 minute timer started" send_notification \ "ONBATT" \ "Trecere pe baterie" \ "UPS a trecut pe baterie! Daca curentul nu revine in 3 minute, se va initia shutdown-ul cluster-ului." \ "onbatt" \ "warning" \ "warning" \ "Timer 3 minute pornit" \ "Asteptare revenire curent sau shutdown automat" ;; onbatt) log_event "==========================================" log_event "UPS EVENT: Pe baterie de 3 minute - Incepe shutdown orchestrat" logger -t upssched-cmd "UPS on battery for 3 minutes - starting orchestrated shutdown" send_notification \ "ONBATT_TIMEOUT" \ "Pe baterie 3 min - SHUTDOWN" \ "UPS a fost pe baterie timp de 3 minute. Se initiaza shutdown-ul orchestrat al cluster-ului." \ "onbatt" \ "danger" \ "error" \ "Pornire shutdown orchestrat cluster" \ "Toate nodurile se vor opri in ordine" /usr/local/bin/ups-shutdown-cluster.sh & ;; online) log_event "==========================================" log_event "UPS EVENT: Curent revenit - UPS online" logger -t upssched-cmd "Power restored - UPS back online" send_notification \ "ONLINE" \ "Curent revenit - OK" \ "Curentul electric a revenit. UPS functioneaza normal pe linia AC." \ "online" \ "success" \ "info" \ "Sistem stabil" \ "Nicio actiune necesara" ;; lowbatt) log_event "==========================================" log_event "UPS EVENT: BATERIE SCAZUTA - Shutdown IMEDIAT" logger -t upssched-cmd "UPS LOW BATTERY - immediate shutdown" send_notification \ "LOWBATT" \ "BATERIE CRITICA - SHUTDOWN IMEDIAT" \ "UPS raporteaza baterie critica! Shutdown imediat pentru protectia datelor." \ "lowbatt" \ "danger" \ "error" \ "Shutdown imediat cluster" \ "Sistemele se opresc ACUM" /usr/local/bin/ups-shutdown-cluster.sh & ;; commbad) log_event "==========================================" log_event "UPS EVENT: Comunicatie pierduta cu UPS de 30 secunde" logger -t upssched-cmd "Lost communication with UPS for 30 seconds" send_notification \ "COMMBAD" \ "Comunicatie pierduta cu UPS" \ "Nu se poate comunica cu UPS-ul de 30 de secunde. Verificati conexiunea USB." \ "commbad" \ "warning" \ "warning" \ "Monitorizare activa" \ "Verificati conexiunea fizica USB a UPS-ului" ;; *) log_event "UPS EVENT: Eveniment necunoscut - $1" logger -t upssched-cmd "Unknown UPS event: $1" ;; esac