Add start/stop/restart ability to command

This commit is contained in:
Rudi 2022-10-22 23:08:09 -04:00
parent 1598980f0e
commit 3e39875b78
Signed by: rudi
GPG Key ID: EF64F3CBD1A1EBDD
2 changed files with 64 additions and 8 deletions

63
main.go
View File

@ -8,14 +8,14 @@ import (
"os"
"os/exec"
"strings"
"syscall"
"time"
)
var (
startup []string
daemon = false
serviceFile = "/adm/services"
services = make(map[string]string)
services = make(map[string]Service)
controlSocket = "/adm/headless9/ctl/headless9.ctl"
logPath = "/adm/headless9/log/"
)
@ -116,16 +116,65 @@ func headlessControls() {
log.Println(err)
} else {
for _, cmd := range pendingCommands {
log.Printf(DAEMON_PROCESSING_CTL, cmd)
log.Printf(DAEMON_CTL_PROCESSING, cmd)
start := time.Now()
err = processCommand(cmd)
if err != nil {
log.Printf(DAEMON_CTL_FAILED, err, time.Since(start))
} else {
log.Printf(DAEMON_CTL_PROCESSED, cmd, time.Since(start))
}
}
}
}
}
func processCommand(cmd string) error {
parts := strings.Split(cmd, " ")
verb := parts[0]
svc := parts[1]
start := time.Now()
if verb == "restart" || verb == "stop" {
for testSvc := range services {
if svc == testSvc {
err := syscall.Kill(services[svc].ProcessHandle.Pid, 9)
if err != nil {
log.Printf(DAEMON_CTL_FAILED, err, time.Since(start))
} else {
delete(services, svc)
log.Printf(DAEMON_CTL_PROCESSED, svc, time.Since(start))
}
}
}
}
if verb == "restart" || verb == "start" {
startup, err := readLines(serviceFile)
if err != nil {
log.Fatalln(err)
}
for _, testSvc := range startup {
svcArgs := strings.Split(testSvc, " ")
if svc != testSvc {
continue
}
log.Printf(DAEMON_SVC_MISSING, svcArgs[0])
go execCommand(svcArgs[0], svcArgs[1:]...)
}
}
return nil
}
func execCommand(cmd string, arg ...string) {
defer PanicSafe()
if len(cmd) < 2 {
log.Printf(DAEMON_CMD_INVALID, cmd, arg)
log.Printf(DAEMON_SVC_INVALID, cmd, arg)
return
}
if strings.HasPrefix(cmd, "#") {
log.Printf(DAEMON_SVC_DISABLED, cmd)
return
}
proc := exec.Command(cmd, arg...)
@ -148,7 +197,11 @@ func execCommand(cmd string, arg ...string) {
log.Printf(DAEMON_SVC_FAIL, cmd)
return
}
services[cmd] = fmt.Sprint(proc.Process.Pid)
services[cmd] = Service{
ProcessHandle: proc.Process,
StartupArgs: arg,
StartTime: time.Now(),
}
proc.Wait()
}

View File

@ -8,9 +8,12 @@ var (
CTL_NOT_CLEAR = "Unable to clear Control Socket. Please check the file %+v and that it's permissions are 700"
CTL_NOT_REWOUND = "Unable to rewind Control Socket. Please check the file %+v and that it's permissions are 700"
DAEMON_FILE_REFRESH = "Refreshing controlFile %+v"
DAEMON_SVC_INVALID = "Invalid command `%v`, skipping. Args: { %+v }"
DAEMON_SVC_DISABLED = "%+v is disabled, skipping!"
DAEMON_SVC_EXISTS = "%+v exists as PID %+v"
DAEMON_SVC_MISSING = "Svc not detected, starting: %+v"
DAEMON_PROCESSING_CTL = "Processing command: %+v"
DAEMON_CMD_INVALID = "Invalid command `%v`, skipping. Args: { %+v }"
DAEMON_SVC_FAIL = "Error starting service %+v, see log for more info."
DAEMON_SVC_MISSING = "Svc not detected, starting: %+v"
DAEMON_CTL_PROCESSING = "Processing command: `%+v`"
DAEMON_CTL_PROCESSED = "Processed command `%+v` in %+v"
DAEMON_CTL_FAILED = "Processing command `%+v` failed after %+v"
)