11package main
22
33import (
4+ "bufio"
45 "bytes"
56 "encoding/json"
67 "errors"
78 "fmt"
9+ "io"
810 "io/ioutil"
911 "os"
1012 "os/exec"
1113 "path"
1214
15+ log "github.com/Sirupsen/logrus"
1316 "github.com/docker/infrakit/pkg/spi/instance"
1417 "github.com/docker/infrakit/pkg/template"
1518)
@@ -29,15 +32,60 @@ func (v vagrantPlugin) Validate(req json.RawMessage) error {
2932 return nil
3033}
3134
35+ func stream (r io.ReadCloser , dest chan <- string ) {
36+ go func () {
37+ defer r .Close ()
38+ reader := bufio .NewReader (r )
39+ for {
40+ line , err := reader .ReadString ('\n' )
41+ if err != nil {
42+ return
43+ }
44+ dest <- line
45+ }
46+ }()
47+ }
48+
3249func inheritedEnvCommand (cmdAndArgs []string , extraEnv ... string ) (string , error ) {
3350 cmd := exec .Command (cmdAndArgs [0 ], cmdAndArgs [1 :]... )
3451 cmd .Env = append (os .Environ (), extraEnv ... )
35- output , err := cmd .CombinedOutput ()
36- fmt .Printf ("DEBUGGING cmd output: %s\n " , string (output ))
52+
53+ stdoutChan := make (chan string )
54+ stderrChan := make (chan string )
55+
56+ stdout , err := cmd .StdoutPipe ()
3757 if err != nil {
38- fmt . Printf ( "Err: %s \n " , err )
58+ return "" , err
3959 }
40- return string (output ), err
60+
61+ stderr , err := cmd .StderrPipe ()
62+ if err != nil {
63+ return "" , err
64+ }
65+
66+ stream (stdout , stdoutChan )
67+ stream (stderr , stderrChan )
68+
69+ done := make (chan struct {})
70+ go func () {
71+ for {
72+ select {
73+ case stderrl := <- stderrChan :
74+ log .Warningln ("Vagrant STDERR:" , stderrl )
75+ case stdoutl := <- stdoutChan :
76+ log .Infoln ("Vagrant STDOUT:" , stdoutl )
77+ case <- done :
78+ return
79+ }
80+ }
81+ }()
82+
83+ err = cmd .Run ()
84+
85+ log .Infoln ("Command completed, err=" , err )
86+ close (done )
87+
88+ return "" , err
4189}
4290
4391// Provision creates a new instance.
0 commit comments