#! /bin/sh
# 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: 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.


# check for special bootup functions
. /etc/rc.d/init.d/functions

runcmd() {
    echo -n "$1 "
    shift
    if [ "$BOOTUP" = "color" ]; then
	$* && echo_success || echo_failure
    else
	$*
    fi
    echo
}

SYSCNF=/etc/sysconfig/afs

# Gather up options and post startup script name, if present
if [ -f $SYSCNF ] ; then
    . $SYSCNF
fi

CACHEINFO=${CACHEINFO:-/usr/vice/etc/cacheinfo}
CACHE=${CACHEDIR:-/usr/vice/cache}
AFS=${AFSDIR:-/afs}

# is_on returns 1 if value of arg is "on"
is_on() {
    if  test "$1" = "on" ; then return 0
    else return 1
    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
    #*******************************************
    # Begin of modifications done by Troy Dawson
    #*******************************************	
    FOUNDSERVER="no"
    FINISHED="no"
    cat /usr/vice/etc/CellServDB | {
	while [ "$FINISHED" = "no" ] 
	  do
	  read line || break;
	  CHAR="$(echo $line | cut -c1)"
	  if [ "$CHAR" = ">" ] ; then
	      if [ "$FOUNDSERVER" = "yes" ] ; then
		  FINISHED="yes"
	      else
		  LINECELL="$(echo $line | cut -d' ' -f1 | cut -d'>' -f2)"
		  if [ "$CELL" = "$LINECELL" ] ; then
		      FOUNDSERVER="yes"
		  fi
	      fi
	  else
	      if [ "$FOUNDSERVER" = "yes" ] ; then
		  if [ "$line" = "" ] ; then
		      FINISHED="yes"
		  else
		      SERVER="$(echo $line | cut -d' ' -f1)"
		      /usr/sbin/rxdebug -servers $SERVER -port 7002 2>&1 > /dev/null
		      if [ $? -eq 0 ] ; then
			  return 0
		      fi
		      echo "afs: Unable to reach $SERVER ..." 1>&2
		  fi
	      fi
	  fi
	done
	echo afs: Unable to reach AFS servers. Not starting. 1>&2
	return 1
    }
    #*******************************************
    # End of modifications done by Troy Dawson
    #*******************************************    
    return 0
}

generate_cacheinfo() {
    if [ "$CACHESIZE" = "AUTOMATIC" ]; then
	LINE=`df -Pk $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" 1>&2
	    echo "you have to change the cachesize in $SYSCNF by hand" 1>&2
	    echo "AFS will be started with the default cache size of 100 MB." 1>&2
	    CACHESIZE=100000
	else
	    PARTSIZE=`echo $LINE | awk '{print $2}'`
	    if grep -q "$CACHE ext3" /proc/mounts ; then
		PARTSIZE=`expr $PARTSIZE - 32768`
	    fi
	    CACHESIZE=`echo $PARTSIZE | awk '{printf "%d",int(($1*.7)/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
}

check_thiscell() {
    CELL=
    if [ -s /usr/vice/etc/ThisCell ] ; then
	CELL="$(cat /usr/vice/etc/ThisCell)"
	if [ -n "$CELL" ]; then
	    grep -w -q -s ">$CELL" /usr/vice/etc/CellServDB
	    if [ $? -ne 0 ] ; then
		echo afs: $CELL from ThisCell is not in CellServDB.  Not starting. 1>&2
		return 1
	    fi
	    return 0
	fi
    fi
    CELL=`dnsdomainname`;
    if [ $? -ne 0 -o -z "$CELL" ] ; then
	echo afs: No cell defined. Trying to figure it out failed. Not starting. 1>&2
	return 1
    fi
    grep -w -q -s ">$CELL" /usr/vice/etc/CellServDB
    if [ $? -ne 0 ] ; then
	echo afs: No cell defined. Trying to figure it out failed. Not starting. 1>&2
	return 1
    fi
    echo "$CELL" > /usr/vice/etc/ThisCell && chmod 0644 /usr/vice/etc/ThisCell
    if [ $? -ne 0 ] ; then
	echo afs: No cell defined. Trying to configure "$CELL" failed. Not starting. 1>&2
	return 1
    fi
    echo afs: Warning: No cell was defined. Autoconfigured "$CELL". 1>&2
}

case "$1" in 
    start)
	if [ ! -f /var/lock/subsys/afs ]; then
	    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 
		touch /var/lock/subsys/afs
	    fi

	    # Start AFS client
	    if  is_on $AFS_CLIENT && test -x /usr/vice/etc/afsd ; then
		generate_cacheinfo
		choose_afsdoptions
		check_thiscell || exit 1
		on_network || exit 1

  	        # Load kernel extensions
		if ! /sbin/modprobe libafs ; then
		    echo Failed to load AFS client, not starting AFS services. 1>&2
		    exit 1
		fi

		/usr/vice/etc/afsd ${AFSD_OPTIONS}
		touch /var/lock/subsys/afs
		$AFS_POST_INIT
	    fi
	fi
	;;

  stop)
    if [ -f /var/lock/subsys/afs ]; then
	# Stop AFS
	echo "Stopping AFS services..... "

	if  is_on $AFS_CLIENT  ; then
	    if [ -x /usr/vice/etc/killafs ] ; then
		runcmd "Sending all processes using /afs the TERM signal ..." /usr/vice/etc/killafs TERM
		runcmd "Sending all processes using /afs the KILL signal ..." /usr/vice/etc/killafs KILL
	    fi
	    umount /afs
	    /sbin/modprobe -r libafs
	fi

	if  is_on $AFS_SERVER && test -x /usr/bin/bos ; then
	    echo "Stopping AFS bosserver"
	    /usr/bin/bos shutdown localhost -localauth -wait
	    killall -HUP bosserver
	fi

	rm -f /var/lock/subsys/afs
    fi
	;;

  restart)
	# Restart AFS
	$0 stop
	$0 start
	;;

  *)
	echo Usage: 'afs <start|stop|restart>'

esac

exit 0

action fool the Red Hat initscripts
