11package main
22
33import (
4+ "archive/tar"
45 "fmt"
56 "io"
7+ "net/http"
8+ "os"
69
10+ "github.com/creativeprojects/clog"
711 "github.com/creativeprojects/resticprofile/ssh"
812)
913
@@ -15,16 +19,58 @@ func sendProfileCommand(w io.Writer, cmdCtx commandContext) error {
1519 if err != nil {
1620 return err
1721 }
22+ // send the files to the remote using tar
23+ handler := http .HandlerFunc (func (resp http.ResponseWriter , req * http.Request ) {
24+ writer := tar .NewWriter (resp )
25+ defer writer .Close ()
26+
27+ for _ , filename := range remote .SendFiles {
28+ fileInfo , err := os .Stat (filename )
29+ if err != nil {
30+ clog .Errorf ("unable to stat file %s: %v" , filename , err )
31+ continue
32+ }
33+ fileHeader , err := tar .FileInfoHeader (fileInfo , "" )
34+ if err != nil {
35+ clog .Errorf ("unable to create tar header for file %s: %v" , filename , err )
36+ continue
37+ }
38+ err = writer .WriteHeader (fileHeader )
39+ if err != nil {
40+ clog .Errorf ("unable to write tar header for file %s: %v" , filename , err )
41+ break
42+ }
43+ file , err := os .Open (filename )
44+ if err != nil {
45+ clog .Errorf ("unable to open file %s: %v" , filename , err )
46+ continue
47+ }
48+ defer file .Close ()
49+
50+ written , err := io .Copy (writer , file )
51+ if err != nil {
52+ clog .Errorf ("unable to write file %s: %v" , filename , err )
53+ break
54+ }
55+ if written != fileInfo .Size () {
56+ clog .Errorf ("file %s written %d bytes, expected %d" , filename , written , fileInfo .Size ())
57+ break
58+ }
59+ clog .Debugf ("file %s written %d bytes" , filename , written )
60+ }
61+ })
1862 cnx := ssh .NewSSH (ssh.Config {
1963 Host : remote .Host ,
2064 Username : remote .Username ,
2165 PrivateKeyPath : remote .PrivateKeyPath ,
2266 KnownHostsPath : remote .KnownHostsPath ,
67+ Handler : handler ,
2368 })
69+ defer cnx .Close ()
70+
2471 err = cnx .Connect ()
2572 if err != nil {
2673 return err
2774 }
28- defer cnx .Close ()
2975 return nil
3076}
0 commit comments