Skip to content

Commit 961405e

Browse files
committed
Add option: StreamStdio
The StreamStdio option, when set to true, streams output to STDIO. When set to false the user can only access the output from the result. Signed-off-by: Alex Ellis (OpenFaaS Ltd) <alexellis2@gmail.com>
1 parent d179472 commit 961405e

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

pkg/v1/exec.go

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package execute
22

33
import (
4+
"bytes"
45
"fmt"
5-
"io/ioutil"
6+
"io"
67
"os"
78
"os/exec"
89
"strings"
@@ -14,6 +15,13 @@ type ExecTask struct {
1415
Shell bool
1516
Env []string
1617
Cwd string
18+
19+
// StreamStdio prints stdout and stderr directly to os.Stdout/err as
20+
// the command runs.
21+
StreamStdio bool
22+
23+
// PrintCommand prints the command before executing
24+
PrintCommand bool
1725
}
1826

1927
type ExecResult struct {
@@ -28,7 +36,9 @@ func (et ExecTask) Execute() (ExecResult, error) {
2836
argsSt = strings.Join(et.Args, " ")
2937
}
3038

31-
fmt.Println("exec: ", et.Command, argsSt)
39+
if et.PrintCommand {
40+
fmt.Println("exec: ", et.Command, argsSt)
41+
}
3242

3343
var cmd *exec.Cmd
3444

@@ -67,35 +77,29 @@ func (et ExecTask) Execute() (ExecResult, error) {
6777
}
6878
}
6979

70-
stdoutPipe, stdoutPipeErr := cmd.StdoutPipe()
71-
if stdoutPipeErr != nil {
72-
return ExecResult{}, stdoutPipeErr
73-
}
80+
stdoutBuff := bytes.Buffer{}
81+
stderrBuff := bytes.Buffer{}
7482

75-
stderrPipe, stderrPipeErr := cmd.StderrPipe()
76-
if stderrPipeErr != nil {
77-
return ExecResult{}, stderrPipeErr
83+
var stdoutWriters io.Writer
84+
var stderrWriters io.Writer
85+
86+
if et.StreamStdio {
87+
stdoutWriters = io.MultiWriter(os.Stdout, &stdoutBuff)
88+
stderrWriters = io.MultiWriter(os.Stderr, &stderrBuff)
89+
} else {
90+
stdoutWriters = &stdoutBuff
91+
stderrWriters = &stderrBuff
7892
}
7993

94+
cmd.Stdout = stdoutWriters
95+
cmd.Stderr = stderrWriters
96+
8097
startErr := cmd.Start()
8198

8299
if startErr != nil {
83100
return ExecResult{}, startErr
84101
}
85102

86-
stdoutBytes, err := ioutil.ReadAll(stdoutPipe)
87-
if err != nil {
88-
return ExecResult{}, err
89-
}
90-
91-
stderrBytes, err := ioutil.ReadAll(stderrPipe)
92-
93-
if err != nil {
94-
return ExecResult{}, err
95-
}
96-
97-
fmt.Println("res: " + string(stdoutBytes))
98-
99103
exitCode := 0
100104
execErr := cmd.Wait()
101105
if execErr != nil {
@@ -106,8 +110,8 @@ func (et ExecTask) Execute() (ExecResult, error) {
106110
}
107111

108112
return ExecResult{
109-
Stdout: string(stdoutBytes),
110-
Stderr: string(stderrBytes),
113+
Stdout: string(stdoutBuff.Bytes()),
114+
Stderr: string(stderrBuff.Bytes()),
111115
ExitCode: exitCode,
112116
}, nil
113117
}

0 commit comments

Comments
 (0)