From ed813c2a97c534ef1e4491aa6debcb20024fb7ca Mon Sep 17 00:00:00 2001 From: Shuangquan Zhou Date: Thu, 11 Aug 2011 12:15:25 +0800 Subject: [PATCH] Support micng convertor Note: livecd/liveusb/loop/raw image convert to livecd/liveusb image --- micng/imager/baseimager.py | 8 +++---- micng/imager/livecd.py | 9 +++----- micng/imager/loop.py | 3 ++- micng/imager/raw.py | 20 ----------------- plugins/imager/livecd_plugin.py | 34 ++++++++++++++++++---------- plugins/imager/liveusb_plugin.py | 32 +++++++++++++-------------- plugins/imager/loop_plugin.py | 9 ++++++++ plugins/imager/raw_plugin.py | 25 +++++++++++++++++++++ tools/micng | 48 +++++++++++++++++++++++++++++++++++----- 9 files changed, 124 insertions(+), 64 deletions(-) diff --git a/micng/imager/baseimager.py b/micng/imager/baseimager.py index a9ce998..f3da977 100644 --- a/micng/imager/baseimager.py +++ b/micng/imager/baseimager.py @@ -80,10 +80,10 @@ class BaseImageCreator(object): else: self.ks = None self.repometadata = None - self.name = None - self.tmpdir = None - self.cachedir = None - self.destdir = None + self.name = "MeeGo" + self.tmpdir = "/var/tmp" + self.cachedir = "/var/cache" + self.destdir = "." self.__builddir = None self.__bindmounts = [] diff --git a/micng/imager/livecd.py b/micng/imager/livecd.py index 011d8c6..b895355 100644 --- a/micng/imager/livecd.py +++ b/micng/imager/livecd.py @@ -61,10 +61,7 @@ class LiveImageCreatorBase(LoopImageCreator): self.skip_minimize = False #A flag which indicates i act as a convertor default false - if creatoropts.has_key('actasconvertor') and not creatoropts['actasconvertor']: - self.actasconvertor = creatoropts['actasconvertor'] - else: - self.actasconvertor = False + self.actasconvertor = False #The bootloader timeout from kickstart. if self.ks: @@ -103,7 +100,7 @@ class LiveImageCreatorBase(LoopImageCreator): def _get_menu_options(self): """Return a menu options string for syslinux configuration. """ - if self.actasconvertor: + if self.ks is None: return "bootinstall autoinst" r = kickstart.get_menu_args(self.ks) return r @@ -116,7 +113,7 @@ class LiveImageCreatorBase(LoopImageCreator): A sensible default implementation is provided. """ - if self.actasconvertor: + if self.ks is None: r = "ro liveimg quiet" if os.path.exists(instroot + "/usr/bin/rhgb"): r += " rhgb" diff --git a/micng/imager/loop.py b/micng/imager/loop.py index 657cbc1..af604d6 100644 --- a/micng/imager/loop.py +++ b/micng/imager/loop.py @@ -191,7 +191,8 @@ class LoopImageCreator(BaseImageCreator): # Actual implementation # def _mount_instroot(self, base_on = None): - self.__imgdir = self._mkdtemp() + if self.__imgdir is None: + self.__imgdir = self._mkdtemp() if not base_on is None: self._base_on(base_on) diff --git a/micng/imager/raw.py b/micng/imager/raw.py index 8b56804..ea59e11 100644 --- a/micng/imager/raw.py +++ b/micng/imager/raw.py @@ -420,23 +420,3 @@ class RawImageCreator(BaseImageCreator): cfg.write(xml) cfg.close() #print "Wrote: %s.xml" % self.name - - @classmethod - def _mount_srcimg(self, srcimg): - srcimgsize = (misc.get_file_size(srcimg)) * 1024L * 1024L - srcmnt = misc.mkdtemp("srcmnt") - disk = fs_related.SparseLoopbackDisk(srcimg, srcimgsize) - srcloop = PartitionedMount({'/dev/sdb':disk}, srcmnt, skipformat = True) - - srcloop.add_partition(srcimgsize/1024/1024, "/dev/sdb", "/", "ext3", boot=False) - try: - srcloop.mount() - return srcloop - except MountError, e: - srcloop.cleanup() - raise CreatorError("Failed to loopback mount '%s' : %s" % - (srcimg, e)) - @classmethod - def _unmount_srcimg(self, srcloop): - if srcloop: - srcloop.cleanup() diff --git a/plugins/imager/livecd_plugin.py b/plugins/imager/livecd_plugin.py index 1ab28ce..f621bb8 100644 --- a/plugins/imager/livecd_plugin.py +++ b/plugins/imager/livecd_plugin.py @@ -4,6 +4,7 @@ import sys import subprocess import logging import shutil +import tempfile from micng.pluginbase.imager_plugin import ImagerPlugin import micng.chroot as chroot @@ -130,7 +131,8 @@ class LiveCDPlugin(ImagerPlugin): chroot.cleanup_after_chroot("img",extloop,None,None) return 1 - def do_pack(self): + @classmethod + def do_pack(cls, base_on): def __mkinitrd(instance): kernelver = instance._get_kernel_versions().values()[0][0] args = [ "/usr/libexec/mkliveinitrd", "/boot/initrd-%s.img" % kernelver, "%s" % kernelver ] @@ -138,7 +140,7 @@ class LiveCDPlugin(ImagerPlugin): subprocess.call(args, preexec_fn = instance._chroot) except OSError, (err, msg): raise 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] @@ -146,23 +148,31 @@ class LiveCDPlugin(ImagerPlugin): subprocess.call(args, preexec_fn = instance._chroot) except OSError, (err, msg): raise CreatorError("Failed to run post cleanups: %s" % msg) - + convertor = livecd.LiveCDImageCreator() + srcimgsize = (misc.get_file_size(base_on)) * 1024L * 1024L + base_on_dir = os.path.dirname(base_on) + convertor._LoopImageCreator__imgdir = base_on_dir + convertor._set_fstype("ext3") + convertor._set_image_size(srcimgsize) + convertor.mount() __mkinitrd(convertor) convertor._create_bootconfig() __run_post_cleanups(convertor) convertor.unmount() convertor.package() convertor.print_outimage_info() - - def do_unpack(self): - convertoropts = configmgr.getConfigMgr().convert - convertor = convertoropts["convertor"](convertoropts) #consistent with destfmt - srcimgsize = (misc.get_file_size(convertoropts["srcimg"])) * 1024L * 1024L + shutil.rmtree(base_on_dir, ignore_errors = True) + + @classmethod + def do_unpack(cls, srcimg): + convertor = livecd.LiveCDImageCreator() + srcimgsize = (misc.get_file_size(srcimg)) * 1024L * 1024L + convertor._srcfmt = 'livecd' convertor._set_fstype("ext3") convertor._set_image_size(srcimgsize) - base_on = convertoropts["srcimg"] - convertor.check_depend_tools() - convertor.mount(base_on, None) - return convertor + convertor.mount(srcimg, None) + image = os.path.join(tempfile.mkdtemp(dir = "/var/tmp", prefix = "tmp"), "meego.img") + shutil.copyfile(convertor._image, image) + return image mic_plugin = ["livecd", LiveCDPlugin] diff --git a/plugins/imager/liveusb_plugin.py b/plugins/imager/liveusb_plugin.py index ecc77b5..c54c5dc 100644 --- a/plugins/imager/liveusb_plugin.py +++ b/plugins/imager/liveusb_plugin.py @@ -4,6 +4,7 @@ import sys import subprocess import logging import shutil +import tempfile from micng.pluginbase.imager_plugin import ImagerPlugin import micng.imager.liveusb as liveusb @@ -132,7 +133,7 @@ class LiveUSBPlugin(ImagerPlugin): return 1 @classmethod - def do_pack(cls, base_on): + def do_pack(cls, base_on): def __mkinitrd(instance): kernelver = instance._get_kernel_versions().values()[0][0] args = [ "/usr/libexec/mkliveinitrd", "/boot/initrd-%s.img" % kernelver, "%s" % kernelver ] @@ -140,7 +141,7 @@ class LiveUSBPlugin(ImagerPlugin): subprocess.call(args, preexec_fn = instance._chroot) except OSError, (err, msg): raise 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] @@ -148,35 +149,34 @@ class LiveUSBPlugin(ImagerPlugin): subprocess.call(args, preexec_fn = instance._chroot) except OSError, (err, msg): raise CreatorError("Failed to run post cleanups: %s" % msg) - - convertoropts = configmgr.getConfigMgr().convert - convertoropts["ks"] = None - convertor = liveusb.LiveUSBImageCreator(convertoropts) #consistent with destfmt + + convertor = liveusb.LiveUSBImageCreator() srcimgsize = (misc.get_file_size(base_on)) * 1024L * 1024L convertor._set_fstype("ext3") convertor._set_image_size(srcimgsize) - convertor._image = base_on - #convertor.check_depend_tools() + base_on_dir = os.path.dirname(base_on) + convertor._LoopImageCreator__imgdir = base_on_dir + convertor.mount() __mkinitrd(convertor) convertor._create_bootconfig() __run_post_cleanups(convertor) convertor.unmount() convertor.package() - #convertor.print_outimage_info() - - @classmethod + convertor.print_outimage_info() + shutil.rmtree(base_on_dir, ignore_errors = True) + + @classmethod def do_unpack(cls, srcimg): - convertoropts = configmgr.getConfigMgr().convert - convertoropts["ks"] = None - convertor = liveusb.LiveUSBImageCreator(convertoropts) #consistent with destfmt + convertor = liveusb.LiveUSBImageCreator() srcimgsize = (misc.get_file_size(srcimg)) * 1024L * 1024L convertor._srcfmt = 'livecd' convertor._set_fstype("ext3") convertor._set_image_size(srcimgsize) - #convertor.check_depend_tools() convertor.mount(srcimg, None) - return convertor._image, convertor._instroot + image = os.path.join(tempfile.mkdtemp(dir = "/var/tmp", prefix = "tmp"), "meego.img") + shutil.copyfile(convertor._image, image) + return image mic_plugin = ["liveusb", LiveUSBPlugin] diff --git a/plugins/imager/loop_plugin.py b/plugins/imager/loop_plugin.py index 0db0938..ba02686 100644 --- a/plugins/imager/loop_plugin.py +++ b/plugins/imager/loop_plugin.py @@ -1,8 +1,10 @@ #!/usr/bin/python +import os import sys import subprocess import logging import shutil +import tempfile from micng.pluginbase.imager_plugin import ImagerPlugin import micng.utils.misc as misc @@ -83,6 +85,13 @@ class LoopPlugin(ImagerPlugin): chroot.cleanup_after_chroot("img", extloop, None, None) print >> sys.stderr, "Failed to chroot to %s." % extloop return 1 + + @classmethod + def do_unpack(cls, srcimg): + image = os.path.join(tempfile.mkdtemp(dir = "/var/tmp", prefix = "tmp"), "meego.img") + shutil.copyfile(srcimg, image) + return image + mic_plugin = ["loop", LoopPlugin] diff --git a/plugins/imager/raw_plugin.py b/plugins/imager/raw_plugin.py index 5b0f20a..a291e31 100644 --- a/plugins/imager/raw_plugin.py +++ b/plugins/imager/raw_plugin.py @@ -5,6 +5,7 @@ import subprocess import logging import shutil import re +import tempfile from micng.pluginbase.imager_plugin import ImagerPlugin import micng.utils.misc as misc @@ -167,5 +168,29 @@ class RawPlugin(ImagerPlugin): convertor.mount(base_on, None) return convertor + @classmethod + def do_unpack(cls, srcimg): + srcimgsize = (misc.get_file_size(srcimg)) * 1024L * 1024L + srcmnt = misc.mkdtemp("srcmnt") + disk = fs_related.SparseLoopbackDisk(srcimg, srcimgsize) + srcloop = PartitionedMount({'/dev/sdb':disk}, srcmnt, skipformat = True) + + srcloop.add_partition(srcimgsize/1024/1024, "/dev/sdb", "/", "ext3", boot=False) + try: + srcloop.mount() + except MountError, e: + srcloop.cleanup() + raise CreatorError("Failed to loopback mount '%s' : %s" % + (srcimg, e)) + + image = os.path.join(tempfile.mkdtemp(dir = "/var/tmp", prefix = "tmp"), "meego.img") + ddcmd = misc.find_binary_path("dd") + args = [ ddcmd, "if=%s" % srcloop.partitions[0]['device'], "of=%s" % image ] + rc = subprocess.call(args) + if rc != 0: + raise CreatorError("Failed to dd") + srcloop.cleanup() + return image + mic_plugin = ["raw", RawPlugin] diff --git a/tools/micng b/tools/micng index 86e81c0..182e06b 100755 --- a/tools/micng +++ b/tools/micng @@ -35,11 +35,49 @@ class Micng(cmdln.Cmdln): ret = cr.main(argv[1:]) return ret -# @cmdln.alias("cv") -# def do_convert(self, argv): -# """${cmd_name}: convert an image format to another one -# """ -# pass + @cmdln.alias("cv") + def do_convert(self, subcmd, opts, *args): + """${cmd_name}: convert an image format to another one + + usage: + micng convert + """ + if len(args) == 0: + self.emptyline() + # print help + return + if len(args) == 1: + raise errors.Usage("It takes 2 arguments (1 given)") + elif len(args) == 2: + srcimg = args[0] + destformat = args[1] + else: + raise errors.Usage("Extra argument given") + + if os.geteuid() != 0: + raise errors.Usage("You must run as root") + + srcformat = misc.get_image_type(srcimg) + if srcformat == "ext3fsimg": + srcformat = "loop" + + pkgmgr = pluginmgr.PluginMgr() + pkgmgr.loadPlugins() + imagers = pmgr.getImagerPlugins() + + srcimager = None + destimager = None + for iname, icls in imagers: + if iname == srcformat and hasattr(icls, "do_unpack"): + srcimager = icls + if iname == destformat and hasattr(icls, "do_pack"): + destimager = icls + + if (srcimager and destimager) is None: + raise CreatorError("Can't convert from %s to %s" %(srcformat, desformat)) + else: + base_on = srcimager.do_unpack(srcimg) + destimager.do_pack(base_on) @cmdln.option("-d", "--debug", action="store_true", help="debug message") @cmdln.option("-v", "--verbose", action="store_true", help="verbose infomation") -- 2.7.4