X-Git-Url: https://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=24207b632603697e2bb1310fe5409fff9daea75b;hp=b36798acc5d22abe982de0f0cca50aa8d7e68139;hb=6b93ccd0cbbbae5ac1f86762d89a681a3243d7fa;hpb=5818eec7811558140bd19aa8b1a3378789f3803f diff --git a/grml2usb b/grml2usb index b36798a..24207b6 100755 --- a/grml2usb +++ b/grml2usb @@ -304,181 +304,6 @@ def mkfs_fat16(device): raise CriticalException("error executing mkfs.vfat") -def generate_main_grub2_config(grml_flavour, bootoptions): - """Generate grub2 configuration for use via grub.cfg - - @grml_flavour: name of grml flavour the configuration should be generated for - @bootoptions: additional bootoptions that should be used by default""" - - local_datestamp = DATESTAMP - - return("""\ -## main grub2 configuration - generated by grml2usb [main config generated at: %(local_datestamp)s] -set default=0 -set timeout=10 - -insmod fat - -if loadfont /boot/grub/ascii.pf2 ; then - insmod png - set gfxmode=640x480 - insmod gfxterm - insmod vbe - if terminal_output gfxterm ; then true ; else - # For backward compatibility with versions of terminal.mod that don't - # understand terminal_output - terminal gfxterm - fi -fi - -if background_image /boot/grub/grml.png ; then - set color_normal=black/black - set color_highlight=red/black -else - set menu_color_normal=white/black - set menu_color_highlight=black/yellow -fi - -menuentry "%(grml_flavour)s (default)" { - set gfxpayload=1024x768x16,1024x768 - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce live-media-path=/live/%(grml_flavour)s/ bootid=%(uid)s %(bootoptions)s - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -menuentry "Memory test (memtest86+)" { - linux16 /boot/addons/memtest -} - -menuentry "Boot Grub (all in one image)" { - linux /boot/addons/memdisk - initrd /boot/addons/allinone.img -} - -menuentry "Boot FreeDOS" { - linux /boot/addons/memdisk - initrd /boot/addons/balder10.imz -} - -if [ ${iso_path} ] ; then - # assume loopback.cfg boot - if [ -e /boot/addons/bsd4grml/loopback.0 ] ; then - # bsd4grml 20100815 and later - menuentry "Boot MirOS bsd4grml" { - multiboot /boot/addons/bsd4grml/ldbsd.com - module /boot/addons/bsd4grml/bsd.rd bsd - module /boot/addons/bsd4grml/loopback.0 boot.cfg - module /boot/addons/bsd4grml/loopback.1 boot.1 - module /boot/addons/bsd4grml/loopback.2 boot.2 - module /boot/addons/bsd4grml/loopback.3 boot.3 - module /boot/addons/bsd4grml/loopback.4 boot.4 - module /boot/addons/bsd4grml/loopback.5 boot.5 - module /boot/addons/bsd4grml/loopback.6 boot.6 - } - else - # old bsd4grml - menuentry "Boot MirOS bsd4grml" { - multiboot /boot/addons/bsd4grml/ldbsd.com - module /boot/addons/bsd4grml/bsd.rd bsd.rd - module /boot/addons/bsd4grml/boot.cfg boot.cfg - module /boot/addons/bsd4grml/boot.1 boot.1 - module /boot/addons/bsd4grml/boot.2 boot.2 - module /boot/addons/bsd4grml/boot.3 boot.3 - module /boot/addons/bsd4grml/boot.4 boot.4 - module /boot/addons/bsd4grml/boot.5 boot.5 - } - fi -else - # assume grub.cfg boot - menuentry "Boot MirOS bsd4grml" { - multiboot /boot/addons/bsd4grml/ldbsd.com - module /boot/addons/bsd4grml/bsd.rd bsd.rd - module /boot/addons/bsd4grml/boot.cfg boot.cfg - module /boot/addons/bsd4grml/boot.1 boot.1 - module /boot/addons/bsd4grml/boot.2 boot.2 - module /boot/addons/bsd4grml/boot.3 boot.3 - module /boot/addons/bsd4grml/boot.4 boot.4 - module /boot/addons/bsd4grml/boot.5 boot.5 - module /boot/addons/bsd4grml/boot.6 boot.6 - } -fi - -menuentry "Boot OS of first partition on first disk" { - set root=(hd0,1) - chainloader +1 -} - -""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, - 'flavour_filename': grml_flavour.replace('-', ''), - 'uid': UUID, 'bootoptions': bootoptions } ) - - -def generate_flavour_specific_grub2_config(grml_flavour, bootoptions): - """Generate grub2 configuration for use via grub.cfg - - @grml_flavour: name of grml flavour the configuration should be generated for - @bootoptions: additional bootoptions that should be used by default""" - - local_datestamp = DATESTAMP - - return("""\ -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -menuentry "%(grml_flavour)s - boot in default mode" { - set gfxpayload=1024x768x16,1024x768 - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce live-media-path=/live/%(grml_flavour)s/ bootid=%(uid)s %(bootoptions)s - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -menuentry "%(grml_flavour)s - enable persistent mode" { - set gfxpayload=1024x768x16,1024x768 - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce persistent live-media-path=/live/%(grml_flavour)s/ bootid=%(uid)s %(bootoptions)s - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -menuentry "%(grml_flavour)s - copy Grml to RAM" { - set gfxpayload=1024x768x16,1024x768 - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s.squashfs bootid=%(uid)s %(bootoptions)s - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -menuentry "%(grml_flavour)s - start X Window System" { - set gfxpayload=1024x768x16,1024x768 - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce live-media-path=/live/%(grml_flavour)s/ startx bootid=%(uid)s %(bootoptions)s - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -menuentry "%(grml_flavour)s - disable framebuffer" { - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce live-media-path=/live/%(grml_flavour)s/ vga=normal video=ofonly bootid=%(uid)s %(bootoptions)s - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -menuentry "%(grml_flavour)s - disable Kernel Mode-Setting" { - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce live-media-path=/live/%(grml_flavour)s/ bootid=%(uid)s %(bootoptions)s radeon.modeset=0 i915.modeset=0 nouveau.modeset=0 nomodeset - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -menuentry "%(grml_flavour)s - forensic mode" { - set gfxpayload=1024x768x16,1024x768 - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce live-media-path=/live/%(grml_flavour)s/ nofstab noraid nolvm noautoconfig noswap raid=noautodetect forensic readonly bootid=%(uid)s %(bootoptions)s - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -menuentry "%(grml_flavour)s - enable debugging options" { - set gfxpayload=1024x768x16,1024x768 - linux /boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce live-media-path=/live/%(grml_flavour)s/ debug bootid=%(uid)s initcall_debug %(bootoptions)s - initrd /boot/release/%(flavour_filename)s/initrd.gz -} - -""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, - 'flavour_filename': grml_flavour.replace('-', ''), - 'uid': UUID, 'bootoptions': bootoptions } ) - def generate_isolinux_splash(grml_flavour): """Generate bootsplash for isolinux/syslinux @@ -943,28 +768,19 @@ def copy_system_files(grml_flavour, iso_mount, target): else: exec_rsync(filesystem_module, squashfs_target + 'filesystem.module') - - release_path = 'boot/release/' + grml_flavour.replace('-', '') - release_target = target + "/" + release_path - execute(mkdir, release_target) - - prefix = "" - if os.path.isdir(iso_mount + '/boot/release'): - prefix = release_path + '/' - - kernel = search_file(prefix + 'vmlinuz', iso_mount) - initrd = search_file(prefix + 'initrd.img', iso_mount) + kernel = search_file('vmlinuz', iso_mount) if kernel is None: # compat for releases < 2011.12 - kernel = search_file(prefix + 'linux26', iso_mount) - initrd = search_file(prefix + 'initrd.gz', iso_mount) + kernel = search_file('linux26', iso_mount) - if kernel is None or initrd is None: - logging.critical("Fatal: kernel or initrd not found") - raise CriticalException("error locating kernel or initrd file") + if kernel is None: + logging.critical("Fatal: kernel not found") + raise CriticalException("error locating kernel file") - exec_rsync(kernel, release_target + '/') - exec_rsync(initrd, release_target + '/') + source = os.path.dirname(kernel) + '/' + dest = target + '/' + os.path.dirname(kernel).replace(iso_mount,'') + '/' + execute(mkdir, dest) + exec_rsync(source, dest) def update_grml_versions(iso_mount, target): @@ -1189,6 +1005,9 @@ def copy_bootloader_files(iso_mount, target, grml_flavour): logging.critical(" ... either use grml releases >=2009.10 or switch to an older grml2usb version.") raise + if not os.path.exists(iso_mount + '/boot/grub/footer.cfg'): + logging.warning("Warning: Grml releases older than 2011.12 support only one flavour in grub.") + for expr in name, 'distri.cfg', \ defaults_file, 'grml.png', 'hd.cfg', 'isolinux.cfg', 'isolinux.bin', \ 'isoprompt.cfg', 'options.cfg', \ @@ -1205,12 +1024,7 @@ def copy_bootloader_files(iso_mount, target, grml_flavour): search_and_copy('hidden.cfg', iso_mount + source_dir, syslinux_target + "new_" + 'hidden.cfg') # copy all grub files from ISO - glob_and_copy(iso_mount + '/boot/grub/*.mod', grub_target) - glob_and_copy(iso_mount + '/boot/grub/*.lst', grub_target) - glob_and_copy(iso_mount + '/boot/grub/*.img', grub_target) - glob_and_copy(iso_mount + '/boot/grub/*.pf2', grub_target) # fonts for splash - glob_and_copy(iso_mount + '/boot/grub/*.png', grub_target) # splash image - glob_and_copy(iso_mount + '/boot/grub/stage*', grub_target) + glob_and_copy(iso_mount + '/boot/grub/*', grub_target) def install_iso_files(grml_flavour, iso_mount, device, target): """Copy files from ISO to given target @@ -1285,73 +1099,6 @@ def identify_grml_flavour(mountpath): return flavours -def modify_grub_config(filename): - """Adjust bootoptions for a grub file - - @filename: filename to modify - """ - if options.removeoption: - regexe = [] - for regex in options.removeoption: - regexe.append(re.compile(r'%s' % regex)) - - option_re = re.compile(r'(.*/boot/release/.*(linux26|vmlinuz).*)') - - 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_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.cfg)") - - global GRML_DEFAULT - - # install main configuration only *once*, no matter how many ISOs we have: - install_main_config = True - 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 re.match(main_identifier, string): - install_main_config = False - if install_main_config: - grub2_config_file = open(grub2_cfg, 'w') - GRML_DEFAULT = grml_flavour - 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 GRML_DEFAULT != grml_flavour: - 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) - - def get_bootoptions(grml_flavour): """Returns bootoptions for specific flavour @@ -1373,14 +1120,35 @@ def handle_grub_config(grml_flavour, device, target): @device: device/partition where grub should be installed to @target: path of grub's configuration files""" - logging.debug("Generating grub configuration") + global UUID + + logging.debug("Updating grub configuration") grub_target = target + '/boot/grub/' + bootid_re = re.compile("bootid=[\w_-]+") + live_media_path_re = re.compile("live-media-path=[\w_/-]+") + bootopt = get_bootoptions(grml_flavour) - # write grub.cfg - handle_grub2_config(grml_flavour, grub_target, bootopt) + remove_regexes = [] + option_re = re.compile(r'(.*/boot/.*(linux26|vmlinuz).*)') + + if options.removeoption: + for regex in options.removeoption: + remove_regexes.append(re.compile(regex)) + + for filename in glob.glob(grub_target + '*.cfg'): + for line in fileinput.input(filename, inplace=1): + line = line.rstrip("\r\n") + if option_re.search(line): + line = bootid_re.sub('', line) + line = live_media_path_re.sub('', line) + line = line.rstrip() + r' live-media-path=/live/%s/ bootid=%s %s ' % (grml_flavour, UUID, bootopt) + for regex in remove_regexes: + line = regex.sub(' ', line) + print line + fileinput.close() def initial_syslinux_config(target): @@ -1431,8 +1199,7 @@ def adjust_syslinux_bootoptions(src, flavour): @flavour: grml flavour """ - append_re = re.compile("^(\s*append.*/boot/release.*)$", re.I) - boot_re = re.compile("/boot/([a-zA-Z0-9_]+/)+([a-zA-Z0-9._]+)") + append_re = re.compile("^(\s*append.*/boot/.*)$", re.I) # flavour_re = re.compile("(label.*)(grml\w+)") default_re = re.compile("(default.cfg)") bootid_re = re.compile("bootid=[\w_-]+") @@ -1443,13 +1210,12 @@ def adjust_syslinux_bootoptions(src, flavour): regexe = [] option_re = None if options.removeoption: - option_re = re.compile(r'/boot/release/.*/(initrd.gz|initrd.img)') + option_re = re.compile(r'/boot/.*/(initrd.gz|initrd.img)') for regex in options.removeoption: regexe.append(re.compile(r'%s' % regex)) for line in fileinput.input(src, inplace=1): - line = boot_re.sub(r'/boot/release/%s/\2 ' % flavour.replace('-', ''), line) # line = flavour_re.sub(r'\1 %s-\2' % flavour, line) line = default_re.sub(r'%s-\1' % flavour, line) line = bootid_re.sub('', line) @@ -1492,7 +1258,7 @@ def add_syslinux_entry(filename, grml_flavour): data.close() def modify_filenames(grml_flavour, target, filenames): - """Replace the standarf filenames with the new ones + """Replace the standard filenames with the new ones @grml_flavour: grml-flavour strin @target: directory where the files are located @@ -1569,7 +1335,7 @@ def handle_syslinux_config(grml_flavour, target): entry = 'include %s\n' % new_default defaults_file = '%s/defaults.cfg' % syslinux_target new_default_with_path = "%s/%s" % (syslinux_target, new_default) - new_grml_cfg = "%s/%s_grml.cfg" % ( syslinux_target, flavour_filename) + new_grml_cfg = "%s/%s_grml.cfg" % (syslinux_target, flavour_filename) if os.path.isfile(defaults_file): @@ -1858,6 +1624,11 @@ def check_programs(): logging.critical("Fatal: rsync not available, can not continue - sorry.") sys.exit(1) +def load_loop(): + """Runs modprobe loop and throws away it's output""" + proc = subprocess.Popen(["modprobe", "loop"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + proc.wait() + def main(): """Main function [make pylint happy :)]""" @@ -1876,6 +1647,8 @@ def main(): check_options(options) + load_loop() + logging.info("Executing grml2usb version %s", PROG_VERSION) if options.dryrun: