]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/csh -f | |
2 | # This script performs updates of hesiod files on hesiod servers. | |
3 | # $Header$ | |
4 | ||
5 | set path=(/etc /bin /usr/bin /usr/etc /usr/athena/etc) | |
6 | ||
7 | # The following exit codes are defined and MUST BE CONSISTENT with the | |
8 | # MR error codes the library uses: | |
9 | set MR_HESFILE = 47836472 | |
10 | set MR_MISSINGFILE = 47836473 | |
11 | set MR_NAMED = 47836475 | |
12 | set MR_TARERR = 47836476 | |
13 | ||
14 | umask 22 | |
15 | ||
16 | # File that will contain the necessary information to be updated | |
17 | set TARFILE=/tmp/hesiod.out | |
18 | # Directory into which we will empty the tarfile | |
19 | set SRC_DIR=/etc/athena/_nameserver | |
20 | # Directory into which we will put the final product | |
21 | set DEST_DIR=/etc/athena/nameserver | |
22 | ||
23 | # Create the destination directory if it doesn't exist | |
24 | if (! -d $DEST_DIR) then | |
25 | rm -f $DEST_DIR | |
26 | mkdir $DEST_DIR | |
27 | chmod 755 $DEST_DIR | |
28 | endif | |
29 | ||
30 | # If $SRC_DIR does not already exist, make sure that it gets created | |
31 | # on the same parition as $DEST_DIR. | |
32 | if (! -d $SRC_DIR) then | |
33 | chdir $DEST_DIR | |
34 | mkdir ../_nameserver | |
35 | chdir ../_nameserver | |
36 | if ($SRC_DIR != `pwd`) then | |
37 | ln -s `pwd` $SRC_DIR | |
38 | endif | |
39 | endif | |
40 | ||
41 | # Alert if tarfile doesn't exist | |
42 | if (! -r $TARFILE) exit $MR_MISSINGFILE | |
43 | ||
44 | # Empty the tar file one file at a time and move each file to the | |
45 | # appropriate place only if it is not zero length. | |
46 | cd $SRC_DIR | |
47 | foreach file (`tar tf $TARFILE | awk '{print $1}' | sed 's;/$;;'`) | |
48 | if (. == $file) continue | |
49 | ||
50 | rm -rf $file | |
51 | echo extracting $file | |
52 | tar xf $TARFILE $file | |
53 | # Don't put up with errors extracting the information | |
54 | if ($status) exit $MR_TARERR | |
55 | # Make sure the file is not zero-length | |
56 | if (! -z $file) then | |
57 | mv -f $file $DEST_DIR | |
58 | if ($status != 0) exit $MR_HESFILE | |
59 | else | |
60 | rm -f $file | |
61 | exit $MR_MISSINGFILE | |
62 | endif | |
63 | end | |
64 | ||
65 | # Kill off the current named and remove the named.pid file. It is | |
66 | # important that this file be removed since the script uses its | |
67 | # existance as evidence that named as has been successfully restarted. | |
68 | ||
69 | # First, get statistics | |
70 | ln -s /site/named.stats /usr/tmp/named.stats | |
71 | kill -IOT `cat /etc/named.pid` | |
72 | sleep 1 | |
73 | # Use /bin/kill because, due to a bug in some versions of csh, failure | |
74 | # of a builtin will cause the script to abort | |
75 | kill -KILL `cat /etc/named.pid` | |
76 | rm -f /etc/named.pid | |
77 | ||
78 | # Restart named. | |
79 | (unlimit; /etc/named&) | |
80 | sleep 5 | |
81 | mv /etc/named.pid /etc/named.pid.restart | |
82 | ||
83 | # This timeout is implemented by having the shell check TIMEOUT times | |
84 | # for the existance of /etc/named.pid and to sleep INTERVAL seconds | |
85 | # between each check. | |
86 | ||
87 | set TIMEOUT=60 # number of INTERVALS until timeout | |
88 | set INTERVAL=60 # number of seconds between checks | |
89 | set i = 0 | |
90 | while ($i < $TIMEOUT) | |
91 | sleep $INTERVAL | |
92 | if (-f /etc/named.pid) break | |
93 | @ i++ | |
94 | end | |
95 | ||
96 | # Did it time out? | |
97 | if ($i == $TIMEOUT) exit $MR_NAMED | |
98 | ||
99 | # Clean up! | |
100 | rm -f $TARFILE | |
101 | rm -f $0 | |
102 | ||
103 | exit 0 |