]> git.decadent.org.uk Git - nfs-utils.git/blob - debian/nfs-common.init
Imported Debian patch 1.1.2-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=
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             do_modprobe nfs
152             do_modprobe nfsd
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                             --exec /usr/sbin/rpc.idmapd
160                     RET=$?
161                     if [ $RET != 0 ]; then
162                         log_end_msg $RET
163                         exit $RET
164                     fi
165                 fi
166                 if [ "$NEED_GSSD" = yes ]
167                 then
168                     do_modprobe rpcsec_gss_krb5
169                     log_progress_msg "gssd"
170
171                     # we need this available; better to fail now than
172                     # mysteriously on the first mount
173                     if ! grep -q -E '^nfs[       ]' /etc/services; then
174                         log_action_end_msg 1 "broken /etc/services, please see /usr/share/doc/nfs-common/README.Debian.nfsv4"
175                         exit 1
176                     fi
177
178                     start-stop-daemon --start --oknodo --quiet \
179                             --exec /usr/sbin/rpc.gssd -- $RPCGSSDOPTS
180                     RET=$?
181                     if [ $RET != 0 ]; then
182                         log_end_msg $RET
183                         exit $RET
184                     fi
185                 fi
186             fi
187         fi
188         log_end_msg 0
189         ;;
190
191   stop)
192         log_daemon_msg "Stopping $DESC"
193
194         if [ "$NEED_GSSD" = yes ]
195         then
196             log_progress_msg "gssd"
197             start-stop-daemon --stop --oknodo --quiet \
198                     --name rpc.gssd
199             RET=$?
200             if [ $RET != 0 ]; then
201                 log_end_msg $RET
202                 exit $RET
203             fi
204         fi
205         if [ "$NEED_IDMAPD" = yes ]
206         then
207             log_progress_msg "idmapd"
208             start-stop-daemon --stop --oknodo --quiet \
209                 --name rpc.idmapd
210             RET=$?
211             if [ $RET != 0 ]; then
212                 log_end_msg $RET
213                 exit $RET
214             fi
215         fi
216         if [ "$NEED_STATD" = yes ]
217         then
218             log_progress_msg "statd"
219             start-stop-daemon --stop --oknodo --quiet \
220                 --name rpc.statd
221             RET=$?
222             if [ $RET != 0 ]; then
223                 log_end_msg $RET
224                 exit $RET
225             fi
226         fi
227         do_umount $PIPEFS_MOUNTPOINT 2>/dev/null || true
228         log_end_msg 0
229         ;;
230
231   status)
232         if [ "$NEED_STATD" = yes ]
233         then
234             if ! pidof rpc.statd >/dev/null
235             then
236                 echo "rpc.statd not running"
237                 exit 3
238             fi
239         fi
240
241         if [ "$NEED_GSSD" = yes ]
242         then
243             if ! pidof rpc.gssd >/dev/null
244             then
245                 echo "rpc.gssd not running"
246                 exit 3
247             fi
248         fi
249
250         if [ "$NEED_IDMAPD" = yes ]
251         then
252             if ! pidof rpc.idmapd >/dev/null
253             then
254                 echo "rpc.idmapd not running"
255                 exit 3
256             fi
257         fi
258
259         echo "all daemons running"
260         exit 0
261         ;;
262
263   restart | force-reload)
264         $0 stop
265         sleep 1
266         $0 start
267         ;;
268
269   *)
270         log_success_msg "Usage: nfs-common {start|stop|status|restart}"
271         exit 1
272         ;;
273 esac
274
275 exit 0