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