func (t *CloudInitTarget) fetch(p *fi.Source, destPath string) { // We could probably move this to fi.Source - it is likely to be the same for every provider if p.URL != "" { if p.Parent != nil { glog.Fatalf("unexpected parent with SourceURL in FetchInstructions: %v", p) } t.AddDownloadCommand(Once, p.URL, destPath) } else if p.ExtractFromArchive != "" { if p.Parent == nil { glog.Fatalf("unexpected ExtractFromArchive without parent in FetchInstructions: %v", p) } // TODO: Remove duplicate commands? archivePath := "/tmp/" + utils.SanitizeString(p.Parent.Key()) t.fetch(p.Parent, archivePath) extractDir := "/tmp/extracted_" + utils.SanitizeString(p.Parent.Key()) t.AddMkdirpCommand(extractDir, 0755) t.AddCommand(Once, "tar", "zxf", archivePath, "-C", extractDir) // Always because this shouldn't happen and we want an indication that it happened t.AddCommand(Always, "cp", path.Join(extractDir, p.ExtractFromArchive), destPath) } else { glog.Fatalf("unknown FetchInstructions: %v", p) } }
func (a *AssetStore) addURL(url string, hash *hashing.Hash) error { var err error if hash == nil { hash, err = hashFromHttpHeader(url) if err != nil { return err } } localFile := path.Join(a.assetDir, hash.String()+"_"+utils.SanitizeString(url)) _, err = DownloadURL(url, localFile, hash) if err != nil { return err } key := path.Base(url) assetPath := url r := NewFileResource(localFile) source := &Source{URL: url, Hash: hash} asset := &asset{ Key: key, AssetPath: assetPath, resource: r, source: source, } glog.V(2).Infof("added asset %q for %q", asset.Key, asset.resource) a.assets = append(a.assets, asset) if strings.HasSuffix(assetPath, ".tar.gz") { err = a.addArchive(source, localFile) if err != nil { return err } } return nil }