X-Git-Url: http://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=457346a4287535b99edc0c4a6aa4a2c54d32a73b;hp=7d67047797f35162bfc4905292fba3acf210e118;hb=487e2141208b2ebaef9f85c69c41b631f778274c;hpb=579dda2838a24e1b71d11b9041264a8c3ecbbc82 diff --git a/grml2usb b/grml2usb index 7d67047..457346a 100755 --- 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 @@ -1087,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/' @@ -1327,7 +1350,7 @@ def initial_syslinux_config(target): def adjust_syslinux_bootoptions(src_name, dst_name, flavour): append_re = re.compile("^(\s*append.*)$", re.I) - boot_re = re.compile("/boot/([a-zA-Z0-9_]+/)+(\w+)") + boot_re = re.compile("/boot/([a-zA-Z0-9_]+/)+([a-zA-Z0-9._]+)") flavour_re = re.compile("(label.*)(grml\w+)") default_re = re.compile("(default.cfg)") src = open(src_name, "r") @@ -1344,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() @@ -1386,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)