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