package main import ( "fmt" "log" "os" "os/exec" "strings" ) type OS struct { ID string Name string Version string PackageManager string InstallCommand string } func parseOsRelease(osRelease string) *OS { var result OS result.ID = "Unknown" result.Name = "Unknown" result.Version = "Unknown" result.PackageManager = "Unkown" result.InstallCommand = "Unkown" lines := strings.Split(osRelease, "\n") for _, line := range lines { splitLine := strings.SplitN(line, "=", 2) if len(splitLine) != 2 { continue } switch splitLine[0] { case "ID": result.ID = strings.ToLower(strings.Trim(splitLine[1], "\"")) case "NAME": result.Name = strings.Trim(splitLine[1], "\"") case "VERSION_ID": result.Version = strings.Trim(splitLine[1], "\"") } } err := result.getPackageManager() if err != nil { log.Fatal(err) } err = result.getInstallCommand() if err != nil { log.Fatal(err) } return &result } func getLinuxDistribution() (*OS, error) { _, err := os.Stat("/etc/os-release") if os.IsNotExist(err) { return nil, fmt.Errorf("unable to read system information") } osRelease, _ := os.ReadFile("/etc/os-release") return parseOsRelease(string(osRelease)), nil } func (os *OS) getPackageManager() error { switch os.ID { case "debian", "ubuntu": os.PackageManager = "apt" return nil case "arch": os.PackageManager = "pacman" return nil case "fedora": os.PackageManager = "dnf" return nil default: pmcommands := []string{ "apt", "dnf", "pacman", } for _, pmname := range pmcommands { _, err := exec.LookPath(pmname) if err == nil { os.PackageManager = pmname return nil } } return fmt.Errorf("no packagemanager found for os: %s", os) } } func (os *OS) getInstallCommand() error { switch os.PackageManager { case "apt": os.InstallCommand = "apt install -y" return nil case "pacman": os.InstallCommand = "pacman -S --noconfirm --needed" return nil case "dnf": os.InstallCommand = "dnf install -y --best" return nil default: return fmt.Errorf("no install command found for package manager: %s", os.ID) } } 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 }