Support use with python version 2.4
[grml2usb.git] / grml2usb
index cff496c..fd6dc17 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -12,7 +12,7 @@ This script installs a grml system (either a running system or ISO[s]) to a USB
 
 """
 
 
 """
 
-from __future__ import with_statement
+from __future__ import with_statement
 from optparse import OptionParser
 from inspect import isroutine, isclass
 import datetime, logging, os, re, subprocess, sys, tempfile, time
 from optparse import OptionParser
 from inspect import isroutine, isclass
 import datetime, logging, os, re, subprocess, sys, tempfile, time
@@ -234,11 +234,10 @@ def mkfs_fat16(device):
         raise CriticalException("error executing mkfs.vfat")
 
 
         raise CriticalException("error executing mkfs.vfat")
 
 
-def generate_main_grub2_config(grml_flavour, install_partition, bootoptions):
+def generate_main_grub2_config(grml_flavour, bootoptions):
     """Generate grub2 configuration for use via grub.cfg
 
     @grml_flavour: name of grml flavour the configuration should be generated for
     """Generate grub2 configuration for use via grub.cfg
 
     @grml_flavour: name of grml flavour the configuration should be generated for
-    @install_partition: partition number for use in (hd0,X)
     @bootoptions: additional bootoptions that should be used by default"""
 
     local_datestamp = DATESTAMP
     @bootoptions: additional bootoptions that should be used by default"""
 
     local_datestamp = DATESTAMP
@@ -250,7 +249,7 @@ set timeout=5
 
 insmod fat
 
 
 insmod fat
 
-if font (hd0,%(install_partition)s)/boot/grub/ascii.pff ; then
+if font /boot/grub/ascii.pff ; then
    insmod png
    set gfxmode=640x480
    insmod gfxterm
    insmod png
    set gfxmode=640x480
    insmod gfxterm
@@ -258,7 +257,7 @@ if font (hd0,%(install_partition)s)/boot/grub/ascii.pff ; then
    terminal gfxterm
 fi
 
    terminal gfxterm
 fi
 
-if background_image (hd0,%(install_partition)s)/boot/grub/grml.png ; then
+if background_image /boot/grub/grml.png ; then
   set color_normal=black/black
   set color_highlight=red/black
 else
   set color_normal=black/black
   set color_highlight=red/black
 else
@@ -267,30 +266,25 @@ else
 fi
 
 menuentry "%(grml_flavour)s (default)" {
 fi
 
 menuentry "%(grml_flavour)s (default)" {
-    set root=(hd0,%(install_partition)s)
     linux   /boot/release/%(grml_flavour)s/linux26 apm=power-off vga=791 quiet boot=live nomce live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
     initrd  /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 menuentry "Memory test (memtest86+)" {
     linux   /boot/release/%(grml_flavour)s/linux26 apm=power-off vga=791 quiet boot=live nomce live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
     initrd  /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 menuentry "Memory test (memtest86+)" {
-    set root=(hd0,%(install_partition)s)
     linux   /boot/addons/memtest
 }
 
 menuentry "Grub - all in one image" {
     linux   /boot/addons/memtest
 }
 
 menuentry "Grub - all in one image" {
-    set root=(hd0,%(install_partition)s)
     linux   /boot/addons/memdisk
     initrd  /boot/addons/allinone.img
 }
 
 menuentry "FreeDOS" {
     linux   /boot/addons/memdisk
     initrd  /boot/addons/allinone.img
 }
 
 menuentry "FreeDOS" {
-    set root=(hd0,%(install_partition)s)
     linux   /boot/addons/memdisk
     initrd  /boot/addons/balder10.imz
 }
 
 menuentry "MirOS BSD" {
     linux   /boot/addons/memdisk
     initrd  /boot/addons/balder10.imz
 }
 
 menuentry "MirOS BSD" {
-    set root=(hd0,%(install_partition)s)
     multiboot   /boot/addons/bsd4grml/ldbsd.com
 }
 
     multiboot   /boot/addons/bsd4grml/ldbsd.com
 }
 
@@ -300,14 +294,13 @@ menuentry "Boot OS of first partition on first disk" {
 }
 
 """ % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp,
 }
 
 """ % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp,
-        'bootoptions': bootoptions, 'install_partition': install_partition } )
+        'bootoptions': bootoptions } )
 
 
 
 
-def generate_flavour_specific_grub2_config(grml_flavour, install_partition, bootoptions):
+def generate_flavour_specific_grub2_config(grml_flavour, bootoptions):
     """Generate grub2 configuration for use via grub.cfg
 
     @grml_flavour: name of grml flavour the configuration should be generated for
     """Generate grub2 configuration for use via grub.cfg
 
     @grml_flavour: name of grml flavour the configuration should be generated for
-    @install_partition: partition number for use in (hd0,X)
     @bootoptions: additional bootoptions that should be used by default"""
 
     local_datestamp = DATESTAMP
     @bootoptions: additional bootoptions that should be used by default"""
 
     local_datestamp = DATESTAMP
@@ -315,69 +308,60 @@ def generate_flavour_specific_grub2_config(grml_flavour, install_partition, boot
     return("""\
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s" {
     return("""\
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s" {
-    set root=(hd0,%(install_partition)s)
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-persistent" {
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-persistent" {
-    set root=(hd0,%(install_partition)s)
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s2ram" {
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s2ram" {
-    set root=(hd0,%(install_partition)s)
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s.squashfs %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-debug" {
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s.squashfs %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-debug" {
-    set root=(hd0,%(install_partition)s)
     linux /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
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-x" {
     linux /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
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-x" {
-    set root=(hd0,%(install_partition)s)
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ startx=wm-ng %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-nofb" {
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ startx=wm-ng %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-nofb" {
-    set root=(hd0,%(install_partition)s)
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=ofonly %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-failsafe" {
     linux  /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=ofonly %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-failsafe" {
-    set root=(hd0,%(install_partition)s)
     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 %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-forensic" {
     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 %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-forensic" {
-    set root=(hd0,%(install_partition)s)
     linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ nofstab noraid nolvm noautoconfig noswap raid=noautodetect forensic readonly %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-serial" {
     linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ nofstab noraid nolvm noautoconfig noswap raid=noautodetect forensic readonly %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s]
 menuentry "%(grml_flavour)s-serial" {
-    set root=(hd0,%(install_partition)s)
     linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=vesafb:off console=tty1 console=ttyS0,9600n8 %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 """ % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp,
     linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=vesafb:off console=tty1 console=ttyS0,9600n8 %(bootoptions)s
     initrd /boot/release/%(grml_flavour)s/initrd.gz
 }
 
 """ % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp,
-       'bootoptions': bootoptions, 'install_partition': install_partition } )
+       'bootoptions': bootoptions } )
 
 
 def generate_flavour_specific_grub1_config(grml_flavour, install_partition, bootoptions):
 
 
 def generate_flavour_specific_grub1_config(grml_flavour, install_partition, bootoptions):
@@ -628,20 +612,21 @@ def install_grub(device):
         device_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
         register_tmpfile(device_mountpoint)
         try:
         device_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
         register_tmpfile(device_mountpoint)
         try:
-            mount(device, device_mountpoint, "")
-            logging.debug("grub-install --recheck --no-floppy --root-directory=%s %s", device_mountpoint, device)
-            proc = subprocess.Popen(["grub-install", "--recheck", "--no-floppy",
-                "--root-directory=%s" % device_mountpoint, device], stdout=file(os.devnull, "r+"))
-            proc.wait()
-            if proc.returncode != 0:
-                # raise Exception("error executing grub-install")
-                logging.critical("Fatal: error executing grub-install (please check the grml2usb FAQ)")
+            try:
+                mount(device, device_mountpoint, "")
+                logging.debug("grub-install --recheck --no-floppy --root-directory=%s %s", device_mountpoint, device)
+                proc = subprocess.Popen(["grub-install", "--recheck", "--no-floppy",
+                    "--root-directory=%s" % device_mountpoint, device], stdout=file(os.devnull, "r+"))
+                proc.wait()
+                if proc.returncode != 0:
+                    # raise Exception("error executing grub-install")
+                    logging.critical("Fatal: error executing grub-install (please check the grml2usb FAQ)")
+                    cleanup()
+                    sys.exit(1)
+            except CriticalException, error:
+                logging.critical("Fatal: %s" % error)
                 cleanup()
                 sys.exit(1)
                 cleanup()
                 sys.exit(1)
-        except CriticalException, error:
-            logging.critical("Fatal: %s" % error)
-            cleanup()
-            sys.exit(1)
 
         finally:
             unmount(device_mountpoint, "")
 
         finally:
             unmount(device_mountpoint, "")
@@ -721,6 +706,10 @@ def install_syslinux_mbr(device):
 
     @device: device where MBR of syslinux should be installed to"""
 
 
     @device: device where MBR of syslinux should be installed to"""
 
+    # 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)")
+
     # lilo's mbr is broken, use the one from syslinux instead:
     if not os.path.isfile("/usr/lib/syslinux/mbr.bin"):
         raise Exception("/usr/lib/syslinux/mbr.bin can not be read")
     # lilo's mbr is broken, use the one from syslinux instead:
     if not os.path.isfile("/usr/lib/syslinux/mbr.bin"):
         raise Exception("/usr/lib/syslinux/mbr.bin can not be read")
@@ -883,7 +872,7 @@ def mount(source, target, mount_options):
             raise CriticalException("Error executing mount: %s already mounted - please unmount before invoking grml2usb" % source)
 
     if os.path.isdir(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)
+        logging.debug("Source %s is not a device, therefore not mounting." % source)
         return 0
 
     logging.debug("mount %s %s %s" % (mount_options, source, target))
         return 0
 
     logging.debug("mount %s %s %s" % (mount_options, source, target))
@@ -991,16 +980,16 @@ def copy_system_files(grml_flavour, iso_mount, target):
     else:
         squashfs_target = target + '/live/' + grml_flavour + '/'
         execute(mkdir, squashfs_target)
     else:
         squashfs_target = target + '/live/' + grml_flavour + '/'
         execute(mkdir, squashfs_target)
-        logging.debug("rsync -aHS %s %s" % (squashfs, squashfs_target + grml_flavour + '.squashfs'))
-        proc = subprocess.Popen(["rsync", "-aHS", squashfs, squashfs_target + grml_flavour + ".squashfs"])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (squashfs, squashfs_target + grml_flavour + '.squashfs'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", squashfs, squashfs_target + grml_flavour + ".squashfs"])
         proc.wait()
 
     filesystem_module = search_file('filesystem.module', iso_mount)
     if filesystem_module is None:
         logging.critical("Fatal: filesystem.module not found")
     else:
         proc.wait()
 
     filesystem_module = search_file('filesystem.module', iso_mount)
     if filesystem_module is None:
         logging.critical("Fatal: filesystem.module not found")
     else:
-        logging.debug("rsync -aHS %s %s" % (filesystem_module, squashfs_target + 'filesystem.module'))
-        proc = subprocess.Popen(["rsync", "-aHS", filesystem_module, squashfs_target + 'filesystem.module'])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (filesystem_module, squashfs_target + 'filesystem.module'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", filesystem_module, squashfs_target + 'filesystem.module'])
         proc.wait()
 
     release_target = target + '/boot/release/' + grml_flavour
         proc.wait()
 
     release_target = target + '/boot/release/' + grml_flavour
@@ -1010,16 +999,16 @@ def copy_system_files(grml_flavour, iso_mount, target):
     if kernel is None:
         logging.critical("Fatal kernel not found")
     else:
     if kernel is None:
         logging.critical("Fatal kernel not found")
     else:
-        logging.debug("rsync -aHS %s %s" % (kernel, release_target + '/linux26'))
-        proc = subprocess.Popen(["rsync", "-aHS", kernel, release_target + '/linux26'])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (kernel, release_target + '/linux26'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", kernel, release_target + '/linux26'])
         proc.wait()
 
     initrd = search_file('initrd.gz', iso_mount)
     if initrd is None:
         logging.critical("Fatal: initrd not found")
     else:
         proc.wait()
 
     initrd = search_file('initrd.gz', iso_mount)
     if initrd is None:
         logging.critical("Fatal: initrd not found")
     else:
-        logging.debug("rsync -aHS %s %s" % (initrd, release_target + '/initrd.gz'))
-        proc = subprocess.Popen(["rsync", "-aHS", initrd, release_target + '/initrd.gz'])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (initrd, release_target + '/initrd.gz'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", initrd, release_target + '/initrd.gz'])
         proc.wait()
 
 
         proc.wait()
 
 
@@ -1037,8 +1026,8 @@ def copy_grml_files(iso_mount, target):
         if grml_file is None:
             logging.warn("Warning: myfile %s could not be found - can not install it", myfile)
         else:
         if grml_file is None:
             logging.warn("Warning: myfile %s could not be found - can not install it", myfile)
         else:
-            logging.debug("rsync -aHS %s %s" % (grml_file, grml_target + grml_file))
-            proc = subprocess.Popen(["rsync", "-aHS", grml_file, grml_target + myfile])
+            logging.debug("rsync -rlptDH --inplace %s %s" % (grml_file, grml_target + grml_file))
+            proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", grml_file, grml_target + myfile])
             proc.wait()
 
     grml_web_target = grml_target + '/web/'
             proc.wait()
 
     grml_web_target = grml_target + '/web/'
@@ -1049,8 +1038,8 @@ def copy_grml_files(iso_mount, target):
         if grml_file is None:
             logging.warn("Warning: myfile %s could not be found - can not install it")
         else:
         if grml_file is None:
             logging.warn("Warning: myfile %s could not be found - can not install it")
         else:
-            logging.debug("rsync -aHS %s %s" % (grml_file, grml_web_target + grml_file))
-            proc = subprocess.Popen(["rsync", "-aHS", grml_file, grml_web_target + myfile])
+            logging.debug("rsync -rlptDH --inplace %s %s" % (grml_file, grml_web_target + grml_file))
+            proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", grml_file, grml_web_target + myfile])
             proc.wait()
 
     grml_webimg_target = grml_web_target + '/images/'
             proc.wait()
 
     grml_webimg_target = grml_web_target + '/images/'
@@ -1061,8 +1050,8 @@ def copy_grml_files(iso_mount, target):
         if grml_file is None:
             logging.warn("Warning: myfile %s could not be found - can not install it")
         else:
         if grml_file is None:
             logging.warn("Warning: myfile %s could not be found - can not install it")
         else:
-            logging.debug("rsync -aHS %s %s" % (grml_file, grml_webimg_target + grml_file))
-            proc = subprocess.Popen(["rsync", "-aHS", grml_file, grml_webimg_target + myfile])
+            logging.debug("rsync -rlptDH --inplace %s %s" % (grml_file, grml_webimg_target + grml_file))
+            proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", grml_file, grml_webimg_target + myfile])
             proc.wait()
 
 
             proc.wait()
 
 
@@ -1080,8 +1069,8 @@ def copy_addons(iso_mount, target):
     if allinoneimg is None:
         logging.warn("Warning: allinone.img not found (that's fine if you don't need it)")
     else:
     if allinoneimg is None:
         logging.warn("Warning: allinone.img not found (that's fine if you don't need it)")
     else:
-        logging.debug("rsync -aHS %s %s" % (allinoneimg, addons + '/allinone.img'))
-        proc = subprocess.Popen(["rsync", "-aHS", allinoneimg, addons + 'allinone.img'])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (allinoneimg, addons + '/allinone.img'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", allinoneimg, addons + 'allinone.img'])
         proc.wait()
 
     # bsd imag
         proc.wait()
 
     # bsd imag
@@ -1089,8 +1078,8 @@ def copy_addons(iso_mount, target):
     if bsdimg is None:
         logging.warn("Warning: bsd4grml not found (that's fine if you don't need it)")
     else:
     if bsdimg is None:
         logging.warn("Warning: bsd4grml not found (that's fine if you don't need it)")
     else:
-        logging.debug("rsync -aHS %s %s" % (bsdimg, addons + '/'))
-        proc = subprocess.Popen(["rsync", "-aHS", bsdimg, addons + '/'])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (bsdimg, addons + '/'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", bsdimg, addons + '/'])
         proc.wait()
 
     # freedos image
         proc.wait()
 
     # freedos image
@@ -1098,8 +1087,8 @@ def copy_addons(iso_mount, target):
     if balderimg is None:
         logging.warn("Warning: balder10.imz not found (that's fine if you don't need it)")
     else:
     if balderimg is None:
         logging.warn("Warning: balder10.imz not found (that's fine if you don't need it)")
     else:
-        logging.debug("rsync -aHS %s %s" % (balderimg, addons + '/balder10.imz'))
-        proc = subprocess.Popen(["rsync", "-aHS", balderimg, addons + 'balder10.imz'])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (balderimg, addons + '/balder10.imz'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", balderimg, addons + 'balder10.imz'])
         proc.wait()
 
     # install hdt and pci.ids only when using syslinux (grub doesn't support it)
         proc.wait()
 
     # install hdt and pci.ids only when using syslinux (grub doesn't support it)
@@ -1107,15 +1096,15 @@ def copy_addons(iso_mount, target):
         # hdt (hardware detection tool) image
         hdtimg = search_file('hdt.c32', iso_mount)
         if hdtimg:
         # hdt (hardware detection tool) image
         hdtimg = search_file('hdt.c32', iso_mount)
         if hdtimg:
-            logging.debug("rsync -aHS %s %s" % (hdtimg, addons + '/hdt.c32'))
-            proc = subprocess.Popen(["rsync", "-aHS", hdtimg, addons + '/hdt.c32'])
+            logging.debug("rsync -rlptDH --inplace %s %s" % (hdtimg, addons + '/hdt.c32'))
+            proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", hdtimg, addons + '/hdt.c32'])
             proc.wait()
 
         # pci.ids file
         picids = search_file('pci.ids', iso_mount)
         if picids:
             proc.wait()
 
         # pci.ids file
         picids = search_file('pci.ids', iso_mount)
         if picids:
-            logging.debug("rsync -aHS %s %s" % (picids, addons + '/pci.ids'))
-            proc = subprocess.Popen(["rsync", "-aHS", picids, addons + '/pci.ids'])
+            logging.debug("rsync -rlptDH --inplace %s %s" % (picids, addons + '/pci.ids'))
+            proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", picids, addons + '/pci.ids'])
             proc.wait()
 
     # memdisk image
             proc.wait()
 
     # memdisk image
@@ -1123,8 +1112,8 @@ def copy_addons(iso_mount, target):
     if memdiskimg is None:
         logging.warn("Warning: memdisk not found (that's fine if you don't need it)")
     else:
     if memdiskimg is None:
         logging.warn("Warning: memdisk not found (that's fine if you don't need it)")
     else:
-        logging.debug("rsync -aHS %s %s" % (memdiskimg, addons + '/memdisk'))
-        proc = subprocess.Popen(["rsync", "-aHS", memdiskimg, addons + 'memdisk'])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (memdiskimg, addons + '/memdisk'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", memdiskimg, addons + 'memdisk'])
         proc.wait()
 
     # memtest86+ image
         proc.wait()
 
     # memtest86+ image
@@ -1132,8 +1121,8 @@ def copy_addons(iso_mount, target):
     if memtestimg is None:
         logging.warn("Warning: memtest not found (that's fine if you don't need it)")
     else:
     if memtestimg is None:
         logging.warn("Warning: memtest not found (that's fine if you don't need it)")
     else:
-        logging.debug("rsync -aHS %s %s" % (memtestimg, addons + '/memtest'))
-        proc = subprocess.Popen(["rsync", "-aHS", memtestimg, addons + 'memtest'])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (memtestimg, addons + '/memtest'))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", memtestimg, addons + 'memtest'])
         proc.wait()
 
 
         proc.wait()
 
 
@@ -1147,14 +1136,14 @@ def copy_bootloader_files(iso_mount, target):
     execute(mkdir, syslinux_target)
 
     logo = search_file('logo.16', iso_mount)
     execute(mkdir, syslinux_target)
 
     logo = search_file('logo.16', iso_mount)
-    logging.debug("rsync -aHS %s %s" % (logo, syslinux_target + 'logo.16'))
-    proc = subprocess.Popen(["rsync", "-aHS", logo, syslinux_target + 'logo.16'])
+    logging.debug("rsync -rlptDH --inplace %s %s" % (logo, syslinux_target + 'logo.16'))
+    proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", logo, syslinux_target + 'logo.16'])
     proc.wait()
 
     for ffile in 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10':
         bootsplash = search_file(ffile, iso_mount)
     proc.wait()
 
     for ffile in 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10':
         bootsplash = search_file(ffile, iso_mount)
-        logging.debug("rsync -aHS %s %s" % (bootsplash, syslinux_target + ffile))
-        proc = subprocess.Popen(["rsync", "-aHS", bootsplash, syslinux_target + ffile])
+        logging.debug("rsync -rlptDH --inplace %s %s" % (bootsplash, syslinux_target + ffile))
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", bootsplash, syslinux_target + ffile])
         proc.wait()
 
     grub_target = target + '/boot/grub/'
         proc.wait()
 
     grub_target = target + '/boot/grub/'
@@ -1165,22 +1154,22 @@ def copy_bootloader_files(iso_mount, target):
         logging.critical("Please make sure you've the grml2usb Debian package installed!")
         raise
     else:
         logging.critical("Please make sure you've the grml2usb Debian package installed!")
         raise
     else:
-        logging.debug("rsync -aHS /usr/share/grml2usb/grub/splash.xpm.gz %s" % grub_target + 'splash.xpm.gz')
-        proc = subprocess.Popen(["rsync", "-aHS", '/usr/share/grml2usb/grub/splash.xpm.gz',
+        logging.debug("rsync -rlptDH --inplace /usr/share/grml2usb/grub/splash.xpm.gz %s" % grub_target + 'splash.xpm.gz')
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", '/usr/share/grml2usb/grub/splash.xpm.gz',
                                 grub_target + 'splash.xpm.gz'])
         proc.wait()
 
     # grml splash in grub
     if os.path.isfile("/usr/share/grml2usb/grub/grml.png"):
                                 grub_target + 'splash.xpm.gz'])
         proc.wait()
 
     # grml splash in grub
     if os.path.isfile("/usr/share/grml2usb/grub/grml.png"):
-        logging.debug("rsync -aHS /usr/share/grml2usb/grub/grml.png to %s" % grub_target + 'grml.png')
-        proc = subprocess.Popen(["rsync", "-aHS", '/usr/share/grml2usb/grub/grml.png',
+        logging.debug("rsync -rlptDH --inplace /usr/share/grml2usb/grub/grml.png to %s" % grub_target + 'grml.png')
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", '/usr/share/grml2usb/grub/grml.png',
                                 grub_target + 'grml.png'])
         proc.wait()
 
     # font file for graphical bootsplash in grub
     if os.path.isfile("/usr/share/grub/ascii.pff"):
                                 grub_target + 'grml.png'])
         proc.wait()
 
     # font file for graphical bootsplash in grub
     if os.path.isfile("/usr/share/grub/ascii.pff"):
-        logging.debug("rsync -aHS /usr/share/grub/ascii.pff to %s" % grub_target + 'ascii.pff')
-        proc = subprocess.Popen(["rsync", "-aHS", '/usr/share/grub/ascii.pff',
+        logging.debug("rsync -rlptDH --inplace /usr/share/grub/ascii.pff to %s" % grub_target + 'ascii.pff')
+        proc = subprocess.Popen(["rsync", "-rlptDH", "--inplace", '/usr/share/grub/ascii.pff',
                                 grub_target + 'ascii.pff'])
         proc.wait()
 
                                 grub_target + 'ascii.pff'])
         proc.wait()
 
@@ -1211,14 +1200,14 @@ def install_iso_files(grml_flavour, iso_mount, device, target):
 
     if not options.skipaddons:
         if grml_flavour.endswith('-small'):
 
     if not options.skipaddons:
         if grml_flavour.endswith('-small'):
-            logging.info("Note: grml-small doesn't provide any addons, not installing them therefor.")
+            logging.info("Note: grml-small doesn't provide any addons, not installing them therefore.")
         else:
             copy_addons(iso_mount, target)
 
     if not options.copyonly:
         copy_bootloader_files(iso_mount, target)
 
         else:
             copy_addons(iso_mount, target)
 
     if not options.copyonly:
         copy_bootloader_files(iso_mount, target)
 
-        if not options.dryrun and not os.path.isdir(device):
+        if not options.dryrun:
             handle_bootloader_config(grml_flavour, device, target)
 
     # make sure we sync filesystems before returning
             handle_bootloader_config(grml_flavour, device, target)
 
     # make sure we sync filesystems before returning
@@ -1299,11 +1288,10 @@ def handle_grub1_config(grml_flavour, install_partition, grub_target, bootopt):
         grub1_config_file.close()
 
 
         grub1_config_file.close()
 
 
-def handle_grub2_config(grml_flavour, install_partition, grub_target, bootopt):
+def handle_grub2_config(grml_flavour, grub_target, bootopt):
     """Main handler for generating grub2 configuration
 
     @grml_flavour: name of grml flavour the configuration should be generated for
     """Main handler for generating grub2 configuration
 
     @grml_flavour: name of grml flavour the configuration should be generated for
-    @install_partition: partition number for use in (hd0,X)
     @grub_target: path of grub's configuration files
     @bootoptions: additional bootoptions that should be used by default"""
 
     @grub_target: path of grub's configuration files
     @bootoptions: additional bootoptions that should be used by default"""
 
@@ -1322,13 +1310,13 @@ def handle_grub2_config(grml_flavour, install_partition, grub_target, bootopt):
             grub2_config_file = open(grub2_cfg, 'w')
             GRML_DEFAULT = grml_flavour
             grub_flavour_is_default = True
             grub2_config_file = open(grub2_cfg, 'w')
             GRML_DEFAULT = grml_flavour
             grub_flavour_is_default = True
-            grub2_config_file.write(generate_main_grub2_config(grml_flavour, install_partition, bootopt))
+            grub2_config_file.write(generate_main_grub2_config(grml_flavour, bootopt))
             grub2_config_file.close()
     else:
         grub2_config_file = open(grub2_cfg, 'w')
         GRML_DEFAULT = grml_flavour
         grub_flavour_is_default = True
             grub2_config_file.close()
     else:
         grub2_config_file = open(grub2_cfg, 'w')
         GRML_DEFAULT = grml_flavour
         grub_flavour_is_default = True
-        grub2_config_file.write(generate_main_grub2_config(grml_flavour, install_partition, bootopt))
+        grub2_config_file.write(generate_main_grub2_config(grml_flavour, bootopt))
         grub2_config_file.close()
 
     # install flavour specific configuration only *once* as well
         grub2_config_file.close()
 
     # install flavour specific configuration only *once* as well
@@ -1345,7 +1333,7 @@ def handle_grub2_config(grml_flavour, install_partition, grub_target, bootopt):
         # display only if the grml flavour isn't the default
         if not grub_flavour_is_default:
             GRML_FLAVOURS.add(grml_flavour)
         # display only if the grml flavour isn't the default
         if not grub_flavour_is_default:
             GRML_FLAVOURS.add(grml_flavour)
-        grub2_config_file.write(generate_flavour_specific_grub2_config(grml_flavour, install_partition, bootopt))
+        grub2_config_file.write(generate_flavour_specific_grub2_config(grml_flavour, bootopt))
         grub2_config_file.close()
 
 
         grub2_config_file.close()
 
 
@@ -1361,12 +1349,13 @@ def handle_grub_config(grml_flavour, device, target):
     grub_target = target + '/boot/grub/'
     execute(mkdir, grub_target)
 
     grub_target = target + '/boot/grub/'
     execute(mkdir, grub_target)
 
-    # we have to adjust root() inside grub configuration
-    if device[-1:].isdigit():
-        install_grub1_partition = int(device[-1:]) - 1
-        install_grub2_partition = device[-1:]
+    if os.path.isdir(device):
+        install_grub1_partition = None
     else:
     else:
-        raise CriticalException("error validating partition schema (raw device?)")
+        if device[-1:].isdigit():
+            install_grub1_partition = int(device[-1:]) - 1
+        else:
+            raise CriticalException("error validating partition schema (raw device?)")
 
     # do NOT write "None" in kernel cmdline
     if options.bootoptions is None:
 
     # do NOT write "None" in kernel cmdline
     if options.bootoptions is None:
@@ -1375,9 +1364,10 @@ def handle_grub_config(grml_flavour, device, target):
         bootopt = options.bootoptions
 
     # write menu.lst
         bootopt = options.bootoptions
 
     # write menu.lst
-    handle_grub1_config(grml_flavour, install_grub1_partition, grub_target, bootopt)
+    if install_grub1_partition:
+        handle_grub1_config(grml_flavour, install_grub1_partition, grub_target, bootopt)
     # write grub.cfg
     # write grub.cfg
-    handle_grub2_config(grml_flavour, install_grub2_partition, grub_target, bootopt)
+    handle_grub2_config(grml_flavour, grub_target, bootopt)
 
 
 def handle_syslinux_config(grml_flavour, target):
 
 
 def handle_syslinux_config(grml_flavour, target):
@@ -1475,7 +1465,7 @@ def handle_dir(live_image, device):
     logging.info("Using %s as install base" % live_image)
 
     if os.path.isdir(device):
     logging.info("Using %s as install base" % live_image)
 
     if os.path.isdir(device):
-        logging.info("Specified target is a directory, not mounting therefor.")
+        logging.info("Specified target is a directory, therefore not mounting.")
         device_mountpoint = device
         remove_device_mountpoint = False
     else:
         device_mountpoint = device
         remove_device_mountpoint = False
     else:
@@ -1490,12 +1480,13 @@ def handle_dir(live_image, device):
             sys.exit(1)
 
     try:
             sys.exit(1)
 
     try:
-        grml_flavour = identify_grml_flavour(live_image)
-        logging.info("Identified grml flavour \"%s\"." % grml_flavour)
-        install_iso_files(grml_flavour, live_image, device, device_mountpoint)
-    except TypeError:
-        logging.critical("Fatal: a critical error happend during execution (not a grml ISO?), giving up")
-        sys.exit(1)
+        try:
+            grml_flavour = identify_grml_flavour(live_image)
+            logging.info("Identified grml flavour \"%s\"." % grml_flavour)
+            install_iso_files(grml_flavour, live_image, device, device_mountpoint)
+        except TypeError:
+            logging.critical("Fatal: a critical error happend during execution (not a grml ISO?), giving up")
+            sys.exit(1)
     finally:
         if remove_device_mountpoint:
             try:
     finally:
         if remove_device_mountpoint:
             try:
@@ -1532,7 +1523,7 @@ def handle_iso(iso, device):
         sys.exit(1)
 
     if os.path.isdir(device):
         sys.exit(1)
 
     if os.path.isdir(device):
-        logging.info("Specified target is a directory, not mounting therefor.")
+        logging.info("Specified target is a directory, therefore not mounting.")
         device_mountpoint = device
         remove_device_mountpoint = False
         # skip_mbr = True
         device_mountpoint = device
         remove_device_mountpoint = False
         # skip_mbr = True
@@ -1548,12 +1539,13 @@ def handle_iso(iso, device):
             sys.exit(1)
 
     try:
             sys.exit(1)
 
     try:
-        grml_flavour = identify_grml_flavour(iso_mountpoint)
-        logging.info("Identified grml flavour \"%s\"." % grml_flavour)
-        install_iso_files(grml_flavour, iso_mountpoint, device, device_mountpoint)
-    except TypeError:
-        logging.critical("Fatal: a critical error happend during execution (not a grml ISO?), giving up")
-        sys.exit(1)
+        try:
+            grml_flavour = identify_grml_flavour(iso_mountpoint)
+            logging.info("Identified grml flavour \"%s\"." % grml_flavour)
+            install_iso_files(grml_flavour, iso_mountpoint, device, device_mountpoint)
+        except TypeError:
+            logging.critical("Fatal: a critical error happend during execution (not a grml ISO?), giving up")
+            sys.exit(1)
     finally:
         if os.path.isdir(iso_mountpoint) and remove_iso_mountpoint:
             unmount(iso_mountpoint, "")
     finally:
         if os.path.isdir(iso_mountpoint) and remove_iso_mountpoint:
             unmount(iso_mountpoint, "")
@@ -1579,19 +1571,13 @@ def handle_mbr(device):
         logging.info("Would install MBR")
         return 0
 
         logging.info("Would install MBR")
         return 0
 
-    # make sure we have syslinux available
-    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)
-
     if device[-1:].isdigit():
         mbr_device = re.match(r'(.*?)\d*$', device).group(1)
         partition_number = int(device[-1:]) - 1
         skip_install_mir_mbr = False
 
     # if we get e.g. /dev/loop1 as device we don't want to put the MBR
     if device[-1:].isdigit():
         mbr_device = re.match(r'(.*?)\d*$', device).group(1)
         partition_number = int(device[-1:]) - 1
         skip_install_mir_mbr = False
 
     # if we get e.g. /dev/loop1 as device we don't want to put the MBR
-    # into /dev/loop of course, therefor use /dev/loop1 as mbr_device
+    # into /dev/loop of course, therefore use /dev/loop1 as mbr_device
     if mbr_device == "/dev/loop":
         mbr_device = device
         logging.info("Detected loop device - using %s as MBR device therefore" % mbr_device)
     if mbr_device == "/dev/loop":
         mbr_device = device
         logging.info("Detected loop device - using %s as MBR device therefore" % mbr_device)
@@ -1645,7 +1631,7 @@ def handle_vfat(device):
             logging.critical("Execution failed: %s", error)
             sys.exit(1)
 
             logging.critical("Execution failed: %s", error)
             sys.exit(1)
 
-    if not check_for_usbdevice(device) and not os.path.isdir(device):
+    if not os.path.isdir(device) and not check_for_usbdevice(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":
         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":