feat(cli): add checks for pacman
This commit is contained in:
parent
43cf46300f
commit
6991a6861a
1 changed files with 44 additions and 17 deletions
61
main.go
61
main.go
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue