mirror of
https://github.com/rwinkhart/unifi-shutd.git
synced 2026-09-06 00:37:14 -04:00
Initial code commit
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
/unifi-shutd
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
module unifi-shutd
|
||||||
|
|
||||||
|
go 1.25.2
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/rwinkhart/go-boilerplate v0.1.0
|
||||||
|
github.com/rwinkhart/uni-nut v1.1.0
|
||||||
|
)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
github.com/rwinkhart/go-boilerplate v0.1.0 h1:EzlVj6R7Bxtl79Nl7R5zRcg6s+Cf2FAqGIzR4giWTQg=
|
||||||
|
github.com/rwinkhart/go-boilerplate v0.1.0/go.mod h1:cnzIF45I0FCOvE4YIB+26pLCUx2kWyY2llKYZruNaRY=
|
||||||
|
github.com/rwinkhart/uni-nut v1.1.0 h1:oVq6pQj/2oAx18tcuXRDLXy0ebhgbynEABn+tH/MS3Q=
|
||||||
|
github.com/rwinkhart/uni-nut v1.1.0/go.mod h1:H5s8llqTO0UnerDqZHn+30bJVY07OLSoR1PaZa4yzPk=
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user