diff --git a/cmd/ooniprobe/internal/autorun/autorun_darwin.go b/cmd/ooniprobe/internal/autorun/autorun_darwin.go index 4c0c424..c6d6caf 100644 --- a/cmd/ooniprobe/internal/autorun/autorun_darwin.go +++ b/cmd/ooniprobe/internal/autorun/autorun_darwin.go @@ -6,7 +6,6 @@ import ( "fmt" "io/ioutil" "os" - "os/exec" "strconv" "strings" "text/template" @@ -14,6 +13,7 @@ import ( "github.com/apex/log" "github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/utils" "github.com/ooni/probe-cli/v3/internal/engine/shellx" + "golang.org/x/sys/execabs" "golang.org/x/sys/unix" ) @@ -55,7 +55,7 @@ func runQuiteQuietly(name string, arg ...string) error { } func darwinVersionMajor() (int, error) { - out, err := exec.Command("uname", "-r").Output() + out, err := execabs.Command("uname", "-r").Output() if err != nil { return 0, err } @@ -129,7 +129,7 @@ func (m managerDarwin) Start() error { } func (managerDarwin) stop() error { - var failure *exec.ExitError + var failure *execabs.ExitError err := runQuiteQuietly("launchctl", "bootout", serviceTarget) if errors.As(err, &failure) && failure.ExitCode() == int(unix.ESRCH) { err = nil @@ -158,7 +158,7 @@ func (m managerDarwin) Stop() error { func (m managerDarwin) Status() (string, error) { err := runQuiteQuietly("launchctl", "kill", "SIGINFO", serviceTarget) - var failure *exec.ExitError + var failure *execabs.ExitError if errors.As(err, &failure) { switch failure.ExitCode() { case int(unix.ESRCH): diff --git a/cmd/ooniprobe/internal/utils/homedir/homedir.go b/cmd/ooniprobe/internal/utils/homedir/homedir.go index 72c4aba..55a2671 100644 --- a/cmd/ooniprobe/internal/utils/homedir/homedir.go +++ b/cmd/ooniprobe/internal/utils/homedir/homedir.go @@ -6,12 +6,13 @@ import ( "bytes" "errors" "os" - "os/exec" "path/filepath" "runtime" "strconv" "strings" "sync" + + "golang.org/x/sys/execabs" ) // DisableCache will disable caching of the home directory. Caching is enabled @@ -103,7 +104,7 @@ func dirDarwin() (string, error) { var stdout bytes.Buffer // If that fails, try OS specific commands - cmd := exec.Command("sh", "-c", `dscl -q . -read /Users/"$(whoami)" NFSHomeDirectory | sed 's/^[^ ]*: //'`) + cmd := execabs.Command("sh", "-c", `dscl -q . -read /Users/"$(whoami)" NFSHomeDirectory | sed 's/^[^ ]*: //'`) cmd.Stdout = &stdout if err := cmd.Run(); err == nil { result := strings.TrimSpace(stdout.String()) @@ -114,7 +115,7 @@ func dirDarwin() (string, error) { // try the shell stdout.Reset() - cmd = exec.Command("sh", "-c", "cd && pwd") + cmd = execabs.Command("sh", "-c", "cd && pwd") cmd.Stdout = &stdout if err := cmd.Run(); err == nil { result := strings.TrimSpace(stdout.String()) @@ -125,7 +126,7 @@ func dirDarwin() (string, error) { // try to figure out the user and check the default location stdout.Reset() - cmd = exec.Command("whoami") + cmd = execabs.Command("whoami") cmd.Stdout = &stdout if err := cmd.Run(); err == nil { user := strings.TrimSpace(stdout.String()) @@ -150,7 +151,7 @@ func dirUnix() (string, error) { var stdout bytes.Buffer // If that fails, try OS specific commands - cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) + cmd := execabs.Command("getent", "passwd", strconv.Itoa(os.Getuid())) cmd.Stdout = &stdout if err := cmd.Run(); err == nil { if passwd := strings.TrimSpace(stdout.String()); passwd != "" { @@ -164,7 +165,7 @@ func dirUnix() (string, error) { // If all else fails, try the shell stdout.Reset() - cmd = exec.Command("sh", "-c", "cd && pwd") + cmd = execabs.Command("sh", "-c", "cd && pwd") cmd.Stdout = &stdout if err := cmd.Run(); err == nil { result := strings.TrimSpace(stdout.String()) @@ -175,7 +176,7 @@ func dirUnix() (string, error) { // try to figure out the user and check the default location stdout.Reset() - cmd = exec.Command("whoami") + cmd = execabs.Command("whoami") cmd.Stdout = &stdout if err := cmd.Run(); err == nil { user := strings.TrimSpace(stdout.String()) diff --git a/internal/cmd/e2epostprocess/main.go b/internal/cmd/e2epostprocess/main.go index 06eacc4..7915b24 100644 --- a/internal/cmd/e2epostprocess/main.go +++ b/internal/cmd/e2epostprocess/main.go @@ -7,9 +7,10 @@ import ( "io/ioutil" "log" "os" - "os/exec" "path/filepath" "strings" + + "golang.org/x/sys/execabs" ) func fatalOnError(err error) { @@ -70,7 +71,7 @@ func main() { options = append(options, *entry.Input) } log.Printf("run: go %s", strings.Join(options, " ")) - cmd := exec.Command("go", options...) + cmd := execabs.Command("go", options...) cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr err = cmd.Run() fatalOnError(err) diff --git a/internal/cmd/jafar/iptables/iptables_integration_test.go b/internal/cmd/jafar/iptables/iptables_integration_test.go index 13c73ac..2d10337 100644 --- a/internal/cmd/jafar/iptables/iptables_integration_test.go +++ b/internal/cmd/jafar/iptables/iptables_integration_test.go @@ -7,12 +7,13 @@ import ( "net/http" "net/http/httptest" "net/url" - "os/exec" "runtime" "strings" "testing" "time" + "golang.org/x/sys/execabs" + "github.com/apex/log" "github.com/ooni/probe-cli/v3/internal/cmd/jafar/resolver" "github.com/ooni/probe-cli/v3/internal/cmd/jafar/uncensored" @@ -295,7 +296,7 @@ func TestHijackHTTP(t *testing.T) { if err == nil { t.Fatal("expected an error here") } - var exitErr *exec.ExitError + var exitErr *execabs.ExitError if !errors.As(err, &exitErr) { t.Fatal("not the error type we expected") } @@ -335,7 +336,7 @@ func TestHijackHTTPS(t *testing.T) { t.Fatal("expected an error here") } t.Log(err) - var exitErr *exec.ExitError + var exitErr *execabs.ExitError if !errors.As(err, &exitErr) { t.Fatal("not the error type we expected") } diff --git a/internal/cmd/jafar/main.go b/internal/cmd/jafar/main.go index 514df4f..eb4bb41 100644 --- a/internal/cmd/jafar/main.go +++ b/internal/cmd/jafar/main.go @@ -10,11 +10,12 @@ import ( "net" "net/http" "os" - "os/exec" "os/signal" "strings" "syscall" + "golang.org/x/sys/execabs" + "github.com/apex/log" "github.com/apex/log/handlers/cli" "github.com/miekg/dns" @@ -243,7 +244,7 @@ func mustx(err error, message string, osExit func(int)) { if err != nil { var ( exitcode = 1 - exiterr *exec.ExitError + exiterr *execabs.ExitError ) if errors.As(err, &exiterr) { exitcode = exiterr.ExitCode() diff --git a/internal/engine/shellx/shellx.go b/internal/engine/shellx/shellx.go index e540e14..f95e71f 100644 --- a/internal/engine/shellx/shellx.go +++ b/internal/engine/shellx/shellx.go @@ -4,9 +4,10 @@ package shellx import ( "errors" "os" - "os/exec" "strings" + "golang.org/x/sys/execabs" + "github.com/apex/log" "github.com/google/shlex" "github.com/ooni/probe-cli/v3/internal/engine/model" @@ -22,7 +23,7 @@ type runconfig struct { func run(config runconfig) error { config.loginfof("exec: %s %s", config.name, strings.Join(config.args, " ")) - cmd := exec.Command(config.name, config.args...) + cmd := execabs.Command(config.name, config.args...) cmd.Stdout = config.stdout cmd.Stderr = config.stderr err := cmd.Run()