Files
unifi-shutd/main.go
T
2025-10-18 16:45:10 -04:00

64 lines
1.5 KiB
Go

package main
import (
"fmt"
"log"
"os"
"os/exec"
"strconv"
"time"
"github.com/rwinkhart/go-boilerplate/other"
nut "github.com/rwinkhart/uni-nut"
)
func main() {
if len(os.Args) != 5 {
printUsageInfo()
}
intervalInt, err := strconv.Atoi(os.Args[3])
if err != nil {
other.PrintError("Failed to parse scan interval as integer: "+err.Error(), 2)
}
intervalDur := time.Duration(intervalInt) * time.Second
shutdownMultiplier, err := strconv.Atoi(os.Args[4])
if err != nil {
other.PrintError("Failed to parse bad scan limit as integer: "+err.Error(), 3)
}
client, err := nut.Dial(os.Args[1])
if err != nil {
other.PrintError("Failed to dial NUT server ("+os.Args[1]+"): "+err.Error(), 4)
}
log.Println("Starting NUT monitoring loop...")
cmd := exec.Command("/sbin/poweroff")
var value string
var badCycles int
for {
time.Sleep(intervalDur)
value, err = client.GetVar(os.Args[2], "ups.status")
if err != nil {
other.PrintError("Failed to get status from \""+os.Args[2]+"\": "+err.Error(), 5)
}
switch value {
case "OB DISCHRG":
badCycles++
log.Printf("BAD cycle: %d", badCycles)
default:
badCycles = 0
}
if badCycles >= shutdownMultiplier {
log.Println("Bad scan limit reached; initiating shutdown...")
err := cmd.Run()
if err != nil {
other.PrintError("Failed to execute shutdown command: "+err.Error(), 6)
}
}
}
}
func printUsageInfo() {
fmt.Print("\nUsage: unifi-shutd <host (ip:port)> <ups id> <scan interval (seconds)> <bad scan limit (int)>\n\n")
os.Exit(0)
}