mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 06:00:58 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			277 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			7.2 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 FRRouting.
 | 
						|
#
 | 
						|
# FRRouting 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.
 | 
						|
#
 | 
						|
# FRRouting 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 FRRouting; 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 FRRouting
 | 
						|
	if [ -d "/etc/frr" -a ! -f "/etc/frr/${DAEMON}.conf" ] ; then
 | 
						|
		if [ -f "/etc/sfw/zebra/${DAEMON}.conf" ] ; then
 | 
						|
			cp "/etc/sfw/zebra/${DAEMON}.conf" \
 | 
						|
				"/etc/frr/${DAEMON}.conf.upgrade" \
 | 
						|
				|| exit $SMF_EXIT_ERR_FATAL
 | 
						|
			chown "${USER}:${GROUP}" "/etc/frr/${DAEMON}.conf.upgrade" \
 | 
						|
				|| exit $SMF_EXIT_ERR_FATAL
 | 
						|
			chmod 0600 "/etc/frr/${DAEMON}.conf.upgrade" \
 | 
						|
				|| exit $SMF_EXIT_ERR_FATAL
 | 
						|
			mv "/etc/frr/${DAEMON}.conf.upgrade" "/etc/frr/${DAEMON}.conf" \
 | 
						|
				|| exit $SMF_EXIT_ERR_FATAL
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
 | 
						|
	if [ ! -f "/etc/frr/${DAEMON}.conf" ] ; then
 | 
						|
		touch "/etc/frr/${DAEMON}.conf.new" \
 | 
						|
			|| exit $SMF_EXIT_ERR_FATAL
 | 
						|
		chown "${USER}:${GROUP}" "/etc/frr/${DAEMON}.conf.new" \
 | 
						|
			|| exit $SMF_EXIT_ERR_FATAL
 | 
						|
		chmod 0600 "/etc/frr/${DAEMON}.conf.new" \
 | 
						|
			|| exit $SMF_EXIT_ERR_FATAL
 | 
						|
		mv "/etc/frr/${DAEMON}.conf.new" "/etc/frr/${DAEMON}.conf" \
 | 
						|
			|| exit $SMF_EXIT_ERR_FATAL
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
# Relevant to S10+
 | 
						|
frr_is_globalzone () {
 | 
						|
	if [ "${FRR_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
 | 
						|
	FRR_METHOD="start"
 | 
						|
else
 | 
						|
	FRR_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 )
 | 
						|
		frr_is_globalzone || exit $SMF_EXIT_OK
 | 
						|
	;;
 | 
						|
	*)
 | 
						|
		usage
 | 
						|
		exit $SMF_EXIT_ERR_CONFIG;
 | 
						|
	;;
 | 
						|
esac
 | 
						|
 | 
						|
# Older FRRouting 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"
 | 
						|
 | 
						|
if [ ! -f "@sysconfdir@/${DAEMON}.conf" ] ; then
 | 
						|
	echo "Could not find config file, @sysconfdir@/${DAEMON}.conf"
 | 
						|
	exit $SMF_EXIT_ERR_CONFIG
 | 
						|
fi
 | 
						|
 | 
						|
# we need @frr_statedir@ to exist, it probably is on tmpfs.
 | 
						|
if [ ! -d @frr_statedir@ ] ; then
 | 
						|
	mkdir -p @frr_statedir@
 | 
						|
	chown @enable_user@:@enable_group@ @frr_statedir@
 | 
						|
	chmod 751 @frr_statedir@
 | 
						|
fi
 | 
						|
 | 
						|
PIDFILE="@frr_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 "$FRR_METHOD" in
 | 
						|
'start')
 | 
						|
	start
 | 
						|
	;;
 | 
						|
'stop')
 | 
						|
	stop_by_pidfile
 | 
						|
	;;
 | 
						|
 | 
						|
*)
 | 
						|
	usage
 | 
						|
	exit $SMF_EXIT_ERR_FATAL
 | 
						|
	;;
 | 
						|
esac	
 | 
						|
 | 
						|
exit $SMF_EXIT_OK;
 |