X-Git-Url: https://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=217020dedcf6bdc6b8c72dd63a3003c008d7ab96;hp=e85d5745273eb9adc5bc25bf6aaff4092aab596e;hb=5d028a0bf6d7dd63f8e897013f7530185ea6a85c;hpb=b79a4cc0cfb42be3f9f4aa33993f928bffedd692 diff --git a/grml2usb b/grml2usb index e85d574..217020d 100755 --- a/grml2usb +++ b/grml2usb @@ -7,7 +7,7 @@ grml2usb This script installs a grml system (either a running system or ISO[s]) to a USB device -:copyright: (c) 2009 by Michael Prokop +:copyright: (c) 2009, 2010, 2011 by Michael Prokop :license: GPL v2 or any later version :bugreports: http://grml.org/bugs/ @@ -22,19 +22,20 @@ import uuid import struct # global variables -PROG_VERSION = "0.9.27~git" +PROG_VERSION = "0.9.31" MOUNTED = set() # register mountpoints TMPFILES = set() # register tmpfiles DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg GRML_FLAVOURS = set() # which flavours are being installed? GRML_DEFAULT = None UUID = None +SYSLINUX_LIBS = "/usr/lib/syslinux/" def syslinux_warning(option, opt, value, opt_parser): """A helper function for printing a warning about deprecated option """ # pylint: disable-msg=W0613 - sys.stderr.write("Note: the --syslinux option is deprecated as syslinux " + + sys.stderr.write("Note: the --syslinux option is deprecated as syslinux " "is grml2usb's default. Continuing anyway.\n") setattr(opt_parser.values, option.dest, True) @@ -59,7 +60,7 @@ Run %prog --help for usage hints, further information via: man grml2usb" # pylint: disable-msg=W0603 parser = OptionParser(usage=USAGE) parser.add_option("--bootoptions", dest="bootoptions", - action="store", type="string", + action="append", type="string", help="use specified bootoptions as default") parser.add_option("--bootloader-only", dest="bootloaderonly", action="store_true", help="do not copy files but just install a bootloader") @@ -323,7 +324,7 @@ if loadfont /boot/grub/ascii.pf2 ; then set gfxmode=640x480 insmod gfxterm insmod vbe - if terminal_output.gfxterm ; then true ; else + if terminal_output gfxterm ; then true ; else # For backward compatibility with versions of terminal.mod that don't # understand terminal_output terminal gfxterm @@ -358,17 +359,48 @@ menuentry "Boot FreeDOS" { initrd /boot/addons/balder10.imz } -menuentry "Boot MirOS bsd4grml" { - multiboot /boot/addons/bsd4grml/ldbsd.com - module /boot/addons/bsd4grml/bsd.rd - module /boot/addons/bsd4grml/boot.1 - module /boot/addons/bsd4grml/boot.2 - module /boot/addons/bsd4grml/boot.3 - module /boot/addons/bsd4grml/boot.4 - module /boot/addons/bsd4grml/boot.5 - module /boot/addons/bsd4grml/boot.6 - module /boot/addons/bsd4grml/boot.cfg -} +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) @@ -447,107 +479,6 @@ menuentry "%(grml_flavour)s-forensic - do not touch harddisks during hw recogn 'flavour_filename': grml_flavour.replace('-', ''), 'uid': UUID, 'bootoptions': bootoptions } ) - -def generate_flavour_specific_grub1_config(grml_flavour, install_partition, bootoptions): - """Generate grub1 configuration for use via menu.lst - - @grml_flavour: name of grml flavour the configuration should be generated for - @install_partition: partition number for use in (hd0,X) - @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] -title %(grml_flavour)s -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -title %(grml_flavour)s-persistent -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -title %(grml_flavour)s2ram -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s.squashfs bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -title %(grml_flavour)s-debug -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ debug initcall_debug bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -title %(grml_flavour)s-x -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ startx=wm-ng bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -title %(grml_flavour)s-nofb -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=ofonly bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -title %(grml_flavour)s-failsafe -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal noautoconfig atapicd noapic noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia nosmp maxcpus=0 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm noresume selinux=0 edd=off pci=nomsi bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -title %(grml_flavour)s-forensic -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ nofstab noraid nolvm noautoconfig noswap raid=noautodetect forensic readonly bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] -title %(grml_flavour)s-serial -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=vesafb:off console=tty1 console=ttyS0,9600n8 bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, - 'flavour_filename': grml_flavour.replace('-', ''), 'uid': UUID, - 'bootoptions': bootoptions, 'install_partition': install_partition } ) - - -def generate_main_grub1_config(grml_flavour, install_partition, bootoptions): - """Generate grub1 configuration for use via menu.lst - - @grml_flavour: name of grml flavour the configuration should be generated for""" - - local_datestamp = DATESTAMP - - return("""\ -## main grub1 configuration - generated by grml2usb [main config generated at: %(local_datestamp)s] -# misc options: -timeout 30 -# color red/blue green/black -splashimage=(hd0,%(install_partition)s)/boot/grub/splash.xpm.gz -foreground = 000000 -background = FFCC33 - -# define entries: -title %(grml_flavour)s - Default boot (using 1024x768 framebuffer) -kernel (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/linux26 apm=power-off vga=791 quiet boot=live nomce live-media-path=/live/%(grml_flavour)s/ bootid=%(uid)s %(bootoptions)s -initrd (hd0,%(install_partition)s)/boot/release/%(flavour_filename)s/initrd.gz - -title Memory test (memtest86+) -kernel (hd0,%(install_partition)s)/boot/addons/memtest - -title Grub - all in one image -kernel (hd0,%(install_partition)s)/boot/addons/memdisk -initrd (hd0,%(install_partition)s)/boot/addons/allinone.img - -title FreeDOS -kernel (hd0,%(install_partition)s)/boot/addons/memdisk -initrd (hd0,%(install_partition)s)/boot/addons/balder10.imz - -title MirOS BSD -kernel (hd0,%(install_partition)s)/boot/addons/bsd4grml/ldbsd.com - -""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, - 'flavour_filename': grml_flavour.replace('-', ''), 'uid': UUID, - 'bootoptions': bootoptions, 'install_partition': install_partition } ) - - def generate_isolinux_splash(grml_flavour): """Generate bootsplash for isolinux/syslinux @@ -649,12 +580,16 @@ def install_grub(device): grub_device = device logging.info("Installing grub as bootloader") - logging.debug("grub-install --recheck --force --no-floppy --root-directory=%s %s", - device_mountpoint, grub_device) - proc = subprocess.Popen(["grub-install", "--recheck", "--force", "--no-floppy", - "--root-directory=%s" % device_mountpoint, grub_device], - stdout=file(os.devnull, "r+")) - proc.wait() + for opt in ["", "--force" ]: + logging.debug("grub-install --recheck %s --no-floppy --root-directory=%s %s", + opt, device_mountpoint, grub_device) + proc = subprocess.Popen(["grub-install", "--recheck", opt, "--no-floppy", + "--root-directory=%s" % device_mountpoint, grub_device], + stdout=file(os.devnull, "r+")) + proc.wait() + if proc.returncode == 0: + break + if proc.returncode != 0: # raise Exception("error executing grub-install") logging.critical("Fatal: error executing grub-install " @@ -1066,7 +1001,8 @@ def copy_system_files(grml_flavour, iso_mount, target): squashfs = search_file(grml_flavour + '.squashfs', iso_mount) if squashfs is None: - logging.critical("Fatal: squashfs file not found") + logging.critical("Fatal: squashfs file not found" + ", please check that your iso is not corrupt") raise CriticalException("error locating squashfs file") else: squashfs_target = target + '/live/' + grml_flavour + '/' @@ -1116,26 +1052,37 @@ def update_grml_versions(iso_mount, target): @target: path of the target mount point """ grml_target = target + '/grml/' - new_grml_version = search_file('grml-version', grml_target) - if new_grml_version: - orig_grml_version = search_file('grml-version', iso_mount) - if not orig_grml_version: - logging.warn("Warning: %s could not be found - can not install it", orig_grml_version) + target_grml_version_file = search_file('grml-version', grml_target) + if target_grml_version_file: + iso_grml_version_file = search_file('grml-version', iso_mount) + if not iso_grml_version_file: + logging.warn("Warning: %s could not be found - can not install it", iso_grml_version_file) return False try: - new_file = open(new_grml_version, 'a+') - new_flavours = [ get_flavour(l) for l in new_file.readlines() ] - - old_file = open(orig_grml_version, 'r') - old_lines = old_file.readlines() - for line in old_lines: - if not get_flavour(line) in new_flavours: - new_file.write(line) + # read the flavours from the iso image + iso_versions = {} + iso_file = open(iso_grml_version_file, 'r') + for line in iso_file: + iso_versions[get_flavour(line)] = line.strip() + + # update the existing flavours on the target + for line in fileinput.input([target_grml_version_file], inplace=1): + flavour = get_flavour(line) + if flavour in iso_versions.keys(): + print iso_versions.pop(flavour) + else: + print line.strip() + fileinput.close() + + target_file = open(target_grml_version_file, 'a') + # add the new flavours from the current iso + for flavour in iso_versions: + target_file.write("%s\n" % iso_versions[flavour]) except IOError: logging.warn("Warning: Could not write file") finally: - new_file.close() - old_file.close() + iso_file.close() + target_file.close() return True else: return False @@ -1157,7 +1104,7 @@ def copy_grml_files(iso_mount, target): for myfile in copy_files: grml_file = search_file(myfile, iso_mount) if grml_file is None: - logging.warn("Warning: myfile %s could not be found - can not install it", myfile) + logging.warn("Warning: file %s could not be found - can not install it", myfile) else: exec_rsync(grml_file, grml_target + myfile) @@ -1167,7 +1114,7 @@ def copy_grml_files(iso_mount, target): for myfile in 'index.html', 'style.css': grml_file = search_file(myfile, iso_mount) if grml_file is None: - logging.warn("Warning: myfile %s could not be found - can not install it") + logging.warn("Warning: file %s could not be found - can not install it", myfile) else: exec_rsync(grml_file, grml_web_target + myfile) @@ -1177,23 +1124,25 @@ def copy_grml_files(iso_mount, target): for myfile in 'button.png', 'favicon.png', 'linux.jpg', 'logo.png': grml_file = search_file(myfile, iso_mount) if grml_file is None: - logging.warn("Warning: myfile %s could not be found - can not install it") + logging.warn("Warning: file %s could not be found - can not install it", myfile) else: exec_rsync(grml_file, grml_webimg_target + myfile) -def handle_addon_copy(filename, dst, iso_mount): +def handle_addon_copy(filename, dst, iso_mount, ignore_errors=False): """handle copy of optional addons @filename: filename of the addon @dst: destination directory @iso_mount: location of the iso mount + @ignore_errors: don't report missing files """ file_location = search_file(filename, iso_mount) if file_location is None: - logging.warn("Warning: %s not found (that's fine if you don't need it)", filename) + if not ignore_errors: + logging.warn("Warning: %s not found (that's fine if you don't need it)", filename) else: - exec_rsync(file_location, dst + filename) + exec_rsync(file_location, dst) def copy_addons(iso_mount, target): @@ -1231,9 +1180,11 @@ def copy_addons(iso_mount, target): # memtest86+ image handle_addon_copy('memtest', addons, iso_mount) - # gpxe.lkrn - handle_addon_copy('gpxe.lkrn', addons, iso_mount) + # gpxe.lkrn: got replaced by ipxe + handle_addon_copy('gpxe.lkrn', addons, iso_mount, ignore_errors=True) + # ipxe.lkrn + handle_addon_copy('ipxe.lkrn', addons, iso_mount) def glob_and_copy(filepattern, dst): """Glob on specified filepattern and copy the result to dst @@ -1263,11 +1214,13 @@ def copy_if_exist(filename, dst): if filename and (os.path.isfile(filename) or os.path.isdir(filename)): exec_rsync(filename, dst) -def copy_bootloader_files(iso_mount, target): +def copy_bootloader_files(iso_mount, target, grml_flavour): """Copy grml's bootloader files to a given target @iso_mount: path where a grml ISO is mounted on - @target: path where grml's main files should be copied to""" + @target: path where grml's main files should be copied to + @grml_flavour: name of the current processed grml_flavour + """ syslinux_target = target + '/boot/syslinux/' execute(mkdir, syslinux_target) @@ -1295,8 +1248,8 @@ def copy_bootloader_files(iso_mount, target): if os.path.isfile(syslinux_target + 'ldlinux.sys'): os.unlink(syslinux_target + 'ldlinux.sys') - (source_dir, name) = get_defaults_file(iso_mount, GRML_DEFAULT, "default.cfg") - (source_dir, defaults_file) = get_defaults_file(iso_mount, GRML_DEFAULT, "grml.cfg") + (source_dir, name) = get_defaults_file(iso_mount, grml_flavour, "default.cfg") + (source_dir, defaults_file) = get_defaults_file(iso_mount, grml_flavour, "grml.cfg") if not source_dir: logging.critical("Fatal: file default.cfg could not be found.") @@ -1308,9 +1261,13 @@ def copy_bootloader_files(iso_mount, target): for expr in name, 'distri.cfg', \ defaults_file, 'grml.png', 'hd.cfg', 'isolinux.cfg', 'isolinux.bin', \ 'isoprompt.cfg', 'options.cfg', \ - 'prompt.cfg', 'vesamenu.c32', 'vesamenu.cfg', 'grml.png', '*.c32': + 'prompt.cfg', 'vesamenu.cfg', 'grml.png', '*.c32': glob_and_copy(iso_mount + source_dir + expr, syslinux_target) + for filename in glob.glob1(syslinux_target, "*.c32"): + copy_if_exist(os.path.join(SYSLINUX_LIBS, filename), syslinux_target) + + # copy the addons_*.cfg file to the new syslinux directory glob_and_copy(iso_mount + source_dir + 'addon*.cfg', syslinux_target) @@ -1348,7 +1305,7 @@ def install_iso_files(grml_flavour, iso_mount, device, target): @target: path where grml's main files should be copied to""" global GRML_DEFAULT - GRML_DEFAULT = grml_flavour + GRML_DEFAULT = GRML_DEFAULT or grml_flavour if options.dryrun: return 0 elif not options.bootloaderonly: @@ -1367,7 +1324,7 @@ def install_iso_files(grml_flavour, iso_mount, device, target): copy_addons(iso_mount, target) if not options.copyonly: - copy_bootloader_files(iso_mount, target) + copy_bootloader_files(iso_mount, target, grml_flavour) if not options.dryrun: handle_bootloader_config(grml_flavour, device, target) @@ -1433,55 +1390,6 @@ def modify_grub_config(filename): 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 @@ -1491,7 +1399,7 @@ def handle_grub2_config(grml_flavour, grub_target, bootopt): # grub2 config grub2_cfg = grub_target + 'grub.cfg' - logging.debug("Creating grub2 configuration file (grub.lst)") + logging.debug("Creating grub2 configuration file (grub.cfg)") global GRML_DEFAULT @@ -1539,10 +1447,10 @@ def get_bootoptions(grml_flavour): @grml_flavour: name of the grml_flavour """ # do NOT write "None" in kernel cmdline - if options.bootoptions is None: + if not options.bootoptions: bootopt = "" else: - bootopt = options.bootoptions + bootopt = " ".join(options.bootoptions) bootopt = bootopt.replace("%flavour", grml_flavour) return bootopt @@ -1558,19 +1466,8 @@ def handle_grub_config(grml_flavour, device, target): grub_target = target + '/boot/grub/' - if os.path.isdir(device): - install_grub1_partition = None - else: - if device[-1:].isdigit(): - install_grub1_partition = int(device[-1:]) - 1 - else: - raise CriticalException("error validating partition schema (raw device?)") - - bootopt = get_bootoptions(grml_flavour) - # write menu.lst - handle_grub1_config(grml_flavour, install_grub1_partition, grub_target, bootopt) # write grub.cfg handle_grub2_config(grml_flavour, grub_target, bootopt) @@ -1826,7 +1723,7 @@ def install(image, device): register_tmpfile(iso_mountpoint) remove_image_mountpoint = True try: - mount(image, iso_mountpoint, ["-o", "loop", "-t", "iso9660"]) + mount(image, iso_mountpoint, ["-o", "loop,ro", "-t", "iso9660"]) except CriticalException, error: logging.critical("Fatal: %s", error) sys.exit(1) @@ -1869,8 +1766,11 @@ def install_grml(mountpoint, device): try: grml_flavours = identify_grml_flavour(mountpoint) for flavour in set(grml_flavours): + if not flavour: + logging.warning("No valid flavour found, please check your iso") logging.info("Identified grml flavour \"%s\".", flavour) install_iso_files(flavour, mountpoint, device, device_mountpoint) + GRML_FLAVOURS.add(flavour) finally: if remove_device_mountpoint: remove_mountpoint(device_mountpoint) @@ -2028,6 +1928,24 @@ def check_options(opts): sys.exit(1) +def check_programs(): + """check if all needed programs are installed""" + if options.grub: + if not which("grub-install"): + logging.critical("Fatal: grub-install not available (please install the " + + "grub package or drop the --grub option)") + sys.exit(1) + + if options.syslinux: + if not which("syslinux"): + logging.critical("Fatal: syslinux not available (please install the " + + "syslinux package or use the --grub option)") + sys.exit(1) + + if not which("rsync"): + logging.critical("Fatal: rsync not available, can not continue - sorry.") + sys.exit(1) + def main(): """Main function [make pylint happy :)]""" @@ -2051,6 +1969,8 @@ def main(): if options.dryrun: logging.info("Running in simulation mode as requested via option dry-run.") + check_programs() + # specified arguments device = args[len(args) - 1] isos = args[0:len(args) - 1] @@ -2064,21 +1984,6 @@ def main(): logging.critical("Fatal: installation on raw device not supported. (BIOS won't support it.)") sys.exit(1) - if options.grub: - if not which("grub-install"): - logging.critical("Fatal: grub-install not available (please install the " - + "grub package or drop the --grub option)") - sys.exit(1) - - if options.syslinux: - if not which("syslinux"): - logging.critical("Fatal: syslinux not available (please install the " - + "syslinux package or use the --grub option)") - sys.exit(1) - - if not which("rsync"): - logging.critical("Fatal: rsync not available, can not continue - sorry.") - sys.exit(1) # provide upgrade path handle_compat_warning(device)