mirror of
https://github.com/rwinkhart/unifi-shutd.git
synced 2026-09-01 22:47:22 -04:00
64 lines
1.5 KiB
Go
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)
|
|
}
|