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#
33gen_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#
54set_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#
75set_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#
102set_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#
134set_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#
160set_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#
188get_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#
201clear_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
211get_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#
225get_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#
239get_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#
254get_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#
274get_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