Home | History | Annotate | Download | only in shell
      1 #!/bin/sh
      2 #
      3 # CDDL HEADER START
      4 #
      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.
      8 #
      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.
     13 #
     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]
     19 #
     20 # CDDL HEADER END
     21 #
     22 #
     23 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24 # Use is subject to license terms.
     25 #
     26 
     27 #
     28 # IPfilter's firewall
     29 #
     30 # routed and its siblings use ICMP Router Discovery protocol, simply allow
     31 # these packets so the client portion of routed can work.
     32 #
     33 gen_IRDP_rules()
     34 {
     35 	# Allow incoming icmp from routers for successful discovery.
     36 	# IRDP - ICMP type 9 and 10, advertisement and solicitation, respectively.
     37 	#
     38 	echo "pass in log quick proto icmp from any to any icmp-type 10" >>${1}
     39 	echo "pass in log quick proto icmp from any to any icmp-type 9" >>${1}
     40 }
     41 
     42 #
     43 # These functions are used to help map daemon arguments to appropriate
     44 # routing properties and back, allowing legacy specifications of daemon
     45 # arguments to be reflected in SMF property values for daemon services.
     46 #
     47 
     48 #
     49 # set_routeadm_property inst_fmri propname propvalue
     50 #
     51 # Functions sets appropriate property value in routeadm property group
     52 # (via routeadm -m) for inst_fmri to propvalue.
     53 #
     54 set_routeadm_property()
     55 {
     56 	/sbin/routeadm -m $1 ${2}="${3}"
     57 }
     58 
     59 #
     60 # The functions below are used to map from daemon arguments to appropriate
     61 # routeadm properties (properties that the service user can manipulate
     62 # to control daemon functionality. getopts is used extensively to
     63 # retrieve options/values from argument list, and these option values
     64 # are used to set properties appropriately.
     65 #
     66 
     67 #
     68 # set_daemon_value_property inst_fmri optstring options option prop
     69 #	default_value
     70 #
     71 # Function looks for option/value in argument string, and sets associated
     72 # property if found. If a default is specified, and the option is not
     73 # in the argument string, it will be used.
     74 #
     75 set_daemon_value_property()
     76 {
     77 	OPTIND=1
     78 	value_set=""
     79 	while getopts $3 opt $2; do
     80 		case $opt in
     81 			"$4" )	set_routeadm_property $1 $5 $OPTARG
     82 				value_set="true"
     83 				;;
     84 			? )
     85 		esac
     86 	done
     87 	# No value set - use default if specified.
     88 	if [ -z "$value_set" -a -n "$6" ]; then
     89 		set_routeadm_property $1 $5 $6
     90 	fi
     91 }
     92 
     93 #
     94 # set_daemon_ordered_multivalue_property inst_fmri optstring options option prop
     95 #       default_value
     96 #
     97 # Function looks for option/values in argument string, and sets associated
     98 # property if found. If a default is specified, and the option is not
     99 # in the argument string, it will be used.  Use ";" as delimiter for
    100 # multiple values.
    101 #
    102 set_daemon_ordered_multivalue_property()
    103 {
    104 	OPTIND=1
    105 	value_set=""
    106 	while getopts $3 opt $2; do
    107 		case $opt in
    108 			"$4" )  if [ -z "$value_set" ]; then
    109 					value_set="${OPTARG}"
    110 				else
    111 					value_set="$value_set;${OPTARG}"
    112 				fi
    113                                 ;;
    114 			? )
    115 		esac
    116 	done
    117 	if [ -n "$value_set" ]; then
    118 		set_routeadm_property $1 $5 "$value_set"
    119 	fi
    120 	# No value set - use default if specified.
    121 	if [ -z "$value_set" -a -n "$6" ]; then
    122 		set_routeadm_property $1 $5 $6
    123 	fi
    124 }
    125 
    126 #
    127 # set_daemon_boolean_property inst_fmri optstring options option
    128 #       prop value_if_found default
    129 #
    130 # Function looks for option in argument string, and sets associated
    131 # property, if found, to value_if_found. If a default is specified, and
    132 # the option is not found, it will be used.
    133 #
    134 set_daemon_boolean_property()
    135 {
    136 	OPTIND=1
    137 	value_set=""
    138 	while getopts $3 opt $2; do
    139 		case $opt in
    140 			"$4" )	set_routeadm_property $1 $5 $6
    141 				value_set="true"
    142 				;;
    143 			? )
    144 		esac
    145 	done
    146 	# No value set - use default if specified.
    147 	if [ -z "$value_set" -a -n "$7" ]; then
    148 		set_routeadm_property $1 $5 $7
    149 	fi
    150 }
    151 
    152 #
    153 # set_daemon_nonoption_properties inst_fmri optstring options propnames
    154 #       default
    155 #
    156 # Function looks past option list for addition values, and sets properties
    157 # specified in propnames to additional positional values. If no value
    158 # is found for additional property, default is used.
    159 #
    160 set_daemon_nonoption_properties()
    161 {
    162 	OPTIND=1
    163 	# Skip options
    164 	while getopts $3 opt $2; do
    165 		case $opt in
    166 			? )
    167 		esac
    168 	done
    169 	pos=$OPTIND
    170 	for prop in $4
    171 	do
    172 		val=`/usr/bin/echo $2 | /usr/bin/nawk -v POS=$pos \
    173 		    '{ print $POS }'`
    174 		if [ -z "$val" ]; then
    175 			val="$5"
    176 		fi
    177 		set_routeadm_property $1 $prop $val
    178 		pos=`expr $pos + 1`
    179 	done
    180 }
    181 
    182 #
    183 # get_daemon_args $inst_fmri
    184 #
    185 # Retrieves routeadm/daemon-args property values, if any.  Removes
    186 # quotes around values including spaces.
    187 #
    188 get_daemon_args()
    189 {
    190 	args=`/usr/sbin/svccfg -s $1 listprop routeadm/daemon-args | \
    191 	    /usr/bin/nawk '{ for (i = 3; i <= NF; i++) printf "%s ", $i }' | \
    192 	    /usr/bin/nawk '{sub(/^\"/, ""); sub(/\"[ \t]*$/,""); print}'`
    193 	echo "$args"
    194 }
    195 
    196 #
    197 # clear_daemon_args $inst_fmri
    198 #
    199 # Blanks routeadm/daemon-args property used in upgrade.
    200 #
    201 clear_daemon_args()
    202 {
    203 	/usr/sbin/svccfg -s $1 delprop routeadm/daemon-args 2>/dev/null
    204 }
    205 
    206 #
    207 # The functions below are used to map back from property settings to
    208 # commandline arguments to launch daemons.
    209 #
    210 
    211 get_routeadm_property()
    212 {
    213 	propval=`/sbin/routeadm -l $1 | /usr/bin/nawk -v PROP=$2 \
    214 	    '($1 == PROP) { for (i = 3; i < NF; i++) printf $i" "; \
    215 	    if (NF >= 3) {printf $NF}}'`
    216 	echo "$propval"
    217 }
    218 
    219 #
    220 # get_daemon_option_from_boolean_property inst_fmri prop option value_set
    221 #
    222 # Returns appropriate daemon option for boolean property prop - if current
    223 # value matches value_set.
    224 #
    225 get_daemon_option_from_boolean_property()
    226 {
    227 	propval=`get_routeadm_property $1 $2`
    228 	if [ "$propval" = "$4" ]; then
    229 		echo "${3}"
    230 	fi
    231 }
    232 
    233 #
    234 # get_daemon_option_from_property inst_fmri prop option ignore_value
    235 #
    236 # Returns appropriate daemon option and associated value (unless value
    237 # matches ignore_value, in which case nothing is returned).
    238 #
    239 get_daemon_option_from_property()
    240 {
    241 	propval=`get_routeadm_property $1 $2`
    242 	if [ "$propval" != "$4" ]; then
    243 		echo "-${3} $propval"
    244 	fi
    245 }
    246 
    247 #
    248 # get_daemon_ordered_multivalue_option_from_property inst_fmri prop
    249 # option
    250 #
    251 # Returns appropriate daemon option and associated values. Values are
    252 # unquoted, i.e. -A value1 -A value2
    253 #
    254 get_daemon_ordered_multivalue_option_from_property()
    255 {
    256 	# get property values, removing trailing delimiter.
    257 	propvals=`get_routeadm_property $1 $2 | \
    258 	    /usr/bin/nawk '{sub(/;[ \t]*$/, ""); print }'`
    259 	# Substitute switch for internal delimiters.
    260 	fixed_propvals=`/usr/bin/echo $propvals | \
    261 	    /usr/bin/nawk -v SWITCH=" -${3} " \
    262 	    '{sub(/;/, SWITCH); print }'`
    263 	if [ -n "$fixed_propvals" ]; then
    264 		echo "-${3} $fixed_propvals"
    265 	fi
    266 }
    267 
    268 #
    269 # get_nonoption_property inst_fmri prop ignore_value
    270 #
    271 # Returns appropriate non-option property (at end of option list), unless
    272 # value matches ignore value, in which case nothing is returned.
    273 #
    274 get_daemon_nonoption_property()
    275 {
    276 	propval=`get_routeadm_property $1 $2`
    277 	if [ -n "$propval" -a "$propval" != "$3" ]; then
    278 		echo "$propval"
    279 	fi
    280 }
    281