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  }