github.com/containers/podman/v4@v4.9.4/pkg/machine/wsl/wutil/wutil.go (about) 1 //go:build windows 2 // +build windows 3 4 package wutil 5 6 import ( 7 "bufio" 8 "io" 9 "os/exec" 10 "strings" 11 "syscall" 12 13 "golang.org/x/text/encoding/unicode" 14 "golang.org/x/text/transform" 15 ) 16 17 func SilentExec(command string, args ...string) error { 18 cmd := exec.Command(command, args...) 19 cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000} 20 cmd.Stdout = nil 21 cmd.Stderr = nil 22 return cmd.Run() 23 } 24 25 func SilentExecCmd(command string, args ...string) *exec.Cmd { 26 cmd := exec.Command(command, args...) 27 cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000} 28 return cmd 29 } 30 31 func IsWSLInstalled() bool { 32 cmd := SilentExecCmd("wsl", "--status") 33 out, err := cmd.StdoutPipe() 34 cmd.Stderr = nil 35 if err != nil { 36 return false 37 } 38 if err = cmd.Start(); err != nil { 39 return false 40 } 41 42 kernelNotFound := matchOutputLine(out, "kernel file is not found") 43 44 if err := cmd.Wait(); err != nil { 45 return false 46 } 47 48 return !kernelNotFound 49 } 50 51 func IsWSLStoreVersionInstalled() bool { 52 cmd := SilentExecCmd("wsl", "--version") 53 cmd.Stdout = nil 54 cmd.Stderr = nil 55 if err := cmd.Run(); err != nil { 56 return false 57 } 58 59 return true 60 } 61 62 func matchOutputLine(output io.ReadCloser, match string) bool { 63 scanner := bufio.NewScanner(transform.NewReader(output, unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder())) 64 for scanner.Scan() { 65 line := scanner.Text() 66 if strings.Contains(line, match) { 67 return true 68 } 69 } 70 return false 71 }