Date: Wed, 27 May 1998 22:11:37 +0930 From: Matthew Thyer <thyerm@camtech.net.au> To: Poul-Henning Kamp <phk@FreeBSD.ORG> Cc: freebsd-bugs@FreeBSD.ORG Subject: Re: misc/5147 Message-ID: <356C0A01.CB451BD7@camtech.net.au> References: <199805270952.CAA17930@freefall.freebsd.org>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
I include version 1.9 of my etcud script I use to help me
see whats changed with the files in /usr/src/etc.
Sure I admit its a bit of a hack but at least it works for
all platforms now.
I think other peoples efforts in this field are more 'correct'
e.g. ``Making the world'' your own by:
Nik Clayton, <Nik.Clayton@iii.co.uk>
Kees Jan Koster, <kjk1@ukc.ac.uk>
A Joseph Kosy, <koshy@india.hp.com>
Greg Lehey, <grog@lemis.com>
Wes Peters, <softweyr@xmission.com>
Joseph Stein, <joes@joes.users.spiritone.com>
and Studded, <Studded@dal.net>
But I get the feeling that what people really do is see what's
changed in /usr/src/etc and compare it with /etc (as well as reading
the lists).
That's what this script does (except for reading the lists ;) ).
You can close the PR as I see that there is at least a mention that
the Makefile should be read:
http://www.FreeBSD.org/handbook/handbook259.html
But maybe you'd like to include mention of ``Making the world''
your own or my script in the handbook as the above entry is
barely noticeable.
--
/=====================================================================\
|Work: Matthew.Thyer@dsto.defence.gov.au | Home: thyerm@camtech.net.au|
\=====================================================================/
[-- Attachment #2 --]
#!/bin/sh
#
# etcud 1.9 - Compare /etc with /usr/src/etc to check for updated files (for
# this machines hardware platform).
#
# etcud [-a] [-v] [-d] [-n] [-t] [-r <directory>] [-i <pattern> | -e <pattern>]
#
# This script compares the MD5 checksums of all files found in the etc
# directory of the source distribution (/usr/src/etc by default) with
# those in /etc to alert you when /etc files need updating.
#
# Options:
#
# -a Also output information for files where the checksums match.
# -v Display RCS version strings if present.
# -d Display diffs between the files.
# -n Non-exact mode. i.e. dont use '-x' with egrep for inclusion
# and exclusion patterns. For power users only!
# -t Typical usage. This is the same as etcud -e $DEF_EXCL
# -r <dir> Set the root directory of the source distribution.
# -i <patt> Inclusion filename pattern (those files to check).
# -e <patt> Exclusion filename pattern (those file to ignore).
#
# Inclusion and exclusion patterns must be an egrep pattern which is a list
# of file names separated by the pipe character. The filenames must be
# relative to the etc directory of the source distribution (/usr/src/etc
# by default).
#
# By default the script will use egrep -x which means the patterns must
# exactly match for the files to be included or excluded. This is
# generally what you want as you probably want to be able to type
# "etcud -e hosts" to exclude the file /etc/hosts but not the file
# /etc/hosts.lpd. Power users can use -n to disable the use of -x
# with egrep. This can be useful when dealing with the ppp directory
# for example.
#
# NOTES
# - You can use EITHER an exclusion OR an inclusion file pattern, not
# both. Subsequent uses will be ignored with a warning.
#
# - Use of the typical option (-t) will run etcud with the default
# exclusion pattern, set at $DEF_EXCL below. This mode overrides
# any previously specified inclusion or exclusion patterns with a
# warning. This mode also silently ignores -n.
#
# - Version 1.9 knows what this platform is for dealing with etc.i386/ttys etc.
# it ignores subdirectories in /usr/src/etc that start with 'etc.' other
# than etc.`uname -m` (by default).
#
# - Previous versions were not worth mentioning (including my first attempt
# sent in as a pr).
#
# AUTHOR: Matthew Thyer 1997, 1998
#
###############################################################################
# The default directory for the source distribution
DEF_SRC_ROOT=/usr/src
# The typical exclusion list
DEF_EXCL="group|hosts|motd|shells|rc.local|master.passwd"
#
# You shouldn't change this unless you want to make your /etc for another
# platform (e.g. put PLATFORM=alpha)
PLATFORM=`uname -m`
#
opt_all=0
opt_ver=0
opt_diffs=0
opt_non_exact=0
opt_typical=0
opt_inc=0
opt_exc=0
error=0
cmd_name=`basename $0`
usage ()
{
echo "Usage: $cmd_name [-a] [-v] [-d] [-n] [-t] [-r <dir>] [-i <patt> | -e <patt>]"
echo " -a Also output information for files where the checksums match"
echo " -v Display RCS version strings if present"
echo " -d Display diffs between the files"
echo " -n Non-exact mode - i.e. dont use '-x' with egrep"
echo " -t Typical usage. This is the same as etcud -e \"$DEF_EXCL\""
echo " -r <dir> Directory where the source distribution is found"
echo " -i <patt> Inclusion filename pattern (those files to check)"
echo " -e <patt> Exclusion filename pattern (those file to ignore)"
}
show_ver ()
{
the_ver=`grep '$Id:' $src_files/$x`
if [ $? -eq 0 ] ; then
echo "$src_files/$x VER> $the_ver"
fi
the_ver=`grep '$Id:' $the_file`
if [ $? -eq 0 ] ; then
echo " $the_file VER> $the_ver"
fi
}
do_check ()
{
# First determine if we should check this file (and what its home is)
case $x in
etc\.${PLATFORM}/MAKEDEV)
the_file=/dev/MAKEDEV
;;
etc\.${PLATFORM}/*)
the_file=/etc/`echo $x | awk -F/ '{print $NF}'`
;;
etc\.*/*)
the_file=SKIP
;;
*Makefile)
the_file=SKIP
;;
MAKEDEV\.local)
the_file=/dev/MAKEDEV.local
;;
*)
the_file=/etc/$x
;;
esac
if [ $the_file != SKIP ] ; then
if [ -r $the_file ] ; then
if [ `md5 $the_file | cut -d' ' -f4` != `md5 $src_files/$x | cut -d' ' -f4` ] ; then
echo MISMATCH for $src_files/$x $the_file
if [ $opt_ver -eq 1 ] ; then
show_ver
fi
if [ $opt_diffs -eq 1 ] ; then
diff $the_file $src_files/$x
echo
fi
elif [ $opt_all -eq 1 ] ; then
echo CHECK OK for $src_files/$x $the_file
if [ $opt_ver -eq 1 ] ; then
show_ver
fi
fi
else # the file is not readable.... why ? perhaps it doesn't exist
if [ ! -f $the_file ] ; then
echo NONEXISTANT $the_file. Maybe you should cp -p $src_files/$x $the_file
else
echo -n $the_file is not readable....
fi
fi
fi
}
# The main program begins.....
# First get the options
while [ $# -ne 0 ] ; do
case $1 in
-a) opt_all=1
;;
-v) opt_ver=1
;;
-d) opt_diffs=1
;;
-n) opt_non_exact=1
;;
-t) opt_typical=1
if [ $opt_inc -eq 1 -o $opt_exc -eq 1 ] ; then
echo "Warning: Typical usage overriding prior inclusion or exclusion pattern"
opt_inc=0
fi
opt_exc=1
patt=$DEF_EXCL
;;
-r) shift
if [ $# -eq 0 ] ; then
error=1
echo "Error: -r requires an argument"
usage
break
else
if [ -d $1 ] ; then
SRC_ROOT=$1
else
error=1
echo "Error: Source directory \"$1\" does not exist"
usage
break
fi
fi
;;
-i) shift
if [ $# -eq 0 ] ; then
error=1
echo "Error: -i requires an argument"
usage
break
else
if [ $opt_inc -eq 1 -o $opt_exc -eq 1 ] ; then
echo "Warning: subsequent inclusion pattern ignored"
else
patt=$1
opt_inc=1
fi
fi
;;
-e) shift
if [ $# -eq 0 ] ; then
error=1
echo "Error: -e requires an argument"
usage
break
else
if [ $opt_inc -eq 1 -o $opt_exc -eq 1 ] ; then
echo "Warning: subsequent exclusion pattern ignored"
else
patt=$1
opt_exc=1
fi
fi
;;
*) error=1
usage
break
;;
esac
shift
done
if [ $error -eq 1 ] ; then
exit
fi
src_files=`echo ${SRC_ROOT:=$DEF_SRC_ROOT}/etc | sed 's/\/\/$//'`
cd $src_files
# Can only do non_exact mode if we are not doing a typical
egrep_flags="-x"
if [ $opt_non_exact -eq 1 -a $opt_typical -eq 0 ] ; then
egrep_flags=""
fi
if [ $opt_exc -eq 1 ] ; then
egrep_flags=$egrep_flags" -v "
fi
if [ $opt_inc -eq 1 -o $opt_exc -eq 1 ] ; then
find . -type f -exec echo {} \; | sed 's/^\.\///' | egrep $egrep_flags $patt | while read x ; do
do_check
done
else
find . -type f -exec echo {} \; | sed 's/^\.\///' | while read x ; do
do_check
done
fi
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?356C0A01.CB451BD7>
