Statistics
| Branch: | Tag: | Revision:

root / image_creator / util.py @ 09743d3a

History | View | Annotate | Download (2.8 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 3ccb2618 Nikos Skalkotos
34 979096dd Nikos Skalkotos
import sys
35 3ccb2618 Nikos Skalkotos
import pbs
36 8e3065a0 Nikos Skalkotos
import hashlib
37 979096dd Nikos Skalkotos
38 f165adc0 Nikos Skalkotos
39 f165adc0 Nikos Skalkotos
class FatalError(Exception):
40 f165adc0 Nikos Skalkotos
    pass
41 f165adc0 Nikos Skalkotos
42 f165adc0 Nikos Skalkotos
43 3ccb2618 Nikos Skalkotos
def get_command(command):
44 3ccb2618 Nikos Skalkotos
    def find_sbin_command(command, exception):
45 3ccb2618 Nikos Skalkotos
        search_paths = ['/usr/local/sbin', '/usr/sbin', '/sbin']
46 3ccb2618 Nikos Skalkotos
        for fullpath in map(lambda x: "%s/%s" % (x, command), search_paths):
47 3ccb2618 Nikos Skalkotos
            if os.path.exists(fullpath) and os.access(fullpath, os.X_OK):
48 3ccb2618 Nikos Skalkotos
                return pbs.Command(fullpath)
49 3ccb2618 Nikos Skalkotos
        raise exception
50 3ccb2618 Nikos Skalkotos
51 3ccb2618 Nikos Skalkotos
    try:
52 3ccb2618 Nikos Skalkotos
        return pbs.__getattr__(command)
53 3ccb2618 Nikos Skalkotos
    except pbs.CommadNotFount as e:
54 3ccb2618 Nikos Skalkotos
        return find_sbin_command(command, e)
55 22a6d232 Nikos Skalkotos
56 22a6d232 Nikos Skalkotos
57 e77e66a9 Nikos Skalkotos
class MD5:
58 e77e66a9 Nikos Skalkotos
    def __init__(self, output):
59 e77e66a9 Nikos Skalkotos
        self.out = output
60 8e3065a0 Nikos Skalkotos
61 e77e66a9 Nikos Skalkotos
    def compute(self, filename, size):
62 8e3065a0 Nikos Skalkotos
63 96171db1 Nikos Skalkotos
        MB = 2 ** 20
64 96171db1 Nikos Skalkotos
        BLOCKSIZE = 4 * MB  # 4MB
65 8e3065a0 Nikos Skalkotos
66 96171db1 Nikos Skalkotos
        prog_size = ((size + MB - 1) // MB)  # in MB
67 4e58b51b Nikos Skalkotos
        progressbar = self.out.Progress(prog_size, "Calculating md5sum", 'mb')
68 e77e66a9 Nikos Skalkotos
        md5 = hashlib.md5()
69 e77e66a9 Nikos Skalkotos
        with open(filename, "r") as src:
70 e77e66a9 Nikos Skalkotos
            left = size
71 e77e66a9 Nikos Skalkotos
            while left > 0:
72 e77e66a9 Nikos Skalkotos
                length = min(left, BLOCKSIZE)
73 e77e66a9 Nikos Skalkotos
                data = src.read(length)
74 e77e66a9 Nikos Skalkotos
                md5.update(data)
75 e77e66a9 Nikos Skalkotos
                left -= length
76 96171db1 Nikos Skalkotos
                progressbar.goto((size - left) // MB)
77 42ace959 Nikos Skalkotos
78 e77e66a9 Nikos Skalkotos
        checksum = md5.hexdigest()
79 e77e66a9 Nikos Skalkotos
        progressbar.success(checksum)
80 8e3065a0 Nikos Skalkotos
81 e77e66a9 Nikos Skalkotos
        return checksum
82 22a6d232 Nikos Skalkotos
83 22a6d232 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :