fix packagemanager

This commit is contained in:
Jeffrey Paul 2025-05-01 03:37:48 -07:00
parent d8ed6f1abf
commit fb3a4af3c9

View File

@ -4,7 +4,7 @@ import (
"os/exec" "os/exec"
) )
// PackageManager is an abstraction over distro package tooling. // PackageManager abstracts distro package handling.
type PackageManager interface { type PackageManager interface {
Distro() string Distro() string
InstallPackages(pkgs ...string) error InstallPackages(pkgs ...string) error
@ -16,9 +16,12 @@ type PackageManager interface {
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
type aptManager struct { type aptManager struct {
logf func(string, ...any) logf func(string, ...any) // logger from App
updated bool // true after first apt-update
} }
// newPackageManager is called once in app.go; the same instance is
// passed to every collector, so apt-update can be executed exactly once.
func newPackageManager(logf func(string, ...any)) PackageManager { func newPackageManager(logf func(string, ...any)) PackageManager {
return &aptManager{logf: logf} return &aptManager{logf: logf}
} }
@ -31,11 +34,27 @@ func (a *aptManager) ExecExists(bin string) bool {
} }
func (a *aptManager) InstallPackages(pkgs ...string) error { func (a *aptManager) InstallPackages(pkgs ...string) error {
args := append([]string{"-y", "install"}, pkgs...) if len(pkgs) == 0 {
return nil
}
// refresh package index only the first time we install anything
if !a.updated {
a.logf("apt update")
if err := exec.Command(
"apt-get", "-qq", "-y", "update",
).Run(); err != nil {
return err
}
a.updated = true
}
args := append(
[]string{"-qq", "-y", "--no-install-recommends", "install"},
pkgs...,
)
cmd := exec.Command("apt-get", args...) cmd := exec.Command("apt-get", args...)
cmd.Env = append(cmd.Env, "DEBIAN_FRONTEND=noninteractive") cmd.Env = append(cmd.Env, "DEBIAN_FRONTEND=noninteractive")
cmd.Stdout = nil
cmd.Stderr = nil
a.logf("apt install %v", pkgs) a.logf("apt install %v", pkgs)
return cmd.Run() return cmd.Run()
} }