From 3995a5f5677a3f911d57a8808d7aca8cd57a5821 Mon Sep 17 00:00:00 2001 From: GrĂ©goire DuchĂȘne Date: Sat, 10 Jul 2021 21:28:44 +0100 Subject: Add systemd socket support --- main.go | 62 ++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 20 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 090331f..5a000b3 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,7 @@ import ( "golang.org/x/sys/unix" "go.awhk.org/fwdsms/pkg/twilio" + "go.awhk.org/gosdd" ) var cfgFilename = flag.String("c", "/etc/fwdsms.yaml", "configuration file") @@ -49,29 +50,18 @@ func main() { Handler: twilio.EmptyResponseHandler, }, })) + srv := http.Server{Handler: r} go func() { - var ( - l net.Listener - err error - ) - if cfg.Twilio.Address != "" && cfg.Twilio.Address[0] == '/' { - if l, err = net.Listen("unix", cfg.Twilio.Address); err != nil { - log.Fatalf("Could not set up UNIX listener: %v.", err) - } - if err = os.Chmod(cfg.Twilio.Address, 0666); err != nil { - log.Fatalf("Could not set up permissions on UNIX socket: %v.", err) - } - } else { - if cfg.Twilio.Address == "" { - cfg.Twilio.Address = ":8080" - } - if l, err = net.Listen("tcp", cfg.Twilio.Address); err != nil { - log.Fatalf("Could not set up TCP listener: %v.", err) - } + ln, err := listenSD() + if err != nil { + log.Fatalf("Failed to listen on systemd socket: %s.", err) + } + if ln == nil { + ln = listenEnv(cfg) } - if err = srv.Serve(l); err != nil && err != http.ErrServerClosed { - log.Fatalf("Failed to serve HTTP: %v.", err) + if err = srv.Serve(ln); err != nil && err != http.ErrServerClosed { + log.Fatalf("Failed to serve HTTP: %s.", err) } }() @@ -87,3 +77,35 @@ func main() { log.Fatalf("Failed to properly shut down the HTTP server: %v.", err) } } + +func listenEnv(cfg *Config) net.Listener { + if cfg.Twilio.Address != "" && cfg.Twilio.Address[0] == '/' { + ln, err := net.Listen("unix", cfg.Twilio.Address) + if err != nil { + log.Fatalf("Could not set up UNIX listener: %s.", err) + } + if err := os.Chmod(cfg.Twilio.Address, 0666); err != nil { + log.Fatalf("Could not set up permissions on UNIX socket: %s.", err) + } + return ln + } + ln, err := net.Listen("tcp", cfg.Twilio.Address) + if err != nil { + log.Fatalf("Could not set up TCP listener: %s.", err) + } + return ln +} + +func listenSD() (net.Listener, error) { + fds, err := gosdd.SDListenFDs(true) + if err != nil { + if err == gosdd.ErrNoSDSupport { + return nil, nil + } + return nil, err + } + if len(fds) == 0 { + return nil, nil + } + return net.FileListener(fds[0]) +} -- cgit v1.2.3-70-g09d2