github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgSsh/TransferFiles.go (about)

     1  package kmgSsh
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"io/ioutil"
     8  	"os"
     9  	"path"
    10  
    11  	"code.google.com/p/go.crypto/ssh"
    12  	"github.com/bronze1man/kmg/archive/kmgTar"
    13  	"github.com/bronze1man/kmg/kmgCmd"
    14  )
    15  
    16  //transfer a directory to remote host,with single tcp and tar.gz format
    17  //Stdout will be ignore.
    18  //Stderr will treat as an error from remote command
    19  func CopyDirectory(client *ssh.Client, selfPath string, remotePath string) (err error) {
    20  	session, err := client.NewSession()
    21  	if err != nil {
    22  		return fmt.Errorf("[CopyDirectory]Failed to create session: %s", err.Error())
    23  	}
    24  	defer session.Close()
    25  	w, err := session.StdinPipe()
    26  	if err != nil {
    27  		return
    28  	}
    29  	defer w.Close()
    30  	errBuf := &bytes.Buffer{}
    31  	session.Stderr = errBuf
    32  	escapedRemotePath := kmgCmd.BashEscape(remotePath)
    33  	err = session.Start(fmt.Sprintf("mkdir -p %s;tar -xz -C %s", escapedRemotePath, escapedRemotePath))
    34  	if err != nil {
    35  		return fmt.Errorf("[CopyDirectory] Failed to Run: %s", err.Error())
    36  	}
    37  	err = kmgTar.PackageDirectoryTarGz(selfPath, w)
    38  	if err != nil {
    39  		return
    40  	}
    41  	err = w.Close()
    42  	if err != nil {
    43  		return
    44  	}
    45  	err = session.Wait()
    46  	if err != nil {
    47  		return fmt.Errorf("[CopyDirectory] session.Wait() err:%s", err.Error())
    48  	}
    49  	if errBuf.Len() != 0 {
    50  		return fmt.Errorf("[CopyDirectory] remote: %s", string(errBuf.Bytes()))
    51  	}
    52  	return nil
    53  }
    54  
    55  //transfer a file to remote host,with single tcp and gz format
    56  //Stdout will be ignore.
    57  //Stderr will treat as an error from remote command
    58  //TODO test
    59  func CopyFile(client *ssh.Client, selfPath string, remotePath string) (err error) {
    60  	session, err := client.NewSession()
    61  	if err != nil {
    62  		return fmt.Errorf("[CopyFile]Failed to create session: %s", err.Error())
    63  	}
    64  	defer session.Close()
    65  	w, err := session.StdinPipe()
    66  	if err != nil {
    67  		return
    68  	}
    69  	defer w.Close()
    70  	errReader, err := session.StderrPipe()
    71  	if err != nil {
    72  		return
    73  	}
    74  	escapedRemotePath := kmgCmd.BashEscape(remotePath)
    75  	escapedRemoteDir := kmgCmd.BashEscape(path.Dir(remotePath))
    76  	err = session.Start(fmt.Sprintf("mkdir -p %s;cat > %s", escapedRemoteDir, escapedRemotePath))
    77  	if err != nil {
    78  		return fmt.Errorf("[CopyFile] Failed to Start: %s", err.Error())
    79  	}
    80  	f, err := os.Open(selfPath)
    81  	if err != nil {
    82  		return
    83  	}
    84  	defer f.Close()
    85  	//gzipW := gzip.NewWriter(w)
    86  	//defer gzipW.Close()
    87  	_, err = io.Copy(w, f)
    88  	if err != nil {
    89  		return fmt.Errorf("[CopyFile] io.Copy: %s", err)
    90  	}
    91  	//err = gzipW.Close()
    92  	//if err!=nil{
    93  	//	return
    94  	//}
    95  	err = w.Close()
    96  	if err != nil {
    97  		return
    98  	}
    99  	errBytes, err := ioutil.ReadAll(errReader)
   100  	if err != nil {
   101  		return
   102  	}
   103  	if len(errBytes) != 0 {
   104  		return fmt.Errorf("[CopyFile] remote: %s", string(errBytes))
   105  	}
   106  	err = session.Wait()
   107  	if err != nil {
   108  		return fmt.Errorf("[CopyFile] session.Wait() err:%s", err.Error())
   109  	}
   110  	return nil
   111  }