github.com/davidmanzanares/dsd@v0.1.2-0.20210106152357-a35988f5d245/dsdl/download.go (about) 1 package dsdl 2 3 import ( 4 "archive/tar" 5 "compress/gzip" 6 "io" 7 "log" 8 "os" 9 "sync" 10 11 "github.com/davidmanzanares/dsd/types" 12 ) 13 14 // Download the assets deployed on service 15 func Download(service string) error { 16 p, err := getProviderFromService(service) 17 if err != nil { 18 return err 19 } 20 21 v, err := p.GetCurrentVersion() 22 if err != nil { 23 return err 24 } 25 _, err = download(p, v) 26 return err 27 } 28 29 func download(p types.Provider, v types.Version) (string, error) { 30 gzipInput, s3Output := io.Pipe() 31 var barrier sync.WaitGroup 32 barrier.Add(1) 33 var err2 error 34 go func() { 35 err2 = p.GetAsset(v.Name+".tar.gz", s3Output) 36 s3Output.Close() 37 barrier.Done() 38 }() 39 40 gzipOutput, err := gzip.NewReader(gzipInput) 41 if err != nil { 42 return "", err 43 } 44 45 tarReader := tar.NewReader(gzipOutput) 46 47 folder := "assets/" + v.Name + "/" 48 err = os.MkdirAll(folder, 0770) 49 if err != nil { 50 return "", err 51 } 52 var executableFilepath string 53 for { 54 h, err := tarReader.Next() 55 if err == io.EOF { 56 break 57 } 58 if err != nil { 59 return "", err 60 } 61 filepath := folder + h.Name 62 63 if h.FileInfo().IsDir() { 64 os.Mkdir(filepath, h.FileInfo().Mode().Perm()) 65 continue 66 } 67 68 if h.Mode&0100 != 0 && executableFilepath == "" { 69 executableFilepath = filepath 70 } 71 72 f, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(h.Mode)) 73 if err != nil { 74 log.Println(err) 75 continue 76 } 77 defer f.Close() 78 io.Copy(f, tarReader) 79 } 80 barrier.Wait() 81 if err2 != nil { 82 return "", err 83 } 84 return executableFilepath, nil 85 }