File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / solaris / quagga.init.in
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:11 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    1: #!/sbin/sh
    2: #
    3: # Copyright 2007 Sun Microsystems, Inc. All rights reserved.
    4: # Use is subject to license terms.
    5: #
    6: # This file is part of Quagga.
    7: #
    8: # Quagga is free software; you can redistribute it and/or modify it
    9: # under the terms of the GNU General Public License as published by the
   10: # Free Software Foundation; either version 2, or (at your option) any
   11: # later version.
   12: #
   13: # Quagga is distributed in the hope that it will be useful, but
   14: # WITHOUT ANY WARRANTY; without even the implied warranty of
   15: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   16: # General Public License for more details.
   17: #
   18: # You should have received a copy of the GNU General Public License
   19: # along with Quagga; see the file COPYING.  If not, write to the Free
   20: # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   21: # 02111-1307, USA.
   22: #
   23: # Starts/stops the given daemon
   24: 
   25: SMFINCLUDE=/lib/svc/share/smf_include.sh
   26: ROUTEADMINCLUDE=/lib/svc/share/routing_include.sh
   27: GLOBAL_OPTIONS="PAfiug"
   28: DAEMON_PATH=@sbindir@
   29: USER=@enable_user@
   30: GROUP=@enable_group@
   31: 
   32: # handle upgrade of daemon-args SMF property to new routeadm properties
   33: # used during upgrade too by routeadm.
   34: # relevant to S10U4+ only.
   35: handle_routeadm_upgrade () {
   36: 	GLOBAL_OPTIONS="PAfiug"
   37: 	
   38: 	daemon_args=`get_daemon_args $SMF_FMRI`
   39: 	
   40: 	if [ -n "$daemon_args" ]; then
   41: 		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
   42: 			"$GLOBAL_OPTIONS" "P" vty_port 0
   43: 		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
   44: 			"$GLOBAL_OPTIONS" "A" vty_address
   45: 		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
   46: 			"$GLOBAL_OPTIONS" "f" config_file
   47: 		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
   48: 			"$GLOBAL_OPTIONS" "i" pid_file
   49: 		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
   50: 			"$GLOBAL_OPTIONS" "u" user
   51: 		set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
   52: 			"$GLOBAL_OPTIONS" "g" group
   53: 		
   54: 		case "$1" in
   55: 		zebra)
   56: 			set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \
   57: 				"${GLOBAL_OPTIONS}b" "b" batch true false
   58: 			;;
   59: 		ripd|ripngd)
   60: 			set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \
   61: 				"${GLOBAL_OPTIONS}r" "r" retain true false
   62: 			;;
   63: 		bgpd)
   64: 			set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \
   65: 				"${GLOBAL_OPTIONS}rnp" "r" retain true false
   66: 			set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \
   67: 				"${GLOBAL_OPTIONS}rnp" "n" no_kernel true false
   68: 			set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
   69: 				"${GLOBAL_OPTIONS}rnp" "p" bgp_port
   70: 		esac
   71: 		clear_daemon_args $SMF_FMRI
   72: 	fi
   73: }
   74: 
   75: upgrade_config () {
   76: 	DAEMON=$1
   77: 	# handle upgrade of SUNWzebra to Quagga
   78: 	if [ -d "/etc/quagga" -a ! -f "/etc/quagga/${DAEMON}.conf" ] ; then
   79: 		if [ -f "/etc/sfw/zebra/${DAEMON}.conf" ] ; then
   80: 			cp "/etc/sfw/zebra/${DAEMON}.conf" \
   81: 				"/etc/quagga/${DAEMON}.conf.upgrade" \
   82: 				|| exit $SMF_EXIT_ERR_FATAL
   83: 			chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.upgrade" \
   84: 				|| exit $SMF_EXIT_ERR_FATAL
   85: 			chmod 0600 "/etc/quagga/${DAEMON}.conf.upgrade" \
   86: 				|| exit $SMF_EXIT_ERR_FATAL
   87: 			mv "/etc/quagga/${DAEMON}.conf.upgrade" "/etc/quagga/${DAEMON}.conf" \
   88: 				|| exit $SMF_EXIT_ERR_FATAL
   89: 		fi
   90: 	fi
   91: 
   92: 	if [ ! -f "/etc/quagga/${DAEMON}.conf" ] ; then
   93: 		touch "/etc/quagga/${DAEMON}.conf.new" \
   94: 			|| exit $SMF_EXIT_ERR_FATAL
   95: 		chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.new" \
   96: 			|| exit $SMF_EXIT_ERR_FATAL
   97: 		chmod 0600 "/etc/quagga/${DAEMON}.conf.new" \
   98: 			|| exit $SMF_EXIT_ERR_FATAL
   99: 		mv "/etc/quagga/${DAEMON}.conf.new" "/etc/quagga/${DAEMON}.conf" \
  100: 			|| exit $SMF_EXIT_ERR_FATAL
  101: 	fi
  102: }
  103: 
  104: # Relevant to S10+
  105: quagga_is_globalzone () {
  106: 	if [ "${QUAGGA_INIT_ZONENAME:=`/sbin/zonename`}" = "global" \
  107: 		-o `/sbin/zonename -t` = "exclusive" ]; then
  108: 		return 0
  109: 	else
  110: 		return 1
  111: 	fi
  112: }
  113: 
  114: routeadm_daemon_args () {
  115: 	# globals
  116: 	args="`get_daemon_option_from_property $SMF_FMRI config_file f`"
  117: 	args="${args} `get_daemon_option_from_property $SMF_FMRI vty_port P`"
  118: 	args="${args} `get_daemon_option_from_property $SMF_FMRI vty_address A`"
  119: 	args="${args} `get_daemon_option_from_property $SMF_FMRI pid_file i`"
  120: 	
  121: 	# user and group we need for config file upgrade..
  122: 	SMF_USER=`get_routeadm_property $SMF_FMRI user`
  123: 	SMF_GROUP=`get_routeadm_property()$SMF_FMRI group`
  124: 	if [ "${SMF_USER}" ] ; then
  125: 		USER="${SMF_USER}"
  126: 		args="${args} -u ${SMF_USER}"
  127: 	fi
  128: 	if [ "${SMF_GROUP}" ] ; then 
  129: 		GROUP="${SMF_GROUP}"
  130: 		args="${args} -g ${SMF_GROUP}"
  131: 	fi
  132: 
  133: 	case $1 in
  134: 	zebra)
  135: 		args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI batch -b true`"
  136: 		;;
  137: 	ripd|ripngd)
  138: 		args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI retain -r true`"
  139: 		;;
  140: 	bgpd)
  141: 		args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI retain -r true`"
  142: 		args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI no_kernel -n true`"
  143: 		args="${args} `get_daemon_option_from_property $SMF_FMRI bgp_port p 179`"
  144: 		;;
  145: 	esac
  146: 	echo ${args}
  147: }
  148: 
  149: # certain daemons need zebra
  150: routeadm_zebra_enable () {
  151: 
  152: 	if [ "$DAEMON" = "zebra" ]; then
  153: 		return
  154: 	fi
  155: 	
  156: 	enable_zebra=`/usr/bin/svcprop -p \
  157: 		routing/enable_zebra $SMF_FMRI 2> /dev/null`
  158: 	if [ "$enable_zebra" != "false" ]; then
  159: 		zenabled=`/usr/bin/svcprop -p general/enabled zebra:quagga`
  160: 		zenabledt=`/usr/bin/svcprop -p general_ovr/enabled zebra:quagga`
  161: 		if [ "$zenabled" = "true" -o "$zenabledt" = "true" ]; then
  162: 			/usr/sbin/svcadm disable zebra:quagga
  163: 			/usr/sbin/svcadm enable -st zebra:quagga
  164: 		else
  165: 			/usr/sbin/svcadm enable -st zebra:quagga 
  166: 		fi
  167: 		if [ "$?" != "0" ]; then
  168: 			echo "Could not enable zebra:quagga"
  169: 			exit $SMF_EXIT_ERR_FATAL
  170: 		fi
  171: 	fi
  172: }
  173: 
  174: # Include smf functions, if available. If not, define smf_present to indicate
  175: # there is no SMF. Should allow this script to work pre-S10.
  176: if [ -f "$SMFINCLUDE" ] ; then
  177: 	. "$SMFINCLUDE";
  178: 	
  179: 	# source the SMF-routeadm include if present..
  180: 	if [ -f "$ROUTEADMINCLUDE" ] ; then
  181: 		. "$ROUTEADMINCLUDE"
  182: 	fi
  183: else
  184: 	# pre-SMF system, fake up any functions and exit codes
  185: 	# which SMFINCLUDE usually provides.
  186: 	smf_present () {
  187: 		return 1
  188: 	}
  189: 	SMF_EXIT_OK=0;
  190: 	SMF_EXIT_ERR_CONFIG=96;
  191: 	SMF_EXIT_ERR_FATAL=95;
  192: fi
  193: 	
  194: # if there's no SMF, set some default DAEMON_ARGS
  195: smf_present || DAEMON_ARGS=""
  196: 
  197: usage () {
  198: 	if smf_present ; then
  199: 		echo "Usage: $0 <daemon>";
  200: 	else
  201: 		echo "Usage: $0 <stop|start> <daemon> <daemon arguments>";
  202: 	fi
  203: 	echo "The --pid_file argument is implied";
  204: 	echo "This help message: $0 <help|usage>";
  205: }
  206: 
  207: # parse arguments, different according to SMF or not.
  208: case $1 in
  209: 	'help' | 'usage')
  210: 		usage
  211: 		exit $SMF_EXIT_OK
  212: 		;;
  213: esac
  214: 
  215: if smf_present ; then
  216: 	QUAGGA_METHOD="start"
  217: else
  218: 	QUAGGA_METHOD="$1"
  219: 	shift;
  220: fi
  221: 
  222: DAEMON="$1"
  223: 
  224: # daemon path must be given
  225: if [ -z "$DAEMON_PATH/$DAEMON" ]; then
  226: 	usage
  227: 	exit $SMF_EXIT_ERR_FATAL
  228: fi
  229: 
  230: # only bgpd is suitable for running in a non-global zone, at this
  231: # time.
  232: case "${DAEMON}" in
  233: 	bgpd)
  234: 	;;
  235: 	zebra | ospfd | ospf6d | ripd | ripngd )
  236: 		quagga_is_globalzone || exit $SMF_EXIT_OK
  237: 	;;
  238: 	*)
  239: 		usage
  240: 		exit $SMF_EXIT_ERR_CONFIG;
  241: 	;;
  242: esac
  243: 
  244: # Older Quagga SMF packages pass daemon args on the commandline
  245: # Newer SMF routeadm model uses properties for each argument
  246: # so we must handle that.
  247: if [ smf_present -a -f "$ROUTEADMINCLUDE" ]; then
  248: 	handle_routeadm_upgrade $DAEMON;
  249: 	DAEMON_ARGS=`routeadm_daemon_args`;
  250: 	routeadm_zebra_enable $DAEMON;
  251: else
  252: 	if [ $# -gt 0 ] ; then
  253: 		shift
  254: 		DAEMON_ARGS="$@"
  255: 	fi
  256: fi
  257: 
  258: upgrade_config "$DAEMON"
  259: 
  260: if [ ! -f "@sysconfdir@/${DAEMON}.conf" ] ; then
  261: 	echo "Could not find config file, @sysconfdir@/${DAEMON}.conf"
  262: 	exit $SMF_EXIT_ERR_CONFIG
  263: fi
  264: 
  265: # we need @quagga_statedir@ to exist, it probably is on tmpfs.
  266: if [ ! -d @quagga_statedir@ ] ; then
  267: 	mkdir -p @quagga_statedir@
  268: 	chown @enable_user@:@enable_group@ @quagga_statedir@
  269: 	chmod 751 @quagga_statedir@
  270: fi
  271: 
  272: PIDFILE="@quagga_statedir@/${DAEMON}.pid"
  273: 
  274: start () {
  275: 	if [ ! -x "$DAEMON_PATH/$DAEMON" ] ; then
  276: 		echo "Error, could not find daemon, $DAEMON_PATH/$DAEMON"
  277: 		exit $SMF_EXIT_ERR_FATAL
  278: 	fi
  279: 	eval exec $DAEMON_PATH/$DAEMON $DAEMON_ARGS --pid_file ${PIDFILE} &
  280: }
  281: 
  282: stop_by_pidfile () {
  283: 	if [ -f "${PIDFILE}" ]; then
  284: 		/usr/bin/kill -TERM `/usr/bin/cat "${PIDFILE}"`
  285: 	fi
  286: }
  287: 
  288: case "$QUAGGA_METHOD" in
  289: 'start')
  290: 	start
  291: 	;;
  292: 'stop')
  293: 	stop_by_pidfile
  294: 	;;
  295: 
  296: *)
  297: 	usage
  298: 	exit $SMF_EXIT_ERR_FATAL
  299: 	;;
  300: esac	
  301: 
  302: exit $SMF_EXIT_OK;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>