+ finally:
+ if tmpfile: tmpfile.close()
+
+ return flavours
+
+
+def modify_grub_config(filename):
+ if options.removeoption:
+ regexe = []
+ for regex in options.removeoption:
+ regexe.append(re.compile(r'%s' % regex))
+
+ option_re = re.compile(r'(.*/boot/release/.*linux26.*)')
+
+ for line in fileinput.input(filename, inplace=1):
+ if regexe and option_re.search(line):
+ for regex in regexe:
+ line = regex.sub(' ', line)
+
+ sys.stdout.write(line)
+
+ fileinput.close()
+
+def handle_grub1_config(grml_flavour, install_partition, grub_target, bootopt):
+ """Main handler for generating grub1 configuration
+
+ @grml_flavour: name of grml flavour the configuration should be generated for
+ @install_partition: partition number for use in (hd0,X)
+ @grub_target: path of grub's configuration files
+ @bootoptions: additional bootoptions that should be used by default"""
+
+ # grub1 config
+ grub1_cfg = grub_target + 'menu.lst'
+ logging.debug("Creating grub1 configuration file (menu.lst)")
+
+ # install main configuration only *once*, no matter how many ISOs we have:
+ if os.path.isfile(grub1_cfg):
+ string = open(grub1_cfg).readline()
+ main_identifier = re.compile(".*main config generated at: %s.*" % re.escape(str(DATESTAMP)))
+ if not re.match(main_identifier, string):
+ grub1_config_file = open(grub1_cfg, 'w')
+ grub1_config_file.write(generate_main_grub1_config(grml_flavour, install_partition, bootopt))
+ grub1_config_file.close()
+ else:
+ grub1_config_file = open(grub1_cfg, 'w')
+ grub1_config_file.write(generate_main_grub1_config(grml_flavour, install_partition, bootopt))
+ grub1_config_file.close()
+
+ grub_flavour_config = True
+ if os.path.isfile(grub1_cfg):
+ string = open(grub1_cfg).readlines()
+ flavour = re.compile("grml2usb for %s: %s" % (re.escape(grml_flavour), re.escape(str(DATESTAMP))))
+ for line in string:
+ if flavour.match(line):
+ grub_flavour_config = False
+
+ if grub_flavour_config:
+ grub1_config_file = open(grub1_cfg, 'a')
+ grub1_config_file.write(generate_flavour_specific_grub1_config(grml_flavour, install_partition, bootopt))
+ grub1_config_file.close()
+
+ modify_grub_config(grub1_cfg)
+
+ # make sure grub.conf isn't a symlink but a plain file instead,
+ # otherwise it will break on FAT16 filesystems
+ # this works around grub-install of (at least) Fedora 10
+ if os.path.isfile(grub1_cfg):
+ grubconf = grub_target + 'grub.conf'
+ if not os.path.islink(grubconf):
+ import shutil
+ shutil.copyfile(grub1_cfg, grub_target + 'grub.conf')
+
+def handle_grub2_config(grml_flavour, grub_target, bootopt):
+ """Main handler for generating grub2 configuration
+
+ @grml_flavour: name of grml flavour the configuration should be generated for
+ @grub_target: path of grub's configuration files
+ @bootoptions: additional bootoptions that should be used by default"""
+
+ # grub2 config
+ grub2_cfg = grub_target + 'grub.cfg'
+ logging.debug("Creating grub2 configuration file (grub.lst)")
+
+ global GRML_DEFAULT
+
+ # install main configuration only *once*, no matter how many ISOs we have:
+ grub_flavour_is_default = False
+ if os.path.isfile(grub2_cfg):
+ string = open(grub2_cfg).readline()
+ main_identifier = re.compile(".*main config generated at: %s.*" % re.escape(str(DATESTAMP)))
+ if not re.match(main_identifier, string):
+ grub2_config_file = open(grub2_cfg, 'w')
+ GRML_DEFAULT = grml_flavour
+ grub_flavour_is_default = True
+ grub2_config_file.write(generate_main_grub2_config(grml_flavour, bootopt))
+ grub2_config_file.close()
+ else:
+ grub2_config_file = open(grub2_cfg, 'w')
+ GRML_DEFAULT = grml_flavour
+ grub_flavour_is_default = True
+ grub2_config_file.write(generate_main_grub2_config(grml_flavour, bootopt))
+ grub2_config_file.close()
+
+ # install flavour specific configuration only *once* as well
+ grub_flavour_config = True
+ if os.path.isfile(grub2_cfg):
+ string = open(grub2_cfg).readlines()
+ flavour = re.compile("grml2usb for %s: %s" % (re.escape(grml_flavour), re.escape(str(DATESTAMP))))
+ for line in string:
+ if flavour.match(line):
+ grub_flavour_config = False
+
+ if grub_flavour_config:
+ grub2_config_file = open(grub2_cfg, 'a')
+ # display only if the grml flavour isn't the default
+ if not grub_flavour_is_default:
+ GRML_FLAVOURS.add(grml_flavour)
+ grub2_config_file.write(generate_flavour_specific_grub2_config(grml_flavour, bootopt))
+ grub2_config_file.close()
+
+ modify_grub_config(grub2_cfg)