]> git.decadent.org.uk Git - nfs-utils.git/blob - debian/nfs-common.init
5c34c9e7ae1fae9b72216e5cc9e907ddde7a34b0
[nfs-utils.git] / debian / nfs-common.init
1 #!/bin/sh
2
3 ### BEGIN INIT INFO
4 # Provides:          nfs-common
5 # Required-Start:    $time
6 # Default-Start:     2 3 4 5
7 # Default-Stop:      0 1 6
8 # Short-Description: NFS support files common to client and server
9 # Description:       NFS is a popular protocol for file sharing across
10 #                    TCP/IP networks. This service provides various
11 #                    support functions for NFS mounts.
12 ### END INIT INFO
13
14 # What is this?
15 DESC="NFS common utilities"
16
17 # Read config
18 DEFAULTFILE=/etc/default/nfs-common
19 PREFIX=
20 NEED_LOCKD=
21 NEED_IDMAPD=
22 IDMAPD_PIDFILE=/var/run/rpc.idmapd.pid
23 NEED_GSSD=
24 GSSD_PIDFILE=/var/run/rpc.gssd.pid
25 PIPEFS_MOUNTPOINT=/var/lib/nfs/rpc_pipefs
26 RPCGSSDOPTS=
27 if [ -f $DEFAULTFILE ]; then
28     . $DEFAULTFILE
29 fi
30
31 . /lib/lsb/init-functions
32
33 # Determine whether lockd daemon is required.
34 case "$NEED_LOCKD" in
35 yes|no) ;;
36 *)  case `uname -r` in
37     '' | [01].* | 2.[0123].* )
38         # Older kernels may or may not need a lockd daemon.
39         # We must assume they do, unless we can prove otherwise.
40         # (A false positive here results only in a harmless message.)
41         NEED_LOCKD=yes
42         if test -f /proc/ksyms
43         then
44             grep -q lockdctl /proc/ksyms || NEED_LOCKD=no
45         fi
46         ;;
47
48     *)  # Modern kernels (>= 2.4) start a lockd thread automatically.
49         NEED_LOCKD=no
50         ;;
51     esac
52     ;;
53 esac
54
55 #
56 # Parse the fstab file, and determine whether we need idmapd and gssd. (The
57 # /etc/defaults settings, if any, will override our autodetection.) This code
58 # is partially adapted from the mountnfs.sh script in the sysvinit package.
59 #
60 AUTO_NEED_IDMAPD=no
61 AUTO_NEED_GSSD=no
62
63 exec 9<&0 </etc/fstab
64
65 while read DEV MTPT FSTYPE OPTS REST
66 do
67     if [ "$FSTYPE" = "nfs4" ]; then
68         AUTO_NEED_IDMAPD=yes
69     fi
70     case "$OPTS" in
71         sec=krb5|*,sec=krb5|sec=krb5,*|*,sec=krb5i,*|sec=krb5i|*,sec=krb5i|sec=krb5i,*|*,sec=krb5i,*|sec=krb5p|*,sec=krb5p|sec=krb5p,*|*,sec=krb5p,*)
72             AUTO_NEED_GSSD=yes
73         ;;
74     esac
75 done
76
77 exec 0<&9 9<&-
78
79 case "$NEED_IDMAPD" in
80     yes|no)     
81         ;;
82     *)
83         NEED_IDMAPD=$AUTO_NEED_IDMAPD
84         ;;
85 esac
86
87 case "$NEED_GSSD" in
88     yes|no)     
89         ;;
90     *)
91         NEED_GSSD=$AUTO_NEED_GSSD
92         ;;
93 esac
94
95 # Exit if required binaries are missing.
96 [ -x $PREFIX/sbin/rpc.statd ] || exit 0
97 [ -x $PREFIX/sbin/rpc.lockd ] || [ "$NEED_LOCKD"  = no ] || exit 0
98 [ -x /usr/sbin/rpc.idmapd   ] || [ "$NEED_IDMAPD" = no ] || exit 0
99 [ -x /usr/sbin/rpc.gssd     ] || [ "$NEED_GSSD"   = no ] || exit 0
100
101 do_modprobe() {
102     modprobe -q "$1" || true
103 }
104
105 do_mount() {
106     if ! grep -E -qs "$1\$" /proc/filesystems
107     then
108         return 1
109     fi
110     if ! mountpoint -q "$2"
111     then
112         mount -t "$1" "$1" "$2"
113         return
114     fi
115     return 0
116 }
117
118 do_umount() {
119     if mountpoint -q "$1"
120     then
121         umount "$1"
122     fi
123     return 0
124 }
125
126 # See how we were called.
127 case "$1" in
128   start)
129         log_daemon_msg "Starting $DESC"
130
131         log_progress_msg "statd"
132         start-stop-daemon --start --oknodo --quiet \
133             --exec $PREFIX/sbin/rpc.statd -- $STATDOPTS
134         if [ $? != 0 ]; then
135             log_end_msg $?
136             exit $?
137         fi
138
139         if [ "$NEED_LOCKD" = yes ]
140         then
141             log_progress_msg "lockd"
142             start-stop-daemon --start --oknodo --quiet \
143                 --exec $PREFIX/sbin/rpc.lockd
144             if [ $? != 0 ]; then
145                 log_end_msg $?
146                 exit $?
147             fi
148         fi
149         if [ "$NEED_IDMAPD" = yes ] || [ "$NEED_GSSD" = yes ]
150         then
151             do_modprobe nfs
152             do_modprobe nfs4
153             if do_mount rpc_pipefs $PIPEFS_MOUNTPOINT
154             then
155                 if [ "$NEED_IDMAPD" = yes ]
156                 then
157                     log_progress_msg "idmapd"
158                     start-stop-daemon --start --oknodo --quiet \
159                             --make-pidfile --pidfile $IDMAPD_PIDFILE \
160                             --exec /usr/sbin/rpc.idmapd
161                     if [ $? != 0 ]; then
162                         log_end_msg $?
163                         exit $?
164                     fi
165                 fi
166                 if [ "$NEED_GSSD" = yes ]
167                 then
168                     do_modprobe rpcsec_gss_krb5
169                     log_progress_msg "gssd"
170                     start-stop-daemon --start --oknodo --quiet \
171                             --make-pidfile --pidfile $GSSD_PIDFILE \
172                             --exec /usr/sbin/rpc.gssd -- $RPCGSSDOPTS
173                     if [ $? != 0 ]; then
174                         log_end_msg $?
175                         exit $?
176                     fi
177                 fi
178             fi
179         fi
180         log_end_msg 0
181         ;;
182
183   stop)
184         log_daemon_msg "Stopping $DESC"
185
186         if [ "$NEED_GSSD" = yes ]
187         then
188             log_progress_msg "gssd"
189             start-stop-daemon --stop --oknodo --quiet \
190                     --name rpc.gssd
191             if [ $? != 0 ]; then
192                 log_end_msg $?
193                 exit $?
194             fi
195             rm -f $GSSD_PIDFILE
196         fi
197         if [ "$NEED_IDMAPD" = yes ]
198         then
199             log_progress_msg "idmapd"
200             start-stop-daemon --stop --oknodo --quiet \
201                 --name rpc.idmapd
202             if [ $? != 0 ]; then
203                 log_end_msg $?
204                 exit $?
205             fi
206             rm -f $IDMAPD_PIDFILE
207         fi
208         if [ "$NEED_LOCKD" = yes ]
209         then
210             log_progress_msg "lockd"
211             start-stop-daemon --stop --oknodo --quiet \
212                 --name rpc.lockd
213             if [ $? != 0 ]; then
214                 log_end_msg $?
215                 exit $?
216             fi
217         else
218             pkill -KILL -u root -x lockd || true
219         fi
220         log_progress_msg "statd"
221         start-stop-daemon --stop --oknodo --quiet \
222             --name rpc.statd
223         if [ $? != 0 ]; then
224             log_end_msg $?
225             exit $?
226         fi
227         do_umount $PIPEFS_MOUNTPOINT 2>/dev/null || true
228         log_end_msg 0
229         ;;
230
231   status)
232         if ! pidof rpc.statd >/dev/null
233         then
234             echo "rpc.statd not running"
235             exit 3
236         fi
237
238         if [ "$NEED_GSSD" = yes ]
239         then
240             if [ ! -f "$GSSD_PIDFILE" ] || ! pidof rpc.gssd >/dev/null
241             then
242                 echo "rpc.statd running, but rpc.gssd halted"
243                 exit 3
244             fi
245         fi
246
247         if [ "$NEED_LOCKD" = yes ]
248         then
249             if ! pidof rpc.lockd >/dev/null
250             then
251                 echo "rpc.statd running, but rpc.lockd halted"
252                 exit 3
253             fi
254         fi
255             
256         if [ "$NEED_IDMAPD" = yes ]
257         then
258             if [ ! -f "$IDMAPD_PIDFILE" ] || ! pidof rpc.idmapd >/dev/null
259             then
260                 echo "rpc.statd running, but rpc.idmapd halted"
261                 exit 3
262             fi
263         fi
264
265         echo "rpc.statd running"
266         exit 0
267         ;;
268
269   restart | force-reload)
270         $0 stop
271         sleep 1
272         $0 start
273         ;;
274
275   *)
276         log_success_msg "Usage: nfs-common {start|stop|status|restart}"
277         exit 1
278         ;;
279 esac
280
281 exit 0