func machineID() (string, error) { if fileutil.Exists(systemDMachineIDPath) { return fileutil.ReadAllText(systemDMachineIDPath) } else if fileutil.Exists(upstartMachineIDPath) { return fileutil.ReadAllText(upstartMachineIDPath) } else { return "", fmt.Errorf("unable to fetch machine-id") } }
// s3Download attempts to download a file via the aws sdk. func s3Download(log log.T, amazonS3URL s3util.AmazonS3URL, destFile string) (output DownloadOutput, err error) { log.Debugf("attempting to download as s3 download %v", destFile) eTagFile := destFile + ".etag" config := &aws.Config{} var appConfig appconfig.SsmagentConfig appConfig, err = appconfig.Config(false) if err != nil { log.Error("failed to read appconfig.") } else { creds, err1 := appConfig.ProfileCredentials() if err1 != nil { config.Credentials = creds } } config.S3ForcePathStyle = aws.Bool(amazonS3URL.IsPathStyle) config.Region = aws.String(amazonS3URL.Region) params := &s3.GetObjectInput{ Bucket: aws.String(amazonS3URL.Bucket), Key: aws.String(amazonS3URL.Key), } if fileutil.Exists(destFile) == true && fileutil.Exists(eTagFile) == true { var existingETag string existingETag, err = fileutil.ReadAllText(eTagFile) if err != nil { log.Debugf("failed to read etag file %v, %v", eTagFile, err) return } params.IfNoneMatch = aws.String(existingETag) } s3client := s3.New(session.New(config)) req, resp := s3client.GetObjectRequest(params) err = req.Send() if err != nil { if req.HTTPResponse == nil || req.HTTPResponse.StatusCode != http.StatusNotModified { log.Debug("failed to download from s3, ", err) fileutil.DeleteFile(destFile) fileutil.DeleteFile(eTagFile) return } log.Debugf("Unchanged file.") output.IsUpdated = false output.LocalFilePath = destFile return output, nil } if *resp.ETag != "" { log.Debug("files etag is ", *resp.ETag) err = fileutil.WriteAllText(eTagFile, *resp.ETag) if err != nil { log.Errorf("failed to write eTagfile %v, %v ", eTagFile, err) return } } defer resp.Body.Close() _, err = FileCopy(log, destFile, resp.Body) if err == nil { output.LocalFilePath = destFile output.IsUpdated = true } else { log.Errorf("failed to write destFile %v, %v ", destFile, err) } return }
// httpDownload attempts to download a file via http/s call func httpDownload(log log.T, fileURL string, destFile string) (output DownloadOutput, err error) { log.Debugf("attempting to download as http/https download %v", destFile) eTagFile := destFile + ".etag" var check http.Client var request *http.Request request, err = http.NewRequest("GET", fileURL, nil) if err != nil { return } if fileutil.Exists(destFile) == true && fileutil.Exists(eTagFile) == true { var existingETag string existingETag, err = fileutil.ReadAllText(eTagFile) request.Header.Add("If-None-Match", existingETag) } check = http.Client{ CheckRedirect: func(r *http.Request, via []*http.Request) error { r.URL.Opaque = r.URL.Path return nil }, } var resp *http.Response resp, err = check.Do(request) if err != nil { log.Debug("failed to download from http/https, ", err) fileutil.DeleteFile(destFile) fileutil.DeleteFile(eTagFile) return } if resp.StatusCode == http.StatusNotModified { log.Debugf("Unchanged file.") output.IsUpdated = false output.LocalFilePath = destFile return output, nil } else if resp.StatusCode != http.StatusOK { log.Debug("failed to download from http/https, ", err) fileutil.DeleteFile(destFile) fileutil.DeleteFile(eTagFile) err = fmt.Errorf("http request failed. status:%v statuscode:%v", resp.Status, resp.StatusCode) return } defer resp.Body.Close() eTagValue := resp.Header.Get("Etag") if eTagValue != "" { log.Debug("file eTagValue is ", eTagValue) err = fileutil.WriteAllText(eTagFile, eTagValue) if err != nil { log.Errorf("failed to write eTagfile %v, %v ", eTagFile, err) return } } _, err = FileCopy(log, destFile, resp.Body) if err == nil { output.LocalFilePath = destFile output.IsUpdated = true } else { log.Errorf("failed to write destFile %v, %v ", destFile, err) } return }
func getPlatformDetails(log log.T) (name string, version string, err error) { log.Debugf(gettingPlatformDetailsMessage) contents := "" var contentsBytes []byte name = notAvailableMessage version = notAvailableMessage if fileutil.Exists(systemReleaseCommand) { log.Debugf(fetchingDetailsMessage, systemReleaseCommand) contents, err = fileutil.ReadAllText(systemReleaseCommand) log.Debugf(commandOutputMessage, contents) if err != nil { log.Debugf(errorOccurredMessage, systemReleaseCommand, err) return } if strings.Contains(contents, "Amazon") { data := strings.Split(contents, "release") name = strings.TrimSpace(data[0]) version = strings.TrimSpace(data[1]) } else if strings.Contains(contents, "Red Hat") { data := strings.Split(contents, "release") name = strings.TrimSpace(data[0]) version = strings.TrimSpace(data[1]) } else if strings.Contains(contents, "CentOS") { data := strings.Split(contents, "release") name = strings.TrimSpace(data[0]) version = strings.TrimSpace(data[1]) } } else if fileutil.Exists(redhatReleaseCommand) { log.Debugf(fetchingDetailsMessage, redhatReleaseCommand) contents, err = fileutil.ReadAllText(redhatReleaseCommand) log.Debugf(commandOutputMessage, contents) if err != nil { log.Debugf(errorOccurredMessage, redhatReleaseCommand, err) return } if strings.Contains(contents, "Red Hat") { data := strings.Split(contents, "release") name = strings.TrimSpace(data[0]) versionData := strings.Split(data[1], "(") version = strings.TrimSpace(versionData[0]) } } else { log.Debugf(fetchingDetailsMessage, lsbReleaseCommand) // platform name if contentsBytes, err = exec.Command(lsbReleaseCommand, "-i").Output(); err != nil { log.Debugf(fetchingDetailsMessage, lsbReleaseCommand, err) return } name = strings.TrimSpace(string(contentsBytes)) log.Debugf(commandOutputMessage, name) name = strings.TrimSpace(string(contentsBytes)) name = strings.TrimLeft(name, "Distributor ID:") name = strings.TrimSpace(name) log.Debugf("platform name %v", name) // platform version if contentsBytes, err = exec.Command(lsbReleaseCommand, "-r").Output(); err != nil { log.Debugf(errorOccurredMessage, lsbReleaseCommand, err) return } version = strings.TrimSpace(string(contentsBytes)) log.Debugf(commandOutputMessage, version) version = strings.TrimLeft(version, "Release:") version = strings.TrimSpace(version) log.Debugf("platform version %v", version) } return }