github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/system/packagemanager/dnf.go (about) 1 //go:build linux 2 // +build linux 3 4 package packagemanager 5 6 import ( 7 "os/exec" 8 "strings" 9 10 "github.com/AlpineAIO/wails/v2/internal/shell" 11 ) 12 13 // Dnf represents the Dnf manager 14 type Dnf struct { 15 name string 16 osid string 17 } 18 19 // NewDnf creates a new Dnf instance 20 func NewDnf(osid string) *Dnf { 21 return &Dnf{ 22 name: "dnf", 23 osid: osid, 24 } 25 } 26 27 // Packages returns the libraries that we need for Wails to compile 28 // They will potentially differ on different distributions or versions 29 func (y *Dnf) Packages() packagemap { 30 return packagemap{ 31 "libgtk-3": []*Package{ 32 {Name: "gtk3-devel", SystemPackage: true, Library: true}, 33 }, 34 "libwebkit": []*Package{ 35 {Name: "webkit2gtk4.0-devel", SystemPackage: true, Library: true}, 36 {Name: "webkit2gtk3-devel", SystemPackage: true, Library: true}, 37 // {Name: "webkitgtk3-devel", SystemPackage: true, Library: true}, 38 }, 39 "gcc": []*Package{ 40 {Name: "gcc-c++", SystemPackage: true}, 41 }, 42 "pkg-config": []*Package{ 43 {Name: "pkgconf-pkg-config", SystemPackage: true}, 44 }, 45 "npm": []*Package{ 46 {Name: "npm", SystemPackage: true}, 47 {Name: "nodejs-npm", SystemPackage: true}, 48 }, 49 "upx": []*Package{ 50 {Name: "upx", SystemPackage: true, Optional: true}, 51 }, 52 "docker": []*Package{ 53 { 54 SystemPackage: false, 55 Optional: true, 56 InstallCommand: map[string]string{ 57 "centos": "Follow the guide: https://docs.docker.com/engine/install/centos/", 58 "fedora": "Follow the guide: https://docs.docker.com/engine/install/fedora/", 59 }, 60 }, 61 {Name: "moby-engine", SystemPackage: true, Optional: true}, 62 }, 63 } 64 } 65 66 // Name returns the name of the package manager 67 func (y *Dnf) Name() string { 68 return y.name 69 } 70 71 // PackageInstalled tests if the given package name is installed 72 func (y *Dnf) PackageInstalled(pkg *Package) (bool, error) { 73 if pkg.SystemPackage == false { 74 return false, nil 75 } 76 stdout, _, err := shell.RunCommand(".", "dnf", "info", "installed", pkg.Name) 77 if err != nil { 78 _, ok := err.(*exec.ExitError) 79 if ok { 80 return false, nil 81 } 82 return false, err 83 } 84 85 splitoutput := strings.Split(stdout, "\n") 86 for _, line := range splitoutput { 87 if strings.HasPrefix(line, "Version") { 88 splitline := strings.Split(line, ":") 89 pkg.Version = strings.TrimSpace(splitline[1]) 90 } 91 } 92 93 return true, err 94 } 95 96 // PackageAvailable tests if the given package is available for installation 97 func (y *Dnf) PackageAvailable(pkg *Package) (bool, error) { 98 if pkg.SystemPackage == false { 99 return false, nil 100 } 101 stdout, _, err := shell.RunCommand(".", "dnf", "info", pkg.Name) 102 // We add a space to ensure we get a full match, not partial match 103 if err != nil { 104 _, ok := err.(*exec.ExitError) 105 if ok { 106 return false, nil 107 } 108 return false, err 109 } 110 splitoutput := strings.Split(stdout, "\n") 111 for _, line := range splitoutput { 112 if strings.HasPrefix(line, "Version") { 113 splitline := strings.Split(line, ":") 114 pkg.Version = strings.TrimSpace(splitline[1]) 115 } 116 } 117 return true, nil 118 } 119 120 // InstallCommand returns the package manager specific command to install a package 121 func (y *Dnf) InstallCommand(pkg *Package) string { 122 if pkg.SystemPackage == false { 123 return pkg.InstallCommand[y.osid] 124 } 125 return "sudo dnf install " + pkg.Name 126 } 127 128 func (y *Dnf) getPackageVersion(pkg *Package, output string) { 129 splitOutput := strings.Split(output, " ") 130 if len(splitOutput) > 0 { 131 pkg.Version = splitOutput[1] 132 } 133 }