github.com/kubernetes-incubator/kube-aws@v0.16.4/provisioner/remote_file_loader.go (about) 1 package provisioner 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "net/http" 8 "os" 9 "path/filepath" 10 11 "github.com/kubernetes-incubator/kube-aws/logger" 12 ) 13 14 type RemoteFileLoader struct { 15 } 16 17 func (loader *RemoteFileLoader) Load(f RemoteFileSpec) (*RemoteFile, error) { 18 loaded := NewRemoteFile(f) 19 logger.Debugf("RemoteFileLoader.Load(): loaded RemoteFile: %+v", loaded) 20 21 path := f.Source.Path 22 23 // TODO 24 cachePath := path 25 26 if path != "" { 27 if f.Type == "credential" { 28 path = path + ".enc" 29 } else { 30 if _, err := os.Stat(path); os.IsNotExist(err) { 31 if f.URL != "" { 32 fmt.Fprintf(os.Stderr, "downloading %s\n", f.URL) 33 err := download(f.URL, cachePath) 34 if err != nil { 35 return nil, fmt.Errorf("failed downloading %s: %v", f.URL, err) 36 } 37 mode := f.FileMode() 38 if mode != nil { 39 if err := os.Chmod(cachePath, *mode); err != nil { 40 return nil, fmt.Errorf("failed to chmod %s: %v", path, err) 41 } 42 } 43 } else if len(f.Content.String()) > 0 { 44 err := ioutil.WriteFile(cachePath, f.Content.bytes, *f.FileMode()) 45 if err != nil { 46 return nil, fmt.Errorf("failed to write %s: %v", cachePath, err) 47 } 48 } else { 49 return nil, fmt.Errorf("%s not found", path) 50 } 51 } 52 } 53 54 data, err := ioutil.ReadFile(path) 55 if err != nil { 56 return nil, fmt.Errorf("failed loading %s: %v", path, err) 57 } 58 59 loaded.Content = NewBinaryContent(data) 60 } else { 61 if f.Template != "" { 62 loaded.Content = NewStringContent(f.Template) 63 } else { 64 loaded.Content = f.Content 65 } 66 } 67 68 logger.Debugf("RemoteFileLoader.String(): returning loaded remoteFile: %+v", loaded) 69 return loaded, nil 70 } 71 72 func download(url string, dest string) error { 73 dir := filepath.Dir(dest) 74 if err := os.MkdirAll(dir, 0700); err != nil { 75 return fmt.Errorf("failed creating dir %s: %v", dir, err) 76 } 77 out, err := os.Create(dest) 78 if err != nil { 79 return err 80 } 81 defer out.Close() 82 83 resp, err := http.Get(url) 84 if err != nil { 85 return err 86 } 87 defer resp.Body.Close() 88 89 _, err = io.Copy(out, resp.Body) 90 if err != nil { 91 return err 92 } 93 94 return nil 95 }