Subject: Re: Updating /etc after upgrade
To: Frederick Bruckman <fb@enteract.com>
From: Johan Danielsson <joda@pdc.kth.se>
List: current-users
Date: 08/10/2000 23:29:34
Frederick Bruckman <fb@enteract.com> writes:
> "diff -r -u /etc.old /etc | less". No, sorry. :-P
I keep a copy of the unmodified etc-files, and then use this script to
merge any changes I've made. Works quite well for me.
/Johan
#! /bin/sh
BASE=base-files
EVAL=echo
VERBOSE=echo
add_file () {
eval "$1=\"\$$1 $2\""
}
unchanged=""
updated=""
needs_merge=""
binary=""
removed=""
needs_remove=""
locally_removed=""
for i in `find . -type f | sed -e 's/.\///'`; do
if cmp -s $i /etc/$i; then
add_file unchanged "$i"
continue
fi
if [ -f /etc/$BASE/$i ]; then
if [ -f /etc/$i ]; then
diff3 -m /etc/$i /etc/$BASE/$i $i > /tmp/out.$$ 2> /dev/null
case "$?" in
0)
add_file updated "$i"
$VERBOSE "merging $i"
$EVAL "cp /tmp/out.$$ /etc/$i"
;;
1)
add_file needs_merge "$i"
$VERBOSE "update $i manually"
$EVAL "cp /tmp/out.$$ /etc/$i.merge"
;;
2)
add_file binary "$i"
$VERBOSE "failed to merge $i"
;;
esac
else
add_file locally_removed "$i"
$VERBOSE "$i is removed"
fi
else
if [ -f /etc/$i ]; then
add_file needs_merge "$i"
$VERBOSE "update $i manually"
$EVAL "cp -p $i /etc/$i.merge"
else
add_file updated "$i"
$EVAL "cp -p $i /etc/$i"
fi
fi
done
NEW=`pwd`
cd /etc/$BASE
for i in `find . -type f | sed -e 's/.\///'`; do
if [ ! -f $NEW/$i ]; then
if [ -f /etc/$i ]; then
if cmp -s $i /etc/$i; then
add_file removed "$i"
$VERBOSE "removing $i"
$EVAL "rm -f /etc/$i"
else
add_file needs_remove "$i"
$VERBOSE "removed file $i is modified"
fi
fi
fi
done
echo "The following files have been successfully updated:"
for i in $updated; do
echo " $i"
done | sort
echo "The following obsolete files have been removed:"
for i in $removed; do
echo " $i"
done | sort
echo "These files needs to be manually updated:"
for i in $needs_merge $binary; do
echo " $i"
done | sort
echo "These files have been locally removed:"
for i in $locally_removed; do
echo " $i"
done | sort
echo "These obsolete files have been modified:"
for i in $needs_remove; do
echo " $i"
done | sort