func (c *comm) Start(cmd *packer.RemoteCmd) (err error) { session, err := c.client.NewSession() if err != nil { return } // Setup our session session.Stdin = cmd.Stdin session.Stdout = cmd.Stdout session.Stderr = cmd.Stderr // Request a PTY termModes := ssh.TerminalModes{ ssh.ECHO: 0, // do not echo ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud } if err = session.RequestPty("xterm", 80, 40, termModes); err != nil { return } log.Printf("starting remote command: %s", cmd.Command) err = session.Start(cmd.Command + "\n") if err != nil { return } // Start a goroutine to wait for the session to end and set the // exit boolean and status. go func() { defer session.Close() err := session.Wait() cmd.ExitStatus = 0 if err != nil { exitErr, ok := err.(*ssh.ExitError) if ok { cmd.ExitStatus = exitErr.ExitStatus() } } cmd.Exited = true }() return }
func (c *communicator) Start(cmd *packer.RemoteCmd) (err error) { var args CommunicatorStartArgs args.Command = cmd.Command if cmd.Stdin != nil { stdinL := netListenerInRange(portRangeMin, portRangeMax) args.StdinAddress = stdinL.Addr().String() go serveSingleCopy("stdin", stdinL, nil, cmd.Stdin) } if cmd.Stdout != nil { stdoutL := netListenerInRange(portRangeMin, portRangeMax) args.StdoutAddress = stdoutL.Addr().String() go serveSingleCopy("stdout", stdoutL, cmd.Stdout, nil) } if cmd.Stderr != nil { stderrL := netListenerInRange(portRangeMin, portRangeMax) args.StderrAddress = stderrL.Addr().String() go serveSingleCopy("stderr", stderrL, cmd.Stderr, nil) } responseL := netListenerInRange(portRangeMin, portRangeMax) args.ResponseAddress = responseL.Addr().String() go func() { defer responseL.Close() conn, err := responseL.Accept() if err != nil { log.Panic(err) } defer conn.Close() decoder := gob.NewDecoder(conn) var finished CommandFinished if err := decoder.Decode(&finished); err != nil { log.Panic(err) } cmd.ExitStatus = finished.ExitStatus cmd.Exited = true }() err = c.client.Call("Communicator.Start", &args, new(interface{})) return }