feat(cli): add checks for pacman

This commit is contained in:
Patryk Hegenberg 2024-12-27 11:08:40 +01:00
parent 43cf46300f
commit 6991a6861a

61
main.go
View file

@ -20,9 +20,10 @@ import (
)
type OS struct {
ID string
Name string
Version string
ID string
Name string
Version string
PackageManager string
}
func parseOsRelease(osRelease string) *OS {
@ -30,6 +31,7 @@ func parseOsRelease(osRelease string) *OS {
result.ID = "Unknown"
result.Name = "Unknown"
result.Version = "Unknown"
result.PackageManager = "Unkown"
lines := strings.Split(osRelease, "\n")
@ -47,6 +49,10 @@ func parseOsRelease(osRelease string) *OS {
result.Version = strings.Trim(splitLine[1], "\"")
}
}
err := getPackageManager(&result)
if err != nil {
log.Fatal(err)
}
return &result
}
@ -60,14 +66,17 @@ func getLinuxDistribution() (*OS, error) {
return parseOsRelease(string(osRelease)), nil
}
func getPackageManager(os *OS) (string, error) {
func getPackageManager(os *OS) error {
switch os.ID {
case "debian", "ubuntu":
return "apt", nil
os.PackageManager = "apt"
return nil
case "arch":
return "pacman", nil
os.PackageManager = "pacman"
return nil
case "fedora":
return "dnf", nil
os.PackageManager = "dnf"
return nil
default:
var pmcommands = []string{
"apt",
@ -77,10 +86,11 @@ func getPackageManager(os *OS) (string, error) {
for _, pmname := range pmcommands {
_, err := exec.LookPath(pmname)
if err == nil {
return pmname, nil
os.PackageManager = pmname
return nil
}
}
return "", fmt.Errorf("no packagemanager found for os: %s", os)
return fmt.Errorf("no packagemanager found for os: %s", os)
}
}
@ -102,6 +112,26 @@ func getSudoPassword() (string, error) {
return password, nil
}
func installBuildEssentials(os *OS, sudoPassword string) error {
var command string
switch os.PackageManager {
case "pacman":
command = "pacman -S --noconfirm --needed base-devel"
case "apt":
command = "apt install -y build-essential"
case "dnf":
command = "dnf install -y @development-tools"
default:
return fmt.Errorf("keine Build Essentials für OS %s definiert", os.ID)
}
fmt.Printf("Installiere Build Essentials für %s...\n", os.Name)
if err := installPackage(command, "", sudoPassword); err != nil {
return fmt.Errorf("Fehler bei der Installation der Build Essentials: %v", err)
}
return nil
}
func getInstallCommand(pm string) (string, error) {
switch pm {
case "apt":
@ -125,7 +155,6 @@ type specialSoftwareModel struct {
}
func newSpecialSoftwareModel(sudoPassword string) specialSoftwareModel {
// Definiere die zu installierenden Items
items := []string{"oh-my-posh", "golang", "rust"}
p := progress.New(
@ -235,7 +264,7 @@ func installPackage(cmd, pkg, sudoPassword string) error {
command.Stdin = strings.NewReader(sudoPassword + "\n")
output, err := command.CombinedOutput()
if err != nil {
if strings.Contains(string(output), "not found") || strings.Contains(string(output), "no matching package") || strings.Contains(string(output), "Keine Übereinstimmung") {
if strings.Contains(string(output), "not found") || strings.Contains(string(output), "no matching package") || strings.Contains(string(output), "Keine Übereinstimmung") || strings.Contains(string(output), "Ziel nicht gefunden") {
unavailablePackages = append(unavailablePackages, pkg)
return nil
}
@ -512,11 +541,7 @@ func run(cmd *cobra.Command, args []string) {
if err != nil {
log.Fatal(err)
}
pm, err := getPackageManager(os)
if err != nil {
log.Fatal(err)
}
installCommand, err = getInstallCommand(pm)
installCommand, err = getInstallCommand(os.PackageManager)
if err != nil {
log.Fatal(err)
}
@ -574,6 +599,9 @@ func run(cmd *cobra.Command, args []string) {
}
if installSpecial {
if err := installBuildEssentials(os, sudoPassword); err != nil {
log.Printf("Warnung: %v", err)
}
sm := newSpecialSoftwareModel(sudoPassword)
p = tea.NewProgram(sm)
if _, err := p.Run(); err != nil {
@ -582,7 +610,6 @@ func run(cmd *cobra.Command, args []string) {
}
if len(cfg.SpecialPackages.Go) > 0 || len(cfg.SpecialPackages.Cargo) > 0 || len(cfg.SpecialPackages.Pipx) > 0 {
// Combine all special packages for the progress bar
var allSpecialPkgs []struct {
typ string
name string