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
import tempfile
import time
import uuid
+import shutil
# The line following this line is patched by debian/rules and tarball.sh.
PROG_VERSION = '***UNRELEASED***'
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+)$')
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()
- for device in MOUNTED:
+ for device in MOUNTED.copy():
try:
unmount(device, "")
- except RuntimeError:
+ logging.debug('Unmounted %s' % device)
+ except StandardError:
logging.debug('RuntimeError while umount %s, ignoring' % device)
- for tmpfile in TMPFILES:
+
+ for tmppath in TMPFILES.copy():
try:
- os.unlink(tmpfile)
- except RuntimeError:
+ 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 % tmpfile)
+ logging.debug(msg % tmppath)
def register_tmpfile(path):
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()
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. "
+ 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)
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"""
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)
logging.info("Note: you can boot flavour %s using '%s' on the commandline.", flavour, flavour)
# finally be polite :)
- logging.info("Finished execution of grml2usb (%s). Have fun with your grml system.", PROG_VERSION)
+ logging.info("Finished execution of grml2usb (%s). Have fun with your Grml system.", PROG_VERSION)
except Exception, error:
logging.critical("Fatal: %s", str(error))