#!/sbin/runscript
# Copyright 1999-2003 Gentoo Technologies, Inc.
# Distributed under the terms of the GNU General Public License, v2 or later
# $Header: /var/cvsroot/gentoo-x86/net-fs/nfs-utils/files/nfs-1,v 1.1 2003/03/04 03:38:00 agriffis Exp $

#---------------------------------------------------------------------------
# This script starts/stops the following
#	rpc.statd if necessary (also checked by init.d/nfsmount)
#	rpc.rquotad if exists (from quota package)
#	rpc.nfsd
#	rpc.mountd
#---------------------------------------------------------------------------

# NB: Config is in /etc/conf.d/nfs


opts="start stop restart reload"

# This variable is used for controlling whether or not to run exportfs -ua;
# see stop() for more information
restarting=no

# The binary locations
exportfs=/usr/sbin/exportfs
statd=/sbin/rpc.statd
rquotad=/usr/sbin/rpc.rquotad
nfsd=/usr/sbin/rpc.nfsd
mountd=/usr/sbin/rpc.mountd

depend() {
	need net portmap
	after quota
}

start_statd() {
	# Don't start rpc.statd if already started by init.d/nfsmount
	killall -0 rpc.statd &>/dev/null && return 0
	ebegin "Starting NFS statd"
	start-stop-daemon --start --quiet --exec \
		$statd -- $RPCSTATDOPTS 1>&2
	eend $? "Error starting NFS statd"
}

stop_statd() {
	# Don't stop rpc.statd if it's in use by init.d/nfsmount.
	mount -t nfs | grep -q . && return 0
	# Make sure it's actually running
	killall -0 rpc.statd &>/dev/null || return 0
	# Okay, all tests passed, stop rpc.statd
	ebegin "Stopping NFS statd"
	start-stop-daemon --stop --quiet --exec $statd 1>&2
	eend $? "Error stopping NFS statd"
}

start() {
	start_statd

	# Exportfs likes to hang if networking isn't working.
	# If that's the case, then try to kill it so the
	# bootup process can continue.
	if grep -q '^/' /etc/exports &>/dev/null; then
		ebegin "Exporting NFS directories"
		$exportfs -r 1>&2 &
		( sleep 5; kill -9 $! &>/dev/null & )
		wait
		eend $? "Error exporting NFS directories"
	fi

	if [ -x $rquotad ]; then
		ebegin "Starting NFS rquotad"
		start-stop-daemon --start --quiet --exec \
			$rquotad -- $RPCRQUOTADOPTS 1>&2
		eend $? "Error starting NFS rquotad"
	fi

	ebegin "Starting NFS daemon"
	start-stop-daemon --start --quiet --exec \
		$nfsd -- $RPCNFSDCOUNT 1>&2
	eend $? "Error starting NFS daemon"

	# Check if we support NFSv3
	ebegin "Starting NFS mountd"
	rpcinfo -u localhost nfs 3 &>/dev/null || \
		RPCMOUNTDOPTS="$RPCMOUNTDOPTS --no-nfs-version 3"
	start-stop-daemon --start --quiet --exec \
		$mountd -- $RPCMOUNTDOPTS 1>&2
	eend $? "Error starting NFS mountd"
}

stop() { 
	# Don't check NFSSERVER variable since it might have changed,
	# instead use --oknodo to smooth things over
	ebegin "Stopping NFS mountd"
	start-stop-daemon --stop --quiet --oknodo \
		--exec $mountd 1>&2
	eend $? "Error stopping NFS mountd"

	# nfsd sets its process name to [nfsd] so don't look for $nfsd
	ebegin "Stopping NFS daemon"
	start-stop-daemon --stop --quiet --oknodo \
		--name nfsd --user root --signal 2 1>&2
	eend $? "Error stopping NFS daemon"

	if [ -x $rquotad ]; then
		ebegin "Stopping NFS rquotad"
		start-stop-daemon --stop --quiet --oknodo \
			--exec $rquotad 1>&2
		eend $? "Error stopping NFS rquotad"
	fi

	# When restarting the NFS server, running "exportfs -ua" probably
	# isn't what the user wants.  Running it causes all entries listed
	# in xtab to be removed from the kernel export tables, and the
	# xtab file is cleared. This effectively shuts down all NFS
	# activity, leaving all clients holding stale NFS filehandles,
	# *even* when the NFS server has restarted.
	#
	# That's what you would want if you were shutting down the NFS
	# server for good, or for a long period of time, but not when the
	# NFS server will be running again in short order.  In this case,
	# then "exportfs -r" will reread the xtab, and all the current
	# clients will be able to resume NFS activity, *without* needing
	# to umount/(re)mount the filesystem.
	if [ "$restarting" = no ]; then
		ebegin "Unexporting NFS directories"
		# Exportfs likes to hang if networking isn't working.
		# If that's the case, then try to kill it so the
		# shutdown process can continue.
		$exportfs -ua 1>&2 &
		( sleep 5; kill -9 $! &>/dev/null & )
		wait
		eend $? "Error unexporting NFS directories"
	fi

	stop_statd
}

reload() {
	# Exportfs likes to hang if networking isn't working.
	# If that's the case, then try to kill it so the
	# bootup process can continue.
	ebegin "Reloading /etc/exports"
	$exportfs -r 1>&2 &
	( sleep 5; kill -9 $! &>/dev/null & )
	wait
	eend $? "Error exporting NFS directories"
}

restart() {
	# See long comment in stop() regarding "restarting" and exportfs -ua
	restarting=yes
	svc_stop
	svc_start
}
