File autofs-suse-autofs_init.patch of Package autofs
Index: autofs-5.0.3/samples/rc.autofs.in
===================================================================
--- autofs-5.0.3.orig/samples/rc.autofs.in 2008-01-14 05:39:16.000000000 +0100
+++ autofs-5.0.3/samples/rc.autofs.in 2008-10-24 18:03:01.000000000 +0200
@@ -1,117 +1,215 @@
#!/bin/bash
+# Copyright (C) 2008 SUSE Linux Products GmbH, Nuernberg, Germany.
#
-# rc file for automount using a Sun-style "master map".
-#
-# On most distributions, this file should be called:
-# /etc/rc.d/init.d/autofs or /etc/init.d/autofs or /etc/rc.d/rc.autofs
-#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+### BEGIN INIT INFO
+# Provides: autofs
+# Required-Start: $network $syslog $remote_fs
+# Should-Start: $portmap ypbind keyserv ldap gssd
+# Required-Stop: $network $syslog $remote_fs
+# Should-Stop: $portmap ypbind keyserv ldap gssd
+# Default-Start: 3 5
+# Default-Stop:
+# Short-Description: automatic mounting of filesystems
+# Description: Start the autofs daemon for automatic mounting of filesystems.
+### END INIT INFO
#
# Location of the automount daemon and the init directory
#
-DAEMON=@@sbindir@@/automount
+DAEMON=/usr/sbin/automount
prog=`basename $DAEMON`
MODULE="autofs4"
-confdir=@@autofsconfdir@@
+confdir=/etc/sysconfig
+PIDFILE=/var/run/automount.pid
-test -e $DAEMON || exit 0
+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
+ . $confdir/autofs
fi
function start() {
- echo -n "Starting $prog: "
-
# Make sure autofs4 module is loaded
- if ! grep -q autofs /proc/filesystems
- then
- # Try load the autofs4 module fail if we can't
- modprobe $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
+ 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 -p $PIDFILE $AUTOFS_OPTIONS
- $prog $OPTIONS
- RETVAL=$?
- if [ $RETVAL -eq 0 ] ; then
- echo "done."
- else
- echo "failed."
- fi
- return $RETVAL
+ return $?
}
-function stop() {
- echo -n $"Stopping $prog: "
- count=0
- while [ -n "`pidof $DAEMON`" -a $count -lt 15 ] ; do
- killall -TERM $prog >& /dev/null
- RETVAL=$?
- [ $RETVAL = 0 -a -z "`pidof $DAEMON`" ] || sleep 3
- count=`expr $count + 1`
- done
- if [ -n "`pidof $DAEMON`" ] ; then
- echo "done."
- else
- echo "failed."
- fi
- return $RETVAL
-}
+function force_stop() {
+ # First send USR2 signal, automount will expire all non-busy
+ # filesystems and then terminate.
+ # Busy filesystems will be left mounted
+ /sbin/killproc -USR2 $DAEMON
+
+ # Let's wait a while for the daemon to really shut down
+ # in case of debug and browsable maps enabled this could take a while
+ for i in {0..30}; do
+ /sbin/checkproc $DAEMON || break
+ sleep 1
+ done
+ echo ""
+ # Coup de grace if it has not died yet
+ /sbin/checkproc $DAEMON && /sbin/killproc -KILL $DAEMON
+
+ # At this point there should not be any busy autofs filesystems mounted.
+ # To ensure that there are no leftovers, we lazy umount any remaining
+ # autofs filesystems 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
+ echo "$path still busy...unmounting lazy"
+ done
+ echo "$mnt still busy...unmounting lazy"
+ 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!
+ echo "$mnt still busy...unmounting lazy"
+ test -e $mnt && umount -l $mnt
+ test -e $mnt && umount -l $mnt
+ ;;
+ *) ;;
+ esac
+ done < /proc/mounts
-function restart() {
- stop
- start
+ return 0
}
-function reload() {
- pid=`pidof $DAEMON`
- if [ -z $pid ]; then
- echo $"$prog not running"
- RETVAL=1
- else
- kill -HUP $pid 2> /dev/null
- echo $"Reloading maps"
- RETVAL=0
- fi
- return $RETVAL
+function stop() {
+ # Normal stop, terminate daemon, we don't care about busy leftovers here
+ /sbin/killproc -p $PIDFILE -TERM $DAEMON
}
RETVAL=0
case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- restart
- ;;
- reload)
- reload
- ;;
- *)
- echo $"Usage: $0 {start|stop|restart|reload}"
- exit 1;
- ;;
-esac
-
-exit $?
+ 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 "
+ case "$RUNLEVEL" in
+ [016sS])
+ echo -n "(force) "
+ force_stop
+ ;;
+ *)
+ stop
+ ;;
+ esac
+
+ rc_status -v
+ ;;
+ force-stop)
+ echo -n "Shutting down $prog (force) "
+ force_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
+
+ ;;
+ force-expire)
+ # forcing expire of mounted filesystems
+ echo -n "$prog: force expire"
+ /sbin/killproc -USR1 $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|force-stop|status|try-restart|restart|force-reload|reload|force-expire}"
+ exit 1
+ ;;
+esac
+rc_exit