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