package main import ( "fmt" "os/exec" ) type FlatpakManager struct { OS *OS SudoPassword string Config FlatpakConfig } 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 := exec.LookPath("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 := exec.Command("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 := exec.Command("flatpak", "install", "-y", pkg) return cmd.Run() }