3 # Copyright 2012 GRNET S.A. All rights reserved.
5 # Redistribution and use in source and binary forms, with or
6 # without modification, are permitted provided that the following
9 # 1. Redistributions of source code must retain the above
10 # copyright notice, this list of conditions and the following
13 # 2. Redistributions in binary form must reproduce the above
14 # copyright notice, this list of conditions and the following
15 # disclaimer in the documentation and/or other materials
16 # provided with the distribution.
18 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
31 # The views and conclusions contained in the software and
32 # documentation are those of the authors and should not be
33 # interpreted as representing official policies, either expressed
34 # or implied, of GRNET S.A.
37 from image_creator.output.dialog import GaugeOutput
38 from image_creator.util import MD5
44 def update_background_title(session):
46 dev = session['device']
50 size = (dev.size + MB - 1) // MB
51 shrinked = 'shrinked' in session and session['shrinked']
52 postfix = " (shrinked)" if shrinked else ''
54 title = "OS: %s, Distro: %s, Size: %dMB%s" % \
55 (dev.ostype, dev.distro, size, postfix)
57 d.setBackgroundTitle(title)
60 def confirm_exit(d, msg=''):
61 return not d.yesno("%s Do you want to exit?" % msg, width=SMALL_WIDTH)
65 return not d.yesno("Are you sure you want to reset everything?",
66 width=SMALL_WIDTH, defaultno=1)
69 class Reset(Exception):
73 def extract_metadata_string(session):
74 metadata = ['%s=%s' % (k, v) for (k, v) in session['metadata'].items()]
76 if 'task_metadata' in session:
77 metadata.extend("%s=yes" % m for m in session['task_metadata'])
79 return '\n'.join(metadata) + '\n'
82 def extract_image(session):
86 if dir and dir[-1] != os.sep:
89 (code, path) = d.fselect(dir, 10, 50, title="Save image as...")
90 if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
93 if os.path.isdir(path):
97 if os.path.isdir("%s.meta" % path):
98 d.msgbox("Can't overwrite directory `%s.meta'" % path,
102 if os.path.isdir("%s.md5sum" % path):
103 d.msgbox("Can't overwrite directory `%s.md5sum'" % path,
107 basedir = os.path.dirname(path)
108 name = os.path.basename(path)
109 if not os.path.exists(basedir):
110 d.msgbox("Directory `%s' does not exist" % basedir,
118 files = ["%s%s" % (path, ext) for ext in ('', '.meta', '.md5sum')]
119 overwrite = filter(os.path.exists, files)
121 if len(overwrite) > 0:
122 if d.yesno("The following file(s) exist:\n"
123 "%s\nDo you want to overwrite them?" %
124 "\n".join(overwrite), width=SMALL_WIDTH):
127 gauge = GaugeOutput(d, "Image Extraction", "Extracting image...")
129 dev = session['device']
133 if "checksum" not in session:
136 session['checksum'] = md5.compute(session['snapshot'],
142 # Extract metadata file
143 out.output("Extracting metadata file...")
144 with open('%s.meta' % path, 'w') as f:
145 f.write(extract_metadata_string(session))
148 # Extract md5sum file
149 out.output("Extracting md5sum file...")
150 md5str = "%s %s\n" % (session['checksum'], name)
151 with open('%s.md5sum' % path, 'w') as f:
158 d.msgbox("Image file `%s' was successfully extracted!" % path,
164 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :