]> git.decadent.org.uk Git - nfs-utils.git/blob - debian/nfs-common.init
Imported Debian patch 1.1.1-4
[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             if [ $? != 0 ]; then
128                 log_end_msg $?
129                 exit $?
130             fi
131         fi
132
133         # Don't start idmapd and gssd if we don't have them (say, if /usr is not
134         # up yet).
135         [ -x /usr/sbin/rpc.idmapd ] || NEED_IDMAPD=no
136         [ -x /usr/sbin/rpc.gssd   ] || NEED_GSSD=no
137
138         if [ "$NEED_IDMAPD" = yes ] || [ "$NEED_GSSD" = yes ]
139         then
140             do_modprobe nfs
141             do_modprobe nfs4
142             if do_mount rpc_pipefs $PIPEFS_MOUNTPOINT
143             then
144                 if [ "$NEED_IDMAPD" = yes ]
145                 then
146                     log_progress_msg "idmapd"
147                     start-stop-daemon --start --oknodo --quiet \
148                             --exec /usr/sbin/rpc.idmapd
149                     if [ $? != 0 ]; then
150                         log_end_msg $?
151                         exit $?
152                     fi
153                 fi
154                 if [ "$NEED_GSSD" = yes ]
155                 then
156                     do_modprobe rpcsec_gss_krb5
157                     log_progress_msg "gssd"
158
159                     # we need this available; better to fail now than
160                     # mysteriously on the first mount
161                     if ! grep -q -E '^nfs[       ]' /etc/services; then
162                         log_action_end_msg 1 "broken /etc/services, please see /usr/share/doc/nfs-common/README.Debian.nfsv4"
163                         exit 1
164                     fi
165
166                     start-stop-daemon --start --oknodo --quiet \
167                             --exec /usr/sbin/rpc.gssd -- $RPCGSSDOPTS
168                     if [ $? != 0 ]; then
169                         log_end_msg $?
170                         exit $?
171                     fi
172                 fi
173             fi
174         fi
175         log_end_msg 0
176         ;;
177
178   stop)
179         log_daemon_msg "Stopping $DESC"
180
181         if [ "$NEED_GSSD" = yes ]
182         then
183             log_progress_msg "gssd"
184             start-stop-daemon --stop --oknodo --quiet \
185                     --name rpc.gssd
186             if [ $? != 0 ]; then
187                 log_end_msg $?
188                 exit $?
189             fi
190         fi
191         if [ "$NEED_IDMAPD" = yes ]
192         then
193             log_progress_msg "idmapd"
194             start-stop-daemon --stop --oknodo --quiet \
195                 --name rpc.idmapd
196             if [ $? != 0 ]; then
197                 log_end_msg $?
198                 exit $?
199             fi
200         fi
201         if ["$NEED_STATD" = yes ]
202         then
203             log_progress_msg "statd"
204             start-stop-daemon --stop --oknodo --quiet \
205                 --name rpc.statd
206             if [ $? != 0 ]; then
207                 log_end_msg $?
208                 exit $?
209             fi
210         fi
211         do_umount $PIPEFS_MOUNTPOINT 2>/dev/null || true
212         log_end_msg 0
213         ;;
214
215   status)
216         if [ "$NEED_STATD" = yes ]
217         then
218             if ! pidof rpc.statd >/dev/null
219             then
220                 echo "rpc.statd not running"
221                 exit 3
222             fi
223         fi
224
225         if [ "$NEED_GSSD" = yes ]
226         then
227             if ! pidof rpc.gssd >/dev/null
228             then
229                 echo "rpc.gssd not running"
230                 exit 3
231             fi
232         fi
233
234         if [ "$NEED_IDMAPD" = yes ]
235         then
236             if ! pidof rpc.idmapd >/dev/null
237             then
238                 echo "rpc.idmapd not running"
239                 exit 3
240             fi
241         fi
242
243         echo "all daemons running"
244         exit 0
245         ;;
246
247   restart | force-reload)
248         $0 stop
249         sleep 1
250         $0 start
251         ;;
252
253   *)
254         log_success_msg "Usage: nfs-common {start|stop|status|restart}"
255         exit 1
256         ;;
257 esac
258
259 exit 0