Files
omarchy-sc/backend/cmd/citizen-launcher/platform.go
T
2026-08-31 18:46:57 +02:00

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
}