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  }