Statistics
| Branch: | Tag: | Revision:

root / snf-image-helper / common.sh @ 2a0c492d

History | View | Annotate | Download (4.6 kB)

1 7e5d635b Nikos Skalkotos
# Copyright (C) 2011 GRNET S.A. 
2 7e5d635b Nikos Skalkotos
# Copyright (C) 2007, 2008, 2009 Google Inc.
3 54080484 Nikos Skalkotos
#
4 7e5d635b Nikos Skalkotos
# This program is free software; you can redistribute it and/or modify
5 7e5d635b Nikos Skalkotos
# it under the terms of the GNU General Public License as published by
6 7e5d635b Nikos Skalkotos
# the Free Software Foundation; either version 2 of the License, or
7 7e5d635b Nikos Skalkotos
# (at your option) any later version.
8 54080484 Nikos Skalkotos
#
9 7e5d635b Nikos Skalkotos
# This program is distributed in the hope that it will be useful, but
10 7e5d635b Nikos Skalkotos
# WITHOUT ANY WARRANTY; without even the implied warranty of
11 7e5d635b Nikos Skalkotos
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 7e5d635b Nikos Skalkotos
# General Public License for more details.
13 54080484 Nikos Skalkotos
#
14 7e5d635b Nikos Skalkotos
# You should have received a copy of the GNU General Public License
15 7e5d635b Nikos Skalkotos
# along with this program; if not, write to the Free Software
16 7e5d635b Nikos Skalkotos
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 7e5d635b Nikos Skalkotos
# 02110-1301, USA.
18 54080484 Nikos Skalkotos
19 7f6bd8e0 Nikos Skalkotos
RESULT=/dev/ttyS1
20 c349d1b3 Nikos Skalkotos
FLOPPY_DEV=/dev/fd0
21 f6e23601 Nikos Skalkotos
PROGNAME=$(basename $0)
22 54080484 Nikos Skalkotos
23 8cd155a3 Nikos Skalkotos
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
24 8cd155a3 Nikos Skalkotos
25 54080484 Nikos Skalkotos
# Programs
26 54080484 Nikos Skalkotos
XMLSTARLET=xmlstarlet
27 de0cc3e9 Nikos Skalkotos
E2FSCK=e2fsck
28 c349d1b3 Nikos Skalkotos
RESIZE2FS=resize2fs
29 42f09a19 Nikos Skalkotos
PARTED=parted
30 ec728294 Nikos Skalkotos
REGLOOKUP=reglookup
31 ec728294 Nikos Skalkotos
CHNTPW=chntpw
32 54080484 Nikos Skalkotos
33 54080484 Nikos Skalkotos
CLEANUP=( )
34 54080484 Nikos Skalkotos
35 bad5ca1f Nikos Skalkotos
add_cleanup() {
36 bad5ca1f Nikos Skalkotos
    local cmd=""
37 bad5ca1f Nikos Skalkotos
    for arg; do cmd+=$(printf "%q " "$arg"); done
38 bad5ca1f Nikos Skalkotos
    CLEANUP+=("$cmd")
39 bad5ca1f Nikos Skalkotos
}
40 bad5ca1f Nikos Skalkotos
41 54080484 Nikos Skalkotos
log_error() {
42 7f6bd8e0 Nikos Skalkotos
    echo "ERROR: $@" | tee $RESULT >&2
43 54080484 Nikos Skalkotos
    exit 1
44 54080484 Nikos Skalkotos
}
45 54080484 Nikos Skalkotos
46 f6e23601 Nikos Skalkotos
warn() {
47 f6e23601 Nikos Skalkotos
    echo "Warning: $@" >&2
48 f6e23601 Nikos Skalkotos
}
49 f6e23601 Nikos Skalkotos
50 54080484 Nikos Skalkotos
get_base_distro() {
51 54080484 Nikos Skalkotos
    local root_dir=$1
52 54080484 Nikos Skalkotos
53 54080484 Nikos Skalkotos
    if [ -e "$root_dir/etc/debian_version" ]; then
54 54080484 Nikos Skalkotos
        echo "debian"
55 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/redhat-release" ]; then
56 54080484 Nikos Skalkotos
        echo "redhat"
57 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/slackware-version" ]; then
58 54080484 Nikos Skalkotos
        echo "slackware"
59 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/SuSE-release" ]; then
60 54080484 Nikos Skalkotos
        echo "suse"
61 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/gentoo-release" ]; then
62 54080484 Nikos Skalkotos
        echo "gentoo"
63 54080484 Nikos Skalkotos
    fi
64 54080484 Nikos Skalkotos
}
65 54080484 Nikos Skalkotos
66 54080484 Nikos Skalkotos
get_distro() {
67 54080484 Nikos Skalkotos
    local root_dir=$1
68 54080484 Nikos Skalkotos
69 54080484 Nikos Skalkotos
    if [ -e "$root_dir/etc/debian_version" ]; then
70 54080484 Nikos Skalkotos
        distro="debian"
71 54080484 Nikos Skalkotos
        if [ -e ${root_dir}/etc/lsb-release ]; then
72 df8b2f85 Nikos Skalkotos
            ID=$(grep ^DISTRIB_ID= ${root_dir}/etc/lsb-release | cut -d= -f2)
73 54080484 Nikos Skalkotos
            if [ "x$ID" = "xUbuntu" ]; then
74 54080484 Nikos Skalkotos
                distro="ubuntu"
75 54080484 Nikos Skalkotos
            fi
76 54080484 Nikos Skalkotos
        fi
77 54080484 Nikos Skalkotos
        echo "$distro"
78 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/fedora-release" ]; then
79 54080484 Nikos Skalkotos
        echo "fedora"
80 a93a31ee Nikos Skalkotos
    elif [ -e "$root_dir/etc/centos-release" ]; then
81 54080484 Nikos Skalkotos
        echo "centos"
82 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/redhat-release" ]; then
83 54080484 Nikos Skalkotos
        echo "redhat"
84 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/etc/slackware-version" ]; then
85 54080484 Nikos Skalkotos
        echo "slackware"
86 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/SuSE-release" ]; then
87 54080484 Nikos Skalkotos
        echo "suse"
88 54080484 Nikos Skalkotos
    elif [ -e "$root_dir/gentoo-release" ]; then
89 54080484 Nikos Skalkotos
        echo "gentoo"
90 54080484 Nikos Skalkotos
    fi
91 54080484 Nikos Skalkotos
}
92 54080484 Nikos Skalkotos
93 42f09a19 Nikos Skalkotos
get_last_partition() {
94 42f09a19 Nikos Skalkotos
    local dev="$1"
95 42f09a19 Nikos Skalkotos
96 42f09a19 Nikos Skalkotos
    "$PARTED" -s -m "$dev" unit s print | tail -1
97 42f09a19 Nikos Skalkotos
}
98 42f09a19 Nikos Skalkotos
99 42f09a19 Nikos Skalkotos
get_partition() {
100 42f09a19 Nikos Skalkotos
    local dev="$1"
101 42f09a19 Nikos Skalkotos
    local id="$2"
102 42f09a19 Nikos Skalkotos
103 42f09a19 Nikos Skalkotos
    "$PARTED" -s -m "$dev" unit s print | grep "^$id" 
104 42f09a19 Nikos Skalkotos
}
105 42f09a19 Nikos Skalkotos
106 42f09a19 Nikos Skalkotos
get_partition_count() {
107 42f09a19 Nikos Skalkotos
    local dev="$1"
108 42f09a19 Nikos Skalkotos
109 42f09a19 Nikos Skalkotos
     expr $("$PARTED" -s -m "$dev" unit s print | wc -l) - 2
110 42f09a19 Nikos Skalkotos
}
111 42f09a19 Nikos Skalkotos
112 42f09a19 Nikos Skalkotos
get_last_free_sector() {
113 42f09a19 Nikos Skalkotos
    local dev="$1"
114 42f09a19 Nikos Skalkotos
    local last_line=$("$PARTED" -s -m "$dev" unit s print free | tail -1)
115 42f09a19 Nikos Skalkotos
    local type=$(echo "$last_line" | cut -d: -f 5)
116 42f09a19 Nikos Skalkotos
117 42f09a19 Nikos Skalkotos
    if [ "$type" = "free;" ]; then
118 42f09a19 Nikos Skalkotos
        echo "$last_line" | cut -d: -f 3
119 42f09a19 Nikos Skalkotos
    fi
120 42f09a19 Nikos Skalkotos
}
121 42f09a19 Nikos Skalkotos
122 54080484 Nikos Skalkotos
cleanup() {
123 6a95db10 Vangelis Koukis
    # if something fails here, it shouldn't call cleanup again...
124 54080484 Nikos Skalkotos
    trap - EXIT
125 54080484 Nikos Skalkotos
126 54080484 Nikos Skalkotos
    if [ ${#CLEANUP[*]} -gt 0 ]; then
127 54080484 Nikos Skalkotos
        LAST_ELEMENT=$((${#CLEANUP[*]}-1))
128 54080484 Nikos Skalkotos
        REVERSE_INDEXES=$(seq ${LAST_ELEMENT} -1 0)
129 54080484 Nikos Skalkotos
        for i in $REVERSE_INDEXES; do
130 54080484 Nikos Skalkotos
            # If something fails here, it's better to retry it for a few times
131 54080484 Nikos Skalkotos
            # before we give up with an error. This is needed for kpartx when
132 54080484 Nikos Skalkotos
            # dealing with ntfs partitions mounted through fuse. umount is not
133 54080484 Nikos Skalkotos
            # synchronous and may return while the partition is still busy. A
134 54080484 Nikos Skalkotos
            # premature attempt to delete partition mappings through kpartx on a
135 54080484 Nikos Skalkotos
            # device that hosts previously mounted ntfs partition may fail with
136 6a95db10 Vangelis Koukis
            # a `device-mapper: remove ioctl failed: Device or resource busy'
137 54080484 Nikos Skalkotos
            # error. A sensible workaround for this is to wait for a while and
138 54080484 Nikos Skalkotos
            # then try again.
139 54080484 Nikos Skalkotos
            local cmd=${CLEANUP[$i]}
140 54080484 Nikos Skalkotos
            $cmd || for interval in 0.25 0.5 1 2 4; do
141 54080484 Nikos Skalkotos
            echo "Command $cmd failed!"
142 54080484 Nikos Skalkotos
            echo "I'll wait for $interval secs and will retry..."
143 54080484 Nikos Skalkotos
            sleep $interval
144 54080484 Nikos Skalkotos
            $cmd && break
145 54080484 Nikos Skalkotos
        done
146 76009480 Nikos Skalkotos
	if [ "$?" != "0" ]; then
147 76009480 Nikos Skalkotos
            echo "Giving Up..."
148 76009480 Nikos Skalkotos
            exit 1;
149 76009480 Nikos Skalkotos
        fi
150 54080484 Nikos Skalkotos
    done
151 54080484 Nikos Skalkotos
  fi
152 54080484 Nikos Skalkotos
}
153 54080484 Nikos Skalkotos
154 e7cbe965 Nikos Skalkotos
check_if_excluded() {
155 f6e23601 Nikos Skalkotos
156 7ee2a43d Nikos Skalkotos
    local exclude=SNF_IMAGE_PROPERTY_EXCLUDE_TASK_${PROGNAME:2}
157 7ee2a43d Nikos Skalkotos
    if [ -n "${!exclude}" ]; then
158 e7cbe965 Nikos Skalkotos
        warn "Task $PROGNAME was excluded and will not run."
159 e7cbe965 Nikos Skalkotos
        exit 0
160 e7cbe965 Nikos Skalkotos
    fi
161 e7cbe965 Nikos Skalkotos
162 e7cbe965 Nikos Skalkotos
    return 0
163 e7cbe965 Nikos Skalkotos
}
164 e7cbe965 Nikos Skalkotos
165 de7269cd Nikos Skalkotos
trap cleanup EXIT
166 de7269cd Nikos Skalkotos
167 54080484 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :