github.com/kubernetes-incubator/kube-aws@v0.16.4/provisioner/package.go (about) 1 package provisioner 2 3 import ( 4 "archive/tar" 5 "bytes" 6 "compress/gzip" 7 "fmt" 8 "io" 9 "os" 10 "path/filepath" 11 "strings" 12 "time" 13 ) 14 15 func (p TarGzArchiver) Name() string { 16 return filepath.Base(p.File.Path) 17 } 18 19 func CreateTarGzArchive(archive RemoteFileSpec, bundle []RemoteFileSpec, loader *RemoteFileLoader) error { 20 files := []*RemoteFile{} 21 for _, s := range bundle { 22 f, err := loader.Load(s) 23 if err != nil { 24 return fmt.Errorf("failed materializing %s: %v", s.Path, err) 25 } 26 files = append(files, f) 27 } 28 29 localpath := archive.Source.Path 30 dir := filepath.Dir(localpath) 31 if err := os.MkdirAll(dir, 0700); err != nil { 32 return fmt.Errorf("failed creating dir %s: %v", dir, err) 33 } 34 35 file, err := os.Create(localpath) 36 if err != nil { 37 return fmt.Errorf("failed creating %s: %v", localpath, err) 38 } 39 defer file.Close() 40 41 gzipWriter := gzip.NewWriter(file) 42 43 defer gzipWriter.Close() 44 45 tarWriter := tar.NewWriter(gzipWriter) 46 defer tarWriter.Close() 47 48 for i := range bundle { 49 if err := tarWriteFile(tarWriter, bundle[i]); err != nil { 50 return fmt.Errorf("failed writing tar: %v", err) 51 } 52 } 53 54 return nil 55 } 56 57 func tarWriteFile(tarWriter *tar.Writer, file RemoteFileSpec) error { 58 var reader io.Reader 59 var header *tar.Header 60 61 srcpath := file.Source.Path 62 if srcpath != "" { 63 srcfile, err := os.Open(srcpath) 64 if err != nil { 65 return err 66 } 67 defer srcfile.Close() 68 69 stat, err := srcfile.Stat() 70 if err != nil { 71 return err 72 } 73 74 header, err = tar.FileInfoHeader(stat, "") 75 if err != nil { 76 return err 77 } 78 reader = srcfile 79 } else { 80 header = new(tar.Header) 81 header.Size = int64(len(file.Content.bytes)) 82 header.Mode = int64(*file.FileMode()) 83 header.ModTime = time.Now() 84 reader = bytes.NewBuffer(file.Content.bytes) 85 } 86 87 dstpath := file.Path 88 intarpath := strings.TrimPrefix(dstpath, "/") 89 90 fmt.Fprintf(os.Stderr, "archiving %s as %s\n", srcpath, intarpath) 91 92 header.Name = intarpath 93 94 if err := tarWriter.WriteHeader(header); err != nil { 95 return err 96 } 97 98 if _, err := io.Copy(tarWriter, reader); err != nil { 99 return err 100 } 101 return nil 102 }