From Demosthenes.Skipitaris@saga.com  Wed Feb 17 13:50:32 1999
Return-Path: <Demosthenes.Skipitaris@saga.com>
Received: from kjo02msg.saga.no (karon.saga.no [193.212.109.18])
	by nexus.iu.hioslo.no (8.9.3/8.9.3) with ESMTP id NAA24275
	for <mark@iu.hioslo.no>; Wed, 17 Feb 1999 13:50:31 +0100 (MET)
Received: by kjo02msg.saga.no with Internet Mail Service (5.5.2232.9)
	id <FDJS5FLQ>; Wed, 17 Feb 1999 13:49:57 +0100
Message-ID: <D7BF7F90A60DD2118F360060974838F80149BB09@kjo02msg.saga.no>
From: "Skipitaris, Demosthenes" <Demosthenes.Skipitaris@saga.com>
To: "'mark@iu.hioslo.no'" <mark@iu.hioslo.no>
Subject: vicf
Date: Wed, 17 Feb 1999 13:49:57 +0100
MIME-Version: 1.0
X-Mailer: Internet Mail Service (5.5.2232.9)
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by nexus.iu.hioslo.no id NAA24275
Status: RO
X-Status: D
X-Keywords:

Hei,

her er frste versjon av 'vicf', et script som kan brukes til  editere
cfengine config-filer.

Hensikten med scriptet er:

1)  hindre at flere editerer samme fil samtidig.
2) sjekke at editerte filer ikke inneholder feil, slik at ikke filer med
feil blir distribuert ut.

Scriptet kan bare brukes til  editere filer som ligger i $CFINPUTS.  Det
kan startes fra hvor som helst, og uten
argumenter lister det opp hvilke filer som ligger i $CFINPUTS.  Opsjonen -f
overskriver lock p filene.
Hos oss har vi satt opp slik at config-filer distribueres fra maskinen
sentral.saga.no, og scriptet sjekker
derfor om det kjres p riktig maskin.

Det er skrevet i shell fordi det ikke er sikkert at perl finnes/virker
overalt.  (Jeg har ogs skrevet om cfmail og cfwrap
til  bruke bourne-shell, fordi perl distribusjonen vi har her er "litt
ustandard".)

-ds

-------

#!/bin/sh

EDITOR="${EDITOR-vi}"
CFINPUTS="${CFINPUTS-/n/etc/cfg}"
export EDITOR CFINPUTS
NOPARSE="cf.preconf|cfd.conf"

if [ "`hostname`" != "sentral" ]
then
	echo $0 can only be run on host sentral.
	exit 1
fi

EdFile () {
    if [ ! -f ${CFINPUTS}/${file} ]
    then
	echo "File not found: ${file}"
	echo "Only these files are eligible for editing:"
	/bin/ls $CFINPUTS
	/usr/ucb/echo -n "Create new file? (Y/n) "
	read answer
	if [ "$answer" = "n" ]
	then
		echo Okay, exiting...
		exit 0
	fi
    fi

    if [ -f ${CFINPUTS}/.${file}.lock -a "$force" = "n" ]
    then
	i=30
	/usr/ucb/echo -n "File ${file} is busy -- waiting up to $i
seconds..."
	while [ -f ${CFINPUTS}/.${file}.lock ]
	do
		/usr/ucb/echo -n .
		i=`expr $i - 1`
		if [ $i = 0 ]
		then
			echo "\nSorry, file is busy -- try again later."
			exit 0
		fi
		sleep 1
	done
    fi

    if [ -f ${CFINPUTS}/${file} ]
    then
	cp -p ${CFINPUTS}/${file} ${CFINPUTS}/.${file}.lock 
    fi

    editfile=n

    while [ "$editfile" = "n" ]
    do
	${EDITOR} ${CFINPUTS}/.${file}.lock
	cp /dev/null /tmp/cfparse.$$
	/n/sbin/cfengine --no-warn --parse-only --file
${CFINPUTS}/.${file}.lock > /tmp/cfparse.$$ 2>&1
	if [ -s /tmp/cfparse.$$ ]
	then
		echo PARSE ERROR IN NEW INPUT-FILE:
		cat /tmp/cfparse.$$
		/usr/ucb/echo -n "Re-edit file? (Y/n) "
		read answer
		if [ "$answer" = "n" ]
		then
			echo Okay, exiting...
			editfile="y"
		fi
	else
		mv ${CFINPUTS}/.${file}.lock  ${CFINPUTS}/${file}
		editfile="y"
	fi
    done

    rm -f /tmp/cfparse.$$ ${CFINPUTS}/.${file}.lock
}

force=n

if [ $# -eq 0 ]
then
	echo Usage: $0 [ -f ] filename
	echo "These files are eligible for editing:"
	/bin/ls $CFINPUTS
	exit 0
fi

if [ "$1" = "-f" ]
then
	force=y
	echo $*	
	shift
	echo $*	
fi

cd $CFINPUTS

while [ $# -ne 0 ]
do
	file=`basename $1`
	EdFile
	shift
done

exit 0

