]> git.decadent.org.uk Git - nfs-utils.git/blob - debian/nfs-common.init
Replace lsof usage with redirection to /dev/tcp
[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=
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         case $DEV in
49             ''|\#*)
50                 continue
51                 ;;
52         esac
53         if [ "$FSTYPE" = "nfs4" ]; then
54             AUTO_NEED_IDMAPD=yes
55         fi
56         case "$OPTS" in
57
58             sec=krb5|*,sec=krb5|sec=krb5,*|*,sec=krb5i,*|sec=krb5i|*,sec=krb5i|sec=krb5i,*|*,sec=krb5i,*|sec=krb5p|*,sec=krb5p|sec=krb5p,*|*,sec=krb5p,*)
59             AUTO_NEED_GSSD=yes
60             ;;
61         esac
62     done
63
64     exec 0<&9 9<&-
65 fi
66
67 #
68 # We also need idmapd if we run an NFSv4 server. It's fairly difficult
69 # to autodetect whether there are NFSv4 exports or not, and idmapd is not a
70 # particularily heavy daemon, so we auto-enable it if we find an /etc/exports
71 # file. This does not mean that there are NFSv4 or other mounts active (or
72 # even that nfs-kernel-server is installed), but it matches what the "start"
73 # condition in nfs-kernel-server's init script does, which has a value in
74 # itself.
75 #
76 if [ -f /etc/exports ] && grep -q '^[[:space:]]*[^#]*/' /etc/exports; then
77     AUTO_NEED_IDMAPD=yes
78 fi
79
80 case "$NEED_STATD" in
81     yes|no)
82         ;;
83     *)
84         NEED_STATD=yes
85         ;;
86 esac
87
88 case "$NEED_IDMAPD" in
89     yes|no)     
90         ;;
91     *)
92         NEED_IDMAPD=$AUTO_NEED_IDMAPD
93         ;;
94 esac
95
96 case "$NEED_GSSD" in
97     yes|no)     
98         ;;
99     *)
100         NEED_GSSD=$AUTO_NEED_GSSD
101         ;;
102 esac
103
104 do_modprobe() {
105     if [ -x /sbin/modprobe -a -f /proc/modules ]
106     then
107         modprobe -q "$1" || true
108     fi
109 }
110
111 do_mount() {
112     if ! grep -E -qs "$1\$" /proc/filesystems
113     then
114         return 1
115     fi
116     if ! mountpoint -q "$2"
117     then
118         mount -t "$1" "$1" "$2"
119         return
120     fi
121     return 0
122 }
123
124 do_umount() {
125     if mountpoint -q "$1"
126     then
127         umount "$1"
128     fi
129     return 0
130 }
131
132 # See how we were called.
133 case "$1" in
134   start)
135         log_daemon_msg "Starting $DESC"
136
137         if [ "$NEED_STATD" = yes ]; then
138             log_progress_msg "statd"
139             
140             # See if portmap or rpcbind are running
141             cat </dev/null >/dev/tcp/localhost/111
142             RET=$?
143             if [ $RET != 0 ]; then
144                 echo
145                 log_warning_msg "Not starting: portmap daemon is not running"
146                 exit 0
147             fi
148
149             start-stop-daemon --start --oknodo --quiet \
150                 --pidfile /var/run/rpc.statd.pid \
151                 --exec $PREFIX/sbin/rpc.statd -- $STATDOPTS
152             RET=$?
153             if [ $RET != 0 ]; then
154                 log_end_msg $RET
155                 exit $RET
156             else
157                 mkdir -p /lib/init/rw/sendsigs.omit.d
158                 rm -f /lib/init/rw/sendsigs.omit.d/statd
159                 ln -s /var/run/rpc.statd.pid /lib/init/rw/sendsigs.omit.d/statd
160             fi
161         fi
162
163         # Don't start idmapd and gssd if we don't have them (say, if /usr is not
164         # up yet).
165         [ -x /usr/sbin/rpc.idmapd ] || NEED_IDMAPD=no
166         [ -x /usr/sbin/rpc.gssd   ] || NEED_GSSD=no
167
168         if [ "$NEED_IDMAPD" = yes ] || [ "$NEED_GSSD" = yes ]
169         then
170             do_modprobe sunrpc
171             do_modprobe nfs
172             do_modprobe nfsd
173             if do_mount rpc_pipefs $PIPEFS_MOUNTPOINT
174             then
175                 if [ "$NEED_IDMAPD" = yes ]
176                 then
177                     log_progress_msg "idmapd"
178                     start-stop-daemon --start --oknodo --quiet \
179                             --exec /usr/sbin/rpc.idmapd
180                     RET=$?
181                     if [ $RET != 0 ]; then
182                         log_end_msg $RET
183                         exit $RET
184                     fi
185                 fi
186                 if [ "$NEED_GSSD" = yes ]
187                 then
188                     do_modprobe rpcsec_gss_krb5
189                     log_progress_msg "gssd"
190
191                     # we need this available; better to fail now than
192                     # mysteriously on the first mount
193                     if ! grep -q -E '^nfs[       ]' /etc/services; then
194                         log_action_end_msg 1 "broken /etc/services, please see /usr/share/doc/nfs-common/README.Debian.nfsv4"
195                         exit 1
196                     fi
197
198                     start-stop-daemon --start --oknodo --quiet \
199                             --exec /usr/sbin/rpc.gssd -- $RPCGSSDOPTS
200                     RET=$?
201                     if [ $RET != 0 ]; then
202                         log_end_msg $RET
203                         exit $RET
204                     fi
205                 fi
206             fi
207         fi
208         log_end_msg 0
209         ;;
210
211   stop)
212         log_daemon_msg "Stopping $DESC"
213
214         if [ "$NEED_GSSD" = yes ]
215         then
216             log_progress_msg "gssd"
217             start-stop-daemon --stop --oknodo --quiet \
218                     --name rpc.gssd
219             RET=$?
220             if [ $RET != 0 ]; then
221                 log_end_msg $RET
222                 exit $RET
223             fi
224         fi
225         if [ "$NEED_IDMAPD" = yes ]
226         then
227             log_progress_msg "idmapd"
228             start-stop-daemon --stop --oknodo --quiet \
229                 --name rpc.idmapd
230             RET=$?
231             if [ $RET != 0 ]; then
232                 log_end_msg $RET
233                 exit $RET
234             fi
235         fi
236         if [ "$NEED_STATD" = yes ]
237         then
238             log_progress_msg "statd"
239             start-stop-daemon --stop --oknodo --quiet \
240                 --name rpc.statd
241             RET=$?
242             if [ $RET != 0 ]; then
243                 log_end_msg $RET
244                 exit $RET
245             fi
246         fi
247         do_umount $PIPEFS_MOUNTPOINT 2>/dev/null || true
248         log_end_msg 0
249         ;;
250
251   status)
252         if [ "$NEED_STATD" = yes ]
253         then
254             if ! pidof rpc.statd >/dev/null
255             then
256                 echo "rpc.statd not running"
257                 exit 3
258             fi
259         fi
260
261         if [ "$NEED_GSSD" = yes ]
262         then
263             if ! pidof rpc.gssd >/dev/null
264             then
265                 echo "rpc.gssd not running"
266                 exit 3
267             fi
268         fi
269
270         if [ "$NEED_IDMAPD" = yes ]
271         then
272             if ! pidof rpc.idmapd >/dev/null
273             then
274                 echo "rpc.idmapd not running"
275                 exit 3
276             fi
277         fi
278
279         echo "all daemons running"
280         exit 0
281         ;;
282
283   restart | force-reload)
284         $0 stop
285         sleep 1
286         $0 start
287         ;;
288
289   *)
290         log_success_msg "Usage: nfs-common {start|stop|status|restart}"
291         exit 1
292         ;;
293 esac
294
295 exit 0