1
1
package main
2
2
3
3
import (
4
+ "bufio"
4
5
"bytes"
5
6
"encoding/json"
6
7
"errors"
7
8
"fmt"
9
+ "io"
8
10
"io/ioutil"
9
11
"os"
10
12
"os/exec"
11
13
"path"
12
14
15
+ log "github.com/Sirupsen/logrus"
13
16
"github.com/docker/infrakit/pkg/spi/instance"
14
17
"github.com/docker/infrakit/pkg/template"
15
18
)
@@ -29,15 +32,60 @@ func (v vagrantPlugin) Validate(req json.RawMessage) error {
29
32
return nil
30
33
}
31
34
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
+
32
49
func inheritedEnvCommand (cmdAndArgs []string , extraEnv ... string ) (string , error ) {
33
50
cmd := exec .Command (cmdAndArgs [0 ], cmdAndArgs [1 :]... )
34
51
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 ()
37
57
if err != nil {
38
- fmt . Printf ( "Err: %s \n " , err )
58
+ return "" , err
39
59
}
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
41
89
}
42
90
43
91
// Provision creates a new instance.
0 commit comments