#!/bin/sh
#
# nfsfs		Mount NFS filesystems.
#
# Version:	@(#) /etc/init.d/skeleton 1.01 26-Oct-1993
#
# Author:	Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#
# chkconfig:	345 15 88
# description:	Mounts and unmounts all Network File System (NFS) \
#		mount points.
#
# $Id$

# Source networking configuration.
if [ ! -f /etc/sysconfig/network ]; then
	exit 0
fi

# Source function library.
. /etc/rc.d/init.d/functions

# Get network config
. /etc/sysconfig/network

# Get service config
[ -f /etc/sysconfig/nfsclient ] && . /etc/sysconfig/nfsclient

# Check that networking is up.
if is_yes "${NETWORKING}"; then
	if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status ]; then
		msg_network_down nfsfs
		exit 1
	fi
else
	exit 0
fi

start() {
  	if [ ! -f /var/lock/subsys/nfsfs ]; then
		if is_yes "$NFS4" ; then
		    if grep -q nfs4 /proc/filesystems; then
			modprobe -s nfs > /dev/null 2>&1
			if [ "$(kernelverser)" -ge "002006" ]; then
			    grep -q rpc_pipefs /proc/filesystems && \
			    ! grep -q rpc_pipefs /proc/mounts && \
			    run_cmd "Mounting /var/lib/nfs/rpc_pipefs filesystem" mount -t rpc_pipefs rpc_pipefs /var/lib/nfs/rpc_pipefs
			fi
			if [ ! -f /var/lock/subsys/idmapd ]; then
			    msg_starting "NFS idmapd"
			    daemon rpc.idmapd $RPCIDMAPOPTIONS
			fi
			msg_starting "NFS gssd"
			daemon rpc.gssd -m $RPCGSSOPTIONS
		    fi
		fi
	    run_cmd "Mounting NFS filesystems" mount -a -t nfs
	    touch /var/lock/subsys/nfsfs
	else
	    msg_already_running "NFSFS"
	fi
}

stop() {
	if [ -f /proc/mounts ]; then
		fsfile="/proc/mounts"
	else
		fsfile="/etc/mtab"
	fi

	show "Unmounting NFS filesystems"
	busy
	retry=3
	remaining=$(awk '$3 == "nfs" {print $2}' $fsfile)
	while [ -n "$remaining" -a $retry -gt 0 ]; do
		fuser -msk -TERM `awk '$3 == "nfs" {print $2}' < $fsfile`
		sleep 2
		fuser -msk -KILL `awk '$3 == "nfs" {print $2}' < $fsfile`
		umount -a -f -t nfs
		remaining=$(awk '$3 == "nfs" {print $2}' $fsfile)
		retry=$(($retry-1))
	done
	ok
	if is_yes "$NFS4" ; then
		if grep -q nfs4 /proc/filesystems; then
		    msg_stopping "NFS gssd"
		    killproc rpc.gssd
		    if [ -f /var/lock/subsys/idmapd -a ! -f /var/lock/subsys/nfs ]; then
			msg_stopping "NFS idmapd"
			killproc rpc.idmapd
			rm -f /var/lock/subsys/idmapd
		    fi
		fi
	fi
	rm -f /var/lock/subsys/nfsfs
}

# See how we were called.
case "$1" in
  start)
  	start
	;;
  stop)
  	stop
	;;
  status)
	if [ -f /proc/mounts ]; then
		echo "Configured NFS mountpoints:"
		grep -v '^#' /etc/fstab | \
		  awk '{ if ($3 ~ /^nfs$/ && $4 !~ /noauto/) print $2}'
		echo "Active NFS mountpoints:"
		grep -v '^#' /proc/mounts | \
		  awk '{ if ($3 ~ /^nfs$/ && $4 !~ /noauto/) print $2}'
	else
		echo "/proc filesystem unavailable"
	fi
	;;
  restart)
	stop
	start
	;;
  reload|force-reload)
	mount -a -t nfs
	;;
  *)
	msg_usage "$0 {start|stop|restart|reload|force-reload|status}"
	exit 3
esac

exit 0
