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/xpg4/bin/awk -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/xpg4/bin/awk '{ for (i = 3; i <= NF; i++) printf "%s ", $i }' | \ 192 /usr/xpg4/bin/awk '{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/xpg4/bin/awk -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/xpg4/bin/awk '{sub(/;[ \t]*$/, ""); print }'` 259 # Substitute switch for internal delimiters. 260 fixed_propvals=`/usr/bin/echo $propvals | \ 261 /usr/xpg4/bin/awk -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 }