#!/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,v 1.6 2003/02/14 23:00:05 vapier Exp $

#---------------------------------------------------------------------------
# This script starts/stops the following
#	 rpc.statd if necessary (also checked by init.d/nfsmount)
#	 rpd.rquotad
#	 rpd.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

depend() {
	need net portmap
}

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 /sbin/rpc.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 /sbin/rpc.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"
		/sbin/exportfs -r 1>&2 &
		( sleep 5; kill -9 $! &>/dev/null & )
		wait
		eend $? "Error exporting NFS directories"
	fi

	ebegin "Starting NFS rquotad"
	start-stop-daemon --start --quiet --exec /sbin/rpc.rquotad \
	--$RPCRQUOTADOPTS 1>&2
	eend $? "Error starting NFS rquotad"

	ebegin "Starting NFS daemon"
	start-stop-daemon --start --quiet --exec \
		/sbin/rpc.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 \
		/sbin/rpc.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 /sbin/rpc.mountd 1>&2
	eend $? "Error stopping NFS mountd"

	ebegin "Stopping NFS daemon"
	start-stop-daemon --stop --quiet --oknodo \
		--name nfsd --user root --signal 2 1>&2
	eend $? "Error stopping NFS daemon"

	ebegin "Stopping NFS rquotad"
	start-stop-daemon --stop --quiet --oknodo \
		--exec /sbin/rpc.rquotad 1>&2
	eend $? "Error stopping NFS rquotad"

	# 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
		# bootup process can continue.
		/sbin/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"
	/sbin/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
}
