1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
#!/bin/sh
# validate /etc/fstab against the current UUID list in
# /etc/uuid_by_partition
#
. /etc/default/functions
pfile=/etc/uuid_by_partition
#
# use debug to find out what is going on
test "$1" = start -o "$1" = debug || exit 0
#
# obtain the current list of parititions with UUIDs
newlist="$(uuid_by_partition)"
if test -r "$pfile"
then
# read the old list
oldlist="$(cat "$pfile")"
#
# if it hasn't changed nothing need be done
test "$newlist" = "$oldlist" && exit 0
#
# it has changed, but this only matters if
# a previously existing uuid has moved, build
# a list of old device vs new device for every
# uuid which has moved
changedlist="$(
{ echo "$oldlist"
echo "$newlist"
} | awk 'device[$2] == ""{device[$2] = $1}
device[$2] != $1{print device[$2], $1}')"
if test -n "$changedlist"
then
# at least one partition has moved, scan the
# current fstab to see if it has a reference
# to this partition
changedfstab="$(
{ echo "$changedlist"
echo '#fstab'
cat /etc/fstab
} | awk 'BEGIN{list=1}
list==1 && $0=="#fstab"{list=0; continue}
list==1{new[$1] = $2; continue}
new[$1] != ""{print $1, new[$1]}')"
# if this list is not empty edit the fstab
if test -n "$changedfstab"
then
rm -f /tmp/fstab.$$
# if the edit fails then do not overwrite the old
# partition list - just exit with an error
{ echo "$changedlist"
echo '#fstab'
cat /etc/fstab
} | awk 'BEGIN{list=1}
list==1 && $0=="#fstab"{list=0; continue}
list==1{new[$1] = $2; continue}
new[$1] != ""{$1 = new[$1]}
{print}' >/tmp/fstab.$$ || {
if test "$1" = start
then
logger -s "/etc/init.d/fixfstab: /tmp/fstab.$$: awk failed"
else
echo "debug: awk script failed with:" >&2
echo "$changedlist" >&2
echo "output in /tmp/fstab.$$" >&2
fi
exit 1
}
if test "$1" = start
then
mv /tmp/fstab.$$ /etc/fstab || {
logger -s "/etc/init.d/fixfstab: /tmp/fstab.$$: update failed"
exit 1
}
else
echo "debug: fstab changed:"
diff -u /etc/fstab /tmp/fstab.$$
fi
fi
fi
fi
# write the new list to the file, only if we
# are doing something...
test "$1" = start && echo "$newlist" >"$pfile"
exit 0
|