github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/system/system.go (about)

     1  package system
     2  
     3  import (
     4  	"os/exec"
     5  	"strings"
     6  
     7  	"github.com/AlpineAIO/wails/v2/internal/shell"
     8  	"github.com/AlpineAIO/wails/v2/internal/system/operatingsystem"
     9  	"github.com/AlpineAIO/wails/v2/internal/system/packagemanager"
    10  )
    11  
    12  var IsAppleSilicon bool
    13  
    14  // Info holds information about the current operating system,
    15  // package manager and required dependencies
    16  type Info struct {
    17  	OS           *operatingsystem.OS
    18  	PM           packagemanager.PackageManager
    19  	Dependencies packagemanager.DependencyList
    20  }
    21  
    22  // GetInfo scans the system for operating system details,
    23  // the system package manager and the status of required
    24  // dependencies.
    25  func GetInfo() (*Info, error) {
    26  	var result Info
    27  	err := result.discover()
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  	return &result, nil
    32  }
    33  
    34  func checkNodejs() *packagemanager.Dependency {
    35  	// Check for Nodejs
    36  	output, err := exec.Command("node", "-v").Output()
    37  	installed := true
    38  	version := ""
    39  	if err != nil {
    40  		installed = false
    41  	} else {
    42  		if len(output) > 0 {
    43  			version = strings.TrimSpace(strings.Split(string(output), "\n")[0])[1:]
    44  		}
    45  	}
    46  	return &packagemanager.Dependency{
    47  		Name:           "Nodejs",
    48  		PackageName:    "N/A",
    49  		Installed:      installed,
    50  		InstallCommand: "Available at https://nodejs.org/en/download/",
    51  		Version:        version,
    52  		Optional:       false,
    53  		External:       false,
    54  	}
    55  }
    56  
    57  func checkNPM() *packagemanager.Dependency {
    58  	// Check for npm
    59  	output, err := exec.Command("npm", "-version").Output()
    60  	installed := true
    61  	version := ""
    62  	if err != nil {
    63  		installed = false
    64  	} else {
    65  		version = strings.TrimSpace(strings.Split(string(output), "\n")[0])
    66  	}
    67  	return &packagemanager.Dependency{
    68  		Name:           "npm ",
    69  		PackageName:    "N/A",
    70  		Installed:      installed,
    71  		InstallCommand: "Available at https://nodejs.org/en/download/",
    72  		Version:        version,
    73  		Optional:       false,
    74  		External:       false,
    75  	}
    76  }
    77  
    78  func checkUPX() *packagemanager.Dependency {
    79  	// Check for npm
    80  	output, err := exec.Command("upx", "-V").Output()
    81  	installed := true
    82  	version := ""
    83  	if err != nil {
    84  		installed = false
    85  	} else {
    86  		version = strings.TrimSpace(strings.Split(string(output), "\n")[0])
    87  	}
    88  	return &packagemanager.Dependency{
    89  		Name:           "upx ",
    90  		PackageName:    "N/A",
    91  		Installed:      installed,
    92  		InstallCommand: "Available at https://upx.github.io/",
    93  		Version:        version,
    94  		Optional:       true,
    95  		External:       false,
    96  	}
    97  }
    98  
    99  func checkNSIS() *packagemanager.Dependency {
   100  	// Check for nsis installer
   101  	output, err := exec.Command("makensis", "-VERSION").Output()
   102  	installed := true
   103  	version := ""
   104  	if err != nil {
   105  		installed = false
   106  	} else {
   107  		version = strings.TrimSpace(strings.Split(string(output), "\n")[0])
   108  	}
   109  	return &packagemanager.Dependency{
   110  		Name:           "nsis ",
   111  		PackageName:    "N/A",
   112  		Installed:      installed,
   113  		InstallCommand: "More info at https://wails.io/docs/guides/windows-installer/",
   114  		Version:        version,
   115  		Optional:       true,
   116  		External:       false,
   117  	}
   118  }
   119  
   120  func checkLibrary(name string) func() *packagemanager.Dependency {
   121  	return func() *packagemanager.Dependency {
   122  		output, _, _ := shell.RunCommand(".", "pkg-config", "--cflags", name)
   123  		installed := len(strings.TrimSpace(output)) > 0
   124  
   125  		return &packagemanager.Dependency{
   126  			Name:           "lib" + name + " ",
   127  			PackageName:    "N/A",
   128  			Installed:      installed,
   129  			InstallCommand: "Install via your package manager",
   130  			Version:        "N/A",
   131  			Optional:       false,
   132  			External:       false,
   133  		}
   134  	}
   135  }
   136  
   137  func checkDocker() *packagemanager.Dependency {
   138  	// Check for npm
   139  	output, err := exec.Command("docker", "version").Output()
   140  	installed := true
   141  	version := ""
   142  
   143  	// Docker errors if it is not running so check for that
   144  	if len(output) == 0 && err != nil {
   145  		installed = false
   146  	} else {
   147  		// Version is in a line like: " Version:           20.10.5"
   148  		versionOutput := strings.Split(string(output), "\n")
   149  		for _, line := range versionOutput[1:] {
   150  			splitLine := strings.Split(line, ":")
   151  			if len(splitLine) > 1 {
   152  				key := strings.TrimSpace(splitLine[0])
   153  				if key == "Version" {
   154  					version = strings.TrimSpace(splitLine[1])
   155  					break
   156  				}
   157  			}
   158  		}
   159  	}
   160  	return &packagemanager.Dependency{
   161  		Name:           "docker ",
   162  		PackageName:    "N/A",
   163  		Installed:      installed,
   164  		InstallCommand: "Available at https://www.docker.com/products/docker-desktop",
   165  		Version:        version,
   166  		Optional:       true,
   167  		External:       false,
   168  	}
   169  }