5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
24 # Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
25 # Copyright 2015 Nexenta Systems, Inc. All rights reserved.
26 # Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
29 # Start/stop processes required for server NFS
31 .
/lib
/svc
/share
/smf_include.sh
32 .
/lib
/svc
/share
/ipf_include.sh
36 # Handling a corner case here. If we were in offline state due to an
37 # unsatisfied dependency, the ipf_method process wouldn't have generated
38 # the ipfilter configuration. When we transition to online because the
39 # dependency is satisfied, the start method will have to generate the
40 # ipfilter configuration. To avoid all possible deadlock scenarios,
41 # we restart ipfilter which will regenerate the ipfilter configuration
42 # for the entire system.
44 # The ipf_method process signals that it didn't generate ipf rules by
45 # removing the service's ipf file. Thus we only restart network/ipfilter
46 # when the file is missing.
50 ipfile
=`fmri_to_file $SMF_FMRI $IPF_SUFFIX`
51 ip6file
=`fmri_to_file $SMF_FMRI $IPF6_SUFFIX`
52 [ -f "$ipfile" -a -f "$ip6file" ] && return 0
56 # - ipfilter isn't online
57 # - global policy is 'custom'
58 # - service's policy is 'use_global'
60 service_check_state
$IPF_FMRI $SMF_ONLINE ||
return 0
61 [ "`get_global_def_policy`" = "custom" ] && return 0
62 [ "`get_policy $SMF_FMRI`" = "use_global" ] && return 0
64 svcadm restart
$IPF_FMRI
69 # The NFS server is not supported in a local zone
70 if smf_is_nonglobalzone
; then
71 /usr
/sbin
/svcadm disable
-t svc
:/network
/nfs
/server
72 echo "The NFS server is not supported in a local zone"
77 # Share all file systems enabled for sharing. sharemgr understands
78 # regular shares and ZFS shares and will handle both. Technically,
79 # the shares would have been started long before getting here since
80 # nfsd has a dependency on them.
82 # restart stopped shares from the repository
83 /usr
/sbin
/sharemgr start
-P nfs
-a
85 # Options for nfsd are now set in SMF
90 /usr
/sbin
/svcadm mark
-t maintenance svc
:/network
/nfs
/server
91 echo "$0: mountd failed with $rc"
93 exit $SMF_EXIT_ERR_FATAL
99 /usr
/sbin
/svcadm mark
-t maintenance svc
:/network
/nfs
/server
100 echo "$0: nfsd failed with $rc"
102 exit $SMF_EXIT_ERR_FATAL
109 /usr
/sbin
/sharemgr start
-P nfs
-a
113 /usr
/bin
/pkill
-x -u 0,1 -z $zone '(nfsd|mountd)'
115 # Unshare all shared file systems using NFS
117 /usr
/sbin
/sharemgr stop
-P nfs
-a
119 # Kill any processes left in service contract
120 smf_kill_contract
$2 TERM
1
121 [ $?
-ne 0 ] && exit 1
126 # NFS related services are RPC. nfs/server has nfsd which has
127 # well-defined port number but mountd is an RPC daemon.
129 # Essentially, we generate rules for the following "services"
130 # - nfs/server which has nfsd and mountd
133 # The following services are enabled for both nfs client and
134 # server, if nfs/client is enabled we'll treat them as client
135 # services and simply allow incoming traffic.
140 NFS_FMRI
="svc:/network/nfs/server:default"
141 NFSCLI_FMRI
="svc:/network/nfs/client:default"
142 RQUOTA_FMRI
="svc:/network/nfs/rquota:default"
145 file=`fmri_to_file $FMRI $IPF_SUFFIX`
146 file6
=`fmri_to_file $FMRI $IPF6_SUFFIX`
147 echo "# $FMRI" >$file
148 echo "# $FMRI" >$file6
149 policy
=`get_policy $NFS_FMRI`
152 # nfs/server configuration is processed in the start method.
154 if [ "$FMRI" = "$NFS_FMRI" ]; then
155 service_check_state
$FMRI $SMF_ONLINE
156 if [ $?
-ne 0 ]; then
161 nfs_name
=`svcprop -p $FW_CONTEXT_PG/name $FMRI 2>/dev/null`
162 tport
=`$SERVINFO -p -t -s $nfs_name 2>/dev/null`
163 if [ -n "$tport" ]; then
164 generate_rules
$FMRI $policy "tcp" $tport $file
167 tport6
=`$SERVINFO -p -t6 -s $nfs_name 2>/dev/null`
168 if [ -n "$tport6" ]; then
169 generate_rules
$FMRI $policy "tcp" $tport6 $file6 _6
172 uport
=`$SERVINFO -p -u -s $nfs_name 2>/dev/null`
173 if [ -n "$uport" ]; then
174 generate_rules
$FMRI $policy "udp" $uport $file
177 uport6
=`$SERVINFO -p -u6 -s $nfs_name 2>/dev/null`
178 if [ -n "$uport6" ]; then
179 generate_rules
$FMRI $policy "udp" $uport6 $file6 _6
182 # mountd IPv6 ports are also reachable through IPv4, so include
183 # them when generating IPv4 rules.
184 tports
=`$SERVINFO -R -p -t -s "mountd" 2>/dev/null`
185 tports6
=`$SERVINFO -R -p -t6 -s "mountd" 2>/dev/null`
186 if [ -n "$tports" -o -n "$tports6" ]; then
187 tports
=`unique_ports $tports $tports6`
188 for tport
in $tports; do
189 generate_rules
$FMRI $policy "tcp" \
194 if [ -n "$tports6" ]; then
195 for tport6
in $tports6; do
196 generate_rules
$FMRI $policy "tcp" \
201 uports
=`$SERVINFO -R -p -u -s "mountd" 2>/dev/null`
202 uports6
=`$SERVINFO -R -p -u6 -s "mountd" 2>/dev/null`
203 if [ -n "$uports" -o -n "$uports6" ]; then
204 uports
=`unique_ports $uports $uports6`
205 for uport
in $uports; do
206 generate_rules
$FMRI $policy "udp" \
211 if [ -n "$uports6" ]; then
212 for uport6
in $uports6; do
213 generate_rules
$FMRI $policy "udp" \
218 elif [ "$FMRI" = "$RQUOTA_FMRI" ]; then
219 iana_name
=`svcprop -p inetd/name $FMRI`
221 # rquota IPv6 ports are also reachable through IPv4, so include
222 # them when generating IPv4 rules.
223 tports
=`$SERVINFO -R -p -t -s $iana_name 2>/dev/null`
224 tports6
=`$SERVINFO -R -p -t6 -s $iana_name 2>/dev/null`
225 if [ -n "$tports" -o -n "$tports6" ]; then
226 tports
=`unique_ports $tports $tports6`
227 for tport
in $tports; do
228 generate_rules
$NFS_FMRI $policy "tcp" \
233 if [ -n "$tports6" ]; then
234 for tport6
in $tports6; do
235 generate_rules
$NFS_FMRI $policy "tcp" \
240 uports
=`$SERVINFO -R -p -u -s $iana_name 2>/dev/null`
241 uports6
=`$SERVINFO -R -p -u6 -s $iana_name 2>/dev/null`
242 if [ -n "$uports" -o -n "$uports6" ]; then
243 uports
=`unique_ports $uports $uports6`
244 for uport
in $uports; do
245 generate_rules
$NFS_FMRI $policy "udp" \
250 if [ -n "$uports6" ]; then
251 for uport6
in $uports6; do
252 generate_rules
$NFS_FMRI $policy "udp" \
258 # Handle the client services here
260 if service_check_state
$NFSCLI_FMRI $SMF_ONLINE; then
265 restarter
=`svcprop -p general/restarter $FMRI 2>/dev/null`
266 if [ "$restarter" = "$INETDFMRI" ]; then
267 iana_name
=`svcprop -p inetd/name $FMRI`
268 isrpc
=`svcprop -p inetd/isrpc $FMRI`
270 iana_name
=`svcprop -p $FW_CONTEXT_PG/name $FMRI`
271 isrpc
=`svcprop -p $FW_CONTEXT_PG/isrpc $FMRI`
274 if [ "$isrpc" = "true" ]; then
275 tports
=`$SERVINFO -R -p -t -s $iana_name 2>/dev/null`
276 tports6
=`$SERVINFO -R -p -t6 -s $iana_name 2>/dev/null`
277 uports
=`$SERVINFO -R -p -u -s $iana_name 2>/dev/null`
278 uports6
=`$SERVINFO -R -p -u6 -s $iana_name 2>/dev/null`
280 tports
=`$SERVINFO -p -t -s $iana_name 2>/dev/null`
281 tports6
=`$SERVINFO -p -t6 -s $iana_name 2>/dev/null`
282 uports
=`$SERVINFO -p -u -s $iana_name 2>/dev/null`
283 uports6
=`$SERVINFO -p -u6 -s $iana_name 2>/dev/null`
286 # IPv6 ports are also reachable through IPv4, so include
287 # them when generating IPv4 rules.
288 if [ -n "$tports" -o -n "$tports6" ]; then
289 tports
=`unique_ports $tports $tports6`
290 for tport
in $tports; do
291 generate_rules
$FMRI $policy "tcp" $tport $file
295 if [ -n "$tports6" ]; then
296 for tport6
in $tports6; do
297 generate_rules
$FMRI $policy "tcp" $tport6 $file6 _6
301 if [ -n "$uports" -o -n "$uports6" ]; then
302 uports
=`unique_ports $uports $uports6`
303 for uport
in $uports; do
304 generate_rules
$FMRI $policy "udp" $uport $file
308 if [ -n "$uports6" ]; then
309 for uport6
in $uports6; do
310 generate_rules
$FMRI $policy "udp" $uport6 $file6 _6
318 echo "Usage: $0 { start | stop | refresh }"