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 \n\n") os.Exit(0) }