]> git.decadent.org.uk Git - nfs-utils.git/blob - debian/nfs-common.init
Imported Debian patch 1.1.1-6
[nfs-utils.git] / debian / nfs-common.init
1 #!/bin/sh
2
3 ### BEGIN INIT INFO
4 # Provides:          nfs-common
5 # Required-Start:    $portmap $time
6 # Required-Stop:     $time
7 # Default-Start:     2 3 4 5 S
8 # Default-Stop:      0 1 6
9 # Short-Description: NFS support files common to client and server
10 # Description:       NFS is a popular protocol for file sharing across
11 #                    TCP/IP networks. This service provides various
12 #                    support functions for NFS mounts.
13 ### END INIT INFO
14
15 # What is this?
16 DESC="NFS common utilities"
17
18 # Read config
19 DEFAULTFILE=/etc/default/nfs-common
20 PREFIX=
21 NEED_STATD=yes
22 NEED_IDMAPD=
23 NEED_GSSD=
24 PIPEFS_MOUNTPOINT=/var/lib/nfs/rpc_pipefs
25 RPCGSSDOPTS=
26 if [ -f $DEFAULTFILE ]; then
27     . $DEFAULTFILE
28 fi
29
30 . /lib/lsb/init-functions
31
32 # Exit if required binaries are missing.
33 [ -x $PREFIX/sbin/rpc.statd ] || exit 0
34
35 #
36 # Parse the fstab file, and determine whether we need idmapd and gssd. (The
37 # /etc/defaults settings, if any, will override our autodetection.) This code
38 # is partially adapted from the mountnfs.sh script in the sysvinit package.
39 #
40 AUTO_NEED_IDMAPD=no
41 AUTO_NEED_GSSD=no
42
43 if [ -f /etc/fstab ]; then
44     exec 9<&0 </etc/fstab
45
46     while read DEV MTPT FSTYPE OPTS REST
47     do
48         if [ "$FSTYPE" = "nfs4" ]; then
49             AUTO_NEED_IDMAPD=yes
50         fi
51         case "$OPTS" in
52             sec=krb5|*,sec=krb5|sec=krb5,*|*,sec=krb5i,*|sec=krb5i|*,sec=krb5i|sec=krb5i,*|*,sec=krb5i,*|sec=krb5p|*,sec=krb5p|sec=krb5p,*|*,sec=krb5p,*)
53             AUTO_NEED_GSSD=yes
54             ;;
55         esac
56     done
57
58     exec 0<&9 9<&-
59 fi
60
61 #
62 # We also need idmapd if we run an NFSv4 server. It's fairly difficult
63 # to autodetect whether there are NFSv4 exports or not, and idmapd is not a
64 # particularily heavy daemon, so we auto-enable it if we find an /etc/exports
65 # file. This does not mean that there are NFSv4 or other mounts active (or
66 # even that nfs-kernel-server is installed), but it matches what the "start"
67 # condition in nfs-kernel-server's init script does, which has a value in
68 # itself.
69 #
70 if [ -f /etc/exports ] && grep -q '^[[:space:]]*[^#]*/' /etc/exports; then
71     AUTO_NEED_IDMAPD=yes
72 fi
73
74 case "$NEED_IDMAPD" in
75     yes|no)     
76         ;;
77     *)
78         NEED_IDMAPD=$AUTO_NEED_IDMAPD
79         ;;
80 esac
81
82 case "$NEED_GSSD" in
83     yes|no)     
84         ;;
85     *)
86         NEED_GSSD=$AUTO_NEED_GSSD
87         ;;
88 esac
89
90 do_modprobe() {
91     if [ -x /sbin/modprobe -a -f /proc/modules ]
92     then
93         modprobe -q "$1" || true
94     fi
95 }
96
97 do_mount() {
98     if ! grep -E -qs "$1\$" /proc/filesystems
99     then
100         return 1
101     fi
102     if ! mountpoint -q "$2"
103     then
104         mount -t "$1" "$1" "$2"
105         return
106     fi
107     return 0
108 }
109
110 do_umount() {
111     if mountpoint -q "$1"
112     then
113         umount "$1"
114     fi
115     return 0
116 }
117
118 # See how we were called.
119 case "$1" in
120   start)
121         log_daemon_msg "Starting $DESC"
122
123         if [ "$NEED_STATD" = yes ]; then
124             log_progress_msg "statd"
125             start-stop-daemon --start --oknodo --quiet \
126                 --exec $PREFIX/sbin/rpc.statd -- $STATDOPTS
127             RET=$?
128             if [ $RET != 0 ]; then
129                 log_end_msg $RET
130                 exit $RET
131             fi
132         fi
133
134         # Don't start idmapd and gssd if we don't have them (say, if /usr is not
135         # up yet).
136         [ -x /usr/sbin/rpc.idmapd ] || NEED_IDMAPD=no
137         [ -x /usr/sbin/rpc.gssd   ] || NEED_GSSD=no
138
139         if [ "$NEED_IDMAPD" = yes ] || [ "$NEED_GSSD" = yes ]
140         then
141             do_modprobe nfs
142             do_modprobe nfs4
143             if do_mount rpc_pipefs $PIPEFS_MOUNTPOINT
144             then
145                 if [ "$NEED_IDMAPD" = yes ]
146                 then
147                     log_progress_msg "idmapd"
148                     start-stop-daemon --start --oknodo --quiet \
149                             --exec /usr/sbin/rpc.idmapd
150                     RET=$?
151                     if [ $RET != 0 ]; then
152                         log_end_msg $RET
153                         exit $RET
154                     fi
155                 fi
156                 if [ "$NEED_GSSD" = yes ]
157                 then
158                     do_modprobe rpcsec_gss_krb5
159                     log_progress_msg "gssd"
160
161                     # we need this available; better to fail now than
162                     # mysteriously on the first mount
163                     if ! grep -q -E '^nfs[       ]' /etc/services; then
164                         log_action_end_msg 1 "broken /etc/services, please see /usr/share/doc/nfs-common/README.Debian.nfsv4"
165                         exit 1
166                     fi
167
168                     start-stop-daemon --start --oknodo --quiet \
169                             --exec /usr/sbin/rpc.gssd -- $RPCGSSDOPTS
170                     RET=$?
171                     if [ $RET != 0 ]; then
172                         log_end_msg $RET
173                         exit $RET
174                     fi
175                 fi
176             fi
177         fi
178         log_end_msg 0
179         ;;
180
181   stop)
182         log_daemon_msg "Stopping $DESC"
183
184         if [ "$NEED_GSSD" = yes ]
185         then
186             log_progress_msg "gssd"
187             start-stop-daemon --stop --oknodo --quiet \
188                     --name rpc.gssd
189             RET=$?
190             if [ $RET != 0 ]; then
191                 log_end_msg $RET
192                 exit $RET
193             fi
194         fi
195         if [ "$NEED_IDMAPD" = yes ]
196         then
197             log_progress_msg "idmapd"
198             start-stop-daemon --stop --oknodo --quiet \
199                 --name rpc.idmapd
200             RET=$?
201             if [ $RET != 0 ]; then
202                 log_end_msg $RET
203                 exit $RET
204             fi
205         fi
206         if [ "$NEED_STATD" = yes ]
207         then
208             log_progress_msg "statd"
209             start-stop-daemon --stop --oknodo --quiet \
210                 --name rpc.statd
211             RET=$?
212             if [ $RET != 0 ]; then
213                 log_end_msg $RET
214                 exit $RET
215             fi
216         fi
217         do_umount $PIPEFS_MOUNTPOINT 2>/dev/null || true
218         log_end_msg 0
219         ;;
220
221   status)
222         if [ "$NEED_STATD" = yes ]
223         then
224             if ! pidof rpc.statd >/dev/null
225             then
226                 echo "rpc.statd not running"
227                 exit 3
228             fi
229         fi
230
231         if [ "$NEED_GSSD" = yes ]
232         then
233             if ! pidof rpc.gssd >/dev/null
234             then
235                 echo "rpc.gssd not running"
236                 exit 3
237             fi
238         fi
239
240         if [ "$NEED_IDMAPD" = yes ]
241         then
242             if ! pidof rpc.idmapd >/dev/null
243             then
244                 echo "rpc.idmapd not running"
245                 exit 3
246             fi
247         fi
248
249         echo "all daemons running"
250         exit 0
251         ;;
252
253   restart | force-reload)
254         $0 stop
255         sleep 1
256         $0 start
257         ;;
258
259   *)
260         log_success_msg "Usage: nfs-common {start|stop|status|restart}"
261         exit 1
262         ;;
263 esac
264
265 exit 0