Statistics
| Branch: | Tag: | Revision:

root / image_creator / os_type / __init__.py @ 06bfd21a

History | View | Annotate | Download (11.1 kB)

1 121f3bc0 Nikos Skalkotos
# -*- coding: utf-8 -*-
2 121f3bc0 Nikos Skalkotos
#
3 ae48a082 Nikos Skalkotos
# Copyright 2012 GRNET S.A. All rights reserved.
4 ae48a082 Nikos Skalkotos
#
5 ae48a082 Nikos Skalkotos
# Redistribution and use in source and binary forms, with or
6 ae48a082 Nikos Skalkotos
# without modification, are permitted provided that the following
7 ae48a082 Nikos Skalkotos
# conditions are met:
8 ae48a082 Nikos Skalkotos
#
9 ae48a082 Nikos Skalkotos
#   1. Redistributions of source code must retain the above
10 ae48a082 Nikos Skalkotos
#      copyright notice, this list of conditions and the following
11 ae48a082 Nikos Skalkotos
#      disclaimer.
12 ae48a082 Nikos Skalkotos
#
13 ae48a082 Nikos Skalkotos
#   2. Redistributions in binary form must reproduce the above
14 ae48a082 Nikos Skalkotos
#      copyright notice, this list of conditions and the following
15 ae48a082 Nikos Skalkotos
#      disclaimer in the documentation and/or other materials
16 ae48a082 Nikos Skalkotos
#      provided with the distribution.
17 ae48a082 Nikos Skalkotos
#
18 ae48a082 Nikos Skalkotos
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 ae48a082 Nikos Skalkotos
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 ae48a082 Nikos Skalkotos
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 ae48a082 Nikos Skalkotos
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 ae48a082 Nikos Skalkotos
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 ae48a082 Nikos Skalkotos
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 ae48a082 Nikos Skalkotos
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 ae48a082 Nikos Skalkotos
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 ae48a082 Nikos Skalkotos
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 ae48a082 Nikos Skalkotos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 ae48a082 Nikos Skalkotos
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 ae48a082 Nikos Skalkotos
# POSSIBILITY OF SUCH DAMAGE.
30 ae48a082 Nikos Skalkotos
#
31 ae48a082 Nikos Skalkotos
# The views and conclusions contained in the software and
32 ae48a082 Nikos Skalkotos
# documentation are those of the authors and should not be
33 ae48a082 Nikos Skalkotos
# interpreted as representing official policies, either expressed
34 ae48a082 Nikos Skalkotos
# or implied, of GRNET S.A.
35 aa2062ba Nikos Skalkotos
36 121f3bc0 Nikos Skalkotos
"""This package provides various classes for preparing different Operating
37 121f3bc0 Nikos Skalkotos
Systems for image creation.
38 121f3bc0 Nikos Skalkotos
"""
39 121f3bc0 Nikos Skalkotos
40 e77e66a9 Nikos Skalkotos
from image_creator.util import FatalError
41 979096dd Nikos Skalkotos
42 f165adc0 Nikos Skalkotos
import textwrap
43 8c574358 Nikos Skalkotos
import re
44 d415dda2 Nikos Skalkotos
from collections import namedtuple
45 173022fb Nikos Skalkotos
from functools import wraps
46 8c574358 Nikos Skalkotos
47 8c574358 Nikos Skalkotos
48 bb4db5a8 Nikos Skalkotos
def os_cls(distro, osfamily):
49 88f83027 Nikos Skalkotos
    """Given the distro name and the osfamily, return the appropriate class"""
50 5b801534 Nikos Skalkotos
    module = None
51 5b801534 Nikos Skalkotos
    classname = None
52 5b801534 Nikos Skalkotos
    try:
53 f99fe99d Nikos Skalkotos
        module = __import__("image_creator.os_type.%s" % distro,
54 f99fe99d Nikos Skalkotos
                            fromlist=['image_creator.os_type'])
55 5b801534 Nikos Skalkotos
        classname = distro.capitalize()
56 5b801534 Nikos Skalkotos
    except ImportError:
57 f99fe99d Nikos Skalkotos
        module = __import__("image_creator.os_type.%s" % osfamily,
58 f99fe99d Nikos Skalkotos
                            fromlist=['image_creator.os_type'])
59 5b801534 Nikos Skalkotos
        classname = osfamily.capitalize()
60 5b801534 Nikos Skalkotos
61 5b801534 Nikos Skalkotos
    return getattr(module, classname)
62 5b801534 Nikos Skalkotos
63 5b801534 Nikos Skalkotos
64 0d5a999d Nikos Skalkotos
def add_prefix(target):
65 0d5a999d Nikos Skalkotos
    def wrapper(self, *args):
66 0d5a999d Nikos Skalkotos
        prefix = args[0]
67 0d5a999d Nikos Skalkotos
        return map(lambda x: prefix + x, target(self, *args))
68 0d5a999d Nikos Skalkotos
    return wrapper
69 0d5a999d Nikos Skalkotos
70 51fab9c9 Nikos Skalkotos
71 577d605d Nikos Skalkotos
def sysprep(message, enabled=True, **kwargs):
72 88f83027 Nikos Skalkotos
    """Decorator for system preparation tasks"""
73 173022fb Nikos Skalkotos
    def wrapper1(func):
74 f165adc0 Nikos Skalkotos
        func.sysprep = True
75 f165adc0 Nikos Skalkotos
        func.enabled = enabled
76 fa65eda1 Nikos Skalkotos
        func.executed = False
77 173022fb Nikos Skalkotos
78 577d605d Nikos Skalkotos
        for key, val in kwargs.items():
79 577d605d Nikos Skalkotos
            setattr(func, key, val)
80 577d605d Nikos Skalkotos
81 173022fb Nikos Skalkotos
        @wraps(func)
82 173022fb Nikos Skalkotos
        def wrapper2(self, print_message=True):
83 173022fb Nikos Skalkotos
            if print_message:
84 173022fb Nikos Skalkotos
                self.out.output(message)
85 173022fb Nikos Skalkotos
            return func(self)
86 173022fb Nikos Skalkotos
87 173022fb Nikos Skalkotos
        return wrapper2
88 173022fb Nikos Skalkotos
89 173022fb Nikos Skalkotos
    return wrapper1
90 8c574358 Nikos Skalkotos
91 51fab9c9 Nikos Skalkotos
92 aa2062ba Nikos Skalkotos
class OSBase(object):
93 3b2f6619 Nikos Skalkotos
    """Basic operating system class"""
94 f165adc0 Nikos Skalkotos
95 d415dda2 Nikos Skalkotos
    SysprepParam = namedtuple('SysprepParam',
96 d415dda2 Nikos Skalkotos
                              'name description length validator')
97 d415dda2 Nikos Skalkotos
98 d415dda2 Nikos Skalkotos
    def __init__(self, image, **kargs):
99 0c505946 Nikos Skalkotos
        self.image = image
100 0c505946 Nikos Skalkotos
101 0c505946 Nikos Skalkotos
        self.root = image.root
102 0c505946 Nikos Skalkotos
        self.g = image.g
103 0c505946 Nikos Skalkotos
        self.out = image.out
104 0c505946 Nikos Skalkotos
105 d415dda2 Nikos Skalkotos
        self.sysprep_params = \
106 d415dda2 Nikos Skalkotos
            kargs['sysprep_params'] if 'sysprep_params' in kargs else {}
107 d415dda2 Nikos Skalkotos
108 5886f568 Nikos Skalkotos
        self.meta = {}
109 71b0ab28 Nikos Skalkotos
110 71b0ab28 Nikos Skalkotos
    def collect_metadata(self):
111 71b0ab28 Nikos Skalkotos
        """Collect metadata about the OS"""
112 71b0ab28 Nikos Skalkotos
        try:
113 71b0ab28 Nikos Skalkotos
            if not self.mount(readonly=True):
114 71b0ab28 Nikos Skalkotos
                raise FatalError("Unable to mount the media read-only")
115 71b0ab28 Nikos Skalkotos
116 71b0ab28 Nikos Skalkotos
            self.out.output('Collecting image metadata ...', False)
117 71b0ab28 Nikos Skalkotos
            self._do_collect_metadata()
118 71b0ab28 Nikos Skalkotos
            self.out.success('done')
119 71b0ab28 Nikos Skalkotos
        finally:
120 71b0ab28 Nikos Skalkotos
            self.umount()
121 71b0ab28 Nikos Skalkotos
122 121f3bc0 Nikos Skalkotos
        self.out.output()
123 76d4a1c9 Nikos Skalkotos
124 d415dda2 Nikos Skalkotos
    def needed_sysprep_params(self):
125 d415dda2 Nikos Skalkotos
        """Returns a list of needed sysprep parameters. Each element in the
126 d415dda2 Nikos Skalkotos
        list is a SysprepParam object.
127 d415dda2 Nikos Skalkotos
        """
128 d415dda2 Nikos Skalkotos
        return []
129 d415dda2 Nikos Skalkotos
130 f165adc0 Nikos Skalkotos
    def list_syspreps(self):
131 121f3bc0 Nikos Skalkotos
        """Returns a list of sysprep objects"""
132 f99fe99d Nikos Skalkotos
        objs = [getattr(self, name) for name in dir(self)
133 f99fe99d Nikos Skalkotos
                if not name.startswith('_')]
134 f165adc0 Nikos Skalkotos
135 fa65eda1 Nikos Skalkotos
        return [x for x in objs if self._is_sysprep(x) and x.executed is False]
136 f165adc0 Nikos Skalkotos
137 12078c7e Nikos Skalkotos
    def sysprep_info(self, obj):
138 121f3bc0 Nikos Skalkotos
        """Returns information about a sysprep object"""
139 12078c7e Nikos Skalkotos
        assert self._is_sysprep(obj), "Object is not a sysprep"
140 12078c7e Nikos Skalkotos
141 020b738b Nikos Skalkotos
        SysprepInfo = namedtuple("SysprepInfo", "name description")
142 020b738b Nikos Skalkotos
143 020b738b Nikos Skalkotos
        return SysprepInfo(obj.__name__.replace('_', '-'),
144 020b738b Nikos Skalkotos
                           textwrap.dedent(obj.__doc__))
145 12078c7e Nikos Skalkotos
146 e7cbfb0a Nikos Skalkotos
    def get_sysprep_by_name(self, name):
147 e7cbfb0a Nikos Skalkotos
        """Returns the sysprep object with the given name"""
148 f165adc0 Nikos Skalkotos
        error_msg = "Syprep operation %s does not exist for %s" % \
149 e7cbfb0a Nikos Skalkotos
                    (name, self.__class__.__name__)
150 f165adc0 Nikos Skalkotos
151 f165adc0 Nikos Skalkotos
        method_name = name.replace('-', '_')
152 f165adc0 Nikos Skalkotos
        method = None
153 f165adc0 Nikos Skalkotos
        try:
154 f165adc0 Nikos Skalkotos
            method = getattr(self, method_name)
155 f165adc0 Nikos Skalkotos
        except AttributeError:
156 f165adc0 Nikos Skalkotos
            raise FatalError(error_msg)
157 f165adc0 Nikos Skalkotos
158 f165adc0 Nikos Skalkotos
        if not self._is_sysprep(method):
159 f165adc0 Nikos Skalkotos
            raise FatalError(error_msg)
160 f165adc0 Nikos Skalkotos
161 e7cbfb0a Nikos Skalkotos
        return method
162 f165adc0 Nikos Skalkotos
163 e7cbfb0a Nikos Skalkotos
    def enable_sysprep(self, obj):
164 dcf9274b Vangelis Koukis
        """Enable a system preparation operation"""
165 e7cbfb0a Nikos Skalkotos
        setattr(obj.im_func, 'enabled', True)
166 f165adc0 Nikos Skalkotos
167 e7cbfb0a Nikos Skalkotos
    def disable_sysprep(self, obj):
168 dcf9274b Vangelis Koukis
        """Disable a system preparation operation"""
169 e7cbfb0a Nikos Skalkotos
        setattr(obj.im_func, 'enabled', False)
170 f165adc0 Nikos Skalkotos
171 f165adc0 Nikos Skalkotos
    def print_syspreps(self):
172 dcf9274b Vangelis Koukis
        """Print enabled and disabled system preparation operations."""
173 76d4a1c9 Nikos Skalkotos
174 2e50092b Nikos Skalkotos
        syspreps = self.list_syspreps()
175 2e50092b Nikos Skalkotos
        enabled = filter(lambda x: x.enabled, syspreps)
176 2e50092b Nikos Skalkotos
        disabled = filter(lambda x: not x.enabled, syspreps)
177 76d4a1c9 Nikos Skalkotos
178 f165adc0 Nikos Skalkotos
        wrapper = textwrap.TextWrapper()
179 f165adc0 Nikos Skalkotos
        wrapper.subsequent_indent = '\t'
180 f165adc0 Nikos Skalkotos
        wrapper.initial_indent = '\t'
181 4a2fd05c Nikos Skalkotos
        wrapper.width = 72
182 f165adc0 Nikos Skalkotos
183 dcf9274b Vangelis Koukis
        self.out.output("Enabled system preparation operations:")
184 f165adc0 Nikos Skalkotos
        if len(enabled) == 0:
185 e77e66a9 Nikos Skalkotos
            self.out.output("(none)")
186 f165adc0 Nikos Skalkotos
        else:
187 f165adc0 Nikos Skalkotos
            for sysprep in enabled:
188 f165adc0 Nikos Skalkotos
                name = sysprep.__name__.replace('_', '-')
189 4a2fd05c Nikos Skalkotos
                descr = wrapper.fill(textwrap.dedent(sysprep.__doc__))
190 e77e66a9 Nikos Skalkotos
                self.out.output('    %s:\n%s\n' % (name, descr))
191 f165adc0 Nikos Skalkotos
192 dcf9274b Vangelis Koukis
        self.out.output("Disabled system preparation operations:")
193 f165adc0 Nikos Skalkotos
        if len(disabled) == 0:
194 e77e66a9 Nikos Skalkotos
            self.out.output("(none)")
195 f165adc0 Nikos Skalkotos
        else:
196 f165adc0 Nikos Skalkotos
            for sysprep in disabled:
197 f165adc0 Nikos Skalkotos
                name = sysprep.__name__.replace('_', '-')
198 4a2fd05c Nikos Skalkotos
                descr = wrapper.fill(textwrap.dedent(sysprep.__doc__))
199 e77e66a9 Nikos Skalkotos
                self.out.output('    %s:\n%s\n' % (name, descr))
200 76d4a1c9 Nikos Skalkotos
201 d9aff2ae Nikos Skalkotos
    def print_sysprep_params(self):
202 d9aff2ae Nikos Skalkotos
        """Print the system preparation parameter the user may use"""
203 d9aff2ae Nikos Skalkotos
204 d9aff2ae Nikos Skalkotos
        self.out.output("Needed system preparation parameters:")
205 d9aff2ae Nikos Skalkotos
206 d9aff2ae Nikos Skalkotos
        params = self.needed_sysprep_params()
207 d9aff2ae Nikos Skalkotos
208 d9aff2ae Nikos Skalkotos
        if len(params) == 0:
209 d9aff2ae Nikos Skalkotos
            self.out.output("(none)")
210 d9aff2ae Nikos Skalkotos
            return
211 d9aff2ae Nikos Skalkotos
212 d9aff2ae Nikos Skalkotos
        for param in params:
213 d9aff2ae Nikos Skalkotos
            self.out.output("\t%s (%s): %s" %
214 d9aff2ae Nikos Skalkotos
                            (param.description, param.name,
215 d9aff2ae Nikos Skalkotos
                             self.sysprep_params[param.name] if param.name in
216 d9aff2ae Nikos Skalkotos
                             self.sysprep_params else "(none)"))
217 d9aff2ae Nikos Skalkotos
218 121f3bc0 Nikos Skalkotos
    def do_sysprep(self):
219 121f3bc0 Nikos Skalkotos
        """Prepare system for image creation."""
220 121f3bc0 Nikos Skalkotos
221 121f3bc0 Nikos Skalkotos
        try:
222 121f3bc0 Nikos Skalkotos
            if not self.mount(readonly=False):
223 121f3bc0 Nikos Skalkotos
                raise FatalError("Unable to mount the media read-write")
224 121f3bc0 Nikos Skalkotos
225 121f3bc0 Nikos Skalkotos
            self.out.output('Preparing system for image creation:')
226 121f3bc0 Nikos Skalkotos
227 121f3bc0 Nikos Skalkotos
            tasks = self.list_syspreps()
228 121f3bc0 Nikos Skalkotos
            enabled = filter(lambda x: x.enabled, tasks)
229 121f3bc0 Nikos Skalkotos
230 121f3bc0 Nikos Skalkotos
            size = len(enabled)
231 121f3bc0 Nikos Skalkotos
            cnt = 0
232 121f3bc0 Nikos Skalkotos
            for task in enabled:
233 121f3bc0 Nikos Skalkotos
                cnt += 1
234 121f3bc0 Nikos Skalkotos
                self.out.output(('(%d/%d)' % (cnt, size)).ljust(7), False)
235 121f3bc0 Nikos Skalkotos
                task()
236 121f3bc0 Nikos Skalkotos
                setattr(task.im_func, 'executed', True)
237 121f3bc0 Nikos Skalkotos
        finally:
238 121f3bc0 Nikos Skalkotos
            self.umount()
239 121f3bc0 Nikos Skalkotos
240 121f3bc0 Nikos Skalkotos
        self.out.output()
241 121f3bc0 Nikos Skalkotos
242 121f3bc0 Nikos Skalkotos
    def mount(self, readonly=False):
243 121f3bc0 Nikos Skalkotos
        """Mount image."""
244 121f3bc0 Nikos Skalkotos
245 121f3bc0 Nikos Skalkotos
        if getattr(self, "mounted", False):
246 121f3bc0 Nikos Skalkotos
            return True
247 121f3bc0 Nikos Skalkotos
248 121f3bc0 Nikos Skalkotos
        mount_type = 'read-only' if readonly else 'read-write'
249 121f3bc0 Nikos Skalkotos
        self.out.output("Mounting the media %s ..." % mount_type, False)
250 121f3bc0 Nikos Skalkotos
251 121f3bc0 Nikos Skalkotos
        if not self._do_mount(readonly):
252 121f3bc0 Nikos Skalkotos
            return False
253 121f3bc0 Nikos Skalkotos
254 121f3bc0 Nikos Skalkotos
        self.mounted = True
255 121f3bc0 Nikos Skalkotos
        self.out.success('done')
256 121f3bc0 Nikos Skalkotos
        return True
257 121f3bc0 Nikos Skalkotos
258 121f3bc0 Nikos Skalkotos
    def umount(self):
259 121f3bc0 Nikos Skalkotos
        """Umount all mounted filesystems."""
260 121f3bc0 Nikos Skalkotos
261 121f3bc0 Nikos Skalkotos
        self.out.output("Umounting the media ...", False)
262 121f3bc0 Nikos Skalkotos
        self.g.umount_all()
263 121f3bc0 Nikos Skalkotos
        self.mounted = False
264 121f3bc0 Nikos Skalkotos
        self.out.success('done')
265 121f3bc0 Nikos Skalkotos
266 121f3bc0 Nikos Skalkotos
    def _is_sysprep(self, obj):
267 121f3bc0 Nikos Skalkotos
        """Checks if an object is a sysprep"""
268 121f3bc0 Nikos Skalkotos
        return getattr(obj, 'sysprep', False) and callable(obj)
269 121f3bc0 Nikos Skalkotos
270 0d5a999d Nikos Skalkotos
    @add_prefix
271 121f3bc0 Nikos Skalkotos
    def _ls(self, directory):
272 3b2f6619 Nikos Skalkotos
        """List the name of all files under a directory"""
273 8c574358 Nikos Skalkotos
        return self.g.ls(directory)
274 0d5a999d Nikos Skalkotos
275 0d5a999d Nikos Skalkotos
    @add_prefix
276 121f3bc0 Nikos Skalkotos
    def _find(self, directory):
277 3b2f6619 Nikos Skalkotos
        """List the name of all files recursively under a directory"""
278 8c574358 Nikos Skalkotos
        return self.g.find(directory)
279 8c574358 Nikos Skalkotos
280 121f3bc0 Nikos Skalkotos
    def _foreach_file(self, directory, action, **kargs):
281 3b2f6619 Nikos Skalkotos
        """Perform an action recursively on all files under a directory.
282 8c574358 Nikos Skalkotos

283 3b2f6619 Nikos Skalkotos
        The following options are allowed:
284 3b2f6619 Nikos Skalkotos

285 3b2f6619 Nikos Skalkotos
        * maxdepth: If defined the action will not be performed on
286 3b2f6619 Nikos Skalkotos
          files that are below this level of directories under the
287 3b2f6619 Nikos Skalkotos
          directory parameter.
288 3b2f6619 Nikos Skalkotos

289 3b2f6619 Nikos Skalkotos
        * ftype: The action will only be performed on files of this
290 3b2f6619 Nikos Skalkotos
          type. For a list of all allowed filetypes, see here:
291 3b2f6619 Nikos Skalkotos
          http://libguestfs.org/guestfs.3.html#guestfs_readdir
292 3b2f6619 Nikos Skalkotos

293 3b2f6619 Nikos Skalkotos
        * exclude: Exclude all files that follow this pattern.
294 3b2f6619 Nikos Skalkotos
        """
295 8c574358 Nikos Skalkotos
        maxdepth = None if 'maxdepth' not in kargs else kargs['maxdepth']
296 8c574358 Nikos Skalkotos
        if maxdepth == 0:
297 8c574358 Nikos Skalkotos
            return
298 8c574358 Nikos Skalkotos
299 8c574358 Nikos Skalkotos
        # maxdepth -= 1
300 8c574358 Nikos Skalkotos
        maxdepth = None if maxdepth is None else maxdepth - 1
301 8c574358 Nikos Skalkotos
        kargs['maxdepth'] = maxdepth
302 8c574358 Nikos Skalkotos
303 8c574358 Nikos Skalkotos
        exclude = None if 'exclude' not in kargs else kargs['exclude']
304 8c574358 Nikos Skalkotos
        ftype = None if 'ftype' not in kargs else kargs['ftype']
305 8c574358 Nikos Skalkotos
        has_ftype = lambda x, y: y is None and True or x['ftyp'] == y
306 8c574358 Nikos Skalkotos
307 8c574358 Nikos Skalkotos
        for f in self.g.readdir(directory):
308 8c574358 Nikos Skalkotos
            if f['name'] in ('.', '..'):
309 8c574358 Nikos Skalkotos
                continue
310 8c574358 Nikos Skalkotos
311 8c574358 Nikos Skalkotos
            full_path = "%s/%s" % (directory, f['name'])
312 8c574358 Nikos Skalkotos
313 8c574358 Nikos Skalkotos
            if exclude and re.match(exclude, full_path):
314 8c574358 Nikos Skalkotos
                continue
315 8c574358 Nikos Skalkotos
316 8c574358 Nikos Skalkotos
            if has_ftype(f, 'd'):
317 121f3bc0 Nikos Skalkotos
                self._foreach_file(full_path, action, **kargs)
318 8c574358 Nikos Skalkotos
319 8c574358 Nikos Skalkotos
            if has_ftype(f, ftype):
320 8c574358 Nikos Skalkotos
                action(full_path)
321 0d5a999d Nikos Skalkotos
322 121f3bc0 Nikos Skalkotos
    def _do_collect_metadata(self):
323 121f3bc0 Nikos Skalkotos
        """helper method for collect_metadata"""
324 121f3bc0 Nikos Skalkotos
        self.meta['ROOT_PARTITION'] = "%d" % self.g.part_to_partnum(self.root)
325 121f3bc0 Nikos Skalkotos
        self.meta['OSFAMILY'] = self.g.inspect_get_type(self.root)
326 121f3bc0 Nikos Skalkotos
        self.meta['OS'] = self.g.inspect_get_distro(self.root)
327 121f3bc0 Nikos Skalkotos
        if self.meta['OS'] == "unknown":
328 121f3bc0 Nikos Skalkotos
            self.meta['OS'] = self.meta['OSFAMILY']
329 121f3bc0 Nikos Skalkotos
        self.meta['DESCRIPTION'] = self.g.inspect_get_product_name(self.root)
330 71b0ab28 Nikos Skalkotos
331 71b0ab28 Nikos Skalkotos
    def _do_mount(self, readonly):
332 121f3bc0 Nikos Skalkotos
        """helper method for mount"""
333 71b0ab28 Nikos Skalkotos
        try:
334 71b0ab28 Nikos Skalkotos
            self.g.mount_options('ro' if readonly else 'rw', self.root, '/')
335 71b0ab28 Nikos Skalkotos
        except RuntimeError as msg:
336 71b0ab28 Nikos Skalkotos
            self.out.warn("unable to mount the root partition: %s" % msg)
337 71b0ab28 Nikos Skalkotos
            return False
338 71b0ab28 Nikos Skalkotos
339 71b0ab28 Nikos Skalkotos
        return True
340 71b0ab28 Nikos Skalkotos
341 aa2062ba Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :