#!/sbin/runscript
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/net-fs/nfs-utils/files/nfs.initd,v 1.22 2010/08/07 21:13:02 vapier Exp $

opts="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
  mountd=/usr/sbin/rpc.mountd
    nfsd=/usr/sbin/rpc.nfsd
smnotify=/usr/sbin/sm-notify

depend() {
	local myneed=""
	if [ -e /etc/exports ] ; then
		# XXX: no way to detect NFSv4 is desired and so need rpc.idmapd
		myneed="${myneed} $(
			awk '!/^[[:space:]]*#/ {
				# clear the path to avoid spurious matches
				$1 = "";
				if ($0 ~ /[(][^)]*sec=(krb|spkm)[^)]*[)]/) {
					print "rpc.gssd"
					exit 0
				}
				}' /etc/exports
			)"
	fi
	config /etc/exports
	need portmap rpc.statd ${myneed} ${NFS_NEEDED_SERVICES}
	use ypbind net dns rpc.rquotad rpc.idmapd rpc.svcgssd
	after quota
}

mkdir_nfsdirs() {
	local d
	for d in rpc_pipefs v4recovery v4root ; do
		d="/var/lib/nfs/${d}"
		[ ! -d "${d}" ] && mkdir -p "${d}"
	done
}

waitfor_exportfs() {
	local pid=$1
	( sleep ${EXPORTFS_TIMEOUT:-30}; kill -9 $pid 2>/dev/null ) &
	wait $1
}

mount_nfsd() {
	if [ -e /proc/modules ] ; then
		# Make sure nfs support is loaded in the kernel #64709
		if ! grep -qs nfsd /proc/filesystems ; then
			modprobe -q nfsd
		fi
		# Restart idmapd if needed #220747
		if grep -qs nfsd /proc/modules ; then
			killall -q -HUP rpc.idmapd
		fi
	fi

	# This is the new "kernel 2.6 way" to handle the exports file
	if grep -qs nfsd /proc/filesystems ; then
		if ! grep -qs "nfsd /proc/fs/nfsd" /proc/mounts ; then
			ebegin "Mounting nfsd filesystem in /proc"
			mount -t nfsd -o nodev,noexec,nosuid nfsd /proc/fs/nfsd
			eend $?
		fi
	fi
}

start_it() {
	ebegin "Starting NFS $1"
	shift
	"$@"
	eend $?
	ret=$((ret + $?))
}
start() {
	mount_nfsd
	mkdir_nfsdirs

	# 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 -qs '^[[:space:]]*/' /etc/exports ; then
		ebegin "Exporting NFS directories"
		${exportfs} -r &
		waitfor_exportfs $!
		eend $?
	fi

	local ret=0
	start_it mountd ${mountd} ${OPTS_RPC_MOUNTD}
	start_it daemon ${nfsd} ${OPTS_RPC_NFSD}
	[ -x "${smnotify}" ] && start_it smnotify ${smnotify} ${OPTS_SMNOTIFY}
	return ${ret}
}

stop() {
	local ret=0

	# 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 --oknodo --exec ${mountd}
	eend $?
	ret=$((ret + $?))

	# nfsd sets its process name to [nfsd] so don't look for $nfsd
	ebegin "Stopping NFS daemon"
	start-stop-daemon --stop --oknodo --name nfsd --user root --signal 2
	eend $?
	ret=$((ret + $?))
	# in case things don't work out ... #228127
	rpc.nfsd 0

	# 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 -o "${RC_CMD}" = "restart" ] ; 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 &
		waitfor_exportfs $!
		eend $?
	fi

	return ${ret}
}

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 &
	waitfor_exportfs $!
	eend $?
}

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