constellation/image/upload/internal/cmd/measurementsenvelope.go
miampf f16ccf5679
rewrote packages
keyservice
joinservice
upgrade-agent
measurement-reader
debugd
disk-mapper

rewrote joinservice main

rewrote some unit tests

rewrote upgrade-agent + some grpc functions

rewrote measurement-reader

rewrote debugd

removed unused import

removed forgotten zap reference in measurements reader

rewrote disk-mapper + tests

rewrote packages

verify
disk-mapper
malicious join
bootstrapper
attestationconfigapi
versionapi
internal/cloud/azure
disk-mapper tests
image/upload/internal/cmd

rewrote verify (WIP with loglevel increase)

rewrote forgotten zap references in disk-mapper

rewrote malicious join

rewrote bootstrapper

rewrote parts of internal/

rewrote attestationconfigapi (WIP)

rewrote versionapi cli

rewrote internal/cloud/azure

rewrote disk-mapper tests (untested by me rn)

rewrote image/upload/internal/cmd

removed forgotten zap references in verify/cmd

rewrote packages

hack/oci-pin
hack/qemu-metadata-api
debugd/internal/debugd/deploy
hack/bazel-deps-mirror
cli/internal/cmd
cli-k8s-compatibility

rewrote hack/qemu-metadata-api/server

rewrote debugd/internal/debugd/deploy

rewrote hack/bazel-deps-mirror

rewrote rest of hack/qemu-metadata-api

rewrote forgotten zap references in joinservice server

rewrote cli/internal/cmd

rewrote cli-k8s-compatibility

rewrote packages

internal/staticupload
e2d/internal/upgrade
internal/constellation/helm
internal/attestation/aws/snp
internal/attestation/azure/trustedlaunch
joinservice/internal/certcache/amkds

some missed unit tests

rewrote e2e/internal/upgrade

rewrote internal/constellation/helm

internal/attestation/aws/snp

internal/attestation/azure/trustedlaunch

joinservice/internal/certcache/amkds

search and replace test logging over all left *_test.go
2024-02-08 13:14:14 +01:00

106 lines
3 KiB
Go

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
package cmd
import (
"encoding/json"
"fmt"
"log/slog"
"os"
"github.com/edgelesssys/constellation/v2/internal/attestation/measurements"
"github.com/spf13/cobra"
)
// newMeasurementsEnvelopeCmd creates a new envelope command.
func newMeasurementsEnvelopeCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "envelope",
Short: "Envelope OS image measurements",
Long: "Envelope OS image measurements for one variant to follow the measurements v2 format.",
Args: cobra.ExactArgs(0),
RunE: runEnvelopeMeasurements,
}
cmd.SetOut(os.Stdout)
cmd.Flags().String("version", "", "Shortname of the os image version.")
cmd.Flags().String("csp", "", "CSP of this image measurement.")
cmd.Flags().String("attestation-variant", "", "Attestation variant of the image measurements.")
cmd.Flags().String("in", "", "Path to read the raw measurements from.")
cmd.Flags().String("out", "", "Optional path to write the enveloped result to. If not set, the result is written to stdout.")
cmd.Flags().Bool("verbose", false, "Enable verbose output")
must(cmd.MarkFlagRequired("version"))
must(cmd.MarkFlagRequired("csp"))
must(cmd.MarkFlagRequired("attestation-variant"))
must(cmd.MarkFlagRequired("in"))
return cmd
}
func runEnvelopeMeasurements(cmd *cobra.Command, _ []string) error {
workdir := os.Getenv("BUILD_WORKING_DIRECTORY")
if len(workdir) > 0 {
must(os.Chdir(workdir))
}
flags, err := parseEnvelopeMeasurementsFlags(cmd)
if err != nil {
return err
}
log := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: flags.logLevel}))
log.Debug("Parsed flags: %+v", flags)
f, err := os.Open(flags.in)
if err != nil {
return fmt.Errorf("enveloping measurements: opening input file: %w", err)
}
defer f.Close()
var measuremnt rawMeasurements
if err := json.NewDecoder(f).Decode(&measuremnt); err != nil {
return fmt.Errorf("enveloping measurements: reading input file: %w", err)
}
measuremnt.Measurements, err = measurements.ApplyOverrides(measuremnt.Measurements, flags.csp, flags.attestationVariant)
if err != nil {
return fmt.Errorf("enveloping measurements: overriding static measurements: %w", err)
}
enveloped := measurements.ImageMeasurementsV2{
Ref: flags.version.Ref(),
Stream: flags.version.Stream(),
Version: flags.version.Version(),
List: []measurements.ImageMeasurementsV2Entry{
{
CSP: flags.csp,
AttestationVariant: flags.attestationVariant,
Measurements: measuremnt.Measurements,
},
},
}
out := cmd.OutOrStdout()
if len(flags.out) > 0 {
outF, err := os.Create(flags.out)
if err != nil {
return fmt.Errorf("enveloping measurements: opening output file: %w", err)
}
defer outF.Close()
out = outF
}
if err := json.NewEncoder(out).Encode(enveloped); err != nil {
return fmt.Errorf("enveloping measurements: writing output file: %w", err)
}
log.Info("Enveloped image measurements")
return nil
}
type rawMeasurements struct {
Measurements measurements.M `json:"measurements"`
}