X-Git-Url: http://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=8c4277e8a3fb7964b0ead87a6a6b8c365711eb0a;hp=4e958b580efced1c3d032748c9368a71b3ef3cce;hb=5b3b5f7d12a5781ff3dbcfa233b693d22fd074ea;hpb=bb8723484d9384bc2e4095340be9ce7f9e58d802 diff --git a/grml2usb b/grml2usb index 4e958b5..8c4277e 100755 --- 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 :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***' @@ -41,6 +42,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+)$') @@ -161,19 +163,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): @@ -452,7 +471,7 @@ def install_grub(device): 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", + proc = subprocess.Popen([GRUB_INSTALL, "--recheck", opt, "--no-floppy", "--root-directory=%s" % device_mountpoint, grub_device], stdout=file(os.devnull, "r+")) proc.wait() @@ -978,7 +997,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 +1494,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 +1526,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""" @@ -1699,7 +1726,8 @@ def check_options(opts): def check_programs(): """check if all needed programs are installed""" if options.grub: - if not which("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) @@ -1789,8 +1817,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))