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 {
|
type OS struct {
|
||||||
ID string
|
ID string
|
||||||
Name string
|
Name string
|
||||||
Version string
|
Version string
|
||||||
|
PackageManager string
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseOsRelease(osRelease string) *OS {
|
func parseOsRelease(osRelease string) *OS {
|
||||||
|
|
@ -30,6 +31,7 @@ func parseOsRelease(osRelease string) *OS {
|
||||||
result.ID = "Unknown"
|
result.ID = "Unknown"
|
||||||
result.Name = "Unknown"
|
result.Name = "Unknown"
|
||||||
result.Version = "Unknown"
|
result.Version = "Unknown"
|
||||||
|
result.PackageManager = "Unkown"
|
||||||
|
|
||||||
lines := strings.Split(osRelease, "\n")
|
lines := strings.Split(osRelease, "\n")
|
||||||
|
|
||||||
|
|
@ -47,6 +49,10 @@ func parseOsRelease(osRelease string) *OS {
|
||||||
result.Version = strings.Trim(splitLine[1], "\"")
|
result.Version = strings.Trim(splitLine[1], "\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
err := getPackageManager(&result)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
return &result
|
return &result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,14 +66,17 @@ func getLinuxDistribution() (*OS, error) {
|
||||||
return parseOsRelease(string(osRelease)), nil
|
return parseOsRelease(string(osRelease)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPackageManager(os *OS) (string, error) {
|
func getPackageManager(os *OS) error {
|
||||||
switch os.ID {
|
switch os.ID {
|
||||||
case "debian", "ubuntu":
|
case "debian", "ubuntu":
|
||||||
return "apt", nil
|
os.PackageManager = "apt"
|
||||||
|
return nil
|
||||||
case "arch":
|
case "arch":
|
||||||
return "pacman", nil
|
os.PackageManager = "pacman"
|
||||||
|
return nil
|
||||||
case "fedora":
|
case "fedora":
|
||||||
return "dnf", nil
|
os.PackageManager = "dnf"
|
||||||
|
return nil
|
||||||
default:
|
default:
|
||||||
var pmcommands = []string{
|
var pmcommands = []string{
|
||||||
"apt",
|
"apt",
|
||||||
|
|
@ -77,10 +86,11 @@ func getPackageManager(os *OS) (string, error) {
|
||||||
for _, pmname := range pmcommands {
|
for _, pmname := range pmcommands {
|
||||||
_, err := exec.LookPath(pmname)
|
_, err := exec.LookPath(pmname)
|
||||||
if err == nil {
|
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
|
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) {
|
func getInstallCommand(pm string) (string, error) {
|
||||||
switch pm {
|
switch pm {
|
||||||
case "apt":
|
case "apt":
|
||||||
|
|
@ -125,7 +155,6 @@ type specialSoftwareModel struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSpecialSoftwareModel(sudoPassword string) specialSoftwareModel {
|
func newSpecialSoftwareModel(sudoPassword string) specialSoftwareModel {
|
||||||
// Definiere die zu installierenden Items
|
|
||||||
items := []string{"oh-my-posh", "golang", "rust"}
|
items := []string{"oh-my-posh", "golang", "rust"}
|
||||||
|
|
||||||
p := progress.New(
|
p := progress.New(
|
||||||
|
|
@ -235,7 +264,7 @@ func installPackage(cmd, pkg, sudoPassword string) error {
|
||||||
command.Stdin = strings.NewReader(sudoPassword + "\n")
|
command.Stdin = strings.NewReader(sudoPassword + "\n")
|
||||||
output, err := command.CombinedOutput()
|
output, err := command.CombinedOutput()
|
||||||
if err != nil {
|
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)
|
unavailablePackages = append(unavailablePackages, pkg)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -512,11 +541,7 @@ func run(cmd *cobra.Command, args []string) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
pm, err := getPackageManager(os)
|
installCommand, err = getInstallCommand(os.PackageManager)
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
installCommand, err = getInstallCommand(pm)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
@ -574,6 +599,9 @@ func run(cmd *cobra.Command, args []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if installSpecial {
|
if installSpecial {
|
||||||
|
if err := installBuildEssentials(os, sudoPassword); err != nil {
|
||||||
|
log.Printf("Warnung: %v", err)
|
||||||
|
}
|
||||||
sm := newSpecialSoftwareModel(sudoPassword)
|
sm := newSpecialSoftwareModel(sudoPassword)
|
||||||
p = tea.NewProgram(sm)
|
p = tea.NewProgram(sm)
|
||||||
if _, err := p.Run(); err != nil {
|
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 {
|
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 {
|
var allSpecialPkgs []struct {
|
||||||
typ string
|
typ string
|
||||||
name string
|
name string
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue