diff --git a/state/state.go b/state/state.go index 4cf42dc9..7f569002 100644 --- a/state/state.go +++ b/state/state.go @@ -42,6 +42,7 @@ type PartitionState struct { type Kairos struct { Flavor string `yaml:"flavor" json:"flavor"` Version string `yaml:"version" json:"version"` + Init string `yaml:"init" json:"init"` } type Runtime struct { @@ -224,6 +225,7 @@ func detectKairos(r *Runtime) { if err == nil { k.Version = v } + k.Init = utils.GetInit() r.Kairos = *k } diff --git a/utils/utils.go b/utils/utils.go index 372ba1bf..02c5ed6b 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -20,6 +20,12 @@ import ( "github.com/qeesung/image2ascii/convert" ) +const ( + systemd = "systemd" + openrc = "openrc" + unknown = "unknown" +) + func SH(c string) (string, error) { cmd := exec.Command("/bin/sh", "-c", c) cmd.Env = os.Environ() @@ -110,6 +116,27 @@ func Flavor() string { return v } +// GetInit Return the init system used by the OS +func GetInit() string { + for _, file := range []string{"/run/systemd/system", "/sbin/systemctl", "/usr/bin/systemctl", "/usr/sbin/systemctl", "/usr/bin/systemctl"} { + _, err := os.Stat(file) + // Found systemd + if err == nil { + return systemd + } + } + + for _, file := range []string{"/sbin/openrc", "/usr/sbin/openrc", "/bin/openrc", "/usr/bin/openrc"} { + _, err := os.Stat(file) + // Found openrc + if err == nil { + return openrc + } + } + + return unknown +} + func Name() string { v, err := OSRelease("NAME") if err != nil { @@ -120,8 +147,7 @@ func Name() string { } func IsOpenRCBased() bool { - n := Name() - return strings.Contains(n, "alpine") + return GetInit() == openrc } func ShellSTDIN(s, c string) (string, error) {