|
|
|
@ -8,14 +8,14 @@ import (
@@ -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() {
@@ -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) {
@@ -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() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|