#!/bin/sh
#
#	$Id: iplbdaemon.sh,v 1.1.1.1 2001/12/01 06:32:29 iplb Exp $
#
# iplbdaemon     Start high-availability services
#
# Author:       Alan Robertson	<alanr@henge.com>
#
#		it should run under SuSE and Debian also...
#
# chkconfig: 2345 45 40
# description: Startup script high-availability services.
# processname: iplbdaemon
# pidfile: /var/run/iplbdaemon.pid
# config: /etc/ha.d/iplbdaemon.cf

HA_DIR=/etc/ha4.d; export HA_DIR
CONFIG=$HA_DIR/iplb4.conf
#. $HA_DIR/shellfuncs

# exec 2>>/var/log/ha-debug

RHFUNCS=/etc/rc.d/init.d/functions
#PROC_HA=$HA_BIN/ha.o
SUBSYS=iplb4d
DAEMON_MIN="7"
LOOP_STOP="20"
#
#	Places to find killproc or killall in...
#
KILLPROCS="/sbin/killproc /usr/bin/killall"
INSMOD=/sbin/insmod
US=`uname -n`

# Set this to a 1 if you want to automatically load kernel modules
USE_MODULES=0

#
#	Source in Red Hat's function library.
#
if
  [ ! -x $RHFUNCS ]
then
  daemon() {
	$*
  }
  status() {
	/usr/lib/iplb4/iplb4d -s
  }
else
  . $RHFUNCS
fi

#
#	Install the softdog module if we need to
#
init_watchdog() {
#
# 	We need to install it if watchdog is specified in $CONFIG, and
#	/dev/watchdog refers to a softdog device, or it /dev/watchdog
#	doesn't exist at all.
#
#	If we need /dev/watchdog, then we'll make it if necessary.
#
#	Whatever the user says we should use for watchdog device, that's
#	what we'll check for, use and create if necessary.  If they misspell
#	it, or don't put it under /dev, so will we.
#	Hope they do it right :-)
#
#
  insmod=no
  # What do they think /dev/watchdog is named?
  MISCDEV=`grep ' misc$' /proc/devices | cut -c1-4`
  MISCDEV=`echo $MISCDEV`
  WATCHDEV=`grep -v '^#' $CONFIG | grep watchdog |
	sed s'%^[ 	]*watchdog[ 	]*%%'`
  WATCHDEV=`echo $WATCHDEV`
  if
    [ "X$WATCHDEV" != X ]
  then
    : Watchdog requested by $CONFIG file
  #
  #	We try and insmod the module if there's no dev or the dev exists
  #	and points to the softdog major device.
  #
    if
      [ ! -c "$WATCHDEV" ]
    then
      insmod=yes
    else
      case `ls -l "$WATCHDEV" 2>/dev/null` in
      *$MISCDEV,*)
	    insmod=yes;;
      *)	: "$WATCHDEV isn't a softdog device (wrong major)" ;;
      esac
    fi
  else
    : No watchdog device specified in $CONFIG file.
  fi
  case $insmod in
    yes)
      if
        grep softdog /proc/modules >/dev/null 2>&1 
      then
        : softdog already loaded
      else
        $INSMOD softdog >/dev/null 2>&1
      fi;;
  esac
  if
    [ "X$WATCHDEV" != X -a ! -c "$WATCHDEV" -a $insmod = yes ]
  then
    minor=`cat /proc/misc | grep watchdog | cut -c1-4`
    mknod -m 600 $WATCHDEV c $MISCDEV $minor
  fi
} # init_watchdog()

#
#	Install /proc/ha module, if it's not already installed
#
#

init_proc_ha() {
  if
    [ ! -d /proc/ha ]
  then
    for module in $PROC_HA
    do
      if
        $INSMOD $module
      then
        : $PROC_HA Module loaded OK
        return 0
      fi
    done
  fi
}


#
#	Start the iplbdaemon daemon...
#

start_iplbdaemon() {
  #insmod ipchains > /dev/null 2>&1
  #insmod ip_tables > /dev/null 2>&1
  modprobe ip_tables > /dev/null 2>&1
  if [ -e "/etc/iplb4.d/l7_nagle_off" ];
  then
    logger "ktcpvs_nagle load"
    insmod /usr/lib/ktcpvs_nagle/ktcpvs.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs_nagle/tcp_vs_url.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs_nagle/tcp_vs_ctype.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs_nagle/tcp_vs_imode.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs_nagle/tvs_chttp.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs_nagle/tcp_vs_wlc.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs_nagle/tcp_vs_lc.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs_nagle/tcp_vs_wrr.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs_nagle/tcp_vs_rr.ko > /dev/null 2>&1
  else
    logger "ktcpvs load"
    insmod /usr/lib/ktcpvs/ktcpvs.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs/tcp_vs_url.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs/tcp_vs_ctype.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs/tcp_vs_imode.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs/tvs_chttp.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs/tcp_vs_wlc.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs/tcp_vs_lc.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs/tcp_vs_wrr.ko > /dev/null 2>&1
    insmod /usr/lib/ktcpvs/tcp_vs_rr.ko > /dev/null 2>&1
  fi

  if
    daemon /usr/lib/iplb4/iplb4d # -d
  then
    : OK
  else
    return $?
  fi
}


#
#	Start Linux-HA
#

StartHA() {
  maildir=/home/mail/
  dir=$maildir$HOSTNAME
  if
    [ ! -e $dir ]
  then
    mkdir $dir
  fi

  if
    [ $USE_MODULES = 1 ]
  then
    #	Create /dev/watchdog and load module if we should
    init_watchdog
    #	Load /proc/ha module
    #	NOTE: Current version of proc_ha module kills iplbdaemon processes!
    # init_proc_ha
  fi
  rm -f /var/run/ppp.d/*
  if
    [  -f $HA_DIR/ipresources -a ! -f $HA_DIR/haresources ]
  then
    mv $HA_DIR/ipresources $HA_DIR/haresources
  fi
  #	Start iplbdaemon daemon
  if
    start_iplbdaemon
  then
    : OK
  else
    RC=$?
    echo -n "iplb4d did not start [rc=$RC]"
    return $RC
  fi
}

#
#	Ask iplbdaemon to stop.  It will give up it's resources...
#
StopHA() {

  MGR=$HA_BIN/ResourceManager
  echo -n "$SUBSYS: shutdown in progress."

  if
    /usr/lib/iplb4/iplb4d -k	# Kill it
  then
    # Del Start LB300c 2004/10/30
    # echo 1 > /proc/sys/net/ktcpvs/unload
    # rmmod tcp_vs_wlc > /dev/null 2>&1
    # rmmod tcp_vs_lc > /dev/null 2>&1
    # rmmod tcp_vs_wrr > /dev/null 2>&1
    # rmmod tcp_vs_rr > /dev/null 2>&1
    # rmmod tcp_vs_url > /dev/null 2>&1
    # rmmod tcp_vs_ctype > /dev/null 2>&1
    # rmmod tcp_vs_imode > /dev/null 2>&1
    # sleep 2 
    # rmmod ktcpvs > /dev/null 2>&1
    # Del End LB300c 2004/10/30
    return 0
  fi

  KILLPROC=""

  #	Use the Red Hat killproc function if it's there...

  if
    [ -x $RHFUNCS ]
  then
    killproc $SUBSYS
  else
    for j in $KILLPROCS
    do
      if
        [ -x $j ]
      then
        KILLPROC=$j;
        break;
      fi
    done
    if
      [ "X$KILLPROC" != X ]
    then
      $KILLPROC /usr/lib/iplb4/iplb4d
    else
      echo -n "No killproc/killall"
      exit 1
    fi
  fi
  lrc=$?
  return $lrc
}


RC=0
# See how we were called.

case "$1" in
  start)
        if test -e /var/log/N????-????.log -o -e /var/log/NP????-????????.log -o -e /var/log/UL????-???.log ;
        then
         echo -n "Starting LoadBalance services: "
         StartHA
         count=0
         
         DAEMON_NUM=`/sbin/pidof iplb4d | wc -w`
         until [ $DAEMON_NUM -gt $DAEMON_MIN ]
         do
             sleep 1s
             DAEMON_NUM=`/sbin/pidof iplb4d | wc -w`
             
             count=`expr $count + 1`
             if [ $count -gt $LOOP_STOP ]
             then
                 break
             fi
         done
         RC=$?
         echo
         [ $RC -eq 0 ] && touch /var/lock/subsys/$SUBSYS
        else
         echo "Initial setup for LB is not completed!"
        fi
        ;;

  stop)
	echo -n "Stopping LoadBalance services: "
	StopHA
	RC=$?
	echo
	[ $RC -eq 0 ] && rm -f /var/lock/subsys/$SUBSYS
	;;

  status)
	status iplb4d
	RC=$?
	;;

  restart|reload)
	StopHA
	StartHA
	RC=$?
	;;

  *)
	echo -n "Usage: iplb4d {start|stop|status|restart|reload}"
	exit 1
esac

exit $RC

