diff options
-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> |