Add check for older ISOs which do not ship default.cfg
[grml2usb.git] / grml2usb
index dc63b1b..632134e 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -88,6 +88,21 @@ class CriticalException(Exception):
     pass
 
 
+# The following two functions help to operate on strings as
+# array (list) of bytes (octets). In Python 3000, the bytes
+# datatype will need to be used. This is intended for using
+# with manipulation of files on the octet level, like shell
+# arrays, e.g. in MBR creation.
+
+def array2string(a):
+    """Convert a list of integers [0;255] to a string."""
+    return struct.pack("%sB" % len(a), *a)
+
+def string2array(s):
+    """Convert a (bytes) string into a list of integers."""
+    return struct.unpack("%sB" % len(s), s)
+
+
 def cleanup():
     """Cleanup function to make sure there aren't any mounted devices left behind.
     """
@@ -525,7 +540,7 @@ def generate_flavour_specific_syslinux_config(grml_flavour):
 
     return("""\
 menu begin grml %(grml_flavour)s
-    menu title Grml %(grml_flavour)s
+    menu title %(grml_flavour)s
     label mainmenu
     menu label ^Back to main menu...
     menu exit
@@ -955,6 +970,7 @@ def copy_system_files(grml_flavour, iso_mount, target):
     filesystem_module = search_file('filesystem.module', iso_mount)
     if filesystem_module is None:
         logging.critical("Fatal: filesystem.module not found")
+        raise CriticalException("error locating filesystem.module file")
     else:
         exec_rsync(filesystem_module, squashfs_target + 'filesystem.module')
 
@@ -964,12 +980,14 @@ def copy_system_files(grml_flavour, iso_mount, target):
     kernel = search_file('linux26', iso_mount)
     if kernel is None:
         logging.critical("Fatal kernel not found")
+        raise CriticalException("error locating kernel file")
     else:
         exec_rsync(kernel, release_target + '/linux26')
 
     initrd = search_file('initrd.gz', iso_mount)
     if initrd is None:
         logging.critical("Fatal: initrd not found")
+        raise CriticalException("error locating initrd file")
     else:
         exec_rsync(initrd, release_target + '/initrd.gz')
 
@@ -1084,8 +1102,16 @@ def copy_bootloader_files(iso_mount, target):
         bootsplash = search_file(ffile, iso_mount)
         exec_rsync(bootsplash, syslinux_target + ffile)
 
-    for filename in 'addons.cfg', 'default.cfg', 'distri.cfg', 'hidden.cfg', 'grml.cfg', 'grml.png', 'hd.cfg', 'isoprompt.cfg', 'options.cfg','vesamenu.c32', 'vesamenu.cfg', 'grml.png':
-        path = search_file(filename, iso_mount)
+    if not search_file('default.cfg', iso_mount + '/boot/isolinux/'):
+        logging.critical("Fatal: file default.cfg could not be found.")
+        logging.critical("Note:  this grml2usb version requires an ISO generated by grml-live >=0.9.24 ...")
+        logging.critical("       ... either use grml releases >=2009.10 or switch to an older grml2usb version.")
+        raise
+
+    for filename in 'addons.cfg', 'default.cfg', 'distri.cfg', 'hidden.cfg', \
+                    'grml.cfg', 'grml.png', 'hd.cfg', 'isoprompt.cfg', 'options.cfg', \
+                    'vesamenu.c32', 'vesamenu.cfg', 'grml.png':
+        path = search_file(filename, iso_mount + '/boot/isolinux/')
         exec_rsync(path, syslinux_target + filename)
 
     grub_target = target + '/boot/grub/'
@@ -1341,7 +1367,18 @@ def adjust_syslinux_bootoptions(src_name, dst_name, flavour):
 
 
 def add_syslinux_entry(filename, grml_flavour):
-    data = open(filename, "a")
+    data = open(filename, "a+")
+    entry_filename = "option-%s.cfg" % grml_flavour
+    entry = "include %s\n" % entry_filename
+    path = os.path.dirname(filename)
+    for line in data:
+        if line == entry:
+            break
+    else:
+        data.write(entry)
+
+    data.close()
+    data = open(path + "/" + entry_filename, "w")
     data.write(generate_flavour_specific_syslinux_config(grml_flavour))
     data.close()
 
@@ -1383,8 +1420,14 @@ def handle_syslinux_config(grml_flavour, target):
 
     new_hidden =  "%s-hidden.cfg" % (grml_flavour)
     new_default = "%s-default.cfg" % (grml_flavour)
-    default_file = open("%s/defaults.cfg" % syslinux_target, "a")
-    default_file.write("include %s\n" % new_default)
+    default_file = open("%s/defaults.cfg" % syslinux_target, "a+")
+    entry = "include %s\n" % new_default
+    for line in default_file:
+        if line == entry:
+            break
+    else:
+        default_file.write("include %s\n" % new_default)
+
     default_file.close()
     add_syslinux_entry("%s/additional.cfg" % syslinux_target, grml_flavour)