get_output.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package cmdutil
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "os/exec"
  8. "syscall"
  9. log "github.com/sirupsen/logrus"
  10. )
  11. func ExecAndGetStdoutJson(cmd *exec.Cmd, v interface{}) error {
  12. b, err := ExecAndGetStdoutBytes(cmd)
  13. if err != nil {
  14. return err
  15. }
  16. err = json.Unmarshal(b, v)
  17. if err != nil {
  18. return err
  19. }
  20. return nil
  21. }
  22. func ExecAndGetStdoutBytes(cmd *exec.Cmd) ([]byte, error) {
  23. b := new(bytes.Buffer)
  24. if err := ExecAndWriteStdout(cmd, b); err != nil {
  25. return nil, err
  26. }
  27. return b.Bytes(), nil
  28. }
  29. func ExecAndWriteStdout(cmd *exec.Cmd, w io.Writer) error {
  30. stdout, err := cmd.StdoutPipe()
  31. if err != nil {
  32. return fmt.Errorf("error opening stdout of command: %v", err)
  33. }
  34. defer stdout.Close()
  35. log.Debugf("Executing: %v %v", cmd.Path, cmd.Args)
  36. if err = cmd.Start(); err != nil {
  37. return fmt.Errorf("error starting command: %v", err)
  38. }
  39. if _, err := io.Copy(w, stdout); err != nil {
  40. // Ask the process to exit
  41. cmd.Process.Signal(syscall.SIGKILL)
  42. cmd.Process.Wait()
  43. return fmt.Errorf("error copying stdout to buffer: %v", err)
  44. }
  45. if err := cmd.Wait(); err != nil {
  46. return fmt.Errorf("command failed %v", err)
  47. }
  48. return nil
  49. }