package main import ( "fmt" "log" "os" "os/exec" "strings" "github.com/spf13/cobra" "github.com/spf13/viper" ) var rootCmd = &cobra.Command{ Use: "system_setup_tool", Short: "Installs packages based on TOML configuration", Run: run, } var searchCmd = &cobra.Command{ Use: "search [package_name]", Short: "Search for a package across package managers (will search in os|flatpak|homebrew)", Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { packageName := args[0] managers := []string{"brew", "os", "flatpak"} for _, manager := range managers { fmt.Printf("Searching in %s:\n", manager) results := searchPackage(packageName, manager) displayResults(results, manager) fmt.Println() } }, } func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringP("config", "c", "", "Path to the configuration file") viper.BindPFlag("config", rootCmd.PersistentFlags().Lookup("config")) addCmd.Flags().StringP("name", "n", "", "The name of the package you want to add") addCmd.Flags().StringP("manager", "m", "", "The package manager you want to add the package to (homebrew|cargo|flatpak|pipx|go)") addCmd.Flags().Bool("system", false, "Add as a system package") addCmd.Flags().Bool("headless", false, "Add as a headless system package (only used with --system)") deleteCmd.Flags().StringP("name", "n", "", "The name of the package you want to delete") deleteCmd.Flags().StringP("manager", "m", "", "The package manager you want to delete the package from (homebrew|cargo|flatpak|pipx|go)") deleteCmd.Flags().Bool("system", false, "Delete from system packages") deleteCmd.Flags().Bool("headless", false, "Delete from headless system packages (only used with --system)") enableCmd.Flags().Bool("value", true, "Set to true to enable, false to disable") packageCmd.AddCommand(addCmd, deleteCmd, showCmd, enableCmd) rootCmd.AddCommand(packageCmd, searchCmd) } func initConfig() { if cfgFile := viper.GetString("config"); cfgFile != "" { viper.SetConfigFile(cfgFile) } else { viper.SetConfigName("config") viper.SetConfigType("toml") viper.AddConfigPath(".") } if err := viper.ReadInConfig(); err != nil { fmt.Println("Error reading configuration file:", err) os.Exit(1) } } func displayResults(results []string, manager string) { if len(results) == 0 { fmt.Printf("No results found in %s\n", manager) return } for _, result := range results { fmt.Printf("- %s\n", result) } } func searchPackage(packageName, manager string) []string { switch manager { case "brew": cmd := exec.Command("brew", "search", packageName) packages, err := cmd.Output() if err != nil { log.Printf("error fetching %s packages: %v", manager, err) } packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") return packageList case "os": opSys, err := getLinuxDistribution() if err != nil { log.Printf("Error getting OS information: %v", err) return []string{} } cmdParts := strings.Fields(opSys.SearchCommand) if len(cmdParts) == 0 { log.Printf("Invalid search command for OS package manager") return []string{} } cmd := exec.Command(cmdParts[0], append(cmdParts[1:], packageName)...) packages, err := cmd.Output() if err != nil { log.Printf("Error fetching %s packages: %v", manager, err) return []string{} } packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") return packageList case "flatpak": cmd := exec.Command("flatpak", "search", packageName) packages, err := cmd.Output() if err != nil { log.Printf("error fetching %s packages: %v", manager, err) } packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") return packageList } return []string{"Beispielpaket 1", "Beispielpaket 2"} // Platzhalter }