Statistics
| Branch: | Tag: | Revision:

root / snf-image-helper / common.sh @ b873aac3

History | View | Annotate | Download (5.4 kB)

1 54080484 Nikos Skalkotos
# Copyright 2011 GRNET S.A. All rights reserved.
2 54080484 Nikos Skalkotos
#
3 54080484 Nikos Skalkotos
# Redistribution and use in source and binary forms, with or without
4 54080484 Nikos Skalkotos
# modification, are permitted provided that the following conditions
5 54080484 Nikos Skalkotos
# are met:
6 54080484 Nikos Skalkotos
#
7 54080484 Nikos Skalkotos
#   1. Redistributions of source code must retain the above copyright
8 54080484 Nikos Skalkotos
#      notice, this list of conditions and the following disclaimer.
9 54080484 Nikos Skalkotos
#
10 54080484 Nikos Skalkotos
#  2. Redistributions in binary form must reproduce the above copyright
11 54080484 Nikos Skalkotos
#     notice, this list of conditions and the following disclaimer in the
12 54080484 Nikos Skalkotos
#     documentation and/or other materials provided with the distribution.
13 54080484 Nikos Skalkotos
#
14 54080484 Nikos Skalkotos
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 54080484 Nikos Skalkotos
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 54080484 Nikos Skalkotos
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 54080484 Nikos Skalkotos
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 54080484 Nikos Skalkotos
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 54080484 Nikos Skalkotos
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 54080484 Nikos Skalkotos
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 54080484 Nikos Skalkotos
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 54080484 Nikos Skalkotos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 54080484 Nikos Skalkotos
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 54080484 Nikos Skalkotos
# SUCH DAMAGE.
25 54080484 Nikos Skalkotos
#
26 54080484 Nikos Skalkotos
# The views and conclusions contained in the software and documentation are
27 54080484 Nikos Skalkotos
# those of the authors and should not be interpreted as representing official
28 54080484 Nikos Skalkotos
# policies, either expressed or implied, of GRNET S.A.
29 54080484 Nikos Skalkotos
30 7f6bd8e0 Nikos Skalkotos
RESULT=/dev/ttyS1
31 c349d1b3 Nikos Skalkotos
FLOPPY_DEV=/dev/fd0
32 f6e23601 Nikos Skalkotos
PROGNAME=$(basename $0)
33 54080484 Nikos Skalkotos
34 8cd155a3 Nikos Skalkotos
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
35 8cd155a3 Nikos Skalkotos
36 54080484 Nikos Skalkotos
# Programs
37 54080484 Nikos Skalkotos
XMLSTARLET=xmlstarlet
38 c349d1b3 Nikos Skalkotos
RESIZE2FS=resize2fs
39 42f09a19 Nikos Skalkotos
PARTED=parted
40 ec728294 Nikos Skalkotos
REGLOOKUP=reglookup
41 ec728294 Nikos Skalkotos
CHNTPW=chntpw
42 54080484 Nikos Skalkotos
43 54080484 Nikos Skalkotos
CLEANUP=( )
44 54080484 Nikos Skalkotos
45 bad5ca1f Nikos Skalkotos
add_cleanup() {
46 bad5ca1f Nikos Skalkotos
    local cmd=""
47 bad5ca1f Nikos Skalkotos
    for arg; do cmd+=$(printf "%q " "$arg"); done
48 bad5ca1f Nikos Skalkotos
    CLEANUP+=("$cmd")
49 bad5ca1f Nikos Skalkotos
}
50 bad5ca1f Nikos Skalkotos
51 54080484 Nikos Skalkotos
log_error() {
52 7f6bd8e0 Nikos Skalkotos
    echo "ERROR: $@" | tee $RESULT >&2
53 54080484 Nikos Skalkotos
    exit 1
54 54080484 Nikos Skalkotos
}
55 54080484 Nikos Skalkotos
56 f6e23601 Nikos Skalkotos
warn() {
57 f6e23601 Nikos Skalkotos
    echo "Warning: $@" >&2
58 f6e23601 Nikos Skalkotos
}
59 f6e23601 Nikos Skalkotos
60 54080484 Nikos Skalkotos
get_base_distro() {
61 54080484 Nikos Skalkotos
    local root_dir=$1
62 54080484 Nikos Skalkotos
63 54080484 Nikos Skalkotos
    if [ -e "$root_dir/etc/debian_version" ]; then
64 54080484 Nikos Skalkotos
        echo "debian"
65 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/redhat-release" ]; then
66 54080484 Nikos Skalkotos
        echo "redhat"
67 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/slackware-version" ]; then
68 54080484 Nikos Skalkotos
        echo "slackware"
69 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/SuSE-release" ]; then
70 54080484 Nikos Skalkotos
        echo "suse"
71 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/gentoo-release" ]; then
72 54080484 Nikos Skalkotos
        echo "gentoo"
73 54080484 Nikos Skalkotos
    fi
74 54080484 Nikos Skalkotos
}
75 54080484 Nikos Skalkotos
76 54080484 Nikos Skalkotos
get_distro() {
77 54080484 Nikos Skalkotos
    local root_dir=$1
78 54080484 Nikos Skalkotos
79 54080484 Nikos Skalkotos
    if [ -e "$root_dir/etc/debian_version" ]; then
80 54080484 Nikos Skalkotos
        distro="debian"
81 54080484 Nikos Skalkotos
        if [ -e ${root_dir}/etc/lsb-release ]; then
82 df8b2f85 Nikos Skalkotos
            ID=$(grep ^DISTRIB_ID= ${root_dir}/etc/lsb-release | cut -d= -f2)
83 54080484 Nikos Skalkotos
            if [ "x$ID" = "xUbuntu" ]; then
84 54080484 Nikos Skalkotos
                distro="ubuntu"
85 54080484 Nikos Skalkotos
            fi
86 54080484 Nikos Skalkotos
        fi
87 54080484 Nikos Skalkotos
        echo "$distro"
88 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/fedora-release" ]; then
89 54080484 Nikos Skalkotos
        echo "fedora"
90 a93a31ee Nikos Skalkotos
    elif [ -e "$root_dir/etc/centos-release" ]; then
91 54080484 Nikos Skalkotos
        echo "centos"
92 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/redhat-release" ]; then
93 54080484 Nikos Skalkotos
        echo "redhat"
94 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/slackware-version" ]; then
95 54080484 Nikos Skalkotos
        echo "slackware"
96 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/SuSE-release" ]; then
97 54080484 Nikos Skalkotos
        echo "suse"
98 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/gentoo-release" ]; then
99 54080484 Nikos Skalkotos
        echo "gentoo"
100 54080484 Nikos Skalkotos
    fi
101 54080484 Nikos Skalkotos
}
102 54080484 Nikos Skalkotos
103 42f09a19 Nikos Skalkotos
get_last_partition() {
104 42f09a19 Nikos Skalkotos
    local dev="$1"
105 42f09a19 Nikos Skalkotos
106 42f09a19 Nikos Skalkotos
    "$PARTED" -s -m "$dev" unit s print | tail -1
107 42f09a19 Nikos Skalkotos
}
108 42f09a19 Nikos Skalkotos
109 42f09a19 Nikos Skalkotos
get_partition() {
110 42f09a19 Nikos Skalkotos
    local dev="$1"
111 42f09a19 Nikos Skalkotos
    local id="$2"
112 42f09a19 Nikos Skalkotos
113 42f09a19 Nikos Skalkotos
    "$PARTED" -s -m "$dev" unit s print | grep "^$id" 
114 42f09a19 Nikos Skalkotos
}
115 42f09a19 Nikos Skalkotos
116 42f09a19 Nikos Skalkotos
get_partition_count() {
117 42f09a19 Nikos Skalkotos
    local dev="$1"
118 42f09a19 Nikos Skalkotos
119 42f09a19 Nikos Skalkotos
     expr $("$PARTED" -s -m "$dev" unit s print | wc -l) - 2
120 42f09a19 Nikos Skalkotos
}
121 42f09a19 Nikos Skalkotos
122 42f09a19 Nikos Skalkotos
get_last_free_sector() {
123 42f09a19 Nikos Skalkotos
    local dev="$1"
124 42f09a19 Nikos Skalkotos
    local last_line=$("$PARTED" -s -m "$dev" unit s print free | tail -1)
125 42f09a19 Nikos Skalkotos
    local type=$(echo "$last_line" | cut -d: -f 5)
126 42f09a19 Nikos Skalkotos
127 42f09a19 Nikos Skalkotos
    if [ "$type" = "free;" ]; then
128 42f09a19 Nikos Skalkotos
        echo "$last_line" | cut -d: -f 3
129 42f09a19 Nikos Skalkotos
    fi
130 42f09a19 Nikos Skalkotos
}
131 42f09a19 Nikos Skalkotos
132 54080484 Nikos Skalkotos
cleanup() {
133 6a95db10 Vangelis Koukis
    # if something fails here, it shouldn't call cleanup again...
134 54080484 Nikos Skalkotos
    trap - EXIT
135 54080484 Nikos Skalkotos
136 54080484 Nikos Skalkotos
    if [ ${#CLEANUP[*]} -gt 0 ]; then
137 54080484 Nikos Skalkotos
        LAST_ELEMENT=$((${#CLEANUP[*]}-1))
138 54080484 Nikos Skalkotos
        REVERSE_INDEXES=$(seq ${LAST_ELEMENT} -1 0)
139 54080484 Nikos Skalkotos
        for i in $REVERSE_INDEXES; do
140 54080484 Nikos Skalkotos
            # If something fails here, it's better to retry it for a few times
141 54080484 Nikos Skalkotos
            # before we give up with an error. This is needed for kpartx when
142 54080484 Nikos Skalkotos
            # dealing with ntfs partitions mounted through fuse. umount is not
143 54080484 Nikos Skalkotos
            # synchronous and may return while the partition is still busy. A
144 54080484 Nikos Skalkotos
            # premature attempt to delete partition mappings through kpartx on a
145 54080484 Nikos Skalkotos
            # device that hosts previously mounted ntfs partition may fail with
146 6a95db10 Vangelis Koukis
            # a `device-mapper: remove ioctl failed: Device or resource busy'
147 54080484 Nikos Skalkotos
            # error. A sensible workaround for this is to wait for a while and
148 54080484 Nikos Skalkotos
            # then try again.
149 54080484 Nikos Skalkotos
            local cmd=${CLEANUP[$i]}
150 54080484 Nikos Skalkotos
            $cmd || for interval in 0.25 0.5 1 2 4; do
151 54080484 Nikos Skalkotos
            echo "Command $cmd failed!"
152 54080484 Nikos Skalkotos
            echo "I'll wait for $interval secs and will retry..."
153 54080484 Nikos Skalkotos
            sleep $interval
154 54080484 Nikos Skalkotos
            $cmd && break
155 54080484 Nikos Skalkotos
        done
156 76009480 Nikos Skalkotos
	if [ "$?" != "0" ]; then
157 76009480 Nikos Skalkotos
            echo "Giving Up..."
158 76009480 Nikos Skalkotos
            exit 1;
159 76009480 Nikos Skalkotos
        fi
160 54080484 Nikos Skalkotos
    done
161 54080484 Nikos Skalkotos
  fi
162 54080484 Nikos Skalkotos
}
163 54080484 Nikos Skalkotos
164 f6e23601 Nikos Skalkotos
165 e7cbe965 Nikos Skalkotos
check_if_excluded() {
166 f6e23601 Nikos Skalkotos
167 e7cbe965 Nikos Skalkotos
    test "$PROGNAME" = "snf-image-helper" && return 0
168 e7cbe965 Nikos Skalkotos
169 e50c4112 Nikos Skalkotos
    eval local do_exclude=\$SNF_IMAGE_PROPERTY_EXCLUDE_${PROGNAME:2}_TASK
170 e7cbe965 Nikos Skalkotos
    if [ -n "$do_exclude" ]; then
171 e7cbe965 Nikos Skalkotos
        warn "Task $PROGNAME was excluded and will not run."
172 e7cbe965 Nikos Skalkotos
        exit 0
173 e7cbe965 Nikos Skalkotos
    fi
174 e7cbe965 Nikos Skalkotos
175 e7cbe965 Nikos Skalkotos
    return 0
176 e7cbe965 Nikos Skalkotos
}
177 e7cbe965 Nikos Skalkotos
178 de7269cd Nikos Skalkotos
trap cleanup EXIT
179 de7269cd Nikos Skalkotos
180 e7cbe965 Nikos Skalkotos
# Check if the execution of a task should be ommited
181 e7cbe965 Nikos Skalkotos
check_if_excluded
182 54080484 Nikos Skalkotos
183 54080484 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :