Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions toolkit/tools/pkg/imagecustomizerlib/bootcustomizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,17 @@ func (b *BootCustomizer) getSELinuxModeFromGrub() (imagecustomizerapi.SELinuxMod

// Get the SELinux kernel command-line args.
if b.isGrubMkconfig {
_, args, _, err = GetDefaultGrubFileLinuxArgs(b.defaultGrubFileContent, defaultGrubFileVarNameCmdlineForSELinux)
// Check both GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT variables
// and merge arguments from both if they exist
args, err = GetDefaultGrubFileLinuxArgsFromMultipleVars(b.defaultGrubFileContent)
if err != nil {
return "", err
return "", fmt.Errorf("failed to find SELinux args in grub file (%s):\n%w", installutils.GrubDefFile, err)
}
} else {
args, _, err = getLinuxCommandLineArgs(b.grubCfgContent)
if err != nil {
return imagecustomizerapi.SELinuxModeDefault, err
return imagecustomizerapi.SELinuxModeDefault,
fmt.Errorf("failed to parse SELinux args from grub file (%s):\n%w", installutils.GrubCfgFile, err)
}
}

Expand Down
40 changes: 40 additions & 0 deletions toolkit/tools/pkg/imagecustomizerlib/defaultgrubutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,46 @@ func GetDefaultGrubFileLinuxArgs(defaultGrubFileContent string, varName defaultG
return cmdLineVarAssign, args, insertAt, nil
}

// GetDefaultGrubFileLinuxArgsFromMultipleVars attempts to get Linux kernel command-line args from both
// GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT variables. It merges arguments from all found variables,
// allowing args to be distributed across multiple GRUB variables.
//
// Parameters:
// - defaultGrubFileContent: The content of the /etc/default/grub file
//
// Returns:
// - args: The merged list of kernel command-line args from all found variables
// - error: Error if parsing fails or no variables are found
func GetDefaultGrubFileLinuxArgsFromMultipleVars(defaultGrubFileContent string) ([]grubConfigLinuxArg, error) {
var allArgs []grubConfigLinuxArg
var foundAny bool

// Check both standard GRUB variables in order of preference from low to high
varNames := []defaultGrubFileVarName{
defaultGrubFileVarNameCmdlineLinuxDefault, // GRUB_CMDLINE_LINUX_DEFAULT
defaultGrubFileVarNameCmdlineLinux, // GRUB_CMDLINE_LINUX
}

for _, varName := range varNames {
_, args, _, err := GetDefaultGrubFileLinuxArgs(defaultGrubFileContent, varName)
if err != nil {
// Variable not found or parsing error, try next variable
continue
}

// Merge the args from this variable
allArgs = append(allArgs, args...)
foundAny = true
}

if !foundAny {
return nil, fmt.Errorf("failed to find any of the specified GRUB variables in %s: %v",
installutils.GrubDefFile, varNames)
}

return allArgs, nil
}

// Takes the string contents of /etc/default/grub file and inserts the provided command-line args.
func addExtraCommandLineToDefaultGrubFile(defaultGrubFileContent string, extraCommandLine string) (string, error) {
cmdLineVarAssign, _, insertAt, err := GetDefaultGrubFileLinuxArgs(defaultGrubFileContent,
Expand Down
Loading