From 9a8e94d9c70109aa1a83d3a649397ead97b03793 Mon Sep 17 00:00:00 2001 From: Ethan Mosbaugh Date: Thu, 25 Jul 2024 12:55:26 -0700 Subject: [PATCH] f --- cmd/buildtools/embed.go | 65 ---------------- pkg/embed/embed.go | 162 ---------------------------------------- pkg/embed/embed_test.go | 79 -------------------- pkg/goods/embed.go | 30 -------- 4 files changed, 336 deletions(-) delete mode 100644 cmd/buildtools/embed.go delete mode 100644 pkg/embed/embed.go delete mode 100644 pkg/embed/embed_test.go delete mode 100644 pkg/goods/embed.go diff --git a/cmd/buildtools/embed.go b/cmd/buildtools/embed.go deleted file mode 100644 index 8ec74824d..000000000 --- a/cmd/buildtools/embed.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "fmt" - "os" - - "github.com/replicatedhq/embedded-cluster/pkg/embed" - "github.com/urfave/cli/v2" -) - -var embedCommand = &cli.Command{ - Name: "embed", - Usage: "Embeds data in the binary", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "binary-path", - Usage: "Path to the binary", - }, - &cli.StringFlag{ - Name: "binary-destination-path", - Usage: "Path to write the binary with embedded data", - }, - &cli.StringFlag{ - Name: "embed-path", - Usage: "Path to the file to embed", - }, - &cli.StringFlag{ - Name: "embed-delimiter", - Usage: "Delimiter to use for embedding", - }, - }, - Action: func(c *cli.Context) error { - binaryPath := c.String("binary-path") - if binaryPath == "" { - return fmt.Errorf("binary-path is required") - } - - binaryDestinationPath := c.String("binary-destination-path") - if binaryDestinationPath == "" { - return fmt.Errorf("binary-destination-path is required") - } - - embedPath := c.String("embed-path") - if embedPath == "" { - return fmt.Errorf("embed-path is required") - } - - embedDelimiter := c.String("embed-delimiter") - if embedDelimiter == "" { - return fmt.Errorf("embed-delimiter is required") - } - - err := embed.EmbedInBinary(embedPath, embedDelimiter, binaryPath, binaryDestinationPath) - if err != nil { - return fmt.Errorf("fail to embed data in the binary: %w", err) - } - err = os.Chmod(binaryDestinationPath, 0755) - if err != nil { - return fmt.Errorf("fail to change permissions on the binary: %w", err) - } - - fmt.Printf("Output binary with embedded data written to %s\n", binaryDestinationPath) - return nil - }, -} diff --git a/pkg/embed/embed.go b/pkg/embed/embed.go deleted file mode 100644 index fccb55480..000000000 --- a/pkg/embed/embed.go +++ /dev/null @@ -1,162 +0,0 @@ -package embed - -import ( - "bytes" - "encoding/base64" - "errors" - "fmt" - "io" - "os" - "strings" -) - -const ( - ReleaseDelimiter = "APP RELEASE" - ReleaseMetadataDelimiter = "RELEASE METADATA" - - beginDelimiterTemplate = "-----BEGIN %s-----" - endDelimiterTemplate = "-----END %s-----" -) - -var ( - ErrEmbeddedDataNotFound = errors.New("embedded data not found") -) - -// EmbedReleaseDataInBinary embeds the app release data in the binary at the end of the file and -// writes the new binary to the output path. -func EmbedReleaseDataInBinary(binPath string, embedPath string, outputPath string) error { - return EmbedInBinary(embedPath, ReleaseDelimiter, binPath, outputPath) -} - -// EmbedReleaseDataInBinaryReader embeds the app release data in the binary at the end of the -// binary reader, and returns a new binary reader with the embedded app release data and the new -// binary size. -func EmbedReleaseDataInBinaryReader(binReader io.Reader, binSize int64, releaseData []byte) (io.Reader, int64) { - return EmbedDataInBinaryReader(ReleaseDelimiter, releaseData, binReader, binSize) -} - -// ExtractReleaseDataFromBinary extracts the app release data from the binary. -func ExtractReleaseDataFromBinary(binPath string) ([]byte, error) { - return ExtractDataFromBinary(ReleaseDelimiter, binPath) -} - -// EmbedReleaseMetadataInBinary embeds the app release metadata in the binary at the end of the -// file and writes the new binary to the output path. -func EmbedReleaseMetadataInBinary(binPath string, embedPath string, outputPath string) error { - return EmbedInBinary(embedPath, ReleaseMetadataDelimiter, binPath, outputPath) -} - -// EmbedReleaseMetadataInBinaryReader embeds the release metadata in the binary at the end of the -// binary reader, and returns a new binary reader with the embedded release metadata and the new -// binary size. -func EmbedReleaseMetadataInBinaryReader(binReader io.Reader, binSize int64, data []byte) (io.Reader, int64) { - return EmbedDataInBinaryReader(ReleaseMetadataDelimiter, data, binReader, binSize) -} - -// ExtractReleaseMetadataFromBinary extracts the release metadata from the binary. -func ExtractReleaseMetadataFromBinary(binPath string) ([]byte, error) { - return ExtractDataFromBinary(ReleaseMetadataDelimiter, binPath) -} - -// EmbedInBinary embeds the data in the binary at the end of the file and writes the new binary to -// the output path. -func EmbedInBinary(embedPath string, delim string, binPath string, outputPath string) error { - binContent, err := os.ReadFile(binPath) - if err != nil { - return fmt.Errorf("failed to read binary: %w", err) - } - - start := bytes.Index(binContent, beginDelimiterBytes(delim)) - end := bytes.Index(binContent, endDelimiterBytes(delim)) - - if start != -1 && end != -1 { - // data is already embedded in the binary, remove it - binContent = append(binContent[:start], binContent[end+len(endDelimiterBytes(delim)):]...) - } - - binReader := bytes.NewReader(binContent) - binSize := int64(len(binContent)) - - data, err := os.ReadFile(embedPath) - if err != nil { - return fmt.Errorf("failed to read data: %w", err) - } - - newBinReader, totalLen := EmbedDataInBinaryReader(delim, data, binReader, binSize) - newBinContent, err := io.ReadAll(newBinReader) - if err != nil { - return fmt.Errorf("failed to read new binary: %w", err) - } - if totalLen != int64(len(newBinContent)) { - return fmt.Errorf("failed to read new binary: expected %d bytes, got %d", totalLen, len(newBinContent)) - } - - if err := os.WriteFile(outputPath, newBinContent, 0644); err != nil { - return fmt.Errorf("failed to write output: %w", err) - } - - return nil -} - -// EmbedDataInBinaryReader embeds the data in the binary at the end of the binary reader, and -// returns a new binary reader with the embedded data and the new binary size. -func EmbedDataInBinaryReader(delim string, data []byte, binReader io.Reader, binSize int64) (io.Reader, int64) { - encoded := base64.StdEncoding.EncodeToString(data) - - newBinSize := binSize - newBinSize += int64(len(beginDelimiterBytes(delim))) - newBinSize += int64(len(encoded)) - newBinSize += int64(len(endDelimiterBytes(delim))) - - newBinReader := io.MultiReader( - binReader, - bytes.NewReader(beginDelimiterBytes(delim)), - strings.NewReader(encoded), - bytes.NewReader(endDelimiterBytes(delim)), - ) - - return newBinReader, newBinSize -} - -// ExtractDataFromBinary extracts the data from the binary. -func ExtractDataFromBinary(delim string, binPath string) ([]byte, error) { - binContent, err := os.ReadFile(binPath) - if err != nil { - return nil, fmt.Errorf("failed to read binary: %w", err) - } - - start := bytes.Index(binContent, beginDelimiterBytes(delim)) - if start == -1 { - return nil, ErrEmbeddedDataNotFound - } - - end := bytes.Index(binContent, endDelimiterBytes(delim)) - if end == -1 { - return nil, ErrEmbeddedDataNotFound - } - - if start+len(beginDelimiterBytes(delim)) > len(binContent) { - return nil, fmt.Errorf("invalid start delimiter") - } else if start+len(beginDelimiterBytes(delim)) > end { - return nil, fmt.Errorf("start delimter after end delimter") - } else if end > len(binContent) { - return nil, fmt.Errorf("invalid end delimiter") - } - - encoded := binContent[start+len(beginDelimiterBytes(delim)) : end] - - decoded, err := base64.StdEncoding.DecodeString(string(encoded)) - if err != nil { - return nil, fmt.Errorf("failed to decode data: %w", err) - } - - return decoded, nil -} - -func beginDelimiterBytes(delim string) []byte { - return []byte(fmt.Sprintf(beginDelimiterTemplate, delim)) -} - -func endDelimiterBytes(delim string) []byte { - return []byte(fmt.Sprintf(endDelimiterTemplate, delim)) -} diff --git a/pkg/embed/embed_test.go b/pkg/embed/embed_test.go deleted file mode 100644 index 545bad68c..000000000 --- a/pkg/embed/embed_test.go +++ /dev/null @@ -1,79 +0,0 @@ -package embed - -import ( - "encoding/base64" - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestEmbedReleaseDataInBinary(t *testing.T) { - // Create temporary files for testing - binFile, err := os.CreateTemp("", "test-bin") - assert.NoError(t, err) - defer os.Remove(binFile.Name()) - - releaseFile, err := os.CreateTemp("", "test-release") - assert.NoError(t, err) - defer os.Remove(releaseFile.Name()) - - outputFile, err := os.CreateTemp("", "test-output") - assert.NoError(t, err) - defer os.Remove(outputFile.Name()) - - // Write test data to the files - binContent := []byte("test binary content") - _, err = binFile.Write(binContent) - assert.NoError(t, err) - - releaseData := []byte("test release data") - _, err = releaseFile.Write(releaseData) - assert.NoError(t, err) - - err = EmbedReleaseDataInBinary(binFile.Name(), releaseFile.Name(), outputFile.Name()) - assert.NoError(t, err) - - // Encode the release data for comparison - encodedRelease := base64.StdEncoding.EncodeToString(releaseData) - - // Verify the new binary content - gotBinContent, err := os.ReadFile(outputFile.Name()) - assert.NoError(t, err) - - wantBinContent := append(binContent, beginDelimiterBytes(ReleaseDelimiter)...) - wantBinContent = append(wantBinContent, []byte(encodedRelease)...) - wantBinContent = append(wantBinContent, endDelimiterBytes(ReleaseDelimiter)...) - - assert.Equal(t, string(wantBinContent), string(gotBinContent)) - - // Verify the new binary size - gotBinSize := int64(len(gotBinContent)) - wantBinSize := int64(len(binContent)) + int64(len(beginDelimiterBytes(ReleaseDelimiter))) + int64(len(encodedRelease)) + int64(len(endDelimiterBytes(ReleaseDelimiter))) - assert.Equal(t, wantBinSize, gotBinSize) - - // Extract and verify the embedded release data - embeddedData, err := ExtractReleaseDataFromBinary(outputFile.Name()) - assert.NoError(t, err) - - assert.Equal(t, string(releaseData), string(embeddedData)) -} - -func TestNoReleaseData(t *testing.T) { - // Create temporary files for testing - binFile, err := os.CreateTemp("", "test-bin") - assert.NoError(t, err) - defer os.Remove(binFile.Name()) - - // Verify that no error is returned when the binary does not contain release data - _, err = ExtractReleaseDataFromBinary(binFile.Name()) - assert.Equal(t, ErrEmbeddedDataNotFound, err) -} - -func Test_beginReleaseDelimiterBytes(t *testing.T) { - assert.Equalf(t, []byte("-----BEGIN APP RELEASE-----"), beginDelimiterBytes(ReleaseDelimiter), "beginReleaseDelimiterBytes()") -} - -func Test_endReleaseDelimiterBytes(t *testing.T) { - assert.Equalf(t, []byte("-----END APP RELEASE-----"), endDelimiterBytes(ReleaseDelimiter), "beginReleaseDelimiterBytes()") -} diff --git a/pkg/goods/embed.go b/pkg/goods/embed.go deleted file mode 100644 index bb315e09f..000000000 --- a/pkg/goods/embed.go +++ /dev/null @@ -1,30 +0,0 @@ -package goods - -import ( - "encoding/json" - "fmt" - "os" - - "github.com/replicatedhq/embedded-cluster-kinds/types" - "github.com/replicatedhq/embedded-cluster/pkg/embed" -) - -func ExtractReleaseMetadataFromSelf() (*types.ReleaseMetadata, error) { - exe, err := os.Executable() - if err != nil { - return nil, fmt.Errorf("get executable path: %w", err) - } - - b, err := embed.ExtractReleaseMetadataFromBinary(exe) - if err != nil { - return nil, fmt.Errorf("extract release metadata from binary: %w", err) - } - - var metadata types.ReleaseMetadata - err = json.Unmarshal(b, &metadata) - if err != nil { - return nil, fmt.Errorf("unmarshal release metadata: %w", err) - } - - return &metadata, nil -}