From e85e34ca0caed55bcdef5cd2937839b80b8656af Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Tue, 17 Feb 2009 23:36:55 +0100 Subject: [PATCH] Refactoring --- Makefile | 8 +- doc/pycallgraph.png | Bin 0 -> 140990 bytes grml2usb.8.txt | 20 +- grml2usb.py | 879 +++++++++++++++++++++++++++++----------------------- 4 files changed, 502 insertions(+), 405 deletions(-) create mode 100644 doc/pycallgraph.png diff --git a/Makefile b/Makefile index f52c685..0d1dfc6 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,9 @@ clean: rm -rf grml2usb.8.html grml2usb.8.xml grml2usb.8 html-stamp man-stamp codecheck: - pylint --reports=n --include-ids=y ./grml2usb.py + pylint --include-ids=y --max-line-length=120 grml2usb.py + # pylint --include-ids=y --disable-msg-cat=C0301 --disable-msg-cat=W0511 grml2usb.py + # pylint --reports=n --include-ids=y --disable-msg-cat=C0301 grml2usb.py -#graph: -# pycallgraph ./grml2usb.py TODO +# graph: +# sudo pycallgraph grml2usb /grml/isos/grml-small_2008.11.iso /dev/sdb1 diff --git a/doc/pycallgraph.png b/doc/pycallgraph.png new file mode 100644 index 0000000000000000000000000000000000000000..a2601d2953bcff5c159d5644ca96ad45bce9ee4a GIT binary patch literal 140990 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 My!E-Fvp0VI4}}oN_W%F@ literal 0 HcmV?d00001 diff --git a/grml2usb.8.txt b/grml2usb.8.txt index 5a961a6..3d8ead6 100644 --- a/grml2usb.8.txt +++ b/grml2usb.8.txt @@ -204,7 +204,7 @@ Directory layout on usb device Grabbing the source ~~~~~~~~~~~~~~~~~~~ - git clone git://git.grml.org/grml2usb.git + % git clone git://git.grml.org/grml2usb.git Developers Debugging Hints ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -212,21 +212,27 @@ Developers Debugging Hints To play with grml2usb you can avoid using a real device via a loopback file setup, like: - dd if=/dev/zero of=~/loopback bs=1M count=100 # adjust size to your needs - losetup /dev/loop1 ~/loopback + # dd if=/dev/zero of=~/loopback bs=1M count=100 # adjust size to your needs + # losetup /dev/loop1 ~/loopback Then create according partitions either running for example: - echo -en "n\np\n1\n\n\n t \n 6\n a\n1\n w\n" | fdisk /dev/loop1 + # echo -en "n\np\n1\n\n\nt\n6\na\n1\n w\n" | fdisk /dev/loop1 or: - parted /dev/loop1 -s "mkpart primary fat16 0 -1s mkfs 1 fat16" + # parted /dev/loop1 -s "mkpart primary fat16 0 -1s mkfs 1 fat16" Finally create a filesystem and execute grml2usb as needed: - mkfs.vfat /dev/loop1 - grml2usb --bootloader-only --mbr /grml/isos/grml-small_2008.11.iso /dev/loop1 + # mkfs.vfat /dev/loop1 + # grml2usb --bootloader-only --mbr /grml/isos/grml-small_2008.11.iso /dev/loop1 + +Performance tracing +~~~~~~~~~~~~~~~~~~~ + + # blktrace -d /dev/sdb -o - | blkparse -i - + # grml2usb grml_2008.11.iso /dev/sdb1 Frequently Asked Questions (FAQ) -------------------------------- diff --git a/grml2usb.py b/grml2usb.py index ff8f96c..5f01825 100755 --- a/grml2usb.py +++ b/grml2usb.py @@ -35,19 +35,20 @@ import datetime, logging, os, re, subprocess, sys, tempfile, time # global variables PROG_VERSION = "0.9.2(pre1)" -mounted = set() # register mountpoints -tmpfiles = set() # register tmpfiles -datestamp = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg +MOUNTED = set() # register mountpoints +TMPFILES = set() # register tmpfiles +DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg # cmdline parsing -usage = "Usage: %prog [options] <[ISO[s] | /live/image]> \n\ +USAGE = "Usage: %prog [options] <[ISO[s] | /live/image]> \n\ \n\ %prog installs a grml ISO to an USB device to be able to boot from it.\n\ Make sure you have at least one grml ISO or a running grml system (/live/image),\n\ syslinux (just run 'aptitude install syslinux' on Debian-based systems)\n\ and root access. Further information can be found in: man grml2usb" -parser = OptionParser(usage=usage) +# pylint: disable-msg=C0103 +parser = OptionParser(usage=USAGE) parser.add_option("--bootoptions", dest="bootoptions", action="store", type="string", help="use specified bootoptions as default") @@ -69,12 +70,12 @@ parser.add_option("--kernel", dest="kernel", action="store", type="string", help="install specified kernel instead of the default [TODO]") parser.add_option("--lilo", dest="lilo", action="store", type="string", help="lilo executable to be used for installing MBR") -parser.add_option("--mbr", dest="mbr", action="store_true", - help="install master boot record (MBR) on the device") parser.add_option("--quiet", dest="quiet", action="store_true", help="do not output anything but just errors on console") parser.add_option("--skip-addons", dest="skipaddons", action="store_true", help="do not install /boot/addons/ files") +parser.add_option("--skip-mbr", dest="skipmbr", action="store_true", + help="do not install a master boot record (MBR) on the device") parser.add_option("--squashfs", dest="squashfs", action="store", type="string", help="install specified squashfs file instead of the default [TODO]") parser.add_option("--uninstall", dest="uninstall", action="store_true", @@ -86,6 +87,13 @@ parser.add_option("-v", "--version", dest="version", action="store_true", (options, args) = parser.parse_args() +class CriticalException(Exception): + """Throw critical exception if the exact error is not known but fatal." + + @Exception: message""" + pass + + def cleanup(): """Cleanup function to make sure there aren't any mounted devices left behind. """ @@ -95,11 +103,41 @@ def cleanup(): proc.wait() try: - for device in mounted: + for device in MOUNTED: unmount(device, "") # ignore: RuntimeError: Set changed size during iteration - except: - pass + except RuntimeError: + logging.debug('caught expection RuntimeError, ignoring') + + +def register_tmpfile(path): + """TODO + """ + + TMPFILES.add(path) + + +def unregister_tmpfile(path): + """TODO + """ + + if path in TMPFILES: + TMPFILES.remove(path) + + +def register_mountpoint(target): + """TODO + """ + + MOUNTED.add(target) + + +def unregister_mountpoint(target): + """TODO + """ + + if target in MOUNTED: + MOUNTED.remove(target) def get_function_name(obj): @@ -112,16 +150,18 @@ def get_function_name(obj): return obj.__module__ + '.' + obj.__name__ -def execute(f, *args): +def execute(f, *exec_arguments): """Wrapper for executing a command. Either really executes the command (default) or when using --dry-run commandline option just displays what would be executed.""" # usage: execute(subprocess.Popen, (["ls", "-la"])) # TODO: doesn't work for proc = execute(subprocess.Popen...() -> any ideas? if options.dryrun: - logging.debug('dry-run only: %s(%s)' % (get_function_name(f), ', '.join(map(repr, args)))) + # pylint: disable-msg=W0141 + logging.debug('dry-run only: %s(%s)' % (get_function_name(f), ', '.join(map(repr, exec_arguments)))) else: - return f(*args) + # pylint: disable-msg=W0142 + return f(*exec_arguments) def is_exe(fpath): @@ -136,7 +176,7 @@ def which(program): """Check whether a given program is available in PATH @program: name of executable""" - fpath, fname = os.path.split(program) + fpath = os.path.split(program)[0] if fpath: if is_exe(program): return program @@ -156,7 +196,9 @@ def search_file(filename, search_path='/bin' + os.pathsep + '/usr/bin'): @search_path: path where searching for the specified filename""" file_found = 0 paths = search_path.split(os.pathsep) + current_dir = '' # make pylint happy :) for path in paths: + # pylint: disable-msg=W0612 for current_dir, directories, files in os.walk(path): if os.path.exists(os.path.join(current_dir, filename)): file_found = 1 @@ -184,25 +226,7 @@ def mkfs_fat16(device): proc = subprocess.Popen(["mkfs.vfat", "-F", "16", device]) proc.wait() if proc.returncode != 0: - raise Exception, "error executing mkfs.vfat" - - -def install_syslinux(device): - """Install syslinux on specified device. - - @device: partition where syslinux should be installed to""" - - if options.dryrun: - logging.info("Would install syslinux as bootloader on %s", device) - return 0 - - # syslinux -d boot/isolinux /dev/sdb1 - logging.info("Installing syslinux as bootloader") - logging.debug("syslinux -d boot/syslinux %s" % device) - proc = subprocess.Popen(["syslinux", "-d", "boot/syslinux", device]) - proc.wait() - if proc.returncode != 0: - raise Exception, "error executing syslinux" + raise Exception("error executing mkfs.vfat") def generate_grub_config(grml_flavour): @@ -227,7 +251,7 @@ kernel /boot/release/%(grml_flavour)s/linux26 apm=power-off lang=us vga=791 quie initrd /boot/release/%(grml_flavour)s/initrd.gz # TODO: extend configuration :) -""" % locals()) +""" % {'grml_flavour': grml_flavour} ) def generate_isolinux_splash(grml_flavour): @@ -244,7 +268,7 @@ def generate_isolinux_splash(grml_flavour): Some information and boot options available via keys F2 - F10. http://grml.org/ %(grml_name)s -""" % locals()) +""" % {'grml_name': grml_name} ) def generate_main_syslinux_config(grml_flavour, bootoptions): @@ -253,7 +277,7 @@ def generate_main_syslinux_config(grml_flavour, bootoptions): @grml_flavour: name of grml flavour the configuration should be generated for @bootoptions: bootoptions that should be used as a default""" - local_datestamp = datestamp + local_datestamp = DATESTAMP return("""\ ## main syslinux configuration - generated by grml2usb [main config generated at: %(local_datestamp)s] @@ -299,7 +323,7 @@ KERNEL /boot/addons/memdisk APPEND initrd=/boot/addons/balder10.imz ## end of global configuration -""" % locals()) +""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, 'bootoptions': bootoptions} ) def generate_flavour_specific_syslinux_config(grml_flavour, bootoptions): @@ -308,7 +332,7 @@ def generate_flavour_specific_syslinux_config(grml_flavour, bootoptions): @grml_flavour: name of grml flavour the configuration should be generated for @bootoptions: bootoptions that should be used as a default""" - local_datestamp = datestamp + local_datestamp = DATESTAMP return("""\ @@ -350,8 +374,8 @@ APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live n # flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] LABEL %(grml_flavour)s-serial KERNEL /boot/release/%(grml_flavour)s/linux26 -APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet module=%(grml_flavour)s vga=normal video=vesafb:off console=tty1 console=ttyS0,9600n8 %(bootoptions)s -""" % locals()) +APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet module=%(grml_flavour)s vga=normal video=vesafb:off console=tty1 console=ttyS0,9600n8 %(bootoptions)s +""" % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, 'bootoptions': bootoptions} ) def install_grub(device): @@ -365,6 +389,24 @@ def install_grub(device): logging.critical("TODO: sorry - grub-install %s not implemented yet" % device) +def install_syslinux(device): + """Install syslinux on specified device. + + @device: partition where syslinux should be installed to""" + + if options.dryrun: + logging.info("Would install syslinux as bootloader on %s", device) + return 0 + + # syslinux -d boot/isolinux /dev/sdb1 + logging.info("Installing syslinux as bootloader") + logging.debug("syslinux -d boot/syslinux %s" % device) + proc = subprocess.Popen(["syslinux", "-d", "boot/syslinux", device]) + proc.wait() + if proc.returncode != 0: + raise Exception("error executing syslinux") + + def install_bootloader(device): """Install bootloader on specified device. @@ -383,51 +425,8 @@ def install_bootloader(device): install_syslinux(device) -def is_writeable(device): - """Check if the device is writeable for the current user - - @device: partition where bootloader should be installed to""" - - if not device: - return False - #raise Exception, "no device for checking write permissions" - - if not os.path.exists(device): - return False - - return os.access(device, os.W_OK) and os.access(device, os.R_OK) - - -def install_mbr(device): - """Install a default master boot record on given device - - @device: device where MBR should be installed to""" - - if not is_writeable(device): - raise IOError, "device not writeable for user" - - # use specified lilo - if options.lilo: - lilo = options.lilo - else: - # otherwise try to use system's lilo - if which("lilo"): - lilo = which("lilo") - print "debug: lilo = %s" % lilo - else: - # finally fall back to our static version - from platform import architecture - if architecture()[0] == '64bit': - lilo = '/usr/share/grml2usb/lilo/lilo.static.amd64' - else: - lilo = '/usr/share/grml2usb/lilo/lilo.static.i386' - - if not is_exe(lilo): - raise Exception, "lilo executable can not be execute" - - if options.dryrun: - logging.info("Would install MBR running lilo and using syslinux.") - return 0 +def install_lilo_mbr(lilo, device): + """TODO""" # to support -A for extended partitions: logging.info("Installing MBR") @@ -435,18 +434,22 @@ def install_mbr(device): proc = subprocess.Popen([lilo, "-S", "/dev/null", "-M", device, "ext"]) proc.wait() if proc.returncode != 0: - raise Exception, "error executing lilo" + raise Exception("error executing lilo") # activate partition: logging.debug("%s -S /dev/null -A %s 1" % (lilo, device)) proc = subprocess.Popen([lilo, "-S", "/dev/null", "-A", device, "1"]) proc.wait() if proc.returncode != 0: - raise Exception, "error executing lilo" + raise Exception("error executing lilo") + + +def install_syslinux_mbr(device): + """TODO""" # 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" + raise Exception("/usr/lib/syslinux/mbr.bin can not be read") logging.debug("cat /usr/lib/syslinux/mbr.bin > %s" % device) try: @@ -458,34 +461,52 @@ def install_mbr(device): logging.critical("Execution failed:", error) -def register_tmpfile(path): - """TODO - """ +def install_mbr(device): + """Install a default master boot record on given device - tmpfiles.add(path) + @device: device where MBR should be installed to""" + if not is_writeable(device): + raise IOError("device not writeable for user") -def unregister_tmpfile(path): - """TODO - """ + # try to use system's lilo + if which("lilo"): + lilo = which("lilo") + else: + # otherwise fall back to our static version + from platform import architecture + if architecture()[0] == '64bit': + lilo = '/usr/share/grml2usb/lilo/lilo.static.amd64' + else: + lilo = '/usr/share/grml2usb/lilo/lilo.static.i386' + # finally prefer a specified lilo executable + if options.lilo: + lilo = options.lilo + + if not is_exe(lilo): + raise Exception("lilo executable can not be execute") - if path in tmpfiles: - tmpfiles.remove(path) + if options.dryrun: + logging.info("Would install MBR running lilo and using syslinux.") + return 0 + install_lilo_mbr(lilo, device) + install_syslinux_mbr(device) -def register_mountpoint(target): - """TODO - """ - mounted.add(target) +def is_writeable(device): + """Check if the device is writeable for the current user + @device: partition where bootloader should be installed to""" -def unregister_mountpoint(target): - """TODO - """ + if not device: + return False + #raise Exception("no device for checking write permissions") - if target in mounted: - mounted.remove(target) + if not os.path.exists(device): + return False + + return os.access(device, os.W_OK) and os.access(device, os.R_OK) def mount(source, target, mount_options): @@ -501,7 +522,7 @@ def mount(source, target, mount_options): proc = subprocess.Popen(["mount"] + list(mount_options) + [source, target]) proc.wait() if proc.returncode != 0: - raise Exception, "Error executing mount" + raise CriticalException("Error executing mount") else: logging.debug("register_mountpoint(%s)" % target) register_mountpoint(target) @@ -528,7 +549,7 @@ def unmount(target, unmount_options): proc = subprocess.Popen(["umount"] + list(unmount_options) + [target]) proc.wait() if proc.returncode != 0: - raise Exception, "Error executing umount" + raise Exception("Error executing umount") else: logging.debug("unregister_mountpoint(%s)" % target) unregister_mountpoint(target) @@ -556,230 +577,213 @@ def check_for_fat(partition): @partition: device name of partition""" try: - udev_info = subprocess.Popen(["/lib/udev/vol_id", "-t", partition], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + udev_info = subprocess.Popen(["/lib/udev/vol_id", "-t", partition], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) filesystem = udev_info.communicate()[0].rstrip() if udev_info.returncode == 2: - raise Exception, "Failed to read device %s - wrong UID / permissions?" % partition + raise CriticalException("Failed to read device %s" + "(wrong UID/permissions or device not present?)" % partition) if filesystem != "vfat": - raise Exception, "Device %s does not contain a FAT16 partition." % partition + raise CriticalException("Device %s does not contain a FAT16 partition." % partition) except OSError: - raise Exception, "Sorry, /lib/udev/vol_id not available." + raise CriticalException("Sorry, /lib/udev/vol_id not available.") def mkdir(directory): """Simple wrapper around os.makedirs to get shell mkdir -p behaviour""" + # just silently pass as it's just fine it the directory exists if not os.path.isdir(directory): try: os.makedirs(directory) + # pylint: disable-msg=W0704 except OSError: - # just silently pass as it's just fine it the directory exists pass -def copy_grml_files(grml_flavour, iso_mount, target): - """Copy files from ISO on given target""" +def copy_system_files(grml_flavour, iso_mount, target): + """TODO""" - # TODO - # * provide alternative search_file() if file information is stored in a config.ini file? - # * catch "install: .. No space left on device" & CO - # * abstract copy logic to make the code shorter and get rid of spaghettis ;) + squashfs = search_file(grml_flavour + '.squashfs', iso_mount) + if squashfs is None: + logging.critical("Fatal: squashfs file not found") + else: + squashfs_target = target + '/live/' + execute(mkdir, squashfs_target) + # use install(1) for now to make sure we can write the files afterwards as normal user as well + logging.debug("cp %s %s" % (squashfs, target + '/live/' + grml_flavour + '.squashfs')) + proc = subprocess.Popen(["install", "--mode=664", squashfs, squashfs_target + grml_flavour + ".squashfs"]) + proc.wait() - if options.dryrun: - logging.info("Would copy files to %s", iso_mount) - return 0 - elif not options.bootloaderonly: - logging.info("Copying files. This might take a while....") + filesystem_module = search_file('filesystem.module', iso_mount) + if filesystem_module is None: + logging.critical("Fatal: filesystem.module not found") + else: + logging.debug("cp %s %s" % (filesystem_module, squashfs_target + grml_flavour + '.module')) + proc = subprocess.Popen(["install", "--mode=664", filesystem_module, + squashfs_target + grml_flavour + '.module']) + proc.wait() - squashfs = search_file(grml_flavour + '.squashfs', iso_mount) - if squashfs is None: - logging.critical("Fatal: squashfs file not found") - else: - squashfs_target = target + '/live/' - execute(mkdir, squashfs_target) - # use install(1) for now to make sure we can write the files afterwards as normal user as well - logging.debug("cp %s %s" % (squashfs, target + '/live/' + grml_flavour + '.squashfs')) - proc = subprocess.Popen(["install", "--mode=664", squashfs, squashfs_target + grml_flavour + ".squashfs"]) - proc.wait() + release_target = target + '/boot/release/' + grml_flavour + execute(mkdir, release_target) + + kernel = search_file('linux26', iso_mount) + if kernel is None: + logging.critical("Fatal kernel not found") + else: + logging.debug("cp %s %s" % (kernel, release_target + '/linux26')) + proc = subprocess.Popen(["install", "--mode=664", kernel, release_target + '/linux26']) + proc.wait() + + initrd = search_file('initrd.gz', iso_mount) + if initrd is None: + logging.critical("Fatal: initrd not found") + else: + logging.debug("cp %s %s" % (initrd, release_target + '/initrd.gz')) + proc = subprocess.Popen(["install", "--mode=664", initrd, release_target + '/initrd.gz']) + proc.wait() + + +def copy_grml_files(iso_mount, target): + """TODO""" + + grml_target = target + '/grml/' + execute(mkdir, grml_target) - filesystem_module = search_file('filesystem.module', iso_mount) - if filesystem_module is None: - logging.critical("Fatal: filesystem.module not found") + for myfile in 'grml-cheatcodes.txt', 'grml-version', 'LICENSE.txt', 'md5sums', 'README.txt': + grml_file = search_file(myfile, iso_mount) + if grml_file is None: + logging.warn("Warning: myfile %s could not be found - can not install it", myfile) else: - logging.debug("cp %s %s" % (filesystem_module, squashfs_target + grml_flavour + '.module')) - proc = subprocess.Popen(["install", "--mode=664", filesystem_module, squashfs_target + grml_flavour + '.module']) + logging.debug("cp %s %s" % (grml_file, grml_target + grml_file)) + proc = subprocess.Popen(["install", "--mode=664", grml_file, grml_target + myfile]) proc.wait() - release_target = target + '/boot/release/' + grml_flavour - execute(mkdir, release_target) + grml_web_target = grml_target + '/web/' + execute(mkdir, grml_web_target) - kernel = search_file('linux26', iso_mount) - if kernel is None: - logging.critical("Fatal kernel not found") + for myfile in 'index.html', 'style.css': + grml_file = search_file(myfile, iso_mount) + if grml_file is None: + logging.warn("Warning: myfile %s could not be found - can not install it") else: - logging.debug("cp %s %s" % (kernel, release_target + '/linux26')) - proc = subprocess.Popen(["install", "--mode=664", kernel, release_target + '/linux26']) + logging.debug("cp %s %s" % (grml_file, grml_web_target + grml_file)) + proc = subprocess.Popen(["install", "--mode=664", grml_file, grml_web_target + myfile]) proc.wait() - initrd = search_file('initrd.gz', iso_mount) - if initrd is None: - logging.critical("Fatal: initrd not found") + grml_webimg_target = grml_web_target + '/images/' + execute(mkdir, grml_webimg_target) + + for myfile in 'button.png', 'favicon.png', 'linux.jpg', 'logo.png': + grml_file = search_file(myfile, iso_mount) + if grml_file is None: + logging.warn("Warning: myfile %s could not be found - can not install it") else: - logging.debug("cp %s %s" % (initrd, release_target + '/initrd.gz')) - proc = subprocess.Popen(["install", "--mode=664", initrd, release_target + '/initrd.gz']) + logging.debug("cp %s %s" % (grml_file, grml_webimg_target + grml_file)) + proc = subprocess.Popen(["install", "--mode=664", grml_file, grml_webimg_target + myfile]) proc.wait() - grml_target = target + '/grml/' - execute(mkdir, grml_target) - - for myfile in 'grml-cheatcodes.txt', 'grml-version', 'LICENSE.txt', 'md5sums', 'README.txt': - grml_file = search_file(myfile, iso_mount) - if grml_file is None: - logging.warn("Warning: myfile %s could not be found - can not install it", myfile) - else: - logging.debug("cp %s %s" % (grml_file, grml_target + grml_file)) - proc = subprocess.Popen(["install", "--mode=664", grml_file, grml_target + myfile]) - proc.wait() - - grml_web_target = grml_target + '/web/' - execute(mkdir, grml_web_target) - - for myfile in 'index.html', 'style.css': - grml_file = search_file(myfile, iso_mount) - if grml_file is None: - logging.warn("Warning: myfile %s could not be found - can not install it") - else: - logging.debug("cp %s %s" % (grml_file, grml_web_target + grml_file)) - proc = subprocess.Popen(["install", "--mode=664", grml_file, grml_web_target + myfile]) - proc.wait() - - grml_webimg_target = grml_web_target + '/images/' - execute(mkdir, grml_webimg_target) - - for myfile in 'button.png', 'favicon.png', 'linux.jpg', 'logo.png': - grml_file = search_file(myfile, iso_mount) - if grml_file is None: - logging.warn("Warning: myfile %s could not be found - can not install it") - else: - logging.debug("cp %s %s" % (grml_file, grml_webimg_target + grml_file)) - proc = subprocess.Popen(["install", "--mode=664", grml_file, grml_webimg_target + myfile]) - proc.wait() - if not options.skipaddons: - addons = target + '/boot/addons/' - execute(mkdir, addons) +def copy_addons(iso_mount, target): + """TODO""" + addons = target + '/boot/addons/' + execute(mkdir, addons) - # grub all-in-one image - allinoneimg = search_file('allinone.img', iso_mount) - if allinoneimg is None: - logging.warn("Warning: allinone.img not found - can not install it") - else: - logging.debug("cp %s %s" % (allinoneimg, addons + '/allinone.img')) - proc = subprocess.Popen(["install", "--mode=664", allinoneimg, addons + 'allinone.img']) - proc.wait() + # grub all-in-one image + allinoneimg = search_file('allinone.img', iso_mount) + if allinoneimg is None: + logging.warn("Warning: allinone.img not found - can not install it") + else: + logging.debug("cp %s %s" % (allinoneimg, addons + '/allinone.img')) + proc = subprocess.Popen(["install", "--mode=664", allinoneimg, addons + 'allinone.img']) + proc.wait() - # freedos image - balderimg = search_file('balder10.imz', iso_mount) - if balderimg is None: - logging.warn("Warning: balder10.imz not found - can not install it") - else: - logging.debug("cp %s %s" % (balderimg, addons + '/balder10.imz')) - proc = subprocess.Popen(["install", "--mode=664", balderimg, addons + 'balder10.imz']) - proc.wait() + # freedos image + balderimg = search_file('balder10.imz', iso_mount) + if balderimg is None: + logging.warn("Warning: balder10.imz not found - can not install it") + else: + logging.debug("cp %s %s" % (balderimg, addons + '/balder10.imz')) + proc = subprocess.Popen(["install", "--mode=664", balderimg, addons + 'balder10.imz']) + proc.wait() - # memtest86+ image - memdiskimg = search_file('memdisk', iso_mount) - if memdiskimg is None: - logging.warn("Warning: memdisk not found - can not install it") - else: - logging.debug("cp %s %s" % (memdiskimg, addons + '/memdisk')) - proc = subprocess.Popen(["install", "--mode=664", memdiskimg, addons + 'memdisk']) - proc.wait() + # memtest86+ image + memdiskimg = search_file('memdisk', iso_mount) + if memdiskimg is None: + logging.warn("Warning: memdisk not found - can not install it") + else: + logging.debug("cp %s %s" % (memdiskimg, addons + '/memdisk')) + proc = subprocess.Popen(["install", "--mode=664", memdiskimg, addons + 'memdisk']) + proc.wait() - if not options.copyonly: - syslinux_target = target + '/boot/syslinux/' - execute(mkdir, syslinux_target) - logo = search_file('logo.16', iso_mount) - logging.debug("cp %s %s" % (logo, syslinux_target + 'logo.16')) - proc = subprocess.Popen(["install", "--mode=664", logo, syslinux_target + 'logo.16']) +def copy_bootloader_files(iso_mount, target): + """"TODO""" + + syslinux_target = target + '/boot/syslinux/' + execute(mkdir, syslinux_target) + + logo = search_file('logo.16', iso_mount) + logging.debug("cp %s %s" % (logo, syslinux_target + 'logo.16')) + proc = subprocess.Popen(["install", "--mode=664", 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) + logging.debug("cp %s %s" % (bootsplash, syslinux_target + ffile)) + proc = subprocess.Popen(["install", "--mode=664", bootsplash, syslinux_target + ffile]) proc.wait() - for ffile in 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10': - bootsplash = search_file(ffile, iso_mount) - logging.debug("cp %s %s" % (bootsplash, syslinux_target + ffile)) - proc = subprocess.Popen(["install", "--mode=664", bootsplash, syslinux_target + ffile]) - proc.wait() + grub_target = target + '/boot/grub/' + execute(mkdir, grub_target) - grub_target = target + '/boot/grub/' - execute(mkdir, grub_target) + if not os.path.isfile("/usr/share/grml2usb/grub/splash.xpm.gz"): + logging.critical("Error: /usr/share/grml2usb/grub/splash.xpm.gz can not be read.") + raise + else: + logging.debug("cp /usr/share/grml2usb/grub/splash.xpm.gz %s" % grub_target + 'splash.xpm.gz') + proc = subprocess.Popen(["install", "--mode=664", '/usr/share/grml2usb/grub/splash.xpm.gz', + grub_target + 'splash.xpm.gz']) + proc.wait() - if not os.path.isfile("/usr/share/grml2usb/grub/splash.xpm.gz"): - logging.critical("Error: /usr/share/grml2usb/grub/splash.xpm.gz can not be read.") - raise - else: - logging.debug("cp /usr/share/grml2usb/grub/splash.xpm.gz %s" % grub_target + 'splash.xpm.gz') - proc = subprocess.Popen(["install", "--mode=664", '/usr/share/grml2usb/grub/splash.xpm.gz', grub_target + 'splash.xpm.gz']) - proc.wait() + if not os.path.isfile("/usr/share/grml2usb/grub/stage2_eltorito"): + logging.critical("Error: /usr/share/grml2usb/grub/stage2_eltorito can not be read.") + raise + else: + logging.debug("cp /usr/share/grml2usb/grub/stage2_eltorito to %s" % grub_target + 'stage2_eltorito') + proc = subprocess.Popen(["install", "--mode=664", '/usr/share/grml2usb/grub/stage2_eltorito', + grub_target + 'stage2_eltorito']) + proc.wait() - if not os.path.isfile("/usr/share/grml2usb/grub/stage2_eltorito"): - logging.critical("Error: /usr/share/grml2usb/grub/stage2_eltorito can not be read.") - raise - else: - logging.debug("cp /usr/share/grml2usb/grub/stage2_eltorito to %s" % grub_target + 'stage2_eltorito') - proc = subprocess.Popen(["install", "--mode=664", '/usr/share/grml2usb/grub/stage2_eltorito', grub_target + 'stage2_eltorito']) - proc.wait() - if not options.dryrun: - logging.debug("Generating grub configuration") - #with open("...", "w") as f: - #f.write("bla bla bal") - grub_config_file = open(grub_target + 'menu.lst', 'w') - grub_config_file.write(generate_grub_config(grml_flavour)) - grub_config_file.close() - - logging.info("Generating syslinux configuration") - syslinux_cfg = syslinux_target + 'syslinux.cfg' - - # install main configuration only *once*, no matter how many ISOs we have: - if os.path.isfile(syslinux_cfg): - string = open(syslinux_cfg).readline() - main_identifier = re.compile(".*main config generated at: %s.*" % re.escape(str(datestamp))) - if not re.match(main_identifier, string): - syslinux_config_file = open(syslinux_cfg, 'w') - logging.info("Notice: grml flavour %s is being installed as the default booting system." % grml_flavour) - syslinux_config_file.write(generate_main_syslinux_config(grml_flavour, options.bootoptions)) - syslinux_config_file.close() - else: - syslinux_config_file = open(syslinux_cfg, 'w') - syslinux_config_file.write(generate_main_syslinux_config(grml_flavour, options.bootoptions)) - syslinux_config_file.close() - - # install flavour specific configuration only *once* as well - # kind of ugly - I'm pretty sure this could be smoother... - flavour_config = True - if os.path.isfile(syslinux_cfg): - string = open(syslinux_cfg).readlines() - logging.info("Notice: you can boot flavour %s using '%s' on the commandline." % (grml_flavour, grml_flavour)) - flavour = re.compile("grml2usb for %s: %s" % (re.escape(grml_flavour), re.escape(str(datestamp)))) - for line in string: - if flavour.match(line): - flavour_config = False - - - if flavour_config: - syslinux_config_file = open(syslinux_cfg, 'a') - syslinux_config_file.write(generate_flavour_specific_syslinux_config(grml_flavour, options.bootoptions)) - syslinux_config_file.close( ) - - logging.debug("Generating isolinux/syslinux splash %s" % syslinux_target + 'boot.msg') - isolinux_splash = open(syslinux_target + 'boot.msg', 'w') - isolinux_splash.write(generate_isolinux_splash(grml_flavour)) - isolinux_splash.close( ) +def install_iso_files(grml_flavour, iso_mount, target): + """Copy files from ISO on given target""" + + # TODO + # * make sure grml_flavour, iso_mount, target are set when the function is called, otherwise raise exception + # * provide alternative search_file() if file information is stored in a config.ini file? + # * catch "install: .. No space left on device" & CO + # * abstract copy logic to make the code shorter and get rid of spaghettis ;) + + if options.dryrun: + logging.info("Would copy files to %s", iso_mount) + return 0 + elif not options.bootloaderonly: + logging.info("Copying files. This might take a while....") + copy_system_files(grml_flavour, iso_mount, target) + copy_grml_files(iso_mount, target) + + if not options.skipaddons: + copy_addons(iso_mount, target) + + if not options.copyonly: + copy_bootloader_files(iso_mount, target) + if not options.dryrun: + handle_bootloader_config(grml_flavour, target) # FIXME # make sure we sync filesystems before returning proc = subprocess.Popen(["sync"]) @@ -820,6 +824,62 @@ def identify_grml_flavour(mountpath): return grml_flavour +def handle_bootloader_config(grml_flavour, target): + """TODO""" + + logging.debug("Generating grub configuration") + #with open("...", "w") as f: + #f.write("bla bla bal") + + grub_target = target + '/boot/grub/' + # should be present via copy_bootloader_files(), but make sure it exists: + execute(mkdir, grub_target) + grub_config_file = open(grub_target + 'menu.lst', 'w') + grub_config_file.write(generate_grub_config(grml_flavour)) + grub_config_file.close() + + logging.info("Generating syslinux configuration") + syslinux_target = target + '/boot/syslinux/' + # should be present via copy_bootloader_files(), but make sure it exits: + execute(mkdir, syslinux_target) + syslinux_cfg = syslinux_target + 'syslinux.cfg' + + # install main configuration only *once*, no matter how many ISOs we have: + if os.path.isfile(syslinux_cfg): + string = open(syslinux_cfg).readline() + main_identifier = re.compile(".*main config generated at: %s.*" % re.escape(str(DATESTAMP))) + if not re.match(main_identifier, string): + syslinux_config_file = open(syslinux_cfg, 'w') + logging.info("Notice: grml flavour %s is being installed as the default booting system." % grml_flavour) + syslinux_config_file.write(generate_main_syslinux_config(grml_flavour, options.bootoptions)) + syslinux_config_file.close() + else: + syslinux_config_file = open(syslinux_cfg, 'w') + syslinux_config_file.write(generate_main_syslinux_config(grml_flavour, options.bootoptions)) + syslinux_config_file.close() + + # install flavour specific configuration only *once* as well + # kind of ugly - I'm pretty sure this could be smoother... + flavour_config = True + if os.path.isfile(syslinux_cfg): + string = open(syslinux_cfg).readlines() + logging.info("Notice: you can boot flavour %s using '%s' on the commandline." % (grml_flavour, grml_flavour)) + flavour = re.compile("grml2usb for %s: %s" % (re.escape(grml_flavour), re.escape(str(DATESTAMP)))) + for line in string: + if flavour.match(line): + flavour_config = False + + if flavour_config: + syslinux_config_file = open(syslinux_cfg, 'a') + syslinux_config_file.write(generate_flavour_specific_syslinux_config(grml_flavour, options.bootoptions)) + syslinux_config_file.close( ) + + logging.debug("Generating isolinux/syslinux splash %s" % syslinux_target + 'boot.msg') + isolinux_splash = open(syslinux_target + 'boot.msg', 'w') + isolinux_splash.write(generate_isolinux_splash(grml_flavour)) + isolinux_splash.close( ) + + def handle_iso(iso, device): """Main logic for mounting ISOs and copying files. @@ -831,112 +891,90 @@ def handle_iso(iso, device): if os.path.isdir(iso): logging.critical("TODO: /live/image handling not yet implemented - sorry") # TODO sys.exit(1) - else: - iso_mountpoint = tempfile.mkdtemp() - register_tmpfile(iso_mountpoint) - remove_iso_mountpoint = True - - if not os.path.isfile(iso): - logging.critical("Fatal: specified ISO %s could not be read" % iso) - cleanup() - sys.exit(1) - - try: - mount(iso, iso_mountpoint, ["-o", "loop", "-t", "iso9660"]) - except Exception, error: - logging.critical("Fatal: %s" % error) - sys.exit(1) - - if os.path.isdir(device): - logging.info("Specified target is a directory, not mounting therefor.") - device_mountpoint = device - remove_device_mountpoint = False - # skip_mbr = True - - else: - device_mountpoint = tempfile.mkdtemp() - register_tmpfile(device_mountpoint) - remove_device_mountpoint = True - try: - mount(device, device_mountpoint, "") - except Exception, error: - logging.critical("Fatal: %s" % error) - cleanup() - - try: - grml_flavour = identify_grml_flavour(iso_mountpoint) - logging.info("Identified grml flavour \"%s\"." % grml_flavour) - copy_grml_files(grml_flavour, iso_mountpoint, 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, "") - os.rmdir(iso_mountpoint) - unregister_tmpfile(iso_mountpoint) + iso_mountpoint = tempfile.mkdtemp() + register_tmpfile(iso_mountpoint) + remove_iso_mountpoint = True - if remove_device_mountpoint: - unmount(device_mountpoint, "") - - if os.path.isdir(device_mountpoint): - os.rmdir(device_mountpoint) - unregister_tmpfile(device_mountpoint) - - # grml_flavour_short = grml_flavour.replace('-','') - # logging.debug("grml_flavour_short = %s" % grml_flavour_short) - - -def main(): - """Main function [make pylint happy :)]""" - - if options.version: - print os.path.basename(sys.argv[0]) + " " + PROG_VERSION - sys.exit(0) + if not os.path.isfile(iso): + logging.critical("Fatal: specified ISO %s could not be read" % iso) + cleanup() + sys.exit(1) - if len(args) < 2: - parser.error("invalid usage") + try: + mount(iso, iso_mountpoint, ["-o", "loop", "-t", "iso9660"]) + except CriticalException, error: + logging.critical("Fatal: %s" % error) + sys.exit(1) - # log handling - if options.verbose: - FORMAT = "%(asctime)-15s %(message)s" - logging.basicConfig(level=logging.DEBUG, format=FORMAT) - elif options.quiet: - FORMAT = "Critial: %(message)s" - logging.basicConfig(level=logging.CRITICAL, format=FORMAT) + if os.path.isdir(device): + logging.info("Specified target is a directory, not mounting therefor.") + device_mountpoint = device + remove_device_mountpoint = False + # skip_mbr = True else: - FORMAT = "Info: %(message)s" - logging.basicConfig(level=logging.INFO, format=FORMAT) + device_mountpoint = tempfile.mkdtemp() + register_tmpfile(device_mountpoint) + remove_device_mountpoint = True + try: + mount(device, device_mountpoint, "") + except CriticalException, error: + logging.critical("Fatal: %s" % error) + cleanup() - check_uid_root() + try: + grml_flavour = identify_grml_flavour(iso_mountpoint) + logging.info("Identified grml flavour \"%s\"." % grml_flavour) + install_iso_files(grml_flavour, iso_mountpoint, 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, "") + os.rmdir(iso_mountpoint) + unregister_tmpfile(iso_mountpoint) + if remove_device_mountpoint: + unmount(device_mountpoint, "") + if os.path.isdir(device_mountpoint): + os.rmdir(device_mountpoint) + unregister_tmpfile(device_mountpoint) - if options.dryrun: - logging.info("Running in simulate mode as requested via option dry-run.") - # specified arguments - device = args[len(args) - 1] - isos = args[0:len(args) - 1] +def handle_mbr(device): + """TODO""" - # 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." - f = raw_input("Do you really want to continue? y/N ") - if f == "y" or f == "Y": - pass - else: - sys.exit(1) + # install MBR + # if not options.mbr: + # logging.info("You are NOT using the --mbr option. Consider using it if your device does not boot.") + # else: + # make sure we install MBR on /dev/sdX and not /dev/sdX# # make sure we have syslinux available - if options.mbr: + # if options.mbr: + if not options.skipmbr: if not which("syslinux") and not options.copyonly and not options.dryrun: logging.critical('Sorry, syslinux not available. Exiting.') logging.critical('Please install syslinux or consider using the --grub option.') sys.exit(1) + if not options.skipmbr: + if device[-1:].isdigit(): + mbr_device = re.match(r'(.*?)\d*$', device).group(1) + + try: + install_mbr(mbr_device) + except IOError, error: + logging.critical("Execution failed: %s", error) + sys.exit(1) + except Exception, error: + logging.critical("Execution failed: %s", error) + sys.exit(1) + + +def handle_vfat(device): + """TODO""" + # make sure we have mkfs.vfat available if options.fat16 and not options.force: if not which("mkfs.vfat") and not options.copyonly and not options.dryrun: @@ -956,7 +994,7 @@ def main(): if device is not None and not os.path.isdir(device): try: check_for_fat(device) - except Exception, error: + except CriticalException, error: logging.critical("Execution failed: %s", error) sys.exit(1) @@ -972,33 +1010,84 @@ def main(): if options.fat16: mkfs_fat16(device) - # main operation (like installing files) - for iso in isos: - handle_iso(iso, device) - # install MBR - if not options.mbr: - logging.info("You are NOT using the --mbr option. Consider using it if your device does not boot.") - else: - # make sure we install MBR on /dev/sdX and not /dev/sdX# - if device[-1:].isdigit(): - mbr_device = re.match(r'(.*?)\d*$', device).group(1) +def handle_compat_warning(device): + """TODO""" - try: - install_mbr(mbr_device) - except IOError, error: - logging.critical("Execution failed: %s", error) - sys.exit(1) - except Exception, error: - logging.critical("Execution failed: %s", error) + # 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." + f = raw_input("Do you really want to continue? y/N ") + if f == "y" or f == "Y": + pass + else: sys.exit(1) + +def handle_logging(): + """TODO""" + + if options.verbose: + FORMAT = "%(asctime)-15s %(message)s" + logging.basicConfig(level=logging.DEBUG, format=FORMAT) + elif options.quiet: + FORMAT = "Critial: %(message)s" + logging.basicConfig(level=logging.CRITICAL, format=FORMAT) + else: + FORMAT = "Info: %(message)s" + logging.basicConfig(level=logging.INFO, format=FORMAT) + + +def handle_bootloader(device): + """TODO""" # Install bootloader only if not using the --copy-only option if options.copyonly: logging.info("Not installing bootloader and its files as requested via option copyonly.") else: install_bootloader(device) + +def main(): + """Main function [make pylint happy :)]""" + + if options.version: + print os.path.basename(sys.argv[0]) + " " + PROG_VERSION + sys.exit(0) + + if len(args) < 2: + parser.error("invalid usage") + + # log handling + handle_logging() + + # make sure we have the appropriate permissions + check_uid_root() + + if options.dryrun: + logging.info("Running in simulate mode as requested via option dry-run.") + + # specified arguments + device = args[len(args) - 1] + isos = args[0:len(args) - 1] + + # provide upgrade path + handle_compat_warning(device) + + # check for vfat partition + handle_vfat(device) + + # main operation (like installing files) + for iso in isos: + handle_iso(iso, device) + + # install mbr + handle_mbr(device) + + handle_bootloader(device) + # finally be politely :) logging.info("Finished execution of grml2usb (%s). Have fun with your grml system." % PROG_VERSION) @@ -1011,4 +1100,4 @@ if __name__ == "__main__": cleanup() ## END OF FILE ################################################################# -# vim:foldmethod=marker expandtab ai ft=python tw=120 fileencoding=utf-8 +# vim:foldmethod=indent expandtab ai ft=python tw=120 fileencoding=utf-8 -- 2.1.4