Mention /lib/live/mount/medium for new live path + adjust ISO versions
[grml2usb.git] / grml2usb
index 77e72ad..3ca38a5 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -60,10 +60,10 @@ def grub_option(option, opt, value, opt_parser):
     setattr(opt_parser.values, 'syslinux', False)
 
 # cmdline parsing
-USAGE = "Usage: %prog [options] <[ISO[s] | /live/image]> </dev/sdX#>\n\
+USAGE = "Usage: %prog [options] <[ISO[s] | /lib/live/mount/medium]> </dev/sdX#>\n\
 \n\
-%prog installs grml ISO[s] to an USB device to be able to boot from it.\n\
-Make sure you have at least one grml ISO or a running grml system (/live/image),\n\
+%prog installs Grml ISO[s] to an USB device to be able to boot from it.\n\
+Make sure you have at least one Grml ISO or a running Grml system (/lib/live/mount/medium),\n\
 grub or syslinux and root access.\n\
 \n\
 Run %prog --help for usage hints, further information via: man grml2usb"
@@ -128,6 +128,12 @@ class CriticalException(Exception):
     @Exception: message"""
     pass
 
+class VerifyException(Exception):
+    """Throw critical exception if there is an fatal error when verifying something.
+
+    @Exception: message"""
+    pass
+
 
 # The following two functions help to operate on strings as
 # array (list) of bytes (octets). In Python 3000, the bytes
@@ -305,6 +311,23 @@ def check_uid_root():
         sys.exit("Error: please run this script with uid 0 (root).")
 
 
+def check_boot_flag(device):
+    if device[-1:].isdigit():
+        boot_dev = re.match(r'(.*?)\d*$', device).group(1)
+    else:
+        boot_dev = device
+
+    with open(boot_dev, 'r') as image:
+        data = image.read(512)
+        bootcode = data[440:]
+        if bootcode[6] == '\x80':
+            logging.debug("bootflag is enabled")
+        else:
+            logging.debug("bootflag is NOT enabled")
+            raise VerifyException("Device %s does not have the bootflag set. "
+                "Please enable it to be able to boot." % boot_dev)
+
+
 def mkfs_fat16(device):
     """Format specified device with VFAT/FAT16 filesystem.
 
@@ -1108,8 +1131,16 @@ def identify_grml_flavour(mountpath):
     version_files = search_file('grml-version', mountpath, lst_return=True)
 
     if not version_files:
-        logging.critical("Error: could not find grml-version file.")
-        raise
+        if mountpath.startswith("/lib/live/mount/medium"):
+            logging.critical("Error: could not find grml-version file.")
+            logging.critical("Looks like your system is running from RAM but required files are not available.")
+            logging.critical("Please either boot without toram=... or use boot option toram instead of toram=...")
+            cleanup()
+            sys.exit(1)
+        else:
+            logging.critical("Error: could not find grml-version file.")
+            cleanup()
+            sys.exit(1)
 
     flavours = []
     logging.debug("version_files = %s", version_files)
@@ -1454,12 +1485,12 @@ def install(image, device):
 def install_grml(mountpoint, device):
     """Main logic for copying files of the currently running grml system.
 
-    @mountpoin: directory where currently running live system resides (usually /live/image)
+    @mountpoint: directory where currently running live system resides (usually /lib/live/mount/medium)
     @device: partition where the specified ISO should be installed to"""
 
     device_mountpoint = device
     if os.path.isdir(device):
-        logging.info("Specified device is not a directory, therefore not mounting.")
+        logging.info("Specified device is a directory, therefore not mounting.")
         remove_device_mountpoint = False
     else:
         device_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
@@ -1467,7 +1498,11 @@ def install_grml(mountpoint, device):
         remove_device_mountpoint = True
         try:
             check_for_fat(device)
+            check_boot_flag(device)
             mount(device, device_mountpoint, ['-o', 'utf8,iocharset=iso8859-1'])
+        except VerifyException, error:
+            logging.critical("Fatal: %s", error)
+            raise
         except CriticalException, error:
             try:
                 mount(device, device_mountpoint, "")