package sdnotify import ( "fmt" "math" "net" "os" "strconv" "time" ) const ( SocketEnv = "NOTIFY_SOCKET" WatchdogUsecEnv = "WATCHDOG_USEC" WatchdogPIDEnv = "WATCHDOG_PID" ) const ( Ready = "READY=1" Stopping = "STOPPING=1" Watchdog = "WATCHDOG=1" ) func WatchdogInterval() (time.Duration, bool) { usec, err := strconv.ParseInt(os.Getenv(WatchdogUsecEnv), 10, 64) if err != nil || usec <= 0 || usec > math.MaxInt64/int64(time.Microsecond) { return 0, false } if pid := os.Getenv(WatchdogPIDEnv); pid != "" && pid != strconv.Itoa(os.Getpid()) { return 0, false } return time.Duration(usec) * time.Microsecond, true } func Notify(state string) error { name := os.Getenv(SocketEnv) if name == "" { return nil } if name[0] != '/' && name[0] != '@' { return fmt.Errorf("%s=%q is neither an absolute path nor an abstract socket (@name)", SocketEnv, name) } conn, err := net.DialUnix("unixgram", nil, &net.UnixAddr{Name: name, Net: "unixgram"}) if err != nil { return fmt.Errorf("notify %s: %w", state, err) } defer conn.Close() if _, err := conn.Write([]byte(state)); err != nil { return fmt.Errorf("notify %s: %w", state, err) } return nil }