123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- #!/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.
- #
- # 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}
- }
- # 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 [ "$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`;
- else
- if [ $# -gt 0 ] ; then
- shift
- DAEMON_ARGS="$@"
- fi
- fi
- upgrade_config "$DAEMON"
- CONF_FILE=`get_routeadm_property $SMF_FMRI config_file`
- if [ -z "$CONF_FILE" ] ; then
- CONF_FILE="@sysconfdir@/${DAEMON}.conf"
- fi
- if [ ! -f "$CONF_FILE" ] ; then
- echo "Could not find config file, $CONF_FILE"
- 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_by_pidfile () {
- if [ -f "${PIDFILE}" ]; then
- /usr/bin/kill -TERM `/usr/bin/cat "${PIDFILE}"`
- fi
- }
- case "$QUAGGA_METHOD" in
- 'start')
- start
- ;;
- 'stop')
- stop_by_pidfile
- ;;
- *)
- usage
- exit $SMF_EXIT_ERR_FATAL
- ;;
- esac
- exit $SMF_EXIT_OK;
|