#!/bin/sh

### BEGIN INIT INFO
# Provides:          nfs-kernel-server
# Required-Start:    $portmap $time
# Required-Stop:     $portmap $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Kernel NFS server support
# Description:       NFS is a popular protocol for file sharing across
#		     TCP/IP networks. This service provides NFS server
#                    functionality, which is configured via the
#                    /etc/exports file.
### END INIT INFO

# What is this?
DESC="NFS kernel daemon"
PREFIX=/usr

# Exit if required binaries are missing.
[ -x $PREFIX/sbin/rpc.nfsd    ] || exit 0
[ -x $PREFIX/sbin/rpc.mountd  ] || exit 0
[ -x $PREFIX/sbin/exportfs    ] || exit 0

# Read config
DEFAULTFILE=/etc/default/nfs-kernel-server
RPCNFSDCOUNT=8
RPCNFSDPRIORITY=0
RPCMOUNTDOPTS=
NEED_SVCGSSD=no
RPCSVCGSSDOPTS=
PROCNFSD_MOUNTPOINT=/proc/fs/nfsd
if [ -f $DEFAULTFILE ]; then
    . $DEFAULTFILE
fi

. /lib/lsb/init-functions

do_modprobe() {
    if [ -x /sbin/modprobe -a -f /proc/modules ]
    then
        modprobe -q "$1" || true
    fi
}

do_mount() {
    if ! grep -E -qs "$1\$" /proc/filesystems
    then
	return 1
    fi
    if ! mountpoint -q "$2"
    then
	mount -t "$1" "$1" "$2"
	return
    fi
    return 0
}

# See how we were called.
case "$1" in
  start)
	if [ -f /etc/exports ]
	then
		do_modprobe nfsd

		# See if our running kernel supports the NFS kernel server
		if [ -f /proc/kallsyms ] && ! grep -qE 'init_nf(sd|	)' /proc/kallsyms; then
			log_warning_msg "Not starting $DESC: no support in current kernel."
			exit 0
		fi
		
		do_mount nfsd $PROCNFSD_MOUNTPOINT || NEED_SVCGSSD=no
		log_begin_msg "Exporting directories for $DESC..."
		$PREFIX/sbin/exportfs -r
		if [ $? != 0 ]; then
			log_end_msg $?
			exit $?
		fi
		log_end_msg 0

		log_daemon_msg "Starting $DESC"
		log_progress_msg "nfsd"
		start-stop-daemon --start --oknodo --quiet \
		    --nicelevel $RPCNFSDPRIORITY \
		    --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDCOUNT
		if [ $? != 0 ]; then
			log_end_msg $?
			exit $?
		fi

		# make sure 127.0.0.1 is a valid source for requests
		ClearAddr=
		if [ -f /proc/net/rpc/auth.unix.ip/channel ]
		then
		    fgrep -qs 127.0.0.1 /proc/net/rpc/auth.unix.ip/content || {
			echo "nfsd 127.0.0.1 2147483647 localhost" >/proc/net/rpc/auth.unix.ip/channel
			ClearAddr=yes
		    }
		fi

		$PREFIX/bin/rpcinfo -u localhost nfs 3 >/dev/null 2>&1 ||
		    RPCMOUNTDOPTS="$RPCMOUNTDOPTS --no-nfs-version 3"

		[ -z "$ClearAddr" ] || echo "nfsd 127.0.0.1 1" >/proc/net/rpc/auth.unix.ip/channel
	
	        if [ "$NEED_SVCGSSD" = "yes" ]; then
			log_progress_msg "svcgssd"
			start-stop-daemon --start --oknodo --quiet \
			    --exec $PREFIX/sbin/rpc.svcgssd -- $RPCSVCGSSDOPTS
			if [ $? != 0 ]; then
				log_end_msg $?
				exit $?
			fi
		fi

		log_progress_msg "mountd"
		start-stop-daemon --start --oknodo --quiet \
		    --exec $PREFIX/sbin/rpc.mountd -- $RPCMOUNTDOPTS
		if [ $? != 0 ]; then
			log_end_msg $?
			exit $?
		fi

		log_end_msg 0
	else
		log_warning_msg "Not starting $DESC: no exports."
	fi
	;;

  stop)
	log_daemon_msg "Stopping $DESC"
	
	log_progress_msg "mountd"
	start-stop-daemon --stop --oknodo --quiet \
	    --name rpc.mountd --user 0
	if [ $? != 0 ]; then
		log_end_msg $?
		exit $?
	fi
	        
	if [ "$NEED_SVCGSSD" = "yes" ]; then
		log_progress_msg "svcgssd"
		start-stop-daemon --stop --oknodo --quiet \
		    --name rpc.svcgssd --user 0
		if [ $? != 0 ]; then
			log_end_msg $?
			exit $?
		fi
	fi

	log_progress_msg "nfsd"
	start-stop-daemon --stop --oknodo --quiet \
	    --name nfsd --user 0 --signal 2
	if [ $? != 0 ]; then
		log_end_msg $?
		exit $?
	fi

	log_end_msg 0

	log_begin_msg "Unexporting directories for $DESC..."
	$PREFIX/sbin/exportfs -au
	if [ $? != 0 ]; then
		log_end_msg $?
		exit $?
	fi
	log_end_msg 0

	if mountpoint -q /proc/nfs/nfsd
	then
	    $PREFIX/sbin/exportfs -f
	fi
	;;

  status)
	if pidof nfsd >/dev/null
	then
	    echo "nfsd running"
	    exit 0
	else
	    echo "nfsd not running"
	    exit 3
	fi
	;;

  reload | force-reload)
	log_begin_msg "Re-exporting directories for $DESC..."
	$PREFIX/sbin/exportfs -r
	log_end_msg $?
	exit $?
	;;

  restart)
	$0 stop
	sleep 1
	$0 start
	;;

  *)
	log_success_msg "Usage: nfs-kernel-server {start|stop|status|reload|force-reload|restart}"
	exit 1
	;;
esac

exit 0
