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