Support micng convertor
authorShuangquan Zhou <shuangquan.zhou@intel.com>
Thu, 11 Aug 2011 04:15:25 +0000 (12:15 +0800)
committerShuangquan Zhou <shuangquan.zhou@intel.com>
Thu, 11 Aug 2011 04:15:31 +0000 (12:15 +0800)
Note: livecd/liveusb/loop/raw image convert to livecd/liveusb image

micng/imager/baseimager.py
micng/imager/livecd.py
micng/imager/loop.py
micng/imager/raw.py
plugins/imager/livecd_plugin.py
plugins/imager/liveusb_plugin.py
plugins/imager/loop_plugin.py
plugins/imager/raw_plugin.py
tools/micng

index a9ce998..f3da977 100644 (file)
@@ -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 = []
index 011d8c6..b895355 100644 (file)
@@ -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"
index 657cbc1..af604d6 100644 (file)
@@ -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)
index 8b56804..ea59e11 100644 (file)
@@ -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()
index 1ab28ce..f621bb8 100644 (file)
@@ -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]
index ecc77b5..c54c5dc 100644 (file)
@@ -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]
 
index 0db0938..ba02686 100644 (file)
@@ -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]
 
index 5b0f20a..a291e31 100644 (file)
@@ -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]
 
index 86e81c0..182e06b 100755 (executable)
@@ -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 <imagefile> <destformat>  
+        """
+        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")