Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: more robust processor checks #1656

Merged
merged 1 commit into from
Dec 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 10 additions & 16 deletions pkg/remote/connutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"strings"

"github.com/wavetermdev/waveterm/pkg/panichandler"
"github.com/wavetermdev/waveterm/pkg/util/utilfn"
"golang.org/x/crypto/ssh"
)

Expand Down Expand Up @@ -145,7 +146,7 @@ func GetClientOs(client *ssh.Client) (string, error) {
return "", err
}

out, unixErr := session.Output("uname -s")
out, unixErr := session.CombinedOutput("uname -s")
if unixErr == nil {
formatted := strings.ToLower(string(out))
formatted = strings.TrimSpace(formatted)
Expand Down Expand Up @@ -184,36 +185,29 @@ func GetClientArch(client *ssh.Client) (string, error) {
return "", err
}

out, unixErr := session.Output("uname -m")
out, unixErr := session.CombinedOutput("uname -m")
if unixErr == nil {
formatted := strings.ToLower(string(out))
formatted = strings.TrimSpace(formatted)
if formatted == "x86_64" {
return "x64", nil
}
return formatted, nil
return utilfn.FilterValidArch(string(out))
}

session, err = client.NewSession()
if err != nil {
return "", err
}

out, cmdErr := session.Output("echo %PROCESSOR_ARCHITECTURE%")
if cmdErr == nil {
formatted := strings.ToLower(string(out))
return strings.TrimSpace(formatted), nil
out, cmdErr := session.CombinedOutput("echo %PROCESSOR_ARCHITECTURE%")
if cmdErr == nil && strings.TrimSpace(string(out)) != "%PROCESSOR_ARCHITECTURE%" {
return utilfn.FilterValidArch(string(out))
}

session, err = client.NewSession()
if err != nil {
return "", err
}

out, psErr := session.Output("echo $env:PROCESSOR_ARCHITECTURE")
if psErr == nil {
formatted := strings.ToLower(string(out))
return strings.TrimSpace(formatted), nil
out, psErr := session.CombinedOutput("echo $env:PROCESSOR_ARCHITECTURE")
if psErr == nil && strings.TrimSpace(string(out)) != "$env:PROCESSOR_ARCHITECTURE" {
return utilfn.FilterValidArch(string(out))
}
return "", fmt.Errorf("unable to determine architecture: {unix: %s, cmd: %s, powershell: %s}", unixErr, cmdErr, psErr)
}
Expand Down
18 changes: 18 additions & 0 deletions pkg/util/utilfn/utilfn.go
Original file line number Diff line number Diff line change
Expand Up @@ -964,3 +964,21 @@ func SafeDeref[T any](x *T) T {
func Ptr[T any](x T) *T {
return &x
}

/**
* Utility function to convert know architecture patterns
* to the patterns we use. It returns an error if the
* provided name is unknown
*/
func FilterValidArch(arch string) (string, error) {
formatted := strings.TrimSpace(strings.ToLower(arch))
switch formatted {
case "amd64":
case "x86_64":
case "x64":
return "x64", nil
case "arm64":
return "arm64", nil
}
return "", fmt.Errorf("unknown architecture: %s", formatted)
}
20 changes: 7 additions & 13 deletions pkg/wsl/wsl-util.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"time"

"github.com/wavetermdev/waveterm/pkg/panichandler"
"github.com/wavetermdev/waveterm/pkg/util/utilfn"
)

func DetectShell(ctx context.Context, client *Distro) (string, error) {
Expand Down Expand Up @@ -96,7 +97,7 @@ func hasBashInstalled(ctx context.Context, client *Distro) (bool, error) {

func GetClientOs(ctx context.Context, client *Distro) (string, error) {
cmd := client.WslCommand(ctx, "uname -s")
out, unixErr := cmd.Output()
out, unixErr := cmd.CombinedOutput()
if unixErr == nil {
formatted := strings.ToLower(string(out))
formatted = strings.TrimSpace(formatted)
Expand Down Expand Up @@ -125,26 +126,19 @@ func GetClientArch(ctx context.Context, client *Distro) (string, error) {
cmd := client.WslCommand(ctx, "uname -m")
out, unixErr := cmd.Output()
if unixErr == nil {
formatted := strings.ToLower(string(out))
formatted = strings.TrimSpace(formatted)
if formatted == "x86_64" {
return "x64", nil
}
return formatted, nil
return utilfn.FilterValidArch(string(out))
}

cmd = client.WslCommand(ctx, "echo %PROCESSOR_ARCHITECTURE%")
out, cmdErr := cmd.Output()
out, cmdErr := cmd.CombinedOutput()
if cmdErr == nil && strings.TrimSpace(string(out)) != "%PROCESSOR_ARCHITECTURE%" {
formatted := strings.ToLower(string(out))
return strings.TrimSpace(formatted), nil
return utilfn.FilterValidArch(string(out))
}

cmd = client.WslCommand(ctx, "echo $env:PROCESSOR_ARCHITECTURE")
out, psErr := cmd.Output()
out, psErr := cmd.CombinedOutput()
if psErr == nil && strings.TrimSpace(string(out)) != "$env:PROCESSOR_ARCHITECTURE" {
formatted := strings.ToLower(string(out))
return strings.TrimSpace(formatted), nil
return utilfn.FilterValidArch(string(out))
}
return "", fmt.Errorf("unable to determine architecture: {unix: %s, cmd: %s, powershell: %s}", unixErr, cmdErr, psErr)
}
Expand Down
Loading