diff --git a/cmd/check_cmd.go b/cmd/check_cmd.go new file mode 100644 index 0000000..aab0f87 --- /dev/null +++ b/cmd/check_cmd.go @@ -0,0 +1,49 @@ +package cmd + +import ( + "fmt" + "log" + + pm "system_setup_tool/packagemanager" + "system_setup_tool/utils" + + "github.com/spf13/cobra" +) + +var checkCmd = &cobra.Command{ + Use: "check [package-name]", + Short: "Check if the specified package is installed", + Args: cobra.ExactArgs(1), + Aliases: []string{"c"}, + Run: func(cmd *cobra.Command, args []string) { + packageName := args[0] + managerName, _ := cmd.Flags().GetString("manager") + var manager pm.PackageManager + if managerName == "os" { + managerName = "OS Package Manager" + } else if managerName == "brew" { + managerName = "homebrew" + } + switch managerName { + case "OS Package Manager": + manager = pm.NewOSManager("") + 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.Check(packageName); err != nil { + log.Printf("error: %v\n", err) + } + fmt.Printf("Package: %s installed\n", packageName) + if err := utils.LogToHistory("checked", packageName, manager.Name()); err != nil { + fmt.Println("error logging action:", err) + } + }, +} diff --git a/cmd/cmd.go b/cmd/cmd.go index 1c2e2c9..52b2f40 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -43,6 +43,8 @@ func init() { updateCmd.Flags().StringP("manager", "m", "os", "The package manager you want to update packages with. (Options: os|homebrew|pipx|flatpak)") + checkCmd.Flags().StringP("manager", "m", "os", "The package manager you want to check for a packages with. (Options: os|homebrew|pipx|flatpak)") + packageCmd.AddCommand( addCmd, deleteCmd, @@ -57,6 +59,7 @@ func init() { updateCmd, updateAllCmd, historyCmd, + checkCmd, ) } diff --git a/packagemanager/apt.go b/packagemanager/apt.go index dd63647..67df45b 100644 --- a/packagemanager/apt.go +++ b/packagemanager/apt.go @@ -74,3 +74,8 @@ func (a *AptManager) UpdateAllPackages() error { command.Stdin = strings.NewReader(a.SudoPassword + "\n") return command.Run() } + +func (a *AptManager) Check(pkg string) error { + cmd := shell.ExecCommand("/bin/sh", "-c", fmt.Sprintf("dpkg -l | grep %s", pkg)) + return cmd.Run() +} diff --git a/packagemanager/cargo.go b/packagemanager/cargo.go index d99a0f5..fe63d6e 100644 --- a/packagemanager/cargo.go +++ b/packagemanager/cargo.go @@ -2,6 +2,8 @@ package packagemanager import ( "fmt" + "os" + "path/filepath" "system_setup_tool/internal/shell" ) @@ -56,3 +58,12 @@ func (c *CargoManager) UpdatePackage(pkg string) error { func (c *CargoManager) UpdateAllPackages() error { return fmt.Errorf("update not supported") } + +func (c *CargoManager) Check(pkg string) error { + home, err := os.UserHomeDir() + if err != nil { + return err + } + cmd := shell.ExecCommand("ls", filepath.Join(home, ".cargo", "bin", pkg)) + return cmd.Run() +} diff --git a/packagemanager/choco.go b/packagemanager/choco.go index 71d4c8d..dc38249 100644 --- a/packagemanager/choco.go +++ b/packagemanager/choco.go @@ -64,3 +64,8 @@ func (c *ChocoManager) UpdateAllPackages() error { cmd := shell.ExecCommand("choco", "update") return cmd.Run() } + +func (c *ChocoManager) Check(pkg string) error { + cmd := shell.ExecCommand("choco", "search", "--local-only", pkg) + return cmd.Run() +} diff --git a/packagemanager/dnf.go b/packagemanager/dnf.go index 6c539b2..02be368 100644 --- a/packagemanager/dnf.go +++ b/packagemanager/dnf.go @@ -71,3 +71,8 @@ func (d *DnfManager) UpdateAllPackages() error { command.Stdin = strings.NewReader(d.SudoPassword + "\n") return command.Run() } + +func (d *DnfManager) Check(pkg string) error { + cmd := shell.ExecCommand("/bin/sh", "-c", fmt.Sprintf("dnf list installed | grep %s", pkg)) + return cmd.Run() +} diff --git a/packagemanager/flatpak.go b/packagemanager/flatpak.go index 2f4a72b..bfca427 100644 --- a/packagemanager/flatpak.go +++ b/packagemanager/flatpak.go @@ -126,3 +126,8 @@ func (f *FlatpakManager) UpdateAllPackages() error { cmd := shell.ExecCommand("flatpak", "update", "-y") return cmd.Run() } + +func (f *FlatpakManager) Check(pkg string) error { + cmd := shell.ExecCommand("/bin/sh", "-c", fmt.Sprintf("flatpak list | grep %s", pkg)) + return cmd.Run() +} diff --git a/packagemanager/golang.go b/packagemanager/golang.go index 87d779f..cfd25ab 100644 --- a/packagemanager/golang.go +++ b/packagemanager/golang.go @@ -2,6 +2,8 @@ package packagemanager import ( "fmt" + "os" + "path/filepath" "system_setup_tool/internal/shell" ) @@ -56,3 +58,12 @@ func (g *GolangManager) UpdatePackage(pkg string) error { func (g *GolangManager) UpdateAllPackages() error { return fmt.Errorf("update not supported") } + +func (g *GolangManager) Check(pkg string) error { + home, err := os.UserHomeDir() + if err != nil { + fmt.Printf("error: %v\n", err) + } + cmd := shell.ExecCommand("ls", filepath.Join(home, "go", "bin", pkg)) + return cmd.Run() +} diff --git a/packagemanager/homebrew.go b/packagemanager/homebrew.go index af72153..2cf3258 100644 --- a/packagemanager/homebrew.go +++ b/packagemanager/homebrew.go @@ -69,3 +69,8 @@ func (h *HomebrewManager) UpdateAllPackages() error { cmd := shell.ExecCommand("brew", "upgrade") return cmd.Run() } + +func (h *HomebrewManager) Check(pkg string) error { + cmd := shell.ExecCommand("brew", "list", pkg) + return cmd.Run() +} diff --git a/packagemanager/os.go b/packagemanager/os.go index 703e887..a1d6dff 100644 --- a/packagemanager/os.go +++ b/packagemanager/os.go @@ -127,6 +127,10 @@ func (o *OSManager) UpdateAllPackages() error { return o.pm.UpdateAllPackages() } +func (o *OSManager) Check(pkg string) error { + return o.pm.Check(pkg) +} + type OS struct { ID string Name string diff --git a/packagemanager/packagemanager.go b/packagemanager/packagemanager.go index 8350beb..55e5236 100644 --- a/packagemanager/packagemanager.go +++ b/packagemanager/packagemanager.go @@ -2,6 +2,7 @@ package packagemanager type PackageManager interface { Install(packages []string) error + Check(pkg string) error InstallPackage(pkg string) error InstallManager() error RemovePackage(pkg string) error diff --git a/packagemanager/pacman.go b/packagemanager/pacman.go index 94f018b..05cad0f 100644 --- a/packagemanager/pacman.go +++ b/packagemanager/pacman.go @@ -74,3 +74,8 @@ func (p *PacmanManager) UpdateAllPackages() error { command.Stdin = strings.NewReader(p.SudoPassword + "\n") return command.Run() } + +func (p *PacmanManager) Check(pkg string) error { + cmd := shell.ExecCommand("/bin/sh", "-c", fmt.Sprintf("paxman -Q | grep %s", pkg)) + return cmd.Run() +} diff --git a/packagemanager/pipx.go b/packagemanager/pipx.go index c8711ec..81d3c90 100644 --- a/packagemanager/pipx.go +++ b/packagemanager/pipx.go @@ -1,6 +1,9 @@ package packagemanager -import "system_setup_tool/internal/shell" +import ( + "fmt" + "system_setup_tool/internal/shell" +) type PipxManager struct{} @@ -56,3 +59,8 @@ func (p *PipxManager) UpdateAllPackages() error { cmd := shell.ExecCommand("pipx", "upgrade-all") return cmd.Run() } + +func (p *PipxManager) Check(pkg string) error { + cmd := shell.ExecCommand("/bin/sh", "-c", fmt.Sprintf("pipx list | grep %s", pkg)) + return cmd.Run() +} diff --git a/packagemanager/winget.go b/packagemanager/winget.go index 2d5d14b..bdfabad 100644 --- a/packagemanager/winget.go +++ b/packagemanager/winget.go @@ -64,3 +64,8 @@ func (w *WingetManager) UpdateAllPackages() error { cmd := shell.ExecCommand("winget", "update") return cmd.Run() } + +func (w *WingetManager) Check(pkg string) error { + cmd := shell.ExecCommand("wiget", "show", pkg) + return cmd.Run() +}