diff --git a/services/baseService.go b/services/baseService.go new file mode 100644 index 0000000..51f168b --- /dev/null +++ b/services/baseService.go @@ -0,0 +1,87 @@ +package services + +import ( + "bufio" + "github.com/DariusKlein/kleinCommand/common" + "log" + "net" + "os" + "sync" + "time" +) + +func BaseService(socketPath string, logic func(string)) { + // Remove socket path on os.Interrupt and syscall.SIGTERM + common.CatchInterrupt(func() { + os.Remove(socketPath) + }) + // Check if socket exists + if common.FileExists(socketPath) { + log.Fatal("Socket file exists.") + } + // Create the UNIX socket listener. + listener, err := net.Listen("unix", socketPath) + if err != nil { + log.Fatalf("Failed to listen on socket: %v", err) + } + + log.Println("Service started, listening on", socketPath) + + shutdownChan := make(chan struct{}) + + var once sync.Once + closeOnce := func() { + once.Do(func() { + close(shutdownChan) + }) + } + + go func() { + for { + conn, err := listener.Accept() + if err != nil { + log.Printf("Accept error: %v", err) + closeOnce() + return + } + go handleConnection(conn, logic, listener) + } + }() + + go func() { + ticker := time.NewTicker(5 * time.Second) // Check every 5 seconds + defer ticker.Stop() + for { + select { + case <-ticker.C: + if _, err := os.Stat(socketPath); os.IsNotExist(err) { + log.Println("Socket file deleted externally, signaling shutdown.") + closeOnce() + return + } + case <-shutdownChan: + return + } + } + }() + + <-shutdownChan + + common.DeleteSelf() +} + +func handleConnection(conn net.Conn, logic func(string), listener net.Listener) { + defer conn.Close() + + scanner := bufio.NewScanner(conn) + scanner.Split(bufio.ScanLines) + for scanner.Scan() { + input := scanner.Text() + if input == "shutdown" { + log.Println("Shutdown command received, exiting.") + listener.Close() + } else { + logic(input) + } + } +} diff --git a/services/binaries/exampleService b/services/binaries/exampleService new file mode 100755 index 0000000..c493888 Binary files /dev/null and b/services/binaries/exampleService differ diff --git a/services/binaries/exampleService.exe b/services/binaries/exampleService.exe new file mode 100755 index 0000000..c798f3a Binary files /dev/null and b/services/binaries/exampleService.exe differ diff --git a/services/example/main.go b/services/example/main.go index 9333b77..79be5fc 100644 --- a/services/example/main.go +++ b/services/example/main.go @@ -1,60 +1,17 @@ package main import ( - "bufio" "github.com/DariusKlein/kleinCommand/common" - "log" - "net" - "os" + "github.com/DariusKlein/kleinCommand/services" ) var socketPath = common.ExampleServiceSocketPath func main() { - common.CatchInterrupt(func() { - os.Remove(socketPath) + services.BaseService(socketPath, func(command string) { + switch command { + case "example\n": + + } }) - - if common.FileExists(socketPath) { - log.Fatal("Socket file exists.") - } - - // Create the UNIX socket listener. - listener, err := net.Listen("unix", socketPath) - if err != nil { - log.Fatalf("Failed to listen on socket: %v", err) - } - - defer listener.Close() - - log.Println("Service started, listening on", socketPath) - - go func() { - conn, err := listener.Accept() - if err != nil { - log.Printf("Accept error: %v", err) - return - } - defer conn.Close() - - reader := bufio.NewReader(conn) - command, err := reader.ReadString('\n') - if err != nil { - log.Printf("Read error: %v", err) - return - } - - if command == "shutdown\n" { - log.Println("Shutdown command received, exiting.") - // This will cause the listener.Accept() to unblock and the program to exit. - listener.Close() - } - }() - - for { - if _, err := os.Stat(socketPath); os.IsNotExist(err) { - break - } - } - common.DeleteSelf() } diff --git a/services/exampleService b/services/exampleService deleted file mode 100755 index c0c4c1a..0000000 Binary files a/services/exampleService and /dev/null differ diff --git a/services/exampleService.exe b/services/exampleService.exe deleted file mode 100755 index 0b357e2..0000000 Binary files a/services/exampleService.exe and /dev/null differ diff --git a/services/linuxServices.go b/services/linuxServices.go index b3eb864..5839133 100644 --- a/services/linuxServices.go +++ b/services/linuxServices.go @@ -2,7 +2,7 @@ package services -//go:generate go build ./example +//go:generate go build -o binaries/ ./example import ( _ "embed" @@ -11,7 +11,7 @@ import ( "syscall" ) -//go:embed exampleService +//go:embed binaries/exampleService var exampleService []byte func runService(name string, file []byte) error { diff --git a/services/windowsServices.go b/services/windowsServices.go index 0c90ff6..a3a8e3e 100644 --- a/services/windowsServices.go +++ b/services/windowsServices.go @@ -2,7 +2,7 @@ package services -//go:generate go build ./example +//go:generate go build -o binaries/ ./example import ( _ "embed" @@ -11,7 +11,7 @@ import ( "syscall" ) -//go:embed exampleService.exe +//go:embed binaries/exampleService.exe var exampleService []byte func runService(name string, file []byte) error {