blob: 60b5ab01a19dd767a7064331166740d426b410cb [file] [log] [blame]
#!/bin/sh
#
# /etc/init.d/quagga -- start/stop the Quagga routing daemons
#
# Based on debian version by Endre Hirling <endre@mail.elte.hu> and
# Christian Hammers <ch@debian.org>.
#
### BEGIN INIT INFO
# Provides: quagga
# Required-Start: $local_fs $network $remote_fs $syslog
# Required-Stop: $local_fs $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop the Quagga routing suite
# Description: Quagga is a routing suite for IP routing protocols like
# BGP, OSPF, RIP and others. This script contols the main
# daemon "quagga" as well as the individual protocol daemons.
### END INIT INFO
# NOTE: sbin must be before bin so we get the iproute2 ip and not the
# busybox ip command. The busybox one flushes all routes instead of just
# the dynamic routes
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/sbin
D_PATH=/usr/sbin
C_PATH=/etc/quagga
# Keep zebra first and do not list watchquagga!
DAEMONS="zebra bgpd ripd ripngd ospfd ospf6d isisd babeld"
# Print the name of the pidfile.
pidfile()
{
echo "/var/run/quagga/$1.pid"
}
# Check if daemon is started by using the pidfile.
started()
{
[ -e `pidfile $1` ] && kill -0 `cat \`pidfile $1\`` 2> /dev/null && return 0
return 1
}
# Loads the config via vtysh -b if configured to do so.
vtysh_b ()
{
# Rember, that all variables have been incremented by 1 in convert_daemon_prios()
if [ "$vtysh_enable" = 2 -a -f $C_PATH/Quagga.conf ]; then
/usr/bin/vtysh -b
fi
}
# Check if the daemon is activated and if its executable and config files
# are in place.
# params: daemon name
# returns: 0=ok, 1=error
check_daemon()
{
# If the integrated config file is used the others are not checked.
if [ -r "$C_PATH/Quagga.conf" ]; then
return 0
fi
# check for config file
if [ ! -r "$C_PATH/$1.conf" ]; then
return 1
fi
return 0
}
# Starts the server if it's not alrady running according to the pid file.
# The Quagga daemons creates the pidfile when starting.
start()
{
if ! check_daemon $1; then echo -n " (!$1)"; return; fi
echo -n " $1"
start-stop-daemon \
--start \
--pidfile=`pidfile $1` \
--exec "$D_PATH/$1" \
-- \
`eval echo "$""$1""_options"`
}
# Stop the daemon given in the parameter, printing its name to the terminal.
stop()
{
if ! started "$1" ; then
echo -n " (!$1)"
return 0
else
PIDFILE=`pidfile $1`
PID=`cat $PIDFILE 2>/dev/null`
start-stop-daemon --stop --quiet --exec "$D_PATH/$1"
#
# Now we have to wait until $DAEMON has _really_ stopped.
#
if test -n "$PID" && kill -0 $PID 2>/dev/null; then
echo -n " (waiting) ."
cnt=0
while kill -0 $PID 2>/dev/null; do
cnt=`expr $cnt + 1`
if [ $cnt -gt 60 ]; then
# Waited 120 secs now, fail.
echo -n "Failed.. "
break
fi
sleep 2
echo -n "."
done
fi
echo -n " $1"
rm -f `pidfile $1`
fi
}
stop_all()
{
local daemon_list
daemon_list=${1:-$DAEMONS}
echo -n "Stopping Quagga daemons:"
for daemon_name in $daemon_list; do
stop "$daemon_name"
done
echo "."
}
start_all()
{
local daemon_list
daemon_list=${1:-$DAEMONS}
echo -n "Starting Quagga daemons:"
for daemon_name in $daemon_list; do
start "$daemon_name"
done
echo "."
}
status_all()
{
local daemon_list
daemon_list=${1:-$DAEMONS}
res=1
echo -n "quagga: "
for daemon_name in $daemon_list; do
if started "$daemon_name" ; then
id=`cat \`pidfile $daemon_name\``
echo -n "$daemon_name (pid $id) "
res=0
fi
done
if [ $res -eq 0 ]; then
echo "is running..."
else
echo "is stopped..."
fi
exit $res
}
#########################################################
# Main program #
#########################################################
# Load configuration
test -f /etc/default/quagga && . /etc/default/quagga
case "$1" in
start)
cd $C_PATH/
start_all $2
vtysh_b
;;
stop)
stop_all $2
echo "Removing all routes made by zebra."
ip route flush proto zebra
;;
status)
status_all $2
;;
restart|force-reload)
$0 stop $2
sleep 1
$0 start $2
;;
*)
echo "Usage: /etc/init.d/quagga {start|stop|restart|status|force-reload} [daemon]"
exit 1
;;
esac
exit 0