Bump Standards-Version to 3.9.6
[grml2usb.git] / grml2usb
index 0fbf339..844d87b 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -13,6 +13,7 @@ This script installs a Grml system (either a running system or ISO[s]) to a USB
 
 """
 
+from __future__ import print_function
 from optparse import OptionParser
 from inspect import isroutine, isclass
 import datetime
@@ -42,6 +43,7 @@ GRML_DEFAULT = None
 UUID = None
 SYSLINUX_LIBS = "/usr/lib/syslinux/"
 GPT_HEADER = "\x55\xaa\x45\x46\x49\x20\x50\x41\x52\x54"  # original GPT header
+GRUB_INSTALL = None
 
 RE_PARTITION = re.compile(r'([a-z/]*?)(\d+)$')
 RE_P_PARTITION = re.compile(r'(.*?\d+)p(\d+)$')
@@ -132,14 +134,12 @@ class CriticalException(Exception):
     """Throw critical exception if the exact error is not known but fatal.
 
     @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
@@ -456,40 +456,38 @@ def install_grub(device):
         device_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
         register_tmpfile(device_mountpoint)
         try:
-            try:
-                mount(device, device_mountpoint, "")
+            mount(device, device_mountpoint, "")
 
-                # If using --grub-mbr then make sure we install grub in MBR instead of PBR
-                if options.grubmbr:
-                    logging.debug("Using option --grub-mbr ...")
-                    grub_device, x = get_device_from_partition(device)
-                else:
-                    grub_device = device
-
-                logging.info("Installing grub as bootloader")
-                for opt in ["", "--force"]:
-                    logging.debug("grub-install --recheck %s --no-floppy --root-directory=%s %s",
-                                  opt, device_mountpoint, grub_device)
-                    proc = subprocess.Popen(["grub-install", "--recheck", opt, "--no-floppy",
-                                             "--root-directory=%s" % device_mountpoint, grub_device],
-                                            stdout=file(os.devnull, "r+"))
-                    proc.wait()
-                    if proc.returncode == 0:
-                        break
-
-                if proc.returncode != 0:
-                    # raise Exception("error executing grub-install")
-                    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 as grub considers PBR problematic.")
-                    cleanup()
-                    sys.exit(1)
-            except CriticalException, error:
-                logging.critical("Fatal: %s", error)
+            # If using --grub-mbr then make sure we install grub in MBR instead of PBR
+            if options.grubmbr:
+                logging.debug("Using option --grub-mbr ...")
+                grub_device, x = get_device_from_partition(device)
+            else:
+                grub_device = device
+
+            logging.info("Installing grub as bootloader")
+            for opt in ["", "--force"]:
+                logging.debug("grub-install --recheck %s --no-floppy --root-directory=%s %s",
+                              opt, device_mountpoint, grub_device)
+                proc = subprocess.Popen([GRUB_INSTALL, "--recheck", opt, "--no-floppy",
+                                         "--root-directory=%s" % device_mountpoint, grub_device],
+                                        stdout=file(os.devnull, "r+"))
+                proc.wait()
+                if proc.returncode == 0:
+                    break
+
+            if proc.returncode != 0:
+                # raise Exception("error executing grub-install")
+                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 as grub considers PBR problematic.")
                 cleanup()
                 sys.exit(1)
-
+        except CriticalException as error:
+            logging.critical("Fatal: %s", error)
+            cleanup()
+            sys.exit(1)
         finally:
             unmount(device_mountpoint, "")
             os.rmdir(device_mountpoint)
@@ -523,14 +521,14 @@ def install_bootloader(device):
     if options.grub:
         try:
             install_grub(device)
-        except CriticalException, error:
+        except CriticalException as error:
             logging.critical("Fatal: %s", error)
             cleanup()
             sys.exit(1)
     else:
         try:
             install_syslinux(device)
-        except CriticalException, error:
+        except CriticalException as error:
             logging.critical("Fatal: %s", error)
             cleanup()
             sys.exit(1)
@@ -882,9 +880,9 @@ def update_grml_versions(iso_mount, target):
             for line in fileinput.input([target_grml_version_file], inplace=1):
                 flavour = get_flavour(line)
                 if flavour in iso_versions.keys():
-                    print iso_versions.pop(flavour)
+                    print(iso_versions.pop(flavour))
                 else:
-                    print line.strip()
+                    print(line.strip())
             fileinput.close()
 
             target_file = open(target_grml_version_file, 'a')
@@ -1117,7 +1115,7 @@ def install_iso_files(grml_flavour, iso_mount, device, target):
         try:
             copy_system_files(grml_flavour, iso_mount, target)
             copy_grml_files(grml_flavour, iso_mount, target)
-        except CriticalException, error:
+        except CriticalException as error:
             logging.critical("Execution failed: %s", error)
             sys.exit(1)
 
@@ -1142,9 +1140,7 @@ def get_device_from_partition(partition):
     device = partition
     partition_number = None
     if partition[-1].isdigit() and not RE_LOOP_DEVICE.match(partition):
-        m = RE_P_PARTITION.match(partition)
-        if not m:
-            m = RE_PARTITION.match(partition)
+        m = RE_P_PARTITION.match(partition) or RE_PARTITION.match(partition)
         if m:
             device = m.group(1)
             partition_number = int(m.group(2)) - 1
@@ -1170,12 +1166,10 @@ def identify_grml_flavour(mountpath):
             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)
+        cleanup()
+        sys.exit(1)
 
     flavours = []
     logging.debug("version_files = %s", version_files)
@@ -1185,10 +1179,6 @@ def identify_grml_flavour(mountpath):
             tmpfile = open(version_file, 'r')
             for line in tmpfile.readlines():
                 flavours.append(get_flavour(line))
-        except TypeError, e:
-            raise
-        except Exception, e:
-            raise
         finally:
             if tmpfile:
                 tmpfile.close()
@@ -1247,7 +1237,7 @@ def handle_grub_config(grml_flavour, device, target):
                 line = line.rstrip() + r' bootid=%s %s ' % (UUID, bootopt)
                 for regex in remove_regexes:
                     line = regex.sub(' ', line)
-            print line
+            print(line)
         fileinput.close()
 
 
@@ -1470,7 +1460,7 @@ def handle_bootloader_config(grml_flavour, device, target):
     else:
         try:
             handle_syslinux_config(grml_flavour, target)
-        except CriticalException, error:
+        except CriticalException as error:
             logging.critical("Fatal: %s", error)
             sys.exit(1)
 
@@ -1479,7 +1469,7 @@ def handle_bootloader_config(grml_flavour, device, target):
     else:
         try:
             handle_grub_config(grml_flavour, device, target)
-        except CriticalException, error:
+        except CriticalException as error:
             logging.critical("Fatal: %s", error)
             sys.exit(1)
 
@@ -1509,7 +1499,7 @@ def install(image, device):
         remove_image_mountpoint = True
         try:
             mount(image, iso_mountpoint, ["-o", "loop,ro", "-t", "iso9660"])
-        except CriticalException, error:
+        except CriticalException as error:
             logging.critical("Fatal: %s", error)
             sys.exit(1)
 
@@ -1519,7 +1509,7 @@ def install(image, device):
         if remove_image_mountpoint:
             try:
                 remove_mountpoint(iso_mountpoint)
-            except CriticalException, error:
+            except CriticalException as error:
                 cleanup()
                 raise
 
@@ -1542,9 +1532,7 @@ def install_grml(mountpoint, device):
             check_for_fat(device)
             check_boot_flag(device)
             mount(device, device_mountpoint, ['-o', 'utf8,iocharset=iso8859-1'])
-        except VerifyException, error:
-            raise
-        except CriticalException, error:
+        except CriticalException as error:
             mount(device, device_mountpoint, "")
     try:
         grml_flavours = identify_grml_flavour(mountpoint)
@@ -1568,7 +1556,7 @@ def remove_mountpoint(mountpoint):
         if os.path.isdir(mountpoint):
             os.rmdir(mountpoint)
             unregister_tmpfile(mountpoint)
-    except CriticalException, error:
+    except CriticalException as error:
         cleanup()
         raise
 
@@ -1596,6 +1584,7 @@ def handle_mbr(device):
     if options.syslinuxmbr:
         mbrcode = ""
         mbr_locations = ('/usr/lib/syslinux/mbr.bin',
+                         '/usr/lib/syslinux/bios/mbr.bin',
                          '/usr/share/syslinux/mbr.bin')
         for mbrpath in mbr_locations:
             if os.path.isfile(mbrpath):
@@ -1613,10 +1602,7 @@ def handle_mbr(device):
 
     try:
         install_mbr(mbrcode, mbr_device, partition_number, True)
-    except IOError, error:
-        logging.critical("Execution failed: %s", error)
-        sys.exit(1)
-    except Exception, error:
+    except (IOError, Exception) as error:
         logging.critical("Execution failed: %s", error)
         sys.exit(1)
 
@@ -1634,7 +1620,7 @@ def handle_vfat(device):
             sys.exit(1)
 
         if options.force:
-            print "Forcing mkfs.fat16 on %s as requested via option --force." % device
+            print("Forcing mkfs.fat16 on %s as requested via option --force." % device)
         else:
             # make sure the user is aware of what he is doing
             f = raw_input("Are you sure you want to format the specified partition with fat16? y/N ")
@@ -1644,7 +1630,7 @@ def handle_vfat(device):
                 sys.exit(1)
         try:
             mkfs_fat16(device)
-        except CriticalException, error:
+        except CriticalException as error:
             logging.critical("Execution failed: %s", error)
             sys.exit(1)
 
@@ -1652,16 +1638,14 @@ def handle_vfat(device):
     if device is not None and not os.path.isdir(device) and options.syslinux:
         try:
             check_for_fat(device)
-        except CriticalException, error:
+        except CriticalException as error:
             logging.critical("Execution failed: %s", error)
             sys.exit(1)
 
     if not os.path.isdir(device) and not check_for_usbdevice(device) and not options.force:
-        print "Warning: the specified device %s does not look like a removable usb device." % 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":
-            pass
-        else:
+        if f.lower() != "y":
             sys.exit(1)
 
 
@@ -1672,14 +1656,12 @@ def handle_compat_warning(device):
 
     # make sure we can replace old grml2usb script and warn user when using old way of life:
     if device.startswith("/mnt/external") or device.startswith("/mnt/usb") and not options.force:
-        print "Warning: the semantics of grml2usb has changed."
-        print "Instead of using grml2usb /path/to/iso %s you might" % device
-        print "want to use grml2usb /path/to/iso /dev/... instead."
-        print "Please check out the grml2usb manpage for details."
+        print("Warning: the semantics of grml2usb has changed.")
+        print("Instead of using grml2usb /path/to/iso %s you might" % device)
+        print("want to use grml2usb /path/to/iso /dev/... instead.")
+        print("Please check out the grml2usb manpage for details.")
         f = raw_input("Do you really want to continue? y/N ")
-        if f == "y" or f == "Y":
-            pass
-        else:
+        if f.lower() != "y":
             sys.exit(1)
 
 
@@ -1725,7 +1707,9 @@ def check_options(opts):
 def check_programs():
     """check if all needed programs are installed"""
     if options.grub:
-        if not which("grub-install"):
+        global GRUB_INSTALL
+        GRUB_INSTALL = which("grub-install") or which("grub2-install")
+        if not GRUB_INSTALL:
             logging.critical("Fatal: grub-install not available (please install the "
                              + "grub package or drop the --grub option)")
             sys.exit(1)
@@ -1757,7 +1741,7 @@ def main():
 
     try:
         if options.version:
-            print os.path.basename(sys.argv[0]) + " " + PROG_VERSION
+            print(os.path.basename(sys.argv[0]) + " " + PROG_VERSION)
             sys.exit(0)
 
         if len(args) < 2:
@@ -1818,7 +1802,7 @@ def main():
         # finally be polite :)
         logging.info("Finished execution of grml2usb (%s). Have fun with your Grml system.", PROG_VERSION)
 
-    except Exception, error:
+    except Exception as error:
         logging.critical("Fatal: %s", str(error))
         sys.exit(1)