summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorStefan Tatschner <stefan@rumpelsepp.org>2021-01-12 22:38:53 +0100
committerGitHub <noreply@github.com>2021-01-12 14:38:53 -0700
commit59071ea15d2aacb69fcfc088f4996717cd2bfc73 (patch)
tree69a5670ec29233ad2e4e6008cda89acd635c8f43 /cmd
parent14f50d9dfb6c0da0da636829175a37b1864d23cf (diff)
cmd: Implement sd_notify() to notify systemd about readiness (#3963)
Issue: #3786 Based on Gaurav Dhameeja's work in #3908.
Diffstat (limited to 'cmd')
-rw-r--r--cmd/commandfuncs.go13
-rw-r--r--cmd/notify.go23
-rw-r--r--cmd/notify_linux.go68
-rw-r--r--cmd/notify_other.go25
4 files changed, 129 insertions, 0 deletions
diff --git a/cmd/commandfuncs.go b/cmd/commandfuncs.go
index 25cbe58..1ee7dd8 100644
--- a/cmd/commandfuncs.go
+++ b/cmd/commandfuncs.go
@@ -271,6 +271,10 @@ func cmdRun(fl Flags) (int, error) {
}
}
+ if err := NotifyReadiness(); err != nil {
+ caddy.Log().Error("unable to notify readiness to service manager", zap.Error(err))
+ }
+
select {}
}
@@ -291,6 +295,15 @@ func cmdReload(fl Flags) (int, error) {
reloadCmdConfigAdapterFlag := fl.String("adapter")
reloadCmdAddrFlag := fl.String("address")
+ if err := NotifyReloading(); err != nil {
+ caddy.Log().Error("unable to notify reloading to service manager", zap.Error(err))
+ }
+ defer func() {
+ if err := NotifyReadiness(); err != nil {
+ caddy.Log().Error("unable to notify readiness to service manager", zap.Error(err))
+ }
+ }()
+
// get the config in caddy's native format
config, configFile, err := loadConfig(reloadCmdConfigFlag, reloadCmdConfigAdapterFlag)
if err != nil {
diff --git a/cmd/notify.go b/cmd/notify.go
new file mode 100644
index 0000000..920f2a2
--- /dev/null
+++ b/cmd/notify.go
@@ -0,0 +1,23 @@
+// Copyright 2015 Matthew Holt and The Caddy Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package caddycmd
+
+func NotifyReadiness() error {
+ return notifyReadiness()
+}
+
+func NotifyReloading() error {
+ return notifyReloading()
+}
diff --git a/cmd/notify_linux.go b/cmd/notify_linux.go
new file mode 100644
index 0000000..924c00f
--- /dev/null
+++ b/cmd/notify_linux.go
@@ -0,0 +1,68 @@
+// Copyright 2015 Matthew Holt and The Caddy Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package caddycmd
+
+import (
+ "io"
+ "net"
+ "os"
+ "strings"
+)
+
+// The documentation about this IPC protocol is available here:
+// https://www.freedesktop.org/software/systemd/man/sd_notify.html
+
+func sdNotify(path, payload string) error {
+ socketAddr := &net.UnixAddr{
+ Name: path,
+ Net: "unixgram",
+ }
+
+ conn, err := net.DialUnix(socketAddr.Net, nil, socketAddr)
+ if err != nil {
+ return err
+ }
+ defer conn.Close()
+
+ if _, err := io.Copy(conn, strings.NewReader(payload)); err != nil {
+ return err
+ }
+ return nil
+}
+
+// notifyReadiness notifies systemd caddy that has finished its
+// initialization routines.
+func notifyReadiness() error {
+ val, ok := os.LookupEnv("NOTIFY_SOCKET")
+ if !ok || val == "" {
+ return nil
+ }
+ if err := sdNotify(val, "READY=1"); err != nil {
+ return err
+ }
+ return nil
+}
+
+// notifyReadiness notifies systemd that caddy is reloading its config.
+func notifyReloading() error {
+ val, ok := os.LookupEnv("NOTIFY_SOCKET")
+ if !ok || val == "" {
+ return nil
+ }
+ if err := sdNotify(val, "RELOADING=1"); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/cmd/notify_other.go b/cmd/notify_other.go
new file mode 100644
index 0000000..4425ed7
--- /dev/null
+++ b/cmd/notify_other.go
@@ -0,0 +1,25 @@
+// Copyright 2015 Matthew Holt and The Caddy Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// +build !linux
+
+package caddycmd
+
+func notifyReadiness() error {
+ return nil
+}
+
+func notifyReloading() error {
+ return nil
+}