crowbar/crowbar-core

View on GitHub
chef/cookbooks/nfs-server/files/default/nfs-kernel-server.init.d.precise

Summary

Maintainability
Test Coverage
#!/bin/bash

### BEGIN INIT INFO
# Provides:          nfs-kernel-server
# Required-Start:    $remote_fs nfs-common $portmap $time
# Required-Stop:     $remote_fs nfs-common $portmap $time
# Should-Start:      $named
# 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=
RPCNFSDOPTS=
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 ! grep -E -qs "[[:space:]]nfsd\$" /proc/filesystems; 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
        RET=$?
        if [ $RET != 0 ]; then
            log_end_msg $RET
            exit $RET
        fi
        log_end_msg 0

        log_daemon_msg "Starting $DESC"
        log_progress_msg "nfsd"

        # See if rpcbind is running
        /usr/sbin/rpcinfo -p >/dev/null 2>&1
        RET=$?
        if [ $RET != 0 ]; then
            echo
            log_warning_msg "Not starting: portmapper is not running"
            exit 0
        fi

        start-stop-daemon --start --oknodo --quiet \
            --nicelevel $RPCNFSDPRIORITY \
            --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDOPTS $RPCNFSDCOUNT
        RET=$?
        if [ $RET != 0 ]; then
            log_end_msg $RET
            exit $RET
        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
            do_modprobe rpcsec_gss_krb5
            log_progress_msg "svcgssd"
            start-stop-daemon --start --oknodo --quiet \
                --exec $PREFIX/sbin/rpc.svcgssd -- $RPCSVCGSSDOPTS
            RET=$?
            if [ $RET != 0 ]; then
                log_end_msg $RET
                exit $RET
            fi
        fi

        log_progress_msg "mountd"
        start-stop-daemon --start --oknodo --quiet \
            --exec $PREFIX/sbin/rpc.mountd -- $RPCMOUNTDOPTS
        RET=$?
        if [ $RET != 0 ]; then
            log_end_msg $RET
            exit $RET
        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
    RET=$?
    if [ $RET != 0 ]; then
        log_end_msg $RET
        exit $RET
    fi

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

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

    log_end_msg 0

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

    if mountpoint -q $PROCNFSD_MOUNTPOINT
    then
        $PREFIX/sbin/exportfs -f
            umount $PROCNFSD_MOUNTPOINT
    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
    RET=$?
    log_end_msg $RET
    exit $RET
    ;;

  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