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  }