From 3e39875b78805b4dea80282326f10762cd042da7 Mon Sep 17 00:00:00 2001 From: Rudi Date: Sat, 22 Oct 2022 23:08:09 -0400 Subject: [PATCH] Add start/stop/restart ability to command --- main.go | 63 +++++++++++++++++++++++++++++++++++++++++++++++++----- strings.go | 9 +++++--- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 5950b5b..4e6fb1e 100644 --- a/main.go +++ b/main.go @@ -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() } diff --git a/strings.go b/strings.go index fbc68b0..de5a372 100644 --- a/strings.go +++ b/strings.go @@ -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" )