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"
"fmt"
"log"
"net"
"net/http"
"os"
"os/signal"
"path/filepath"
"strconv"
"syscall"
"time"
@@ -64,6 +66,31 @@ func main() {
fmt.Println("Error: Both --tls-cert-file and --tls-key-file must be provided for TLS.")
os.Exit(1)
}
// 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)
}
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 == "" {
@@ -72,8 +99,12 @@ func main() {
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)