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  }