package main import ( "fmt" "log" "github.com/charmbracelet/huh" "github.com/charmbracelet/lipgloss" "github.com/mitchellh/mapstructure" "github.com/spf13/cobra" "github.com/spf13/viper" ) var ( currentPkgNameStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("211")) doneStyle = lipgloss.NewStyle().Margin(1, 2) checkMark = lipgloss.NewStyle().Foreground(lipgloss.Color("42")).SetString("✓") unavailablePackages []string ) type installedPkgMsg string func run(cmd *cobra.Command, args []string) { os, err := getLinuxDistribution() if err != nil { log.Fatal(err) } sudoPassword, err := getSudoPassword() if err != nil { log.Fatal(err) } var cfg Config if err := viper.Unmarshal(&cfg); err != nil { log.Fatalf("Fehler beim Lesen der Konfiguration: %v", err) } form := huh.NewForm( huh.NewGroup( huh.NewConfirm(). Title("Möchten Sie eine headless Installation durchführen?"). Value(&cfg.Headless), ), ).WithTheme(huh.ThemeCatppuccin()) if err := form.Run(); err != nil { log.Fatalf("Fehler bei der Benutzerabfrage: %v", err) } unavailablePackages = []string{} osManager := NewOSManager(os, sudoPassword, cfg.Packages.Headless) if err := osManager.Install(cfg.Packages.Headless); err != nil { log.Printf("Warnung bei der Installation der Headless-Pakete: %v", err) } if !cfg.Headless { if err := osManager.Install(cfg.Packages.NonHeadless); err != nil { log.Printf("Warnung bei der Installation der Non-Headless-Pakete: %v", err) } } printUnavailablePackages() var installBuild bool form = huh.NewForm( huh.NewGroup( huh.NewConfirm(). Title("Möchten Sie die Build Essentials installieren?"). Value(&installBuild), ), ).WithTheme(huh.ThemeCatppuccin()) err = form.Run() if err != nil { log.Fatal(err) } if installBuild { if err := osManager.InstallBuildEssentials(); err != nil { log.Printf("Warnung: %v", err) } } var installShellExtensions bool form = huh.NewForm( huh.NewGroup( huh.NewConfirm(). Title("Möchten Sie die Shell-Extensions installieren?"). Value(&installShellExtensions), ), ).WithTheme(huh.ThemeCatppuccin()) err = form.Run() if err != nil { log.Fatal(err) } if installShellExtensions { if err := osManager.InstallSpecialSoftware(); err != nil { log.Printf("Warnung bei der Installation spezieller Software: %v", err) } } for name, config := range cfg.PackageManagers { if config.Enable { var manager PackageManager switch name { case "homebrew": manager = &HomebrewManager{} case "go": manager = &GolangManager{} case "cargo": manager = &CargoManager{} case "pipx": manager = &PipxManager{} case "flatpak": flatpakConfig := FlatpakConfig{} if err := mapstructure.Decode(config, &flatpakConfig); err != nil { log.Printf("Fehler beim Dekodieren der Flatpak-Konfiguration: %v", err) continue } manager = &FlatpakManager{ OS: os, SudoPassword: sudoPassword, Config: flatpakConfig, } default: log.Printf("Unbekannter Paketmanager: %s", name) continue } if err := manager.InstallManager(); err != nil { log.Printf("Warnung Packagemanager %s nicht vorhanden und konnte nicht installiert werden: %v", manager.Name(), err) } if err := manager.Install(config.Packages); err != nil { log.Printf("Warnung bei %s-Paketen: %v", manager.Name(), err) } } } if cfg.Dotfiles.Enable { fmt.Println("\nKonfiguriere Dotfiles...") if err := setupDotfiles(cfg.Dotfiles); err != nil { log.Printf("Warnung bei Dotfiles-Setup: %v", err) } } }