|
@@ -0,0 +1,42 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "net"
|
|
|
+ "os"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/sirupsen/logrus"
|
|
|
+)
|
|
|
+
|
|
|
+// SdNotifyReady tells systemd the service is ready and dependent services can now be started
|
|
|
+// https://www.freedesktop.org/software/systemd/man/sd_notify.html
|
|
|
+// https://www.freedesktop.org/software/systemd/man/systemd.service.html
|
|
|
+const SdNotifyReady = "READY=1"
|
|
|
+
|
|
|
+func notifyReady(l *logrus.Logger) {
|
|
|
+ sockName := os.Getenv("NOTIFY_SOCKET")
|
|
|
+ if sockName == "" {
|
|
|
+ l.Debugln("NOTIFY_SOCKET systemd env var not set, not sending ready signal")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ conn, err := net.DialTimeout("unixgram", sockName, time.Second)
|
|
|
+ if err != nil {
|
|
|
+ l.WithError(err).Error("failed to connect to systemd notification socket")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer conn.Close()
|
|
|
+
|
|
|
+ err = conn.SetWriteDeadline(time.Now().Add(time.Second))
|
|
|
+ if err != nil {
|
|
|
+ l.WithError(err).Error("failed to set the write deadline for the systemd notification socket")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if _, err = conn.Write([]byte(SdNotifyReady)); err != nil {
|
|
|
+ l.WithError(err).Error("failed to signal the systemd notification socket")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ l.Debugln("notified systemd the service is ready")
|
|
|
+}
|