X-Git-Url: https://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=c3d7beb63c547f0a68ea48963992b3944e258bf2;hp=1f7333606a1b5a07f6780dbcd6f09f541c71100a;hb=3d76d27db540095900c011d91a7a7496fd594702;hpb=6bde51b09eda2d85792b357fd6038cac5a0b3755 diff --git a/grml2usb b/grml2usb index 1f73336..c3d7beb 100755 --- a/grml2usb +++ b/grml2usb @@ -30,7 +30,7 @@ USAGE = "Usage: %prog [options] <[ISO[s] | /live/image]> \n\ Make sure you have at least one grml ISO or a running grml system (/live/image),\n\ grub or syslinux and root access.\n\ \n\ -Execute %prog --help for usage hints, further information can be found in: man grml2usb" +Run %prog --help for usage hints, further information via: man grml2usb" # pylint: disable-msg=C0103 parser = OptionParser(usage=USAGE) @@ -216,6 +216,10 @@ def mkfs_fat16(device): @device: partition that should be formated""" # syslinux -d boot/isolinux /dev/sdb1 + if options.dryrun: + logging.info("Would execute mkfs.vfat -F 16 %s now.", device) + return 0 + logging.info("Formating partition with fat16 filesystem") logging.debug("mkfs.vfat -F 16 %s" % device) proc = subprocess.Popen(["mkfs.vfat", "-F", "16", device]) @@ -593,7 +597,7 @@ def install_grub(device): if options.dryrun: logging.info("Would execute grub-install [--root-directory=mount_point] %s now.", device) else: - device_mountpoint = tempfile.mkdtemp() + device_mountpoint = tempfile.mkdtemp(prefix="grml2usb") register_tmpfile(device_mountpoint) try: mount(device, device_mountpoint, "") @@ -837,6 +841,10 @@ def mount(source, target, mount_options): if x.startswith(source): raise CriticalException("Error executing mount: %s already mounted - please unmount before invoking grml2usb" % source) + if os.path.isdir(source): + logging.debug("Source %s is not a device, not mounting therefor." % source) + return 0 + logging.debug("mount %s %s %s" % (mount_options, source, target)) proc = subprocess.Popen(["mount"] + list(mount_options) + [source, target]) proc.wait() @@ -902,7 +910,7 @@ def check_for_fat(partition): if udev_info.returncode == 2: raise CriticalException("Failed to read device %s" - " (wrong UID/permissions or device not present?)" % partition) + " (wrong UID/permissions or device/directory not present?)" % partition) if options.syslinux and filesystem != "vfat": raise CriticalException("Partition %s does not contain a FAT16 filesystem. (Use --fat16 or run mkfs.vfat %s)" % (partition, partition)) @@ -1023,7 +1031,7 @@ def copy_addons(iso_mount, target): # grub all-in-one image allinoneimg = search_file('allinone.img', iso_mount) if allinoneimg is None: - logging.warn("Warning: allinone.img not found - can not install it") + logging.warn("Warning: allinone.img not found (that's fine if you don't need it") else: logging.debug("cp %s %s" % (allinoneimg, addons + '/allinone.img')) proc = subprocess.Popen(["cp", allinoneimg, addons + 'allinone.img']) @@ -1032,7 +1040,7 @@ def copy_addons(iso_mount, target): # bsd imag bsdimg = search_file('bsd4grml', iso_mount) if bsdimg is None: - logging.warn("Warning: bsd4grml not found - can not install it") + logging.warn("Warning: bsd4grml not found (that's fine if you don't need it") else: logging.debug("cp -a %s %s" % (bsdimg, addons + '/')) proc = subprocess.Popen(["cp", "-a", bsdimg, addons + '/']) @@ -1041,7 +1049,7 @@ def copy_addons(iso_mount, target): # freedos image balderimg = search_file('balder10.imz', iso_mount) if balderimg is None: - logging.warn("Warning: balder10.imz not found - can not install it") + logging.warn("Warning: balder10.imz not found (that's fine if you don't need it") else: logging.debug("cp %s %s" % (balderimg, addons + '/balder10.imz')) proc = subprocess.Popen(["cp", balderimg, addons + 'balder10.imz']) @@ -1050,7 +1058,7 @@ def copy_addons(iso_mount, target): # memdisk image memdiskimg = search_file('memdisk', iso_mount) if memdiskimg is None: - logging.warn("Warning: memdisk not found - can not install it") + logging.warn("Warning: memdisk not found (that's fine if you don't need it") else: logging.debug("cp %s %s" % (memdiskimg, addons + '/memdisk')) proc = subprocess.Popen(["cp", memdiskimg, addons + 'memdisk']) @@ -1059,7 +1067,7 @@ def copy_addons(iso_mount, target): # memtest86+ image memtestimg = search_file('memtest', iso_mount) if memtestimg is None: - logging.warn("Warning: memtest not found - can not install it") + logging.warn("Warning: memtest not found (that's fine if you don't need it") else: logging.debug("cp %s %s" % (memtestimg, addons + '/memtest')) proc = subprocess.Popen(["cp", memtestimg, addons + 'memtest']) @@ -1118,6 +1126,7 @@ def install_iso_files(grml_flavour, iso_mount, device, target): @grml_flavour: name of grml flavour the configuration should be generated for @iso_mount: path where a grml ISO is mounted on + @device: device/partition where bootloader should be installed to @target: path where grml's main files should be copied to""" # TODO => several improvements: @@ -1126,7 +1135,6 @@ def install_iso_files(grml_flavour, iso_mount, device, target): # * catch "install: .. No space left on device" & CO if options.dryrun: - logging.info("Would copy files to %s", iso_mount) return 0 elif not options.bootloaderonly: logging.info("Copying files. This might take a while....") @@ -1134,12 +1142,15 @@ def install_iso_files(grml_flavour, iso_mount, device, target): copy_grml_files(iso_mount, target) if not options.skipaddons: - copy_addons(iso_mount, target) + if grml_flavour.endswith('-small'): + logging.info("Note: grml-small doesn't provide any addons, not installing them therefor.") + else: + copy_addons(iso_mount, target) if not options.copyonly: copy_bootloader_files(iso_mount, target) - if not options.dryrun: + if not options.dryrun and not os.path.isdir(device): handle_bootloader_config(grml_flavour, device, target) # make sure we sync filesystems before returning @@ -1217,7 +1228,7 @@ def handle_grub1_config(grml_flavour, install_partition, grub_target, bootopt): 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( ) + grub1_config_file.close() def handle_grub2_config(grml_flavour, install_partition, grub_target, bootopt): @@ -1233,20 +1244,24 @@ def handle_grub2_config(grml_flavour, install_partition, grub_target, bootopt): logging.debug("Creating grub2 configuration file (grub.lst)") # 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') logging.info("Note: grml flavour %s is being installed as the default booting system." % grml_flavour) + grub_flavour_is_default = True grub2_config_file.write(generate_main_grub2_config(grml_flavour, install_partition, bootopt)) grub2_config_file.close() else: grub2_config_file = open(grub2_cfg, 'w') logging.info("Note: grml flavour %s is being installed as the default booting system." % grml_flavour) + grub_flavour_is_default = True grub2_config_file.write(generate_main_grub2_config(grml_flavour, install_partition, 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() @@ -1257,9 +1272,11 @@ def handle_grub2_config(grml_flavour, install_partition, grub_target, bootopt): if grub_flavour_config: grub2_config_file = open(grub2_cfg, 'a') - logging.info("Note: you can boot flavour %s using '%s' on the commandline." % (grml_flavour, grml_flavour)) + # display only if the grml flavour isn't the default + if not grub_flavour_is_default: + logging.info("Note: you can boot flavour %s using '%s' on the commandline." % (grml_flavour, grml_flavour)) grub2_config_file.write(generate_flavour_specific_grub2_config(grml_flavour, install_partition, bootopt)) - grub2_config_file.close( ) + grub2_config_file.close() def handle_grub_config(grml_flavour, device, target): @@ -1278,6 +1295,8 @@ def handle_grub_config(grml_flavour, device, target): if device[-1:].isdigit(): install_grub1_partition = int(device[-1:]) - 1 install_grub2_partition = device[-1:] + else: + raise CriticalException("error validating partition schema (raw device?)") # do NOT write "None" in kernel cmdline if options.bootoptions is None: @@ -1310,25 +1329,27 @@ def handle_syslinux_config(grml_flavour, target): syslinux_cfg = syslinux_target + 'syslinux.cfg' # install main configuration only *once*, no matter how many ISOs we have: + syslinux_flavour_is_default = False if os.path.isfile(syslinux_cfg): string = open(syslinux_cfg).readline() main_identifier = re.compile(".*main config generated at: %s.*" % re.escape(str(DATESTAMP))) if not re.match(main_identifier, string): syslinux_config_file = open(syslinux_cfg, 'w') logging.info("Note: grml flavour %s is being installed as the default booting system." % grml_flavour) + syslinux_flavour_is_default = True syslinux_config_file.write(generate_main_syslinux_config(grml_flavour, bootopt)) syslinux_config_file.close() else: syslinux_config_file = open(syslinux_cfg, 'w') + logging.info("Note: grml flavour %s is being installed as the default booting system." % grml_flavour) + syslinux_flavour_is_default = True syslinux_config_file.write(generate_main_syslinux_config(grml_flavour, bootopt)) syslinux_config_file.close() # install flavour specific configuration only *once* as well - # kind of ugly - I'm pretty sure this could be smoother... syslinux_flavour_config = True if os.path.isfile(syslinux_cfg): string = open(syslinux_cfg).readlines() - logging.info("Note: you can boot flavour %s using '%s' on the commandline." % (grml_flavour, grml_flavour)) flavour = re.compile("grml2usb for %s: %s" % (re.escape(grml_flavour), re.escape(str(DATESTAMP)))) for line in string: if flavour.match(line): @@ -1336,13 +1357,16 @@ def handle_syslinux_config(grml_flavour, target): if syslinux_flavour_config: syslinux_config_file = open(syslinux_cfg, 'a') + # display only if the grml flavour isn't the default + if not syslinux_flavour_is_default: + logging.info("Note: you can boot flavour %s using '%s' on the commandline." % (grml_flavour, grml_flavour)) syslinux_config_file.write(generate_flavour_specific_syslinux_config(grml_flavour, bootopt)) - syslinux_config_file.close( ) + syslinux_config_file.close() logging.debug("Generating isolinux/syslinux splash %s" % syslinux_target + 'boot.msg') isolinux_splash = open(syslinux_target + 'boot.msg', 'w') isolinux_splash.write(generate_isolinux_splash(grml_flavour)) - isolinux_splash.close( ) + isolinux_splash.close() def handle_bootloader_config(grml_flavour, device, target): @@ -1355,7 +1379,11 @@ def handle_bootloader_config(grml_flavour, device, target): if options.syslinux: handle_syslinux_config(grml_flavour, target) else: - handle_grub_config(grml_flavour, device, target) + try: + handle_grub_config(grml_flavour, device, target) + except CriticalException, error: + logging.critical("Fatal: %s" % error) + sys.exit(1) def handle_iso(iso, device): @@ -1370,7 +1398,7 @@ def handle_iso(iso, device): logging.critical("TODO: /live/image handling not yet implemented - sorry") sys.exit(1) - iso_mountpoint = tempfile.mkdtemp() + iso_mountpoint = tempfile.mkdtemp(prefix="grml2usb") register_tmpfile(iso_mountpoint) remove_iso_mountpoint = True @@ -1391,7 +1419,7 @@ def handle_iso(iso, device): remove_device_mountpoint = False # skip_mbr = True else: - device_mountpoint = tempfile.mkdtemp() + device_mountpoint = tempfile.mkdtemp(prefix="grml2usb") register_tmpfile(device_mountpoint) remove_device_mountpoint = True try: @@ -1414,10 +1442,14 @@ def handle_iso(iso, device): os.rmdir(iso_mountpoint) unregister_tmpfile(iso_mountpoint) if remove_device_mountpoint: - unmount(device_mountpoint, "") - if os.path.isdir(device_mountpoint): - os.rmdir(device_mountpoint) - unregister_tmpfile(device_mountpoint) + try: + unmount(device_mountpoint, "") + if os.path.isdir(device_mountpoint): + os.rmdir(device_mountpoint) + unregister_tmpfile(device_mountpoint) + except CriticalException, error: + logging.critical("Fatal: %s" % error) + cleanup() def handle_mbr(device): @@ -1425,9 +1457,13 @@ def handle_mbr(device): @device: device where the MBR should be installed to""" + if options.dryrun: + logging.info("Would install MBR") + return 0 + # make sure we have syslinux available if not options.skipmbr: - if not which("syslinux") and not options.copyonly and not options.dryrun: + if not which("syslinux") and not options.copyonly: logging.critical('Sorry, syslinux not available. Exiting.') logging.critical('Please install syslinux or consider using the --grub option.') sys.exit(1) @@ -1485,7 +1521,7 @@ def handle_vfat(device): logging.critical("Execution failed: %s", error) sys.exit(1) - if not check_for_usbdevice(device): + if not check_for_usbdevice(device) and not os.path.isdir(device): print "Warning: the specified device %s does not look like a removable usb device." % device f = raw_input("Do you really want to continue? y/N ") if f == "y" or f == "Y": @@ -1534,6 +1570,8 @@ def handle_bootloader(device): # Install bootloader only if not using the --copy-only option if options.copyonly: logging.info("Not installing bootloader and its files as requested via option copyonly.") + elif os.path.isdir(device): + logging.info("Not installing bootloader as %s is a directory." % device) else: install_bootloader(device) @@ -1561,13 +1599,15 @@ def main(): device = args[len(args) - 1] isos = args[0:len(args) - 1] - if device[-1:].isdigit(): - if int(device[-1:]) > 4: - logging.critical("Fatal: installation on partition number >4 not supported. (BIOS won't support it.)") - sys.exit(1) - else: - logging.critical("Fatal: installation on raw device not supported. (BIOS won't support it.)") - sys.exit(1) + if not os.path.isdir(device): + if device[-1:].isdigit(): + if int(device[-1:]) > 4: + logging.critical("Fatal: installation on partition number >4 not supported. (BIOS won't support it.)") + sys.exit(1) + else: + if os.path.exists(device): + logging.critical("Fatal: installation on raw device not supported. (BIOS won't support it.)") + sys.exit(1) # provide upgrade path handle_compat_warning(device) @@ -1580,7 +1620,8 @@ def main(): handle_iso(iso, device) # install mbr - handle_mbr(device) + if not os.path.isdir(device): + handle_mbr(device) handle_bootloader(device)