Add systemd socket support; incomplete but works

This commit is contained in:
2025-11-19 23:28:04 +01:00
parent 86e9b93c37
commit 86f433c0c2

View File

@@ -5,10 +5,12 @@ import (
"flag" "flag"
"fmt" "fmt"
"log" "log"
"net"
"net/http" "net/http"
"os" "os"
"os/signal" "os/signal"
"path/filepath" "path/filepath"
"strconv"
"syscall" "syscall"
"time" "time"
@@ -64,16 +66,45 @@ func main() {
fmt.Println("Error: Both --tls-cert-file and --tls-key-file must be provided for TLS.") fmt.Println("Error: Both --tls-cert-file and --tls-key-file must be provided for TLS.")
os.Exit(1) os.Exit(1)
} }
// Check for systemd socket activation
// Set default ports. var listener net.Listener
if *listenStr == "" { listenFdsStr := os.Getenv("LISTEN_FDS")
defaultPort := ":8080" if listenFdsStr != "" {
if useTLS { listenFds, err := strconv.Atoi(listenFdsStr)
defaultPort = ":8443" 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 // Setup channels for server management
exitChan := make(chan struct{}) exitChan := make(chan struct{})
sigChan := make(chan os.Signal, 1) sigChan := make(chan os.Signal, 1)
@@ -81,7 +112,7 @@ func main() {
// Create server with initial handler // Create server with initial handler
srv := &http.Server{ srv := &http.Server{
Addr: *listenStr, //Addr: *listenStr,
} }
// Support for watching config and reloading when it changes // Support for watching config and reloading when it changes
@@ -194,10 +225,10 @@ func main() {
var err error var err error
if useTLS { if useTLS {
fmt.Printf("llama-swap listening with TLS on https://%s\n", *listenStr) fmt.Printf("llama-swap listening with TLS on https://%s\n", *listenStr)
err = srv.ListenAndServeTLS(*certFile, *keyFile) err = srv.ServeTLS(listener, *certFile, *keyFile)
} else { } else {
fmt.Printf("llama-swap listening on http://%s\n", *listenStr) fmt.Printf("llama-swap listening on http://%s\n", *listenStr)
err = srv.ListenAndServe() err = srv.Serve(listener)
} }
if err != nil && err != http.ErrServerClosed { if err != nil && err != http.ErrServerClosed {
log.Fatalf("Fatal server error: %v\n", err) log.Fatalf("Fatal server error: %v\n", err)