]> git.puffer.fish Git - mirror/frr.git/commitdiff
[solaris] Sync SMF bits with OpenSolaris SFW
authorPaul Jakma <paul.jakma@sun.com>
Thu, 3 Jul 2008 20:41:08 +0000 (20:41 +0000)
committerPaul Jakma <paul.jakma@sun.com>
Thu, 3 Jul 2008 20:41:08 +0000 (20:41 +0000)
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.

solaris/ChangeLog
solaris/quagga.init.in
solaris/quagga.xml.in

index 8a2ad7d3cd284b8c5e69d877888c74bf43ddc51d..65135d995c6f6cc81f5937e5e1832c72339466ab 100644 (file)
@@ -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.
index 30a9c6943fb6ae7c5c9e5fb49deb0b3d724144b1..8b298c37e1d80eef1a43aed31199e6b8ae23b508 100755 (executable)
@@ -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.
 # 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   
 
index 3cd402f698f86d6af87515c11e7448f29ff79502..50c52c2260e85ff026cb388bed7da21eaa3680f0 100644 (file)
        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'
                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>
 
                <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>
                </documentation>
        </template>
        </instance>
-       <stability value='Evolving' />
+       <stability value='Unstable' />
 </service>
 
 <service
                        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>
 
                    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>
                </documentation>
        </template>
        </instance>
-       <stability value='Evolving' />
+       <stability value='Unstable' />
 </service>
 
 <service
                        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>
 
                    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>
                </documentation>
        </template>
        </instance>
-       <stability value='Evolving' />
+       <stability value='Unstable' />
 </service>
 
 <service
                        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'
                    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>
                </documentation>
        </template>
        </instance>
-       <stability value='Evolving' />
+       <stability value='Unstable' />
 </service>
 
 <service
                        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>
 
                    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>
                </documentation>
        </template>
        </instance>
-       <stability value='Evolving' />
+       <stability value='Unstable' />
 </service>
 
 
                        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>
 
                    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>
                </documentation>
        </template>
        </instance>
-       <stability value='Evolving' />
+       <stability value='Unstable' />
 </service>
 </service_bundle>