From 98b4e8f818b64389eb4b90af00e74e07d7f777fa Mon Sep 17 00:00:00 2001 From: Giovanni Harting <539@idlegandalf.com> Date: Fri, 15 Dec 2023 19:20:33 +0100 Subject: [PATCH] add systemd-socket activation --- go.mod | 1 + go.sum | 3 +++ main.go | 82 ++++++++++++++++++++++++++++++++++++++------------------- 3 files changed, 59 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 1c2b995..a9b3a89 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.21 require ( entgo.io/ent v0.12.5 github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b + github.com/coreos/go-systemd/v22 v22.5.0 github.com/go-chi/chi/v5 v5.0.10 github.com/go-chi/render v1.0.3 github.com/jackc/pgx/v4 v4.18.1 diff --git a/go.sum b/go.sum index 662ec74..3c3e076 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,8 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -36,6 +38,7 @@ github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12f github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= diff --git a/main.go b/main.go index a47ffbb..d875734 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "entgo.io/ent/dialect/sql" "flag" "fmt" + "github.com/coreos/go-systemd/v22/activation" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/render" @@ -98,14 +99,21 @@ func main() { log.Info("Start listening...") sockets := make([]net.Listener, 0) - for _, l := range conf.Httpd.Listen { - if l.Socket != "" { - sL, err := net.Listen("unix", l.Socket) - log.Infof("Listening on %s", l.Socket) + + // handle systemd socket activation + listeners, err := activation.Listeners() + if err != nil { + panic(err) + } + + if len(listeners) > 0 { + for _, l := range listeners { + log.Infof("Listening on %s", l.Addr()) if err != nil { - log.Panicf("Failure listing on socket %s: %v", l.Socket, err) + log.Panicf("failure listing on socket %s: %v", l, err) } - sockets = append(sockets, sL) + sockets = append(sockets, l) + l := l go func() { srv := &http.Server{ ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second, @@ -113,30 +121,50 @@ func main() { IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second, Handler: r, } - _ = srv.Serve(sL) + _ = srv.Serve(l) }() - } else { - log.Infof("Listening on %s:%d", l.Host, l.Port) - tL, err := net.Listen("tcp", fmt.Sprintf("%s:%d", l.Host, l.Port)) - if err != nil { - log.Panicf("Failure listing on %s:%d: %v", l.Host, l.Port, err) - } - go func(l struct { - Socket string - Host string - Port int - }) { - srv := &http.Server{ - ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second, - WriteTimeout: time.Duration(conf.Httpd.Timeout.Write) * time.Second, - IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second, - Handler: r, - } - err = srv.Serve(tL) + } + } else { // handle config if not systemd-socket activated + for _, l := range conf.Httpd.Listen { + if l.Socket != "" { + sL, err := net.Listen("unix", l.Socket) + log.Infof("Listening on %s", l.Socket) if err != nil { - log.Fatalf("Failure serving on %s:%d: %v", l.Host, l.Port, err) + log.Panicf("Failure listing on socket %s: %v", l.Socket, err) } - }(l) + sockets = append(sockets, sL) + go func() { + srv := &http.Server{ + ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second, + WriteTimeout: time.Duration(conf.Httpd.Timeout.Write) * time.Second, + IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second, + Handler: r, + } + _ = srv.Serve(sL) + }() + } else { + log.Infof("Listening on %s:%d", l.Host, l.Port) + tL, err := net.Listen("tcp", fmt.Sprintf("%s:%d", l.Host, l.Port)) + if err != nil { + log.Panicf("Failure listing on %s:%d: %v", l.Host, l.Port, err) + } + go func(l struct { + Socket string + Host string + Port int + }) { + srv := &http.Server{ + ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second, + WriteTimeout: time.Duration(conf.Httpd.Timeout.Write) * time.Second, + IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second, + Handler: r, + } + err = srv.Serve(tL) + if err != nil { + log.Fatalf("Failure serving on %s:%d: %v", l.Host, l.Port, err) + } + }(l) + } } }