Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.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 54080484 Nikos Skalkotos
33 8cd155a3 Nikos Skalkotos
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
34 8cd155a3 Nikos Skalkotos
35 54080484 Nikos Skalkotos
# Programs
36 54080484 Nikos Skalkotos
XMLSTARLET=xmlstarlet
37 c349d1b3 Nikos Skalkotos
RESIZE2FS=resize2fs
38 54080484 Nikos Skalkotos
39 54080484 Nikos Skalkotos
CLEANUP=( )
40 54080484 Nikos Skalkotos
41 bad5ca1f Nikos Skalkotos
add_cleanup() {
42 bad5ca1f Nikos Skalkotos
    local cmd=""
43 bad5ca1f Nikos Skalkotos
    for arg; do cmd+=$(printf "%q " "$arg"); done
44 bad5ca1f Nikos Skalkotos
    CLEANUP+=("$cmd")
45 bad5ca1f Nikos Skalkotos
}
46 bad5ca1f Nikos Skalkotos
47 54080484 Nikos Skalkotos
log_error() {
48 7f6bd8e0 Nikos Skalkotos
    echo "ERROR: $@" | tee $RESULT >&2
49 54080484 Nikos Skalkotos
    exit 1
50 54080484 Nikos Skalkotos
}
51 54080484 Nikos Skalkotos
52 54080484 Nikos Skalkotos
get_base_distro() {
53 54080484 Nikos Skalkotos
    local root_dir=$1
54 54080484 Nikos Skalkotos
55 54080484 Nikos Skalkotos
    if [ -e "$root_dir/etc/debian_version" ]; then
56 54080484 Nikos Skalkotos
        echo "debian"
57 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/redhat-release" ]; then
58 54080484 Nikos Skalkotos
        echo "redhat"
59 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/slackware-version" ]; then
60 54080484 Nikos Skalkotos
        echo "slackware"
61 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/SuSE-release" ]; then
62 54080484 Nikos Skalkotos
        echo "suse"
63 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/gentoo-release" ]; then
64 54080484 Nikos Skalkotos
        echo "gentoo"
65 54080484 Nikos Skalkotos
    fi
66 54080484 Nikos Skalkotos
}
67 54080484 Nikos Skalkotos
68 54080484 Nikos Skalkotos
get_distro() {
69 54080484 Nikos Skalkotos
    local root_dir=$1
70 54080484 Nikos Skalkotos
71 54080484 Nikos Skalkotos
    if [ -e "$root_dir/etc/debian_version" ]; then
72 54080484 Nikos Skalkotos
        distro="debian"
73 54080484 Nikos Skalkotos
        if [ -e ${root_dir}/etc/lsb-release ]; then
74 54080484 Nikos Skalkotos
            ID=$(grep $DISTRIB_ID=${root_dir}/etc/lsb-release | cut -d= -f2)
75 54080484 Nikos Skalkotos
            if [ "x$ID" = "xUbuntu" ]; then
76 54080484 Nikos Skalkotos
                distro="ubuntu"
77 54080484 Nikos Skalkotos
            fi
78 54080484 Nikos Skalkotos
        fi
79 54080484 Nikos Skalkotos
        echo "$distro"
80 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/fedora-release" ]; then
81 54080484 Nikos Skalkotos
        echo "fedora"
82 a93a31ee Nikos Skalkotos
    elif [ -e "$root_dir/etc/centos-release" ]; then
83 54080484 Nikos Skalkotos
        echo "centos"
84 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/redhat-release" ]; then
85 54080484 Nikos Skalkotos
        echo "redhat"
86 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/slackware-version" ]; then
87 54080484 Nikos Skalkotos
        echo "slackware"
88 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/SuSE-release" ]; then
89 54080484 Nikos Skalkotos
        echo "suse"
90 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/gentoo-release" ]; then
91 54080484 Nikos Skalkotos
        echo "gentoo"
92 54080484 Nikos Skalkotos
    fi
93 54080484 Nikos Skalkotos
}
94 54080484 Nikos Skalkotos
95 54080484 Nikos Skalkotos
cleanup() {
96 54080484 Nikos Skalkotos
# if something fails here, it souldn't call cleanup again...
97 54080484 Nikos Skalkotos
    trap - EXIT
98 54080484 Nikos Skalkotos
99 54080484 Nikos Skalkotos
    if [ ${#CLEANUP[*]} -gt 0 ]; then
100 54080484 Nikos Skalkotos
        LAST_ELEMENT=$((${#CLEANUP[*]}-1))
101 54080484 Nikos Skalkotos
        REVERSE_INDEXES=$(seq ${LAST_ELEMENT} -1 0)
102 54080484 Nikos Skalkotos
        for i in $REVERSE_INDEXES; do
103 54080484 Nikos Skalkotos
            # If something fails here, it's better to retry it for a few times
104 54080484 Nikos Skalkotos
            # before we give up with an error. This is needed for kpartx when
105 54080484 Nikos Skalkotos
            # dealing with ntfs partitions mounted through fuse. umount is not
106 54080484 Nikos Skalkotos
            # synchronous and may return while the partition is still busy. A
107 54080484 Nikos Skalkotos
            # premature attempt to delete partition mappings through kpartx on a
108 54080484 Nikos Skalkotos
            # device that hosts previously mounted ntfs partition may fail with
109 54080484 Nikos Skalkotos
            # an  `device-mapper: remove ioctl failed: Device or resource busy'
110 54080484 Nikos Skalkotos
            # error. A sensible workaround for this is to wait for a while and
111 54080484 Nikos Skalkotos
            # then try again.
112 54080484 Nikos Skalkotos
            local cmd=${CLEANUP[$i]}
113 54080484 Nikos Skalkotos
            $cmd || for interval in 0.25 0.5 1 2 4; do
114 54080484 Nikos Skalkotos
            echo "Command $cmd failed!"
115 54080484 Nikos Skalkotos
            echo "I'll wait for $interval secs and will retry..."
116 54080484 Nikos Skalkotos
            sleep $interval
117 54080484 Nikos Skalkotos
            $cmd && break
118 54080484 Nikos Skalkotos
        done
119 76009480 Nikos Skalkotos
	if [ "$?" != "0" ]; then
120 76009480 Nikos Skalkotos
            echo "Giving Up..."
121 76009480 Nikos Skalkotos
            exit 1;
122 76009480 Nikos Skalkotos
        fi
123 54080484 Nikos Skalkotos
    done
124 54080484 Nikos Skalkotos
  fi
125 54080484 Nikos Skalkotos
}
126 54080484 Nikos Skalkotos
127 54080484 Nikos Skalkotos
trap cleanup EXIT
128 54080484 Nikos Skalkotos
129 54080484 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :