]> andersk Git - moira.git/blobdiff - gen/hesiod.sh
close file descriptors before exec'ing the dcm
[moira.git] / gen / hesiod.sh
index f3142deb13c357ffba35b96ec8f3659736036b9a..b6c4ad9787552dd5f6286c43a6f1da6bc6413a01 100644 (file)
-#! /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 -x
+# This script performs updates of hesiod files on hesiod servers.  
+#      $Source$
+echo   '$Header$'
+
+# The following exit codes are defined and MUST BE CONSISTENT with the
+# SMS error codes the library uses:
+set SMS_HESFILE =      47836472
+set SMS_MISSINGFILE =  47836473
+set SMS_NAMED =        47836475
+set SMS_TARERR =       47836476
+
+umask 22
+
+# File that will contain the necessary information to be updated
+set TARFILE=/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
+# Files to verify nameserver loaded
+set CHECKFILES="passwd.db pobox.db cluster.db grplist.db group.db"
+
+# Create the destination directory if it doesn't exist
+if (! -d $DEST_DIR) then
+   /bin/rm -f $DEST_DIR
+   /bin/mkdir $DEST_DIR
+   /bin/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`) ln -s `pwd` $SRC_DIR
+endif
+
+# Alert if tarfile doesn't exist
+if (! -r $TARFILE) exit $SMS_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`
+foreach  file (`/bin/tar tf $TARFILE | awk '{print $1}' | sed 's;/$;;'`)
+   if (. == $file) continue
 
-csh -fc "unlimit; /etc/named"
+   rm -rf $file
+   echo extracting $file
+   /bin/tar xf $TARFILE $file
+   # Don't put up with errors extracting the information
+   if ($status) exit $SMS_TARERR
+   # Make sure the file is not zero-length
+   if (! -z $file) then
+      /bin/mv -f $file $DEST_DIR
+      if ($status != 0) exit $SMS_HESFILE
+   else
+      /bin/rm -f $file
+      exit $SMS_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.
 
-exit
-#
-#      $Source$
-#      $Header$
-#
+# Use /bin/kill because, due to a bug in some versions of csh, failure
+# of a builtin will cause the script to abort
+/bin/kill -KILL `/bin/cat /etc/named.pid`
+rm -f /etc/named.pid
+
+# Restart named.
+(unlimit; /etc/named)
+
+# 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
+
+# Did it time out?
+if ($i == $TIMEOUT) exit $SMS_NAMED
+
+# Verify that the nameserver is answering queries for the new data
+cd $DEST_DIR
+foreach f ( $CHECKFILES )
+        set temp=`tac $f | egrep -v '^;' | head -1`
+        set hes=`/bin/echo $temp | awk '{print $1}'`
+        set ent=`echo $hes | rev | sed 's/\(.*\)\.\(.*\)/\2/' | rev`
+        set type=`echo $hes | rev | sed 's/\(.*\)\.\(.*\)/\1/' | rev`
+        hesinfo $ent $type > /dev/null
+       if ($status == 1) then
+                exit $SMS_HESFILE
+        endif
+end
+
+# Clean up!
+/bin/rm -f $TARFILE
+/bin/rm -f $0
+
+exit 0
This page took 0.039483 seconds and 4 git commands to generate.