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 : |