diff --git a/cmd/control/install.go b/cmd/control/install.go index dddb4f3a..9fe2755e 100755 --- a/cmd/control/install.go +++ b/cmd/control/install.go @@ -158,8 +158,14 @@ func installAction(c *cli.Context) error { } else { os.MkdirAll("/opt", 0755) uc := "/opt/user_config.yml" - if err := util.FileCopy(cloudConfig, uc); err != nil { - log.WithFields(log.Fields{"cloudConfig": cloudConfig, "error": err}).Fatal("Failed to copy cloud-config") + if strings.HasPrefix(cloudConfig, "http://") || strings.HasPrefix(cloudConfig, "https://") { + if err := util.HTTPDownloadToFile(cloudConfig, uc); err != nil { + log.WithFields(log.Fields{"cloudConfig": cloudConfig, "error": err}).Fatal("Failed to http get cloud-config") + } + } else { + if err := util.FileCopy(cloudConfig, uc); err != nil { + log.WithFields(log.Fields{"cloudConfig": cloudConfig, "error": err}).Fatal("Failed to copy cloud-config") + } } cloudConfig = uc } diff --git a/util/util.go b/util/util.go index 654ebd67..96cc34e7 100644 --- a/util/util.go +++ b/util/util.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "io/ioutil" + "net/http" "os" "os/exec" "path" @@ -45,6 +46,19 @@ func FileCopy(src, dest string) error { return WriteFileAtomic(dest, data, 0666) } +func HTTPDownloadToFile(url, dest string) error { + res, err := http.Get(url) + if err != nil { + return err + } + defer res.Body.Close() + body, err := ioutil.ReadAll(res.Body) + if err != nil { + return err + } + return WriteFileAtomic(dest, body, 0666) +} + func WriteFileAtomic(filename string, data []byte, perm os.FileMode) error { dir, file := path.Split(filename) tempFile, err := ioutil.TempFile(dir, fmt.Sprintf(".%s", file))