]>
Commit | Line | Data |
---|---|---|
e83446da | 1 | |
5db4f8e3 KZ |
2 | TS_OUTDIR="output" |
3 | TS_DIFFDIR="diff" | |
4 | TS_EXPECTEDDIR="expected" | |
5 | TS_INPUTDIR="input" | |
57a917d6 | 6 | TS_VERBOSE="no" |
e83446da | 7 | |
b30cd7ee KZ |
8 | function ts_skip { |
9 | echo " IGNORE ($1)" | |
3dfa278e KZ |
10 | if [ -n "$2" ] && [ -b "$2" ]; then |
11 | ts_device_deinit "$2" | |
12 | fi | |
b30cd7ee KZ |
13 | exit 0 |
14 | } | |
15 | ||
09892fb6 KZ |
16 | function ts_skip_nonroot { |
17 | if [ $UID != 0 ]; then | |
18 | ts_skip "not root permissions" | |
19 | fi | |
20 | } | |
21 | ||
05de8126 KZ |
22 | function ts_failed { |
23 | if [ x"$1" == x"" ]; then | |
24 | echo " FAILED ($TS_NAME)" | |
25 | else | |
26 | echo " FAILED ($1)" | |
27 | fi | |
28 | exit 1 | |
29 | } | |
30 | ||
31 | function ts_ok { | |
32 | if [ x"$1" == x"" ]; then | |
33 | echo " OK" | |
34 | else | |
35 | echo " OK ($1)" | |
36 | fi | |
37 | exit 0 | |
38 | } | |
39 | ||
57a917d6 KZ |
40 | function ts_log { |
41 | echo "$1" >> $TS_OUTPUT | |
42 | [ "$TS_VERBOSE" == "yes" ] && echo "$1" | |
43 | } | |
44 | ||
1d9acab1 KZ |
45 | function ts_has_option { |
46 | NAME="$1" | |
47 | ALL="$2" | |
48 | echo -n $ALL | sed 's/ //g' | gawk 'BEGIN { FS="="; RS="--" } /('$NAME'$|'$NAME'=)/ { print "yes" }' | |
49 | } | |
50 | ||
e83446da | 51 | function ts_init { |
e9ce5ccc | 52 | export LANG="en_US.UTF-8": |
e83446da KZ |
53 | TS_NAME=$(basename $0) |
54 | if [ ! -d $TS_OUTDIR ]; then | |
55 | mkdir -p $TS_OUTDIR | |
56 | fi | |
57 | if [ ! -d $TS_DIFFDIR ]; then | |
58 | mkdir -p $TS_DIFFDIR | |
59 | fi | |
1d9acab1 KZ |
60 | |
61 | TS_VERBOSE=$( ts_has_option "verbose" "$*") | |
e83446da KZ |
62 | TS_OUTPUT="$TS_OUTDIR/$TS_NAME" |
63 | TS_DIFF="$TS_DIFFDIR/$TS_NAME" | |
64 | TS_EXPECTED="$TS_EXPECTEDDIR/$TS_NAME" | |
e9ce5ccc | 65 | TS_INPUT="$TS_INPUTDIR/$TS_NAME" |
c98825ac | 66 | TS_MOUNTPOINT="$(pwd)/$TS_OUTDIR/${TS_NAME}_mnt" |
66822df3 KZ |
67 | TS_BLKIDCACHE="" |
68 | TS_HAS_VOLUMEID="no" | |
69 | ||
70 | ldd $TS_CMD_MOUNT | grep -q 'libvolume_id' &> /dev/null | |
71 | if [ "$?" == "0" ]; then | |
72 | TS_HAS_VOLUMEID="yes" | |
73 | fi | |
74 | if [ "$TS_HAS_VOLUMEID" != "yes" ]; then | |
75 | if [ -f "/etc/blkid/blkid.tab" ]; then | |
76 | TS_BLKIDCACHE="/etc/blkid/blkid.tab" | |
77 | elif [ -f "/etc/blkid.tab" ]; then | |
78 | TS_BLKIDCACHE="/etc/blkid.tab" | |
79 | fi | |
80 | fi | |
e83446da | 81 | |
97cdb3cb | 82 | rm -f $TS_OUTPUT |
3dfa278e | 83 | touch $TS_OUTPUT |
97cdb3cb | 84 | |
e83446da KZ |
85 | printf "%15s: %-25s ..." "$TS_COMPONENT" "$TS_DESC" |
86 | } | |
87 | ||
88 | function ts_finalize { | |
89 | local res=0 | |
90 | ||
91 | if [ -s $TS_EXPECTED ]; then | |
92 | if [ -s $TS_OUTPUT ]; then | |
93 | diff -u $TS_EXPECTED $TS_OUTPUT > $TS_DIFF | |
94 | if [ -s $TS_DIFF ]; then | |
95 | res=1 | |
96 | fi | |
97 | else | |
e9ce5ccc | 98 | res=1 |
e83446da | 99 | fi |
97cdb3cb KZ |
100 | else |
101 | echo " IGNORE (expected output undefined)" | |
102 | exit 0 | |
e83446da KZ |
103 | fi |
104 | if [ $res -eq 0 ]; then | |
05de8126 | 105 | ts_ok $1 |
e83446da | 106 | else |
05de8126 | 107 | ts_failed $1 |
e83446da KZ |
108 | fi |
109 | } | |
110 | ||
3dfa278e | 111 | function ts_die { |
57a917d6 | 112 | ts_log "$1" |
3dfa278e KZ |
113 | if [ -n "$2" ] && [ -b "$2" ]; then |
114 | ts_device_deinit "$2" | |
c98825ac | 115 | ts_fstab_clean # for sure... |
3dfa278e KZ |
116 | fi |
117 | ts_finalize | |
118 | } | |
119 | ||
df7e52d7 | 120 | function ts_device_init { |
3dfa278e KZ |
121 | local IMAGE="$TS_OUTDIR/$TS_NAME.img" |
122 | local IMAGE_RE=$( echo "$IMAGE" | sed 's:/:\\/:g' ) | |
123 | local DEV="" | |
05de8126 | 124 | |
66822df3 KZ |
125 | if [ "$TS_HAS_VOLUMEID" != "yes" ] && [ -f "$TS_BLKIDCACHE" ]; then |
126 | cp $TS_BLKIDCACHE $OUTDIR/$TS_NAME.cache | |
127 | fi | |
128 | ||
df7e52d7 | 129 | dd if=/dev/zero of="$IMAGE" bs=1M count=5 &> /dev/null |
05de8126 | 130 | |
df7e52d7 | 131 | $TS_CMD_LOSETUP -f "$IMAGE" 2>&1 >> $TS_OUTPUT |
3dfa278e | 132 | DEV=$( $TS_CMD_LOSETUP -a | gawk 'BEGIN {FS=":"} /'$IMAGE_RE'/ { print $1 }' ) |
df7e52d7 | 133 | |
3dfa278e KZ |
134 | if [ -z "$DEV" ]; then |
135 | ts_device_deinit $DEV | |
df7e52d7 KZ |
136 | return 1 # error |
137 | fi | |
138 | ||
3dfa278e | 139 | echo $DEV |
df7e52d7 KZ |
140 | return 0 # succes |
141 | } | |
142 | ||
143 | function ts_device_deinit { | |
3dfa278e KZ |
144 | local DEV="$1" |
145 | ||
146 | if [ -b "$DEV" ]; then | |
147 | $TS_CMD_UMOUNT "$DEV" &> /dev/null | |
148 | $TS_CMD_LOSETUP -d "$DEV" &> /dev/null | |
66822df3 KZ |
149 | if [ "$TS_HAS_VOLUMEID" != "yes" ] && [ -f "$TS_BLKIDCACHE" ] && [ -s "$OUTDIR/$TS_NAME.cache" ]; then |
150 | # We have to remove the device from cache otherwise | |
151 | # libblkid will reuse cached information. The cache | |
152 | # refresh time is 2 seconds -- that's too long. We | |
153 | # re-use the same device more quickly. --kzak | |
154 | mv -f $OUTDIR/$TS_NAME.cache $TS_BLKIDCACHE | |
155 | fi | |
df7e52d7 KZ |
156 | fi |
157 | } | |
064b8c38 | 158 | |
3dfa278e | 159 | function ts_udev_dev_support { |
66822df3 | 160 | if [ "$TS_HAS_VOLUMEID" == "yes" ] && [ ! -L "/dev/disk/$1/$2" ]; then |
064b8c38 KZ |
161 | return 1 |
162 | fi | |
163 | return 0 | |
164 | } | |
165 | ||
3f5bda01 KZ |
166 | function ts_uuid_by_devname { |
167 | local DEV="$1" | |
168 | local UUID="" | |
169 | if [ -x "$TS_ECMD_BLKID" ]; then | |
170 | UUID=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "UUID" $DEV | sed 's/.*UUID="//g; s/"//g') | |
171 | elif [ -x "$TS_ECMD_VOLID" ]; then | |
172 | UUID=$($TS_ECMD_VOLID -u $DEV) | |
173 | fi | |
174 | echo $UUID | |
175 | } | |
176 | ||
177 | function ts_label_by_devname { | |
178 | local DEV="$1" | |
179 | local TYPE="" | |
180 | if [ -x "$TS_ECMD_BLKID" ]; then | |
181 | LABEL=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "LABEL" $DEV | sed 's/.*LABEL="//g; s/"//g') | |
182 | elif [ -x "$TS_ECMD_VOLID" ]; then | |
183 | LABEL=$($TS_ECMD_VOLID -l $DEV) | |
184 | fi | |
185 | echo $LABEL | |
186 | } | |
187 | ||
188 | function ts_fstype_by_devname { | |
189 | local DEV="$1" | |
190 | local TYPE="" | |
191 | if [ -x "$TS_ECMD_BLKID" ]; then | |
192 | TYPE=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "TYPE" $DEV | sed 's/.*TYPE="//g; s/"//g') | |
193 | elif [ -x "$TS_ECMD_VOLID" ]; then | |
194 | TYPE=$($TS_ECMD_VOLID -t $DEV) | |
195 | fi | |
196 | echo $TYPE | |
197 | } | |
198 | ||
199 | function ts_device_has { | |
200 | local TAG="$1" | |
201 | local VAL="$2" | |
202 | local DEV="$3" | |
3dfa278e | 203 | local vl="" |
3f5bda01 KZ |
204 | |
205 | case $TAG in | |
206 | "TYPE") vl=$(ts_fstype_by_devname $DEV);; | |
207 | "LABEL") vl=$(ts_label_by_devname $DEV);; | |
208 | "UUID") vl=$(ts_uuid_by_devname $DEV);; | |
209 | *) return 1;; | |
210 | esac | |
211 | ||
212 | if [ "$vl" == "$VAL" ]; then | |
213 | return 0 | |
214 | fi | |
215 | return 1 | |
216 | } | |
3dfa278e KZ |
217 | |
218 | function ts_device_has_uuid { | |
219 | ts_uuid_by_devname "$1" | egrep -q '^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$' | |
220 | return $? | |
221 | } | |
222 | ||
223 | function ts_swapoff { | |
224 | local DEV="$1" | |
225 | ||
226 | # swapoff doesn't exist in build tree | |
227 | if [ ! -x "$TS_CMD_SWAPOFF" ]; then | |
228 | ln -sf $TS_CMD_SWAPON $TS_CMD_SWAPOFF | |
229 | REMSWAPOFF="true" | |
230 | fi | |
231 | $TS_CMD_SWAPOFF $DEV 2>&1 >> $TS_OUTPUT | |
232 | if [ -n "$REMSWAPOFF" ]; then | |
233 | rm -f $TS_CMD_SWAPOFF | |
234 | fi | |
235 | } | |
c98825ac KZ |
236 | |
237 | function ts_fstab_open { | |
238 | echo "# <!-- util-linux-ng test entry" >> /etc/fstab | |
239 | } | |
240 | ||
241 | function ts_fstab_close { | |
242 | echo "# -->" >> /etc/fstab | |
243 | } | |
244 | ||
245 | function ts_fstab_addline { | |
246 | local SPEC="$1" | |
247 | local MNT=${2:-"$TS_MOUNTPOINT"} | |
248 | local FS=${3:-"auto"} | |
b002d021 | 249 | local OPT=${4:-"defaults"} |
c98825ac | 250 | |
b002d021 | 251 | echo "$SPEC $MNT $FS $OPT 0 0" >> /etc/fstab |
c98825ac KZ |
252 | } |
253 | ||
254 | function ts_fstab_add { | |
255 | ts_fstab_open | |
b002d021 | 256 | ts_fstab_addline $* |
c98825ac KZ |
257 | ts_fstab_close |
258 | } | |
259 | ||
260 | function ts_fstab_clean { | |
261 | sed --in-place " | |
262 | /# <!-- util-linux-ng/!b | |
263 | :a | |
264 | /# -->/!{ | |
265 | N | |
266 | ba | |
267 | } | |
268 | s/# <!-- util-linux-ng.*-->//; | |
269 | /^$/d" /etc/fstab | |
270 | } | |
271 |