From 86f433c0c2835cb05c904090aada51fd93f1b3b3 Mon Sep 17 00:00:00 2001 From: Andreas Date: Wed, 19 Nov 2025 23:28:04 +0100 Subject: [PATCH] Add systemd socket support; incomplete but works --- llama-swap.go | 53 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/llama-swap.go b/llama-swap.go index 9706e07..4f8febb 100644 --- a/llama-swap.go +++ b/llama-swap.go @@ -5,10 +5,12 @@ import ( "flag" "fmt" "log" + "net" "net/http" "os" "os/signal" "path/filepath" + "strconv" "syscall" "time" @@ -64,16 +66,45 @@ func main() { fmt.Println("Error: Both --tls-cert-file and --tls-key-file must be provided for TLS.") os.Exit(1) } - - // Set default ports. - if *listenStr == "" { - defaultPort := ":8080" - if useTLS { - defaultPort = ":8443" + // Check for systemd socket activation + var listener net.Listener + listenFdsStr := os.Getenv("LISTEN_FDS") + if listenFdsStr != "" { + listenFds, err := strconv.Atoi(listenFdsStr) + if err != nil { + log.Fatal("Failed to parse LISTEN_FDS:", err) } - listenStr = &defaultPort - } + if listenFds > 0 { + // The first socket is on FD 3 + fd := 3 + f := os.NewFile(uintptr(fd), "systemd socket") + if f == nil { + log.Fatal("Failed to get file descriptor") + } + listener, err = net.FileListener(f) + if err != nil { + log.Fatal("Failed to create listener:", err) + } + // The listener now owns the file, so we don't close it here. + } else { + log.Fatal("LISTEN_FDS is set but no sockets are passed") + } + } else { + + // Set default ports. + if *listenStr == "" { + defaultPort := ":8080" + if useTLS { + defaultPort = ":8443" + } + listenStr = &defaultPort + listener, err = net.Listen("tcp", *listenStr) + if err != nil { + log.Fatal("Failed to listen:", err) + } + } + } // Setup channels for server management exitChan := make(chan struct{}) sigChan := make(chan os.Signal, 1) @@ -81,7 +112,7 @@ func main() { // Create server with initial handler srv := &http.Server{ - Addr: *listenStr, + //Addr: *listenStr, } // Support for watching config and reloading when it changes @@ -194,10 +225,10 @@ func main() { var err error if useTLS { fmt.Printf("llama-swap listening with TLS on https://%s\n", *listenStr) - err = srv.ListenAndServeTLS(*certFile, *keyFile) + err = srv.ServeTLS(listener, *certFile, *keyFile) } else { fmt.Printf("llama-swap listening on http://%s\n", *listenStr) - err = srv.ListenAndServe() + err = srv.Serve(listener) } if err != nil && err != http.ErrServerClosed { log.Fatalf("Fatal server error: %v\n", err)