root / image_creator / os_type / __init__.py @ f165adc0
History | View | Annotate | Download (6.7 kB)
1 | ae48a082 | Nikos Skalkotos | # Copyright 2012 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | ae48a082 | Nikos Skalkotos | #
|
3 | ae48a082 | Nikos Skalkotos | # Redistribution and use in source and binary forms, with or
|
4 | ae48a082 | Nikos Skalkotos | # without modification, are permitted provided that the following
|
5 | ae48a082 | Nikos Skalkotos | # conditions are met:
|
6 | ae48a082 | Nikos Skalkotos | #
|
7 | ae48a082 | Nikos Skalkotos | # 1. Redistributions of source code must retain the above
|
8 | ae48a082 | Nikos Skalkotos | # copyright notice, this list of conditions and the following
|
9 | ae48a082 | Nikos Skalkotos | # disclaimer.
|
10 | ae48a082 | Nikos Skalkotos | #
|
11 | ae48a082 | Nikos Skalkotos | # 2. Redistributions in binary form must reproduce the above
|
12 | ae48a082 | Nikos Skalkotos | # copyright notice, this list of conditions and the following
|
13 | ae48a082 | Nikos Skalkotos | # disclaimer in the documentation and/or other materials
|
14 | ae48a082 | Nikos Skalkotos | # provided with the distribution.
|
15 | ae48a082 | Nikos Skalkotos | #
|
16 | ae48a082 | Nikos Skalkotos | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | ae48a082 | Nikos Skalkotos | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | ae48a082 | Nikos Skalkotos | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | ae48a082 | Nikos Skalkotos | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | ae48a082 | Nikos Skalkotos | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | ae48a082 | Nikos Skalkotos | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | ae48a082 | Nikos Skalkotos | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | ae48a082 | Nikos Skalkotos | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | ae48a082 | Nikos Skalkotos | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | ae48a082 | Nikos Skalkotos | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | ae48a082 | Nikos Skalkotos | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | ae48a082 | Nikos Skalkotos | # POSSIBILITY OF SUCH DAMAGE.
|
28 | ae48a082 | Nikos Skalkotos | #
|
29 | ae48a082 | Nikos Skalkotos | # The views and conclusions contained in the software and
|
30 | ae48a082 | Nikos Skalkotos | # documentation are those of the authors and should not be
|
31 | ae48a082 | Nikos Skalkotos | # interpreted as representing official policies, either expressed
|
32 | ae48a082 | Nikos Skalkotos | # or implied, of GRNET S.A.
|
33 | aa2062ba | Nikos Skalkotos | |
34 | f165adc0 | Nikos Skalkotos | from image_creator.util import output, FatalError |
35 | 979096dd | Nikos Skalkotos | |
36 | f165adc0 | Nikos Skalkotos | import textwrap |
37 | 8c574358 | Nikos Skalkotos | import re |
38 | 8c574358 | Nikos Skalkotos | |
39 | 8c574358 | Nikos Skalkotos | |
40 | 0d5a999d | Nikos Skalkotos | def add_prefix(target): |
41 | 0d5a999d | Nikos Skalkotos | def wrapper(self, *args): |
42 | 0d5a999d | Nikos Skalkotos | prefix = args[0]
|
43 | 0d5a999d | Nikos Skalkotos | return map(lambda x: prefix + x, target(self, *args)) |
44 | 0d5a999d | Nikos Skalkotos | return wrapper
|
45 | 0d5a999d | Nikos Skalkotos | |
46 | 51fab9c9 | Nikos Skalkotos | |
47 | f165adc0 | Nikos Skalkotos | def sysprep(enabled=True): |
48 | f165adc0 | Nikos Skalkotos | def wrapper(func): |
49 | f165adc0 | Nikos Skalkotos | func.sysprep = True
|
50 | f165adc0 | Nikos Skalkotos | func.enabled = enabled |
51 | f165adc0 | Nikos Skalkotos | return func
|
52 | f165adc0 | Nikos Skalkotos | return wrapper
|
53 | 8c574358 | Nikos Skalkotos | |
54 | 51fab9c9 | Nikos Skalkotos | |
55 | aa2062ba | Nikos Skalkotos | class OSBase(object): |
56 | 3b2f6619 | Nikos Skalkotos | """Basic operating system class"""
|
57 | f165adc0 | Nikos Skalkotos | |
58 | aa2062ba | Nikos Skalkotos | def __init__(self, rootdev, ghandler): |
59 | aa2062ba | Nikos Skalkotos | self.root = rootdev
|
60 | aa2062ba | Nikos Skalkotos | self.g = ghandler
|
61 | aa2062ba | Nikos Skalkotos | |
62 | f165adc0 | Nikos Skalkotos | def _is_sysprep(self, obj): |
63 | f165adc0 | Nikos Skalkotos | return getattr(obj, 'sysprep', False) and callable(obj) |
64 | 76d4a1c9 | Nikos Skalkotos | |
65 | f165adc0 | Nikos Skalkotos | def list_syspreps(self): |
66 | 76d4a1c9 | Nikos Skalkotos | |
67 | f165adc0 | Nikos Skalkotos | objs = [getattr(self, name) for name in dir(self) \ |
68 | f165adc0 | Nikos Skalkotos | if not name.startswith('_')] |
69 | f165adc0 | Nikos Skalkotos | |
70 | f165adc0 | Nikos Skalkotos | enabled = [x for x in objs if self._is_sysprep(x) and x.enabled] |
71 | f165adc0 | Nikos Skalkotos | disabled = [x for x in objs if self._is_sysprep(x) and not x.enabled] |
72 | f165adc0 | Nikos Skalkotos | |
73 | f165adc0 | Nikos Skalkotos | return enabled, disabled
|
74 | f165adc0 | Nikos Skalkotos | |
75 | f165adc0 | Nikos Skalkotos | def _sysprep_change_status(self, name, status): |
76 | f165adc0 | Nikos Skalkotos | |
77 | f165adc0 | Nikos Skalkotos | error_msg = "Syprep operation %s does not exist for %s" % \
|
78 | f165adc0 | Nikos Skalkotos | (name, self.__class__.__name__)
|
79 | f165adc0 | Nikos Skalkotos | |
80 | f165adc0 | Nikos Skalkotos | method_name = name.replace('-', '_') |
81 | f165adc0 | Nikos Skalkotos | method = None
|
82 | f165adc0 | Nikos Skalkotos | try:
|
83 | f165adc0 | Nikos Skalkotos | method = getattr(self, method_name) |
84 | f165adc0 | Nikos Skalkotos | except AttributeError: |
85 | f165adc0 | Nikos Skalkotos | raise FatalError(error_msg)
|
86 | f165adc0 | Nikos Skalkotos | |
87 | f165adc0 | Nikos Skalkotos | if not self._is_sysprep(method): |
88 | f165adc0 | Nikos Skalkotos | raise FatalError(error_msg)
|
89 | f165adc0 | Nikos Skalkotos | |
90 | f165adc0 | Nikos Skalkotos | setattr(method.im_func, 'enabled', status) |
91 | f165adc0 | Nikos Skalkotos | |
92 | f165adc0 | Nikos Skalkotos | def enable_sysprep(self, name): |
93 | f165adc0 | Nikos Skalkotos | """Enable a system preperation operation"""
|
94 | f165adc0 | Nikos Skalkotos | self._sysprep_change_status(name, True) |
95 | f165adc0 | Nikos Skalkotos | |
96 | f165adc0 | Nikos Skalkotos | def disable_sysprep(self, name): |
97 | f165adc0 | Nikos Skalkotos | """Disable a system preperation operation"""
|
98 | f165adc0 | Nikos Skalkotos | self._sysprep_change_status(name, False) |
99 | f165adc0 | Nikos Skalkotos | |
100 | f165adc0 | Nikos Skalkotos | def print_syspreps(self): |
101 | f165adc0 | Nikos Skalkotos | """Print enabled and disabled system preperation operations."""
|
102 | 76d4a1c9 | Nikos Skalkotos | |
103 | f165adc0 | Nikos Skalkotos | enabled, disabled = self.list_syspreps()
|
104 | 76d4a1c9 | Nikos Skalkotos | |
105 | f165adc0 | Nikos Skalkotos | wrapper = textwrap.TextWrapper() |
106 | f165adc0 | Nikos Skalkotos | wrapper.subsequent_indent = '\t'
|
107 | f165adc0 | Nikos Skalkotos | wrapper.initial_indent = '\t'
|
108 | f165adc0 | Nikos Skalkotos | |
109 | f165adc0 | Nikos Skalkotos | output("Enabled system preperation operations:")
|
110 | f165adc0 | Nikos Skalkotos | if len(enabled) == 0: |
111 | f165adc0 | Nikos Skalkotos | output("(none)")
|
112 | f165adc0 | Nikos Skalkotos | else:
|
113 | f165adc0 | Nikos Skalkotos | for sysprep in enabled: |
114 | f165adc0 | Nikos Skalkotos | name = sysprep.__name__.replace('_', '-') |
115 | f165adc0 | Nikos Skalkotos | descr = wrapper.fill(sysprep.__doc__) |
116 | f165adc0 | Nikos Skalkotos | output(' %s:\n%s\n' % (name, descr))
|
117 | f165adc0 | Nikos Skalkotos | |
118 | f165adc0 | Nikos Skalkotos | output("Disabled system preperation operations:")
|
119 | f165adc0 | Nikos Skalkotos | if len(disabled) == 0: |
120 | f165adc0 | Nikos Skalkotos | output("(none)")
|
121 | f165adc0 | Nikos Skalkotos | else:
|
122 | f165adc0 | Nikos Skalkotos | for sysprep in disabled: |
123 | f165adc0 | Nikos Skalkotos | name = sysprep.__name__.replace('_', '-') |
124 | f165adc0 | Nikos Skalkotos | descr = wrapper.fill(sysprep.__doc__) |
125 | f165adc0 | Nikos Skalkotos | output(' %s:\n%s\n' % (name, descr))
|
126 | 76d4a1c9 | Nikos Skalkotos | |
127 | 0d5a999d | Nikos Skalkotos | @add_prefix
|
128 | 8c574358 | Nikos Skalkotos | def ls(self, directory): |
129 | 3b2f6619 | Nikos Skalkotos | """List the name of all files under a directory"""
|
130 | 8c574358 | Nikos Skalkotos | return self.g.ls(directory) |
131 | 0d5a999d | Nikos Skalkotos | |
132 | 0d5a999d | Nikos Skalkotos | @add_prefix
|
133 | 8c574358 | Nikos Skalkotos | def find(self, directory): |
134 | 3b2f6619 | Nikos Skalkotos | """List the name of all files recursively under a directory"""
|
135 | 8c574358 | Nikos Skalkotos | return self.g.find(directory) |
136 | 8c574358 | Nikos Skalkotos | |
137 | 8c574358 | Nikos Skalkotos | def foreach_file(self, directory, action, **kargs): |
138 | 3b2f6619 | Nikos Skalkotos | """Perform an action recursively on all files under a directory.
|
139 | 8c574358 | Nikos Skalkotos |
|
140 | 3b2f6619 | Nikos Skalkotos | The following options are allowed:
|
141 | 3b2f6619 | Nikos Skalkotos |
|
142 | 3b2f6619 | Nikos Skalkotos | * maxdepth: If defined the action will not be performed on
|
143 | 3b2f6619 | Nikos Skalkotos | files that are below this level of directories under the
|
144 | 3b2f6619 | Nikos Skalkotos | directory parameter.
|
145 | 3b2f6619 | Nikos Skalkotos |
|
146 | 3b2f6619 | Nikos Skalkotos | * ftype: The action will only be performed on files of this
|
147 | 3b2f6619 | Nikos Skalkotos | type. For a list of all allowed filetypes, see here:
|
148 | 3b2f6619 | Nikos Skalkotos | http://libguestfs.org/guestfs.3.html#guestfs_readdir
|
149 | 3b2f6619 | Nikos Skalkotos |
|
150 | 3b2f6619 | Nikos Skalkotos | * exclude: Exclude all files that follow this pattern.
|
151 | 3b2f6619 | Nikos Skalkotos | """
|
152 | 8c574358 | Nikos Skalkotos | maxdepth = None if 'maxdepth' not in kargs else kargs['maxdepth'] |
153 | 8c574358 | Nikos Skalkotos | if maxdepth == 0: |
154 | 8c574358 | Nikos Skalkotos | return
|
155 | 8c574358 | Nikos Skalkotos | |
156 | 8c574358 | Nikos Skalkotos | # maxdepth -= 1
|
157 | 8c574358 | Nikos Skalkotos | maxdepth = None if maxdepth is None else maxdepth - 1 |
158 | 8c574358 | Nikos Skalkotos | kargs['maxdepth'] = maxdepth
|
159 | 8c574358 | Nikos Skalkotos | |
160 | 8c574358 | Nikos Skalkotos | exclude = None if 'exclude' not in kargs else kargs['exclude'] |
161 | 8c574358 | Nikos Skalkotos | ftype = None if 'ftype' not in kargs else kargs['ftype'] |
162 | 8c574358 | Nikos Skalkotos | has_ftype = lambda x, y: y is None and True or x['ftyp'] == y |
163 | 8c574358 | Nikos Skalkotos | |
164 | 8c574358 | Nikos Skalkotos | for f in self.g.readdir(directory): |
165 | 8c574358 | Nikos Skalkotos | if f['name'] in ('.', '..'): |
166 | 8c574358 | Nikos Skalkotos | continue
|
167 | 8c574358 | Nikos Skalkotos | |
168 | 8c574358 | Nikos Skalkotos | full_path = "%s/%s" % (directory, f['name']) |
169 | 8c574358 | Nikos Skalkotos | |
170 | 8c574358 | Nikos Skalkotos | if exclude and re.match(exclude, full_path): |
171 | 8c574358 | Nikos Skalkotos | continue
|
172 | 8c574358 | Nikos Skalkotos | |
173 | 8c574358 | Nikos Skalkotos | if has_ftype(f, 'd'): |
174 | 8c574358 | Nikos Skalkotos | self.foreach_file(full_path, action, **kargs)
|
175 | 8c574358 | Nikos Skalkotos | |
176 | 8c574358 | Nikos Skalkotos | if has_ftype(f, ftype):
|
177 | 8c574358 | Nikos Skalkotos | action(full_path) |
178 | 0d5a999d | Nikos Skalkotos | |
179 | aa2062ba | Nikos Skalkotos | def get_metadata(self): |
180 | a1a5ca4b | Nikos Skalkotos | """Returns some descriptive metadata about the OS."""
|
181 | aa2062ba | Nikos Skalkotos | meta = {} |
182 | c408053f | Nikos Skalkotos | meta['ROOT_PARTITION'] = "%d" % self.g.part_to_partnum(self.root) |
183 | c408053f | Nikos Skalkotos | meta['OSFAMILY'] = self.g.inspect_get_type(self.root) |
184 | c408053f | Nikos Skalkotos | meta['OS'] = self.g.inspect_get_distro(self.root) |
185 | 39cfd61a | Nikos Skalkotos | meta['DESCRIPTION'] = self.g.inspect_get_product_name(self.root) |
186 | aa2062ba | Nikos Skalkotos | |
187 | aa2062ba | Nikos Skalkotos | return meta
|
188 | 486ea6e0 | Nikos Skalkotos | |
189 | f165adc0 | Nikos Skalkotos | def do_sysprep(self): |
190 | 9cbb5794 | Nikos Skalkotos | """Prepere system for image creation."""
|
191 | 22a6d232 | Nikos Skalkotos | |
192 | 979096dd | Nikos Skalkotos | output('Preparing system for image creation:')
|
193 | 3f70f242 | Nikos Skalkotos | |
194 | 0144d7c7 | Nikos Skalkotos | tasks, _ = self.list_sysprep()
|
195 | 3f70f242 | Nikos Skalkotos | size = len(tasks)
|
196 | 3f70f242 | Nikos Skalkotos | cnt = 0
|
197 | 3f70f242 | Nikos Skalkotos | for task in tasks: |
198 | 3f70f242 | Nikos Skalkotos | cnt += 1
|
199 | 979096dd | Nikos Skalkotos | output(('(%d/%d)' % (cnt, size)).ljust(7), False) |
200 | 3f70f242 | Nikos Skalkotos | task() |
201 | 979096dd | Nikos Skalkotos | output() |
202 | 9cbb5794 | Nikos Skalkotos | |
203 | aa2062ba | Nikos Skalkotos | # vim: set sta sts=4 shiftwidth=4 sw=4 et ai : |