From aef5d957aac02a1ca9a8695ab9c726ff911a5182 Mon Sep 17 00:00:00 2001 From: JF Ding Date: Thu, 1 Sep 2011 16:16:44 +0900 Subject: [PATCH] refine the liveusb code and cleanup --- mic/imager/liveusb.py | 52 ++++++++------------------ mic/imager/raw.py | 1 - plugins/imager/livecd_plugin.py | 4 +- plugins/imager/liveusb_plugin.py | 81 +++++++++++++++++++++++++--------------- 4 files changed, 67 insertions(+), 71 deletions(-) diff --git a/mic/imager/liveusb.py b/mic/imager/liveusb.py index 33ea152..3281afd 100644 --- a/mic/imager/liveusb.py +++ b/mic/imager/liveusb.py @@ -22,18 +22,18 @@ import shutil import subprocess import re -import mic.utils.fs_related as fs_related -import mic.utils.misc as misc -from livecd import LiveCDImageCreator +from mic import msger +from mic.utils import misc, fs_related from mic.utils.errors import CreatorError from mic.utils.partitionedfs import PartitionedMount -from mic import msger +from livecd import LiveCDImageCreator class LiveUSBImageCreator(LiveCDImageCreator): def __init__(self, *args): LiveCDImageCreator.__init__(self, *args) self._dep_checks.extend(["kpartx", "parted"]) + # remove dependency of genisoimage in parent class if "genisoimage" in self._dep_checks: self._dep_checks.remove("genisoimage") @@ -56,18 +56,7 @@ class LiveUSBImageCreator(LiveCDImageCreator): raise CreatorError("Can't have an swap overlay of 2048MB or greater on VFAT") livesize = misc.get_file_size(isodir + "/LiveOS") - mountcmd = fs_related.find_binary_path("mount") - umountcmd = fs_related.find_binary_path("umount") - ddcmd = fs_related.find_binary_path("dd") - #if skipcompress: - # tmpmnt = self._mkdtemp("squashfs-mnt") - # rc = subprocess.call([mountcmd, "-o", "loop", isodir + "/LiveOS/squashfs.img", tmpmnt]); - # if rc: - # raise CreatorError("Can't mount %s" % (isodir + "/LiveOS/squashfs.img")) - # livesize = misc.get_file_size(tmpmnt + "/LiveOS/ext3fs.img") - # rc = subprocess.call([umountcmd, tmpmnt]); - # if rc: - # raise CreatorError("Can't umount %s" % (tmpmnt)) + usbimgsize = (overlaysizemb + homesizemb + swapsizemb + livesize + plussize) * 1024L * 1024L disk = fs_related.SparseLoopbackDisk("%s/%s.usbimg" % (self._outdir, self.name), usbimgsize) usbmnt = self._mkdtemp("usb-mnt") @@ -82,18 +71,7 @@ class LiveUSBImageCreator(LiveCDImageCreator): try: fs_related.makedirs(usbmnt + "/LiveOS") - #if skipcompress: - # if os.path.exists(isodir + "/LiveOS/squashfs.img"): - # rc = subprocess.call([mountcmd, "-o", "loop", isodir + "/LiveOS/squashfs.img", tmpmnt]); - # if rc: - # raise CreatorError("Can't mount %s" % (isodir + "/LiveOS/squashfs.img")) - # shutil.copyfile(tmpmnt + "/LiveOS/ext3fs.img", usbmnt + "/LiveOS/ext3fs.img") - # rc = subprocess.call([umountcmd, tmpmnt]); - # if rc: - # raise CreatorError("Can't umount %s" % (tmpmnt)) - # else: - # shutil.copyfile(isodir + "/LiveOS/ext3fs.img", usbmnt + "/LiveOS/ext3fs.img") - #else: + if os.path.exists(isodir + "/LiveOS/squashfs.img"): shutil.copyfile(isodir + "/LiveOS/squashfs.img", usbmnt + "/LiveOS/squashfs.img") else: @@ -112,8 +90,7 @@ class LiveUSBImageCreator(LiveCDImageCreator): usblabel = "UUID=%s" % diskmount.uuid overlaysuffix = "-%s-%s" % (diskmount.fslabel, diskmount.uuid) - copycmd = fs_related.find_binary_path("cp") - args = [copycmd, "-Rf", isodir + "/isolinux", usbmnt + "/syslinux"] + args = ['cp', "-Rf", isodir + "/isolinux", usbmnt + "/syslinux"] rc = subprocess.call(args) if rc: raise CreatorError("Can't copy isolinux directory %s" % (isodir + "/isolinux/*")) @@ -129,7 +106,7 @@ class LiveUSBImageCreator(LiveCDImageCreator): for f in ("isolinux.bin", "vesamenu.c32"): path = os.path.join(syslinux_path, f) if os.path.isfile(path): - args = [copycmd, path, usbmnt + "/syslinux/"] + args = ['cp', path, usbmnt + "/syslinux/"] rc = subprocess.call(args) if rc: raise CreatorError("Can't copy syslinux file %s" % (path)) @@ -151,9 +128,9 @@ class LiveUSBImageCreator(LiveCDImageCreator): msger.info("Initializing persistent overlay file") overfile = "overlay" + overlaysuffix if fstype == "vfat": - args = [ddcmd, "if=/dev/zero", "of=" + usbmnt + "/LiveOS/" + overfile, "count=%d" % overlaysizemb, "bs=1M"] + args = ['dd', "if=/dev/zero", "of=" + usbmnt + "/LiveOS/" + overfile, "count=%d" % overlaysizemb, "bs=1M"] else: - args = [ddcmd, "if=/dev/null", "of=" + usbmnt + "/LiveOS/" + overfile, "count=1", "bs=1M", "seek=%d" % overlaysizemb] + args = ['dd', "if=/dev/null", "of=" + usbmnt + "/LiveOS/" + overfile, "count=1", "bs=1M", "seek=%d" % overlaysizemb] rc = subprocess.call(args) if rc: raise CreatorError("Can't create overlay file") @@ -163,7 +140,7 @@ class LiveUSBImageCreator(LiveCDImageCreator): if swapsizemb > 0: msger.info("Initializing swap file") swapfile = usbmnt + "/LiveOS/" + "swap.img" - args = [ddcmd, "if=/dev/zero", "of=" + swapfile, "count=%d" % swapsizemb, "bs=1M"] + args = ['dd', "if=/dev/zero", "of=" + swapfile, "count=%d" % swapsizemb, "bs=1M"] rc = subprocess.call(args) if rc: raise CreatorError("Can't create swap file") @@ -176,9 +153,9 @@ class LiveUSBImageCreator(LiveCDImageCreator): msger.info("Initializing persistent /home") homefile = usbmnt + "/LiveOS/" + homefile if fstype == "vfat": - args = [ddcmd, "if=/dev/zero", "of=" + homefile, "count=%d" % homesizemb, "bs=1M"] + args = ['dd', "if=/dev/zero", "of=" + homefile, "count=%d" % homesizemb, "bs=1M"] else: - args = [ddcmd, "if=/dev/null", "of=" + homefile, "count=1", "bs=1M", "seek=%d" % homesizemb] + args = ['dd', "if=/dev/null", "of=" + homefile, "count=1", "bs=1M", "seek=%d" % homesizemb] rc = subprocess.call(args) if rc: raise CreatorError("Can't create home file") @@ -230,7 +207,8 @@ class LiveUSBImageCreator(LiveCDImageCreator): raise CreatorError("mbr.bin file didn't exist.") mbrsize = os.path.getsize(mbrfile) outimg = "%s/%s.usbimg" % (self._outdir, self.name) - args = [ddcmd, "if=" + mbrfile, "of=" + outimg, "seek=0", "conv=notrunc", "bs=1", "count=%d" % (mbrsize)] + + args = ['dd', "if=" + mbrfile, "of=" + outimg, "seek=0", "conv=notrunc", "bs=1", "count=%d" % (mbrsize)] rc = subprocess.call(args) if rc: raise CreatorError("Can't set MBR.") diff --git a/mic/imager/raw.py b/mic/imager/raw.py index 664c683..7e6fbac 100644 --- a/mic/imager/raw.py +++ b/mic/imager/raw.py @@ -415,4 +415,3 @@ class RawImageCreator(BaseImageCreator): cfg = open("%s/%s.xml" % (self._outdir, self.name), "w") cfg.write(xml) cfg.close() - #print "Wrote: %s.xml" % self.name diff --git a/plugins/imager/livecd_plugin.py b/plugins/imager/livecd_plugin.py index 76303be..3cc11e0 100644 --- a/plugins/imager/livecd_plugin.py +++ b/plugins/imager/livecd_plugin.py @@ -92,6 +92,7 @@ class LiveCDPlugin(ImagerPlugin): extmnt = misc.mkdtemp() tfstype = "ext3" tlabel = "ext3 label" + MyDiskMount = fs_related.ExtDiskMount extloop = MyDiskMount(fs_related.SparseLoopbackDisk(os_image, imgsize), extmnt, @@ -109,10 +110,8 @@ class LiveCDPlugin(ImagerPlugin): try: chroot.chroot(extmnt, None, "/bin/env HOME=/root /bin/bash") - except: raise errors.CreatorError("Failed to chroot to %s." %target) - finally: chroot.cleanup_after_chroot("img", extloop, os_image_dir, extmnt) @@ -129,6 +128,7 @@ class LiveCDPlugin(ImagerPlugin): def __run_post_cleanups(instance): kernelver = instance._get_kernel_versions().values()[0][0] args = ["rm", "-f", "/boot/initrd-%s.img" % kernelver] + try: subprocess.call(args, preexec_fn = instance._chroot) except OSError, (err, msg): diff --git a/plugins/imager/liveusb_plugin.py b/plugins/imager/liveusb_plugin.py index b61a96d..f72126e 100644 --- a/plugins/imager/liveusb_plugin.py +++ b/plugins/imager/liveusb_plugin.py @@ -1,25 +1,37 @@ #!/usr/bin/python -tt - -import os, sys +# +# Copyright 2011 Intel, Inc. +# +# This copyrighted material is made available to anyone wishing to use, modify, +# copy, or redistribute it subject to the terms and conditions of the GNU +# General Public License v.2. This program is distributed in the hope that it +# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the +# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Any Red Hat +# trademarks that are incorporated in the source code or documentation are not +# subject to the GNU General Public License and may only be used or replicated +# with the express permission of Red Hat, Inc. +# + +import os import subprocess import shutil import tempfile -from mic.pluginbase import ImagerPlugin -import mic.imager.liveusb as liveusb -import mic.utils.misc as misc -import mic.utils.fs_related as fs_related -import mic.utils.cmdln as cmdln -import mic.configmgr as configmgr -import mic.pluginmgr as pluginmgr +from mic import configmgr, pluginmgr, chroot, msger +from mic.utils import misc, fs_related, errors from mic.utils.partitionedfs import PartitionedMount -from mic.utils.errors import * -import mic.chroot as chroot +import mic.imager.liveusb as liveusb + +from mic.pluginbase import ImagerPlugin class LiveUSBPlugin(ImagerPlugin): name = 'liveusb' - #@cmdln.option @classmethod def do_create(self, subcmd, opts, *args): """${cmd_name}: create liveusb image @@ -27,8 +39,10 @@ class LiveUSBPlugin(ImagerPlugin): ${cmd_usage} ${cmd_option_list} """ - if len(args) == 0: - return + + if not args: + raise errors.Usage("More arguments needed") + if len(args) == 1: ksconf = args[0] else: @@ -58,42 +72,44 @@ class LiveUSBPlugin(ImagerPlugin): outimage = creator.outimage creator.print_outimage_info() outimage = creator.outimage + except CreatorError, e: - raise CreatorError("failed to create image : %s" % e) + raise errors.CreatorError("failed to create image : %s" % e) finally: creator.cleanup() - print "Finished." + + msger.info("Finished.") return 0 @classmethod def do_chroot(cls, target): os_image = cls.do_unpack(target) os_image_dir = os.path.dirname(os_image) + #unpack image to target dir imgsize = misc.get_file_size(os_image) * 1024L * 1024L extmnt = misc.mkdtemp() tfstype = "ext3" tlabel = "ext3 label" + MyDiskMount = fs_related.ExtDiskMount - #if imgcreate.fstype_is_btrfs(os_image): - # tfstype = "btrfs" - # tlabel = "btrfs label" - # MyDiskMount = fs_related.BtrfsDiskMount extloop = MyDiskMount(fs_related.SparseLoopbackDisk(os_image, imgsize), - extmnt, - tfstype, - 4096, - tlabel) + extmnt, + tfstype, + 4096, + tlabel) try: extloop.mount() + except MountError, e: extloop.cleanup() shutil.rmtree(extmnt, ignore_errors = True) - raise CreatorError("Failed to loopback mount '%s' : %s" %(os_image, e)) + raise errors.CreatorError("Failed to loopback mount '%s' : %s" %(os_image, e)) + try: chroot.chroot(extmnt, None, "/bin/env HOME=/root /bin/bash") except: - raise CreatorError("Failed to chroot to %s." %target) + raise errors.CreatorError("Failed to chroot to %s." %target) finally: chroot.cleanup_after_chroot("img", extloop, os_image_dir, extmnt) @@ -104,16 +120,18 @@ class LiveUSBPlugin(ImagerPlugin): args = [ "/usr/libexec/mkliveinitrd", "/boot/initrd-%s.img" % kernelver, "%s" % kernelver ] try: subprocess.call(args, preexec_fn = instance._chroot) + except OSError, (err, msg): - raise CreatorError("Failed to execute /usr/libexec/mkliveinitrd: %s" % msg) + raise errors.CreatorError("Failed to execute /usr/libexec/mkliveinitrd: %s" % msg) def __run_post_cleanups(instance): kernelver = instance._get_kernel_versions().values()[0][0] args = ["rm", "-f", "/boot/initrd-%s.img" % kernelver] + try: subprocess.call(args, preexec_fn = instance._chroot) except OSError, (err, msg): - raise CreatorError("Failed to run post cleanups: %s" % msg) + raise errors.CreatorError("Failed to run post cleanups: %s" % msg) convertor = liveusb.LiveUSBImageCreator() srcimgsize = (misc.get_file_size(base_on)) * 1024L * 1024L @@ -142,7 +160,7 @@ class LiveUSBPlugin(ImagerPlugin): imgloop.mount() except MountError, e: imgloop.cleanup() - raise CreatorError("Failed to loopback mount '%s' : %s" %(img, e)) + raise errors.CreatorError("Failed to loopback mount '%s' : %s" %(img, e)) # legacy LiveOS filesystem layout support, remove for F9 or F10 if os.path.exists(imgmnt + "/squashfs.img"): @@ -163,10 +181,11 @@ class LiveUSBPlugin(ImagerPlugin): os_image = tmpoutdir + "/LiveOS/ext3fs.img" if not os.path.exists(os_image): - raise CreatorError("'%s' is not a valid live CD ISO : neither " - "LiveOS/ext3fs.img nor os.img exist" %img) + raise errors.CreatorError("'%s' is not a valid live CD ISO : neither " + "LiveOS/ext3fs.img nor os.img exist" %img) rtimage = os.path.join(tempfile.mkdtemp(dir = "/var/tmp", prefix = "tmp"), "target.img") shutil.copyfile(os_image, rtimage) + finally: imgloop.cleanup() shutil.rmtree(tmpoutdir, ignore_errors = True) -- 2.7.4