diff options
Diffstat (limited to 'solaris')
| -rw-r--r-- | solaris/ChangeLog | 10 | ||||
| -rwxr-xr-x | solaris/quagga.init.in | 191 | ||||
| -rw-r--r-- | solaris/quagga.xml.in | 510 | 
3 files changed, 561 insertions, 150 deletions
| diff --git a/solaris/ChangeLog b/solaris/ChangeLog index 8a2ad7d3..65135d99 100644 --- a/solaris/ChangeLog +++ b/solaris/ChangeLog @@ -1,3 +1,13 @@ +2008-07-03 Paul Jakma <paul.jakma@sun.com> + +	* quagga.{xml,init}.in: Sync with OpenSolaris SFW. This changes the +	  SMF schema used, from the SMF schema supplied initially with +	  Quagga, to the version which was approved by the Sun PSARC for +	  inclusion into Solaris. This change is incompatible. Settings, +	  such as vty_port, etc. will not transfer over. The Sun schema is +	  however supported by Sun, and supports running Quagga in a zone +	  with IP instances, and configuration via the routeadm utility. +  2008-01-13 Paul Jakma <paul.jakma@sun.com>  	* Makefile.am: pkg target should depend on the 'depend.%' files. diff --git a/solaris/quagga.init.in b/solaris/quagga.init.in index 30a9c694..8b298c37 100755 --- a/solaris/quagga.init.in +++ b/solaris/quagga.init.in @@ -1,6 +1,6 @@  #!/sbin/sh  # -# Copyright 2001,2003 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved.  # Use is subject to license terms.  #  # This file is part of Quagga. @@ -25,13 +25,151 @@  # Starts/stops the given daemon  SMFINCLUDE=/lib/svc/share/smf_include.sh +ROUTEADMINCLUDE=/lib/svc/share/routing_include.sh +GLOBAL_OPTIONS="PAfiug"  DAEMON_PATH=@sbindir@ +USER=@enable_user@ +GROUP=@enable_group@ +# handle upgrade of daemon-args SMF property to new routeadm properties +# used during upgrade too by routeadm. +# relevant to S10U4+ only. +handle_routeadm_upgrade () { +	GLOBAL_OPTIONS="PAfiug" +	 +	daemon_args=`get_daemon_args $SMF_FMRI` +	 +	if [ -n "$daemon_args" ]; then +		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ +			"$GLOBAL_OPTIONS" "P" vty_port 0 +		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ +			"$GLOBAL_OPTIONS" "A" vty_address +		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ +			"$GLOBAL_OPTIONS" "f" config_file +		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ +			"$GLOBAL_OPTIONS" "i" pid_file +		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ +			"$GLOBAL_OPTIONS" "u" user +		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ +			"$GLOBAL_OPTIONS" "g" group +		 +		case "$1" in +		zebra) +			set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \ +				"${GLOBAL_OPTIONS}b" "b" batch true false +			;; +		ripd|ripngd) +			set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \ +				"${GLOBAL_OPTIONS}r" "r" retain true false +			;; +		bgpd) +			set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \ +				"${GLOBAL_OPTIONS}rnp" "r" retain true false +			set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \ +				"${GLOBAL_OPTIONS}rnp" "n" no_kernel true false +			set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ +				"${GLOBAL_OPTIONS}rnp" "p" bgp_port +		esac +		clear_daemon_args $SMF_FMRI +	fi +} + +upgrade_config () { +	DAEMON=$1 +	# handle upgrade of SUNWzebra to Quagga +	if [ -d "/etc/quagga" -a ! -f "/etc/quagga/${DAEMON}.conf" ] ; then +		if [ -f "/etc/sfw/zebra/${DAEMON}.conf" ] ; then +			cp "/etc/sfw/zebra/${DAEMON}.conf" \ +				"/etc/quagga/${DAEMON}.conf.upgrade" \ +				|| exit $SMF_EXIT_ERR_FATAL +			chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.upgrade" \ +				|| exit $SMF_EXIT_ERR_FATAL +			chmod 0600 "/etc/quagga/${DAEMON}.conf.upgrade" \ +				|| exit $SMF_EXIT_ERR_FATAL +			mv "/etc/quagga/${DAEMON}.conf.upgrade" "/etc/quagga/${DAEMON}.conf" \ +				|| exit $SMF_EXIT_ERR_FATAL +		fi +	fi + +	if [ ! -f "/etc/quagga/${DAEMON}.conf" ] ; then +		touch "/etc/quagga/${DAEMON}.conf.new" \ +			|| exit $SMF_EXIT_ERR_FATAL +		chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.new" \ +			|| exit $SMF_EXIT_ERR_FATAL +		chmod 0600 "/etc/quagga/${DAEMON}.conf.new" \ +			|| exit $SMF_EXIT_ERR_FATAL +		mv "/etc/quagga/${DAEMON}.conf.new" "/etc/quagga/${DAEMON}.conf" \ +			|| exit $SMF_EXIT_ERR_FATAL +	fi +} + +# Relevant to S10+  quagga_is_globalzone () { -	if [ "${QUAGGA_INIT_ZONENAME:=`/sbin/zonename`}" != "global" ]; then -		return 1 -	else +	if [ "${QUAGGA_INIT_ZONENAME:=`/sbin/zonename`}" = "global" \ +		-o `/sbin/zonename -t` = "exclusive" ]; then  		return 0 +	else +		return 1 +	fi +} + +routeadm_daemon_args () { +	# globals +	args="`get_daemon_option_from_property $SMF_FMRI config_file f`" +	args="${args} `get_daemon_option_from_property $SMF_FMRI vty_port P`" +	args="${args} `get_daemon_option_from_property $SMF_FMRI vty_address A`" +	args="${args} `get_daemon_option_from_property $SMF_FMRI pid_file i`" +	 +	# user and group we need for config file upgrade.. +	SMF_USER=`get_routeadm_property $SMF_FMRI user` +	SMF_GROUP=`get_routeadm_property()$SMF_FMRI group` +	if [ "${SMF_USER}" ] ; then +		USER="${SMF_USER}" +		args="${args} -u ${SMF_USER}" +	fi +	if [ "${SMF_GROUP}" ] ; then  +		GROUP="${SMF_GROUP}" +		args="${args} -g ${SMF_GROUP}" +	fi + +	case $1 in +	zebra) +		args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI batch -b true`" +		;; +	ripd|ripngd) +		args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI retain -r true`" +		;; +	bgpd) +		args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI retain -r true`" +		args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI no_kernel -n true`" +		args="${args} `get_daemon_option_from_property $SMF_FMRI bgp_port p 179`" +		;; +	esac +	echo ${args} +} + +# certain daemons need zebra +routeadm_zebra_enable () { + +	if [ "$DAEMON" = "zebra" ]; then +		return +	fi +	 +	enable_zebra=`/usr/bin/svcprop -p \ +		routing/enable_zebra $SMF_FMRI 2> /dev/null` +	if [ "$enable_zebra" != "false" ]; then +		zenabled=`/usr/bin/svcprop -p general/enabled zebra:quagga` +		zenabledt=`/usr/bin/svcprop -p general_ovr/enabled zebra:quagga` +		if [ "$zenabled" = "true" -o "$zenabledt" = "true" ]; then +			/usr/sbin/svcadm disable zebra:quagga +			/usr/sbin/svcadm enable -st zebra:quagga +		else +			/usr/sbin/svcadm enable -st zebra:quagga  +		fi +		if [ "$?" != "0" ]; then +			echo "Could not enable zebra:quagga" +			exit $SMF_EXIT_ERR_FATAL +		fi  	fi  } @@ -39,6 +177,11 @@ quagga_is_globalzone () {  # there is no SMF. Should allow this script to work pre-S10.  if [ -f "$SMFINCLUDE" ] ; then  	. "$SMFINCLUDE"; +	 +	# source the SMF-routeadm include if present.. +	if [ -f "$ROUTEADMINCLUDE" ] ; then +		. "$ROUTEADMINCLUDE" +	fi  else  	# pre-SMF system, fake up any functions and exit codes  	# which SMFINCLUDE usually provides. @@ -55,7 +198,7 @@ smf_present || DAEMON_ARGS=""  usage () {  	if smf_present ; then -		echo "Usage: $0 <daemon> <daemon arguments>"; +		echo "Usage: $0 <daemon>";  	else  		echo "Usage: $0 <stop|start> <daemon> <daemon arguments>";  	fi @@ -67,7 +210,7 @@ usage () {  case $1 in  	'help' | 'usage')  		usage -		exit SMF_EXIT_OK +		exit $SMF_EXIT_OK  		;;  esac @@ -79,8 +222,6 @@ else  fi  DAEMON="$1" -shift -DAEMON_ARGS="$@"  # daemon path must be given  if [ -z "$DAEMON_PATH/$DAEMON" ]; then @@ -91,12 +232,9 @@ fi  # only bgpd is suitable for running in a non-global zone, at this  # time.  case "${DAEMON}" in -	zebra) -		quagga_is_globalzone || exit $SMF_EXIT_OK -	;;  	bgpd)  	;; -	ospfd | ospf6d | ripd | ripngd ) +	zebra | ospfd | ospf6d | ripd | ripngd )  		quagga_is_globalzone || exit $SMF_EXIT_OK  	;;  	*) @@ -105,6 +243,27 @@ case "${DAEMON}" in  	;;  esac +# Older Quagga SMF packages pass daemon args on the commandline +# Newer SMF routeadm model uses properties for each argument +# so we must handle that. +if [ smf_present -a -f "$ROUTEADMINCLUDE" ]; then +	handle_routeadm_upgrade $DAEMON; +	DAEMON_ARGS=`routeadm_daemon_args`; +	routeadm_zebra_enable $DAEMON; +else +	if [ $# -gt 0 ] ; then +		shift +		DAEMON_ARGS="$@" +	fi +fi + +upgrade_config "$DAEMON" + +if [ ! -f "@sysconfdir@/${DAEMON}.conf" ] ; then +	echo "Could not find config file, @sysconfdir@/${DAEMON}.conf" +	exit $SMF_EXIT_ERR_CONFIG +fi +  # we need @quagga_statedir@ to exist, it probably is on tmpfs.  if [ ! -d @quagga_statedir@ ] ; then  	mkdir -p @quagga_statedir@ @@ -115,7 +274,11 @@ fi  PIDFILE="@quagga_statedir@/${DAEMON}.pid"  start () { -	$DAEMON_PATH/$DAEMON $DAEMON_ARGS --pid_file ${PIDFILE} & +	if [ ! -x "$DAEMON_PATH/$DAEMON" ] ; then +		echo "Error, could not find daemon, $DAEMON_PATH/$DAEMON" +		exit $SMF_EXIT_ERR_FATAL +	fi +	eval exec $DAEMON_PATH/$DAEMON $DAEMON_ARGS --pid_file ${PIDFILE} &  }  stop () { @@ -134,7 +297,7 @@ case "$QUAGGA_METHOD" in  *)  	usage -	exit SMF_EXIT_ERR_FATAL +	exit $SMF_EXIT_ERR_FATAL  	;;  esac	 diff --git a/solaris/quagga.xml.in b/solaris/quagga.xml.in index 3cd402f6..50c52c22 100644 --- a/solaris/quagga.xml.in +++ b/solaris/quagga.xml.in @@ -18,18 +18,20 @@  	Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  	02111-1307, USA. -	Copyright 2005 Sun Microsystems, Inc.  All rights reserved. +	Copyright 2007 Sun Microsystems, Inc.  All rights reserved.  	Use is subject to license terms.  	ident	"@(#)quagga.xml	1.0	05/03/15 SMI"  --> -<service_bundle type='manifest' name='QUAGGAdaemons:quagga'> +<service_bundle type='manifest' name='SUNWquagga-daemons:quagga'> +  <service  	name='network/routing/zebra'  	type='service'  	version='1'> - +	 +	<single_instance />  	<instance name='quagga' enabled='false'>  	<dependency name='fs' @@ -46,24 +48,24 @@  		type='service'>  		<service_fmri value='svc:/network/initial' />  	</dependency> - -	<dependency name='config_data' +	 +	<!-- do not not run unless routing-setup has run --> +	<dependency +		name='network_routing_setup'  		grouping='require_all' -		restart_on='restart' -		type='path'> -		<service_fmri -			value='file://localhost/@sysconfdir@/zebra.conf' /> +		restart_on='refresh' +		type='service'> +		<service_fmri value='svc:/network/routing-setup' />  	</dependency> -	 +  	<exec_method  		type='method'  		name='start' -		exec='/lib/svc/method/quagga zebra %{routing/daemon-args}' +		exec='/lib/svc/method/quagga zebra'  		timeout_seconds='60'>  		<method_context>  		  <method_credential -		   user='root' group='root' -		   privileges='basic,net_icmpaccess,net_rawaccess,sys_admin,sys_net_config'/> +		   user='root' group='root'/>   		</method_context>  	</exec_method> @@ -84,17 +86,55 @@  		<propval name='ignore_error'  		    type='astring' value='core,signal' />  	</property_group> - +	 +	<!-- Properties in this group are used by routeadm (1M) --> +	<property_group name='routeadm' type='application'> +		<stability value='Unstable' /> +		<!-- Identifies service as a routing service --> +		<propval name='daemon' type='astring' +			value='@sbindir@/zebra' /> +		<propval name='value_authorization' type='astring' +			value='solaris.smf.value.routing' /> +		<!-- zebra should not contribute to ipv4/ipv6 routing state --> +		<propval name='protocol' type='astring' value='zebra' /> +	</property_group> +	 +	<!-- Properties in this group are modifiable via routeadm (1M) -->  	<property_group name='routing' type='application'> +		<stability value='Evolving' />  		<propval name='value_authorization' type='astring'  -		         value='solaris.smf.modify.routing' /> -		<propval name='daemon-args' type='astring' value='-P 0'/> +		         value='solaris.smf.value.routing' /> +		 +		<!-- Options common to Quagga daemons +		     Property names are equivalent to the long +		     option name, consult Quagga documentation --> +		<!-- The config file to use, if not the default --> +		<propval name='config_file' type='astring' value=''/> +		<!-- The vty_port to listen on if not the default. +		     0 to disable -->  +		<propval name='vty_port' type='integer' value='0' /> +		<!-- The address to bind the VTY interface to, if not any. --> +		<propval name='vty_address' type='astring' value='' /> +		<!-- The user to switch to after startup, if not the default --> +		<propval name='user' type='astring' value='' /> +		<!-- The group to switch to, if not the default. +		     If user is specified, this defaults to a group with +		     same name as user --> +		<propval name='group' type='astring' value='' /> +		<!-- The pidfile to use, if not the default of +		     @quagga_statedir@ --> +		<propval name='pid_file' type='astring' value='' /> +		 +		<!-- Options specific to zebra --> +		<propval name='batch' type='boolean' value='false' />  	</property_group>  	<property_group name='general' type='framework'>  		<!-- to start stop routing services -->  		<propval name='action_authorization' type='astring'  			 value='solaris.smf.manage.routing' /> +		<propval name='value_authorization' type='astring' +			 value='solaris.smf.manage.routing' />  	</property_group>  	<template> @@ -111,7 +151,7 @@  		</documentation>  	</template>  	</instance> -	<stability value='Evolving' /> +	<stability value='Unstable' />  </service>  <service @@ -129,39 +169,40 @@  			value='svc:/system/filesystem/usr:default' />  	</dependency> -	<!-- Depends on Work-In-Progress, not yet in SNV -	<dependency name='net' -		grouping='require_all' -		restart_on='none' +	<dependency +		name='ipv4-forwarding' +		grouping='optional_all' +		restart_on='refresh'  		type='service'> -		<service_fmri value='svc:/network/routing/ipv4-routing' /> +		<service_fmri value='svc:/network/ipv4-forwarding' />  	</dependency> -	--> -	<dependency name='zebra' -			grouping='require_all' -			restart_on='restart' -			type='service'> -			<service_fmri value='svc:/network/routing/zebra:quagga' /> -	</dependency> - -	<dependency name='config_data' +	<!-- do not not run unless routing-setup has run --> +	<dependency +		name='network_routing_setup'  		grouping='require_all' -		restart_on='restart' -		type='path'> -		<service_fmri -			value='file://localhost/@sysconfdir@/ripd.conf' /> +		restart_on='refresh' +		type='service'> +		<service_fmri value='svc:/network/routing-setup' />  	</dependency> +	<!-- ensure that restart of zebra is propogated to daemon --> +	<dependency +		name='zebra' +		grouping='optional_all' +		restart_on='restart' +		type='service'> +		<service_fmri value='svc:/network/routing/zebra:quagga' /> +	</dependency> +  	<exec_method  		type='method'  		name='start' -		exec='/lib/svc/method/quagga ripd %{routing/daemon-args}' +		exec='/lib/svc/method/quagga ripd'  		timeout_seconds='60'>  		<method_context>  		  <method_credential -		   user='root' group='root' -		   privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess'/> +		   user='root' group='root'/>   		</method_context>  	</exec_method> @@ -179,16 +220,52 @@  		    type='astring' value='core,signal' />  	</property_group> +	<!-- Properties in this group are used by routeadm (1M) --> +	<property_group name='routeadm' type='application'> +		<stability value='Unstable' /> +		<!-- Identifies service as a routing service --> +		<propval name='daemon' type='astring' +			value='@sbindir@/ripd' /> +		<propval name='legacy-daemon' type='astring' +			value='/usr/sfw/sbin/ripdstart' /> +		<propval name='value_authorization' type='astring' +			value='solaris.smf.value.routing' /> +		<propval name='protocol' type='astring' value='ipv4' /> +	</property_group> +	 +	<!-- Properties in this group are modifiable via routeadm (1M) -->  	<property_group name='routing' type='application'>  		<propval name='value_authorization' type='astring'  -		         value='solaris.smf.modify.routing' /> -		<propval name='daemon-args' type='astring' value='-P 0'/> +		         value='solaris.smf.value.routing' /> + +		<!-- Options common to Quagga daemons --> +		<!-- The config file to use, if not the default --> +		<propval name='config_file' type='astring' value=''/> +		<!-- The vty_port to listen on if not the default. +		     0 to disable -->  +		<propval name='vty_port' type='integer' value='0' /> +		<!-- The address to bind the VTY interface to, if not any. --> +		<propval name='vty_address' type='astring' value='' /> +		<!-- The user to switch to after startup, if not the default --> +		<propval name='user' type='astring' value='' /> +		<!-- The group to switch to, if not the default. +		     If user is specified, this defaults to a group with +		     same name as user --> +		<propval name='group' type='astring' value='' /> +		<!-- The pidfile to use, if not the default of +		     @quagga_statedir@ --> +		<propval name='pid_file' type='astring' value='' /> +		 +		<!-- Options specific to ripd --> +		<propval name='retain' type='boolean' value='false' />  	</property_group>  	<property_group name='general' type='framework'>  		<!-- to start stop routing services -->  		<propval name='action_authorization' type='astring'  			 value='solaris.smf.manage.routing' /> +		<propval name='value_authorization' type='astring' +			 value='solaris.smf.manage.routing' />  	</property_group>  	<template> @@ -205,7 +282,7 @@  		</documentation>  	</template>  	</instance> -	<stability value='Evolving' /> +	<stability value='Unstable' />  </service>  <service @@ -223,39 +300,40 @@  			value='svc:/system/filesystem/usr:default' />  	</dependency> -	<!-- Depends on WIP, not yet in SNV -	<dependency name='net' -		grouping='require_all' -		restart_on='none' +	<dependency +		name='ipv6-forwarding' +		grouping='optional_all' +		restart_on='refresh'  		type='service'> -		<service_fmri value='svc:/network/routing/ipv6-routing' /> +		<service_fmri value='svc:/network/ipv6-forwarding' />  	</dependency> -	--> -	<dependency name='zebra' -			grouping='require_all' -			restart_on='restart' -			type='service'> -			<service_fmri value='svc:/network/routing/zebra:quagga' /> +	<!-- do not not run unless routing-setup has run --> +	<dependency +		name='network_routing_setup' +		grouping='require_all' +		restart_on='refresh' +		type='service'> +		<service_fmri value='svc:/network/routing-setup' />  	</dependency> -	<dependency name='config_data' -		grouping='require_all' +	<!-- ensure that restart of zebra is propogated to daemon --> +	<dependency +		name='zebra' +		grouping='optional_all'  		restart_on='restart' -		type='path'> -		<service_fmri -			value='file://localhost/@sysconfdir@/ripngd.conf' /> +		type='service'> +		<service_fmri value='svc:/network/routing/zebra:quagga' />  	</dependency> -	 +  	<exec_method  		type='method'  		name='start' -		exec='/lib/svc/method/quagga ripngd %{routing/daemon-args}' +		exec='/lib/svc/method/quagga ripngd'  		timeout_seconds='60'>  		<method_context>  		  <method_credential -		   user='root' group='root' -		   privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess'/> +		   user='root' group='root'/>   		</method_context>  	</exec_method> @@ -273,16 +351,50 @@  		    type='astring' value='core,signal' />  	</property_group> +	<!-- Properties in this group are used by routeadm (1M) --> +	<property_group name='routeadm' type='application'> +		<stability value='Unstable' /> +		<!-- Identifies service as a routing service --> +		<propval name='daemon' type='astring' +			value='@sbindir@/ripngd' /> +		<propval name='value_authorization' type='astring' +			value='solaris.smf.value.routing' /> +		<propval name='protocol' type='astring' value='ipv6'/> +	</property_group> +	 +	<!-- Properties in this group are modifiable via routeadm (1M) -->  	<property_group name='routing' type='application'>  		<propval name='value_authorization' type='astring'  -		         value='solaris.smf.modify.routing' /> -		<propval name='daemon-args' type='astring' value='-P 0'/> +		         value='solaris.smf.value.routing' /> + +		<!-- Options common to Quagga daemons --> +		<!-- The config file to use, if not the default --> +		<propval name='config_file' type='astring' value=''/> +		<!-- The vty_port to listen on if not the default. +		     0 to disable -->  +		<propval name='vty_port' type='integer' value='0' /> +		<!-- The address to bind the VTY interface to, if not any. --> +		<propval name='vty_address' type='astring' value='' /> +		<!-- The user to switch to after startup, if not the default --> +		<propval name='user' type='astring' value='' /> +		<!-- The group to switch to, if not the default. +		     If user is specified, this defaults to a group with +		     same name as user --> +		<propval name='group' type='astring' value='' /> +		<!-- The pidfile to use, if not the default of +		     @quagga_statedir@ --> +		<propval name='pid_file' type='astring' value='' /> + +		<!-- Options specific to ripngd --> +		<propval name='retain' type='boolean' value='false' />  	</property_group>  	<property_group name='general' type='framework'>  		<!-- to start stop routing services -->  		<propval name='action_authorization' type='astring'  			 value='solaris.smf.manage.routing' /> +		<propval name='value_authorization' type='astring' +			 value='solaris.smf.manage.routing' />  	</property_group>  	<template> @@ -299,7 +411,7 @@  		</documentation>  	</template>  	</instance> -	<stability value='Evolving' /> +	<stability value='Unstable' />  </service>  <service @@ -317,47 +429,51 @@  			value='svc:/system/filesystem/usr:default' />  	</dependency> -	<!-- Depends on WIP, not yet in SNV -	<dependency name='net' -		grouping='require_all' -		restart_on='none' +	<dependency +		name='ipv4-forwarding' +		grouping='optional_all' +		restart_on='refresh'  		type='service'> -		<service_fmri value='svc:/network/routing/ipv4-routing' /> +		<service_fmri value='svc:/network/ipv4-forwarding' />  	</dependency> -	--> -	<dependency name='zebra' -			grouping='require_all' -			restart_on='restart' -			type='service'> -			<service_fmri value='svc:/network/routing/zebra:quagga' /> +	<!-- do not not run unless routing-setup has run --> +	<dependency +		name='network_routing_setup' +		grouping='require_all' +		restart_on='refresh' +		type='service'> +		<service_fmri value='svc:/network/routing-setup' />  	</dependency> -	<dependency name='config_data' -		grouping='require_all' +	<!-- ensure that restart of zebra is propogated to daemon --> +	<dependency +		name='zebra' +		grouping='optional_all'  		restart_on='restart' -		type='path'> -		<service_fmri -			value='file://localhost/@sysconfdir@/ospfd.conf' /> +		type='service'> +		<service_fmri value='svc:/network/routing/zebra:quagga' />  	</dependency> -	 +  	<exec_method  		type='method'  		name='start' -		exec='/lib/svc/method/quagga ospfd %{routing/daemon-args}' +		exec='/lib/svc/method/quagga ospfd'  		timeout_seconds='60'>  		<method_context>  		  <method_credential -		   user='root' group='root' -		   privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess,sys_net_config'/> +		   user='root' group='root'/>   		</method_context>  	</exec_method> +	<!-- ospfd can take a long time to shutdown, due to graceful  +	     shutdown  +	 -->  	<exec_method  		type='method'  		name='stop'  		exec=':kill' -		timeout_seconds='60'> +		timeout_seconds='600'>  	</exec_method>  	<property_group name='startd' @@ -367,16 +483,49 @@  		    type='astring' value='core,signal' />  	</property_group> +	<!-- Properties in this group are used by routeadm (1M) --> +	<property_group name='routeadm' type='application'> +		<stability value='Unstable' /> +		<!-- Identifies service as a routing service --> +		<propval name='daemon' type='astring' +			value='@sbindir@/ospfd' /> +		<propval name='legacy-daemon' type='astring' +			value='/usr/sfw/sbin/ospfdstart' /> +		<propval name='value_authorization' type='astring' +			value='solaris.smf.value.routing' /> +		<propval name='protocol' type='astring' value='ipv4'/> +	</property_group> +	 +	<!-- Properties in this group are modifiable via routeadm (1M) -->  	<property_group name='routing' type='application'>  		<propval name='value_authorization' type='astring'  -		         value='solaris.smf.modify.routing' /> -		<propval name='daemon-args' type='astring' value='-P 0'/> +		         value='solaris.smf.value.routing' /> + +		<!-- Options common to Quagga daemons --> +		<!-- The config file to use, if not the default --> +		<propval name='config_file' type='astring' value=''/> +		<!-- The vty_port to listen on if not the default. +		     0 to disable -->  +		<propval name='vty_port' type='integer' value='0' /> +		<!-- The address to bind the VTY interface to, if not any. --> +		<propval name='vty_address' type='astring' value='' /> +		<!-- The user to switch to after startup, if not the default --> +		<propval name='user' type='astring' value='' /> +		<!-- The group to switch to, if not the default. +		     If user is specified, this defaults to a group with +		     same name as user --> +		<propval name='group' type='astring' value='' /> +		<!-- The pidfile to use, if not the default of +		     @quagga_statedir@ --> +		<propval name='pid_file' type='astring' value='' />  	</property_group>  	<property_group name='general' type='framework'>  		<!-- to start stop routing services -->  		<propval name='action_authorization' type='astring'  			 value='solaris.smf.manage.routing' /> +		<propval name='value_authorization' type='astring' +			 value='solaris.smf.manage.routing' />  	</property_group>  	<template> @@ -393,7 +542,7 @@  		</documentation>  	</template>  	</instance> -	<stability value='Evolving' /> +	<stability value='Unstable' />  </service>  <service @@ -411,39 +560,40 @@  			value='svc:/system/filesystem/usr:default' />  	</dependency> -	<!-- Depends on WIP, not yet in SNV -	<dependency name='net' -		grouping='require_all' -		restart_on='none' +	<dependency +		name='ipv6-forwarding' +		grouping='optional_all' +		restart_on='refresh'  		type='service'> -		<service_fmri value='svc:/network/routing/ipv6-routing' /> +		<service_fmri value='svc:/network/ipv6-forwarding' />  	</dependency> -	--> -	<dependency name='zebra' -			grouping='require_all' -			restart_on='restart' -			type='service'> -			<service_fmri value='svc:/network/routing/zebra:quagga' /> +	<!-- do not not run unless routing-setup has run --> +	<dependency +		name='network_routing_setup' +		grouping='require_all' +		restart_on='refresh' +		type='service'> +		<service_fmri value='svc:/network/routing-setup' />  	</dependency> -	<dependency name='config_data' -		grouping='require_all' +	<!-- ensure that restart of zebra is propogated to daemon --> +	<dependency +		name='zebra' +		grouping='optional_all'  		restart_on='restart' -		type='path'> -		<service_fmri -			value='file://localhost/@sysconfdir@/ospf6d.conf' /> +		type='service'> +		<service_fmri value='svc:/network/routing/zebra:quagga' />  	</dependency> -	 +  	<exec_method  		type='method'  		name='start' -		exec='/lib/svc/method/quagga ospf6d %{routing/daemon-args}' +		exec='/lib/svc/method/quagga ospf6d'  		timeout_seconds='60'>  		<method_context>  		  <method_credential -		   user='root' group='root' -		   privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess'/> +		   user='root' group='root'/>   		</method_context>  	</exec_method> @@ -461,22 +611,53 @@  		    type='astring' value='core,signal' />  	</property_group> +	<!-- Properties in this group are used by routeadm (1M) --> +	<property_group name='routeadm' type='application'> +		<stability value='Unstable' /> +		<!-- Identifies service as a routing service --> +		<propval name='daemon' type='astring' +			value='@sbindir@/ospf6d' /> +		<propval name='value_authorization' type='astring' +			value='solaris.smf.value.routing' /> +		<propval name='protocol' type='astring' value='ipv6'/> +	</property_group> +	 +	<!-- Properties in this group are modifiable via routeadm (1M) -->  	<property_group name='routing' type='application'>  		<propval name='value_authorization' type='astring'  -		         value='solaris.smf.modify.routing' /> -		<propval name='daemon-args' type='astring' value='-P 0'/> +		         value='solaris.smf.value.routing' /> + +		<!-- Options common to Quagga daemons --> +		<!-- The config file to use, if not the default --> +		<propval name='config_file' type='astring' value=''/> +		<!-- The vty_port to listen on if not the default. +		     0 to disable -->  +		<propval name='vty_port' type='integer' value='0' /> +		<!-- The address to bind the VTY interface to, if not any. --> +		<propval name='vty_address' type='astring' value='' /> +		<!-- The user to switch to after startup, if not the default --> +		<propval name='user' type='astring' value='' /> +		<!-- The group to switch to, if not the default. +		     If user is specified, this defaults to a group with +		     same name as user --> +		<propval name='group' type='astring' value='' /> +		<!-- The pidfile to use, if not the default of +		     @quagga_statedir@ --> +		<propval name='pid_file' type='astring' value='' />  	</property_group>  	<property_group name='general' type='framework'>  		<!-- to start stop routing services -->  		<propval name='action_authorization' type='astring'  			 value='solaris.smf.manage.routing' /> +		<propval name='value_authorization' type='astring' +			 value='solaris.smf.manage.routing' />  	</property_group>  	<template>  		<common_name>  			<loctext xml:lang='C'> -			Quagga: ospf6d, OSPFv3 IPv6 routing protocol daemon. + 			Quagga: ospf6d, OSPFv3 IPv6 routing protocol daemon.  			</loctext>  		</common_name>  		<documentation> @@ -487,7 +668,7 @@  		</documentation>  	</template>  	</instance> -	<stability value='Evolving' /> +	<stability value='Unstable' />  </service> @@ -506,40 +687,48 @@  			value='svc:/system/filesystem/usr:default' />  	</dependency> -	<!-- Depends on WIP, not yet in SNV -	<dependency name='net' -		grouping='require_any' -		restart_on='none' +	<dependency +		name='ipv6-forwarding' +		grouping='optional_all' +		restart_on='refresh'  		type='service'> -		<service_fmri value='svc:/network/routing/ipv6-routing' /> -		<service_fmri value='svc:/network/routing/ipv4-routing' /> +		<service_fmri value='svc:/network/ipv6-forwarding' /> +	</dependency> + +	<dependency +		name='ipv4-forwarding' +		grouping='optional_all' +		restart_on='refresh' +		type='service'> +		<service_fmri value='svc:/network/ipv4-forwarding' />  	</dependency> -	--> -	<dependency name='zebra' -			grouping='optional_all' -			restart_on='restart' -			type='service'> -			<service_fmri value='svc:/network/routing/zebra:quagga' /> +	<!-- do not not run unless routing-setup has run --> +	<dependency +		name='network_routing_setup' +		grouping='require_all' +		restart_on='refresh' +		type='service'> +		<service_fmri value='svc:/network/routing-setup' />  	</dependency> -	<dependency name='config_data' -		grouping='require_all' +	<!-- ensure that restart of zebra is propogated to daemon --> +	<dependency +		name='zebra' +		grouping='optional_all'  		restart_on='restart' -		type='path'> -		<service_fmri -			value='file://localhost/@sysconfdir@/bgpd.conf' /> +		type='service'> +		<service_fmri value='svc:/network/routing/zebra:quagga' />  	</dependency> -	 +  	<exec_method  		type='method'  		name='start' -		exec='/lib/svc/method/quagga bgpd %{routing/daemon-args}' +		exec='/lib/svc/method/quagga bgpd'  		timeout_seconds='60'>  		<method_context>  		  <method_credential -		   user='root' group='root' -		   privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess'/> +		   user='root' group='root'/>   		</method_context>  	</exec_method> @@ -557,16 +746,65 @@  		    type='astring' value='core,signal' />  	</property_group> +	<!-- Properties in this group are used by routeadm (1M) --> +	<property_group name='routeadm' type='application'> +		<stability value='Unstable' /> +		<!-- Identifies service as a routing service --> +		<propval name='daemon' type='astring' +			value='@sbindir@/bgpd' /> +		<propval name='legacy-daemon' type='astring' +			value='/usr/sfw/sbin/bgpdstart' /> +		<propval name='value_authorization' type='astring' +			value='solaris.smf.value.routing' /> +		<property name='protocol' type='astring'> +			<astring_list> +				<value_node value='ipv4'/> +				<value_node value='ipv6'/> +			</astring_list> +		</property> +	</property_group> +	 +	<!-- Properties in this group are modifiable via routeadm (1M) -->  	<property_group name='routing' type='application'>  		<propval name='value_authorization' type='astring'  -		         value='solaris.smf.modify.routing' /> -		<propval name='daemon-args' type='astring' value='-P 0'/> +		         value='solaris.smf.value.routing' /> + +		<!-- Options common to Quagga daemons. --> +		<!-- The config file to use, if not the default --> +		<propval name='config_file' type='astring' value=''/> +		<!-- The vty_port to listen on if not the default. +		     0 to disable -->  +		<propval name='vty_port' type='integer' value='0' /> +		<!-- The address to bind the VTY interface to, if not any. --> +		<propval name='vty_address' type='astring' value='' /> +		<!-- The user to switch to after startup, if not the default --> +		<propval name='user' type='astring' value='' /> +		<!-- The group to switch to, if not the default. +		     If user is specified, this defaults to a group with +		     same name as user --> +		<propval name='group' type='astring' value='' /> +		<!-- The pidfile to use, if not the default of +		     @quagga_statedir@ --> +		<propval name='pid_file' type='astring' value='' /> + +		<!-- Options specific to bgpd --> +		<propval name='retain' type='boolean' value='false' /> +		<propval name='no_kernel' type='boolean' value='false' /> +		<propval name='bgp_port' type='astring' value='' /> +		 +		<!-- +			If enable_zebra is false, it will not be switched +			on by the start method. +		--> +		<propval name='enable_zebra' type='boolean' value='true' />  	</property_group>  	<property_group name='general' type='framework'>  		<!-- to start stop routing services -->  		<propval name='action_authorization' type='astring'  			 value='solaris.smf.manage.routing' /> +		<propval name='value_authorization' type='astring' +			 value='solaris.smf.manage.routing' />  	</property_group>  	<template> @@ -583,6 +821,6 @@  		</documentation>  	</template>  	</instance> -	<stability value='Evolving' /> +	<stability value='Unstable' />  </service>  </service_bundle> | 
