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 }