From 962929561429068c60f32b53b1f6da2f3111ac5c Mon Sep 17 00:00:00 2001 From: Simon de Vlieger Date: Fri, 10 Jul 2026 10:13:45 +0200 Subject: [PATCH] installers: grub2 timeout everywhere When `installer.bootloader.grub2.menu-timeout` is set in the blueprint make sure it applies to *all* installer types. Signed-off-by: Simon de Vlieger --- pkg/distro/generic/bootc_imagetype.go | 11 ++++++++--- pkg/distro/generic/images.go | 4 ++++ pkg/image/iso_bootloaders.go | 3 +++ pkg/manifest/installer.go | 1 + pkg/manifest/iso_bootloaders.go | 22 ++++++++++++++++++++++ 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/pkg/distro/generic/bootc_imagetype.go b/pkg/distro/generic/bootc_imagetype.go index 29d5fed489..9c08a5ca49 100644 --- a/pkg/distro/generic/bootc_imagetype.go +++ b/pkg/distro/generic/bootc_imagetype.go @@ -333,9 +333,14 @@ func (t *bootcImageType) initAnacondaInstallerBaseFromSourceInfo(img *image.Anac if err != nil { return err } - if instCust != nil && instCust.Modules != nil { - img.InstallerCustomizations.EnabledAnacondaModules = append(img.InstallerCustomizations.EnabledAnacondaModules, instCust.Modules.Enable...) - img.InstallerCustomizations.DisabledAnacondaModules = append(img.InstallerCustomizations.DisabledAnacondaModules, instCust.Modules.Disable...) + if instCust != nil { + if instCust.Modules != nil { + img.InstallerCustomizations.EnabledAnacondaModules = append(img.InstallerCustomizations.EnabledAnacondaModules, instCust.Modules.Enable...) + img.InstallerCustomizations.DisabledAnacondaModules = append(img.InstallerCustomizations.DisabledAnacondaModules, instCust.Modules.Disable...) + } + if instCust.Bootloader != nil && instCust.Bootloader.Grub2 != nil { + img.InstallerCustomizations.MenuTimeout = instCust.Bootloader.Grub2.MenuTimeout + } } img.InstallerCustomizations.EnabledAnacondaModules = append(img.InstallerCustomizations.EnabledAnacondaModules, anaconda.ModuleUsers, diff --git a/pkg/distro/generic/images.go b/pkg/distro/generic/images.go index 52070ccddc..c26203aa9d 100644 --- a/pkg/distro/generic/images.go +++ b/pkg/distro/generic/images.go @@ -531,6 +531,10 @@ func installerCustomizations(t *imageType, c *blueprint.Customizations, o distro isc.DisabledAnacondaModules = append(isc.DisabledAnacondaModules, installerCust.Modules.Disable...) } + if installerCust.Bootloader != nil && installerCust.Bootloader.Grub2 != nil { + isc.MenuTimeout = installerCust.Bootloader.Grub2.MenuTimeout + } + if installerCust.Payload != nil && installerCust.Payload.Flatpaks != nil { flatpakMeta := installerCust.Payload.Flatpaks diff --git a/pkg/image/iso_bootloaders.go b/pkg/image/iso_bootloaders.go index e65ae4f39e..6142bfe61a 100644 --- a/pkg/image/iso_bootloaders.go +++ b/pkg/image/iso_bootloaders.go @@ -37,6 +37,7 @@ func (img *ISOBootloaders) Bootloaders(buildPipeline manifest.Build, platform pl grub2.ISOLabel = img.ISOCustomizations.Label grub2.KernelOpts = kernelOpts grub2.DefaultMenu = img.InstallerCustomizations.DefaultMenu + grub2.MenuTimeout = img.InstallerCustomizations.MenuTimeout for _, entry := range img.Custom { grub2.Custom = append(grub2.Custom, manifest.ISOGrub2MenuEntry{ @@ -55,6 +56,7 @@ func (img *ISOBootloaders) Bootloaders(buildPipeline manifest.Build, platform pl grub2ppc64.ISOLabel = img.ISOCustomizations.Label grub2ppc64.KernelOpts = kernelOpts grub2ppc64.DefaultMenu = img.InstallerCustomizations.DefaultMenu + grub2ppc64.MenuTimeout = img.InstallerCustomizations.MenuTimeout for _, entry := range img.Custom { grub2ppc64.Custom = append(grub2ppc64.Custom, manifest.ISOGrub2MenuEntry{ @@ -80,6 +82,7 @@ func (img *ISOBootloaders) Bootloaders(buildPipeline manifest.Build, platform pl efiPipeline.UEFIVendor = platform.GetUEFIVendor() efiPipeline.ISOLabel = img.ISOCustomizations.Label efiPipeline.DefaultMenu = img.InstallerCustomizations.DefaultMenu + efiPipeline.MenuTimeout = img.InstallerCustomizations.MenuTimeout efiPipeline.KernelOpts = kernelOpts for _, entry := range img.Custom { diff --git a/pkg/manifest/installer.go b/pkg/manifest/installer.go index 152f33362a..bf3ce1a188 100644 --- a/pkg/manifest/installer.go +++ b/pkg/manifest/installer.go @@ -135,6 +135,7 @@ type InstallerCustomizations struct { InstallWeakDeps bool DefaultMenu int + MenuTimeout *int Product string Variant string diff --git a/pkg/manifest/iso_bootloaders.go b/pkg/manifest/iso_bootloaders.go index 3b31851b2c..056ff4aa35 100644 --- a/pkg/manifest/iso_bootloaders.go +++ b/pkg/manifest/iso_bootloaders.go @@ -63,6 +63,8 @@ type Grub2X86Boot struct { // Default Grub2 menu on the ISO DefaultMenu int + // Default Grub2 menu timeout on the ISO + MenuTimeout *int // Custom menu entries (overrides all default entries) Custom []ISOGrub2MenuEntry } @@ -86,6 +88,15 @@ func (boot *Grub2X86Boot) GetISOBootStages(inputName string, _ *disk.PartitionTa Default: boot.DefaultMenu, } } + if boot.MenuTimeout != nil { + if grub2config == nil { + grub2config = &osbuild.Grub2Config{ + Timeout: *boot.MenuTimeout, + } + } else { + grub2config.Timeout = *boot.MenuTimeout + } + } options := &osbuild.Grub2ISOLegacyStageOptions{ Product: osbuild.Product{ Name: boot.product, @@ -142,6 +153,8 @@ type Grub2PPC64Boot struct { // Default Grub2 menu on the ISO DefaultMenu int + // Default Grub2 menu timeout on the ISO + MenuTimeout *int // Custom menu entries (overrides all default entries) Custom []ISOGrub2MenuEntry } @@ -165,6 +178,15 @@ func (boot *Grub2PPC64Boot) GetISOBootStages(inputName string, _ *disk.Partition Default: boot.DefaultMenu, } } + if boot.MenuTimeout != nil { + if grub2config == nil { + grub2config = &osbuild.Grub2Config{ + Timeout: *boot.MenuTimeout, + } + } else { + grub2config.Timeout = *boot.MenuTimeout + } + } options := &osbuild.Grub2ISOLegacyStageOptions{ Grub2Dir: "boot/grub", Product: osbuild.Product{