From dd37233e286e65247348d51f95b4ae4bce13be22 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Wed, 26 May 2021 13:10:58 +0200 Subject: [PATCH] daemon: listeners: make systemd listener optional On non systemd systems, the systemd-based activation is not needed at all, thus make it build-time optional. It won't be built in if the 'no_systemd' tag is set. changes v2: renamed 'nosystemd' tag to 'no_systemd' changes v3: fixed some obsolete imports use new style tags Signed-off-by: Enrico Weigelt, metux IT consult --- daemon/listeners/listeners_linux.go | 50 --------------------- daemon/listeners/listenfd_nosystemd.go | 13 ++++++ daemon/listeners/listenfd_systemd.go | 60 ++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 50 deletions(-) create mode 100644 daemon/listeners/listenfd_nosystemd.go create mode 100644 daemon/listeners/listenfd_systemd.go diff --git a/daemon/listeners/listeners_linux.go b/daemon/listeners/listeners_linux.go index e0fd2bfe125a1..da4224f2171f9 100644 --- a/daemon/listeners/listeners_linux.go +++ b/daemon/listeners/listeners_linux.go @@ -5,10 +5,8 @@ import ( "crypto/tls" "net" "os" - "strconv" "github.com/containerd/containerd/log" - "github.com/coreos/go-systemd/v22/activation" "github.com/docker/docker/pkg/homedir" "github.com/docker/go-connections/sockets" "github.com/pkg/errors" @@ -58,51 +56,3 @@ func Init(proto, addr, socketGroup string, tlsConfig *tls.Config) ([]net.Listene return ls, nil } - -// listenFD returns the specified socket activated files as a slice of -// net.Listeners or all of the activated files if "*" is given. -func listenFD(addr string, tlsConfig *tls.Config) ([]net.Listener, error) { - var ( - err error - listeners []net.Listener - ) - // socket activation - if tlsConfig != nil { - listeners, err = activation.TLSListeners(tlsConfig) - } else { - listeners, err = activation.Listeners() - } - if err != nil { - return nil, err - } - - if len(listeners) == 0 { - return nil, errors.New("no sockets found via socket activation: make sure the service was started by systemd") - } - - // default to all fds just like unix:// and tcp:// - if addr == "" || addr == "*" { - return listeners, nil - } - - fdNum, err := strconv.Atoi(addr) - if err != nil { - return nil, errors.Errorf("failed to parse systemd fd address: should be a number: %v", addr) - } - fdOffset := fdNum - 3 - if len(listeners) < fdOffset+1 { - return nil, errors.New("too few socket activated files passed in by systemd") - } - if listeners[fdOffset] == nil { - return nil, errors.Errorf("failed to listen on systemd activated file: fd %d", fdOffset+3) - } - for i, ls := range listeners { - if i == fdOffset || ls == nil { - continue - } - if err := ls.Close(); err != nil { - return nil, errors.Wrapf(err, "failed to close systemd activated file: fd %d", fdOffset+3) - } - } - return []net.Listener{listeners[fdOffset]}, nil -} diff --git a/daemon/listeners/listenfd_nosystemd.go b/daemon/listeners/listenfd_nosystemd.go new file mode 100644 index 0000000000000..3b1b6bddfee24 --- /dev/null +++ b/daemon/listeners/listenfd_nosystemd.go @@ -0,0 +1,13 @@ +//go:build linux && no_systemd + +package listeners // import "github.com/docker/docker/daemon/listeners" + +import ( + "crypto/tls" + "errors" + "net" +) + +func listenFD(addr string, tlsConfig *tls.Config) ([]net.Listener, error) { + return nil, errors.New("listenFD not implemented") +} diff --git a/daemon/listeners/listenfd_systemd.go b/daemon/listeners/listenfd_systemd.go new file mode 100644 index 0000000000000..9adf557d2d1d6 --- /dev/null +++ b/daemon/listeners/listenfd_systemd.go @@ -0,0 +1,60 @@ +//go:build linux && !no_systemd + +package listeners // import "github.com/docker/docker/daemon/listeners" + +import ( + "crypto/tls" + "net" + "strconv" + + "github.com/coreos/go-systemd/v22/activation" + "github.com/pkg/errors" +) + +// listenFD returns the specified socket activated files as a slice of +// net.Listeners or all of the activated files if "*" is given. +func listenFD(addr string, tlsConfig *tls.Config) ([]net.Listener, error) { + var ( + err error + listeners []net.Listener + ) + // socket activation + if tlsConfig != nil { + listeners, err = activation.TLSListeners(tlsConfig) + } else { + listeners, err = activation.Listeners() + } + if err != nil { + return nil, err + } + + if len(listeners) == 0 { + return nil, errors.New("no sockets found via socket activation: make sure the service was started by systemd") + } + + // default to all fds just like unix:// and tcp:// + if addr == "" || addr == "*" { + return listeners, nil + } + + fdNum, err := strconv.Atoi(addr) + if err != nil { + return nil, errors.Errorf("failed to parse systemd fd address: should be a number: %v", addr) + } + fdOffset := fdNum - 3 + if len(listeners) < fdOffset+1 { + return nil, errors.New("too few socket activated files passed in by systemd") + } + if listeners[fdOffset] == nil { + return nil, errors.Errorf("failed to listen on systemd activated file: fd %d", fdOffset+3) + } + for i, ls := range listeners { + if i == fdOffset || ls == nil { + continue + } + if err := ls.Close(); err != nil { + return nil, errors.Wrapf(err, "failed to close systemd activated file: fd %d", fdOffset+3) + } + } + return []net.Listener{listeners[fdOffset]}, nil +}