add systemd-socket activation

This commit is contained in:
2023-12-15 19:20:33 +01:00
parent 1759092b57
commit 98b4e8f818
3 changed files with 59 additions and 27 deletions

82
main.go
View File

@@ -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)
}
}
}