X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/51bf07bbd57944b0983e4758552a40e8315ba328..refs/heads/LOCKING:/gen/hesiod.sh diff --git a/gen/hesiod.sh b/gen/hesiod.sh index f3142deb..1e9cdeeb 100644 --- a/gen/hesiod.sh +++ b/gen/hesiod.sh @@ -1,37 +1,108 @@ -#! /bin/sh -TARFILE=/tmp/hesiod -SRC_DIR=/etc/athena/_nameserver -DEST_DIR=/etc/athena/nameserver -if [ ! -d $SRC_DIR ]; then - /bin/rm -f $SRC_DIR - /bin/mkdir $SRC_DIR - /bin/chmod 755 $SRC_DIR -fi -#if [ ! -d $DEST_DIR ]; then -# /bin/rm -f $DEST_DIR -# /bin/mkdir $DEST_DIR -# /bin/chmod 755 $DEST_DIR -#fi +#!/bin/csh -f +# This script performs updates of hesiod files on hesiod servers. +# $Header$ + +set path=(/etc /bin /usr/bin /usr/etc /usr/athena/etc) + +# The following exit codes are defined and MUST BE CONSISTENT with the +# MR error codes the library uses: +set MR_HESFILE = 47836472 +set MR_MISSINGFILE = 47836473 +set MR_NAMED = 47836475 +set MR_TARERR = 47836476 + +umask 22 + +# File that will contain the necessary information to be updated +set TARFILE=/var/tmp/hesiod.out +# Directory into which we will empty the tarfile +set SRC_DIR=/etc/athena/_nameserver +# Directory into which we will put the final product +set DEST_DIR=/etc/athena/nameserver + +# Create the destination directory if it doesn't exist +if (! -d $DEST_DIR) then + rm -f $DEST_DIR + mkdir $DEST_DIR + chmod 755 $DEST_DIR +endif + +# If $SRC_DIR does not already exist, make sure that it gets created +# on the same parition as $DEST_DIR. +if (! -d $SRC_DIR) then + chdir $DEST_DIR + mkdir ../_nameserver + chdir ../_nameserver + if ($SRC_DIR != `pwd`) then + ln -s `pwd` $SRC_DIR + endif +endif + +# Alert if tarfile doesn't exist +if (! -r $TARFILE) exit $MR_MISSINGFILE + +# Empty the tar file one file at a time and move each file to the +# appropriate place only if it is not zero length. cd $SRC_DIR -for file in `/bin/tar tf $TARFILE`; do - if [ ./ = $file ]; then continue; fi - /bin/tar xf $TARFILE $file - if [ -s $file ]; then - /bin/mv -f $file $DEST_DIR - else - /bin/rm -f $file - fi -done -# The following three lines were changed by WES on 9/10/87. -# They may not be in the sources. -/bin/rm -f $TARFILE -kill -KILL `/bin/cat /etc/named.pid` - -csh -fc "unlimit; /etc/named" - - -exit -# -# $Source$ -# $Header$ -# +foreach file (`tar tf $TARFILE | awk '{print $1}' | sed 's;/$;;'`) + if (. == $file) continue + + rm -rf $file + echo extracting $file + tar xf $TARFILE $file + # Don't put up with errors extracting the information + if ($status) exit $MR_TARERR + # Make sure the file is not zero-length + if (! -z $file) then + mv -f $file $DEST_DIR + if ($status != 0) exit $MR_HESFILE + else + rm -f $file + exit $MR_MISSINGFILE + endif +end + +# Kill off the current named and remove the named.pid file. It is +# important that this file be removed since the script uses its +# existance as evidence that named as has been successfully restarted. + +# First, get statistics +rm -f /usr/tmp/named.stats +ln -s /var/named.stats /usr/tmp/named.stats +kill -6 `cat /etc/named.pid` +sleep 1 +# Use /bin/kill because, due to a bug in some versions of csh, failure +# of a builtin will cause the script to abort +kill -KILL `cat /etc/named.pid` +rm -f /etc/named.pid + +# Restart named. +# mv /etc/named.pid /etc/named.pid.restart +#(unlimit; /etc/named&) +/etc/named +#sleep 5 +echo named started + +# This timeout is implemented by having the shell check TIMEOUT times +# for the existance of /etc/named.pid and to sleep INTERVAL seconds +# between each check. + +set TIMEOUT=60 # number of INTERVALS until timeout +set INTERVAL=60 # number of seconds between checks +set i = 0 +while ($i < $TIMEOUT) + sleep $INTERVAL + if (-f /etc/named.pid) break + @ i++ +end +echo out of timeout loop +# Did it time out? +if ($i == $TIMEOUT) exit $MR_NAMED +echo no timeout +# Clean up! +rm -f $TARFILE +echo removed tarfile +rm -f $0 +echo removed self + +exit 0