#!/bin/bash
#
# rc file for automount using a Sun-style "master map".
#

### BEGIN INIT INFO
# Provides:       autofs
# Required-Start: $network $syslog $remote_fs
# Should-Start:   $portmap ypbind keyserv ldap gssd
# Required-Stop:
# Should-Stop:	  
# Default-Start:  3 5
# Default-Stop:
# Description:    Start the autofs daemon for automatic mounting of filesystems.
### END INIT INFO

#
# Location of the automount daemon and the init directory
#
DAEMON=/usr/sbin/automount
prog=`basename $DAEMON`
MODULE="autofs4"
confdir=/etc/sysconfig

test -x $DAEMON || exit 5

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

. /etc/rc.status

#
# load customized configuation settings
#
if [ -r $confdir/autofs ]; then
    . $confdir/autofs
fi

function start() {
	# Make sure autofs4 module is loaded
    if ! grep -q autofs /proc/filesystems; then
	# Try load the autofs4 module fail if we can't
	modprobe -q $MODULE >/dev/null 2>&1
	if [ $? -eq 1 ]; then
	    echo "Error: failed to load autofs4 module."
	    return 1
	fi
    elif ([ -f /proc/modules ] && lsmod) | grep -q autofs[^4]; then
	# wrong autofs filesystem module loaded
	echo
	echo "Error: autofs kernel module is loaded, autofs4 required"
	return 1
    fi

    if [ "$LOCAL_OPTIONS" ]; then
        AUTOFS_OPTIONS="-O $LOCAL_OPTIONS $AUTOFS_OPTIONS"
    fi
    /sbin/startproc $DAEMON $AUTOFS_OPTIONS

    return $?
}

function stop() {
    case "$RUNLEVEL" in
    [016sS])
        # we really want to shutdown, so kill all processes which
	# keep autofs mounted filesystems busy
        for sig in TERM KILL ; do
            while read map mnt fstype options dummy ; do
                test "$fstype" = autofs || continue
                case  "$options" in
                *indirect*)
		    # we need to dive in, because the automount process
		    # itself needs to be avoided
                    for path in $mnt/* ; do
                        test "$path" = "$mnt/*" && break
		        # ghost dir skip optimization
		        test "$(stat -f -c '%t' $path)" = "187" && continue
                        /bin/fuser -k -$sig $path > /dev/null 2>&1
                    done
                    ;;
                *[^i][^n]direct*)
		    # automount process does not appear for direct mounts
                    /bin/fuser -k -$sig $mnt > /dev/null 2>&1
                    ;;
                *) ;;
                esac
            done < /proc/mounts
            [ $sig = TERM ] && sleep 2
        done
        /sbin/killproc -USR2 $DAEMON
        sleep 2
    esac
    /sbin/killproc -G -TERM $DAEMON

    # at this point there should not be any autofs filesystems mounted.
    # to ensure that there are no leftovers, we lazy umount any remaining
    # autofs filesystem which have been still kept busy for some reason
    # (this should have been done by the USR2 signal but currently this
    # does not work)
    while read map mnt fstype options dummy; do
        test "$fstype" = "autofs" || continue
        case "$options" in
        *indirect*)
            for path in $mnt/* ; do
                test "$path" = "$mnt/*" && break
                test -e $path && umount -l $path
            done
            test -e $mnt && umount -l $mnt
            ;;
        *[^i][^n]direct*)
            # umount 2 times: one for the real fs, one for autofs
	    # because mountpoint and autofs mp are identical here!
            test -e $mnt && umount -l $mnt
            test -e $mnt && umount -l $mnt
            ;;
        *) ;;
        esac
    done < /proc/mounts

    return $RETVAL
}

RETVAL=0

case "$1" in
    start)
	echo -n "Starting $prog "
	# Check if already running
	if ! /sbin/checkproc $DAEMON; then
	    start
	fi

	rc_status -v
	;;
    stop)
	echo -n "Shutting down $prog "
	stop

	rc_status -v
	;;
    try-restart|condrestart)
	## Do a restart only if the service was active before.
	## Note: try-restart is now part of LSB (as of 1.9).
	## RH has a similar command named condrestart.
	if test "$1" = "condrestart"; then
	    echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
	fi
	$0 status
	if test $? = 0; then
	    $0 restart
	else
	    rc_reset	# Not running is not a failure.
	fi
	# Remember status and be quiet
	rc_status
	;;
    restart)
	$0 stop
	$0 start

	rc_status
	;;
    force-reload)
	echo -n "Reload service $prog "
	/sbin/killproc -HUP $DAEMON
	rc_status -v

	;;
    reload)
	echo -n "Reload service $prog "
	/sbin/killproc -HUP $DAEMON
	rc_status -v

	;;
    status)
	echo -n "Checking for service $prog "
	/sbin/checkproc $DAEMON
	# NOTE: rc_status knows that we called this init script with
	# "status" option and adapts its messages accordingly.
	rc_status -v
	;;
    *)
	echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
	exit 1
	;;
esac
rc_exit
