package packagemanager import ( "fmt" "log" "strings" "system_setup_tool/internal/shell" ) type FlatpakManager struct { OS *OS SudoPassword string Config FlatpakConfig } func NewFlatpakManager(sudoPassword string, config FlatpakConfig) *FlatpakManager { os, err := GetLinuxDistribution() if err != nil { log.Fatalf("error geting os information: %v", err) } return &FlatpakManager{ OS: os, SudoPassword: sudoPassword, Config: config, } } func (f *FlatpakManager) Install(packages []string) error { if len(packages) == 0 { return nil } err := InstallWithProgress(f, packages) if err != nil { return err } return nil } func (f *FlatpakManager) Name() string { return "Flatpak" } func (f *FlatpakManager) InstallManager() error { if _, err := shell.ExecLookPath("flatpak"); err == nil { return nil } err := installFlatpak(f.OS, f.SudoPassword) if err != nil { return err } err = addFlatpakRemotes(f.Config.Remotes) if err != nil { return err } return nil } type FlatpakConfig struct { Enable bool `mapstructure:"enable"` Remotes []Remote `mapstructure:"remotes"` Packages []string `mapstructure:"packages"` } type Remote struct { Name string `mapstructure:"name"` URL string `mapstructure:"url"` } func installFlatpak(os *OS, sudoPassword string) error { var command string switch os.PackageManager { case "pacman": command = "pacman -S --noconfirm --needed flatpak" case "apt": command = "apt install -y flatpak" case "dnf": command = "dnf install -y flatpak" default: return fmt.Errorf("keine Flatpak-Installation für OS %s definiert", os.ID) } if err := InstallPackage(command, "", sudoPassword); err != nil { return fmt.Errorf("fehler bei der Flatpak-Installation: %v", err) } return nil } func addFlatpakRemotes(remotes []Remote) error { for _, remote := range remotes { cmd := shell.ExecCommand("flatpak", "remote-add", "--if-not-exists", remote.Name, remote.URL) if err := cmd.Run(); err != nil { return fmt.Errorf("fehler beim Hinzufügen des Remotes %s: %v", remote.Name, err) } } return nil } func (f *FlatpakManager) InstallPackage(pkg string) error { cmd := shell.ExecCommand("flatpak", "install", "-y", pkg) return cmd.Run() } func (f *FlatpakManager) RemovePackage(pkg string) error { cmd := shell.ExecCommand("flatpak", "uninstall", "-y", pkg) return cmd.Run() } func (f *FlatpakManager) SearchPackage(pkg string) []string { cmd := shell.ExecCommand("flatpak", "search", pkg) packages, err := cmd.Output() if err != nil { log.Printf("error fetching %s packages: %v", f.Name(), err) } packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") return packageList } func (f *FlatpakManager) UpdatePackage(pkg string) error { cmd := shell.ExecCommand("flatpak", "update", "-y", pkg) return cmd.Run() } 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() }