diff --git a/data/distrodefs/fedora/imagetypes.yaml b/data/distrodefs/fedora/imagetypes.yaml index 5b0d59f8ac..8f27d6cbfe 100644 --- a/data/distrodefs/fedora/imagetypes.yaml +++ b/data/distrodefs/fedora/imagetypes.yaml @@ -1077,6 +1077,7 @@ - "customizations.disk" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" @@ -1164,6 +1165,7 @@ - "customizations.files" - "customizations.fips" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -2260,9 +2262,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 656d4a634b..c88ea7676c 100644 --- a/data/distrodefs/rhel-10/imagetypes.yaml +++ b/data/distrodefs/rhel-10/imagetypes.yaml @@ -852,6 +852,7 @@ - "customizations.dnf" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" @@ -883,6 +884,7 @@ - "customizations.files" - "customizations.fips" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -904,9 +906,11 @@ - "groups" - "enabled_modules" - "containers" + - "customizations.cacerts" - "customizations.directories" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -1353,6 +1357,7 @@ image_types: - "customizations.dnf" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -1874,10 +1879,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" @@ -2057,6 +2064,7 @@ image_types: - "customizations.directories" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -2324,6 +2332,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 4ef6a20f2b..be6fdbd09d 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 e1c3d01627..e9e0ae087b 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 8f208c6e72..63906221d0 100644 --- a/data/distrodefs/rhel-9/imagetypes.yaml +++ b/data/distrodefs/rhel-9/imagetypes.yaml @@ -1290,6 +1290,7 @@ - "customizations.dnf" - "customizations.files" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.partitioning_mode" - "customizations.fips" - "customizations.firewall" @@ -1315,11 +1316,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" @@ -1334,11 +1337,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" @@ -1362,6 +1367,7 @@ - "customizations.files" - "customizations.fips" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -1383,9 +1389,11 @@ - "groups" - "enabled_modules" - "containers" + - "customizations.cacerts" - "customizations.directories" - "customizations.files" - "customizations.firewall" + - "customizations.firstboot" - "customizations.user" - "customizations.sshkey" - "customizations.group" @@ -3201,9 +3209,11 @@ image_types: blueprint: supported_options: - "distro" + - "customizations.cacerts" - "customizations.dnf" - "customizations.installation_device" - "customizations.filesystem" + - "customizations.firstboot" - "customizations.disk" - "customizations.fdo" - "customizations.ignition" @@ -3392,6 +3402,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 cbd8520535..e2b12a9d39 100644 --- a/pkg/distro/generic/images.go +++ b/pkg/distro/generic/images.go @@ -12,6 +12,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" @@ -348,6 +349,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 733ce7c686..6b5097190d 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 @@ -c7ede54bbc44448a54cd5f913ec4034bbe338985 +145367deca4d0c7f849a56c9eb7c2db5c3efe324 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 3f9ed07b28..1c4b7fc78c 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 @@ -4bfb7fd2fe5ac4244c463ea9076ff5e167477e0f +0870c8538d5734144f9f79b6de37986e511eb3f4 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 3d0fe7f091..76fbac5385 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 @@ -a65bee7045ddd98c5965ae2ddd14ee31442bee97 +040209954fb12365548dd3de1f17f15d3e711e87 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 9ddf2814ca..12c31513b9 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 @@ -e0404f024513beac56ddaa42d36fa671f06ec215 +85572e370596ddf4a92aa0ac16ef114778dd6c5f 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 3f2550b373..02457da0b2 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 @@ -6f65ba251499987eb5778f86a7d02c2b014866bd +aedb3098c5a124cd44236347d885b26f9d377e29 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 5d12bc1d60..e960e99fb8 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 @@ -09707c4449e948b2c6a0995631934e1bf101ec82 +a6460cf2d913997698040a01252c5bf26228a2d1 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 0c05fabad1..96c733803b 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 @@ -472b8a57f05d7855b173171f14ad6a4ec7cb95f9 +d5a307e1cd33cd2106e5bf370e9fe06b1aa6b740 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 f746830fd2..16d3d38a25 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 @@ -51f35f3b7337a3f0a074a41defd8c37e19078ba0 +072ebb63ea33d834e3753cdd97e9ff281fd87866 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 167011ee25..0387446c9a 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 @@ -6f99732b63bf6a288ddc6dd8d0e94deee67c99d0 +23393e94ec82f665ba6dc010bb2b6e3986479e64 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 bb749e787b..689e22a24e 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 @@ -a399afec15e026516adbc217533fb4772e570a42 +872ed855612f3ff4e77cf0316a31283148a1b6ab 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 705c18bba2..48cb100f14 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 @@ -08c5ab6849b88896515b8f218a624285db2f08be +30cd41fd5d95fff98e07c964256576a599078363 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 52564e050a..b6732d5b36 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 @@ -c8f56ea96a29570dfbd0afb1a2cee9a2a587a668 +e3cdd71782726320039dd0f96955b4b7ee6ae252 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 cdde6af057..a101fb5386 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 @@ -174756835ca1e2bb9ce59ea85b5dbde412df19c9 +ab923a7fa3d5f1960b78dcb949f0a8a9a7e86c85 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 04b2cbba1a..54616abeaa 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 @@ -fe3c88b5f5e575734f9edce58d10e29beb1b93ff +091e4dc37c0322623aa0849511424b1ade99d6fc 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 84bfafc5a1..29ce680eaf 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 @@ -66c38ea23b048940d75dd7a583a4a126546ccbc1 +1e7b5ef14e98eec1300577e16c36e380a97270ad 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 937a80e368..cedcb0900e 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 @@ -ffd1b60473f4e4202de617fcdad27cdf9fa7b288 +637ebb4809645c45ee554a1ac4e1e51ebba733a6 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 dcef4ccc22..d46e4a7ee7 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 @@ -bccf81149d1c320c8685fd8b943949f42e2b7856 +e660f3167311452378f36cd809345ef5e7edf2eb 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 2ea7940aaf..7260912f89 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 @@ -615a40855bd1884d22239820d819037a82409f35 +6da9433c9a9a244cf1ec0e285cff645c55fdabe1 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 503e9fc30f..6c9e23e8fb 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 @@ -561c4ac856f7649c53778b6d8747bb5276f5ff53 +3c5dd1e931af9c10fdf43cafca8c28cf4f274f33 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 2993c16d67..90d3e0dcec 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 @@ -749e402f552dcb15278178d42c4c96ce3bbed668 +de57e3031909306c011bd694a06d1f8518337c3a 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 1993c31cfd..682443dbdf 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 @@ -6af39c8ef97c3c5f28a8d70bc59787a769d84e60 +09e5b93579c9384bf22ace32f7f672bd3db94374 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 de22c7159e..d1c2f1388b 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 @@ -0113d09506941628e800348543bdc87a2f83818f +a21cb1529c397624cf9f61a09327cb15579ad489 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 7a5eb914b3..c94c7844c7 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 @@ -40a1e59efecb9ce8101674b17b3b5455dc3c5c48 +6f0cd4404f2e2ef911c682d5c6d483e02ad1c44d 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 62cd7aacda..f05ffffad5 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 @@ -c1a69da0989a1874794f0e4859830e589538259e +5d6a668d4635f7e71043ebb6d5dd4df4a555c35d 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 8562c606e1..3b6cc386a5 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 @@ -eba9f955edf283fb0e6f8e9418f1c2dcf34d0a19 +471d9d4d480ffeb99c85c81404761cce20b91168 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 ed0d06bb58..c1a9b9b235 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 @@ -f14f925c9f971df5d049bdc3a29d28261240ea01 +69dc05ddb9d898fa30acde647208ab9a9b516ba7 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 42491315aa..c6428ef213 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 @@ -17656502c56532283981fe151f3d6c1eb5182114 +f2bd94b5daa577406ba23637500a3cd5eb68b346 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 0c441db60f..fa21cac856 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 @@ -8df22705a12b8b0a0fa5899703a1a0e9c1530b7a +79cbf57ee484cb3d9df79489236085ab47a8781d 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 67562289e0..67b7262ce7 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 @@ -8bdda435d522f7edd81676001af996c7962f886e +da2861a3b48c8f74cb2142844b50fdbb1cf35a93 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 0e5727c2b0..61ebb7e22b 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 @@ -3563baa8cdac7066fff877d69ac73ce877f0ed18 +8306c6311da71db8d364b16b471911dc0d4a0c7b 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 14e95e3d0d..4d56bf37b1 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 @@ -6e9cb5bed0b8fd00ced0e97e6b256ba7a6cf95e6 +8dc5d4c59576979a0802da9c216a587dd3586f20 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 ce7f8a435c..c713f164f1 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 @@ -15712449ff2a114f878add841e4b751cd527c1b7 +61ab01c08d7a094b0e79505c529744eb21d96f7e 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 4f1d5ee04e..5e9f53697d 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 @@ -e5485973df4395813e1f4e8e790f60f975f702fb +38f17a115ed682e63cdcb81a6e972652dbf35b20 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 b35751b278..7dda14c200 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 @@ -e80b0acee7e906f0ec59a63347ee4089f5f355e5 +b33f78b1488d68f4e3a317c2211bc37ec00f5473 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 099160cbda..92d6539156 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 @@ -82d07fd84ae1c1329df4b3f99fb0a487609825dc +5f6ecfe67f14ae7b830b027d4c1ef0fb7e65d987 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 0e9c39815e..33ba3a48f6 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 @@ -ce6cd16e6545c5c701ad839dc2f32ece8fca6ccf +d53eb46e21ec46a751cd08b284c7545efbe0cdae diff --git a/test/data/manifest-checksums/rhel_10.3-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_10.3-aarch64-ami-all_customizations index d0376c5930..d355d969fe 100644 --- a/test/data/manifest-checksums/rhel_10.3-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_10.3-aarch64-ami-all_customizations @@ -1 +1 @@ -b40675e85f6bcb75f34f1f65050a5d44de71a40a +10073a8701623052a212e510267b69bb515e75b8 diff --git a/test/data/manifest-checksums/rhel_10.3-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_10.3-x86_64-ami-all_customizations index 5ae7b58147..73d19163fc 100644 --- a/test/data/manifest-checksums/rhel_10.3-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_10.3-x86_64-ami-all_customizations @@ -1 +1 @@ -2eb676ba9c687a4c8fe89a7cb9f694c6b61e3343 +c10a6b544e46f4c0b60560cba4fd52027fe254da 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 fe4de6bb51..7a11de216b 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 @@ -f8fe0d65ad7bd1e7b0df73614603557949d53e1b +aa595f431bcd2f77cce5669ebc83acf7bba16b1b 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 a87e744caf..a193be6922 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 @@ -fa12528aeaf51b4167d26332115b8bc900874ae3 +58f95e051f08ec4fbc38c377905629553173574c 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 a61cfe8d5f..c9a784d15c 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 @@ -7ec0da16624f09c50f862d581276c9486c9190bb +5b53411c4af6411972d4b74036189434cb0f3645 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 56fbc73667..4c1fb15cc1 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 @@ -7d1dd4b23b45b457aebecf2532e299966291dfe2 +a9d9441ffb9eb3b14eb9d68393f8ce4661e58c97 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 11fabe004d..857d650417 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 @@ -6e1287bf6d2c815e8d7d0abea05f2f98d1cef661 +c20008ad004db9a7e54c6185e79f2f801c7b739b 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 4861ca0629..658cf48eac 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 @@ -862f22edb0619b4424d936896b3a2c05061a09be +9dd79361835cf89db2267724c45619aa21da649b 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 13649a2900..e12700ae5e 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 @@ -19ac460180d5f5074b62534eec47ad48f6722ed8 +068c794e7fc2aa4601d95325bae407280e461772 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 12f6e8fedd..410bccadcf 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 @@ -be6a3d8539f01df9f07052e2f26e473b75d37388 +4e858ca421332310e52a9dd75439775b7fad7c6e diff --git a/test/data/manifest-checksums/rhel_9.9-aarch64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.9-aarch64-ami-all_customizations index 996336201e..0a1e56480c 100644 --- a/test/data/manifest-checksums/rhel_9.9-aarch64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.9-aarch64-ami-all_customizations @@ -1 +1 @@ -bb6dc5830ae7ffb4e6c4f9fc8ecb683d63c214d8 +720cf16e9023ab377df2d33fb23a40f55556ec38 diff --git a/test/data/manifest-checksums/rhel_9.9-x86_64-ami-all_customizations b/test/data/manifest-checksums/rhel_9.9-x86_64-ami-all_customizations index f39b8bb338..1a4f60f892 100644 --- a/test/data/manifest-checksums/rhel_9.9-x86_64-ami-all_customizations +++ b/test/data/manifest-checksums/rhel_9.9-x86_64-ami-all_customizations @@ -1 +1 @@ -f02522110676908b38537b51af5e954664ae3b70 +cb67f65594ef55c633fdbee0bfb4b29cc61e2b5e