package main import ( "fmt" "os/exec" "strings" ) type Packages struct { Headless []string `mapstructure:"headless"` NonHeadless []string `mapstructure:"non_headless"` } type SpecialPackages struct { Go []string `mapstructure:"go"` Cargo []string `mapstructure:"cargo"` Pipx []string `mapstructure:"pipx"` } func installPackage(cmd, pkg, sudoPassword string) error { fullCmd := fmt.Sprintf("%s %s", cmd, pkg) command := exec.Command("sudo", "-S", "sh", "-c", fullCmd) 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") || strings.Contains(string(output), "Ziel nicht gefunden") { unavailablePackages = append(unavailablePackages, pkg) return nil } return fmt.Errorf("failed to install %s: %v\n%s", pkg, err, string(output)) } return nil } func installSpecialPackages(sp SpecialPackages) error { for _, pkg := range sp.Go { cmd := exec.Command("go", "install", pkg+"@latest") if err := cmd.Run(); err != nil { return fmt.Errorf("fehler bei der Installation von %s: %v", pkg, err) } } for _, pkg := range sp.Cargo { cmd := exec.Command("cargo", "install", pkg) if err := cmd.Run(); err != nil { return fmt.Errorf("fehler bei der Installation von %s: %v", pkg, err) } } for _, pkg := range sp.Pipx { cmd := exec.Command("pipx", "install", pkg) if err := cmd.Run(); err != nil { return fmt.Errorf("fehler bei der Installation von %s: %v", pkg, err) } } return nil } func printUnavailablePackages() { if len(unavailablePackages) > 0 { fmt.Println("\nFolgende Pakete waren nicht verfügbar:") for _, pkg := range unavailablePackages { fmt.Printf("- %s\n", pkg) } } }