func fetchFile(n string) (ret []byte, err error) { defer func() { if e := recover(); e != nil { err = fmt.Errorf("fetchFile() -> %v", e) } }() murl := APIURL + "manifest/fetch/" logInfo("fetching file from %v", murl) mparam := mig.ManifestParameters{} mparam.AgentIdentifier = ctx.AgentIdentifier mparam.Object = n buf, err := json.Marshal(mparam) if err != nil { panic(err) } mstring := string(buf) data := url.Values{"parameters": {mstring}} r, err := http.NewRequest("POST", murl, strings.NewReader(data.Encode())) if err != nil { panic(err) } r.Header.Set("Content-Type", "application/x-www-form-urlencoded") r.Header.Add("X-LOADERKEY", ctx.LoaderKey) client := http.Client{} resp, err := client.Do(r) if err != nil { panic(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } var resource *cljs.Resource err = json.Unmarshal(body, &resource) if err != nil { panic(err) } // Extract fetch response. fetchresp, err := valueToFetchResponse(resource.Collection.Items[0].Data[0].Value) if err != nil { panic(err) } // Decompress the returned file and return it as a byte slice. b := bytes.NewBuffer(fetchresp.Data) gz, err := gzip.NewReader(b) if err != nil { panic(err) } ret, err = ioutil.ReadAll(gz) if err != nil { panic(err) } return }
func requestManifest() (err error) { defer func() { if e := recover(); e != nil { err = fmt.Errorf("requestManifest() -> %v", e) } }() murl := APIURL + "manifest/agent/" logInfo("requesting manifest from %v", murl) mparam := mig.ManifestParameters{} mparam.AgentIdentifier = ctx.AgentIdentifier buf, err := json.Marshal(mparam) if err != nil { panic(err) } mstring := string(buf) data := url.Values{"parameters": {mstring}} r, err := http.NewRequest("POST", murl, strings.NewReader(data.Encode())) if err != nil { panic(err) } r.Header.Set("Content-Type", "application/x-www-form-urlencoded") r.Header.Add("X-LOADERKEY", ctx.LoaderKey) client := http.Client{} resp, err := client.Do(r) if err != nil { panic(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } var resource *cljs.Resource err = json.Unmarshal(body, &resource) if err != nil { panic(err) } if resp.StatusCode != http.StatusOK { err = fmt.Errorf("HTTP %v, API call failed with error '%v' (code %s)", resp.StatusCode, resource.Collection.Error.Message, resource.Collection.Error.Code) panic(err) } // Extract our manifest from the response. manifest, err := valueToManifest(resource.Collection.Items[0].Data[0].Value) if err != nil { panic(err) } apiManifest = &manifest err = apiManifest.Validate() if err != nil { panic(err) } return checkManifestSignature(apiManifest) }