Files
Packer-Cn/packer/plugin/command.go
T

59 lines
1.0 KiB
Go

package plugin
import (
"bytes"
"errors"
"github.com/mitchellh/packer/packer"
"net/rpc"
"os/exec"
packrpc "github.com/mitchellh/packer/packer/rpc"
"strings"
"time"
)
func Command(cmd *exec.Cmd) (result packer.Command, err error) {
env := []string{
"PACKER_PLUGIN_MIN_PORT=10000",
"PACKER_PLUGIN_MAX_PORT=25000",
}
out := new(bytes.Buffer)
cmd.Env = append(cmd.Env, env...)
cmd.Stdout = out
err = cmd.Start()
if err != nil {
return
}
cmdExited := make(chan bool)
go func() {
cmd.Wait()
cmdExited <- true
}()
var address string
for done := false; !done; {
select {
case <-cmdExited:
err = errors.New("plugin exited before we could connect")
return
case <-time.After(10 * time.Millisecond):
if line, err := out.ReadBytes('\n'); err == nil {
address = strings.TrimSpace(string(line))
done = true
}
// Make sure to reset err to nil
err = nil
}
}
client, err := rpc.Dial("tcp", address)
if err != nil {
panic(err)
}
result = packrpc.Command(client)
return
}