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  }