diff --git a/data/distrodefs/fedora/imagetypes.yaml b/data/distrodefs/fedora/imagetypes.yaml index e14ca52682..2e7eb43040 100644 --- a/data/distrodefs/fedora/imagetypes.yaml +++ b/data/distrodefs/fedora/imagetypes.yaml @@ -1052,6 +1052,7 @@ - "customizations.disk" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" @@ -1139,6 +1140,7 @@ - "customizations.files" - "customizations.fips" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -2182,9 +2184,11 @@ image_types: - "containers" - "customizations.installer" - "customizations.cacerts" + - "customizations.firstboot" - "customizations.directories" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" diff --git a/data/distrodefs/rhel-10/imagetypes.yaml b/data/distrodefs/rhel-10/imagetypes.yaml index 7fcfe947f4..326e2f06a7 100644 --- a/data/distrodefs/rhel-10/imagetypes.yaml +++ b/data/distrodefs/rhel-10/imagetypes.yaml @@ -804,6 +804,7 @@ - "customizations.dnf" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" @@ -835,6 +836,7 @@ - "customizations.files" - "customizations.fips" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -856,9 +858,11 @@ - "groups" - "enabled_modules" - "containers" + - "customizations.cacerts" - "customizations.directories" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -1311,6 +1315,7 @@ image_types: - "customizations.dnf" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -1832,10 +1837,12 @@ image_types: - "groups" - "enabled_modules" - "containers" + - "customizations.cacerts" - "customizations.dnf" - "customizations.directories" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -2015,6 +2022,7 @@ image_types: - "customizations.directories" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -2282,6 +2290,7 @@ image_types: - "customizations.dnf" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" diff --git a/data/distrodefs/rhel-7/imagetypes.yaml b/data/distrodefs/rhel-7/imagetypes.yaml index 59f07c4972..45315d94a6 100644 --- a/data/distrodefs/rhel-7/imagetypes.yaml +++ b/data/distrodefs/rhel-7/imagetypes.yaml @@ -221,6 +221,7 @@ - "customizations.disk" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" diff --git a/data/distrodefs/rhel-8/imagetypes.yaml b/data/distrodefs/rhel-8/imagetypes.yaml index 41738b4988..afb1da7f52 100644 --- a/data/distrodefs/rhel-8/imagetypes.yaml +++ b/data/distrodefs/rhel-8/imagetypes.yaml @@ -1262,6 +1262,7 @@ - "customizations.dnf" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" @@ -1287,11 +1288,13 @@ - "groups" - "enabled_modules" - "containers" + - "customizations.cacerts" - "customizations.dnf" - "customizations.directories" - "customizations.files" - "customizations.fips" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -1306,11 +1309,13 @@ # options supported by ostree disk (deployment) image types supported_options_ostree_disk: &supported_options_ostree_disk - "distro" + - "customizations.cacerts" - "customizations.files" - "customizations.directories" - "customizations.disk" - "customizations.dnf" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.user" diff --git a/data/distrodefs/rhel-9/imagetypes.yaml b/data/distrodefs/rhel-9/imagetypes.yaml index c526aef84b..23db2caf28 100644 --- a/data/distrodefs/rhel-9/imagetypes.yaml +++ b/data/distrodefs/rhel-9/imagetypes.yaml @@ -1230,6 +1230,7 @@ - "customizations.dnf" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" @@ -1255,11 +1256,13 @@ - "groups" - "enabled_modules" - "containers" + - "customizations.cacerts" - "customizations.dnf" - "customizations.directories" - "customizations.files" - "customizations.fips" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -1274,11 +1277,13 @@ # options supported by ostree disk (deployment) image types supported_options_ostree_disk: &supported_options_ostree_disk - "distro" + - "customizations.cacerts" - "customizations.files" - "customizations.directories" - "customizations.disk" - "customizations.dnf" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.user" @@ -1302,6 +1307,7 @@ - "customizations.files" - "customizations.fips" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -1323,9 +1329,11 @@ - "groups" - "enabled_modules" - "containers" + - "customizations.cacerts" - "customizations.directories" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -3151,9 +3159,11 @@ image_types: blueprint: supported_options: - "distro" + - "customizations.cacerts" - "customizations.dnf" - "customizations.installation_device" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.disk" - "customizations.fdo" - "customizations.ignition" @@ -3343,6 +3353,7 @@ image_types: - "customizations.dnf" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" diff --git a/pkg/customizations/firstboot/firstboot.go b/pkg/customizations/firstboot/firstboot.go new file mode 100644 index 0000000000..9f65f3be4c --- /dev/null +++ b/pkg/customizations/firstboot/firstboot.go @@ -0,0 +1,179 @@ +package firstboot + +import ( + "errors" + "fmt" + "path/filepath" + "regexp" + "slices" + + "github.com/osbuild/blueprint/pkg/blueprint" + "github.com/osbuild/images/pkg/shutil" +) + +type FirstbootOptions struct { + Scripts []Script +} + +type Script struct { + Filename string + Contents string + IgnoreFailure bool + Certs []string +} + +// FirstbootCommonOptions contains common fields for all firstboot options. +type FirstbootCommonOptions struct { + // Optional firstboot name. Must be unique within the blueprint and only + // alphanumeric characters with dashes and underscores are allowed. + Name string + + // Ignore errors when executing the firstboot script and continue with + // execution of the following firstboot scripts, if any. By default, + // firstboot scripts are executed in order and if one of them fails, the + // execution stops immediately. + IgnoreFailure bool +} + +// CustomFirstbootOptions contains fields specific to custom firstboot +// options. +type CustomFirstbootOptions struct { + FirstbootCommonOptions + + // Strings without shebang will be interpreted as shell scripts, otherwise + // the script will be executed using the shebang interpreter. Required if + // type is set to "custom". + Contents string +} + +// SatelliteFirstbootOptions contains fields specific to satellite firstboot +// options. +type SatelliteFirstbootOptions struct { + FirstbootCommonOptions + + // Optional CA certificate to enroll into the system before executing the + // firstboot script. + CACerts []string + + // Registration command as generated by the Satellite server. Required, if + // type is set to "satellite". + Command string +} + +// AAPFirstbootOptions contains fields specific to AAP firstboot options. +type AAPFirstbootOptions struct { + FirstbootCommonOptions + + // Optional CA certificate to enroll into the system before executing the + // firstboot script. + CACerts []string + + // Job template URL as generated by the AAP server. Required if type is set + // to "aap". Example URLs are + // https://aap.example.com/api/controller/v2/job_templates/9/callback/ or + // https://aap.example.com/api/v2/job_templates/9/callback/ depending on the + // AAP version. + JobTemplateURL string + + // The host config key. Required if type is set to "aap". + HostConfigKey string +} + +// FirstbootOption is a union of all supported firstboot options. +type FirstbootOption interface { + isFirstbootOption() +} + +func (CustomFirstbootOptions) isFirstbootOption() {} +func (SatelliteFirstbootOptions) isFirstbootOption() {} +func (AAPFirstbootOptions) isFirstbootOption() {} + +var ErrFirstbootAlreadySet = errors.New("firstboot customization already set") + +var reservedRegexp = regexp.MustCompile(`^(custom|satellite|aap)-\d+$`) + +// FirstbootOptionsFromBP converts a blueprint FirstbootCustomization to +// FirstbootOptions. Validation is done in the blueprint package, so this function +// assumes the input is valid, however, JSON unmarshalling errors are possible. +func FirstbootOptionsFromBP(bpFirstboot blueprint.FirstbootCustomization) (*FirstbootOptions, error) { + fo := &FirstbootOptions{} + var satDone, aapDone bool + var ci int + var alreadyUsed []string + + nameFunc := func(inputName, prefix string) string { + // Use number-based name if name was not provided, is a path, the output + // name would collide, or matches reserved pattern. + outputName := "" + if inputName != "" { + outputName = fmt.Sprintf("osbuild-first-%s", inputName) + } + useNumberBased := inputName == "" || !filepath.IsLocal(inputName) || + reservedRegexp.MatchString(inputName) || + (outputName != "" && slices.Contains(alreadyUsed, outputName)) + + if useNumberBased { + ci++ + for slices.Contains(alreadyUsed, fmt.Sprintf("osbuild-first-%s-%d", prefix, ci)) { + ci++ + } + name := fmt.Sprintf("osbuild-first-%s-%d", prefix, ci) + alreadyUsed = append(alreadyUsed, name) + return name + } + + // keep the naming convention consistent with the existing "osbuild-first-boot" + alreadyUsed = append(alreadyUsed, outputName) + return outputName + } + + for _, fbsc := range bpFirstboot.Scripts { + cust, sat, aap, err := fbsc.SelectUnion() + if err != nil { + return nil, err + } + + if cust != nil { + fo.Scripts = append(fo.Scripts, Script{ + Filename: nameFunc(cust.Name, "custom"), + Contents: cust.Contents, + IgnoreFailure: cust.IgnoreFailure, + }) + } + + if sat != nil { + if satDone { + return nil, fmt.Errorf("%w: satellite", ErrFirstbootAlreadySet) + } + satDone = true + + fo.Scripts = append(fo.Scripts, Script{ + Filename: nameFunc(sat.Name, "satellite"), + Contents: sat.Command, + IgnoreFailure: sat.IgnoreFailure, + Certs: sat.CACerts, + }) + } + + if aap != nil { + if aapDone { + return nil, fmt.Errorf("%w: aap", ErrFirstbootAlreadySet) + } + aapDone = true + + contents := fmt.Sprintf("#!/usr/bin/bash\ncurl -i --data %s %s\n", + shutil.Quote("host_config_key="+aap.HostConfigKey), + shutil.Quote(aap.JobTemplateURL), + ) + + fo.Scripts = append(fo.Scripts, Script{ + Filename: nameFunc(aap.Name, "aap"), + Contents: contents, + IgnoreFailure: aap.IgnoreFailure, + Certs: aap.CACerts, + }) + } + } + + return fo, nil +} diff --git a/pkg/customizations/firstboot/firstboot_test.go b/pkg/customizations/firstboot/firstboot_test.go new file mode 100644 index 0000000000..c51154a43b --- /dev/null +++ b/pkg/customizations/firstboot/firstboot_test.go @@ -0,0 +1,210 @@ +package firstboot_test + +import ( + "encoding/json" + "testing" + + "github.com/osbuild/blueprint/pkg/blueprint" + "github.com/osbuild/images/pkg/customizations/firstboot" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFirstbootOptionsFromBP(t *testing.T) { + tests := []struct { + name string + json string + want firstboot.FirstbootOptions + err string + }{ + { + name: "custom", + json: `{"scripts": [{"type":"custom","name":"custom","contents":"echo hello"}]}`, + want: firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-custom", + Contents: "echo hello", + IgnoreFailure: false, + }, + }, + }, + }, + { + name: "satellite", + json: `{"scripts": [{"type":"satellite","name":"satellite","command":"echo hello"}]}`, + want: firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-satellite", + Contents: "echo hello", + IgnoreFailure: false, + Certs: nil, + }, + }, + }, + }, + { + name: "aap", + json: `{"scripts": [{"type":"aap","name":"aap","host_config_key":"key","job_template_url":"https://aap.example.com/api/v2/job_templates/9/callback/"}]}`, + want: firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-aap", + Contents: "#!/usr/bin/bash\ncurl -i --data 'host_config_key=key' 'https://aap.example.com/api/v2/job_templates/9/callback/'\n", + IgnoreFailure: false, + Certs: nil, + }, + }, + }, + }, + { + name: "sat-sat", + json: `{"scripts": [{"type":"satellite","name":"sat","command":"echo hello"},{"type":"satellite","name":"sat","command":"echo hello"}]}`, + err: "firstboot customization already set: satellite", + }, + { + name: "aap-aap", + json: `{"scripts": [{"type":"aap","name":"aap","host_config_key":"key","job_template_url":"https://aap.example.com/api/v2/job_templates/9/callback/"},{"type":"aap","name":"aap","host_config_key":"key","job_template_url":"https://aap.example.com/api/v2/job_templates/9/callback/"}]}`, + err: "firstboot customization already set: aap", + }, + { + name: "sat-c1-c2-aap", + json: `{"scripts": [ + {"type":"satellite","name":"sat","command":"echo hello"}, + {"type":"custom","name":"c1","contents":"echo hello c1"}, + {"type":"custom","name":"c2","contents":"echo hello c2"}, + {"type":"aap","name":"aap","host_config_key":"key","job_template_url":"https://aap.example.com/api/v2/job_templates/9/callback/"} + ]}`, + want: firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-sat", + Contents: "echo hello", + IgnoreFailure: false, + Certs: nil, + }, + { + Filename: "osbuild-first-c1", + Contents: "echo hello c1", + IgnoreFailure: false, + }, + { + Filename: "osbuild-first-c2", + Contents: "echo hello c2", + IgnoreFailure: false, + }, + { + Filename: "osbuild-first-aap", + Contents: "#!/usr/bin/bash\ncurl -i --data 'host_config_key=key' 'https://aap.example.com/api/v2/job_templates/9/callback/'\n", + IgnoreFailure: false, + Certs: nil, + }, + }, + }, + }, + { + name: "path-traversal", + json: `{"scripts": [ + {"type":"custom","name":"../bad","contents":"echo bad"}, + {"type":"custom","name":"/absolute/bad","contents":"echo bad"}, + {"type":"custom","name":"good","contents":"echo good"} + ]}`, + want: firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-custom-1", + Contents: "echo bad", + IgnoreFailure: false, + }, + { + Filename: "osbuild-first-custom-2", + Contents: "echo bad", + IgnoreFailure: false, + }, + { + Filename: "osbuild-first-good", + Contents: "echo good", + IgnoreFailure: false, + }, + }, + }, + }, + { + name: "duplicate-name", + json: `{"scripts": [ + {"type":"custom","name":"test","contents":"echo test"}, + {"type":"custom","name":"test","contents":"echo test"} + ]}`, + want: firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-test", + Contents: "echo test", + }, + { + Filename: "osbuild-first-custom-1", + Contents: "echo test", + }, + }, + }, + }, + { + name: "reserved-name", + json: `{"scripts": [ + {"type":"custom","name":"custom-42","contents":"echo test"}, + {"type":"custom","name":"aap-13","contents":"echo test"} + ]}`, + want: firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-custom-1", + Contents: "echo test", + }, + { + Filename: "osbuild-first-custom-2", + Contents: "echo test", + }, + }, + }, + }, + { + name: "unnamed-after-number-based-no-collision", + json: `{"scripts": [ + {"type":"custom","name":"custom-1","contents":"echo first"}, + {"type":"custom","contents":"echo second"} + ]}`, + want: firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-custom-1", + Contents: "echo first", + }, + { + Filename: "osbuild-first-custom-2", + Contents: "echo second", + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var input blueprint.FirstbootCustomization + err := json.Unmarshal([]byte(tt.json), &input) + assert.NoError(t, err) + + got, err := firstboot.FirstbootOptionsFromBP(input) + if tt.err != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.err) + return + } + require.NoError(t, err) + require.NotNil(t, got) + + assert.Equal(t, tt.want, *got) + }) + } +} diff --git a/pkg/distro/generic/images.go b/pkg/distro/generic/images.go index f85095f470..0221dbb0a1 100644 --- a/pkg/distro/generic/images.go +++ b/pkg/distro/generic/images.go @@ -10,6 +10,7 @@ import ( "github.com/osbuild/images/pkg/customizations/anaconda" "github.com/osbuild/images/pkg/customizations/bootc" "github.com/osbuild/images/pkg/customizations/fdo" + "github.com/osbuild/images/pkg/customizations/firstboot" "github.com/osbuild/images/pkg/customizations/fsnode" "github.com/osbuild/images/pkg/customizations/ignition" "github.com/osbuild/images/pkg/customizations/kickstart" @@ -345,6 +346,13 @@ func osCustomizations(t *imageType, osPackageSet rpmmd.PackageSet, options distr osc.CACerts = ca.PEMCerts } + if c != nil && c.Firstboot != nil { + osc.Firstboot, err = firstboot.FirstbootOptionsFromBP(*c.Firstboot) + if err != nil { + return manifest.OSCustomizations{}, fmt.Errorf("firstboot customization: %w", err) + } + } + if imageConfig.InstallWeakDeps != nil { osc.InstallWeakDeps = *imageConfig.InstallWeakDeps } diff --git a/pkg/manifest/os.go b/pkg/manifest/os.go index 044a69538e..a05799a458 100644 --- a/pkg/manifest/os.go +++ b/pkg/manifest/os.go @@ -15,6 +15,7 @@ import ( "github.com/osbuild/images/pkg/arch" "github.com/osbuild/images/pkg/container" "github.com/osbuild/images/pkg/customizations/bootc" + "github.com/osbuild/images/pkg/customizations/firstboot" "github.com/osbuild/images/pkg/customizations/fsnode" "github.com/osbuild/images/pkg/customizations/ignition" "github.com/osbuild/images/pkg/customizations/oscap" @@ -173,6 +174,8 @@ type OSCustomizations struct { CACerts []string + Firstboot *firstboot.FirstbootOptions + FIPS bool // NoBLS configures the image bootloader with traditional menu entries @@ -541,6 +544,8 @@ func (p *OS) serialize() (osbuild.Pipeline, error) { return osbuild.Pipeline{}, err } + var subscriptionEnabledServices []string + if p.ostreeParentSpec != nil { pipeline.AddStage(osbuild.NewOSTreePasswdStage("org.osbuild.source", p.ostreeParentSpec.Checksum)) } @@ -682,6 +687,15 @@ func (p *OS) serialize() (osbuild.Pipeline, error) { pipeline = prependStage(pipeline, osbuild.NewDracutConfStage(dracutConfConfig)) } + fbCerts, fbFiles, fbUnit, err := osbuild.GenFirstbootFromOptions(p.OSCustomizations.Firstboot) + if err != nil { + return osbuild.Pipeline{}, err + } + + if len(fbFiles) > 0 { + p.addStagesForAllFilesAndInlineData(&pipeline, fbFiles) + } + for _, systemdUnitConfig := range p.OSCustomizations.SystemdDropin { pipeline.AddStage(osbuild.NewSystemdUnitStage(systemdUnitConfig)) } @@ -689,6 +703,9 @@ func (p *OS) serialize() (osbuild.Pipeline, error) { for _, systemdUnitCreateConfig := range p.OSCustomizations.SystemdUnit { pipeline.AddStage(osbuild.NewSystemdUnitCreateStage(systemdUnitCreateConfig)) } + if fbUnit != nil { + pipeline.AddStage(osbuild.NewSystemdUnitCreateStage(fbUnit)) + } if p.OSCustomizations.Authselect != nil { pipeline.AddStage(osbuild.NewAuthselectStage(p.OSCustomizations.Authselect)) @@ -768,7 +785,7 @@ func (p *OS) serialize() (osbuild.Pipeline, error) { pipeline.AddStage(subStage) pipeline.AddStages(osbuild.GenDirectoryNodesStages(subDirs)...) p.addStagesForAllFilesAndInlineData(&pipeline, subFiles) - p.OSCustomizations.EnabledServices = append(p.OSCustomizations.EnabledServices, subServices...) + subscriptionEnabledServices = subServices } if p.OSCustomizations.RHSMConfig != nil { @@ -909,6 +926,10 @@ func (p *OS) serialize() (osbuild.Pipeline, error) { disabledServices := []string{} maskedServices := []string{} enabledServices = append(enabledServices, p.OSCustomizations.EnabledServices...) + if fbUnit != nil { + enabledServices = append(enabledServices, fbUnit.Filename) + } + enabledServices = append(enabledServices, subscriptionEnabledServices...) disabledServices = append(disabledServices, p.OSCustomizations.DisabledServices...) maskedServices = append(maskedServices, p.OSCustomizations.MaskedServices...) if p.Environment != nil { @@ -934,14 +955,13 @@ func (p *OS) serialize() (osbuild.Pipeline, error) { } if p.OSCustomizations.WSLDistributionConfig != nil { - // We format in our version string into the name field, if there's no %s in there nothing - // special will happen. - p.OSCustomizations.WSLDistributionConfig.OOBE.DefaultName = fmt.Sprintf( - p.OSCustomizations.WSLDistributionConfig.OOBE.DefaultName, + // Format version into the name field; if there's no %s nothing special happens. + wslDistConfig := *p.OSCustomizations.WSLDistributionConfig + wslDistConfig.OOBE.DefaultName = fmt.Sprintf( + wslDistConfig.OOBE.DefaultName, p.OSVersion, ) - - pipeline.AddStage(osbuild.NewWSLDistributionConfStage(p.OSCustomizations.WSLDistributionConfig)) + pipeline.AddStage(osbuild.NewWSLDistributionConfStage(&wslDistConfig)) } if p.OSCustomizations.FIPS { @@ -967,8 +987,10 @@ func (p *OS) serialize() (osbuild.Pipeline, error) { })) } - if len(p.OSCustomizations.CACerts) > 0 { - for _, cc := range p.OSCustomizations.CACerts { + allCACerts := append([]string{}, p.OSCustomizations.CACerts...) + allCACerts = append(allCACerts, fbCerts...) + if len(allCACerts) > 0 { + for _, cc := range allCACerts { files, err := osbuild.NewCAFileNodes(cc) if err != nil { return osbuild.Pipeline{}, err diff --git a/pkg/osbuild/firstboot.go b/pkg/osbuild/firstboot.go new file mode 100644 index 0000000000..e4ed2da9f1 --- /dev/null +++ b/pkg/osbuild/firstboot.go @@ -0,0 +1,76 @@ +package osbuild + +import ( + "fmt" + "io/fs" + + "github.com/osbuild/images/internal/common" + "github.com/osbuild/images/pkg/customizations/firstboot" + "github.com/osbuild/images/pkg/customizations/fsnode" +) + +// GenFirstbootFromOptions processes the firstboot options and returns a list of CA certificates to +// include in the image, a list of file nodes to create the firstboot scripts, and +// a systemd unit to run the scripts on first boot. +func GenFirstbootFromOptions(fbo *firstboot.FirstbootOptions) ([]string, []*fsnode.File, *SystemdUnitCreateStageOptions, error) { + if fbo == nil { + return nil, nil, nil, nil + } + + var certs []string // list of CA certificates to include + var files []*fsnode.File // list of file nodes to create + var executables []string // list of executables for the systemd unit (Exec=) + + // add the marker file to indicate that firstboot scripts need to be run + f, err := fsnode.NewFile("/var/local/.osbuild-custom-first-boot", common.ToPtr(fs.FileMode(0770)), "root", "root", []byte{}) + if err != nil { + return nil, nil, nil, fmt.Errorf("error creating firstboot marker node: %w", err) + } + files = append(files, f) + + for _, script := range fbo.Scripts { + // create the executable - filename was already sanitized + exec := fmt.Sprintf("/usr/local/bin/%s", script.Filename) + f, err := fsnode.NewFile(exec, common.ToPtr(fs.FileMode(0770)), "root", "root", []byte(script.Contents)) + if err != nil { + return nil, nil, nil, fmt.Errorf("error creating firstboot file node %q: %w", exec, err) + } + files = append(files, f) + + // prepare data for the systemd unit + if script.IgnoreFailure { + exec = "-" + exec + } + executables = append(executables, exec) + + // add CA certificates to the list + certs = append(certs, script.Certs...) + } + + // create the main systemd unit: + unit := SystemdUnit{ + Unit: &UnitSection{ + ConditionPathExists: []string{"/var/local/.osbuild-custom-first-boot"}, + Wants: []string{"network-online.target"}, + After: []string{"network-online.target", "osbuild-first-boot.service"}, + }, + Service: &ServiceSection{ + Type: OneshotServiceType, + ExecStart: executables, + ExecStartPre: []string{"/usr/bin/rm /var/local/.osbuild-custom-first-boot"}, + RemainAfterExit: true, + }, + Install: &InstallSection{ + WantedBy: []string{"basic.target"}, + }, + } + + unitOptions := &SystemdUnitCreateStageOptions{ + Filename: "osbuild-custom-first-boot.service", + Config: unit, + UnitType: SystemUnitType, + UnitPath: UsrUnitPath, + } + + return certs, files, unitOptions, nil +} diff --git a/pkg/osbuild/firstboot_test.go b/pkg/osbuild/firstboot_test.go new file mode 100644 index 0000000000..9bc8c5f2f9 --- /dev/null +++ b/pkg/osbuild/firstboot_test.go @@ -0,0 +1,148 @@ +package osbuild + +import ( + "encoding/json" + "strings" + "testing" + + "github.com/osbuild/images/pkg/customizations/firstboot" + "github.com/osbuild/images/pkg/customizations/fsnode" + "github.com/stretchr/testify/assert" +) + +func concatFirstbootFiles(files []*fsnode.File) string { + var result strings.Builder + result.WriteString("\n") + + for i, f := range files { + result.WriteString("### " + f.Path() + " ###\n") + result.Write(f.Data()) + if i < len(files)-1 { + result.WriteString("\n\n") + } + } + + return result.String() +} + +func TestGenFirstbootFromOptions(t *testing.T) { + fbo := &firstboot.FirstbootOptions{ + Scripts: []firstboot.Script{ + { + Filename: "osbuild-first-satellite", + Contents: "#!/usr/bin/bash\ncurl https://sat.example.com/register", + IgnoreFailure: true, + Certs: []string{"cert1", "cert2"}, + }, + { + Filename: "osbuild-first-aap", + Contents: "#!/usr/bin/bash\ncurl -i --data 'host_config_key=host-config-key' 'https://aap.example.com/api/v2/job_templates/9/callback/'\n", + IgnoreFailure: true, + Certs: []string{"cert3", "cert4"}, + }, + { + Filename: "osbuild-first-custom-1", + Contents: "echo 'unnamed'", + }, + { + Filename: "osbuild-first-custom-2", + Contents: "echo 'unnamed'", + }, + { + Filename: "osbuild-first-my-script", + Contents: "echo 'my-script'", + }, + { + Filename: "osbuild-first-ignore-errors", + Contents: "echo 'ignore errors'", + IgnoreFailure: true, + }, + { + Filename: "osbuild-first-custom-3", + Contents: "echo 'unnamed'", + }, + }, + } + + want := ` +### /var/local/.osbuild-custom-first-boot ### + + +### /usr/local/bin/osbuild-first-satellite ### +#!/usr/bin/bash +curl https://sat.example.com/register + +### /usr/local/bin/osbuild-first-aap ### +#!/usr/bin/bash +curl -i --data 'host_config_key=host-config-key' 'https://aap.example.com/api/v2/job_templates/9/callback/' + + +### /usr/local/bin/osbuild-first-custom-1 ### +echo 'unnamed' + +### /usr/local/bin/osbuild-first-custom-2 ### +echo 'unnamed' + +### /usr/local/bin/osbuild-first-my-script ### +echo 'my-script' + +### /usr/local/bin/osbuild-first-ignore-errors ### +echo 'ignore errors' + +### /usr/local/bin/osbuild-first-custom-3 ### +echo 'unnamed'` + + wantUnit := ` +{ + "filename": "osbuild-custom-first-boot.service", + "unit-type": "system", + "unit-path": "usr", + "config": { + "Unit": { + "ConditionPathExists": [ + "/var/local/.osbuild-custom-first-boot" + ], + "Wants": [ + "network-online.target" + ], + "After": [ + "network-online.target", + "osbuild-first-boot.service" + ] + }, + "Service": { + "Type": "oneshot", + "RemainAfterExit": true, + "ExecStartPre": [ + "/usr/bin/rm /var/local/.osbuild-custom-first-boot" + ], + "ExecStart": [ + "-/usr/local/bin/osbuild-first-satellite", + "-/usr/local/bin/osbuild-first-aap", + "/usr/local/bin/osbuild-first-custom-1", + "/usr/local/bin/osbuild-first-custom-2", + "/usr/local/bin/osbuild-first-my-script", + "-/usr/local/bin/osbuild-first-ignore-errors", + "/usr/local/bin/osbuild-first-custom-3" + ] + }, + "Install": { + "WantedBy": [ + "basic.target" + ] + } + } +}` + + certs, files, unit, err := GenFirstbootFromOptions(fbo) + assert.NoError(t, err) + + assert.Equal(t, []string{"cert1", "cert2", "cert3", "cert4"}, certs) + + got := concatFirstbootFiles(files) + assert.Equal(t, want, got) + + buf, err := json.MarshalIndent(unit, "", " ") + assert.NoError(t, err) + assert.JSONEq(t, wantUnit, string(buf)) +} diff --git a/test/configs/all-customizations.json b/test/configs/all-customizations.json index 041d4feb1c..2837e387ff 100644 --- a/test/configs/all-customizations.json +++ b/test/configs/all-customizations.json @@ -197,6 +197,26 @@ "1337:udp", "42-48:tcp" ] + }, + "firstboot": { + "scripts": [ + { + "type":"satellite", + "command": "#!/bin/bash\ncurl https://localhost/register", + "cacerts": ["-----BEGIN CERTIFICATE-----\nMIIDszCCApugAwIBAgIUJ4lK+JfdJCNgcEVxZDinJfKKbQswDQYJKoZIhvcNAQEL\nBQAwaDELMAkGA1UEBhMCVVMxFzAVBgNVBAgMDk5vcnRoIENhcm9saW5hMRAwDgYD\nVQQHDAdSYWxlaWdoMRAwDgYDVQQKDAdSZWQgSGF0MRwwGgYDVQQDDBNUZXN0IENB\nIGZvciBvc2J1aWxkMCAXDTI0MDkwMzEzMjkyMFoYDzIyOTgwNjE4MTMyOTIwWjBo\nMQswCQYDVQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExEDAOBgNVBAcM\nB1JhbGVpZ2gxEDAOBgNVBAoMB1JlZCBIYXQxHDAaBgNVBAMME1Rlc3QgQ0EgZm9y\nIG9zYnVpbGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeA7OcWTrV\ngstoBsUaeJKm8nelg7Lc0WNXH6yOTLsr4td4yHs0YOvFGwgSf+ffV3RAG1mgqnMG\nMgkD2+z+7QhHbHHs3y0d0zfhA2bg0KVvfCWk7fNRPHY0UOePpXk245Bfw3D0VTpl\nF7nePk1I7ZY09snPWUeb2rjKXzYjKjzM0h27+ykV8I8+FbdyPk/pR8whyDqtHLUa\nXfFy2TFloDSYMkHKVd38BnL0bj91x5F+KsZkN4HzfbYwxLbCQfOSgy7q6TWce9kq\nLo6tya9vuvpWFm1dye7L+BodAQAq/dI/JMeCfyTb0eFb+tyzfr5aVIoqqDN+p9ft\ncw4OefpHbhtNAgMBAAGjUzBRMB0GA1UdDgQWBBRV2A9YmusekPzu5Yf08cV0oPL1\nwjAfBgNVHSMEGDAWgBRV2A9YmusekPzu5Yf08cV0oPL1wjAPBgNVHRMBAf8EBTAD\nAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCgQZ2Xfj+NxaKBZgn2KNxS0MTbhzHRz6Rn\nqJs+h8OUz2Crmaf6N+RHlmDRZXUrDjSHpxVT2LxFy7ofRrLYIezFDUYfb920VkkV\nSVcxh1YDFROJalfMoE6wdyR/LnK4MJZS9fUpeCJJc/A0J+9FK9CwcyUrHgJ8XbJh\nMKYyQ+cf6O7wzutuBpMyRqSKS+hVM7BQTmSFvv1eAJlo6klGAmmKiYmAEvcQadH1\ndjrujsA3Cn5vX2L+0yuiLB5/zoxqx5cEy97TuKUYB8OqMMujAXNzF4L3HJDUNba2\nAhEkFozMXwYX73TGbGZ0mawPS5D3v3tYTEmJFf6SnVCmUW1fs57g\n-----END CERTIFICATE-----\n"], + "ignore_failure": true + }, + { + "type":"custom", + "contents":"#!/bin/bash\ntouch /tmp/custom_done\n" + }, + { + "type":"aap", + "host_config_key":"key", + "job_template_url":"https://localhost/api/v2/job_templates/9/callback/", + "ignore_failure": true + } + ] } } } diff --git a/test/data/manifest-checksums/centos_10-aarch64-ami-all_customizations b/test/data/manifest-checksums/centos_10-aarch64-ami-all_customizations index d41537838f..eaed92d1f6 100644 --- a/test/data/manifest-checksums/centos_10-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/centos_10-aarch64-ami-all_customizations @@ -1 +1 @@ -d4f4032262b29e8d7b0823ab3af0f434ee1ac090 +e9001b6e0905e7a24f91f92cd43ad9d2cfa575fc diff --git a/test/data/manifest-checksums/centos_10-x86_64-ami-all_customizations b/test/data/manifest-checksums/centos_10-x86_64-ami-all_customizations index a80b99be33..b8ec9ec9b0 100644 --- a/test/data/manifest-checksums/centos_10-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/centos_10-x86_64-ami-all_customizations @@ -1 +1 @@ -494584f1966307732cceb1e08a906498d8a3c961 +356ce960077dcfda49bafdc49c892f4cdda7bb6f diff --git a/test/data/manifest-checksums/centos_9-aarch64-ami-all_customizations b/test/data/manifest-checksums/centos_9-aarch64-ami-all_customizations index 9488d5af95..a7f45ba4a2 100644 --- a/test/data/manifest-checksums/centos_9-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/centos_9-aarch64-ami-all_customizations @@ -1 +1 @@ -07f0348ab10a18e19a7a04d82b7efb9a63338c4d +3d82f781453983f23d1089f8a3f3102eaef7bed9 diff --git a/test/data/manifest-checksums/centos_9-x86_64-ami-all_customizations b/test/data/manifest-checksums/centos_9-x86_64-ami-all_customizations index 5d677341cd..97389921b6 100644 --- a/test/data/manifest-checksums/centos_9-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/centos_9-x86_64-ami-all_customizations @@ -1 +1 @@ -43005e9b777a064382181a73b6d07d655b09f649 +ebed9392e2e5c80a2451bac8f63150117683ab72 diff --git a/test/data/manifest-checksums/fedora_42-aarch64-generic_ami-all_customizations b/test/data/manifest-checksums/fedora_42-aarch64-generic_ami-all_customizations index 8ea3753bd7..e435e86fce 100644 --- a/test/data/manifest-checksums/fedora_42-aarch64-generic_ami-all_customizations +++ b/test/data/manifest-checksums/fedora_42-aarch64-generic_ami-all_customizations @@ -1 +1 @@ -1b8ac1711fe28406b42041a88a0947b595452ac3 +b0709d4b4f56d3909b2b3106d72e14369bf8ed13 diff --git a/test/data/manifest-checksums/fedora_42-aarch64-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_42-aarch64-generic_qcow2-all_customizations index 2f18f7ef34..092546d1ef 100644 --- a/test/data/manifest-checksums/fedora_42-aarch64-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_42-aarch64-generic_qcow2-all_customizations @@ -1 +1 @@ -8dec1115468a90485a968f542882cf634bb23d8c +aede3b34b63a61338480216da7ab71df56773743 diff --git a/test/data/manifest-checksums/fedora_42-aarch64-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_42-aarch64-server_qcow2-all_customizations index cf3ae66e8e..89cc18f751 100644 --- a/test/data/manifest-checksums/fedora_42-aarch64-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_42-aarch64-server_qcow2-all_customizations @@ -1 +1 @@ -ab00f782f4c9cc885e0be1f7eb98339b2f9c6ac8 +4b0c2eb7c3730178e1ae1d294b46695c920fa5ac diff --git a/test/data/manifest-checksums/fedora_42-ppc64le-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_42-ppc64le-generic_qcow2-all_customizations index d7f13bfe57..d2720f63a2 100644 --- a/test/data/manifest-checksums/fedora_42-ppc64le-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_42-ppc64le-generic_qcow2-all_customizations @@ -1 +1 @@ -78657ee454b5c6b36a8a4eecc3e1f22e66ecbd38 +0ca465bf897453890f5149cd896e8070ff862159 diff --git a/test/data/manifest-checksums/fedora_42-ppc64le-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_42-ppc64le-server_qcow2-all_customizations index 4ee9bec3f6..87064747eb 100644 --- a/test/data/manifest-checksums/fedora_42-ppc64le-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_42-ppc64le-server_qcow2-all_customizations @@ -1 +1 @@ -79e4e873106e4ac8e79b6ddbeff1c1a16b3062a2 +412b77f5092651655e4e8c0116c34f6ad73cbf3c diff --git a/test/data/manifest-checksums/fedora_42-s390x-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_42-s390x-generic_qcow2-all_customizations index 62575345ba..0cd04f6e0c 100644 --- a/test/data/manifest-checksums/fedora_42-s390x-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_42-s390x-generic_qcow2-all_customizations @@ -1 +1 @@ -beedc4b39da9878143f8aaae3a4b932133b086eb +0666766e4a098bb7fd8fd62da79ca1f94c7d3c1c diff --git a/test/data/manifest-checksums/fedora_42-s390x-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_42-s390x-server_qcow2-all_customizations index 1ffd3c2c11..955c08ca5f 100644 --- a/test/data/manifest-checksums/fedora_42-s390x-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_42-s390x-server_qcow2-all_customizations @@ -1 +1 @@ -bd613718b6c63efc12677f562091fdb5235d8ab7 +f154f9b6e65b664285d2e54840515522920ba6a5 diff --git a/test/data/manifest-checksums/fedora_42-x86_64-generic_ami-all_customizations b/test/data/manifest-checksums/fedora_42-x86_64-generic_ami-all_customizations index e4b93589e5..5147c96598 100644 --- a/test/data/manifest-checksums/fedora_42-x86_64-generic_ami-all_customizations +++ b/test/data/manifest-checksums/fedora_42-x86_64-generic_ami-all_customizations @@ -1 +1 @@ -fe44550d27cbeda661188c7cc39c97931f47fbcb +ba53ff204a19a06bc4cec1c79f3bf1386f77cede diff --git a/test/data/manifest-checksums/fedora_42-x86_64-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_42-x86_64-generic_qcow2-all_customizations index 4a1f23e995..51ad424144 100644 --- a/test/data/manifest-checksums/fedora_42-x86_64-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_42-x86_64-generic_qcow2-all_customizations @@ -1 +1 @@ -a3ee057eeaeb2e75a5c5931c9ab736e03bf81c35 +e8bdf412cb77f52c71d4f3a813b91c6d7df35593 diff --git a/test/data/manifest-checksums/fedora_42-x86_64-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_42-x86_64-server_qcow2-all_customizations index b8fae118c1..4942af9cd1 100644 --- a/test/data/manifest-checksums/fedora_42-x86_64-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_42-x86_64-server_qcow2-all_customizations @@ -1 +1 @@ -59c91455f36f77caa4b7138009f94f7fa66b26fd +f53385d4e9c1d9f23815b76c43cff07d10e2bea6 diff --git a/test/data/manifest-checksums/fedora_43-aarch64-generic_ami-all_customizations b/test/data/manifest-checksums/fedora_43-aarch64-generic_ami-all_customizations index 5543902199..7c5281faaf 100644 --- a/test/data/manifest-checksums/fedora_43-aarch64-generic_ami-all_customizations +++ b/test/data/manifest-checksums/fedora_43-aarch64-generic_ami-all_customizations @@ -1 +1 @@ -75dbf806953d517980d02c9a0049b84ea8d96f6f +78c5ce1de488b2973223f982e37e3870797afc46 diff --git a/test/data/manifest-checksums/fedora_43-aarch64-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_43-aarch64-generic_qcow2-all_customizations index 573dab1926..8f068dda9d 100644 --- a/test/data/manifest-checksums/fedora_43-aarch64-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_43-aarch64-generic_qcow2-all_customizations @@ -1 +1 @@ -84a811d38e5d619416f4d01e5c150ba7a2ccc490 +91523a7e1c0d3aaecaba47a51f97e3fed5af9717 diff --git a/test/data/manifest-checksums/fedora_43-aarch64-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_43-aarch64-server_qcow2-all_customizations index 2f13fd67e0..a1bdd741e2 100644 --- a/test/data/manifest-checksums/fedora_43-aarch64-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_43-aarch64-server_qcow2-all_customizations @@ -1 +1 @@ -72cd7439113a7bf7506095329ceac37879d11e36 +339e5ae856ec8b5f97efde20d849cfa660d3961e diff --git a/test/data/manifest-checksums/fedora_43-ppc64le-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_43-ppc64le-generic_qcow2-all_customizations index fd0306d90f..6d9e5653db 100644 --- a/test/data/manifest-checksums/fedora_43-ppc64le-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_43-ppc64le-generic_qcow2-all_customizations @@ -1 +1 @@ -00f34d7b49efab592b05c0212daa35897bb279fe +49b8b794c43ff0dcc9632b64b137987a9799dd1a diff --git a/test/data/manifest-checksums/fedora_43-ppc64le-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_43-ppc64le-server_qcow2-all_customizations index 34b67e7eab..db9c03f16d 100644 --- a/test/data/manifest-checksums/fedora_43-ppc64le-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_43-ppc64le-server_qcow2-all_customizations @@ -1 +1 @@ -cdaf2ba58b77acff607d7b72936f780cc3795f03 +96a0c760db35d80f59a05069bc84f21d9cc83cc4 diff --git a/test/data/manifest-checksums/fedora_43-s390x-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_43-s390x-generic_qcow2-all_customizations index bbe5c840e9..c0affc9331 100644 --- a/test/data/manifest-checksums/fedora_43-s390x-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_43-s390x-generic_qcow2-all_customizations @@ -1 +1 @@ -e7963b6f7bb9d02d46cd38f9c91c8decbfb14d28 +a354a192226181816e3225fb89590e661ba6234d diff --git a/test/data/manifest-checksums/fedora_43-s390x-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_43-s390x-server_qcow2-all_customizations index d1d721f301..fc2c2cf459 100644 --- a/test/data/manifest-checksums/fedora_43-s390x-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_43-s390x-server_qcow2-all_customizations @@ -1 +1 @@ -9b07880b7a67e60ef0c037f27721544f40c522ce +4877824d8b9a6002a751717bbfeb977487d3d11c diff --git a/test/data/manifest-checksums/fedora_43-x86_64-generic_ami-all_customizations b/test/data/manifest-checksums/fedora_43-x86_64-generic_ami-all_customizations index 2c819e0d49..c9cabe696b 100644 --- a/test/data/manifest-checksums/fedora_43-x86_64-generic_ami-all_customizations +++ b/test/data/manifest-checksums/fedora_43-x86_64-generic_ami-all_customizations @@ -1 +1 @@ -b9021e1274fe79de010d25f61571bd198de77c2a +2d89d779dc1cde49b54212165ef1e232cc56e04f diff --git a/test/data/manifest-checksums/fedora_43-x86_64-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_43-x86_64-generic_qcow2-all_customizations index 0760546995..9c363e3ef1 100644 --- a/test/data/manifest-checksums/fedora_43-x86_64-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_43-x86_64-generic_qcow2-all_customizations @@ -1 +1 @@ -b7cda8763794c120eff92a9dc7c6f8dc50f39380 +b2b03b5bde3142e18df0c122d51eca2d32cd75ab diff --git a/test/data/manifest-checksums/fedora_43-x86_64-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_43-x86_64-server_qcow2-all_customizations index 40d7a0d75a..4fd6a6efc5 100644 --- a/test/data/manifest-checksums/fedora_43-x86_64-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_43-x86_64-server_qcow2-all_customizations @@ -1 +1 @@ -7808bc9aeaf905d2a1200c5388fd1c3779478774 +0dffaa43ab8985eaa2c05cc84170e20974d3de43 diff --git a/test/data/manifest-checksums/fedora_44-aarch64-generic_ami-all_customizations b/test/data/manifest-checksums/fedora_44-aarch64-generic_ami-all_customizations index bbc72b7511..2161ca424e 100644 --- a/test/data/manifest-checksums/fedora_44-aarch64-generic_ami-all_customizations +++ b/test/data/manifest-checksums/fedora_44-aarch64-generic_ami-all_customizations @@ -1 +1 @@ -e493ccdbc7925f5f5a7b09339b8d6ff368c51af2 +01a41ca3f86c80ba538e41f542d88469cc4b169c diff --git a/test/data/manifest-checksums/fedora_44-aarch64-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_44-aarch64-generic_qcow2-all_customizations index 0ecaed8835..4fc63f1e2f 100644 --- a/test/data/manifest-checksums/fedora_44-aarch64-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_44-aarch64-generic_qcow2-all_customizations @@ -1 +1 @@ -890d83172a292706f90404918fbb8861f89e34ce +8b978fcfa482880f534f881a31e9f86fde98a0b0 diff --git a/test/data/manifest-checksums/fedora_44-aarch64-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_44-aarch64-server_qcow2-all_customizations index 638f677e14..ad67ac0894 100644 --- a/test/data/manifest-checksums/fedora_44-aarch64-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_44-aarch64-server_qcow2-all_customizations @@ -1 +1 @@ -85464ab31c1e2c3a989a4406a351f4e7be9b8bd8 +862a68ded7f36f10777c81152b15a03b44f6e71d diff --git a/test/data/manifest-checksums/fedora_44-ppc64le-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_44-ppc64le-generic_qcow2-all_customizations index 1031bb676d..22011d8947 100644 --- a/test/data/manifest-checksums/fedora_44-ppc64le-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_44-ppc64le-generic_qcow2-all_customizations @@ -1 +1 @@ -b2a6dfd4b41e26c5a926aaec754650d135ff5a29 +6970380c8b620f49b60582181757a3ebd88d17ec diff --git a/test/data/manifest-checksums/fedora_44-ppc64le-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_44-ppc64le-server_qcow2-all_customizations index 548a842e0f..26784aa537 100644 --- a/test/data/manifest-checksums/fedora_44-ppc64le-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_44-ppc64le-server_qcow2-all_customizations @@ -1 +1 @@ -df76ce592dc4664742ccffdd5cb7567f2464e761 +8b17f742c076db64933fddba2ff6a9f88e9bf6eb diff --git a/test/data/manifest-checksums/fedora_44-s390x-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_44-s390x-generic_qcow2-all_customizations index 2accb0baca..a17bf18c14 100644 --- a/test/data/manifest-checksums/fedora_44-s390x-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_44-s390x-generic_qcow2-all_customizations @@ -1 +1 @@ -3a7458986384113ca8b2ba2236c98ce568ca98a6 +95747da1ce88ded2710ac540d05630e75e268269 diff --git a/test/data/manifest-checksums/fedora_44-s390x-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_44-s390x-server_qcow2-all_customizations index 0737ebeb02..406cbb0593 100644 --- a/test/data/manifest-checksums/fedora_44-s390x-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_44-s390x-server_qcow2-all_customizations @@ -1 +1 @@ -9ce5a47053d14858244913b7a455e2a0f39b7bc1 +308f6d7a05ef975e409a2aceb8ae82b2c611d39f diff --git a/test/data/manifest-checksums/fedora_44-x86_64-generic_ami-all_customizations b/test/data/manifest-checksums/fedora_44-x86_64-generic_ami-all_customizations index 2679caeba7..89e61ab165 100644 --- a/test/data/manifest-checksums/fedora_44-x86_64-generic_ami-all_customizations +++ b/test/data/manifest-checksums/fedora_44-x86_64-generic_ami-all_customizations @@ -1 +1 @@ -524d6a03cd898f5aa9c71348a22ea09c9080790e +3fb104bbe13d8130eb511dd1de4c5d36c75249e4 diff --git a/test/data/manifest-checksums/fedora_44-x86_64-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_44-x86_64-generic_qcow2-all_customizations index f3001fa6c6..e1496a4b79 100644 --- a/test/data/manifest-checksums/fedora_44-x86_64-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_44-x86_64-generic_qcow2-all_customizations @@ -1 +1 @@ -1e9821823e9038a0643ff786b4c286bf29f6a9cd +0962704914ec7dabb2e91e0e3b24efa87fc03426 diff --git a/test/data/manifest-checksums/fedora_44-x86_64-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_44-x86_64-server_qcow2-all_customizations index 79413527c5..40f2179b4d 100644 --- a/test/data/manifest-checksums/fedora_44-x86_64-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_44-x86_64-server_qcow2-all_customizations @@ -1 +1 @@ -054c636bac8527e67f57d6f869c81a4002d36bcb +4aa0ba53b81fd0baae47f65c760243366207a296 diff --git a/test/data/manifest-checksums/fedora_45-aarch64-generic_ami-all_customizations b/test/data/manifest-checksums/fedora_45-aarch64-generic_ami-all_customizations index dd867d6709..8aa465e343 100644 --- a/test/data/manifest-checksums/fedora_45-aarch64-generic_ami-all_customizations +++ b/test/data/manifest-checksums/fedora_45-aarch64-generic_ami-all_customizations @@ -1 +1 @@ -fe7cde74f20080a1199f70268e18f996b1518c1f +5d5dc81cf55c8d4dc8b3aa62b163ea1a8c935214 diff --git a/test/data/manifest-checksums/fedora_45-aarch64-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_45-aarch64-generic_qcow2-all_customizations index 9570dcd9a1..23eb5a4dcc 100644 --- a/test/data/manifest-checksums/fedora_45-aarch64-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_45-aarch64-generic_qcow2-all_customizations @@ -1 +1 @@ -3658acfd4c99b62516814b1cb915b9c5c0dd0a34 +49cba368f5b70fba17828c192a754822538ead5e diff --git a/test/data/manifest-checksums/fedora_45-aarch64-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_45-aarch64-server_qcow2-all_customizations index 2edcc6c36e..232b4c72a0 100644 --- a/test/data/manifest-checksums/fedora_45-aarch64-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_45-aarch64-server_qcow2-all_customizations @@ -1 +1 @@ -6cf067ff51adaae88a86fcb8bec22993ade14027 +86a33899d725c255b8c0d30f18a89c9bb3be5513 diff --git a/test/data/manifest-checksums/fedora_45-ppc64le-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_45-ppc64le-generic_qcow2-all_customizations index 7164f2cb28..4232d9e14d 100644 --- a/test/data/manifest-checksums/fedora_45-ppc64le-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_45-ppc64le-generic_qcow2-all_customizations @@ -1 +1 @@ -93d92919266e465ca13a081fc2629720f5435d97 +1d7d94bb377011ac122a402a6d6d71d8d62afee0 diff --git a/test/data/manifest-checksums/fedora_45-ppc64le-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_45-ppc64le-server_qcow2-all_customizations index c59108299f..6561d128de 100644 --- a/test/data/manifest-checksums/fedora_45-ppc64le-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_45-ppc64le-server_qcow2-all_customizations @@ -1 +1 @@ -6d397b97f3481d6ec934fb6b6ac6c28a6057f7ba +c527cbc3234ef555204d1eb684865d793f863186 diff --git a/test/data/manifest-checksums/fedora_45-s390x-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_45-s390x-generic_qcow2-all_customizations index 2106e67728..79ce397665 100644 --- a/test/data/manifest-checksums/fedora_45-s390x-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_45-s390x-generic_qcow2-all_customizations @@ -1 +1 @@ -8c8cb222ab67064a4df099c4fed2676f30678821 +efb128e82e3a5ca2cb744ef519a4def86edbe893 diff --git a/test/data/manifest-checksums/fedora_45-s390x-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_45-s390x-server_qcow2-all_customizations index c85922b5ba..5a01642d33 100644 --- a/test/data/manifest-checksums/fedora_45-s390x-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_45-s390x-server_qcow2-all_customizations @@ -1 +1 @@ -9d4484b473ea1dfc8593ab07b1864760e809b004 +e4381898b7940203914f690533631d03a0647e3f diff --git a/test/data/manifest-checksums/fedora_45-x86_64-generic_ami-all_customizations b/test/data/manifest-checksums/fedora_45-x86_64-generic_ami-all_customizations index e2fdb00d00..e57bcddf58 100644 --- a/test/data/manifest-checksums/fedora_45-x86_64-generic_ami-all_customizations +++ b/test/data/manifest-checksums/fedora_45-x86_64-generic_ami-all_customizations @@ -1 +1 @@ -ee95f33fa97108831f40c742f37e8a5394ca724e +6095d6223fccf81e785be04657ced4447e28e592 diff --git a/test/data/manifest-checksums/fedora_45-x86_64-generic_qcow2-all_customizations b/test/data/manifest-checksums/fedora_45-x86_64-generic_qcow2-all_customizations index 5e60c4ccae..b82e0c7561 100644 --- a/test/data/manifest-checksums/fedora_45-x86_64-generic_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_45-x86_64-generic_qcow2-all_customizations @@ -1 +1 @@ -eb45359ad05b4316c4158b7dc704d09263c5a4d3 +85073c8d5d54941e4aa1f6b5aebaf7991ba2430b diff --git a/test/data/manifest-checksums/fedora_45-x86_64-server_qcow2-all_customizations b/test/data/manifest-checksums/fedora_45-x86_64-server_qcow2-all_customizations index 99a1e1f388..80b6dd3113 100644 --- a/test/data/manifest-checksums/fedora_45-x86_64-server_qcow2-all_customizations +++ b/test/data/manifest-checksums/fedora_45-x86_64-server_qcow2-all_customizations @@ -1 +1 @@ -13cf2c1dc905f6f23eb715f48b7a83167e437079 +94764ad12ff66d78d33dd922893d629264697cc2 diff --git a/test/data/manifest-checksums/rhel_10.0-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_10.0-aarch64-ami-all_customizations index d976d93bf4..103c11933d 100644 --- a/test/data/manifest-checksums/rhel_10.0-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_10.0-aarch64-ami-all_customizations @@ -1 +1 @@ -dc2a57c775af7844e816fa296ab8315f7077f7b1 +0a6e9d6d83f01fbdef89f1953b9c4cd65af769b3 diff --git a/test/data/manifest-checksums/rhel_10.0-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_10.0-x86_64-ami-all_customizations index 217d99e533..ef33e4403c 100644 --- a/test/data/manifest-checksums/rhel_10.0-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_10.0-x86_64-ami-all_customizations @@ -1 +1 @@ -b41ab3979e9c06b95536e8084b566c611436d696 +640a314e58d1cd417932b5b67596c87d799c2228 diff --git a/test/data/manifest-checksums/rhel_10.1-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_10.1-aarch64-ami-all_customizations index a3e2ab0067..b1d3d8c622 100644 --- a/test/data/manifest-checksums/rhel_10.1-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_10.1-aarch64-ami-all_customizations @@ -1 +1 @@ -d445bd94699827e5a1464cc5b516c31fee4208fb +25e8451726dd50cc4a96cd620e748495f4cb26fe diff --git a/test/data/manifest-checksums/rhel_10.1-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_10.1-x86_64-ami-all_customizations index 2ab294450d..a892695b8e 100644 --- a/test/data/manifest-checksums/rhel_10.1-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_10.1-x86_64-ami-all_customizations @@ -1 +1 @@ -1623501997d724a50f9958e4e19142e8a61e04bc +1a185a33cac49bfd5429d676c8e17019e9e5bbe2 diff --git a/test/data/manifest-checksums/rhel_10.2-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_10.2-aarch64-ami-all_customizations index 9359b8a48f..ab0e2d0631 100644 --- a/test/data/manifest-checksums/rhel_10.2-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_10.2-aarch64-ami-all_customizations @@ -1 +1 @@ -687c39039583a719ba65f4b6dc49b4c11d7c982e +8287394d6d26e5dee3d53d8bc6b0304621babe25 diff --git a/test/data/manifest-checksums/rhel_10.2-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_10.2-x86_64-ami-all_customizations index bd0c7366d6..f898d7843c 100644 --- a/test/data/manifest-checksums/rhel_10.2-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_10.2-x86_64-ami-all_customizations @@ -1 +1 @@ -331b61ff06b0b6fc2bbf5ef8c01f3d72a048a172 +bd271774f809cf9358a39bdf0b5fd6dcb9f8b1ac diff --git a/test/data/manifest-checksums/rhel_8.10-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_8.10-aarch64-ami-all_customizations index a9d5155cbf..a7887b8e29 100644 --- a/test/data/manifest-checksums/rhel_8.10-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_8.10-aarch64-ami-all_customizations @@ -1 +1 @@ -599821455710dacd4d5d116968cdaacd9f850106 +ab20ecba1f22a8f822ac3b85d151ee85c7925927 diff --git a/test/data/manifest-checksums/rhel_8.10-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_8.10-x86_64-ami-all_customizations index 3c22779cd2..75d50722dd 100644 --- a/test/data/manifest-checksums/rhel_8.10-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_8.10-x86_64-ami-all_customizations @@ -1 +1 @@ -e2929915f16d9d0e98aab5539a6c6fda37e136ac +86104d6405beafc33b2fe4a78be257548da47577 diff --git a/test/data/manifest-checksums/rhel_8.4-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_8.4-aarch64-ami-all_customizations index 9afea3efd5..47dd1bb0a2 100644 --- a/test/data/manifest-checksums/rhel_8.4-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_8.4-aarch64-ami-all_customizations @@ -1 +1 @@ -185ec44d36aff1eb38e53088889a9f1c7451e596 +2965a13befaf4e0effdda4634775f6b5394d4ba5 diff --git a/test/data/manifest-checksums/rhel_8.4-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_8.4-x86_64-ami-all_customizations index a9cdb64288..cf1edf0fee 100644 --- a/test/data/manifest-checksums/rhel_8.4-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_8.4-x86_64-ami-all_customizations @@ -1 +1 @@ -06075b6d9397ae8a3378d2d7f7a3b044bb73a641 +0d3a26ad074fe42185d5e0d2ac9a21a82388540d diff --git a/test/data/manifest-checksums/rhel_8.6-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_8.6-aarch64-ami-all_customizations index ad1a7a4e8c..af0cfe6f38 100644 --- a/test/data/manifest-checksums/rhel_8.6-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_8.6-aarch64-ami-all_customizations @@ -1 +1 @@ -690f9517dd463f862dc3aeed9815661166b87f19 +d9c5f669328966b66c38e6e17b783c828b7736d9 diff --git a/test/data/manifest-checksums/rhel_8.6-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_8.6-x86_64-ami-all_customizations index c1bb743345..a696ed02ba 100644 --- a/test/data/manifest-checksums/rhel_8.6-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_8.6-x86_64-ami-all_customizations @@ -1 +1 @@ -94871afe4be41249bee2ddea2215e208a62595ec +7364a19d69f63801b075b5e6cddc157c040c5321 diff --git a/test/data/manifest-checksums/rhel_8.8-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_8.8-aarch64-ami-all_customizations index 01ae1c8841..87836b23ed 100644 --- a/test/data/manifest-checksums/rhel_8.8-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_8.8-aarch64-ami-all_customizations @@ -1 +1 @@ -f052bc89f46c13d30623bd05ecebd3ab89140626 +4555e9d655ee1e57854e12a62215eb0560aad9b6 diff --git a/test/data/manifest-checksums/rhel_8.8-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_8.8-x86_64-ami-all_customizations index b9613c861e..bf3402fa43 100644 --- a/test/data/manifest-checksums/rhel_8.8-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_8.8-x86_64-ami-all_customizations @@ -1 +1 @@ -5c5e547aa8c48a80f91364b114f85468c3abe5b0 +7abde8f860426ff915ec3bdb340238e595ecf933 diff --git a/test/data/manifest-checksums/rhel_9.0-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.0-aarch64-ami-all_customizations index 1a24f32c0a..c0d824618e 100644 --- a/test/data/manifest-checksums/rhel_9.0-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.0-aarch64-ami-all_customizations @@ -1 +1 @@ -4c07c764ce259f54811a172d086ccb21acbebb72 +9de3c532270ec6c84d2b155047db464e1744b396 diff --git a/test/data/manifest-checksums/rhel_9.0-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.0-x86_64-ami-all_customizations index cd9d48bdd1..48bc1cc11c 100644 --- a/test/data/manifest-checksums/rhel_9.0-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.0-x86_64-ami-all_customizations @@ -1 +1 @@ -34001eec966f7cbe80fcd8bb9978a620219491d3 +af280aa69db87e67ed4b55105b61e1dbb5246382 diff --git a/test/data/manifest-checksums/rhel_9.2-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.2-aarch64-ami-all_customizations index eb26239016..72fa682f38 100644 --- a/test/data/manifest-checksums/rhel_9.2-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.2-aarch64-ami-all_customizations @@ -1 +1 @@ -657b3a98ede40c7661ec8551ec477a2ab3e42828 +9a171736670b30dd7564ed5f56b30829237ff5d2 diff --git a/test/data/manifest-checksums/rhel_9.2-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.2-x86_64-ami-all_customizations index da6a9efffb..41f949ee46 100644 --- a/test/data/manifest-checksums/rhel_9.2-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.2-x86_64-ami-all_customizations @@ -1 +1 @@ -7198f38ab4949a529ff6afd3c098842c5c394d3f +fb267f163633f688cf0331ba745fac4a77b13089 diff --git a/test/data/manifest-checksums/rhel_9.4-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.4-aarch64-ami-all_customizations index 85e03c25b3..6ada8d3947 100644 --- a/test/data/manifest-checksums/rhel_9.4-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.4-aarch64-ami-all_customizations @@ -1 +1 @@ -ed1ff8483cac827ac249d2faeb95be3059c28406 +7a39aa5714b4cd53973af11f2b680642fedcee47 diff --git a/test/data/manifest-checksums/rhel_9.4-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.4-x86_64-ami-all_customizations index dfbcaeb03a..53db61db26 100644 --- a/test/data/manifest-checksums/rhel_9.4-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.4-x86_64-ami-all_customizations @@ -1 +1 @@ -72e18ec73ca7b9a46087b095c1e37be5a1c5f3f4 +2aab4ecf363d74648fec328e531e39494a33b542 diff --git a/test/data/manifest-checksums/rhel_9.6-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.6-aarch64-ami-all_customizations index 0e72bedad3..9e9cd5005b 100644 --- a/test/data/manifest-checksums/rhel_9.6-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.6-aarch64-ami-all_customizations @@ -1 +1 @@ -bddf10c4296620ff51d155e7fce0b6be75901b13 +2e208bd5fc9fe8076b9171593730619019cccc7c diff --git a/test/data/manifest-checksums/rhel_9.6-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.6-x86_64-ami-all_customizations index 15e30e9453..3cf51a2a11 100644 --- a/test/data/manifest-checksums/rhel_9.6-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.6-x86_64-ami-all_customizations @@ -1 +1 @@ -422c986ea0b71b36d4f62f354cab4528af215e98 +931b33b3c19e17645325393226e8ecaebbb6a337 diff --git a/test/data/manifest-checksums/rhel_9.7-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.7-aarch64-ami-all_customizations index 261cdab382..9d6d524c9b 100644 --- a/test/data/manifest-checksums/rhel_9.7-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.7-aarch64-ami-all_customizations @@ -1 +1 @@ -33aefcff7d300edbc6de0cc0ba302ce39ac45f95 +964de08dd74b6dea13545047572e9be44952a386 diff --git a/test/data/manifest-checksums/rhel_9.7-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.7-x86_64-ami-all_customizations index 78acf9ae45..f8a889b1ba 100644 --- a/test/data/manifest-checksums/rhel_9.7-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.7-x86_64-ami-all_customizations @@ -1 +1 @@ -c284e881a5a48d847b10c17ef39f1c89ef52b50e +af111aa10472c8ccf8454bd00a3b44c359343b79 diff --git a/test/data/manifest-checksums/rhel_9.8-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.8-aarch64-ami-all_customizations index 7af62da8a5..4f24b08d5d 100644 --- a/test/data/manifest-checksums/rhel_9.8-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.8-aarch64-ami-all_customizations @@ -1 +1 @@ -a1dd45ca93c705a09ea76aa0698bf18df8ee7f56 +e0b3a09e28d2dcba643899a111478b94a90ac4fb diff --git a/test/data/manifest-checksums/rhel_9.8-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.8-x86_64-ami-all_customizations index a2ccde67d0..3bb0fbe603 100644 --- a/test/data/manifest-checksums/rhel_9.8-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.8-x86_64-ami-all_customizations @@ -1 +1 @@ -d17e7a7a8d6defe46670a676f1692a858ad17f82 +76da9707319bdbf1f894a84ea0b146462db0b8d6