#!/usr/bin/env bash
set -euo pipefail
# NUT / Synology UPS status probe.
# Defaults assume a Synology network UPS server on port 3493.
UPS_HOST="${UPS_HOST:-192.168.100.5}"
UPS_PORT="${UPS_PORT:-3493}"
UPS_NAME="${UPS_NAME:-ups}"
UPS_USER="${UPS_USER:-}"
UPS_PASS="${UPS_PASS:-}"
CONNECT_TIMEOUT="${CONNECT_TIMEOUT:-3}"
ts() {
date +"%Y-%m-%d %H:%M:%S"
}
ok() {
printf '[%s] OK %s\n' "$(ts)" "$*"
}
warn() {
printf '[%s] WARN %s\n' "$(ts)" "$*" >&2
}
fail() {
printf '[%s] FAIL %s\n' "$(ts)" "$*" >&2
exit 1
}
check_port() {
if nc -z -w "$CONNECT_TIMEOUT" "$UPS_HOST" "$UPS_PORT" >/dev/null 2>&1; then
ok "TCP $UPS_HOST:$UPS_PORT reachable"
else
fail "TCP $UPS_HOST:$UPS_PORT unreachable"
fi
}
check_upsc() {
if ! command -v upsc >/dev/null 2>&1; then
warn "upsc not installed, skipped UPS variable query"
return 0
fi
local target
target="$UPS_NAME@$UPS_HOST"
if [[ -n "$UPS_PORT" ]]; then
target="$target:$UPS_PORT"
fi
local out
if [[ -n "$UPS_USER" || -n "$UPS_PASS" ]]; then
out="$(upsc -u "$UPS_USER" -p "$UPS_PASS" "$target" ups.status 2>&1 || true)"
else
out="$(upsc "$target" ups.status 2>&1 || true)"
fi
if [[ -z "$out" ]]; then
fail "upsc returned empty output"
fi
if [[ "$out" == *"Error:"* || "$out" == *"Connection failed"* || "$out" == *"Unknown UPS"* ]]; then
fail "upsc query failed: $out"
fi
ok "UPS status: $out"
}
main() {
check_port
check_upsc
}
main "$@"