Merge pull request #19677 from n1hility/detect-old-wsl

Validate current generation of WSL2 with user-mode-networking
This commit is contained in:
OpenShift Merge Robot
2023-08-21 04:57:09 -02:30
committed by GitHub
3 changed files with 61 additions and 12 deletions

View File

@ -338,6 +338,12 @@ func (v *MachineVM) Init(opts machine.InitOptions) (bool, error) {
v.Rootful = opts.Rootful
v.Version = currentMachineVersion
if v.UserModeNetworking {
if err := verifyWSLUserModeCompat(); err != nil {
return false, err
}
}
if err := downloadDistro(v, opts); err != nil {
return false, err
}

View File

@ -10,6 +10,7 @@ import (
"path/filepath"
"github.com/containers/podman/v4/pkg/machine"
"github.com/containers/podman/v4/pkg/machine/wsl/wutil"
"github.com/containers/podman/v4/pkg/specgen"
"github.com/sirupsen/logrus"
)
@ -53,6 +54,21 @@ ip route add $ROUTE
rm -rf /mnt/wsl/podman-usermodenet
`
func verifyWSLUserModeCompat() error {
if wutil.IsWSLStoreVersionInstalled() {
return nil
}
prefix := ""
if !winVersionAtLeast(10, 0, 19043) {
prefix = "upgrade to 22H2, "
}
return fmt.Errorf("user-mode networking requires a newer version of WSL: "+
"%sapply all outstanding windows updates, and then run `wsl --update`",
prefix)
}
func (v *MachineVM) startUserModeNetworking() error {
if !v.UserModeNetworking {
return nil
@ -299,6 +315,10 @@ func (v *MachineVM) obtainUserModeNetLock() (*fileLock, error) {
}
func changeDistUserModeNetworking(dist string, user string, image string, enable bool) error {
if err := verifyWSLUserModeCompat(); err != nil {
return err
}
// Only install if user-mode is being enabled and there was an image path passed
if enable && len(image) > 0 {
if err := installUserModeDist(dist, image); err != nil {

View File

@ -5,6 +5,7 @@ package wutil
import (
"bufio"
"io"
"os/exec"
"strings"
"syscall"
@ -37,19 +38,41 @@ func IsWSLInstalled() bool {
if err = cmd.Start(); err != nil {
return false
}
scanner := bufio.NewScanner(transform.NewReader(out, unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder()))
result := true
for scanner.Scan() {
line := scanner.Text()
// Windows 11 does not set an error exit code when a kernel is not avail
if strings.Contains(line, "kernel file is not found") {
result = false
break
}
}
if err := cmd.Wait(); !result || err != nil {
kernelNotFound := matchOutputLine(out, "kernel file is not found")
if err := cmd.Wait(); err != nil {
return false
}
return !kernelNotFound
}
func IsWSLStoreVersionInstalled() bool {
cmd := SilentExecCmd("wsl", "--version")
out, err := cmd.StdoutPipe()
cmd.Stderr = nil
if err != nil {
return false
}
if err = cmd.Start(); err != nil {
return false
}
hasVersion := matchOutputLine(out, "WSL version:")
if err := cmd.Wait(); err != nil {
return false
}
return hasVersion
}
func matchOutputLine(output io.ReadCloser, match string) bool {
scanner := bufio.NewScanner(transform.NewReader(output, unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder()))
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, match) {
return true
}
}
return false
}