Date: Thu, 20 Jun 2002 04:02:41 +0900 From: Hiroharu Tamaru <tamaru@myn.rcast.u-tokyo.ac.jp> To: freebsd-arch@FreeBSD.ORG Subject: Re: Configuration management Message-ID: <sa6sn3j5bxq.wl@amulet.ht.myn.rcast.u-tokyo.ac.jp> In-Reply-To: <20020619031533.2c302e68.makonnen@pacbell.net> References: <20020619031533.2c302e68.makonnen@pacbell.net>
next in thread | previous in thread | raw e-mail | index | archive | help
--Multipart_Thu_Jun_20_04:02:41_2002-1
Content-Type: text/plain; charset=US-ASCII
Hi,
At Wed, 19 Jun 2002 03:15:33 -0700,
Mike Makonnen wrote:
> I am of a different opinion. I happen to like plain-text configuration files.
> The problem is not that we need an easier way to _edit_ the files,
> but rather we need a better way to manage all those files and the changes
> we make to them. For example, I have a haphazard collection of rcs files
I totally agree. In fact I have been using cvs for this
task since FreeBSD 2.2.x days. I track -stable every
several months. As the buildworld Makefiles evolve, things
has become easier, and never harder. I am not using
mergemaster at all in the process (no offense here too; I
just adopted a way without it before it appeared).
I have always found the "cvs diff" abilty invaluable.
For what it's worth, I will attach my helper scripts (mainly
for bootstraping the repository on a newly installed
machine) to give you an idea. It's not fully automated nor
complete nor clean, but has served me quite well for a long
time. These is no script for automating updates; I type
them manually following my memo:
# cvsup the source, then
cd /usr/src
make -j4 buildworld < /dev/null >& build.2001.02.02 &
make -j4 buildkernel < /dev/null >& kernel.2001.02.02 &
cd /w/4src
rm -rf config
mkdir config
cd /usr/src/etc
make distrib-dirs distribution DESTDIR=/w/4src/config
cd /w/4src/config
/w/4src/tools/clean-etc-distrib-check | less
/w/4src/tools/clean-etc-distrib
cvs -d /var/cvs import -m "import after cvsup" config FreeBSD_core RELENG_4_20010202
suspend
cd ~
mkdir cvstmp
chmod go-rwx cvstmp
cd cvstmp
cvs -d /var/cvs co -jFreeBSD_core:yesterday -jFreeBSD_core config
....
cd ~/cvstmp/config/
cvs diff -u
cvs commit -m "merged after cvsup"
fg
cd /usr/src
make installworld < /dev/null >& install.2001.02.02 &
make installkernel < /dev/null >>& install.2001.02.02 &
cd /
cvs update
cd /dev
./MAKEDEV all
shutdown -r +1
Oh, by the way, on my machines, the following links exist:
/usr/src -> /w/4src/src
/usr/obj -> /w/4src/i386 or /w/4src/alpha
and I have
/w/4src/config as the teporary install space for /etc stuff
and
/w/4src/tools for the scripts I have.
/w is nfs mounted all around the place and the clients
simple use what the build machine has built here.
The repository is at /var/cvs with the module name "config"
The clean-etc-distrib stuff was mainly for the very old days
when "make distribution" installed binary programs in
/w/4src/config/ . I was too lazy to update my scripts.
--
Hiroharu Tamaru
--Multipart_Thu_Jun_20_04:02:41_2002-1
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: attachment; filename="bootstrap-etc-cvs"
Content-Transfer-Encoding: 7bit
#!/bin/sh
ERR=0
if [ ! -d /w/4src/config/etc -o -e /w/4src/config/dev/null ]; then
cat <<EOF
Before using this script kit, you need some tweeking:
1) install all "src" distributions from sysinstall
2) mkdir /w/4src/config
3) change dir to /usr/src/etc and execute
make distrib-dirs distribution DESTDIR=/w/4src/config
4) change dir to /w/4src/config and execute
../tools/clean-etc-distrib-check | less
then
../tools/clean-etc-distrib
EOF
exit
fi
if [ ! -d /var/cvs ]; then
if [ -e /var/cvs ]; then
echo "/var/cvs is not a directory"
ERR=1
else
echo "creating /var/cvs/"
mkdir /var/cvs || ERR=1
fi
fi
echo "chown root:wheel /var/cvs/."
chown root:wheel /var/cvs/. || ERR=1
echo "chmod -R 770 /var/cvs/."
chmod -R 770 /var/cvs/. || ERR=1
echo "cvs -d /var/cvs init"
echo "=================================================================="
cvs -d /var/cvs init || ERR=1
echo "=================================================================="
if [ $ERR = 1 ]; then
exit
fi
echo "changing dir to /w/4src/config"
cd /w/4src/config
echo "=================================================================="
cvs -d /var/cvs import -m "installed" config FreeBSD_core INSTALLED
echo "=================================================================="
DIR="/tmp/etccvs.$$"
echo "mkdir $DIR"
mkdir $DIR || exit
echo "changing dir to $DIR"
cd $DIR || exit
echo "=================================================================="
cvs -d /var/cvs checkout config
echo "=================================================================="
cd config || exit
echo "creating list of CVS controlled files at $DIR/files.list"
find . \( -type d -name CVS -prune \) -o \( -type f -print \) \
| grep -v "root/distribution.files" \
| grep -v "root/mtree.modes" > ../files.list
filelist=`cat ../files.list`
echo "copying all CVS controlled files for / to $DIR/config/"
echo "diffs are available at $DIR/files.diff"
for i in ${filelist}; do
diff -u $i /$i >> ../files.diff
cp /$i $i
done
echo "change dir to $DIR/config/etc"
cd etc
echo "rm passwd master.passwd pwd.db spwd.db"
rm passwd master.passwd pwd.db spwd.db
echo "cvs remove passwd master.passwd pwd.db spwd.db"
cvs remove passwd master.passwd pwd.db spwd.db
echo ""
echo "Invoking /bin/csh"
echo "You can check up using cvs commands now."
echo "Exit this shell to continue."
echo "Commit will follow exit and then $DIR will be removed."
csh
cd $DIR/config
echo "=================================================================="
cvs commit -m "newly installed"
echo "=================================================================="
rm -rf $DIR || exit
mkdir $DIR || exit
cd $DIR || exit
echo "=================================================================="
cvs -d /var/cvs checkout config
echo "=================================================================="
cd config || exit
cp -RPpv . /
rm -rf $DIR || exit
echo "everything is copyed to /"
echo "try cvs update at / and also run 'recover.modes'"
--Multipart_Thu_Jun_20_04:02:41_2002-1
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: attachment; filename="clean-etc-distrib-check"
Content-Transfer-Encoding: 7bit
#!/bin/sh -
rm -f ./root/distribution.files
find . -ls \
| awk '{if ($7~/,/){print $3,$4,$5,$6,$7$8,$12}else if($12~/-/){print $3,$4,$5,$6,$7,$11,$12,$13}else{print $3,$4,$5,$6,$7,$11}}' \
| sort +5 > ./root/distribution.files
echo "===== differences in distribution files"
diff -u0 /root/distribution.files ./root/distribution.files
echo "===== everything but files and dirs"
find . \! \( -type d -o -type f \) | xargs ls -dl
echo "===== empty files"
find . -type f -size 0 | xargs ls -dl
echo "===== executable binaries"
find . -type f -perm -100 | xargs file | grep 'executable$' | grep -v ' text '
--Multipart_Thu_Jun_20_04:02:41_2002-1
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: attachment; filename="clean-etc-distrib"
Content-Transfer-Encoding: 7bit
#!/bin/sh -
echo "===== generate ./root/distribution.files"
rm -f ./root/distribution.files
find . -ls \
| awk '{if ($7~/,/){print $3,$4,$5,$6,$7$8,$12}else if($12~/-/){print $3,$4,$5,$6,$7,$11,$12,$13}else{print $3,$4,$5,$6,$7,$11}}' \
| sort +5 > ./root/distribution.files
echo "===== remove everything but files and dirs"
find . \! \( -type d -o -type f \) | xargs rm -f
echo "===== remove empty files"
find . -type f -size 0 | xargs rm -f
echo "===== remove executable binaries"
find . -type f -perm -100 | xargs file | grep 'executable$' | grep -v ' text '\
| sed 's/:[^:]*$//' | xargs rm -f
echo "===== remove empty directories .. don't bother about the errors!"
find . -type d | sort -r | xargs rmdir
echo "===== generate ./root/mtree.modes"
mtree -c -kuid,gid,mode > ./root/mtree.modes
echo "===== done"
--Multipart_Thu_Jun_20_04:02:41_2002-1
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: attachment; filename="recover.modes"
Content-Transfer-Encoding: 7bit
#!/bin/sh -
# execute this from root directory, or where ever you want it to root at.
cd /
mtree -U -e -f ./root/mtree.modes
#
--Multipart_Thu_Jun_20_04:02:41_2002-1--
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?sa6sn3j5bxq.wl>
