Updated chroot's cleanup function
[tools/mic.git] / tools / mic
1 #!/usr/bin/python -t
2
3 import os
4 import sys
5 import logging
6 import mic.utils.cmdln as cmdln
7 import mic.utils.misc as misc
8 import mic.utils.errors as errors
9 import mic.configmgr as configmgr
10 import mic.pluginmgr as pluginmgr
11 import mic.creator as creator
12
13 class Mic(cmdln.Cmdln):
14     """Usage: mic SUBCOMMAND [OPTS] [ARGS...]
15
16     MeeGo Image Creator Tool.
17
18     ${command_list}
19     ${help_list}
20     global ${option_list}
21     For additional information, see
22     * http://www.meego.com/
23     """
24     name = 'mic'
25     version = None
26
27     @cmdln.alias("cr")
28     def do_create(self, argv):
29         """${cmd_name}: create image
30
31         ${cmd_usage}
32         ${cmd_option_list}
33         """
34         cr = creator.Creator()
35         ret = cr.main(argv[1:])
36         return ret
37
38     @cmdln.alias("cv")
39     def do_convert(self, subcmd, opts, *args):
40         """${cmd_name}: convert an image format to another one
41         
42         usage:
43             mic convert <imagefile> <destformat>  
44         """
45         if len(args) == 0:
46             self.emptyline()
47             # print help
48             return
49         if len(args) == 1:
50             raise errors.Usage("It takes 2 arguments (1 given)")
51         elif len(args) == 2:
52             srcimg = args[0]
53             destformat = args[1]
54         else:
55             raise errors.Usage("Extra argument given")
56
57         if os.geteuid() != 0:
58             raise errors.Usage("You must run as root")
59
60         srcformat = misc.get_image_type(srcimg)
61         if srcformat == "ext3fsimg":
62             srcformat = "loop"
63
64         pkgmgr = pluginmgr.PluginMgr()
65         pkgmgr.loadPlugins()
66         imagers = pkgmgr.getImagerPlugins()
67
68         srcimager = None
69         destimager = None
70         for iname, icls in imagers:
71            if iname == srcformat and hasattr(icls, "do_unpack"):
72                srcimager = icls
73            if iname == destformat and hasattr(icls, "do_pack"):
74                destimager = icls
75
76         if (srcimager and destimager) is None:
77            raise CreatorError("Can't convert from %s to %s" %(srcformat, destformat))
78         else:
79             base_on = srcimager.do_unpack(srcimg)
80             destimager.do_pack(base_on)
81
82     @cmdln.option("-d", "--debug", action="store_true", help="debug message")
83     @cmdln.option("-v", "--verbose", action="store_true", help="verbose infomation")
84     @cmdln.alias("ch")
85     def do_chroot(self, subcmd, opts, *args):
86         """${cmd_name}: chroot an image
87
88         usage:
89             mic chroot <imagefile>
90
91         ${cmd_option_list}
92         """
93         if len(args) == 0:
94             self.emptyline()
95             # print help
96             return
97         if len(args) == 1:
98             targetimage = args[0]
99         else:
100             raise errors.Usage("Extra argument given")
101
102         if os.geteuid() != 0:
103             raise errors.Usage("You must run as root")
104
105         # Fixeme? sub-logger to be used
106         if opts.verbose:
107             logging.getLogger().setLevel(logging.INFO)
108         if opts.debug:
109             logging.getLogger().setLevel(logging.DEBUG)
110
111         imagetype = misc.get_image_type(targetimage)
112         if not imagetype:
113             imagetype = "fs"
114         if imagetype == "ext3fsimg":
115             imagetype = "loop"
116
117         pkgmgr = pluginmgr.PluginMgr()
118         pkgmgr.loadPlugins()
119
120         chrootclass = None
121         for (pname, pcls) in pkgmgr.getImagerPlugins():
122             if pname == imagetype and hasattr(pcls, "do_chroot"):
123                 chrootclass = pcls
124                 break
125
126         if not chrootclass:
127             raise CreatorError("Don't support image type: %s" % imagetype)
128
129         chrootclass.do_chroot(targetimage)
130
131 if __name__ == "__main__":
132     logging.getLogger().setLevel(logging.ERROR)
133     mic = Mic()
134     try:
135         ret = mic.main()
136     except errors.CreatorError, msg:
137         ret = 2
138         print >> sys.stderr, msg
139     except errors.Usage, msg:
140         ret = 2
141         print >> sys.stderr, msg
142     sys.exit(ret)