use sys.stdout.write instead of print to prevent additional newlines
[grml2usb.git] / grml2usb
index b9df22f..6ecc0aa 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -16,6 +16,7 @@ This script installs a grml system (either a running system or ISO[s]) to a USB
 from optparse import OptionParser
 from inspect import isroutine, isclass
 import datetime, logging, os, re, subprocess, sys, tempfile, time, os.path
 from optparse import OptionParser
 from inspect import isroutine, isclass
 import datetime, logging, os, re, subprocess, sys, tempfile, time, os.path
+import fileinput
 
 # global variables
 PROG_VERSION = "0.9.13-pre1"
 
 # global variables
 PROG_VERSION = "0.9.13-pre1"
@@ -49,6 +50,8 @@ parser.add_option("--fat16", dest="fat16", action="store_true",
                   help="format specified partition with FAT16")
 parser.add_option("--force", dest="force", action="store_true",
                   help="force any actions requiring manual interaction")
                   help="format specified partition with FAT16")
 parser.add_option("--force", dest="force", action="store_true",
                   help="force any actions requiring manual interaction")
+parser.add_option("--grub", dest="grub", action="store_true",
+                  help="install grub bootloader instead of (default) syslinux")
 parser.add_option("--grub-mbr", dest="grubmbr", action="store_true",
                   help="install grub into MBR instead of (default) PBR")
 parser.add_option("--lilo-binary", dest="lilobin",  action="store", type="string",
 parser.add_option("--grub-mbr", dest="grubmbr", action="store_true",
                   help="install grub into MBR instead of (default) PBR")
 parser.add_option("--lilo-binary", dest="lilobin",  action="store", type="string",
@@ -66,7 +69,7 @@ parser.add_option("--skip-mbr", dest="skipmbr", action="store_true",
 parser.add_option("--skip-syslinux-config", dest="skipsyslinuxconfig", action="store_true",
                   help="skip generation of syslinux configuration files")
 parser.add_option("--syslinux", dest="syslinux", action="store_true",
 parser.add_option("--skip-syslinux-config", dest="skipsyslinuxconfig", action="store_true",
                   help="skip generation of syslinux configuration files")
 parser.add_option("--syslinux", dest="syslinux", action="store_true",
-                  help="install syslinux bootloader instead of grub")
+                  help="install syslinux bootloader (deprecated as it's the default)")
 parser.add_option("--syslinux-mbr", dest="syslinuxmbr", action="store_true",
                   help="install syslinux master boot record (MBR) instead of default")
 parser.add_option("--verbose", dest="verbose", action="store_true",
 parser.add_option("--syslinux-mbr", dest="syslinuxmbr", action="store_true",
                   help="install syslinux master boot record (MBR) instead of default")
 parser.add_option("--verbose", dest="verbose", action="store_true",
@@ -88,6 +91,23 @@ class CriticalException(Exception):
     pass
 
 
     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.
     """
 def cleanup():
     """Cleanup function to make sure there aren't any mounted devices left behind.
     """
@@ -341,7 +361,7 @@ menuentry "%(grml_flavour)s2ram        - copy compressed grml file to RAM" {
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-debug      - enable debugging options" {
     set gfxpayload=1024x768x16,1024x768
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-debug      - enable debugging options" {
     set gfxpayload=1024x768x16,1024x768
-    linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ debug boot=live initcall_debug%(bootoptions)s
+    linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ debug initcall_debug%(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
@@ -360,7 +380,7 @@ menuentry "%(grml_flavour)s-nofb       - disable framebuffer" {
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-failsafe   - disable hardware detection" {
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-failsafe   - disable hardware detection" {
-    linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live 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 %(bootoptions)s
+    linux /boot/release/%(grml_flavour)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 %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
@@ -402,7 +422,7 @@ initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 title %(grml_flavour)s-debug
 
 ## 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/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ debug boot=live initcall_debug%(bootoptions)s
+kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ debug initcall_debug%(bootoptions)s
 initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
@@ -417,7 +437,7 @@ initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 title %(grml_flavour)s-failsafe
 
 ## 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/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live 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 %(bootoptions)s
+kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)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 %(bootoptions)s
 initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
@@ -514,6 +534,18 @@ include additional.cfg
 
 include options.cfg
 include addons.cfg
 
 include options.cfg
 include addons.cfg
+
+label help
+  include promptname.cfg
+  config prompt.cfg
+  text help
+                                        Jump to old style isolinux prompt
+                                        featuring further information
+                                        regarding available boot options.
+  endtext
+
+
+include hiddens.cfg
 """)
 
 
 """)
 
 
@@ -563,6 +595,7 @@ def install_grub(device):
                 else:
                     grub_device = device
 
                 else:
                     grub_device = device
 
+                logging.info("Installing grub as bootloader")
                 logging.debug("grub-install --recheck --no-floppy --root-directory=%s %s",
                     device_mountpoint, grub_device)
                 proc = subprocess.Popen(["grub-install", "--recheck", "--no-floppy",
                 logging.debug("grub-install --recheck --no-floppy --root-directory=%s %s",
                     device_mountpoint, grub_device)
                 proc = subprocess.Popen(["grub-install", "--recheck", "--no-floppy",
@@ -570,7 +603,7 @@ def install_grub(device):
                 proc.wait()
                 if proc.returncode != 0:
                     # raise Exception("error executing grub-install")
                 proc.wait()
                 if proc.returncode != 0:
                     # raise Exception("error executing grub-install")
-                    logging.critical("Fatal: error executing grub-install (please check the grml2usb FAQ or use --syslinux)")
+                    logging.critical("Fatal: error executing grub-install (please check the grml2usb FAQ or drop the --grub option)")
                     logging.critical("Note:  if using grub2 consider using the --grub-mbr option because grub2's PBR feature is broken.")
                     cleanup()
                     sys.exit(1)
                     logging.critical("Note:  if using grub2 consider using the --grub-mbr option because grub2's PBR feature is broken.")
                     cleanup()
                     sys.exit(1)
@@ -610,13 +643,9 @@ def install_bootloader(device):
 
     # by default we use grub, so install syslinux only on request
     if options.syslinux:
 
     # by default we use grub, so install syslinux only on request
     if options.syslinux:
-        try:
-            install_syslinux(device)
-        except CriticalException, error:
-            logging.critical("Fatal: %s", error)
-            cleanup()
-            sys.exit(1)
-    else:
+        logging.info("Note: the --syslinux option is deprecated as syslinux is grml2usb's default. Continuing anyway.")
+
+    if options.grub:
         if not which("grub-install"):
             logging.critical("Fatal: grub-install not available (please install the grub package or use the --syslinux option)")
             cleanup()
         if not which("grub-install"):
             logging.critical("Fatal: grub-install not available (please install the grub package or use the --syslinux option)")
             cleanup()
@@ -628,6 +657,13 @@ def install_bootloader(device):
                 logging.critical("Fatal: %s", error)
                 cleanup()
                 sys.exit(1)
                 logging.critical("Fatal: %s", error)
                 cleanup()
                 sys.exit(1)
+    else:
+        try:
+            install_syslinux(device)
+        except CriticalException, error:
+            logging.critical("Fatal: %s", error)
+            cleanup()
+            sys.exit(1)
 
 
 def execute_lilo(lilo, device):
 
 
 def execute_lilo(lilo, device):
@@ -659,7 +695,7 @@ def install_syslinux_mbr(device):
 
     # make sure we have syslinux available
     if not which("syslinux") and not options.copyonly:
 
     # make sure we have syslinux available
     if not which("syslinux") and not options.copyonly:
-        raise Exception("syslinux not available (either install it or consider dropping the --syslinux option)")
+        raise Exception("syslinux not available (either install it or consider using the --grub option)")
 
     # lilo's mbr is broken, use the one from syslinux instead:
     if not os.path.isfile("/usr/lib/syslinux/mbr.bin"):
 
     # lilo's mbr is broken, use the one from syslinux instead:
     if not os.path.isfile("/usr/lib/syslinux/mbr.bin"):
@@ -1083,14 +1119,31 @@ def copy_bootloader_files(iso_mount, target):
     logo = search_file('logo.16', iso_mount)
     exec_rsync(logo, syslinux_target + 'logo.16')
 
     logo = search_file('logo.16', iso_mount)
     exec_rsync(logo, syslinux_target + 'logo.16')
 
-    for ffile in 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10':
+    for ffile in ['f%d' % number for number in range(1,11) ]:
         bootsplash = search_file(ffile, iso_mount)
         exec_rsync(bootsplash, syslinux_target + ffile)
 
         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)
+    # avoid the "file is read only, overwrite anyway (y/n) ?" question
+    # of mtools by syslinux ("mmove -D o -D O s:/ldlinux.sys $target_file")
+    if os.path.isfile(syslinux_target + 'ldlinux.sys'):
+        os.unlink(syslinux_target + 'ldlinux.sys')
+
+    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', \
+                    'grml.cfg', 'grml.png', 'hd.cfg', 'isoprompt.cfg', 'options.cfg', \
+                    'prompt.cfg', 'vesamenu.c32', 'vesamenu.cfg', 'grml.png':
+        path = search_file(filename, iso_mount + '/boot/isolinux/')
         exec_rsync(path, syslinux_target + filename)
 
         exec_rsync(path, syslinux_target + filename)
 
+    path = search_file('hidden.cfg', iso_mount + '/boot/isolinux/')
+    exec_rsync(path, syslinux_target + "new-" + 'hidden.cfg')
+
+
     grub_target = target + '/boot/grub/'
     execute(mkdir, grub_target)
 
     grub_target = target + '/boot/grub/'
     execute(mkdir, grub_target)
 
@@ -1109,6 +1162,7 @@ def copy_bootloader_files(iso_mount, target):
     if os.path.isfile("/usr/share/grub/ascii.pf2"):
         exec_rsync('/usr/share/grub/ascii.pf2', grub_target + 'ascii.pf2')
 
     if os.path.isfile("/usr/share/grub/ascii.pf2"):
         exec_rsync('/usr/share/grub/ascii.pf2', grub_target + 'ascii.pf2')
 
+
 def install_iso_files(grml_flavour, iso_mount, device, target):
     """Copy files from ISO to given target
 
 def install_iso_files(grml_flavour, iso_mount, device, target):
     """Copy files from ISO to given target
 
@@ -1325,42 +1379,78 @@ def initial_syslinux_config(target):
     data.write(generate_main_syslinux_config())
     data.close
 
     data.write(generate_main_syslinux_config())
     data.close
 
-def adjust_syslinux_bootoptions(src_name, dst_name, flavour):
+    filename = target + "hiddens.cfg"
+    data = open(filename, "w")
+    data.write("include hidden.cfg\n")
+    data.close()
+
+def add_entry_if_not_present(filename, entry):
+    data = open(filename, "a+")
+    for line in data:
+        if line == entry:
+            break
+    else:
+        data.write(entry)
+
+    data.close()
+
+
+
+def adjust_syslinux_bootoptions(src, flavour):
     append_re = re.compile("^(\s*append.*)$", re.I)
     append_re = re.compile("^(\s*append.*)$", re.I)
-    boot_re = re.compile("/boot/([a-zA-Z0-9_]+/)+(\w+)")
-    flavour_re = re.compile("(label.*)(grml\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)")
     default_re = re.compile("(default.cfg)")
-    src = open(src_name, "r")
-    dst = open(dst_name, "w")
 
 
-    for line in src:
-        line = boot_re.sub(r'/boot/release/%s/\2 ' % flavour, line) 
-        line = flavour_re.sub(r'\1 %s-\2' % flavour, line) 
+    # do NOT write "None" in kernel cmdline
+    if options.bootoptions is None:
+        bootopt = ""
+    else:
+        bootopt = options.bootoptions
+
+    for line in fileinput.input(src, inplace=1):
+        line = boot_re.sub(r'/boot/release/%s/\2 ' % flavour, line)
+        # line = flavour_re.sub(r'\1 %s-\2' % flavour, line)
         line = default_re.sub(r'%s-\1' % flavour, line)
         line = append_re.sub(r'\1 live-media-path=/live/%s/ ' % flavour, line)
         line = default_re.sub(r'%s-\1' % flavour, line)
         line = append_re.sub(r'\1 live-media-path=/live/%s/ ' % flavour, line)
-        dst.write(line)
-    src.close()
-    dst.close()
+        line = append_re.sub(r'\1 boot=live %s ' % bootopt, line)
+        sys.stdout.write(line)
+    fileinput.close()
+
+def adjust_labels(src, flavour):
+    label_re = re.compile("^(\s*label\s*) ([a-zA-Z0-9_-]+)", re.I)
+    for line in fileinput.input(src, inplace=1):
+        line = label_re.sub(r'\1 %s-\2' % flavour, line)
+        sys.stdout.write(line)
+    fileinput.close()
 
 
 def add_syslinux_entry(filename, grml_flavour):
 
 
 def add_syslinux_entry(filename, grml_flavour):
-    data = open(filename, "a+")
     entry_filename = "option-%s.cfg" % grml_flavour
     entry = "include %s\n" % entry_filename
     entry_filename = "option-%s.cfg" % grml_flavour
     entry = "include %s\n" % entry_filename
+
+    add_entry_if_not_present(filename, entry)
     path = os.path.dirname(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()
 
     data = open(path + "/" + entry_filename, "w")
     data.write(generate_flavour_specific_syslinux_config(grml_flavour))
     data.close()
 
+def modify_filenames(grml_flavour, target, filenames):
+    for filename in filenames:
+        old_filename = "%s/%s" % (target, filename)
+        new_filename = "%s/%s-%s" % (target, grml_flavour, filename)
+        os.rename(old_filename, new_filename)
+        adjust_syslinux_bootoptions(new_filename, grml_flavour)
 
 
 
 
+def remove_default_entry(filename):
+    default_re = re.compile("^(\s*menu\s*default\s*)$", re.I)
+    for line in fileinput.input(filename, inplace=1):
+        if default_re.match(line): continue
+        sys.stdout.write(line)
+    fileinput.close()
+
 
 def handle_syslinux_config(grml_flavour, target):
     """Main handler for generating syslinux configuration
 
 def handle_syslinux_config(grml_flavour, target):
     """Main handler for generating syslinux configuration
@@ -1385,31 +1475,44 @@ def handle_syslinux_config(grml_flavour, target):
     # install main configuration only *once*, no matter how many ISOs we have:
     syslinux_flavour_is_default = False
     syslinux_config_file = open(syslinux_cfg, 'w')
     # install main configuration only *once*, no matter how many ISOs we have:
     syslinux_flavour_is_default = False
     syslinux_config_file = open(syslinux_cfg, 'w')
-    syslinux_config_file.write("include vesamenu.cfg")
+    syslinux_config_file.write("TIMEOUT 300\n")
+    syslinux_config_file.write("include vesamenu.cfg\n")
     syslinux_config_file.close()
 
     syslinux_config_file.close()
 
-    initial_syslinux_config(syslinux_target)
-    for filename in 'grml.cfg', 'default.cfg', 'hidden.cfg':
-        old_filename = "%s/%s" % (syslinux_target, filename)
-        new_filename = "%s/%s-%s" % (syslinux_target, grml_flavour, filename)
-        adjust_syslinux_bootoptions(old_filename, new_filename, grml_flavour)
-        os.unlink(old_filename)
+    prompt_name = open(syslinux_target + 'promptname.cfg', 'w')
+    prompt_name.write('menu label S^yslinux prompt\n')
+    prompt_name.close()
 
 
-    new_hidden =  "%s-hidden.cfg" % (grml_flavour)
-    new_default = "%s-default.cfg" % (grml_flavour)
-    default_file = open("%s/defaults.cfg" % syslinux_target, "a+")
-    entry = "include %s\n" % new_default
-    for line in default_file:
-        if line == entry:
-            break
+    initial_syslinux_config(syslinux_target)
+    modify_filenames(grml_flavour, syslinux_target, ['grml.cfg', 'default.cfg'])
+
+    filename = search_file("new-hidden.cfg", syslinux_target)
+    # process hidden file
+    if not search_file("hidden.cfg", syslinux_target):
+        new_hidden = syslinux_target + "hidden.cfg"
+        os.rename(filename, new_hidden)
+        adjust_syslinux_bootoptions(new_hidden, grml_flavour)
     else:
     else:
-        default_file.write("include %s\n" % new_default)
+        new_hidden =  "%s-hidden.cfg" % (grml_flavour)
+        new_hidden_file =  "%s/%s" % (syslinux_target, new_hidden)
+        os.rename(filename, new_hidden_file)
+        adjust_labels(new_hidden_file, grml_flavour)
+        adjust_syslinux_bootoptions(new_hidden_file, grml_flavour)
+        entry = 'include %s\n' % new_hidden
+        add_entry_if_not_present("%s/hiddens.cfg" % syslinux_target, entry)
 
 
-    default_file.close()
-    add_syslinux_entry("%s/additional.cfg" % syslinux_target, grml_flavour)
 
 
 
 
+    new_default = "%s-default.cfg" % (grml_flavour)
+    entry = 'include %s\n' % new_default
+    defaults_file = '%s/defaults.cfg' % syslinux_target
 
 
+    if os.path.isfile(defaults_file):
+        remove_default_entry('%s/%s-default.cfg' % (syslinux_target, grml_flavour))
+
+    add_entry_if_not_present("%s/defaults.cfg" % syslinux_target, entry)
+
+    add_syslinux_entry("%s/additional.cfg" % syslinux_target, grml_flavour)
 
 
 def handle_bootloader_config(grml_flavour, device, target):
 
 
 def handle_bootloader_config(grml_flavour, device, target):
@@ -1437,6 +1540,7 @@ def handle_bootloader_config(grml_flavour, device, target):
             logging.critical("Fatal: %s", error)
             sys.exit(1)
 
             logging.critical("Fatal: %s", error)
             sys.exit(1)
 
+
 def handle_dir(live_image, device):
     """Main logic for copying files of the currently running grml system.
 
 def handle_dir(live_image, device):
     """Main logic for copying files of the currently running grml system.
 
@@ -1745,7 +1849,6 @@ def main():
     # finally be politely :)
     logging.info("Finished execution of grml2usb (%s). Have fun with your grml system.", PROG_VERSION)
 
     # finally be politely :)
     logging.info("Finished execution of grml2usb (%s). Have fun with your grml system.", PROG_VERSION)
 
-
 if __name__ == "__main__":
     try:
         main()
 if __name__ == "__main__":
     try:
         main()