refactor: seperate files, function and structs into seperate packages

This commit is contained in:
Patryk Hegenberg 2025-01-18 14:34:16 +01:00
parent 7f951585c8
commit 5b7775f33e
37 changed files with 547 additions and 677 deletions

58
cmd/cmd.go Normal file
View file

@ -0,0 +1,58 @@
package cmd
import (
"fmt"
"os"
"system_setup_tool/tui"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var RootCmd = &cobra.Command{
Use: "system_setup_tool",
Short: "Installs packages based on TOML configuration",
Run: tui.Run,
}
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")
installCmd.Flags().StringP("manager", "m", "os", "The package manager you want to install a package with. (Options: os|homebrew|pipx|flatpak|cargo)")
removeCmd.Flags().StringP("manager", "m", "os", "The package manager you want to remove a package with. (Options: os|homebrew|pipx|flatpak|cargo)")
searchCmd.Flags().StringP("manager", "m", "", "The package manager you want to search a package with. (Options: os|homebrew|flatpak)")
packageCmd.AddCommand(addCmd, deleteCmd, showCmd, enableCmd)
RootCmd.AddCommand(packageCmd, searchCmd, installCmd, removeCmd)
}
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)
}
}

46
cmd/install_cmd.go Normal file
View file

@ -0,0 +1,46 @@
package cmd
import (
"fmt"
"log"
"system_setup_tool/utils"
pm "system_setup_tool/packagemanager"
"github.com/spf13/cobra"
)
var installCmd = &cobra.Command{
Use: "install [package_name]",
Short: "Install a package with the specified package manager",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
packageName := args[0]
managerName, _ := cmd.Flags().GetString("manager")
var manager pm.PackageManager
switch managerName {
case "os":
sudoPassword, err := utils.GetSudoPassword()
if err != nil {
log.Fatal(err)
}
osManager := pm.NewOSManager(sudoPassword)
if err := osManager.Install([]string{packageName}); err != nil {
log.Printf("error: %v\n", err)
}
case "homebrew":
manager = &pm.HomebrewManager{}
case "cargo":
manager = &pm.CargoManager{}
case "pipx":
manager = &pm.PipxManager{}
case "flatpak":
manager = &pm.FlatpakManager{}
default:
fmt.Println("No PackageManager found")
}
if err := manager.InstallPackage(packageName); err != nil {
log.Printf("error: %v\n", err)
}
},
}

191
cmd/package_commands.go Normal file
View file

@ -0,0 +1,191 @@
package cmd
import (
"fmt"
"os"
"sort"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var packageCmd = &cobra.Command{
Use: "package",
Short: "Manage packages in the configuration",
}
var addCmd = &cobra.Command{
Use: "add",
Short: "Adds a package to the config.toml",
Run: func(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
manager, _ := cmd.Flags().GetString("manager")
isSystem, _ := cmd.Flags().GetBool("system")
isHeadless, _ := cmd.Flags().GetBool("headless")
if isSystem {
var packages []string
if isHeadless {
packages = viper.GetStringSlice("packages.headless")
} else {
packages = viper.GetStringSlice("packages.non_headless")
}
packages = append(packages, name)
if isHeadless {
viper.Set("packages.headless", packages)
} else {
viper.Set("packages.non_headless", packages)
}
} else {
packages := viper.GetStringSlice(fmt.Sprintf("package_managers.%s.packages", manager))
for _, pkg := range packages {
if pkg == name {
fmt.Printf("Package %s is already present in the configuration for %s\n", name, manager)
return
}
}
packages = append(packages, name)
viper.Set(fmt.Sprintf("package_managers.%s.packages", manager), packages)
}
if err := viper.WriteConfig(); err != nil {
fmt.Printf("Error writing configuration: %v\n", err)
os.Exit(1)
}
fmt.Printf("Package %s has been added to the configuration for %s\n", name, manager)
},
}
var deleteCmd = &cobra.Command{
Use: "delete",
Short: "Deletes a package from the config.toml",
Run: func(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
manager, _ := cmd.Flags().GetString("manager")
isSystem, _ := cmd.Flags().GetBool("system")
isHeadless, _ := cmd.Flags().GetBool("headless")
if isSystem {
var packages []string
var packageType string
if isHeadless {
packages = viper.GetStringSlice("packages.headless")
packageType = "headless"
} else {
packages = viper.GetStringSlice("packages.non_headless")
packageType = "non-headless"
}
for i, pkg := range packages {
if pkg == name {
packages = append(packages[:i], packages[i+1:]...)
if isHeadless {
viper.Set("packages.headless", packages)
} else {
viper.Set("packages.non_headless", packages)
}
if err := viper.WriteConfig(); err != nil {
fmt.Printf("Error writing configuration: %v\n", err)
os.Exit(1)
}
fmt.Printf("Package %s has been deleted from the %s system packages\n", name, packageType)
return
}
}
fmt.Printf("Package %s was not found in the %s system packages\n", name, packageType)
} else {
packages := viper.GetStringSlice(fmt.Sprintf("package_managers.%s.packages", manager))
for i, pkg := range packages {
if pkg == name {
packages = append(packages[:i], packages[i+1:]...)
viper.Set(fmt.Sprintf("package_managers.%s.packages", manager), packages)
if err := viper.WriteConfig(); err != nil {
fmt.Printf("Error writing configuration: %v\n", err)
os.Exit(1)
}
fmt.Printf("Package %s has been deleted from the configuration for %s\n", name, manager)
return
}
}
fmt.Printf("Package %s was not found in the configuration for %s\n", name, manager)
}
},
}
var showCmd = &cobra.Command{
Use: "show",
Short: "Shows the current package configuration",
Run: func(cmd *cobra.Command, args []string) {
packageManagers := viper.GetStringMap("package_managers")
if len(packageManagers) == 0 {
fmt.Println("No package managers configured.")
return
}
var managers []string
for manager := range packageManagers {
managers = append(managers, manager)
}
sort.Strings(managers)
for _, manager := range managers {
fmt.Printf("Package Manager: %s\n", manager)
packages := viper.GetStringSlice(fmt.Sprintf("package_managers.%s.packages", manager))
sort.Strings(packages)
for _, pkg := range packages {
fmt.Printf(" - %s\n", pkg)
}
fmt.Println()
}
fmt.Println("System Packages:")
headless := viper.GetStringSlice("packages.headless")
nonHeadless := viper.GetStringSlice("packages.non_headless")
fmt.Println(" Headless:")
for _, pkg := range headless {
fmt.Printf(" - %s\n", pkg)
}
fmt.Println(" Non-Headless:")
for _, pkg := range nonHeadless {
fmt.Printf(" - %s\n", pkg)
}
},
}
var enableCmd = &cobra.Command{
Use: "enable [package_manager]",
Short: "Enable or disable a package manager (Options: homebrew|go|cargo|pipx|flatpak)",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
manager := args[0]
enable, _ := cmd.Flags().GetBool("value")
if !viper.IsSet(fmt.Sprintf("package_managers.%s", manager)) {
fmt.Printf("Package manager %s not found in configuration\n", manager)
return
}
viper.Set(fmt.Sprintf("package_managers.%s.enable", manager), enable)
if err := viper.WriteConfig(); err != nil {
fmt.Printf("Error writing configuration: %v\n", err)
os.Exit(1)
}
fmt.Printf("Package manager %s has been %s\n", manager, map[bool]string{true: "enabled", false: "disabled"}[enable])
},
}

44
cmd/remove_cmd.go Normal file
View file

@ -0,0 +1,44 @@
package cmd
import (
"log"
"system_setup_tool/utils"
pm "system_setup_tool/packagemanager"
"github.com/spf13/cobra"
)
var removeCmd = &cobra.Command{
Use: "remove [package_name]",
Short: "Remove a package with the specified package manager",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
packageName := args[0]
managerName, _ := cmd.Flags().GetString("manager")
var manager pm.PackageManager
switch managerName {
case "os":
sudoPassword, err := utils.GetSudoPassword()
if err != nil {
log.Fatal(err)
}
osManager := pm.NewOSManager(sudoPassword)
if err := osManager.Install([]string{packageName}); err != nil {
log.Printf("error: %v\n", err)
}
case "homebrew":
manager = &pm.HomebrewManager{}
case "cargo":
manager = &pm.CargoManager{}
case "pipx":
manager = &pm.PipxManager{}
case "flatpak":
manager = &pm.FlatpakManager{}
default:
}
if err := manager.RemovePackage(packageName); err != nil {
log.Printf("error: %v\n", err)
}
},
}

61
cmd/search_cmd.go Normal file
View file

@ -0,0 +1,61 @@
package cmd
import (
"fmt"
"strings"
pm "system_setup_tool/packagemanager"
"github.com/spf13/cobra"
)
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]
managerName, _ := cmd.Flags().GetString("manager")
if managerName == "os" {
managerName = "OS Package Manager"
}
managers := []pm.PackageManager{
pm.NewOSManager(""),
&pm.HomebrewManager{},
&pm.FlatpakManager{},
}
if managerName != "" {
for _, m := range managers {
if strings.EqualFold(m.Name(), managerName) {
searchAndDisplayResults(m, packageName)
return
}
}
fmt.Printf("Not supported for '%s'\n", managerName)
return
}
for _, manager := range managers {
searchAndDisplayResults(manager, packageName)
}
},
}
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 searchAndDisplayResults(manager pm.PackageManager, packageName string) {
fmt.Printf("Searching in %s:\n", manager.Name())
results := manager.SearchPackage(packageName)
displayResults(results, manager.Name())
fmt.Println()
}

14
cmd/sst/main.go Normal file
View file

@ -0,0 +1,14 @@
package main
import (
"log"
"os"
"system_setup_tool/cmd"
)
func main() {
if err := cmd.RootCmd.Execute(); err != nil {
log.Println(err)
os.Exit(1)
}
}