Release new version 0.14.4
[grml2usb.git] / grml2usb
index 4e958b5..0fbf339 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -5,7 +5,7 @@
 grml2usb
 ~~~~~~~~
 
-This script installs a grml system (either a running system or ISO[s]) to a USB device
+This script installs a Grml system (either a running system or ISO[s]) to a USB device
 
 :copyright: (c) 2009, 2010, 2011 by Michael Prokop <mika@grml.org>
 :license: GPL v2 or any later version
@@ -28,6 +28,7 @@ import sys
 import tempfile
 import time
 import uuid
+import shutil
 
 # The line following this line is patched by debian/rules and tarball.sh.
 PROG_VERSION = '***UNRELEASED***'
@@ -161,19 +162,36 @@ def string2array(s):
 def cleanup():
     """Cleanup function to make sure there aren't any mounted devices left behind.
     """
+    def del_failed(fn, filepath, exc):
+        msg = "Deletion of %s failed in temporary folder %s"
+        logging.warn(msg % (filepath, path))
 
     logging.info("Cleaning up before exiting...")
     proc = subprocess.Popen(["sync"])
     proc.wait()
 
-    try:
-        for device in MOUNTED:
+    for device in MOUNTED.copy():
+        try:
             unmount(device, "")
-        for tmpfile in TMPFILES:
-            os.unlink(tmpfile)
-    # ignore: RuntimeError: Set changed size during iteration
-    except RuntimeError:
-        logging.debug('caught exception RuntimeError, ignoring')
+            logging.debug('Unmounted %s' % device)
+        except StandardError:
+            logging.debug('RuntimeError while umount %s, ignoring' % device)
+
+    for tmppath in TMPFILES.copy():
+        try:
+            if os.path.isdir(tmppath) and not os.path.islink(tmppath):
+                # symbolic links to directories are ignored
+                # without the check it will throw an OSError
+                shutil.rmtree(tmppath, onerror=del_failed)
+                logging.debug('temporary directory %s deleted' % tmppath)
+                unregister_tmpfile(tmppath)
+            elif os.path.isfile:
+                os.unlink(tmppath)
+                logging.debug('temporary file %s deleted' % tmppath)
+                unregister_tmpfile(tmppath)
+        except StandardError:
+            msg = 'RuntimeError while removing temporary %s, ignoring'
+            logging.debug(msg % tmppath)
 
 
 def register_tmpfile(path):
@@ -978,7 +996,7 @@ def build_loopbackcfg(target):
         logging.debug("Found source file" + sourcefile)
         os.path.isfile(ops) and f.write("source " + sourcefile + "\n")
 
-    f.write("source /boot/grub/adddons.cfg\n")
+    f.write("source /boot/grub/addons.cfg\n")
     f.write("source /boot/grub/footer.cfg\n")
     f.close()
 
@@ -1475,7 +1493,15 @@ def install(image, device):
     iso_mountpoint = image
     remove_image_mountpoint = False
     if os.path.isdir(image):
-        logging.info("Using %s as install base", image)
+        if options.force or os.path.exists(os.path.join(image, 'live')):
+            logging.info("Using %s as install base", image)
+        else:
+            q = raw_input("%s does not look like a Grml system. "
+                "Do you really want to use this image? y/N " % image)
+            if q.lower() == 'y':
+                logging.info("Using %s as install base", image)
+            else:
+                logging.info("Skipping install base %s", image)
     else:
         logging.info("Using ISO %s", image)
         iso_mountpoint = tempfile.mkdtemp(prefix="grml2usb", dir=os.path.abspath(options.tmpdir))
@@ -1499,7 +1525,7 @@ def install(image, device):
 
 
 def install_grml(mountpoint, device):
-    """Main logic for copying files of the currently running grml system.
+    """Main logic for copying files of the currently running Grml system.
 
     @mountpoint: directory where currently running live system resides (usually /lib/live/mount/medium)
     @device: partition where the specified ISO should be installed to"""
@@ -1789,8 +1815,8 @@ def main():
         for flavour in GRML_FLAVOURS:
             logging.info("Note: you can boot flavour %s using '%s' on the commandline.", flavour, flavour)
 
-        # finally be politely :)
-        logging.info("Finished execution of grml2usb (%s). Have fun with your grml system.", PROG_VERSION)
+        # finally be polite :)
+        logging.info("Finished execution of grml2usb (%s). Have fun with your Grml system.", PROG_VERSION)
 
     except Exception, error:
         logging.critical("Fatal: %s", str(error))