#!/bin/sh # # AFS Start and stop AFS components # # # 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. # # Note that AFS does not use a pid file in /var/run. It is turned off by # unmounting /afs. # # This version modified to work with Red Hat Linux: # * Added restart & status -EAM 30Jan2002 # # @(#) $Id: afs,v 1.3 2002/02/07 20:19:36 myers Exp myers $ ####################################################################### # @(#) Last changed: -EAM 07Feb2002 # Where stuff lives: VICEETCDIR=/usr/vice/etc MODLOADDIR=$VICEETCDIR/modload AFSSRVDIR=/usr/afs/bin # Red Hat: Source function library for basic tools . /etc/rc.d/init.d/functions # Gather up options and post startup script name, if present if [ -f /etc/sysconfig/afs ]; then . /etc/sysconfig/afs fi RETVAL=0 ###################################################################### ## FUNCTIONS: # is_on returns 1 if value of arg is "on" is_on() { if test "$1" = "on" ; then return 0 else return 1 fi } # If choose_client can't correctly determine which client to use, set # LIBAFS manually. choose_client() { # Use the second field of the uname -v output instead of just # doing a match on the whole thing to protect against matching # a timezone named SMP -- I don't know of one, but let's be # paranoid. set X `uname -v` ; shift case $2 in SMP) MP=.mp ;; # MP system *) MP= ;; # SP system esac # For now, just use uname -r to get the module version. VERSION=`uname -r` LIBAFS=libafs-$VERSION$MP.o } # Find prefix symbol to use with insmod. We find the unregister_filesystem # string from /proc/ksyms since we know it's there. If /proc/ksyms does not # exist, we print that info to the console and use the uname -v output to # decide on a prefix. # unregister_filesystem_Rsmp_b240cad8 is a typcial SMP version string from # a kernel built from ftp.kernel.org # KSYMS_FILE=/proc/ksyms SEARCH_STR="unregister_filesystem" DEFAULT_SMP_PREFIX="smp_" # Redhat kernels need "smp" instead PREFIX="" # none needed for UP with <= 1Gig memory set_prefix() { h='[0-9a-fA-F]' 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 case $str in ${SEARCH_STR}_R$h8) # No prefix required ;; $SEARCH_STR) # No versioning in kernel symbols ;; ${SEARCH_STR}_R*$h8) suffix=${str#${SEARCH_STR}_R} PREFIX=${suffix%$h8} ;; *) case $str in '') echo afsd: Cannot find \"$SEARCH_STR\" in file $KSYMS_FILE ;; *) echo afsd: Malformed kernel version symbol \"$str\" ;; esac echo Guessing prefix from output of uname -v set X `uname -v`; shift case $2 in SMP) PREFIX=$DEFAULT_SMP_PREFIX ;; esac ;; esac } # load_client loads the AFS client module if it's not already loaded. load_client() { # If LIBAFS is set, use it. if [ -z "$LIBAFS" ] ; then # Try to determine the right client. choose_client fi if [ ! -f $MODLOADDIR/$LIBAFS ] ; then echo AFS module $MODLOADDIR/$LIBAFS does not exist. Not starting AFS. exit 1 fi ISMOD=`/sbin/lsmod | fgrep $LIBAFS | grep -v deleted` if [ -z "$ISMOD" ]; then echo -n "Loading the AFS module..." # use the prefix command if required set_prefix /sbin/insmod ${PREFIX:+-P $PREFIX} -f -m $MODLOADDIR/$LIBAFS > $MODLOADDIR/libafs.map 2>&1 && success || failure RETVAL=$? echo else echo "$LIBAFS module is already loaded? ->$ISMOD<- " fi } ###################################################################### # BEGIN: case "$1" in start) echo "Starting AFS services: " # Load kernel extensions if load_client ; then : else echo Failed to load AFS module, not starting AFS services. exit 1 fi # Start bosserver, it if exists if is_on $AFS_SERVER && test -x /usr/afs/bin/bosserver ; then echo -n "Starting AFS bosserver..." /usr/afs/bin/bosserver && success || failure echo fi # Start AFS daemon if is_on $AFS_CLIENT && test -x $VICEETCDIR/afsd ; then echo -n "Starting AFS client daemon..." $VICEETCDIR/afsd ${OPTIONS} && success || failure RETVAL=$? echo # 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 && success || failure fi fi # Any post-initialization commands from sysconfig? $AFS_POST_INIT ;; stop) # Stop AFS echo "Stopping AFS client services... " if is_on $AFS_CLIENT ; then echo -n "Killing inetd.afs... " killproc inetd.afs && success || failure echo echo -n "Unmount /afs... " umount /afs && success || failure echo " " echo -n "Kill afsd..." killall afsd && success || failure RETVAL=$? echo fi if is_on $AFS_SERVER && test -x /usr/afs/bin/bos ; then echo -n "Stopping AFS bosserver: " /usr/afs/bin/bos shutdown localhost -localauth -wait killall -HUP bosserver && success || failure RETVAL=$? echo fi LIBAFS=`/sbin/lsmod | fgrep libafs` if [ -n "$LIBAFS" ] ; then echo -n "Unloading AFS module: " LIBAFS=`echo $LIBAFS | awk 'BEGIN { FS = " " } { print $1 }'` /sbin/rmmod $LIBAFS && success || failure RETVAL=$? echo fi ;; restart|reload) $0 stop $0 start RETVAL=$? ;; status) status afsd ;; test) echo "Testing AFS module search/load: " choose_client MOD=$MODLOADDIR/$LIBAFS echo -n "AFS module $MOD " if [ ! -f $MOD ]; then echo "DOES NOT EXIST! " else echo "exists. " fi MOD=libafs-$VERSION$MP ISMOD=`/sbin/lsmod | fgrep $MOD | grep -v deleted` if [ -z "$ISMOD" ]; then echo "The module $MOD is NOT loaded." else echo "$ISMOD " fi echo " " ;; *) echo Usage: 'afs ' esac exit $RETVAL