Commit 821d27a6 authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

communicator/ssh: More complete SCP

parent d8ad9ca1
......@@ -88,6 +88,12 @@ func (c *comm) Upload(path string, input io.Reader) error {
return err
}
// Set stderr/stdout to a bytes buffer
stderr := new(bytes.Buffer)
stdout := new(bytes.Buffer)
session.Stderr = stderr
session.Stdout = stdout
// We only want to close once, so we nil w after we close it,
// and only close in the defer if it hasn't been closed already.
defer func() {
......@@ -103,7 +109,7 @@ func (c *comm) Upload(path string, input io.Reader) error {
// Start the sink mode on the other side
// TODO(mitchellh): There are probably issues with shell escaping the path
log.Println("Starting remote scp process in sink mode")
if err = session.Start("scp -t " + target_dir); err != nil {
if err = session.Start("scp -vt " + target_dir); err != nil {
return err
}
......@@ -119,6 +125,7 @@ func (c *comm) Upload(path string, input io.Reader) error {
// Start the protocol
fmt.Fprintln(w, "C0644", input_memory.Len(), target_file)
io.Copy(w, input_memory)
fmt.Fprint(w, "\x00") // XXX(mitchellh): WHY?
// Close the stdin, which sends an EOF, and then set w to nil so that
// our defer func doesn't close it again since that is unsafe with
......@@ -128,9 +135,23 @@ func (c *comm) Upload(path string, input io.Reader) error {
// Wait for the SCP connection to close, meaning it has consumed all
// our data and has completed. Or has errored.
session.Wait()
err = session.Wait()
if err != nil {
exitErr, ok := err.(*ssh.ExitError)
if !ok {
// This wasn't an exit error, so something fatal happened
return err
}
// Otherwise, we have an ExitErorr, meaning we can just read
// the exit status
log.Printf("exit status: %d", exitErr.ExitStatus())
}
// TODO(mitchellh): Check for return data (expect a 0 or error)
log.Printf("scp stdout: %s", stdout.String())
log.Printf("scp stderr: %s", stderr.String())
return nil
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment