// readModuleMetadata returns the Forgemodule struct of the given module file path func readModuleMetadata(file string) ForgeModule { content, _ := ioutil.ReadFile(file) before := time.Now() name := gjson.Get(string(content), "name").String() version := gjson.Get(string(content), "version").String() author := gjson.Get(string(content), "author").String() duration := time.Since(before).Seconds() mutex.Lock() metadataJsonParseTime += duration mutex.Unlock() Debugf("Found in file " + file + " name: " + name + " version: " + version + " author: " + author) moduleName := "N/A" if strings.Contains(name, "-") { moduleName = strings.Split(name, "-")[1] } else { Debugf("Error: Something went wrong while decoding file " + file + " searching for the module name (found for name: " + name + "), version and author") } return ForgeModule{name: moduleName, version: version, author: strings.ToLower(author)} }
func queryForgeAPI(name string, file string, fm ForgeModule) ForgeResult { //url := "https://forgeapi.puppetlabs.com:443/v3/modules/" + strings.Replace(name, "/", "-", -1) baseUrl := config.Forge.Baseurl if len(fm.baseUrl) > 0 { baseUrl = fm.baseUrl } //url := baseUrl + "/v3/modules?query=" + name url := baseUrl + "/v3/releases?module=" + name + "&owner=" + fm.author + "&sort_by=release_date&limit=1" req, err := http.NewRequest("GET", url, nil) if err != nil { Fatalf("queryForgeAPI(): Error creating GET request for Puppetlabs forge API" + err.Error()) } if fileInfo, err := os.Stat(file); err == nil { Debugf("adding If-Modified-Since:" + string(fileInfo.ModTime().Format("Mon, 02 Jan 2006 15:04:05 GMT")) + " to Forge query") req.Header.Set("If-Modified-Since", fileInfo.ModTime().Format("Mon, 02 Jan 2006 15:04:05 GMT")) } req.Header.Set("User-Agent", "https://github.com/xorpaul/g10k/") req.Header.Set("Connection", "close") proxyURL, err := http.ProxyFromEnvironment(req) if err != nil { Fatalf("queryForgeAPI(): Error while getting http proxy with golang http.ProxyFromEnvironment()" + err.Error()) } client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)}} before := time.Now() resp, err := client.Do(req) if err != nil { Fatalf("queryForgeAPI(): Error while issuing the HTTP request to " + url + " Error: " + err.Error()) } duration := time.Since(before).Seconds() Verbosef("Querying Forge API " + url + " took " + strconv.FormatFloat(duration, 'f', 5, 64) + "s") mutex.Lock() syncForgeTime += duration mutex.Unlock() defer resp.Body.Close() if resp.Status == "200 OK" { // need to get latest version body, err := ioutil.ReadAll(resp.Body) if err != nil { Fatalf("queryForgeAPI(): Error while reading response body for Forge module " + fm.name + " from " + url + ": " + err.Error()) } before := time.Now() currentRelease := gjson.Get(string(body), "results.0").Map() duration := time.Since(before).Seconds() version := currentRelease["version"].String() modulemd5sum := currentRelease["file_md5"].String() moduleFilesize := currentRelease["file_size"].Int() mutex.Lock() forgeJsonParseTime += duration mutex.Unlock() Debugf("found version " + version + " for " + name + "-latest") latestForgeModules.Lock() latestForgeModules.m[name] = version latestForgeModules.Unlock() lastCheckedFile := config.ForgeCacheDir + name + "-latest-last-checked" Debugf("writing last-checked file " + lastCheckedFile) f, _ := os.Create(lastCheckedFile) defer f.Close() return ForgeResult{true, version, modulemd5sum, moduleFilesize} } else if resp.Status == "304 Not Modified" { Debugf("Got 304 nothing to do for module " + name) return ForgeResult{false, "", "", 0} } else { Debugf("Unexpected response code " + resp.Status) return ForgeResult{false, "", "", 0} } }