Files
UpSnap/backend/networking/shutdown.go
2023-02-11 21:53:57 +01:00

52 lines
1.1 KiB
Go

package networking
import (
"bytes"
"fmt"
"os/exec"
"runtime"
"time"
"github.com/pocketbase/pocketbase/models"
"github.com/seriousm4x/upsnap/logger"
)
func ShutdownDevice(device *models.Record) error {
logger.Info.Println("shutdown triggered for", device.GetString("name"))
shutdown_cmd := device.GetString("shutdown_cmd")
if shutdown_cmd == "" {
return fmt.Errorf("%s: no shutdown_cmd definded", device.GetString("name"))
}
var shell string
var shell_arg string
if runtime.GOOS == "windows" {
shell = "cmd"
shell_arg = "/C"
} else {
shell = "/bin/sh"
shell_arg = "-c"
}
cmd := exec.Command(shell, shell_arg, shutdown_cmd)
var stderr bytes.Buffer
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil {
return fmt.Errorf("%s", stderr.String())
}
// check state every second for 2 min
start := time.Now()
for {
time.Sleep(1 * time.Second)
isOnline := PingDevice(device)
if !isOnline {
return nil
}
if time.Since(start) >= 2*time.Minute {
break
}
}
return fmt.Errorf(device.GetString("name"), "not offline after 2 min")
}