123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- // Copyright 2014 Docker, Inc.
- // Copyright 2015-2018 CoreOS, Inc.
- //
- // 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 daemon provides a Go implementation of the sd_notify protocol.
- // It can be used to inform systemd of service start-up completion, watchdog
- // events, and other status changes.
- //
- // https://www.freedesktop.org/software/systemd/man/sd_notify.html#Description
- package daemon
- import (
- "net"
- "os"
- )
- const (
- // SdNotifyReady tells the service manager that service startup is finished
- // or the service finished loading its configuration.
- SdNotifyReady = "READY=1"
- // SdNotifyStopping tells the service manager that the service is beginning
- // its shutdown.
- SdNotifyStopping = "STOPPING=1"
- // SdNotifyReloading tells the service manager that this service is
- // reloading its configuration. Note that you must call SdNotifyReady when
- // it completed reloading.
- SdNotifyReloading = "RELOADING=1"
- // SdNotifyWatchdog tells the service manager to update the watchdog
- // timestamp for the service.
- SdNotifyWatchdog = "WATCHDOG=1"
- )
- // SdNotify sends a message to the init daemon. It is common to ignore the error.
- // If `unsetEnvironment` is true, the environment variable `NOTIFY_SOCKET`
- // will be unconditionally unset.
- //
- // It returns one of the following:
- // (false, nil) - notification not supported (i.e. NOTIFY_SOCKET is unset)
- // (false, err) - notification supported, but failure happened (e.g. error connecting to NOTIFY_SOCKET or while sending data)
- // (true, nil) - notification supported, data has been sent
- func SdNotify(unsetEnvironment bool, state string) (bool, error) {
- socketAddr := &net.UnixAddr{
- Name: os.Getenv("NOTIFY_SOCKET"),
- Net: "unixgram",
- }
- // NOTIFY_SOCKET not set
- if socketAddr.Name == "" {
- return false, nil
- }
- if unsetEnvironment {
- if err := os.Unsetenv("NOTIFY_SOCKET"); err != nil {
- return false, err
- }
- }
- conn, err := net.DialUnix(socketAddr.Net, nil, socketAddr)
- // Error connecting to NOTIFY_SOCKET
- if err != nil {
- return false, err
- }
- defer conn.Close()
- if _, err = conn.Write([]byte(state)); err != nil {
- return false, err
- }
- return true, nil
- }
|