#!/bin/bash daemon_name=nfs-common NEED_STATD= STATD_OPTS= NEED_IDMAPD= IDMAPD_OPTS= NEED_GSSD= GSSD_OPTS= PIPEFS_MOUNTPOINT= PIPEFS_MOUNTOPTS= # rpc.statd daemon & binary location STATD_DAEMON_NAME=rpc.statd STATD="/usr/bin/rpc.statd" # rpc.idmapd daemon & binary location IDMAPD_DAEMON_NAME=rpc.idmapd IDMAPD="/usr/bin/rpc.idmapd" # rpc.gssd daemon & binary location GSSD_DAEMON_NAME=rpc.gssd GSSD="/usr/bin/rpc.gssd" . /etc/rc.conf . /etc/rc.d/functions . /etc/conf.d/$daemon_name.conf # Default mountpoint and options for rpc_pipefs filesystem [ -z "$PIPEFS_MOUNTPOINT" ] && PIPEFS_MOUNTPOINT="/var/lib/nfs/rpc_pipefs" [ -z "$PIPEFS_MOUNTOPTS" ] && PIPEFS_MOUNTOPTS="defaults" # Parse the fstab file, and determine whether we need idmapd and gssd. (The # /etc/conf.d/nfs-common settings, if any, will override our autodetection.) AUTO_NEED_IDMAPD=no AUTO_NEED_GSSD=no if [ -f /etc/fstab ]; then exec 9<&0 /dev/null ; then return 1 fi if grep -vw "$1" /proc/mounts &> /dev/null ; then if ! mountpoint -q "$2" ; then mount -t "$1" "$1" "$2" -o "$3" return fi fi return 0 } do_umount() { if mountpoint -q "$1" ; then umount "$1" fi return 0 } get_pid() { pidof -o %PPID "$1" } case "$1" in start) ck_daemon rpcbind && { echo -n "Start rpcbind first." >&2; stat_die; } rc=0 if [ "$NEED_STATD" = yes ]; then stat_busy "Starting $STATD_DAEMON_NAME daemon" PID=$(get_pid $STATD) if [ -z "$PID" ]; then [ -f /var/run/$STATD_DAEMON_NAME.pid ] && rm -f /var/run/$STATD_DAEMON_NAME.pid # RUN $STATD $STATD_OPTS # rc=$(($rc+$?)) if [ $rc -gt 0 ]; then stat_fail exit $rc else echo $(get_pid $STATD) > /var/run/$STATD_DAEMON_NAME.pid stat_done fi else stat_fail exit 1 fi # Run sm-notify /usr/bin/sm-notify $SMNOTIFY_OPTS fi if [ "$NEED_IDMAPD" = yes ] || [ "$NEED_GSSD" = yes ]; then stat_busy "Mounting pipefs filesystem" do_modprobe sunrpc do_modprobe nfs do_modprobe nfsd do_mount rpc_pipefs "$PIPEFS_MOUNTPOINT" "$PIPEFS_MOUNTOPTS" rc=$(($rc+$?)) if [ $rc -gt 0 ]; then stat_fail exit $rc else stat_done fi if [ "$NEED_IDMAPD" = yes ]; then stat_busy "Starting $IDMAPD_DAEMON_NAME daemon" PID=$(get_pid $IDMAPD) if [ -z "$PID" ]; then [ -f /var/run/$IDMAPD_DAEMON_NAME.pid ] && rm -f /var/run/$IDMAPD_DAEMON_NAME.pid # RUN $IDMAPD $IDMAPD_OPTS # rc=$(($rc+$?)) if [ $rc -gt 0 ]; then stat_fail exit $rc else echo $(get_pid $IDMAPD) > /var/run/$IDMAPD_DAEMON_NAME.pid stat_done fi else stat_fail exit 1 fi fi if [ "$NEED_GSSD" = yes ]; then do_modprobe rpcsec_gss_krb5 stat_busy "Starting $GSSD_DAEMON_NAME daemon" PID=$(get_pid $GSSD) if [ -z "$PID" ]; then [ -f /var/run/$GSSD_DAEMON_NAME.pid ] && rm -f /var/run/$GSSD_DAEMON_NAME.pid # RUN $GSSD $GSSD_OPTS # rc=$(($rc+$?)) if [ $rc -gt 0 ]; then stat_fail exit $rc else echo $(get_pid $GSSD) > /var/run/$GSSD_DAEMON_NAME.pid stat_done fi else stat_fail exit 1 fi fi fi add_daemon $daemon_name ;; stop) rc=0 if [ "$NEED_IDMAPD" = yes ] || [ "$NEED_GSSD" = yes ]; then if [ "$NEED_GSSD" = yes ]; then stat_busy "Stopping $GSSD_DAEMON_NAME daemon" PID=$(get_pid $GSSD) # KILL [ ! -z "$PID" ] && kill $PID &> /dev/null # rc=$(($rc+$?)) if [ $rc -gt 0 ]; then stat_fail exit $rc else rm -f /var/run/$GSSD_DAEMON_NAME.pid &> /dev/null stat_done fi fi if [ "$NEED_IDMAPD" = yes ]; then stat_busy "Stopping $IDMAPD_DAEMON_NAME daemon" PID=$(get_pid $IDMAPD) # KILL [ ! -z "$PID" ] && kill $PID &> /dev/null # rc=$(($rc+$?)) if [ $rc -gt 0 ]; then stat_fail exit $rc else rm -f /var/run/$IDMAPD_DAEMON_NAME.pid &> /dev/null stat_done fi fi do_umount "$PIPEFS_MOUNTPOINT" 2>/dev/null || true fi if [ "$NEED_STATD" = yes ]; then stat_busy "Stopping $STATD_DAEMON_NAME daemon" PID=$(get_pid $STATD) # KILL [ ! -z "$PID" ] && kill $PID &> /dev/null # rc=$(($rc+$?)) if [ $rc -gt 0 ]; then stat_fail exit $rc else rm -f /var/run/$STATD_DAEMON_NAME.pid &> /dev/null stat_done fi fi rm_daemon $daemon_name ;; status) stat_busy "Checking $daemon_name status"; ck_status $daemon_name if [ "$NEED_STATD" = yes ]; then stat_busy "Daemon $STATD_DAEMON_NAME running" PID=$(get_pid $STATD) if [ -z "$PID" ]; then stat_fail else stat_done fi fi if [ "$NEED_GSSD" = yes ]; then stat_busy "Daemon $GSSD_DAEMON_NAME running" PID=$(get_pid $GSSD) if [ -z "$PID" ]; then stat_fail else stat_done fi fi if [ "$NEED_IDMAPD" = yes ]; then stat_busy "Daemon $IDMAPD_DAEMON_NAME running" PID=$(get_pid $IDMAPD) if [ -z "$PID" ]; then stat_fail else stat_done fi fi echo ;; restart) $0 stop sleep 3 $0 start ;; *) echo "usage: $0 {start|stop|status|restart}" esac exit 0