| 1 | #! /bin/sh |
| 2 | ### BEGIN INIT INFO |
| 3 | # Provides: openafs-client |
| 4 | # Required-Start: $remote_fs $network $time |
| 5 | # Required-Stop: $remote_fs $network |
| 6 | # Should-Start: $syslog $named openafs-fileserver |
| 7 | # Should-Stop: openafs-fileserver |
| 8 | # X-Stop-After: autofs |
| 9 | # Default-Start: 2 3 4 5 |
| 10 | # Default-Stop: 0 1 6 |
| 11 | # Short-Description: OpenAFS client |
| 12 | # Description: Starts or stops the OpenAFS client, loading the |
| 13 | # OpenAFS kernel module as necessary. |
| 14 | ### END INIT INFO |
| 15 | # |
| 16 | # Modified by Sam Hartman <hartmans@mit.edu> for Debian |
| 17 | # Copyright 2000, International Business Machines Corporation and others. |
| 18 | # All Rights Reserved. |
| 19 | # |
| 20 | # This software has been released under the terms of the IBM Public |
| 21 | # License. For details, see the LICENSE file in the top-level source |
| 22 | # directory or online at http://www.openafs.org/dl/license10.html |
| 23 | |
| 24 | # This init script bears little resemblence to the regular upstream init |
| 25 | # script at this point and is therefore maintained as a Debian-specific file. |
| 26 | # The upstream init script assumes Red Hat paths and uses insmod to load the |
| 27 | # module directly rather than using modprobe. |
| 28 | |
| 29 | PATH=/bin:/usr/bin:/sbin:/usr/sbin |
| 30 | |
| 31 | CACHEINFO=${CACHEINFO:-/etc/openafs/cacheinfo} |
| 32 | MODULEROOT=${MODULEROOT:-/lib/modules/`uname -r`} |
| 33 | MODULEDIR=${MODULEDIR:-$MODULEROOT/fs} |
| 34 | DKMSDIR=${DKMSDIR:-$MODULEROOT/updates/dkms} |
| 35 | |
| 36 | # Exit if the package is not installed. |
| 37 | [ -x /sbin/afsd ] || exit 0 |
| 38 | |
| 39 | # Define LSB log_* functions and get other support infrastructure. |
| 40 | . /lib/lsb/init-functions |
| 41 | |
| 42 | exec 3>/dev/null |
| 43 | exec </dev/null |
| 44 | |
| 45 | # Gather up options and post startup script name, if present |
| 46 | if [ -f /etc/openafs/afs.conf ]; then |
| 47 | . /etc/openafs/afs.conf |
| 48 | fi |
| 49 | |
| 50 | # Return 1 if the argument is "true". |
| 51 | is_on() { |
| 52 | if [ x"$1" = x"true" ] ; then |
| 53 | return 0 |
| 54 | else |
| 55 | return 1 |
| 56 | fi |
| 57 | } |
| 58 | |
| 59 | # Determine if kernel module loading is disabled. If it's not, don't attempt |
| 60 | # to stop or restart AFS, since we'll end up in a bad inconsistent state. |
| 61 | is_loading_disabled() { |
| 62 | disabled=`cat /proc/sys/kernel/modules_disabled 2>/dev/null` |
| 63 | if [ "$disabled" = 1 ] ; then |
| 64 | return 0 |
| 65 | else |
| 66 | return 1 |
| 67 | fi |
| 68 | } |
| 69 | |
| 70 | # Load the AFS client module if it's not already loaded. Set $MODULEDIR and |
| 71 | # $LIBAFS to override the default location and module name. Also check before |
| 72 | # loading whether the module is listed in the module dependencies so that we |
| 73 | # can exit with a 0 status in that case. |
| 74 | load_client() { |
| 75 | if [ -z "$LIBAFS" ] ; then |
| 76 | LIBAFS=openafs.ko |
| 77 | fi |
| 78 | if [ ! -f "$MODULEDIR/$LIBAFS" -a ! -f "$DKMSDIR/$LIBAFS" ] ; then |
| 79 | echo "" |
| 80 | cat <<EOF >&2 |
| 81 | AFS module $MODULEDIR/$LIBAFS does not exist. |
| 82 | Not starting AFS. Please consider building kernel modules using |
| 83 | instructions in /usr/share/doc/openafs-client/README.modules |
| 84 | EOF |
| 85 | # We must exit successfully here or openafs-client will fail on |
| 86 | # installation unless a module is installed. |
| 87 | exit 0 |
| 88 | fi |
| 89 | sawdep=0 |
| 90 | if grep -q openafs "$MODULEROOT/modules.dep" ; then |
| 91 | sawdep=1 |
| 92 | fi |
| 93 | LOADED=`/sbin/lsmod | fgrep openafs` |
| 94 | if [ -z "$LOADED" ] ; then |
| 95 | modprobe openafs |
| 96 | status=$? |
| 97 | if [ $status = 0 ] ; then |
| 98 | echo -n " openafs" |
| 99 | fi |
| 100 | |
| 101 | # We must exit successfully here if the openafs module just isn't |
| 102 | # listed in the dependency information for modprobe, which can happen |
| 103 | # if openafs-client and the module package are installed at the same |
| 104 | # time and the module hasn't been set up yet. |
| 105 | if [ $sawdep = 0 ] ; then |
| 106 | return 0 |
| 107 | else |
| 108 | return $status |
| 109 | fi |
| 110 | fi |
| 111 | return 0 |
| 112 | } |
| 113 | |
| 114 | # Determine which afsd options to use. /etc/openafs/afs.conf contains the |
| 115 | # settings that are checked here. |
| 116 | choose_afsd_options() { |
| 117 | if [ -z "$OPTIONS" ] || [ "$OPTIONS" = "AUTOMATIC" ] ; then |
| 118 | AFSD_OPTIONS="$VERBOSE" |
| 119 | else |
| 120 | AFSD_OPTIONS="$OPTIONS $VERBOSE" |
| 121 | fi |
| 122 | |
| 123 | # These variables are from /etc/openafs/afs.conf.client and are managed |
| 124 | # automatically by debconf. |
| 125 | if is_on $AFS_AFSDB ; then |
| 126 | AFSD_OPTIONS="$AFSD_OPTIONS -afsdb" |
| 127 | fi |
| 128 | if [ "$AFS_DYNROOT" = 'Yes' ] || [ "$AFS_DYNROOT" = 'true' ] ; then |
| 129 | AFSD_OPTIONS="$AFSD_OPTIONS -dynroot" |
| 130 | elif [ "$AFS_DYNROOT" = 'Sparse' ] ; then |
| 131 | AFSD_OPTIONS="$AFSD_OPTIONS -dynroot-sparse" |
| 132 | fi |
| 133 | if is_on $AFS_FAKESTAT ; then |
| 134 | AFSD_OPTIONS="$AFSD_OPTIONS -fakestat" |
| 135 | fi |
| 136 | } |
| 137 | |
| 138 | # Start afsd. Be careful not to start it if another one is already running, |
| 139 | # as that has a bad tendency to hang the system. Earlier versions of the |
| 140 | # openafs-client package put afsd in /usr/sbin. |
| 141 | start_client() { |
| 142 | if pidof /sbin/afsd >/dev/null || pidof /usr/sbin/afsd >/dev/null ; then |
| 143 | echo "." |
| 144 | else |
| 145 | choose_afsd_options |
| 146 | echo " afsd." |
| 147 | start-stop-daemon --start --quiet --exec /sbin/afsd -- $AFSD_OPTIONS |
| 148 | fi |
| 149 | |
| 150 | # From /etc/openafs/afs.conf.client, whether to enable fcrypt encryption. |
| 151 | if is_on $AFS_CRYPT ; then |
| 152 | fs setcrypt on |
| 153 | fi |
| 154 | |
| 155 | # From /etc/openafs/afs.conf, set a sysname list if one was configured. |
| 156 | if [ -n "$AFS_SYSNAME" ] ; then |
| 157 | fs sysname $AFS_SYSNAME |
| 158 | fi |
| 159 | } |
| 160 | |
| 161 | # Kill all processes that are accessing AFS. Not enabled by default, and |
| 162 | # normally called via kill_all_afs. |
| 163 | kill_afs() { |
| 164 | signal=$1 |
| 165 | mount=`grep ^'AFS ' /etc/mtab | awk '{ print $2 }'` |
| 166 | if [ -n "$mount" ] ; then |
| 167 | pids=`/usr/bin/lsof -Fp $mount | sed 's/p//'` |
| 168 | if [ -n "$pids" ] ; then |
| 169 | kill -$signal $pids > /dev/null 2>&1 |
| 170 | sleep 1 |
| 171 | fi |
| 172 | fi |
| 173 | } |
| 174 | |
| 175 | # Repeatedly call kill_afs for a series of signals to give AFS-using processes |
| 176 | # a hope of shutting down cleanly if the system is shutting down. Not enabled |
| 177 | # by default. Enable this in /etc/openafs/afs.conf. |
| 178 | # |
| 179 | # Warns and does nothing if lsof is not installed. |
| 180 | kill_all_afs() { |
| 181 | runlevel=`runlevel | sed 's/^. //'` |
| 182 | if [ "$runlevel" -eq 0 ] || [ "$runlevel" -eq 6 ] ; then |
| 183 | if [ -x /usr/bin/lsof ] ; then |
| 184 | echo -n "Killing processes with AFS files open: " |
| 185 | kill_afs HUP |
| 186 | kill_afs TERM |
| 187 | kill_afs ABRT |
| 188 | kill_afs KILL |
| 189 | echo "done." |
| 190 | else |
| 191 | echo '/usr/bin/lsof not found, not killing processes' >&2 |
| 192 | fi |
| 193 | fi |
| 194 | } |
| 195 | |
| 196 | |
| 197 | case "$1" in |
| 198 | start) |
| 199 | if is_on $AFS_CLIENT && test -x /sbin/afsd ; then |
| 200 | echo -n "Starting AFS services:" |
| 201 | if load_client ; then |
| 202 | start_client |
| 203 | $AFS_POST_INIT |
| 204 | else |
| 205 | echo "" |
| 206 | echo "Failed to load AFS kernel module, not starting AFS" >&2 |
| 207 | exit 1 |
| 208 | fi |
| 209 | fi |
| 210 | ;; |
| 211 | |
| 212 | force-start) |
| 213 | if test -x /sbin/afsd ; then |
| 214 | echo -n "Starting AFS services:" |
| 215 | if load_client ; then |
| 216 | start_client |
| 217 | $AFS_POST_INIT |
| 218 | else |
| 219 | echo "" |
| 220 | echo "Failed to load AFS kernel module, not starting AFS" >&2 |
| 221 | exit 1 |
| 222 | fi |
| 223 | fi |
| 224 | ;; |
| 225 | |
| 226 | stop|force-stop) |
| 227 | if is_loading_disabled ; then |
| 228 | echo "Module loading disabled, cannot stop AFS" >&2 |
| 229 | exit 1 |
| 230 | fi |
| 231 | $AFS_PRE_SHUTDOWN |
| 232 | echo -n "Stopping AFS services:" |
| 233 | if grep -q '^AFS ' /etc/mtab ; then |
| 234 | umount `grep ^'AFS ' /etc/mtab | awk '{ print $2 }'` |
| 235 | echo -n " afsd" |
| 236 | fi |
| 237 | if pidof /usr/sbin/afsd >/dev/null || pidof /sbin/afsd >/dev/null ; then |
| 238 | afsd -shutdown |
| 239 | fi |
| 240 | |
| 241 | # If running with the -rmtsys option, afsd doesn't kill the rmtsys helper |
| 242 | # on afsd -shutdown. Run start-stop-daemon to make sure that everything |
| 243 | # is dead. |
| 244 | start-stop-daemon --stop --quiet --name afsd |
| 245 | |
| 246 | LIBAFS=`/sbin/lsmod | awk 'BEGIN { FS = " " } /openafs/ { print $1 }'` |
| 247 | if [ -n "$LIBAFS" ] ; then |
| 248 | /sbin/rmmod $LIBAFS |
| 249 | echo -n " openafs" |
| 250 | fi |
| 251 | echo "." |
| 252 | ;; |
| 253 | |
| 254 | restart|force-reload) |
| 255 | "$0" stop |
| 256 | "$0" start |
| 257 | ;; |
| 258 | |
| 259 | *) |
| 260 | echo Usage: \ |
| 261 | 'openafs-client {start|force-start|stop|restart|force-reload}' >&2 |
| 262 | exit 1 |
| 263 | |
| 264 | esac |