Portability: sysfs-only sensors with thermal-zone fallback, /sys/block disk discovery, fs blacklist, pwrstat/NUT/apcupsd UPS, login shell from passwd, templated unit + install for any user, cross-compile targets

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Mitchell-Johnson
2026-09-17 13:43:44 -07:00
co-authored by Claude Fable 5.1
parent 3c6f4d4639
commit 7053cce7fe
9 changed files with 432 additions and 102 deletions
+23 -1
View File
@@ -12,6 +12,7 @@ import (
"os/signal"
"os/user"
"path/filepath"
"strings"
"syscall"
"time"
@@ -116,7 +117,7 @@ func serve(cfg *config.Config) error {
}
shell := os.Getenv("SHELL")
if shell == "" {
shell = "/bin/bash"
shell = loginShell(u.Username)
}
mgr := hterm.NewManager(shell, u.HomeDir)
mgr.OnChange = func(list []hterm.Info) {
@@ -162,3 +163,24 @@ func serve(cfg *config.Config) error {
}
return nil
}
// loginShell returns the user's shell from /etc/passwd, falling back to bash if
// present and /bin/sh otherwise. Systemd units don't export $SHELL.
func loginShell(username string) string {
if b, err := os.ReadFile("/etc/passwd"); err == nil {
for _, line := range strings.Split(string(b), "\n") {
f := strings.Split(line, ":")
if len(f) >= 7 && f[0] == username && f[6] != "" {
if _, err := os.Stat(f[6]); err == nil {
return f[6]
}
}
}
}
for _, sh := range []string{"/bin/bash", "/usr/bin/bash", "/bin/zsh", "/bin/sh"} {
if _, err := os.Stat(sh); err == nil {
return sh
}
}
return "/bin/sh"
}