app-editors/vis: remove
[sgilles-overlay.git] / net-fs / nfs-utils / files / nfs.initd
blob73be4e5b1ea7b512904a991518e8f3a0520c6400
1 #!/sbin/openrc-run
2 # Copyright 1999-2014 Gentoo Foundation
3 # Distributed under the terms of the GNU General Public License v2
4 # $Id$
6 extra_started_commands="reload"
8 # This variable is used for controlling whether or not to run exportfs -ua;
9 # see stop() for more information
10 restarting=no
12 # The binary locations
13 exportfs=/usr/sbin/exportfs
14   mountd=/usr/sbin/rpc.mountd
15     nfsd=/usr/sbin/rpc.nfsd
16 smnotify=/usr/sbin/sm-notify
18 depend() {
19         local myneed=""
20         # XXX: no way to detect NFSv4 is desired and so need rpc.idmapd
21         myneed="${myneed} $(
22                 awk '!/^[[:space:]]*#/ {
23                         # clear the path to avoid spurious matches
24                         $1 = "";
25                         if ($0 ~ /[(][^)]*sec=(krb|spkm)[^)]*[)]/) {
26                                 print "rpc.svcgssd"
27                                 exit 0
28                         }
29                 }' /etc/exports /etc/exports.d/*.exports 2>/dev/null
30         )"
31         config /etc/exports /etc/exports.d/*.exports
32         need portmap rpc.statd ${myneed} ${NFS_NEEDED_SERVICES}
33         use ypbind net dns rpc.rquotad rpc.idmapd rpc.svcgssd
34         after quota
37 mkdir_nfsdirs() {
38         local d
39         for d in v4recovery v4root ; do
40                 d="/var/lib/nfs/${d}"
41                 [ ! -d "${d}" ] && mkdir -p "${d}"
42         done
45 waitfor_exportfs() {
46         local pid=$1
47         ( sleep ${EXPORTFS_TIMEOUT:-30}; kill -9 ${pid} 2>/dev/null ) &
48         wait $1
51 mount_nfsd() {
52         if [ -e /proc/modules ] ; then
53                 # Make sure nfs support is loaded in the kernel #64709
54                 if ! grep -qs nfsd /proc/filesystems ; then
55                         modprobe -q nfsd
56                 fi
57                 # Restart idmapd if needed #220747
58                 if grep -qs nfsd /proc/modules ; then
59                         killall -q -HUP rpc.idmapd
60                 fi
61         fi
63         # This is the new "kernel 2.6 way" to handle the exports file
64         if grep -qs nfsd /proc/filesystems ; then
65                 if ! mountinfo -q /proc/fs/nfsd ; then
66                         ebegin "Mounting nfsd filesystem in /proc"
67                         mount -t nfsd -o nodev,noexec,nosuid nfsd /proc/fs/nfsd
68                         eend $?
69                 fi
71                 local o
72                 for o in ${OPTS_NFSD} ; do
73                         echo "${o#*=}" > "/proc/fs/nfsd/${o%%=*}"
74                 done
75         fi
78 start_it() {
79         ebegin "Starting NFS $1"
80         shift
81         "$@"
82         eend $?
83         ret=$((ret + $?))
85 start() {
86         mount_nfsd
87         mkdir_nfsdirs
89         # Exportfs likes to hang if networking isn't working.
90         # If that's the case, then try to kill it so the
91         # bootup process can continue.
92         if grep -qs '^[[:space:]]*/' /etc/exports /etc/exports.d/*.exports ; then
93                 ebegin "Exporting NFS directories"
94                 ${exportfs} -r &
95                 waitfor_exportfs $!
96                 eend $?
97         fi
99         local ret=0
100         start_it mountd ${mountd} ${OPTS_RPC_MOUNTD}
101         start_it daemon ${nfsd} ${OPTS_RPC_NFSD}
102         [ -x "${smnotify}" ] && start_it smnotify ${smnotify} ${OPTS_SMNOTIFY}
103         return ${ret}
106 stop() {
107         local ret=0
109         ebegin "Stopping NFS mountd"
110         start-stop-daemon --stop --exec ${mountd}
111         eend $?
112         ret=$((ret + $?))
114         # nfsd sets its process name to [nfsd] so don't look for $nfsd
115         ebegin "Stopping NFS daemon"
116         start-stop-daemon --stop --name nfsd --user root --signal 2
117         eend $?
118         ret=$((ret + $?))
119         # in case things don't work out ... #228127
120         rpc.nfsd 0
122         # When restarting the NFS server, running "exportfs -ua" probably
123         # isn't what the user wants.  Running it causes all entries listed
124         # in xtab to be removed from the kernel export tables, and the
125         # xtab file is cleared. This effectively shuts down all NFS
126         # activity, leaving all clients holding stale NFS filehandles,
127         # *even* when the NFS server has restarted.
128         #
129         # That's what you would want if you were shutting down the NFS
130         # server for good, or for a long period of time, but not when the
131         # NFS server will be running again in short order.  In this case,
132         # then "exportfs -r" will reread the xtab, and all the current
133         # clients will be able to resume NFS activity, *without* needing
134         # to umount/(re)mount the filesystem.
135         if [ "${restarting}" = no -o "${RC_CMD}" = "restart" ] ; then
136                 ebegin "Unexporting NFS directories"
137                 # Exportfs likes to hang if networking isn't working.
138                 # If that's the case, then try to kill it so the
139                 # shutdown process can continue.
140                 ${exportfs} -ua &
141                 waitfor_exportfs $!
142                 eend $?
143         fi
145         return ${ret}
148 reload() {
149         # Exportfs likes to hang if networking isn't working.
150         # If that's the case, then try to kill it so the
151         # bootup process can continue.
152         ebegin "Reloading /etc/exports"
153         ${exportfs} -r 1>&2 &
154         waitfor_exportfs $!
155         eend $?
158 restart() {
159         # See long comment in stop() regarding "restarting" and exportfs -ua
160         restarting=yes
161         svc_stop
162         svc_start