linux-init-script-uses-bash-20090119
[openafs.git] / src / afsd / afs.rc.linux
index 4c20144..579034c 100644 (file)
@@ -1,28 +1,96 @@
-#! /bin/sh
-#
+#! /bin/bash
+# Copyright 2000, International Business Machines Corporation and others.
+# All Rights Reserved.
+# 
+# This software has been released under the terms of the IBM Public
+# License.  For details, see the LICENSE file in the top-level source
+# directory or online at http://www.openafs.org/dl/license10.html
+
 # AFS  Start and stop AFS components
 # 
 # 
-# chkconfig: 345 60 20
+# chkconfig: 35 60 20
 # description:  AFS is a distributed file system which provides location
 #              transparency, caching and secure authentication.
 #              Additional configuration can be done in the /etc/sysconfig/afs
 #              file. Read the documentation in that file for more information.
 #
+# The following section is used at least by SuSE insserv(8)
+### BEGIN INIT INFO
+# Provides: afs
+# Required-Start: $network
+# Required-Stop: $network
+# Default-Start: 3 5
+# Default-Stop: 0 1 2 6
+# Description:  AFS is a distributed file system which provides location
+#              transparency, caching and secure authentication.
+#              Additional configuration can be done in the /etc/sysconfig/afs
+#              file. Read the documentation in that file for more information.
+### END INIT INFO
+#
 # Note that AFS does not use a pid file in /var/run. It is turned off by
 # unmounting /afs.
 
 
+# check for special bootup functions
+if [ -f /etc/rc.d/init.d/functions ] ; then
+       . /etc/rc.d/init.d/functions
+       afs_rh=1
+else
+       # special (RedHat) functions not available...
+       # so I provide neccessary replacements (e.g. for SuSE)
+
+       function echo_failure () { echo -n " - failed." ; }
+
+       function echo_success () { echo -n " - successful." ; }
+
+       # these are hopefully all functions I use...
+fi
+
+runcmd() {
+   echo -n "$1 "
+   shift
+   if [ "$BOOTUP" = "color" ]; then
+      $* && echo_success || echo_failure
+   else
+      $*
+   fi
+   echo
+}
+
+SYSCNF=${SYSCNF:-/etc/sysconfig/afs}
+KERNEL_VERSION=`uname -r`
+
 # Gather up options and post startup script name, if present
-if [ -f /etc/sysconfig/afs ]; then
-       . /etc/sysconfig/afs
+if [ -f $SYSCNF ] ; then
+       . $SYSCNF
 fi
 
+CACHEINFO=${CACHEINFO:-/usr/vice/etc/cacheinfo}
+CACHE=${CACHEDIR:-/usr/vice/cache}
+AFS=${AFSDIR:-/afs}
+AFSD=${AFSD:-/usr/vice/etc/afsd}
+BOSSERVER=${BOSSERVER:-/usr/afs/bin/bosserver}
+BOS=${BOS:-/usr/bin/bos}
+KILLAFS=${KILLAFS:-/usr/vice/etc/killafs}
+
 # is_on returns 1 if value of arg is "on"
 is_on() {
        if  test "$1" = "on" ; then return 0
        else return 1
-       fi
+        fi
+}
+
+on_network() {
+    ADDRS=`LANG=C ifconfig -a | grep 'inet addr' | grep -v 127.0.0.1 | wc -l`
+    if [ "$ADDRS" = "" ]; then
+       echo afs: No interfaces with IP address 1>&2
+       return 1
+    elif [ $ADDRS = 0 ]; then
+       echo afs: No interfaces with IP address 1>&2
+       return 1
+    fi
+    return 0
 }
 
 # If choose_client can't correctly determine which client to use, set
@@ -41,9 +109,14 @@ choose_client() {
        esac
 
        # For now, just use uname -r to get the module version. 
-       VERSION=`uname -r`
-
-       LIBAFS=libafs-$VERSION$MP.o
+       case $KERNEL_VERSION in
+         [1-2].[0-5].*)
+               LIBAFS=libafs-$KERNEL_VERSION$MP.o
+               ;;
+         *)
+               LIBAFS=libafs-$KERNEL_VERSION$MP.ko
+               ;;
+       esac
 }
 
 #
@@ -54,8 +127,14 @@ choose_client() {
 # unregister_filesystem_Rsmp_b240cad8 is a typcial SMP version string from
 # a kernel built from ftp.kernel.org
 #
-
-KSYMS_FILE=/proc/ksyms
+case $KERNEL_VERSION in
+  [1-2].[0-5].*)
+       KSYMS_FILE=/proc/ksyms
+       ;;
+  *)
+       KSYMS_FILE=/proc/kallsyms
+       ;;
+esac
 SEARCH_STR="unregister_filesystem"
 DEFAULT_SMP_PREFIX="smp_" # Redhat kernels need "smp" instead
 PREFIX="" # none needed for UP with <= 1Gig memory
@@ -66,8 +145,16 @@ set_prefix()
        h8="$h$h$h$h$h$h$h$h"
        prefix_set=0
 
-       set X `fgrep $SEARCH_STR $KSYMS_FILE 2> /dev/null`; shift
-       str=$2
+       set X `egrep "\<$SEARCH_STR" $KSYMS_FILE 2> /dev/null`; shift
+       
+       case $KERNEL_VERSION in
+         [1-2].[0-5].*)
+               str=$2
+               ;;
+         *)
+               str=$3
+               ;;
+       esac
        case $str in
        ${SEARCH_STR}_R$h8)
                # No prefix required
@@ -100,8 +187,7 @@ set_prefix()
        esac
 }
 
-
-MODLOADDIR=/usr/vice/etc/modload
+MODLOADDIR=${MODLOADDIR:-/usr/vice/etc/modload}
 # load_client loads the AFS client module if it's not already loaded. 
 load_client() {
        # If LIBAFS is set, use it.
@@ -110,18 +196,84 @@ load_client() {
                choose_client
        fi
     
-       if [ ! -f $MODLOADDIR/$LIBAFS ] ; then
+       if [ ! -f "$MODLOADDIR/$LIBAFS" ] ; then
                echo AFS module $MODLOADDIR/$LIBAFS does not exist. Not starting AFS.
                exit 1
        fi
 
-       # use the prefix command if required
-       set_prefix
-       /sbin/insmod ${PREFIX:+-P $PREFIX} -f -m $MODLOADDIR/$LIBAFS > $MODLOADDIR/libafs.map 2>&1
+       if [ -f $KSYMS_FILE ]; then
+               # use the prefix command if required
+               case $KERNEL_VERSION in
+                 [1-2].[0-5].*)
+                       set_prefix
+                       /sbin/insmod ${PREFIX:+-P $PREFIX} -f -m $MODLOADDIR/$LIBAFS > $MODLOADDIR/libafs.map 2>&1
+                       ;;
+                 *)
+                       /sbin/insmod $MODLOADDIR/$LIBAFS > $MODLOADDIR/libafs.map 2>&1
+                       ;;
+               esac
+       else
+               /sbin/insmod $MODLOADDIR/$LIBAFS > $MODLOADDIR/libafs.map 2>&1
+       fi
+}
+
+generate_cacheinfo() {
+    if [ "$CACHESIZE" = "AUTOMATIC" ]; then
+       LINE=`df -k $CACHE | tail -1`
+       PART=`echo $LINE | awk '{ if ( ($NF != "/usr")  && ($NF != "/") ) print $NF; else print "NONE";}'`
+       if [ "$PART" = "NONE" ]; then
+           echo "$CACHE or /usr/vice is not a separate partition"
+           echo "you have to change the cachesize in $SYSCNF by hand"
+           echo "AFS will be started with a VERY small cache of 8Mb."
+           CACHESIZE=8000
+       else
+           # Check to see if df has pretty-printed for long dev (i.e. LVM)
+            FCHAR=`echo $LINE | cut -c 1`
+            if [ "$FCHAR" = "/" ]; then
+                PARTSIZE=`echo $LINE | awk '{print $2}'`
+            else
+                PARTSIZE=`echo $LINE | awk '{print $1}'`
+           fi
+           CACHESIZE=`echo $PARTSIZE | awk '{printf "%d",int(($1*.8)/1000)*1000}'`
+       fi
+    fi
+    if [ "x$CACHESIZE" != "x" ]; then
+       echo $AFS:$CACHE:$CACHESIZE >$CACHEINFO
+       chmod 0644 $CACHEINFO
+    else
+       CACHESIZE=`awk -F: '{print $3}' < $CACHEINFO`
+    fi
+}
+
+choose_afsdoptions() {
+       if [ -z "$OPTIONS" -o "$OPTIONS" = "AUTOMATIC" ]; then
+               if [ $CACHESIZE -lt 131072 ]; then
+                       OPTIONS=$SMALL
+               elif [ $CACHESIZE -lt 524288 ]; then
+                       OPTIONS=$MEDIUM
+               elif [ $CACHESIZE -lt 1048576 ]; then
+                       OPTIONS=$LARGE
+               elif [ $CACHESIZE -lt 2097152 ]; then
+                       OPTIONS=$XLARGE
+               else
+                       OPTIONS=$XXLARGE
+               fi
+       fi
+       AFSD_OPTIONS="$OPTIONS $VERBOSE"
+       if is_on $ENABLE_AFSDB; then
+               AFSD_OPTIONS="$AFSD_OPTIONS -afsdb"
+       fi
+       if is_on $ENABLE_DYNROOT; then
+               AFSD_OPTIONS="$AFSD_OPTIONS -dynroot"
+       fi
 }
 
 case "$1" in 
   start)
+    if [ ! "$afs_rh" -o ! -f /var/lock/subsys/afs ]; then
+        if [ `echo "$OPTIONS" | grep -c dynroot` = 0 ]; then
+            on_network || exit 1
+        fi
        # Load kernel extensions
        if  load_client  ; then :
        else
@@ -131,35 +283,46 @@ case "$1" in
 
        echo "Starting AFS services..... "
        # Start bosserver, it if exists
-       if  is_on $AFS_SERVER && test -x /usr/afs/bin/bosserver  ; then
-               /usr/afs/bin/bosserver 
+       if  is_on $AFS_SERVER && test -x $BOSSERVER  ; then
+               $BOSSERVER 
+               test "$afs_rh" && touch /var/lock/subsys/afs
+               if is_on $WAIT_FOR_SALVAGE; then
+                       # wait for fileserver to finish salvaging
+                       sleep 10
+                       while $BOS status localhost fs 2>&1 | grep 'Auxiliary.*salvaging'; do
+                               echo "Waiting for salvager to finish..... "
+                               sleep 10
+                       done
+               fi
        fi
 
        # Start AFS client
-       if  is_on $AFS_CLIENT && test -x /usr/vice/etc/afsd  ; then
-               /usr/vice/etc/afsd ${OPTIONS}
-
-               # Start AFS version of inetd.conf if present.
-               if  test -f /usr/afsws/etc/inetd.conf -a -x /usr/afsws/etc/inetd.afs ; then
-                       /usr/afsws/etc/inetd.afs /usr/afsws/etc/inetd.conf
-               fi
+       if  is_on $AFS_CLIENT && test -x $AFSD  ; then
+               generate_cacheinfo
+               choose_afsdoptions
+               $AFSD ${AFSD_OPTIONS}
+               test "$afs_rh" && touch /var/lock/subsys/afs
                $AFS_POST_INIT
        fi
-
+    fi
        ;;
 
   stop)
+    if [ ! "$afs_rh" -o -f /var/lock/subsys/afs ]; then
        # Stop AFS
        echo "Stopping AFS services..... "
 
        if  is_on $AFS_CLIENT  ; then
-               killall inetd.afs
+               if [ -x $KILLAFS ] ; then
+                       runcmd "Sending all processes using /afs the TERM signal ..." $KILLAFS TERM
+                       runcmd "Sending all processes using /afs the KILL signal ..." $KILLAFS KILL
+               fi
                umount /afs
        fi
 
-       if  is_on $AFS_SERVER && test -x /usr/afs/bin/bos ; then
+       if  is_on $AFS_SERVER && test -x $BOS ; then
                echo "Stopping AFS bosserver"
-               /usr/afs/bin/bos shutdown localhost -localauth -wait
+               $BOS shutdown localhost -localauth -wait
                killall -HUP bosserver
        fi
 
@@ -169,10 +332,21 @@ case "$1" in
                /sbin/rmmod $LIBAFS
        fi
 
+       rm -f /var/lock/subsys/afs
+    fi
+       ;;
+
+  restart)
+       # Restart AFS
+       $0 stop
+       $0 start
        ;;
 
   *)
-       echo Usage: 'afs <start|stop>'
+       echo Usage: 'afs <start|stop|restart>'
 
 esac
 
+exit 0
+
+action fool the Red Hat initscripts