]> git.proxmox.com Git - mirror_frr.git/commitdiff
[solaris] SMF manifest, method and depend updates.
authorPaul Jakma <paul.jakma@sun.com>
Thu, 30 Mar 2006 13:38:28 +0000 (13:38 +0000)
committerPaul Jakma <paul.jakma@sun.com>
Thu, 30 Mar 2006 13:38:28 +0000 (13:38 +0000)
2006-03-13 Alan Maguire <alan.maguire@sun.com>

* quagga.xml.in: Change the naming of services and instances.
  network/routing/quagga:<daemon> may be neat and tidy, but
  it's at odds with SMF convention elsewhere that demands
  the service be named for what it does, and the instance name
  describe the implementation (e.g. network/smtp:sendmail).
  Remove call to method script for 'stop', SMF can do that
  itself.
  Enumerate the privileges required in the SMF manifest, with the
  method_credential element.
  Dont try provide seperate properties for each argument, it's
  just tedious, particularly when they can no longer be
  inherited from a common quagga service - use a single
  "daemon-args" property, defaulting to -P 0.
  Specify authorisation for the 'routeadm' utility and for
  RBAC.

2006-03-13 Paul Jakma <paul.jakma@sun.com>

* quagga.init.in: Update to match SMF manifest changes.
  If run from an SMF environment, assume method is start.
  Offer a more tradition init script interface for pre-SMF.
  Enable zebra for the link-state daemons.
  Don't allow daemons to start in non-global zones, except
  for bgpd - it doesn't have to care about underlying
  networking much.
  Remove all the svcprop calls, SMF or the user will supply any
  arguments on the command-line.
* depend.smf.in: Add dependency on SUNWroute, which provides
  routeadm, which provides /var/svc/manifest/network/routing
* prototype.smf.in: Install manifest to
  var/svc/manifest/network/routing.

solaris/ChangeLog
solaris/depend.smf.in
solaris/prototype.smf.in
solaris/quagga.init.in
solaris/quagga.xml.in

index 138621474be9f8abefa8db75929eb9a20cae2f13..4185d92ed46a85426530225ebb0f08ca2fc8a7f7 100644 (file)
@@ -1,3 +1,37 @@
+2006-03-13 Alan Maguire <alan.maguire@sun.com>
+
+       * quagga.xml.in: Change the naming of services and instances.
+         network/routing/quagga:<daemon> may be neat and tidy, but
+         it's at odds with SMF convention elsewhere that demands
+         the service be named for what it does, and the instance name
+         describe the implementation (e.g. network/smtp:sendmail).
+         Remove call to method script for 'stop', SMF can do that
+         itself.
+         Enumerate the privileges required in the SMF manifest, with the
+         method_credential element.
+         Dont try provide seperate properties for each argument, it's
+         just tedious, particularly when they can no longer be
+         inherited from a common quagga service - use a single
+         "daemon-args" property, defaulting to -P 0.
+         Specify authorisation for the 'routeadm' utility and for
+         RBAC.
+
+2006-03-13 Paul Jakma <paul.jakma@sun.com>
+
+       * quagga.init.in: Update to match SMF manifest changes.
+         If run from an SMF environment, assume method is start.
+         Offer a more tradition init script interface for pre-SMF.
+         Enable zebra for the link-state daemons.
+         Don't allow daemons to start in non-global zones, except
+         for bgpd - it doesn't have to care about underlying
+         networking much.
+         Remove all the svcprop calls, SMF or the user will supply any
+         arguments on the command-line.
+       * depend.smf.in: Add dependency on SUNWroute, which provides
+         routeadm, which provides /var/svc/manifest/network/routing
+       * prototype.smf.in: Install manifest to 
+         var/svc/manifest/network/routing.
+
 2006-02-19 Paul Jakma <paul.jakma@sun.com>
 
        * depend.*: renamed to depend.*.in.
index d078ea8e887d01b139fca8d9f4aea7172c928706..6d928d2df765759717f231edd616cd7e8c2dfd65 100644 (file)
@@ -2,6 +2,7 @@ P QUAGGAdaemons Quagga daemons
        @PACKAGE_VERSION@,REV=@CONFDATE@
 P SUNWcsu Core Solaris, (Usr)
 P SUNWcsr Core Solaris Libraries (Root)
+P SUNWroute Network Routing daemons/commands (Usr)
 I SUNWzebrar
 I SUNWzebrau
 I CSWzebra
index 3c80f39b1e380e1312dc7714c53946c20d80ebaf..399a8d2d693d830d9d06533e71d8a86032d72cb4 100644 (file)
@@ -3,6 +3,6 @@ i depend=$abs_builddir/depend.smf
 i copying=$abs_top_srcdir/COPYING
 i i.manifest
 i r.manifest
-f manifest var/svc/manifest/network/quagga.xml 0444 root bin
+f manifest var/svc/manifest/network/routing/quagga.xml 0444 root bin
 #f none var/svc/profile/@PACKAGE_TARNAME@_options.xml=$abs_builddir/options.xml 0755 root sys
 f none lib/svc/method/quagga=$abs_builddir/quagga.init 0755 root bin
index 1fa987659d7e562ee1a28a965929b3cdf2253506..9fc2fe744c479546710280241bff43dc87cac36b 100755 (executable)
 #!/sbin/sh
 #
-# Copyright 2001,2003 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2001,2003 Sun Microsystems, Inc. All rights reserved.
 # Use is subject to license terms.
 #
-# $Id: quagga.init.in,v 1.5 2006/02/19 18:59:26 paul Exp $
+# $Id: quagga.init.in,v 1.6 2006/03/30 13:38:28 paul Exp $
 #
-# Starts/stops the appropriate daemon
+# Starts/stops the given daemon
 
 SMFINCLUDE=/lib/svc/share/smf_include.sh
+DAEMON_PATH=@sbindir@
 
+quagga_is_globalzone () {
+       if [ "${QUAGGA_INIT_ZONENAME:=`/sbin/zonename`}" != "global" ]; then
+               return 1
+       else
+               return 0
+       fi
+}
+
+# Include smf functions, if available. If not, define smf_present to indicate
+# there is no SMF. Should allow this script to work pre-S10.
 if [ -f "$SMFINCLUDE" ] ; then
        . "$SMFINCLUDE";
+else
+       # pre-SMF system, fake up any functions and exit codes
+       # which SMFINCLUDE usually provides.
+       smf_present () {
+               return 1
+       }
+       SMF_EXIT_OK=0;
+       SMF_EXIT_ERR_CONFIG=96;
+       SMF_EXIT_ERR_FATAL=95;
 fi
+       
+# if there's no SMF, set some default DAEMON_ARGS
+smf_present || DAEMON_ARGS=""
 
 usage () {
-       echo "Usage: $0 (start|stop) <fmri> <instance>";
-}      
+       if smf_present ; then
+               echo "Usage: $0 <daemon> <daemon arguments>";
+       else
+               echo "Usage: $0 <stop|start> <daemon> <daemon arguments>";
+       fi
+       echo "The --pid_file argument is implied";
+       echo "This help message: $0 <help|usage>";
+}
 
+# parse arguments, different according to SMF or not.
 case $1 in
        'help' | 'usage')
-       usage
-       ;;
+               usage
+               exit SMF_EXIT_OK
+               ;;
 esac
 
-# fmri and instance must be given.
-FMRI="$2"
-INSTANCE="$3"
-if [ -z "$FMRI" -o -z "$INSTANCE" ]; then
-       usage
-       exit $SMF_EXIT_ERR_CONFIG
+if smf_present ; then
+       QUAGGA_METHOD="start"
+else
+       QUAGGA_METHOD="$1"
+       shift;
 fi
 
-# fmri must exist
-svcs ${FMRI} > /dev/null 2>&1 || exit $SMF_EXIT_ERR_CONFIG
+DAEMON="$1"
+shift
+DAEMON_ARGS="$@"
 
-case ${INSTANCE} in
-       zebra | bgpd )
+# daemon path must be given
+if [ -z "$DAEMON_PATH/$DAEMON" ]; then
+       usage
+       exit $SMF_EXIT_ERR_FATAL
+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 )
-       /usr/sbin/svcadm enable zebra
+               quagga_is_globalzone || exit $SMF_EXIT_OK
        ;;
        *)
-       usage
-       exit $SMF_EXIT_ERR_CONFIG;
+               usage
+               exit $SMF_EXIT_ERR_CONFIG;
        ;;
 esac
 
-svcprop -q -p @PACKAGE_TARNAME@/config_file ${FMRI} && \
-       CONFFILE=`svcprop -p @PACKAGE_TARNAME@/config_file ${FMRI}`
-svcprop -q -p @PACKAGE_TARNAME@/pid_file ${FMRI} && \
-       PIDFILE=`svcprop -p @PACKAGE_TARNAME@/pid_file ${FMRI}`
-svcprop -q -p @PACKAGE_TARNAME@/user ${FMRI} && \
-       USER=`svcprop -p @PACKAGE_TARNAME@/user ${FMRI}`
-svcprop -q -p @PACKAGE_TARNAME@/group ${FMRI} && \
-       GROUP=`svcprop -p @PACKAGE_TARNAME@/group ${FMRI}`
-svcprop -q -p @PACKAGE_TARNAME@/vty_addr ${FMRI} && \
-       VTYADDR=`svcprop -p @PACKAGE_TARNAME@/vty_addr ${FMRI}`
-svcprop -q -p @PACKAGE_TARNAME@/vty_port ${FMRI} && \
-       VTYPORT=`svcprop -p @PACKAGE_TARNAME@/vty_port ${FMRI}`
-
-[ -n "${CONFFILE}" ] && ARGS=" -f ${CONFFILE}"
-[ -n "${PIDFILE}" ] && ARGS="${ARGS} --pid_file ${PIDFILE}"
-[ -n "${USER}" ] && ARGS="${ARGS} --user ${USER}"
-[ -n "${GROUP}" ] && ARGS="${ARGS} --group ${GROUP}"
-
-# vty should default to disabled, ie port == 0
-[ -z "${VTYPORT}" ] && VTYPORT=0
-ARGS="${ARGS} --vty_port ${VTYPORT}"
-
-# default listen address should be localhost
-[ -z "${VTYADDR}" ] && VTYADDR=127.1
-ARGS="${ARGS} --vty_addr ${VTYADDR}"
-
-# have to have a pid file for script to work
-# we can assume it otherwise
-if [ -z "${PIDFILE}" ]; then
-       PIDFILE="@quagga_statedir@/${INSTANCE}.pid"
-else
-       ARGS="${ARGS} --pid_file ${PIDFILE}"
-fi
-
-# we need @quagga_statedir@ to exist, it might be on tmpfs.
+# we need @quagga_statedir@ to exist, it probably is on tmpfs.
 if [ ! -d @quagga_statedir@ ] ; then
        mkdir -p @quagga_statedir@
        chown @enable_user@:@enable_group@ @quagga_statedir@
        chmod 751 @quagga_statedir@
 fi
 
+PIDFILE="@quagga_statedir@/${DAEMON}.pid"
+
 start () {
-       @sbindir@/${INSTANCE} ${ARGS} &
+       $DAEMON_PATH/$DAEMON $DAEMON_ARGS --pid_file ${PIDFILE} &
 }
 
 stop () {
@@ -97,17 +107,17 @@ stop () {
        fi
 }
 
-case $1 in 
+case "$QUAGGA_METHOD" in
 'start')
-       start ${2}
+       start
        ;;
 'stop')
-       stop ${2}
+       stop
        ;;
 
 *)
        usage
-       exit 1
+       exit SMF_EXIT_ERR_FATAL
        ;;
 esac   
 
index 5ce4aceb39f0dcd272a2c239f2bba7add671b1a2..45fa2148bc56a1792a1e3e9051da4b38408d6f00 100644 (file)
@@ -8,15 +8,13 @@
 -->
 
 <service_bundle type='manifest' name='QUAGGAdaemons:quagga'>
-
 <service
-       name='network/routing/quagga'
+       name='network/routing/zebra'
        type='service'
        version='1'>
 
-       <!-- 
-               common service-level dependencies, inherited by each instance
-       -->
+       <instance name='quagga' enabled='false'>
+       
        <dependency name='fs'
                grouping='require_all'
                restart_on='none'
                <service_fmri
                        value='svc:/system/filesystem/usr:default' />
        </dependency>
+       
        <dependency name='net'
                grouping='require_all'
                restart_on='none'
                type='service'>
-               <service_fmri value='svc:/network/loopback' />
+               <service_fmri value='svc:/network/initial' />
        </dependency>
 
-       <!--
-               we define exec methods at the top level, and the
-               instance name is substituted for the %i on calling.
-               See smf_method(1M) for more switches.
-       -->
+       <dependency name='config_data'
+               grouping='require_all'
+               restart_on='restart'
+               type='path'>
+               <service_fmri
+                       value='file://localhost/@sysconfdir@/zebra.conf' />
+       </dependency>
+       
        <exec_method
                type='method'
                name='start'
-               exec='/lib/svc/method/quagga start %f %i'
-               timeout_seconds='60'/>
+               exec='/lib/svc/method/quagga zebra %{routing/daemon-args}'
+               timeout_seconds='60'>
+               <method_context>
+                 <method_credential
+                  user='root' group='root'
+                  privileges='basic,net_icmpaccess,net_rawaccess,sys_admin,sys_net_config'/>
+               </method_context>
+       </exec_method>
 
        <exec_method
                type='method'
                name='stop'
-               exec='/lib/svc/method/quagga stop %f %i'
-               timeout_seconds='60' />
+               exec=':kill'
+               timeout_seconds='60'>
+       </exec_method>
 
-       <!-- 
-               if we define these properties at the service level, each instance
-               inherits them, and it can override with desired values. 
+       <!--    if we define these properties at the service level, each
+               instance inherits them, and it can override with
+               desired values.
        -->
        <property_group name='startd'
                type='framework'>
                <propval name='ignore_error'
                    type='astring' value='core,signal' />
        </property_group>
-       <property_group name='quagga' type='application'>
-               <!-- Options common to Quagga daemons -->       
-               <propval name='vty_addr' type='astring' value='127.1' />
-               <propval name='vty_port' type='integer' value='0'/>
-               <propval name='user' type='astring' value='@enable_user@' />
-               <propval name='group' type='astring' value='@enable_group@' />
-               <propval name='retain' type='boolean' value='false'/>
+
+       <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'/>
        </property_group>
        
-       <instance name='zebra' enabled='false'>
-               <!-- 
-                       now define it's own dependencies/properties etc here, it'll
-                       inherit the rest...
-               -->
-               <dependency name='config_data'
-                       grouping='require_all'
-                       restart_on='restart'
-                       type='path'>
-                       <service_fmri
-                           value='file://localhost/@sysconfdir@/zebra.conf' />
-               </dependency>
-               <property_group name='quagga' type='application'>
-                       <propval name='keep_kernel' type='boolean' 
-                               value='false'/>
-               </property_group>
-               <template>
-                       <common_name>
-                               <loctext xml:lang='C'>
-                               Quagga: zebra, RIB, kernel intermediary and misc daemon
-                               </loctext>
-                       </common_name>
-                       <documentation>
-                               <manpage title='zebra' section='1M'
-                                       manpath='@mandir@' />
-                       </documentation>
-               </template>
+       <property_group name='general' type='framework'>
+               <!-- to start stop routing services -->
+               <propval name='action_authorization' type='astring'
+                        value='solaris.smf.manage.routing' />
+       </property_group>
 
+       <template>
+               <common_name>
+                       <loctext xml:lang='C'>
+                       Quagga: zebra, RIB, kernel intermediary and misc daemon
+                       </loctext>
+               </common_name>
+               <documentation>
+                       <manpage title='zebra' section='1M'
+                               manpath='@mandir@' />
+                       <doc_link name='quagga.net' 
+                               uri='http://www.quagga.net/' />
+               </documentation>
+       </template>
        </instance>
+       <stability value='Evolving' />
+</service>
+
+<service
+       name='network/routing/rip'
+       type='service'
+       version='1'>
+
+       <instance name='quagga' enabled='false'>
+
+       <dependency name='fs'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri
+                       value='svc:/system/filesystem/usr:default' />
+       </dependency>
        
-       <instance name='bgpd' enabled='false'>
-               <!-- 
-                       now define it's own dependencies/properties etc here, it'll
-                       inherit the rest...
-               -->
-               <dependency name='zebra'
-                       grouping='optional_all'
-                       restart_on='restart'
-                       type='service'>
-                       <service_fmri value='svc:/network/routing/quagga:zebra' />
-               </dependency>
-               <dependency name='config_data'
+       <dependency name='net'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri value='svc:/network/routing/ipv4-routing' />
+       </dependency>
+
+       <dependency name='zebra'
                        grouping='require_all'
                        restart_on='restart'
-                       type='path'>
-                       <service_fmri
-                           value='file://localhost/@sysconfdir@/bgpd.conf' />
-               </dependency>
-               <property_group name='quagga' type='application'>
-                       <propval name='no_kernel' type='boolean'
-                               value='false'/>
-               </property_group>
-               <template>
-                       <common_name>
-                               <loctext xml:lang='C'>
-                               Quagga: bgpd, BGP routing protocol daemon.
-                               </loctext>
-                       </common_name>
-                       <documentation>
-                               <manpage title='bgpd' section='1M'
-                                       manpath='@mandir@' />
-                               <doc_link name='quagga.net' 
-                                       uri='http://www.quagga.net/' />
-                       </documentation>
-               </template>
+                       type='service'>
+                       <service_fmri value='svc:/network/routing/zebra:quagga' />
+       </dependency>
+
+       <dependency name='config_data'
+               grouping='require_all'
+               restart_on='restart'
+               type='path'>
+               <service_fmri
+                       value='file://localhost/@sysconfdir@/ripd.conf' />
+       </dependency>
+       
+       <exec_method
+               type='method'
+               name='start'
+               exec='/lib/svc/method/quagga ripd %{routing/daemon-args}'
+               timeout_seconds='60'>
+               <method_context>
+                 <method_credential
+                  user='root' group='root'
+                  privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess'/>
+               </method_context>
+       </exec_method>
+
+       <exec_method
+               type='method'
+               name='stop'
+               exec=':kill'
+               timeout_seconds='60'>
+       </exec_method>
+
+       <property_group name='startd'
+               type='framework'>
+               <!-- sub-process core dumps shouldn't restart session -->
+               <propval name='ignore_error'
+                   type='astring' value='core,signal' />
+       </property_group>
+
+       <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'/>
+       </property_group>
 
+       <property_group name='general' type='framework'>
+               <!-- to start stop routing services -->
+               <propval name='action_authorization' type='astring'
+                        value='solaris.smf.manage.routing' />
+       </property_group>
+
+       <template>
+               <common_name>
+                       <loctext xml:lang='C'>
+                       Quagga: ripd, RIPv1/2 IPv4 routing protocol daemon.
+                       </loctext>
+               </common_name>
+               <documentation>
+                       <manpage title='ripd' section='1M'
+                               manpath='@mandir@' />
+                       <doc_link name='quagga.net' 
+                               uri='http://www.quagga.net/' />
+               </documentation>
+       </template>
        </instance>
+       <stability value='Evolving' />
+</service>
+
+<service
+       name='network/routing/ripng'
+       type='service'
+       version='1'>
+
+       <instance name='quagga' enabled='false'>
+
+       <dependency name='fs'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri
+                       value='svc:/system/filesystem/usr:default' />
+       </dependency>
        
-       <instance name='ospf6d' enabled='false'>
-               <!-- 
-                       now define it's own dependencies/properties etc here, it'll
-                       inherit the rest...
-               -->
-               <dependency name='zebra'
+       <dependency name='net'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri value='svc:/network/routing/ipv6-routing' />
+       </dependency>
+
+       <dependency name='zebra'
                        grouping='require_all'
                        restart_on='restart'
                        type='service'>
-                       <service_fmri value='svc:/network/routing/quagga:zebra' />
-               </dependency>
-               <dependency name='config_data'
-                       grouping='require_all'
-                       restart_on='restart'
-                       type='path'>
-                       <service_fmri
-                           value='file://localhost/@sysconfdir@/ospf6d.conf' />
-               </dependency>
-               <template>
-                       <common_name>
-                               <loctext xml:lang='C'>
-                               Quagga: ospf6d, OSPFv3 IPv6 routing protocol daemon.
-                               </loctext>
-                       </common_name>
-                       <documentation>
-                               <manpage title='ospf6d' section='1M'
-                                       manpath='@mandir@' />
-                               <doc_link name='quagga.net' 
-                                       uri='http://www.quagga.net/' />
-                       </documentation>
-               </template>
+                       <service_fmri value='svc:/network/routing/zebra:quagga' />
+       </dependency>
+
+       <dependency name='config_data'
+               grouping='require_all'
+               restart_on='restart'
+               type='path'>
+               <service_fmri
+                       value='file://localhost/@sysconfdir@/ripngd.conf' />
+       </dependency>
+       
+       <exec_method
+               type='method'
+               name='start'
+               exec='/lib/svc/method/quagga ripngd %{routing/daemon-args}'
+               timeout_seconds='60'>
+               <method_context>
+                 <method_credential
+                  user='root' group='root'
+                  privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess'/>
+               </method_context>
+       </exec_method>
+
+       <exec_method
+               type='method'
+               name='stop'
+               exec=':kill'
+               timeout_seconds='60' >
+       </exec_method>
+
+       <property_group name='startd'
+               type='framework'>
+               <!-- sub-process core dumps shouldn't restart session -->
+               <propval name='ignore_error'
+                   type='astring' value='core,signal' />
+       </property_group>
+
+       <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'/>
+       </property_group>
+
+       <property_group name='general' type='framework'>
+               <!-- to start stop routing services -->
+               <propval name='action_authorization' type='astring'
+                        value='solaris.smf.manage.routing' />
+       </property_group>
 
+       <template>
+               <common_name>
+                       <loctext xml:lang='C'>
+                       Quagga: ripngd, RIPng IPv6 routing protocol daemon.
+                       </loctext>
+               </common_name>
+               <documentation>
+                       <manpage title='ripngd' section='1M'
+                               manpath='@mandir@' />
+                       <doc_link name='quagga.net' 
+                               uri='http://www.quagga.net/' />
+               </documentation>
+       </template>
        </instance>
+       <stability value='Evolving' />
+</service>
+
+<service
+       name='network/routing/ospf'
+       type='service'
+       version='1'>
+
+       <instance name='quagga' enabled='false'>
 
-       <instance name='ospfd' enabled='false'>
-               <!-- 
-                       now define it's own dependencies/properties etc here, it'll
-                       inherit the rest...
-               -->
-               <dependency name='zebra'
+       <dependency name='fs'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri
+                       value='svc:/system/filesystem/usr:default' />
+       </dependency>
+       
+       <dependency name='net'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri value='svc:/network/routing/ipv4-routing' />
+       </dependency>
+
+       <dependency name='zebra'
                        grouping='require_all'
                        restart_on='restart'
                        type='service'>
-                       <service_fmri value='svc:/network/routing/quagga:zebra' />
-               </dependency>
-               <dependency name='config_data'
-                       grouping='require_all'
-                       restart_on='restart'
-                       type='path'>
-                       <service_fmri
-                           value='file://localhost/@sysconfdir@/ospfd.conf' />
-               </dependency>
-               <property_group name='quagga' type='application'>
-                       <propval name='retain_routes' type='boolean' value='false'/>
-               </property_group>
-               <template>
-                       <common_name>
-                               <loctext xml:lang='C'>
-                               Quagga: ospfd, OSPFv2 IPv4 routing protocol daemon.
-                               </loctext>
-                       </common_name>
-                       <documentation>
-                               <manpage title='ospfd' section='1M'
-                                       manpath='@mandir@' />
-                               <doc_link name='quagga.net' 
-                                       uri='http://www.quagga.net/' />
-                       </documentation>
-               </template>
+                       <service_fmri value='svc:/network/routing/zebra:quagga' />
+       </dependency>
+
+       <dependency name='config_data'
+               grouping='require_all'
+               restart_on='restart'
+               type='path'>
+               <service_fmri
+                       value='file://localhost/@sysconfdir@/ospfd.conf' />
+       </dependency>
+       
+       <exec_method
+               type='method'
+               name='start'
+               exec='/lib/svc/method/quagga ospfd %{routing/daemon-args}'
+               timeout_seconds='60'>
+               <method_context>
+                 <method_credential
+                  user='root' group='root'
+                  privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess,sys_net_config'/>
+               </method_context>
+       </exec_method>
+
+       <exec_method
+               type='method'
+               name='stop'
+               exec=':kill'
+               timeout_seconds='60'>
+       </exec_method>
+
+       <property_group name='startd'
+               type='framework'>
+               <!-- sub-process core dumps shouldn't restart session -->
+               <propval name='ignore_error'
+                   type='astring' value='core,signal' />
+       </property_group>
 
+       <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'/>
+       </property_group>
+
+       <property_group name='general' type='framework'>
+               <!-- to start stop routing services -->
+               <propval name='action_authorization' type='astring'
+                        value='solaris.smf.manage.routing' />
+       </property_group>
+
+       <template>
+               <common_name>
+                       <loctext xml:lang='C'>
+                       Quagga: ospfd, OSPFv2 IPv4 routing protocol daemon.
+                       </loctext>
+               </common_name>
+               <documentation>
+                       <manpage title='ospfd' section='1M'
+                               manpath='@mandir@' />
+                       <doc_link name='quagga.net' 
+                               uri='http://www.quagga.net/' />
+               </documentation>
+       </template>
        </instance>
+       <stability value='Evolving' />
+</service>
+
+<service
+       name='network/routing/ospf6'
+       type='service'
+       version='1'>
+
+       <instance name='quagga' enabled='false'>
+
+       <dependency name='fs'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri
+                       value='svc:/system/filesystem/usr:default' />
+       </dependency>
+       
+       <dependency name='net'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri value='svc:/network/routing/ipv6-routing' />
+       </dependency>
 
-       <instance name='ripd' enabled='false'>
-               <!-- 
-                       now define it's own dependencies/properties etc here, it'll
-                       inherit the rest...
-               -->
-               <dependency name='zebra'
+       <dependency name='zebra'
                        grouping='require_all'
                        restart_on='restart'
                        type='service'>
-                       <service_fmri value='svc:/network/routing/quagga:zebra' />
-               </dependency>
-               <dependency name='config_data'
-                       grouping='require_all'
-                       restart_on='restart'
-                       type='path'>
-                       <service_fmri
-                           value='file://localhost/@sysconfdir@/ripd.conf' />
-               </dependency>
-               <property_group name='quagga' type='application'>
-                       <propval name='retain_routes' type='boolean' value='false'/>
-               </property_group>
-               <template>
-                       <common_name>
-                               <loctext xml:lang='C'>
-                               Quagga: ripd, RIPv1/2 IPv4 routing protocol daemon.
-                               </loctext>
-                       </common_name>
-                       <documentation>
-                               <manpage title='ripd' section='1M'
-                                       manpath='@mandir@' />
-                               <doc_link name='quagga.net' 
-                                       uri='http://www.quagga.net/' />
-                       </documentation>
-               </template>
+                       <service_fmri value='svc:/network/routing/zebra:quagga' />
+       </dependency>
+
+       <dependency name='config_data'
+               grouping='require_all'
+               restart_on='restart'
+               type='path'>
+               <service_fmri
+                       value='file://localhost/@sysconfdir@/ospf6d.conf' />
+       </dependency>
+       
+       <exec_method
+               type='method'
+               name='start'
+               exec='/lib/svc/method/quagga ospf6d %{routing/daemon-args}'
+               timeout_seconds='60'>
+               <method_context>
+                 <method_credential
+                  user='root' group='root'
+                  privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess'/>
+               </method_context>
+       </exec_method>
+
+       <exec_method
+               type='method'
+               name='stop'
+               exec=':kill'
+               timeout_seconds='60'>
+       </exec_method>
 
+       <property_group name='startd'
+               type='framework'>
+               <!-- sub-process core dumps shouldn't restart session -->
+               <propval name='ignore_error'
+                   type='astring' value='core,signal' />
+       </property_group>
+
+       <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'/>
+       </property_group>
+
+       <property_group name='general' type='framework'>
+               <!-- to start stop routing services -->
+               <propval name='action_authorization' type='astring'
+                        value='solaris.smf.manage.routing' />
+       </property_group>
+
+       <template>
+               <common_name>
+                       <loctext xml:lang='C'>
+                       Quagga: ospf6d, OSPFv3 IPv6 routing protocol daemon.
+                       </loctext>
+               </common_name>
+               <documentation>
+                       <manpage title='ospf6d' section='1M'
+                               manpath='@mandir@' />
+                       <doc_link name='quagga.net' 
+                               uri='http://www.quagga.net/' />
+               </documentation>
+       </template>
        </instance>
+       <stability value='Evolving' />
+</service>
 
-       <instance name='ripngd' enabled='false'>
-               <!-- 
-                       now define it's own dependencies/properties etc here, it'll
-                       inherit the rest...
-               -->
-               <dependency name='zebra'
-                       grouping='require_all'
+
+<service
+       name='network/routing/bgp'
+       type='service'
+       version='1'>
+
+       <instance name='quagga' enabled='false'>
+
+       <dependency name='fs'
+               grouping='require_all'
+               restart_on='none'
+               type='service'>
+               <service_fmri
+                       value='svc:/system/filesystem/usr:default' />
+       </dependency>
+
+       <dependency name='net'
+               grouping='require_any'
+               restart_on='none'
+               type='service'>
+               <service_fmri value='svc:/network/routing/ipv6-routing' />
+               <service_fmri value='svc:/network/routing/ipv4-routing' />
+       </dependency>
+       
+       <dependency name='zebra'
+                       grouping='optional_all'
                        restart_on='restart'
                        type='service'>
-                       <service_fmri value='svc:/network/routing/quagga:zebra' />
-               </dependency>
-               <dependency name='config_data'
-                       grouping='require_all'
-                       restart_on='restart'
-                       type='path'>
-                       <service_fmri
-                           value='file://localhost/@sysconfdir@/ripngd.conf' />
-               </dependency>
-               <property_group name='quagga' type='application'>
-                       <propval name='retain_routes' type='boolean' 
-                               value='false'/>
-               </property_group>
-               <template>
-                       <common_name>
-                               <loctext xml:lang='C'>
-                               Quagga: ripngd, RIPng IPv6 routing protocol daemon.
-                               </loctext>
-                       </common_name>
-                       <documentation>
-                               <manpage title='ripngd' section='1M'
-                                       manpath='@mandir@' />
-                               <doc_link name='quagga.net' 
-                                       uri='http://www.quagga.net/' />
-                       </documentation>
-               </template>
+                       <service_fmri value='svc:/network/routing/zebra:quagga' />
+       </dependency>
 
-       </instance>
+       <dependency name='config_data'
+               grouping='require_all'
+               restart_on='restart'
+               type='path'>
+               <service_fmri
+                       value='file://localhost/@sysconfdir@/bgpd.conf' />
+       </dependency>
+       
+       <exec_method
+               type='method'
+               name='start'
+               exec='/lib/svc/method/quagga bgpd %{routing/daemon-args}'
+               timeout_seconds='60'>
+               <method_context>
+                 <method_credential
+                  user='root' group='root'
+                  privileges='basic,net_icmpaccess,net_privaddr,net_rawaccess'/>
+               </method_context>
+       </exec_method>
 
-       <stability value='Evolving' />
+       <exec_method
+               type='method'
+               name='stop'
+               exec=':kill'
+               timeout_seconds='60' >
+       </exec_method>
 
-</service>
+       <property_group name='startd'
+               type='framework'>
+               <!-- sub-process core dumps shouldn't restart session -->
+               <propval name='ignore_error'
+                   type='astring' value='core,signal' />
+       </property_group>
 
+       <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'/>
+       </property_group>
+
+       <property_group name='general' type='framework'>
+               <!-- to start stop routing services -->
+               <propval name='action_authorization' type='astring'
+                        value='solaris.smf.manage.routing' />
+       </property_group>
+
+       <template>
+               <common_name>
+                       <loctext xml:lang='C'>
+                       Quagga: bgpd, BGP routing protocol daemon.
+                       </loctext>
+               </common_name>
+               <documentation>
+                       <manpage title='bgpd' section='1M'
+                               manpath='@mandir@' />
+                       <doc_link name='quagga.net' 
+                               uri='http://www.quagga.net/' />
+               </documentation>
+       </template>
+       </instance>
+       <stability value='Evolving' />
+</service>
 </service_bundle>