Statistics
| Branch: | Tag: | Revision:

root / image_creator / util.py @ b1395967

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 b1395967 Nikos Skalkotos
from clint.textui import colored
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 f165adc0 Nikos Skalkotos
    sys.stderr.write(colored.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 979096dd Nikos Skalkotos
        sys.stderr.write(colored.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 979096dd Nikos Skalkotos
        sys.stdout.write(colored.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 b1395967 Nikos Skalkotos
    
93 b1395967 Nikos Skalkotos
    suffix={'default':'%(index)d/%(max)d',
94 b1395967 Nikos Skalkotos
        'percent':'%(percent)d%%',
95 b1395967 Nikos Skalkotos
        'b':'%(index)d/%(max)d B',
96 b1395967 Nikos Skalkotos
        'kb':'%(index)d/%(max)d KB',
97 b1395967 Nikos Skalkotos
        'mb':'%(index)d/%(max)d MB'}
98 22a6d232 Nikos Skalkotos
99 b1395967 Nikos Skalkotos
    return Bar(message=message.ljust(MESSAGE_LENGTH), fill='#', \
100 b1395967 Nikos Skalkotos
                                                    suffix=suffix[bar_type])
101 8e3065a0 Nikos Skalkotos
102 b1395967 Nikos Skalkotos
def md5(filename, size):
103 8e3065a0 Nikos Skalkotos
104 b1395967 Nikos Skalkotos
    BLOCKSIZE = 2 ** 22  # 4MB
105 8e3065a0 Nikos Skalkotos
106 b1395967 Nikos Skalkotos
    progressbar = progress("Calculating md5sum:", 'mb')
107 b1395967 Nikos Skalkotos
    progressbar.max = (size // (2 ** 20))
108 8e3065a0 Nikos Skalkotos
    md5 = hashlib.md5()
109 8e3065a0 Nikos Skalkotos
    with open(filename, "r") as src:
110 8e3065a0 Nikos Skalkotos
        left = size
111 8e3065a0 Nikos Skalkotos
        while left > 0:
112 8e3065a0 Nikos Skalkotos
            length = min(left, BLOCKSIZE)
113 8e3065a0 Nikos Skalkotos
            data = src.read(length)
114 8e3065a0 Nikos Skalkotos
            md5.update(data)
115 8e3065a0 Nikos Skalkotos
            left -= length
116 b1395967 Nikos Skalkotos
            progressbar.goto((size - left) // (2 ** 20))
117 b1395967 Nikos Skalkotos
    
118 b1395967 Nikos Skalkotos
    checksum = md5.hexdigest()
119 b1395967 Nikos Skalkotos
    output("\rCalculating md5sum...\033[K", False)
120 b1395967 Nikos Skalkotos
    success(checksum)
121 8e3065a0 Nikos Skalkotos
122 b1395967 Nikos Skalkotos
    return checksum
123 22a6d232 Nikos Skalkotos
124 22a6d232 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :