72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
type PlatformStatus struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Version string `json:"version"`
|
|
IDLike string `json:"id_like,omitempty"`
|
|
PackageManager string `json:"package_manager"`
|
|
Desktop string `json:"desktop,omitempty"`
|
|
Session string `json:"session,omitempty"`
|
|
SystemdUser bool `json:"systemd_user"`
|
|
Omarchy bool `json:"omarchy"`
|
|
}
|
|
|
|
func detectPlatform() PlatformStatus {
|
|
p := PlatformStatus{ID: "linux", Name: "Linux"}
|
|
if f, err := os.Open("/etc/os-release"); err == nil {
|
|
defer f.Close()
|
|
vals := map[string]string{}
|
|
sc := bufio.NewScanner(f)
|
|
for sc.Scan() {
|
|
line := strings.TrimSpace(sc.Text())
|
|
if line == "" || strings.HasPrefix(line, "#") {
|
|
continue
|
|
}
|
|
k, v, ok := strings.Cut(line, "=")
|
|
if ok {
|
|
vals[k] = strings.Trim(strings.TrimSpace(v), `"'`)
|
|
}
|
|
}
|
|
if vals["ID"] != "" {
|
|
p.ID = vals["ID"]
|
|
}
|
|
if vals["PRETTY_NAME"] != "" {
|
|
p.Name = vals["PRETTY_NAME"]
|
|
} else if vals["NAME"] != "" {
|
|
p.Name = vals["NAME"]
|
|
}
|
|
p.Version = vals["VERSION_ID"]
|
|
p.IDLike = vals["ID_LIKE"]
|
|
}
|
|
switch {
|
|
case commandExists("apt-get"):
|
|
p.PackageManager = "apt"
|
|
case commandExists("dnf"):
|
|
p.PackageManager = "dnf"
|
|
case commandExists("pacman"):
|
|
p.PackageManager = "pacman"
|
|
case commandExists("zypper"):
|
|
p.PackageManager = "zypper"
|
|
case commandExists("apk"):
|
|
p.PackageManager = "apk"
|
|
default:
|
|
p.PackageManager = "unknown"
|
|
}
|
|
p.Desktop = envOr("XDG_CURRENT_DESKTOP", envOr("DESKTOP_SESSION", ""))
|
|
p.Session = envOr("XDG_SESSION_TYPE", "")
|
|
if commandExists("systemctl") {
|
|
cmd := exec.Command("systemctl", "--user", "show-environment")
|
|
p.SystemdUser = cmd.Run() == nil
|
|
}
|
|
p.Omarchy = commandExists("omarchy")
|
|
return p
|
|
}
|