1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# /etc/init.d/quagga -- start/stop the Quagga routing daemons 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Based on debian version by Endre Hirling <endre@mail.elte.hu> and 6*4882a593Smuzhiyun# Christian Hammers <ch@debian.org>. 7*4882a593Smuzhiyun# 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun### BEGIN INIT INFO 10*4882a593Smuzhiyun# Provides: quagga 11*4882a593Smuzhiyun# Required-Start: $local_fs $network $remote_fs $syslog 12*4882a593Smuzhiyun# Required-Stop: $local_fs $network $remote_fs $syslog 13*4882a593Smuzhiyun# Default-Start: 2 3 4 5 14*4882a593Smuzhiyun# Default-Stop: 0 1 6 15*4882a593Smuzhiyun# Short-Description: start and stop the Quagga routing suite 16*4882a593Smuzhiyun# Description: Quagga is a routing suite for IP routing protocols like 17*4882a593Smuzhiyun# BGP, OSPF, RIP and others. This script contols the main 18*4882a593Smuzhiyun# daemon "quagga" as well as the individual protocol daemons. 19*4882a593Smuzhiyun### END INIT INFO 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun# NOTE: sbin must be before bin so we get the iproute2 ip and not the 22*4882a593Smuzhiyun# busybox ip command. The busybox one flushes all routes instead of just 23*4882a593Smuzhiyun# the dynamic routes 24*4882a593SmuzhiyunPATH=/sbin:/usr/sbin:/bin:/usr/bin:/sbin 25*4882a593SmuzhiyunD_PATH=/usr/sbin 26*4882a593SmuzhiyunC_PATH=/etc/quagga 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun# Keep zebra first and do not list watchquagga! 29*4882a593SmuzhiyunDAEMONS="zebra bgpd ripd ripngd ospfd ospf6d isisd" 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun# Print the name of the pidfile. 32*4882a593Smuzhiyunpidfile() 33*4882a593Smuzhiyun{ 34*4882a593Smuzhiyun echo "/var/run/quagga/$1.pid" 35*4882a593Smuzhiyun} 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun# Check if daemon is started by using the pidfile. 38*4882a593Smuzhiyunstarted() 39*4882a593Smuzhiyun{ 40*4882a593Smuzhiyun [ -e `pidfile $1` ] && kill -0 `cat \`pidfile $1\`` 2> /dev/null && return 0 41*4882a593Smuzhiyun return 1 42*4882a593Smuzhiyun} 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun# Loads the config via vtysh -b if configured to do so. 45*4882a593Smuzhiyunvtysh_b () 46*4882a593Smuzhiyun{ 47*4882a593Smuzhiyun # Rember, that all variables have been incremented by 1 in convert_daemon_prios() 48*4882a593Smuzhiyun if [ "$vtysh_enable" = 2 -a -f $C_PATH/Quagga.conf ]; then 49*4882a593Smuzhiyun /usr/bin/vtysh -b 50*4882a593Smuzhiyun fi 51*4882a593Smuzhiyun} 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun# Check if the daemon is activated and if its executable and config files 54*4882a593Smuzhiyun# are in place. 55*4882a593Smuzhiyun# params: daemon name 56*4882a593Smuzhiyun# returns: 0=ok, 1=error 57*4882a593Smuzhiyuncheck_daemon() 58*4882a593Smuzhiyun{ 59*4882a593Smuzhiyun # If the integrated config file is used the others are not checked. 60*4882a593Smuzhiyun if [ -r "$C_PATH/Quagga.conf" ]; then 61*4882a593Smuzhiyun return 0 62*4882a593Smuzhiyun fi 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun # check for config file 65*4882a593Smuzhiyun if [ ! -r "$C_PATH/$1.conf" ]; then 66*4882a593Smuzhiyun return 1 67*4882a593Smuzhiyun fi 68*4882a593Smuzhiyun return 0 69*4882a593Smuzhiyun} 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun# Starts the server if it's not alrady running according to the pid file. 72*4882a593Smuzhiyun# The Quagga daemons creates the pidfile when starting. 73*4882a593Smuzhiyunstart() 74*4882a593Smuzhiyun{ 75*4882a593Smuzhiyun if ! check_daemon $1; then echo -n " (!$1)"; return; fi 76*4882a593Smuzhiyun echo -n " $1" 77*4882a593Smuzhiyun start-stop-daemon \ 78*4882a593Smuzhiyun --start \ 79*4882a593Smuzhiyun --pidfile=`pidfile $1` \ 80*4882a593Smuzhiyun --exec "$D_PATH/$1" \ 81*4882a593Smuzhiyun -- \ 82*4882a593Smuzhiyun `eval echo "$""$1""_options"` 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun} 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun# Stop the daemon given in the parameter, printing its name to the terminal. 87*4882a593Smuzhiyunstop() 88*4882a593Smuzhiyun{ 89*4882a593Smuzhiyun if ! started "$1" ; then 90*4882a593Smuzhiyun echo -n " (!$1)" 91*4882a593Smuzhiyun return 0 92*4882a593Smuzhiyun else 93*4882a593Smuzhiyun PIDFILE=`pidfile $1` 94*4882a593Smuzhiyun PID=`cat $PIDFILE 2>/dev/null` 95*4882a593Smuzhiyun start-stop-daemon --stop --quiet --exec "$D_PATH/$1" 96*4882a593Smuzhiyun # 97*4882a593Smuzhiyun # Now we have to wait until $DAEMON has _really_ stopped. 98*4882a593Smuzhiyun # 99*4882a593Smuzhiyun if test -n "$PID" && kill -0 $PID 2>/dev/null; then 100*4882a593Smuzhiyun echo -n " (waiting) ." 101*4882a593Smuzhiyun cnt=0 102*4882a593Smuzhiyun while kill -0 $PID 2>/dev/null; do 103*4882a593Smuzhiyun cnt=`expr $cnt + 1` 104*4882a593Smuzhiyun if [ $cnt -gt 60 ]; then 105*4882a593Smuzhiyun # Waited 120 secs now, fail. 106*4882a593Smuzhiyun echo -n "Failed.. " 107*4882a593Smuzhiyun break 108*4882a593Smuzhiyun fi 109*4882a593Smuzhiyun sleep 2 110*4882a593Smuzhiyun echo -n "." 111*4882a593Smuzhiyun done 112*4882a593Smuzhiyun fi 113*4882a593Smuzhiyun echo -n " $1" 114*4882a593Smuzhiyun rm -f `pidfile $1` 115*4882a593Smuzhiyun fi 116*4882a593Smuzhiyun} 117*4882a593Smuzhiyun 118*4882a593Smuzhiyunstop_all() 119*4882a593Smuzhiyun{ 120*4882a593Smuzhiyun local daemon_list 121*4882a593Smuzhiyun daemon_list=${1:-$DAEMONS} 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun echo -n "Stopping Quagga daemons:" 124*4882a593Smuzhiyun for daemon_name in $daemon_list; do 125*4882a593Smuzhiyun stop "$daemon_name" 126*4882a593Smuzhiyun done 127*4882a593Smuzhiyun echo "." 128*4882a593Smuzhiyun} 129*4882a593Smuzhiyun 130*4882a593Smuzhiyunstart_all() 131*4882a593Smuzhiyun{ 132*4882a593Smuzhiyun local daemon_list 133*4882a593Smuzhiyun daemon_list=${1:-$DAEMONS} 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun echo -n "Starting Quagga daemons:" 136*4882a593Smuzhiyun for daemon_name in $daemon_list; do 137*4882a593Smuzhiyun start "$daemon_name" 138*4882a593Smuzhiyun done 139*4882a593Smuzhiyun echo "." 140*4882a593Smuzhiyun} 141*4882a593Smuzhiyun 142*4882a593Smuzhiyunstatus_all() 143*4882a593Smuzhiyun{ 144*4882a593Smuzhiyun local daemon_list 145*4882a593Smuzhiyun daemon_list=${1:-$DAEMONS} 146*4882a593Smuzhiyun res=1 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun echo -n "quagga: " 149*4882a593Smuzhiyun for daemon_name in $daemon_list; do 150*4882a593Smuzhiyun if started "$daemon_name" ; then 151*4882a593Smuzhiyun id=`cat \`pidfile $daemon_name\`` 152*4882a593Smuzhiyun echo -n "$daemon_name (pid $id) " 153*4882a593Smuzhiyun res=0 154*4882a593Smuzhiyun fi 155*4882a593Smuzhiyun done 156*4882a593Smuzhiyun if [ $res -eq 0 ]; then 157*4882a593Smuzhiyun echo "is running..." 158*4882a593Smuzhiyun else 159*4882a593Smuzhiyun echo "is stopped..." 160*4882a593Smuzhiyun fi 161*4882a593Smuzhiyun exit $res 162*4882a593Smuzhiyun} 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun######################################################### 165*4882a593Smuzhiyun# Main program # 166*4882a593Smuzhiyun######################################################### 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun# Load configuration 169*4882a593Smuzhiyuntest -f /etc/default/quagga && . /etc/default/quagga 170*4882a593Smuzhiyun 171*4882a593Smuzhiyuncase "$1" in 172*4882a593Smuzhiyun start) 173*4882a593Smuzhiyun cd $C_PATH/ 174*4882a593Smuzhiyun start_all $2 175*4882a593Smuzhiyun vtysh_b 176*4882a593Smuzhiyun ;; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun stop) 179*4882a593Smuzhiyun stop_all $2 180*4882a593Smuzhiyun echo "Removing all routes made by zebra." 181*4882a593Smuzhiyun ip route flush proto zebra 182*4882a593Smuzhiyun ;; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun status) 185*4882a593Smuzhiyun status_all $2 186*4882a593Smuzhiyun ;; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun restart|force-reload) 189*4882a593Smuzhiyun $0 stop $2 190*4882a593Smuzhiyun sleep 1 191*4882a593Smuzhiyun $0 start $2 192*4882a593Smuzhiyun ;; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun *) 195*4882a593Smuzhiyun echo "Usage: /etc/init.d/quagga {start|stop|restart|status|force-reload} [daemon]" 196*4882a593Smuzhiyun exit 1 197*4882a593Smuzhiyun ;; 198*4882a593Smuzhiyunesac 199*4882a593Smuzhiyun 200*4882a593Smuzhiyunexit 0 201