#!/bin/bash
#
# $Id: rc.autofs.in,v 1.4 2000/01/22 22:17:34 hpa Exp $
#
# rc file for automount using a Sun-style "master map".
# We first look for a local /etc/auto.master, then a YP
# map with that name
#
# On most distributions, this file should be called:
# /etc/rc.d/init.d/autofs or /etc/init.d/autofs
#

# For Redhat-ish systems
#
# chkconfig: 345 18 82
# processname: /usr/sbin/automount
# config: /etc/auto.master
# description: Automounts filesystems on demand

# This is used in the Debian distribution to determine the proper
# location for the S- and K-links to this init file.
# The following value is extracted by debstd to figure out how to
# generate the postinst script. Edit the field to change the way the
# script is registered through update-rc.d (see the manpage for
# update-rc.d!)
#
FLAGS="defaults 21"

#
# Location of the automount daemon and the init directory
#
DAEMON=/usr/sbin/automount
initdir=/etc/init.d

#
# Determine which kind of configuration we're using
#
system=unknown
if [ -f /etc/debian_version ]; then
    system=debian
elif [ -f /etc/redhat-release ]; then
    system=redhat
else
    echo "$0: Unknown system, please port and contact autofs@linux.kernel.org" 1>&2
    exit 1
fi

if [ $system = redhat ]; then
    . $initdir/functions
fi

test -e $DAEMON || exit 0
thisscript="$0"
if [ ! -f "$thisscript" ]; then
    echo "$0: Cannot find myself" 1>&2
    exit 1
fi

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

#
# We can add local options here
# e.g. localoptions='rsize=8192,wsize=8192'
#
localoptions=''

# Daemon options
# e.g. --timeout 60
#
daemonoptions=''

#
# Check for all maps that are to be loaded
#
function getrawmounts()
{
    if [ -f /etc/auto.master ]; then
        cat /etc/auto.master | sed -e '/^#/d' -e '/^$/d'
    fi
    if [ -x /usr/bin/ypcat ] ; then
        /usr/bin/ypcat -k auto.master 2>/dev/null|sed -e '/^#/d' -e '/^$/d'
    fi
}


#
# This function will build a list of automount commands to execute in
# order to activate all the mount points. It is used to figure out
# the difference of automount points in case of a reload
#
function getmounts()
{
#
# Check for local maps to be loaded
#
if [ -f /etc/auto.master ]
then
    knownmaps=" "
    getrawmounts | (
	while read dir map options
	do
            # These checks screen out duplicates and skip over directories
            # where the map is '-'.
	    if [ ! -z "$dir" -a ! -z "$map" \
			-a x`echo "$map" | cut -c1` != 'x-' \
                        -a "`echo "$knownmaps" | grep $dir/`" = "" ]
	    then
		map=`echo "$map" | sed -e 's/^auto_/auto./'`
		if echo $options | grep -- '-t' >/dev/null 2>&1 ; then
		    mountoptions="--timeout $(echo $options | \
		      sed 's/^.*-t\(imeout\)*[ \t]*\([0-9][0-9]*\).*$/\2/g')"
		fi
                # Break up the maptype and map, if the map type is specified
                maptype=`echo $map | cut -f1 -d:`
                # Handle degenerate map specifiers
                if [ "$maptype" = "$map" ] ; then
                    if [ -x "$map" ]; then
                        maptype=program
                    elif [ -x "/etc/$map" ]; then
                        maptype=program
                        map=`echo /etc/$map | sed 's^//^/^g'`
                    elif [ -f "$map" ]; then
                        maptype=file
                    elif [ -f "/etc/$map" ]; then
                        maptype=file
                        map=`echo /etc/$map | sed 's^//^/^g'`
                    elif [ "$map" = "hesiod" -o "$map" = "userhome" ] ; then
                        maptype=$map
                        map=
                    else
                        maptype=yp
                        map=`basename $map | sed s/^auto_/auto./`
                    fi
                fi
                if echo $options | grep -- '-t' >/dev/null 2>&1 ; then
                    thisdaemonoptions="$(echo "$daemonoptions $options" |\
                    sed 's/--*t\(imeout\)*[ \t=]*\([0-9][0-9]*\).*$/--timeout \2/g')"
                fi
                # Collect all other options, converting -rwsize, et al to rwsize
                options=`echo "$options" | sed -e '
                  s/[ \t]*--*t\(imeout\)*[ \t=]*[0-9][0-9]*//g'`
                map=`echo "$map" | cut -f2- -d:`
                if [ "$maptype" = "file" ] ; then
                        if [ -f "/etc/$map" ]; then
                                map=`echo /etc/$map | sed 's^//^/^g'`
                        fi
                fi

               echo "$DAEMON $thisdaemonoptions $dir $maptype $map $options $localoptions" | sed 's/  / /g'
            fi
            knownmaps=" $dir/ $knownmaps"
	done
    )
fi
}

#
# Status lister.
#
function status()
{
	echo "Configured Mount Points:"
	echo "------------------------"
	getmounts
	echo ""
	echo "Active Mount Points:"
	echo "--------------------"
	ps axwww|grep "[0-9]:[0-9][0-9] $DAEMON " | (
		while read pid tt stat time command; do echo $command; done
	)
}


#
# Redhat start/stop function.
#
function redhat()
{

#
# See how we were called.
#
case "$1" in
  start)
        # Make sure the autofs filesystem type is available.
        (grep -q autofs /proc/filesystems || /sbin/modprobe -k autofs) 2> /dev/null
	# Check if the automounter is already running?
	if [ ! -f /var/lock/subsys/autofs ]; then
            echo -n 'Starting automounter:'
            getmounts | sh && success "autofs startup" || failure "autofs startup"
            RETVAL=$?
            echo
            [ $RETVAL = 0 ] && touch /var/lock/subsys/autofs
	fi
	;;
  stop)
        echo -n 'Stopping automounter:'
        killproc $DAEMON -USR2
        RETVAL=$?
        count=0
        sleep 2
        while [ -n "`/sbin/pidof $DAEMON`" -a $count -lt 5 ] ; do
	    killproc $DAEMON -TERM
            RETVAL=$?
            umount -a -f -t autofs
	    [ $RETVAL = 0 ] || sleep 2
            count=`expr $count + 1`
        done
        umount -a -f -t autofs
	[ $RETVAL = 0 ] && rm -f /var/lock/subsys/autofs
        echo
	;;
  restart)
        redhat stop
        redhat start
	;;
  reload)
	if [ ! -f /var/lock/subsys/autofs ]; then
		echo "Automounter not running"
		RETVAL=1
		return
	fi
	echo "Checking for changes to /etc/auto.master ...."
        TMP1=`mktemp /tmp/autofs.XXXXXX` || { echo "could not make temp file" >& 2; exit 1; }
        TMP2=`mktemp /tmp/autofs.XXXXXX` || { echo "could not make temp file" >& 2; exit 1; }
	getmounts > $TMP1
	ps axwww|grep "[0-9]:[0-9][0-9] $DAEMON" | (
	    while read pid tt stat time command; do
		echo "$command" >>$TMP2
		if ! grep -q "^$command" $TMP1; then
		    if ! echo "$command" | grep -q -e --submount; then
			kill -USR2 $pid
			echo "Stop $command"
		    fi
		fi
	    done
	)
	cat $TMP1 | ( while read x; do
		if ! grep -q "^$x" $TMP2; then
			$x
			echo "Start $x"
		fi
        done )
	rm -f $TMP1 $TMP2
	;;
  status)
	status
	;;
  condrestart)
	[ -f /var/lock/subsys/autofs ] && redhat restart
        RETVAL=0
	;;
  *)
	echo "Usage: $initdir/autofs {start|stop|restart|reload|condrestart|status}"
	RETVAL=0
esac
}

#
# Debian start/stop functions.
#
function debian()
{
#
# See how we were called.
#
case "$1" in
    start)
	echo -n 'Starting automounter:'
	getmounts | while read cmd mnt rest
	do
		echo -n " $mnt"
		pidfile=/var/run/autofs`echo $mnt | sed 's/\//./'`.pid
		start-stop-daemon --start --pidfile $pidfile --quiet \
			--exec $DAEMON -- $mnt $rest
		#
		#	Automount needs a '--pidfile' or '-p' option.
		#	For now we look for the pid ourself.
		#
		ps ax | grep "[0-9]:[0-9][0-9] $DAEMON $mnt" | (
			read pid rest
			echo $pid > $pidfile
			echo "$mnt $rest" >> $pidfile
		)
	done
	echo "."
	;;
    stop)
	echo 'Stopping automounter.'
	start-stop-daemon --stop --quiet --signal USR2 --exec $DAEMON
	;;
    reload|restart)
	echo "Reloading automounter: checking for changes ... "
	TMP=/var/run/autofs.tmp
	getmounts >$TMP
	for i in /var/run/autofs.*.pid
	do
		pid=`head -n 1 $i 2>/dev/null`
		[ "$pid" = "" ] && continue
		command=`tail +2 $i`
		if ! grep -q "^$command" $TMP
		then
			echo "Stopping automounter: $command"
			kill -USR2 $pid
		fi
	done
	rm -f $TMP
	$thisscript start
	;;
    status)
	status
	;;
    *)
	echo "Usage: $initdir/autofs {start|stop|restart|reload|status}" >&2
	exit 1
	;;
esac
}

RETVAL=0
if [ $system = debian ]; then
	debian "$@"
elif [ $system = redhat ]; then
	redhat "$@"
fi

exit $RETVAL
