commands/cluster/agent/bootstrap/exec.go (47 lines of code) (raw):

package bootstrap import ( "fmt" "io" "os/exec" ) type Cmd interface { RunWithOutput(name string, arg ...string) ([]byte, error) Run(name string, arg ...string) error } type cmdWrapper struct { stdout, stderr io.Writer env []string } type errorWithOutput struct { output []byte err error } func (e errorWithOutput) Error() string { return fmt.Sprintf("command failed with %q and output:\n%s", e.err, e.output) } func (e errorWithOutput) Unwrap() error { return e.err } func NewCmd(stdout, stderr io.Writer, env []string) Cmd { return &cmdWrapper{ stdout: stdout, stderr: stderr, env: env, } } func (c *cmdWrapper) RunWithOutput(name string, arg ...string) ([]byte, error) { command := exec.Command(name, arg...) command.Env = c.env output, err := command.CombinedOutput() if err != nil { return output, &errorWithOutput{output: output, err: err} } return output, nil } func (c *cmdWrapper) Run(name string, arg ...string) error { command := exec.Command(name, arg...) command.Stdout = c.stdout command.Stderr = c.stderr command.Env = c.env return command.Run() }