Date: Sun, 30 Aug 1998 00:19:34 +0930 From: Matthew Thyer <thyerm@camtech.net.au> To: "Jordan K. Hubbard" <jkh@time.cdrom.com> Cc: Mike Smith <mike@smith.net.au>, committers@FreeBSD.ORG Subject: Re: make.conf Message-ID: <35E814FE.AA26BD0E@camtech.net.au> References: <23567.904356631@time.cdrom.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Maybe someone can make use of my 'etcud' script for updating the
/etc directory.
It's got a pretty comprehensive set of options and automatically
updates certain types of files. (these would probably have to be
changed).
Jordan K. Hubbard wrote:
>
> > Agreed. It's not *impossibly* hard to merge at least some of this
> > stuff; both rc.conf and make.conf are reasonably straightforward.
> > Don't we have any aspiring Perl5 or Tcl weenies out there that would
> > like to make their mark? 8)
>
> I'll further commit to using any auto-merger tools that people may
> come up with from sysinstall if they make that a comparatively easy
> thing to do. It's long been on the TODO list, just not done.
>
> For rc.conf and make.conf, which contains only variable declarations,
> this is actually pretty easy since you really just have to:
>
> 1. Read in the new file, preserving comments and storing all the
> name/value pairs in some sort of table (sysinstall actually does
> this now).
>
> 2. Read just the name/value pairs from the old file and override
> any existing values in the table with the previous data.
>
> 3. Write back out a composite file with comments and updated variable
> values.
>
> Erm, right? I don't see any reason why that wouldn't work unless the
> default value of something has changed and you end up propagating an
> old default value back into your new file. I guess that's the one
> downside to this approach.
>
> - Jordan
>
> >
> > --
> > \\ Sometimes you're ahead, \\ Mike Smith
> > \\ sometimes you're behind. \\ mike@smith.net.au
> > \\ The race is long, and in the \\ msmith@freebsd.org
> > \\ end it's only with yourself. \\ msmith@cdrom.com
> >
> >
--
/=====================================================================\
|Work: Matthew.Thyer@dsto.defence.gov.au | Home: thyerm@camtech.net.au|
\=====================================================================/
"If it is true that our Universe has a zero net value for all conserved
quantities, then it may simply be a fluctuation of the vacuum of some
larger space in which our Universe is imbedded. In answer to the
question of why it happened, I offer the modest proposal that our
Universe is simply one of those things which happen from time to time."
E. P. Tryon from "Nature" Vol.246 Dec.14, 1973
[-- Attachment #2 --]
#!/bin/sh
#
# etcud 2.2 - Compare /etc with /usr/src/etc to check for updated files (for
# this machines hardware platform).
#
# etcud [-a] [-v] [-d] [-n] [-t] [-u] [-f] [-s] [-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
# -u Automatically update sendmail.cf.additions, files in the periodic
# directories and files ending with *.dist and *.sample.
# -f Pretend you're not running DEVFS (if you are). i.e. dont ignore
# files destined to live under the first mounted DEVFS.
# -s Dont ignore mismatches on files of the same version (as determined by ident string).
# -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.
#
# - v 2.2 - Now ignores files destined for the first mounted DEVFS found
# (if using DEVFS - can be turned off with -f)
#
# - Version 2.1 - added -u
#
# - Version 2.0 - a minor cosmetic fix.
#
# - Version 1.9 knows what this platform is when dealing with platform
# specific directories (e.g. /usr/src/etc/etc.i386). 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_update=0
opt_nodevfs=0
opt_samever=0
opt_inc=0
opt_exc=0
error=0
cmd_name=`basename $0`
usage ()
{
echo "Usage: $cmd_name [-a] [-v] [-d] [-n] [-t] [-u] [-f] [-s] [-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 " -u Automatically update sendmail.cf.additions, files in the periodic directories and files ending with *.dist and *.sample"
echo " -f Dont ignore files destined to live under the first mounted DEVFS found on the system"
echo " -s Dont ignore mismatches on files of the same version (as determined by ident string)"
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)
auto_update=0
case $x in
etc\.${PLATFORM}/MAKEDEV)
if [ $devfs_mtpt = /dev ] ; then
the_file=SKIP
else
the_file=/dev/MAKEDEV
fi
;;
etc\.${PLATFORM}/*)
the_file=/etc/`echo $x | awk -F/ '{print $NF}'`
;;
etc\.*/*)
the_file=SKIP
;;
*Makefile)
the_file=SKIP
;;
MAKEDEV\.local)
if [ $devfs_mtpt = /dev ] ; then
the_file=SKIP
else
the_file=/dev/MAKEDEV.local
fi
;;
mail/sendmail\.cf\.additions)
auto_update=1
the_file=/etc/$x
;;
*\.dist)
auto_update=1
the_file=/etc/$x
;;
*\.sample)
auto_update=1
the_file=/etc/$x
;;
*)
if [ `echo $x | cut -d/ -f 1` = periodic ] ; then
auto_update=1
fi
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
if [ $opt_update -eq 1 -a $auto_update -eq 1 ] ; then
cp -p $src_files/$x $the_file
else
ver1=`grep '$Id:' $src_files/$x`X
ver2=`grep '$Id:' $the_file`X
if [ $opt_samever -eq 0 -a \( "$ver1" = "$ver2" \) -a "$ver1" != X ] ; then
else
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
fi
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
;;
-u) opt_update=1
;;
-f) opt_nodevfs=1
;;
-s) opt_samever=1
;;
-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
# Now check if running DEVFS (and whether to ignore it [-f]).
devfs_mtpt=`mount | grep "^devfs on /" | head -1 | awk '{print $3}'`
devfs_mtpt=${devfs_mtpt:-NO}
if [ $opt_nodevfs -eq 1 ] ; then
devfs_mtpt=NO
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?35E814FE.AA26BD0E>
