44package imagecustomizerlib
55
66import (
7+ "errors"
78 "fmt"
89 "path/filepath"
910 "strings"
@@ -33,6 +34,8 @@ const (
3334 defaultGrubFileVarNameCmdlineForSELinux = defaultGrubFileVarNameCmdlineLinux
3435)
3536
37+ var errDefaultGrubFileVarNotFound = errors .New ("default grub variable not found" )
38+
3639type defaultGrubFileVarAssign struct {
3740 Token grub.Token
3841 Line grub.Line
@@ -122,7 +125,8 @@ func findDefaultGrubFileVarAssign(varAssigns []defaultGrubFileVarAssign, name de
122125 }
123126 }
124127
125- err := fmt .Errorf ("failed to find %s variable assignment (%s)" , installutils .GrubDefFile , name )
128+ err := fmt .Errorf ("failed to find %s variable assignment (%s): %w" , installutils .GrubDefFile , name ,
129+ errDefaultGrubFileVarNotFound )
126130 return defaultGrubFileVarAssign {}, err
127131}
128132
@@ -211,7 +215,7 @@ func GetDefaultGrubFileLinuxArgsFromMultipleVars(defaultGrubFileContent string)
211215
212216// Takes the string contents of /etc/default/grub file and inserts the provided command-line args.
213217func addExtraCommandLineToDefaultGrubFile (defaultGrubFileContent string , extraCommandLine string ) (string , error ) {
214- cmdLineVarAssign , _ , insertAt , err := GetDefaultGrubFileLinuxArgs (defaultGrubFileContent ,
218+ cmdLineVarAssign , _ , insertAt , err := getDefaultGrubFileLinuxArgsOrEmpty (defaultGrubFileContent ,
215219 defaultGrubFileVarNameCmdlineLinuxDefault )
216220 if err != nil {
217221 return "" , err
@@ -222,9 +226,23 @@ func addExtraCommandLineToDefaultGrubFile(defaultGrubFileContent string, extraCo
222226 // Add the extra command-line args.
223227 argsString = argsString [:insertAt ] + " " + extraCommandLine + " " + argsString [insertAt :]
224228
225- // Rewrite GRUB_CMDLINE_LINUX_DEFAULT line.
226- defaultGrubFileContent = replaceDefaultGrubFileVarAssign (defaultGrubFileContent , cmdLineVarAssign , argsString )
227- return defaultGrubFileContent , nil
229+ // Write the variable, creating it if it doesn't exist.
230+ return UpdateDefaultGrubFileVariable (defaultGrubFileContent , string (defaultGrubFileVarNameCmdlineLinuxDefault ), argsString )
231+ }
232+
233+ // getDefaultGrubFileLinuxArgsOrEmpty is like GetDefaultGrubFileLinuxArgs but treats a missing variable as having an
234+ // empty value instead of returning an error. Real parse errors are still returned.
235+ func getDefaultGrubFileLinuxArgsOrEmpty (defaultGrubFileContent string , varName defaultGrubFileVarName ,
236+ ) (defaultGrubFileVarAssign , []grubConfigLinuxArg , int , error ) {
237+ cmdLineVarAssign , args , insertAt , err := GetDefaultGrubFileLinuxArgs (defaultGrubFileContent , varName )
238+ if errors .Is (err , errDefaultGrubFileVarNotFound ) {
239+ // Variable doesn't exist — treat as empty.
240+ return defaultGrubFileVarAssign {}, nil , 0 , nil
241+ } else if err != nil {
242+ return defaultGrubFileVarAssign {}, nil , 0 , err
243+ }
244+
245+ return cmdLineVarAssign , args , insertAt , nil
228246}
229247
230248// Takes the string contents of the /etc/default/grub file and replaces a set of command-line args.
@@ -241,7 +259,7 @@ func addExtraCommandLineToDefaultGrubFile(defaultGrubFileContent string, extraCo
241259func updateDefaultGrubFileKernelCommandLineArgs (defaultGrubFileContent string , varName defaultGrubFileVarName ,
242260 argsToRemove []string , newArgs []string ,
243261) (string , error ) {
244- cmdLineVarAssign , args , insertAt , err := GetDefaultGrubFileLinuxArgs (defaultGrubFileContent , varName )
262+ cmdLineVarAssign , args , insertAt , err := getDefaultGrubFileLinuxArgsOrEmpty (defaultGrubFileContent , varName )
245263 if err != nil {
246264 return "" , err
247265 }
@@ -252,9 +270,8 @@ func updateDefaultGrubFileKernelCommandLineArgs(defaultGrubFileContent string, v
252270 return "" , err
253271 }
254272
255- // Rewrite GRUB_CMDLINE_LINUX line.
256- defaultGrubFileContent = replaceDefaultGrubFileVarAssign (defaultGrubFileContent , cmdLineVarAssign , value )
257- return defaultGrubFileContent , nil
273+ // Write the variable, creating it if it doesn't exist.
274+ return UpdateDefaultGrubFileVariable (defaultGrubFileContent , string (varName ), value )
258275}
259276
260277// Takes the string contents of the /etc/default/grub file and rewrites one of the variable assignments lines.
0 commit comments