mirror of
https://github.com/seriousm4x/UpSnap.git
synced 2026-07-22 21:43:42 -04:00
52 lines
1.1 KiB
Go
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")
|
|
}
|