Add systemd socket support; incomplete but works
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user