Release new version 0.105.0
[grml-terminalserver.git] / nfs-kernel-server
1 #!/bin/sh
2 #
3 # nfs-kernel-server
4 #               This shell script takes care of starting and stopping
5 #               the kernel-mode NFS server.
6 #
7 # chkconfig: 345 60 20
8 # description: NFS is a popular protocol for file sharing across TCP/IP \
9 #              networks. This service provides NFS server functionality, \
10 #              which is configured via the /etc/exports file.
11 #
12
13 set -e
14
15 # What is this?
16 DESC="NFS kernel daemon"
17 PREFIX=/usr
18
19 # Exit if required binaries are missing.
20 [ -x $PREFIX/sbin/rpc.nfsd    ] || exit 0
21 [ -x $PREFIX/sbin/rpc.mountd  ] || exit 0
22 [ -x $PREFIX/sbin/exportfs    ] || exit 0
23 [ -x $PREFIX/sbin/rpc.svcgssd ] || exit 0
24
25 # Read config
26 DEFAULTFILE=/etc/default/nfs-kernel-server
27 RPCNFSDCOUNT=8
28 RPCMOUNTDOPTS=
29 NEED_SVCGSSD=yes
30 RPCGSSDOPTS=
31 RPCSVCGSSDOPTS=
32 PROCNFSD_MOUNTPOINT=/proc/fs/nfsd
33 if [ -f $DEFAULTFILE ]; then
34     . $DEFAULTFILE
35 fi
36
37 do_modprobe() {
38     modprobe -q "$1" || true
39 }
40
41 do_mount() {
42     if ! grep -E -qs "$1\$" /proc/filesystems
43     then
44         return 1
45     fi
46     if ! mountpoint -q "$2"
47     then
48         mount -t "$1" "$1" "$2"
49         return
50     fi
51     return 0
52 }
53
54 # See how we were called.
55 case "$1" in
56   start)
57         cd /    # daemons should have root dir as cwd
58         # FIXME if grep -q '^/' /etc/exports
59         if [ -f /etc/exports ]
60         then
61                 do_modprobe nfsd
62                 do_mount nfsd $PROCNFSD_MOUNTPOINT || NEED_SVCGSSD=no
63                 printf "Exporting directories for $DESC..."
64                 $PREFIX/sbin/exportfs -r
65                 echo "done."
66
67                 printf "Starting $DESC:"
68                 if [ "$NEED_SVCGSSD" = yes ]
69                 then
70                     printf " svcgssd"
71                     start-stop-daemon --start --quiet \
72                             --make-pidfile --pidfile /run/rpc.svcgssd.pid \
73                             --exec $PREFIX/sbin/rpc.svcgssd -- $RPCSVCGSSDOPTS
74                 fi
75
76                 printf " nfsd"
77                 start-stop-daemon --start --quiet \
78                     --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDCOUNT
79
80                 printf " mountd"
81
82                 # make sure 127.0.0.1 is a valid source for requests
83                 ClearAddr=
84                 if [ -f /proc/net/rpc/auth.unix.ip/channel ]
85                 then
86                     fgrep -qs 127.0.0.1 /proc/net/rpc/auth.unix.ip/content || {
87                         echo "nfsd 127.0.0.1 2147483647 localhost" >/proc/net/rpc/auth.unix.ip/channel
88                         ClearAddr=yes
89                     }
90                 fi
91
92                 [ -z "$ClearAddr" ] || echo "nfsd 127.0.0.1 1" >/proc/net/rpc/auth.unix.ip/channel
93
94                 start-stop-daemon --start --quiet \
95                     --exec $PREFIX/sbin/rpc.mountd -- $RPCMOUNTDOPTS
96                 echo "."
97         else
98                 echo "Not starting $DESC: No exports."
99         fi
100         ;;
101
102   stop)
103         printf "Stopping $DESC: mountd"
104         start-stop-daemon --stop --oknodo --quiet \
105             --name rpc.mountd --user 0
106         if [ "$NEED_SVCGSSD" = yes ]
107         then
108             printf " svcgssd"
109             start-stop-daemon --stop --oknodo --quiet \
110                     --name rpc.svcgssd --user 0
111             rm -f /run/rpc.svcgssd.pid
112         fi
113         printf " nfsd"
114         start-stop-daemon --stop --oknodo --quiet \
115             --name nfsd --user 0 --signal 2
116         echo "."
117
118         printf "Unexporting directories for $DESC..."
119         $PREFIX/sbin/exportfs -au
120         echo "done."
121         ;;
122
123   reload | force-reload)
124         printf "Re-exporting directories for $DESC..."
125         $PREFIX/sbin/exportfs -r
126         echo "done."
127         ;;
128
129   restart)
130         $0 stop
131         sleep 1
132         $0 start
133         ;;
134
135   *)
136         echo "Usage: nfs-kernel-server {start|stop|reload|force-reload|restart}"
137         exit 1
138         ;;
139 esac
140
141 exit 0