From 6991a6861a03c3b6ff9a727e577d47073ed8ca9d Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 27 Dec 2024 11:08:40 +0100 Subject: [PATCH] feat(cli): add checks for pacman --- main.go | 61 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index 7576312..a0899db 100644 --- a/main.go +++ b/main.go @@ -20,9 +20,10 @@ import ( ) type OS struct { - ID string - Name string - Version string + ID string + Name string + Version string + PackageManager string } func parseOsRelease(osRelease string) *OS { @@ -30,6 +31,7 @@ func parseOsRelease(osRelease string) *OS { result.ID = "Unknown" result.Name = "Unknown" result.Version = "Unknown" + result.PackageManager = "Unkown" lines := strings.Split(osRelease, "\n") @@ -47,6 +49,10 @@ func parseOsRelease(osRelease string) *OS { result.Version = strings.Trim(splitLine[1], "\"") } } + err := getPackageManager(&result) + if err != nil { + log.Fatal(err) + } return &result } @@ -60,14 +66,17 @@ func getLinuxDistribution() (*OS, error) { return parseOsRelease(string(osRelease)), nil } -func getPackageManager(os *OS) (string, error) { +func getPackageManager(os *OS) error { switch os.ID { case "debian", "ubuntu": - return "apt", nil + os.PackageManager = "apt" + return nil case "arch": - return "pacman", nil + os.PackageManager = "pacman" + return nil case "fedora": - return "dnf", nil + os.PackageManager = "dnf" + return nil default: var pmcommands = []string{ "apt", @@ -77,10 +86,11 @@ func getPackageManager(os *OS) (string, error) { for _, pmname := range pmcommands { _, err := exec.LookPath(pmname) 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 } +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) { switch pm { case "apt": @@ -125,7 +155,6 @@ type specialSoftwareModel struct { } func newSpecialSoftwareModel(sudoPassword string) specialSoftwareModel { - // Definiere die zu installierenden Items items := []string{"oh-my-posh", "golang", "rust"} p := progress.New( @@ -235,7 +264,7 @@ func installPackage(cmd, pkg, sudoPassword string) error { command.Stdin = strings.NewReader(sudoPassword + "\n") output, err := command.CombinedOutput() 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) return nil } @@ -512,11 +541,7 @@ func run(cmd *cobra.Command, args []string) { if err != nil { log.Fatal(err) } - pm, err := getPackageManager(os) - if err != nil { - log.Fatal(err) - } - installCommand, err = getInstallCommand(pm) + installCommand, err = getInstallCommand(os.PackageManager) if err != nil { log.Fatal(err) } @@ -574,6 +599,9 @@ func run(cmd *cobra.Command, args []string) { } if installSpecial { + if err := installBuildEssentials(os, sudoPassword); err != nil { + log.Printf("Warnung: %v", err) + } sm := newSpecialSoftwareModel(sudoPassword) p = tea.NewProgram(sm) 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 { - // Combine all special packages for the progress bar var allSpecialPkgs []struct { typ string name string