github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/internal/helper/exec-cmd.go (about) 1 package helper 2 3 import ( 4 "fmt" 5 "os" 6 "os/exec" 7 8 log "github.com/sirupsen/logrus" 9 ) 10 11 // Call external command without output to standard out/err 12 func CallExternalNoStdOut(additionalEnv []string, cwd string, executable string, args ...string) (int, error) { 13 if HasDebugFlag(SHOW_CMD_EXEC_STDOUT) { 14 return CallExternalStdOut(additionalEnv, cwd, executable, args...) 15 } 16 17 code, output, err := CallExternalWithOutput(additionalEnv, cwd, executable, args...) 18 log.Debugf("Output command %s", output) 19 return code, err 20 } 21 22 // Call external command and output to standard out/err 23 func CallExternalStdOut(additionalEnv []string, cwd string, executable string, args ...string) (int, error) { 24 code, _, err := callExternal(additionalEnv, cwd, false, false, executable, args...) 25 return code, err 26 } 27 28 // Call external command and return the output string 29 func CallExternalWithOutput(additionalEnv []string, cwd string, executable string, args ...string) (int, string, error) { 30 return callExternal(additionalEnv, cwd, false, true, executable, args...) 31 } 32 33 func callExternal(additionalEnv []string, cwd string, mute bool, withOutput bool, executable string, args ...string) (int, string, error) { 34 if _, err := os.Stat(cwd); os.IsNotExist(err) { 35 return 1, "", fmt.Errorf("can't find working directory %s", cwd) 36 } 37 38 handle := exec.Command(executable, args...) 39 handle.Dir = cwd 40 41 // add additional environments 42 env := append(os.Environ(), additionalEnv...) 43 handle.Env = env 44 45 if !mute { 46 if withOutput { 47 output, err := handle.CombinedOutput() 48 if err != nil { 49 if exitError, ok := err.(*exec.ExitError); ok { 50 outtext := "" 51 if output != nil { 52 outtext = string(output) 53 } 54 return exitError.ExitCode(), outtext, err 55 } 56 return 1, "Error when launching the command", err 57 } 58 return 0, string(output), nil 59 } else { 60 handle.Stdout = os.Stdout 61 handle.Stderr = os.Stderr 62 handle.Stdin = os.Stdin 63 } 64 } 65 66 if err := handle.Run(); err != nil { 67 if exitError, ok := err.(*exec.ExitError); ok { 68 return exitError.ExitCode(), "", err 69 } 70 71 return -1, "", err 72 } 73 74 return 0, "", nil 75 }