agent/util/systemdutil/systemd.go (68 lines of code) (raw):
//go:build linux
// +build linux
package systemdutil
import (
"context"
"os"
"strings"
"sync"
systemdDbus "github.com/coreos/go-systemd/v22/dbus"
)
var (
isRunningSystemdOnce sync.Once
isRunningSystemd bool
cm = newDbusConnManager()
)
// NOTE: This function comes from package github.com/coreos/go-systemd/util
// It was borrowed here to avoid a dependency on cgo.
//
// IsRunningSystemd checks whether the host was booted with systemd as its init
// system. This functions similarly to systemd's `sd_booted(3)`: internally, it
// checks whether /run/systemd/system/ exists and is a directory.
// http://www.freedesktop.org/software/systemd/man/sd_booted.html
func IsRunningSystemd() bool {
isRunningSystemdOnce.Do(func() {
fi, err := os.Lstat("/run/systemd/system")
isRunningSystemd = err == nil && fi.IsDir()
})
return isRunningSystemd
}
func SystemState(ctx context.Context) (string, error) {
var property *systemdDbus.Property
var err error
cm.retryOnDisconnect(func(c *systemdDbus.Conn) error {
property, err = c.SystemStateContext(ctx)
return err
})
if err != nil {
return "", err
}
return strings.Trim(property.Value.String(), "\""), nil
}
func StopUnit(ctx context.Context, unitName string) (string, error) {
ch := make(chan string, 1)
err := cm.retryOnDisconnect(func(c *systemdDbus.Conn) error {
_, err := c.StopUnitContext(ctx, unitName, "replace", ch)
return err
})
var res string
if err == nil {
res = <-ch
}
return res, err
}
func StartUnit(ctx context.Context, unitName string) (string, error) {
ch := make(chan string, 1)
err := cm.retryOnDisconnect(func(c *systemdDbus.Conn) error {
_, err := c.StartUnitContext(ctx, unitName, "replace", ch)
return err
})
var res string
if err == nil {
res = <-ch
}
return res, err
}
func RestartUnit(ctx context.Context, unitName string) (string, error) {
ch := make(chan string, 1)
err := cm.retryOnDisconnect(func(c *systemdDbus.Conn) error {
_, err := c.RestartUnitContext(ctx, unitName, "replace", ch)
return err
})
var res string
if err == nil {
res = <-ch
}
return res, err
}