f743b6b6b1bf6d42205db14f5e5144615d2b58cf
[tools/mic.git] / plugins / imager / loop_plugin.py
1 #!/usr/bin/python
2 import os
3 import sys
4 import subprocess
5 import logging
6 import shutil
7 import tempfile
8
9 from micng.pluginbase.imager_plugin import ImagerPlugin
10 import micng.utils.misc as misc
11 import micng.utils.cmdln as cmdln
12 import micng.utils.fs_related as fs_related
13 from micng.utils.errors import * 
14 import micng.configmgr as configmgr
15 import micng.pluginmgr as pluginmgr
16 import micng.imager.loop as loop
17 import micng.chroot as chroot
18
19 class LoopPlugin(ImagerPlugin):
20     @classmethod
21     def do_create(self, subcmd, opts, *args):
22         """${cmd_name}: create fs image
23
24         ${cmd_usage}
25         ${cmd_option_list}
26         """
27         if len(args) == 0:
28             return
29         if len(args) == 1:
30             ksconf = args[0]
31         else:
32             raise errors.Usage("Extra arguments given")
33
34         cfgmgr = configmgr.getConfigMgr()
35         creatoropts = cfgmgr.create
36         cfgmgr.setProperty("ksconf", ksconf)
37
38         plgmgr = pluginmgr.PluginMgr()
39         plgmgr.loadPlugins()
40         
41         for (key, pcls) in plgmgr.getBackendPlugins():
42             if key == creatoropts['pkgmgr']:
43                 pkgmgr = pcls
44
45         if not pkgmgr:
46             raise CreatorError("Can't find backend %s" % pkgmgr)
47
48         creator = loop.LoopImageCreator(creatoropts, pkgmgr)
49         try:
50             creator.check_depend_tools()
51             creator.mount(None, creatoropts["cachedir"])  
52             creator.install()
53             creator.configure(creatoropts["repomd"])
54             creator.unmount()
55             creator.package(creatoropts["outdir"])
56         except CreatorError, e:
57             raise CreatorError("failed to create image : %s" % e)
58         finally:
59             creator.cleanup()
60         print "Finished."
61         return 0    
62            
63     @classmethod
64     def do_chroot(cls, target):#chroot.py parse opts&args
65         #import pdb
66         #pdb.set_trace()
67         img = target
68         imgsize = misc.get_file_size(img)
69         extmnt = misc.mkdtemp()
70         extloop = fs_related.ExtDiskMount(fs_related.SparseLoopbackDisk(img, imgsize),
71                                                          extmnt,
72                                                          "ext3",
73                                                          4096,
74                                                          "ext3 label")
75         try:
76             extloop.mount()
77             #os_image = img
78         except MountError, e:
79             extloop.cleanup()
80             shutil.rmtree(extmnt, ignore_errors = True)
81             raise CreatorError("Failed to loopback mount '%s' : %s" %(img, e))
82         try:
83             chroot.chroot(extmnt, None,  "/bin/env HOME=/root /bin/bash")
84         except:
85             raise CreatorError("Failed to chroot to %s." %img)  
86         finally:
87             chroot.cleanup_after_chroot("img", extloop, None, extmnt)
88
89     @classmethod
90     def do_unpack(cls, srcimg):
91         image = os.path.join(tempfile.mkdtemp(dir = "/var/tmp", prefix = "tmp"), "meego.img")
92         shutil.copyfile(srcimg, image)
93         return image
94
95         
96 mic_plugin = ["loop", LoopPlugin]
97