gke-deploy/services/exec.go (51 lines of code) (raw):
package services
import (
"bytes"
"context"
"fmt"
"io"
"os"
"os/exec"
"strings"
"github.com/pkg/errors"
)
func runCommandWithStdinRedirection(ctx context.Context, printCommand bool, name, input string, args ...string) (string, error) {
if printCommand {
fmt.Printf("\n--------------------------------------------------------------------------------\n")
fmt.Printf("> Running command\n\n")
fmt.Printf(" %s %s < %s\n", name, strings.Join(args, " "), input)
fmt.Printf("\n--------------------------------------------------------------------------------\n\n")
}
cmd := exec.CommandContext(ctx, name, args...)
cmd.Stderr = os.Stderr
// Example taken from https://golang.org/src/os/exec/example_test.go
stdin, err := cmd.StdinPipe()
if err != nil {
return "", err
}
go func() {
defer stdin.Close()
io.WriteString(stdin, input)
}()
out, err := cmd.Output()
if err != nil {
return "", err
}
return string(out), nil
}
func runCommand(ctx context.Context, printCommand bool, name string, args ...string) (string, error) {
if printCommand {
fmt.Printf("\n--------------------------------------------------------------------------------\n")
fmt.Printf("> Running command\n\n")
fmt.Printf(" %s %s\n", name, strings.Join(args, " "))
fmt.Printf("\n--------------------------------------------------------------------------------\n\n")
}
cmd := exec.CommandContext(ctx, name, args...)
var buf bytes.Buffer
cmd.Stderr = &buf
cmd.Stdin = os.Stdin
out, err := cmd.Output()
if err != nil {
return "", errors.Errorf("%s %s", buf.String(), err.Error())
}
return string(out), nil
}