Package: quagga
Version: 0.99.21-3~bpo60+1
Severity: wishlist
Tags: patch

Thanks to /lib/lsb/init-functions it's very easy to add support for status
to /etc/init.d/quagga. This allows using the init script with HA resource
managers like pacemaker. See the very simple attached patch.

-- System Information:
Debian Release: 6.0.5
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable'), (99, 'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.32-5-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages quagga depends on:
ii  adduser               3.112+nmu2         add and remove users and groups
ii  debconf [debconf-2.0] 1.5.36.1           Debian configuration management sy
ii  iproute               20100519-3         networking and traffic control too
ii  libc6                 2.11.3-3           Embedded GNU C Library: Shared lib
ii  libcap2               1:2.19-3           support for getting/setting POSIX.
ii  libpam0g              1.1.1-6.1+squeeze1 Pluggable Authentication Modules l
ii  libreadline6          6.1-3              GNU readline and history libraries
ii  logrotate             3.7.8-6            Log rotation utility

quagga recommends no packages.

Versions of packages quagga suggests:
ii  snmpd                       5.4.3~dfsg-2 SNMP (Simple Network Management Pr

-- Configuration Files:
/etc/init.d/quagga changed:
. /lib/lsb/init-functions
PATH=/bin:/usr/bin:/sbin:/usr/sbin
D_PATH=/usr/lib/quagga
C_PATH=/etc/quagga
DAEMONS="zebra bgpd ripd ripngd ospfd ospf6d isisd babeld"
pidfile()
{
        echo "/var/run/quagga/$1.pid"
}
started()
{
        [ -e `pidfile $1` ] && kill -0 `cat \`pidfile $1\`` 2> /dev/null && 
return 0
        return 1
}
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_daemon()
{
        # If the integrated config file is used the others are not checked.
        if [ -r "$C_PATH/Quagga.conf" ]; then
          return 0
        fi 
        # vtysh_enable has no config file nor binary so skip check.
        # (Not sure why vtysh_enable is in this list but does not hurt)
        if [ $1 != "watchquagga" -a $1 != "vtysh_enable" ]; then
          # check for daemon binary
          if [ ! -x "$D_PATH/$1" ]; then return 1; fi
                
          # check for config file                 
          if [ ! -r "$C_PATH/$1.conf" ]; then
            echo -n " (not started without config file)"
            return 1
          fi
        fi
        return 0
}
start()
{
        echo -n " $1"
        if ! check_daemon $1; then return; fi
        start-stop-daemon \
                --start \
                --pidfile=`pidfile $1` \
                --exec "$D_PATH/$1" \
                -- \
                `eval echo "$""$1""_options"`
                
}
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 --oknodo --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
}
convert_daemon_prios()
{
        for name in $DAEMONS zebra vtysh_enable watchquagga_enable; do
          # First, assign the value set by the user to $value 
          eval value=\$$name
          # Daemon not activated or entry missing?
          if [ "$value" = "no" -o "$value" = "" ]; then value=0; fi
          # These strings parsed for backwards compatibility.
          if [ "$value" = "yes"  -o  "$value" = "true" ]; then value=1; fi
          # Zebra is threatened special. It must be between 0=off and the first
      # user assigned value "1" so we increase all other enabled daemons' 
values.
          if [ "$name" != "zebra" -a "$value" -gt 0 ]; then value=`expr 
"$value" + 1`; fi
          # If e.g. name is zebra then we set "zebra=yes".
          eval $name=$value
        done
}
start_watchquagga()
{
    local daemon_name
    local daemon_prio
    local watchlist
    # Start the monitor daemon only if desired.
    if [ 0 -eq "$watchquagga_enable" ]; then
        return
    fi
    # Which daemons have been started?
    for daemon_name in $DAEMONS; do
        eval daemon_prio=\$$daemon_name
        if [ "$daemon_prio" -gt 0 ]; then
            watchlist="$watchlist $daemon_name"
        fi
    done
    # Check if at least one daemon is activated.
    if [ -n "$watchlist" ]; then
      watchquagga_options="$watchquagga_options $watchlist"
      echo -n "Starting Quagga monitor daemon:"
      start watchquagga
      echo "."
    fi
}
stop_watchquagga()
{
    echo -n "Stopping Quagga monitor daemon:"
    stop watchquagga
    echo "."
}
stop_prio() 
{
        local wanted_prio
        local daemon_prio
        local daemon_list
        wanted_prio=$1
        daemon_list=${2:-$DAEMONS}
        echo -n "Stopping Quagga daemons (prio:$wanted_prio):"
        for prio_i in `seq 10 -1 $wanted_prio`; do
            for daemon_name in $daemon_list; do
                eval daemon_prio=\$$daemon_name
                if [ $daemon_prio -eq $prio_i ]; then
                    stop "$daemon_name"
                fi
            done
        done
        echo "."
}
start_prio()
{
        local wanted_prio
        local daemon_prio
        local daemon_list
        
        wanted_prio=$1
        daemon_list=${2:-$DAEMONS}
        echo -n "Starting Quagga daemons (prio:$wanted_prio):"
        for prio_i in `seq 1 $wanted_prio`; do
            for daemon_name in $daemon_list; do
                eval daemon_prio=\$$daemon_name
                if [ $daemon_prio -eq $prio_i ]; then
                    start "$daemon_name"
                fi
            done
        done
        echo "."
}
[ ! -r "$C_PATH/daemons" ] && exit 0
. "$C_PATH/daemons"
. "$C_PATH/debian.conf"
convert_daemon_prios
if [ ! -d /var/run/quagga ]; then
    mkdir -p /var/run/quagga
    chown quagga:quagga /var/run/quagga
    chmod 755 /var/run/quagga
fi
case "$1" in
    start)
        # Try to load this necessary (at least for 2.6) module.
        if [ -d /lib/modules/`uname -r` ] ; then
          echo "Loading capability module if not yet done."
          set +e; LC_ALL=C modprobe -a capability 2>&1 | egrep -v "(not 
found|Can't locate)"; set -e
        fi
        # Start all daemons
        cd $C_PATH/
        start_prio 10 $2
        vtysh_b
        start_watchquagga
        ;;
        
    1|2|3|4|5|6|7|8|9|10)
        # Stop/start daemons for the appropriate priority level
        stop_prio $1
        start_prio $1
        vtysh_b
        ;;
    stop|0)
        # Stop all daemons at level '0' or 'stop'
        stop_watchquagga
        stop_prio 0 $2
        echo "Removing all routes made by zebra."
        ip route flush proto zebra
        ;;
    restart|force-reload)
        $0 stop $2
        sleep 1
        $0 start $2
        ;;
    status)
        status_of_proc -p `pidfile watchquagga` watchquagga Quagga && exit 0 || 
exit $?
        ;;
    *)
        echo "Usage: /etc/init.d/quagga 
{start|stop|restart|force-reload|<priority>} [daemon]"
        echo "       E.g. '/etc/init.d/quagga 5' would start all daemons with a 
prio 1-5."
        echo "       Read /usr/share/doc/quagga/README.Debian for details."
        exit 1
        ;;
esac
exit 0

/etc/quagga/daemons changed:
zebra=yes
bgpd=yes
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no


-- debconf information:
* quagga/really_stop: true
--- quagga      2012-05-07 05:26:22.000000000 +0800
+++ /etc/init.d/quagga  2012-10-09 08:22:20.912252303 +0800
@@ -13,6 +13,8 @@
 ### END INIT INFO
 #
 
+. /lib/lsb/init-functions
+
 PATH=/bin:/usr/bin:/sbin:/usr/sbin
 D_PATH=/usr/lib/quagga
 C_PATH=/etc/quagga
@@ -282,6 +284,10 @@
        $0 start $2
        ;;
 
+    status)
+        status_of_proc -p `pidfile watchquagga` watchquagga Quagga && exit 0 
|| exit $?
+       ;;
+
     *)
        echo "Usage: /etc/init.d/quagga 
{start|stop|restart|force-reload|<priority>} [daemon]"
        echo "       E.g. '/etc/init.d/quagga 5' would start all daemons with a 
prio 1-5."

Reply via email to