feat(cli): add checks for pacman

This commit is contained in:
Patryk Hegenberg 2024-12-27 11:08:40 +01:00
parent 43cf46300f
commit 6991a6861a

61
main.go
View file

@ -20,9 +20,10 @@ import (
) )
type OS struct { type OS struct {
ID string ID string
Name string Name string
Version string Version string
PackageManager string
} }
func parseOsRelease(osRelease string) *OS { func parseOsRelease(osRelease string) *OS {
@ -30,6 +31,7 @@ func parseOsRelease(osRelease string) *OS {
result.ID = "Unknown" result.ID = "Unknown"
result.Name = "Unknown" result.Name = "Unknown"
result.Version = "Unknown" result.Version = "Unknown"
result.PackageManager = "Unkown"
lines := strings.Split(osRelease, "\n") lines := strings.Split(osRelease, "\n")
@ -47,6 +49,10 @@ func parseOsRelease(osRelease string) *OS {
result.Version = strings.Trim(splitLine[1], "\"") result.Version = strings.Trim(splitLine[1], "\"")
} }
} }
err := getPackageManager(&result)
if err != nil {
log.Fatal(err)
}
return &result return &result
} }
@ -60,14 +66,17 @@ func getLinuxDistribution() (*OS, error) {
return parseOsRelease(string(osRelease)), nil return parseOsRelease(string(osRelease)), nil
} }
func getPackageManager(os *OS) (string, error) { func getPackageManager(os *OS) error {
switch os.ID { switch os.ID {
case "debian", "ubuntu": case "debian", "ubuntu":
return "apt", nil os.PackageManager = "apt"
return nil
case "arch": case "arch":
return "pacman", nil os.PackageManager = "pacman"
return nil
case "fedora": case "fedora":
return "dnf", nil os.PackageManager = "dnf"
return nil
default: default:
var pmcommands = []string{ var pmcommands = []string{
"apt", "apt",
@ -77,10 +86,11 @@ func getPackageManager(os *OS) (string, error) {
for _, pmname := range pmcommands { for _, pmname := range pmcommands {
_, err := exec.LookPath(pmname) _, err := exec.LookPath(pmname)
if err == nil { if err == nil {
return pmname, nil os.PackageManager = pmname
return nil
} }
} }
return "", fmt.Errorf("no packagemanager found for os: %s", os) return fmt.Errorf("no packagemanager found for os: %s", os)
} }
} }
@ -102,6 +112,26 @@ func getSudoPassword() (string, error) {
return password, nil return password, nil
} }
func installBuildEssentials(os *OS, sudoPassword string) error {
var command string
switch os.PackageManager {
case "pacman":
command = "pacman -S --noconfirm --needed base-devel"
case "apt":
command = "apt install -y build-essential"
case "dnf":
command = "dnf install -y @development-tools"
default:
return fmt.Errorf("keine Build Essentials für OS %s definiert", os.ID)
}
fmt.Printf("Installiere Build Essentials für %s...\n", os.Name)
if err := installPackage(command, "", sudoPassword); err != nil {
return fmt.Errorf("Fehler bei der Installation der Build Essentials: %v", err)
}
return nil
}
func getInstallCommand(pm string) (string, error) { func getInstallCommand(pm string) (string, error) {
switch pm { switch pm {
case "apt": case "apt":
@ -125,7 +155,6 @@ type specialSoftwareModel struct {
} }
func newSpecialSoftwareModel(sudoPassword string) specialSoftwareModel { func newSpecialSoftwareModel(sudoPassword string) specialSoftwareModel {
// Definiere die zu installierenden Items
items := []string{"oh-my-posh", "golang", "rust"} items := []string{"oh-my-posh", "golang", "rust"}
p := progress.New( p := progress.New(
@ -235,7 +264,7 @@ func installPackage(cmd, pkg, sudoPassword string) error {
command.Stdin = strings.NewReader(sudoPassword + "\n") command.Stdin = strings.NewReader(sudoPassword + "\n")
output, err := command.CombinedOutput() output, err := command.CombinedOutput()
if err != nil { if err != nil {
if strings.Contains(string(output), "not found") || strings.Contains(string(output), "no matching package") || strings.Contains(string(output), "Keine Übereinstimmung") { if strings.Contains(string(output), "not found") || strings.Contains(string(output), "no matching package") || strings.Contains(string(output), "Keine Übereinstimmung") || strings.Contains(string(output), "Ziel nicht gefunden") {
unavailablePackages = append(unavailablePackages, pkg) unavailablePackages = append(unavailablePackages, pkg)
return nil return nil
} }
@ -512,11 +541,7 @@ func run(cmd *cobra.Command, args []string) {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
pm, err := getPackageManager(os) installCommand, err = getInstallCommand(os.PackageManager)
if err != nil {
log.Fatal(err)
}
installCommand, err = getInstallCommand(pm)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -574,6 +599,9 @@ func run(cmd *cobra.Command, args []string) {
} }
if installSpecial { if installSpecial {
if err := installBuildEssentials(os, sudoPassword); err != nil {
log.Printf("Warnung: %v", err)
}
sm := newSpecialSoftwareModel(sudoPassword) sm := newSpecialSoftwareModel(sudoPassword)
p = tea.NewProgram(sm) p = tea.NewProgram(sm)
if _, err := p.Run(); err != nil { if _, err := p.Run(); err != nil {
@ -582,7 +610,6 @@ func run(cmd *cobra.Command, args []string) {
} }
if len(cfg.SpecialPackages.Go) > 0 || len(cfg.SpecialPackages.Cargo) > 0 || len(cfg.SpecialPackages.Pipx) > 0 { if len(cfg.SpecialPackages.Go) > 0 || len(cfg.SpecialPackages.Cargo) > 0 || len(cfg.SpecialPackages.Pipx) > 0 {
// Combine all special packages for the progress bar
var allSpecialPkgs []struct { var allSpecialPkgs []struct {
typ string typ string
name string name string