github.com/rothwerx/packer@v0.9.0/post-processor/shell-local/communicator.go (about) 1 package shell_local 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "os/exec" 8 "syscall" 9 10 "github.com/mitchellh/packer/packer" 11 ) 12 13 type Communicator struct{} 14 15 func (c *Communicator) Start(cmd *packer.RemoteCmd) error { 16 localCmd := exec.Command("sh", "-c", cmd.Command) 17 localCmd.Stdin = cmd.Stdin 18 localCmd.Stdout = cmd.Stdout 19 localCmd.Stderr = cmd.Stderr 20 21 // Start it. If it doesn't work, then error right away. 22 if err := localCmd.Start(); err != nil { 23 return err 24 } 25 26 // We've started successfully. Start a goroutine to wait for 27 // it to complete and track exit status. 28 go func() { 29 var exitStatus int 30 err := localCmd.Wait() 31 if err != nil { 32 if exitErr, ok := err.(*exec.ExitError); ok { 33 exitStatus = 1 34 35 // There is no process-independent way to get the REAL 36 // exit status so we just try to go deeper. 37 if status, ok := exitErr.Sys().(syscall.WaitStatus); ok { 38 exitStatus = status.ExitStatus() 39 } 40 } 41 } 42 43 cmd.SetExited(exitStatus) 44 }() 45 46 return nil 47 } 48 49 func (c *Communicator) Upload(string, io.Reader, *os.FileInfo) error { 50 return fmt.Errorf("upload not supported") 51 } 52 53 func (c *Communicator) UploadDir(string, string, []string) error { 54 return fmt.Errorf("uploadDir not supported") 55 } 56 57 func (c *Communicator) Download(string, io.Writer) error { 58 return fmt.Errorf("download not supported") 59 } 60 61 func (c *Communicator) DownloadDir(src string, dst string, exclude []string) error { 62 return fmt.Errorf("downloadDir not supported") 63 }