Statistics
| Branch: | Tag: | Revision:

root / image_creator / util.py @ 42ace959

History | View | Annotate | Download (3.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 42ace959 Nikos Skalkotos
from colors import red, green, yellow
38 b1395967 Nikos Skalkotos
from progress.bar import Bar
39 979096dd Nikos Skalkotos
40 f165adc0 Nikos Skalkotos
41 f165adc0 Nikos Skalkotos
class FatalError(Exception):
42 f165adc0 Nikos Skalkotos
    pass
43 f165adc0 Nikos Skalkotos
44 f165adc0 Nikos Skalkotos
45 979096dd Nikos Skalkotos
silent = False
46 3ccb2618 Nikos Skalkotos
47 ae48a082 Nikos Skalkotos
48 3ccb2618 Nikos Skalkotos
def get_command(command):
49 3ccb2618 Nikos Skalkotos
    def find_sbin_command(command, exception):
50 3ccb2618 Nikos Skalkotos
        search_paths = ['/usr/local/sbin', '/usr/sbin', '/sbin']
51 3ccb2618 Nikos Skalkotos
        for fullpath in map(lambda x: "%s/%s" % (x, command), search_paths):
52 3ccb2618 Nikos Skalkotos
            if os.path.exists(fullpath) and os.access(fullpath, os.X_OK):
53 3ccb2618 Nikos Skalkotos
                return pbs.Command(fullpath)
54 3ccb2618 Nikos Skalkotos
        raise exception
55 3ccb2618 Nikos Skalkotos
56 3ccb2618 Nikos Skalkotos
    try:
57 3ccb2618 Nikos Skalkotos
        return pbs.__getattr__(command)
58 3ccb2618 Nikos Skalkotos
    except pbs.CommadNotFount as e:
59 3ccb2618 Nikos Skalkotos
        return find_sbin_command(command, e)
60 22a6d232 Nikos Skalkotos
61 22a6d232 Nikos Skalkotos
62 e2cf65d3 Nikos Skalkotos
def error(msg, new_line=True):
63 979096dd Nikos Skalkotos
    nl = "\n" if new_line else ''
64 42ace959 Nikos Skalkotos
    sys.stderr.write(red('Error: %s' % msg) + nl)
65 22a6d232 Nikos Skalkotos
66 22a6d232 Nikos Skalkotos
67 e2cf65d3 Nikos Skalkotos
def warn(msg, new_line=True):
68 979096dd Nikos Skalkotos
    if not silent:
69 979096dd Nikos Skalkotos
        nl = "\n" if new_line else ''
70 42ace959 Nikos Skalkotos
        sys.stderr.write(yellow("Warning: %s" % msg) + nl)
71 22a6d232 Nikos Skalkotos
72 22a6d232 Nikos Skalkotos
73 e2cf65d3 Nikos Skalkotos
def success(msg, new_line=True):
74 979096dd Nikos Skalkotos
    if not silent:
75 979096dd Nikos Skalkotos
        nl = "\n" if new_line else ''
76 42ace959 Nikos Skalkotos
        sys.stdout.write(green(msg) + nl)
77 979096dd Nikos Skalkotos
        if not nl:
78 979096dd Nikos Skalkotos
            sys.stdout.flush()
79 979096dd Nikos Skalkotos
80 979096dd Nikos Skalkotos
81 979096dd Nikos Skalkotos
def output(msg="", new_line=True):
82 979096dd Nikos Skalkotos
    if not silent:
83 979096dd Nikos Skalkotos
        nl = "\n" if new_line else ''
84 979096dd Nikos Skalkotos
        sys.stdout.write(msg + nl)
85 979096dd Nikos Skalkotos
        if not nl:
86 979096dd Nikos Skalkotos
            sys.stdout.flush()
87 979096dd Nikos Skalkotos
88 979096dd Nikos Skalkotos
89 b1395967 Nikos Skalkotos
def progress(message='', bar_type="default"):
90 22a6d232 Nikos Skalkotos
91 b1395967 Nikos Skalkotos
    MESSAGE_LENGTH = 30
92 22a6d232 Nikos Skalkotos
93 42ace959 Nikos Skalkotos
    suffix = {
94 42ace959 Nikos Skalkotos
        'default': '%(index)d/%(max)d',
95 42ace959 Nikos Skalkotos
        'percent': '%(percent)d%%',
96 42ace959 Nikos Skalkotos
        'b': '%(index)d/%(max)d B',
97 42ace959 Nikos Skalkotos
        'kb': '%(index)d/%(max)d KB',
98 42ace959 Nikos Skalkotos
        'mb': '%(index)d/%(max)d MB'
99 42ace959 Nikos Skalkotos
    }
100 42ace959 Nikos Skalkotos
101 42ace959 Nikos Skalkotos
    bar = Bar()
102 42ace959 Nikos Skalkotos
    bar.message = message.ljust(MESSAGE_LENGTH)
103 42ace959 Nikos Skalkotos
    bar.fill = '#'
104 42ace959 Nikos Skalkotos
    bar.suffix = suffix[bar_type]
105 42ace959 Nikos Skalkotos
    bar.bar_prefix = ' ['
106 42ace959 Nikos Skalkotos
    bar.bar_suffix = '] '
107 42ace959 Nikos Skalkotos
108 42ace959 Nikos Skalkotos
    return bar
109 42ace959 Nikos Skalkotos
110 8e3065a0 Nikos Skalkotos
111 b1395967 Nikos Skalkotos
def md5(filename, size):
112 8e3065a0 Nikos Skalkotos
113 b1395967 Nikos Skalkotos
    BLOCKSIZE = 2 ** 22  # 4MB
114 8e3065a0 Nikos Skalkotos
115 b1395967 Nikos Skalkotos
    progressbar = progress("Calculating md5sum:", 'mb')
116 b1395967 Nikos Skalkotos
    progressbar.max = (size // (2 ** 20))
117 8e3065a0 Nikos Skalkotos
    md5 = hashlib.md5()
118 8e3065a0 Nikos Skalkotos
    with open(filename, "r") as src:
119 8e3065a0 Nikos Skalkotos
        left = size
120 8e3065a0 Nikos Skalkotos
        while left > 0:
121 8e3065a0 Nikos Skalkotos
            length = min(left, BLOCKSIZE)
122 8e3065a0 Nikos Skalkotos
            data = src.read(length)
123 8e3065a0 Nikos Skalkotos
            md5.update(data)
124 8e3065a0 Nikos Skalkotos
            left -= length
125 b1395967 Nikos Skalkotos
            progressbar.goto((size - left) // (2 ** 20))
126 42ace959 Nikos Skalkotos
127 b1395967 Nikos Skalkotos
    checksum = md5.hexdigest()
128 b1395967 Nikos Skalkotos
    output("\rCalculating md5sum...\033[K", False)
129 b1395967 Nikos Skalkotos
    success(checksum)
130 8e3065a0 Nikos Skalkotos
131 b1395967 Nikos Skalkotos
    return checksum
132 22a6d232 Nikos Skalkotos
133 22a6d232 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :