mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-28 12:10:24 +00:00

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.
305 lines
8.0 KiB
Bash
Executable File
305 lines
8.0 KiB
Bash
Executable File
#!/sbin/sh
|
|
#
|
|
# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
|
|
# Use is subject to license terms.
|
|
#
|
|
# This file is part of Quagga.
|
|
#
|
|
# Quagga is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the
|
|
# Free Software Foundation; either version 2, or (at your option) any
|
|
# later version.
|
|
#
|
|
# Quagga is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Quagga; see the file COPYING. If not, write to the Free
|
|
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
# 02111-1307, USA.
|
|
#
|
|
# $Id$
|
|
#
|
|
# 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" \
|
|
-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
|
|
}
|
|
|
|
# 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";
|
|
|
|
# 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.
|
|
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 () {
|
|
if smf_present ; then
|
|
echo "Usage: $0 <daemon>";
|
|
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
|
|
exit $SMF_EXIT_OK
|
|
;;
|
|
esac
|
|
|
|
if smf_present ; then
|
|
QUAGGA_METHOD="start"
|
|
else
|
|
QUAGGA_METHOD="$1"
|
|
shift;
|
|
fi
|
|
|
|
DAEMON="$1"
|
|
|
|
# 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
|
|
bgpd)
|
|
;;
|
|
zebra | ospfd | ospf6d | ripd | ripngd )
|
|
quagga_is_globalzone || exit $SMF_EXIT_OK
|
|
;;
|
|
*)
|
|
usage
|
|
exit $SMF_EXIT_ERR_CONFIG;
|
|
;;
|
|
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@
|
|
chown @enable_user@:@enable_group@ @quagga_statedir@
|
|
chmod 751 @quagga_statedir@
|
|
fi
|
|
|
|
PIDFILE="@quagga_statedir@/${DAEMON}.pid"
|
|
|
|
start () {
|
|
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 () {
|
|
if [ -f "${PIDFILE}" ]; then
|
|
/usr/bin/kill -TERM `/usr/bin/cat "${PIDFILE}"`
|
|
fi
|
|
}
|
|
|
|
case "$QUAGGA_METHOD" in
|
|
'start')
|
|
start
|
|
;;
|
|
'stop')
|
|
stop
|
|
;;
|
|
|
|
*)
|
|
usage
|
|
exit $SMF_EXIT_ERR_FATAL
|
|
;;
|
|
esac
|
|
|
|
exit $SMF_EXIT_OK;
|