#! /bin/bash # Modified for Slackware by Eric Hameleers # # 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 15 85 # 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/rc.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 elif [ -f /etc/slackware-version ]; then system=slackware 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='--timeout 60' localoptions= # # 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 cat /etc/auto.master | sed -e '/^#/d' -e '/^$/d'| ( while read dir map options do if [ ! -z "$dir" -a ! -z "$map" \ -a x`echo "$map" | cut -c1` != 'x-' ] then map=`echo "/etc/$map" | sed -e 's:^/etc//:/:'` options=`echo "$options" | sed -e 's/\(^\|[ \t]\)-/\1/g'` if [ -x $map ]; then echo "$DAEMON $dir program $map $options $localoptions" elif [ -f $map ]; then echo "$DAEMON $dir file $map $options $localoptions" else echo "$DAEMON $dir `basename $map` $options $localoptions" fi fi done ) fi # # Check for YellowPage maps to be loaded # if [ -e /usr/bin/ypcat ] && [ `ypcat -k auto.master 2>/dev/null | wc -l` -gt 0 ] then ypcat -k auto.master | ( while read dir map options do if [ ! -z "$dir" -a ! -z "$map" \ -a x`echo "$map" | cut -c1` != 'x-' ] 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 options=`echo "$options" | sed -e ' s/--*t\(imeout\)*[ \t]*[0-9][0-9]*//g s/\(^\|[ \t]\)-/\1/g'` echo "$DAEMON $dir yp $map $options $localoptions" fi done ) fi } # # Status lister. # function status() { echo "Configured Mount Points:" echo "------------------------" getmounts echo "" echo "Active Mount Points:" echo "--------------------" ps ax|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) # Check if the automounter is already running? if [ ! -f /var/lock/subsys/autofs ]; then echo 'Starting automounter: ' getmounts | sh touch /var/lock/subsys/autofs fi ;; stop) kill -TERM $(/sbin/pidof /usr/sbin/automount) rm -f /var/lock/subsys/autofs ;; reload|restart) if [ ! -f /var/lock/subsys/autofs ]; then echo "Automounter not running" exit 1 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 ax|grep "[0-9]:[0-9][0-9] automount " | ( while read pid tt stat time command; do echo "$command" >>$TMP2 if ! grep -q "^$command" $TMP2; then kill -USR2 $pid echo "Stop $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 ;; *) echo "Usage: $initdir/autofs {start|stop|restart|reload|status}" exit 1 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 } # # Slackware start/stop functions. # function slackware() { # # 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/\//./g'`.pid if [ -s $pidfile ]; then echo -n " (already running)" else $DAEMON --pid-file $pidfile $mnt $rest until [ -s $pidfile ] do sleep 1 done echo "$cmd $mnt $rest" >> $pidfile fi done echo "." ;; stop) [ "$(/sbin/pidof $DAEMON)" = "" ] && exit 1 echo 'Stopping automounter.' kill -USR2 $(/sbin/pidof $DAEMON) ;; reload|restart) if [ "$(/sbin/pidof $DAEMON)" = "" ]; then echo "Automounter not running" exit 1 fi echo "Reloading automounter: checking for changes ... " TMP1=`mktemp /var/run/autofs.XXXXXX` getmounts >$TMP1 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" $TMP1 then echo "Stopping automounter: $command" kill -USR2 $pid fi done rm -f $TMP1 $thisscript start ;; status) status ;; *) echo "Usage: $initdir/rc.autofs {start|stop|restart|reload|status}" >&2 exit 1 ;; esac } if [ $system = debian ]; then debian "$@" elif [ $system = redhat ]; then redhat "$@" elif [ $system = slackware ]; then slackware "$@" fi exit 0