-#!/bin/sh
-#
-# $Id: rc.autofs.in,v 1.58 2005/04/11 11:30:54 raven 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
-#
-### BEGIN INIT INFO
-# Provides: autofs
-# Required-Start: $local_fs
-# Required-Stop: $local_fs
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: automount daemon
-# Description: daemon to mount (possibly remote) filesystems
-# automatically upon entering the mountpoint
-### END INIT INFO
-
-# For Redhat-ish systems
-#
-# chkconfig: 345 28 72
-# 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
-prog=`basename $DAEMON`
-initdir=/etc/init.d
-
-test -e $DAEMON || exit 0
-
-#
-# Determine which kind of configuration we're using
-#
-system=debian
-if [ -f /etc/redhat-release ]; then
- system=redhat
-fi
-
-if [ $system = redhat ]; then
- . $initdir/functions
-fi
-
-if [ $system = debian ]; then
- thisscript="$0"
- if [ ! -f "$thisscript" ]; then
- echo "$0: Cannot find myself" 1>&2
- exit 1
- fi
-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=''
-
-#
-# load custom settings
-#
-if [ "$system" = "redhat" ]; then
- LOCALOPTIONS=""
- DAEMONOPTIONS=""
- UNDERSCORETODOT=1
- DISABLE_DIRECT=1
- DAEMON_EXIT_WAIT=20
-
- [ -f /etc/sysconfig/autofs ] && . /etc/sysconfig/autofs
-
- # Over-ride localoptions if set
- if [ -n "$LOCALOPTIONS" ]; then
- localoptions=$LOCALOPTIONS
- fi
-
- # Over-ride daemonoptions if set
- if [ -n "$DAEMONOPTIONS" ]; then
- daemonoptions=$DAEMONOPTIONS
- fi
-elif [ "$system" = "debian" ]; then
- TIMEOUT=300
- DISABLE_DIRECT=1
- DAEMON_EXIT_WAIT=20
-
- [ -f /etc/default/autofs ] && . /etc/default/autofs
-
- daemonoptions="$daemonoptions --timeout=$TIMEOUT"
-fi
-
-#
-# Check for all maps that are to be loaded
-#
-getschemes()
-{
- SOURCES=`grep ^automount: /etc/nsswitch.conf | \
- sed -e 's/^.*://' -e 's/\[.*\]/ /g'`
-
- if [ `echo $SOURCES | awk '{print NF}'` -gt 0 ]
- then
- echo ${SOURCES}
- else
- echo files
- fi
-}
-
-catnismap()
-{
- if [ -z "$1" ] ; then
- map="auto_master"
- else
- map="$1"
- fi
-
- # Append the map's options at the _start_ if there are any options already
- # (ie. myopt -> $2,myopt), otherwise just append them at the end.
- if [ -z "$2" ]; then
- /usr/bin/ypcat -k "$map" 2> /dev/null | sed -e '/^#/d' -e '/^$/d'
- else
- /usr/bin/ypcat -k "$map" 2> /dev/null |
- sed -e '/^#/d' -e '/^$/d' \
- -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]\+-\([^ \t]\+\)/\1 \2 $2,\3/" \
- -e "s/^[ \t]*\([^ \t]\+\)[ \t]\+\([^ \t]\+\)[ \t]*$/\1 \2 $2/"
- fi
-}
-
-getfilemounts()
-{
- if [ -f /etc/auto.master ] ; then
- cat /etc/auto.master | awk '{print $0}' | sed -e '/^#/d' -e '/^$/d' | (
- while read auto_master_in
- do
- if [ "`echo $auto_master_in | grep '^\+'`" = "" ]; then
- echo $auto_master_in
- else
- cat /etc/auto.master | grep '^\+' | sed -e '/^#/d' -e '/^$/d' | (
- while read map options; do
- catnismap `echo "$map" | sed -e 's/^\+//'` $options
- done
- )
- fi
- done
- )
- fi
-}
-
-getnismounts()
-{
- YPMAP=`catnismap auto.master`
- if [ -z "$YPMAP" ]; then
- catnismap
- else
- catnismap auto.master
- fi
-}
-
-getldapmounts()
-{
- if [ -x /usr/lib/autofs/autofs-ldap-auto-master ]; then
- [ ! -z $LDAPURI ] && export LDAPURI="$LDAPURI"
- [ ! -z $LDAPBASE ] && export LDAPBASE="$LDAPBASE"
- /usr/lib/autofs/autofs-ldap-auto-master 2> /dev/null
- /usr/lib/autofs/autofs-ldap-auto-master -m automountMap \
- -e automount -n ou -k cn -v automountInformation 2> /dev/null
- fi
-}
-
-getrawmounts()
-{
- for scheme in `getschemes` ; do
- case "$scheme" in
- files)
- if [ -z "$filescheme" ] ; then
- getfilemounts
- filescheme=1
- export filescheme
- fi
- ;;
- nis)
- if [ -z "$nisscheme" ] ; then
- getnismounts
- nisscheme=1
- export nisscheme
- fi
- ;;
- ldap*)
- if [ -z "$ldapscheme" ] ; then
- getldapmounts
- ldapscheme=1
- export ldapscheme
- fi
- ;;
- esac
- done
-}
-
-
-#
-# 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
-#
-getmounts()
-{
- local LC_ALL=C
- export LC_ALL
- knownmaps=" "
- getrawmounts | (
- while read dir map options
- do
- # These checks screen out duplicates and skip over directories
- # where the map is '-'.
- # We can't do empty or direct host maps, so don't bother trying.
-
- # Strip trailing slashes from the dir line if it exists to aid
- # in checking for duplicate maps
- dir=`echo "$dir" | sed -e "s/\/*$//"`
-
- if [ ! -z "$map" -a "$map" = "-hosts" ] ; then
- continue
- fi
-
- if [ $DISABLE_DIRECT -eq 1 \
- -a x`echo $dir | grep -E "^/-"` != 'x' ]
- then
- continue
- fi
-
- # If possible, canonicalise the path so it will always unmount
- # cleanly.
- link=`readlink -f "$dir"`
- if [ ! -z "$link" ]; then
- dir="$link"
- fi
-
- # Do not include a map if it is a duplicate, maps on top of
- # another map or another map, maps on top of it.
- for knownmap in $knownmaps
- do
- if [ "`echo $dir/ | grep ^$knownmap`" != "" \
- -o "`echo $knownmap | grep ^$dir/`" != "" \]
- then
- continue 2
- fi
- done
-
- if [ ! -z "$dir" -a ! -z "$map" \
- -a x`echo "$map" | cut -c1` != 'x-' ]
- then
- # If the options include a -t or --timeout, a -g or --ghost,
- # a -v or --verbose or a -d or --debug paramter, then pull
- # those particular options out.
- : echo DAEMONOPTIONS OPTIONS $daemonoptions $options
- startupoptions=
- if echo "$options" | grep -qE -- '\B-(t\b|-timeout\b=)' ;
- then
- startupoptions="--timeout=$(echo $options |\
- sed 's/.*-\(t[^0-9]*\|-timeout\)[ \t=]*\([0-9][0-9]*\).*$/\2/g')"
- elif echo "$daemonoptions" | grep -q -- '-t' ;
- then
- # It's okay to be sloppy with DAEMONOPTIONS as there is no
- # possibility of conflicting with mount or map options.
- startupoptions="--timeout=$(echo $daemonoptions | \
- sed 's/.*--*t\(imeout\)*[ \t=]*\([0-9][0-9]*\).*$/\2/g')"
- fi
-
- # Check for the ghost option
- if echo "$daemonoptions $options" | grep -qE -- '\B-(g\b|-ghost\b)' ;
- then
- startupoptions="$startupoptions --ghost"
- fi
- # Dont even deal with conflicts between --ghost and [no]browse
- # Its just insane to configure things like that.
- if echo "$options" | grep -qE -- '\B-browse\b' ;
- then
- startupoptions="$startupoptions --ghost"
- fi
- # Check for verbose
- if echo "$daemonoptions $options" | \
- grep -qE -- '\B-(v\b|-verbose\b)' ;
- then
- startupoptions="$startupoptions --verbose"
- fi
-
- # Check for debug
- if echo "$daemonoptions $options" | \
- grep -qE -- '\B-(d\b|-debug\b)' ;
- then
- startupoptions="$startupoptions --debug"
- fi
-
- # Other option flags are intended for maps.
- mapoptions="$(echo "$daemonoptions $options" |\
- sed 's/-\(t[^0-9]*\|-timeout\)[ \t=]*\([0-9][0-9]*\)//g' |
- sed 's/-\(g\b\|-ghost\b\)//g' |
- sed 's/-\(v\b\|-verbose\b\)//g' |
- sed 's/-\(d\b\|-debug\b\)//g' |
- sed 's/-\b\(no\)\?browse\b//g')"
-
- # 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 [ "$map" = "hesiod" -o "$map" = "userhome" -o "$map" = "ldap" ] ; then
- maptype=$map
- map=
- elif [ "$map" = "multi" ] ; then
- maptype=$map
- map=
-# elif echo "$map" | grep -q '^!'; then
-# map=`echo "$map"| sed -e 's/^!//g'`
- elif `echo $map | grep -q "^/"` && [ -x "$map" ]; then
- maptype=program
- elif [ -x "/etc/$map" ]; then
- maptype=program
- map=`echo /etc/$map | sed 's^//^/^g'`
- elif `echo $map | grep -q "^/"` && [ -f "$map" ]; then
- maptype=file
- elif [ -f "/etc/$map" ]; then
- maptype=file
- map=`echo /etc/$map | sed 's^//^/^g'`
- else
- maptype=yp
- if [ "$UNDERSCORETODOT" = "1" ] ; then
- map=`basename $map | sed -e s/^auto_home/auto.home/ -e s/^auto_mnt/auto.mnt/`
- else
- map=`basename $map | sed 's^//^/^g'`
- fi
- fi
- fi
- map=`echo $map | cut -f2- -d:`
-
- : echo STARTUPOPTIONS $startupoptions
- : echo DIR $dir
- : echo MAPTYPE $maptype
- : echo MAP $map
- : echo MAPOPTIONS $mapoptions
- : echo LOCALOPTIONS $localoptions
-
- NEWOPTIONS=""
- for m in $mapoptions
- do
- if [ x"$m" = x"--" ]; then
- NEWOPTIONS="$NEWOPTIONS $localoptions --"
- else
- NEWOPTIONS="$NEWOPTIONS $m"
- fi
- done
- mapoptions=$NEWOPTIONS
-
- echo "$DAEMON $startupoptions $dir $maptype $map $mapoptions $localoptions" | sed -e 's/ / /g' -e 's/ */ /g'
-
- : echo ------------------------
- knownmaps=" $dir/ $knownmaps"
- fi
- done
- )
-}
-
-#
-# Status lister.
-#
-status()
-{
- echo -e $"Configured Mount Points:\n------------------------"
- getmounts
- echo ""
- echo -e $"Active Mount Points:\n--------------------"
- ps axwww|grep "[0-9]:[0-9][0-9] $DAEMON " | (
- while read pid tt stat time command; do echo $command; done
- )
-}
-
-get_command_from_pid()
-{
- ps ax | grep "[0-9]:[0-9][0-9] $DAEMON " | (
- while read pid tt stat time command; do
- if [ "$pid" = "$1" ] ; then
- echo `echo "$command" | \
- sed 's/--pid-file.*\.pid/ /'`
- return 0
- fi
- done
- )
- return 0
-}
-
-# return true if at least one pid is alive
-alive()
-{
- if [ -z "$*" ]; then
- return 1
- fi
- for i in $*; do
- if kill -0 $i 2> /dev/null; then
- return 0
- fi
- done
-
- return 1
-}
-
-#
-# Find pids of process group leaders
-#
-get_pgrp_pids()
-{
- ps -eo pid,pgrp,cmd|grep $DAEMON|\
- awk '{print $1,$2}'|\
- while read pid pgrp
- do
- if [ $pid -eq $pgrp ]
- then
- echo $pid
- fi
- done
-}
-
-#
-# Signal each automount process group leader
-#
-signal_automounts()
-{
- RETVAL=0
- pgrp_pids=`get_pgrp_pids`
- for pid in $pgrp_pids
- do
- kill -USR2 $pid 2 > /dev/null
- count=0
- while ps ax|grep -v grep|grep $pid >/dev/null
- do
- sleep 1
- count=$(expr $count + 1)
- if [ $count -gt $DAEMON_EXIT_WAIT ]; then
- break;
- fi
- done
- done
-
- if [ -n "`pidof $DAEMON`" ] ; then
- RETVAL=1
- fi
-
- return $RETVAL
-}
-
-umount_loopback()
-{
- loops=`LC_ALL=C awk '!/^#/ && $1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts`
- automounts=`LC_ALL=C awk '!/^#/ && $1 ~ /^automount/ {print $2}' /proc/mounts`
-
- for l in $loops
- do
- # If a loop device is mounted into a subdir of the automount point,
- # umount it here.
- for a in $automounts
- do
- match=`echo $l | grep -E "^$a[\$|/]" || true`
- if [ -n "$match" ]; then
- echo ""
- echo -n $"Unmounting loopback filesystem $match: "
- loopdev=`LC_ALL=C grep $l /proc/mounts | awk '{print $1}'`
- umount -d $match
- if [ $? -eq 0 ]; then
- echo "done"
- else
- echo "failed ($?)"
- fi
- fi
- done
- done
-
- # If the loop device file exists under the automount point, umount
- # it here.
- loopmnts=`LC_ALL=C awk '!/^#/ && $1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts`
- for l in $loopmnts
- do
- loopmnt=`losetup $l | awk -F\( '{print $2}' | awk -F\) '{print $1}'`
- for a in $automounts
- do
- match=`echo $loopmnt | grep -E "^$a[\$|/]" || true`
- if [ -n "$match" ]; then
- echo ""
- echo -n $"Unmounting loopback filesystem $match: "
- umount -d $match
- if [ $? -eq 0 ]; then
- echo "done"
- else
- echo "failed ($?)"
- fi
- fi
- done
- done
-}
-
-#
-# Redhat start/stop 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 autofs4 || /sbin/modprobe -k autofs) 2> /dev/null
- echo -n $"Starting $prog: "
- TMP=`mktemp /tmp/autofs.XXXXXX` || { echo $"could not make temp file" >& 2; exit 1; }
- getmounts | tee $TMP | sh
- RETVAL=$?
- if [ -s $TMP ] ; then
- if [ $RETVAL -eq 0 ] ; then
- success "$prog startup"
- else
- failure "$prog startup"
- fi
- [ $RETVAL = 0 ] && touch /var/lock/subsys/autofs
- else
- echo -n $"No Mountpoints Defined"
- success "$prog startup"
- fi
- rm -f $TMP
- echo
- ;;
- stop)
- echo -n $"Stopping $prog:"
- if [ -z "`pidofproc $prog`" -a -z "`getmounts`" ]; then
- RETVAL=0
- else
- umount_loopback
- signal_automounts
- RETVAL=$?
- fi
- count=0
- while [ -n "`/sbin/pidof $DAEMON`" -a $count -lt 10 ] ; do
- killproc $DAEMON -USR2 >& /dev/null
- RETVAL=$?
- [ $RETVAL = 0 -a -z "`/sbin/pidof $DAEMON`" ] || sleep 3
- count=`expr $count + 1`
- done
- umount -a -f -t autofs
- rm -f /var/lock/subsys/autofs
- if [ -n "`/sbin/pidof $DAEMON`" ] ; then
- failure "$prog shutdown"
- else
- success "$prog shutdown"
- fi
- echo
- ;;
- restart)
- redhat stop
- redhat start
- ;;
- reload)
- if [ ! -f /var/lock/subsys/autofs ]; then
- echo $"$prog 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 2> /dev/null
- echo $"Stop $command"
- fi
- else
- kill -HUP $pid 2> /dev/null
- echo $"Reload map $command"
- 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: $0 {start|stop|restart|reload|condrestart|status}"
- RETVAL=0
-esac
-}
-
-#
-# Debian start/stop functions.
-#
-debian()
-{
-
-case "$1" in
-start)
- echo -n 'Starting automounter:'
-
- # make sure autofs4 is loaded
- if ! grep -q autofs /proc/filesystems
- then
- # autofs filesystem support not loaded
- echo -n ' loading autofs4 kernel module,'
- modprobe autofs4 || true
- elif ([ -f /proc/modules ] && lsmod) | grep -q autofs[^4]; then
- # wrong autofs filesystem module loaded
- echo
- echo "WARNING: autofs kernel module is loaded, autofs4 needed"
- echo " for correct behaviour. You might experience mount failures."
- fi
-
- # Check that maps exist
- if [ -z "$(getrawmounts)" ]
- then
- echo " no automount maps defined."
- exit 0
- fi
-
- # ensure pid file directory exists
- if [ ! -e /var/run/autofs ]
- then
- mkdir /var/run/autofs
- fi
-
- getmounts | while read cmd rest
- do
- mnt=`echo $rest | sed 's/^.* \(\/[^ ]*\) [A-Za-z].*$/\1/'`
- pidfile=/var/run/autofs/`echo $mnt | sed 's,/,_,g'`.pid
-
- start-stop-daemon --start --pidfile $pidfile --quiet \
- --exec $DAEMON -- --pid-file=$pidfile $rest
-
- ret=$?
-
- if [ $ret -ne 0 ]
- then
- echo
- echo " failed to start automount point $mnt"
- fi
- done
-
- echo " done."
- ;;
-stop)
- echo -n 'Stopping automounter:'
-
- umount_loopback
-
- any=0
- for file in `ls /var/run/autofs/*.pid 2>/dev/null`
- do
- if [ -e "$file" ]
- then
- any=1
- pid=`head -n 1 $file`
- mnt=`ps -wwo 'cmd=' $pid | sed -e \
- 's,.* --pid-file=/var/run/autofs/\([^ ]*\)\.pid.*,\1,; s,_,/,g'`
- dname=`basename $DAEMON`
-
- start-stop-daemon --stop --quiet \
- --retry USR2/$DAEMON_EXIT_WAIT \
- --pidfile $file --name $dname
-
- ret=$?
-
- case $ret in
- 0)
-# echo -n " $mnt"
- rm -f $file
- ;;
- 1)
- echo -n -e "\n No process for automount $mnt"
- rm -f $file
- ;;
- 2)
- echo -n -e "\n Couldn't stop automount for $mnt"
- ;;
- *)
- echo -n -e \
- "\n Strange start-stop-daemon exit status: $ret"
- ;;
- esac
- fi
- done
-
- echo " done."
- ;;
-reload)
- echo "Reloading automounter: checking for changes ... "
-
- TMP1=`mktemp -t autofs.XXXXXX`
- TMP2=`mktemp -t autofs.XXXXXX`
-
- getmounts >$TMP1
-
- for i in `ls /var/run/autofs/*.pid 2>/dev/null`
- do
- pid=`head -n 1 $i 2>/dev/null`
- [ "$pid" = "" ] && continue
-
- cmd=`get_command_from_pid $pid`
- echo $cmd >>$TMP2
-
- mnt=`ps -wwo 'cmd=' $pid | sed -e \
- 's,.* --pid-file=/var/run/autofs/\([^ ]*\)\.pid.*,\1,; s,_,/,g'`
-
- if ! grep -q "$cmd" $TMP1; then
- echo "Stopping automounter for: $mnt"
- kill -USR2 $pid 2> /dev/null
- else
- echo "Reloading automounter map for: $mnt"
- kill -HUP $pid 2> /dev/null
- fi
- done
-
- cat $TMP1 | (while read x; do
- if ! grep -q "^$x" $TMP2; then
- echo $x | while read cmd rest; do
-
- mnt=`echo $rest | sed 's/^.* \(\/[^ ]*\) [A-Za-z].*$/\1/'`
- pidfile=/var/run/autofs/`echo $mnt | sed 's,/,_,g'`.pid
-
- start-stop-daemon --start --pidfile $pidfile --quiet \
- --exec $DAEMON -- --pid-file=$pidfile $rest
-
- ret=$?
-
- if [ $ret -ne 0 ]
- then
- echo
- echo " failed to start automount point $mnt"
- else
- echo "Started automounter: $mnt"
- fi
- done
- fi
- done)
-
- rm -f $TMP1 $TMP2
- ;;
-force-reload|restart)
- debian stop
- debian start
- ;;
-status)
- status
- ;;
-getmounts)
- getmounts
- ;;
-active)
- alive
- ;;
-*)
- echo "Usage: $initdir/autofs {start|stop|restart|reload|status|getmounts|active}" >&2
- exit 1
- ;;
-esac
-}
-
-RETVAL=0
-if [ $system = debian ]; then
- debian "$@"
-elif [ $system = redhat ]; then
- redhat "$@"
-fi
-
-exit $RETVAL