diff --git a/tools/coredump/modulestore/store.go b/tools/coredump/modulestore/store.go index b47dc6f6e..5b7d62dd7 100644 --- a/tools/coredump/modulestore/store.go +++ b/tools/coredump/modulestore/store.go @@ -8,6 +8,8 @@ package modulestore // import "go.opentelemetry.io/ebpf-profiler/tools/coredump/ import ( "context" + "crypto/sha256" + "encoding/base64" "errors" "fmt" "io" @@ -197,16 +199,27 @@ func (store *Store) UploadModule(id ID) error { return fmt.Errorf("failed to open local file: %w", err) } + hasher := sha256.New() + if _, err = io.Copy(hasher, file); err != nil { + return fmt.Errorf("failed to hash content of %q: %v", localPath, err) + } + contentSHA256 := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + moduleKey := makeS3Key(id) contentType := "application/octet-stream" contentDisposition := "attachment" + if _, err = file.Seek(0, io.SeekStart); err != nil { + return fmt.Errorf("failed to set position in file %q: %v", localPath, err) + } + _, err = store.s3client.PutObject(context.TODO(), &s3.PutObjectInput{ Bucket: &store.bucket, Key: &moduleKey, Body: file, ContentType: &contentType, ContentDisposition: &contentDisposition, + ChecksumSHA256: &contentSHA256, }) if err != nil { return fmt.Errorf("failed to upload file: %w", err)