#!/bin/bash
# roma
#
# chkconfig: 2345 90 15
# description: roma - Cache Server main program.
# processname: roma
# pidfile: /var/run/roma.pid
# config: /opt/nec/roma/etc/roma.conf

# Source networking configuration.
#. /etc/sysconfig/network

# Source function library.
. /etc/init.d/functions

# Check that networking is up.
#[ ${NETWORKING} = "no" ] && exit 0

# check if the squid conf file is present
#[ -f /opt/nec/catfish/catfish.dll ] || exit 0

case "$1" in
start)
    KERNEL_VERSION=`uname -r`
    DISKDUMP_KERNEL="NO"
    if [ $KERNEL_VERSION = "2.4.21-32.0.1.EL" ]; then
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.4.21-47.ELsmp" ]; then
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.9-67.0.7.ELsmp" ]; then
	if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.9-78.0.22.ELsmp" ]; then
	if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.18-164.11.1.el5" ]; then
        if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.18-164.11.1.el5PAE" ]; then
        if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.18-194.el5" ]; then
        if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.18-194.el5PAE" ]; then
        if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.18-238.9.1.el5" ]; then
        if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.18-238.9.1.el5PAE" ]; then
        if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.18-308.4.1.el5" ]; then
        if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    elif [ $KERNEL_VERSION = "2.6.18-308.4.1.el5PAE" ]; then
        if [ ! -e /dev/roma ];then
            /bin/mknod /dev/roma c 163 0
        fi
        DISKDUMP_KERNEL="YES"
        DUMPDIR="/var/crash"
    else
        . /etc/sysconfig/dump
        if [ !$DUMPDIR ]; then
            DUMPDIR="/var/log/vmdump"
        fi
    fi
    DATE=`/bin/date +%m%d%H%M`
    LOGDIR="/var/log/roma"
    DUMPCHECKFILE="/var/log/roma/dumpcheck.status"
    NO_OVERRIDE_DIE="/opt/nec/roma/etc/no_override_die"
    if [ $DISKDUMP_KERNEL = "YES" ]; then
        DUMPFILE_TEMPLATE="${DUMPDIR}/*/vmcore /vmcore"
        ANALYSIS_TEMPLATE="${DUMPDIR}/*/analysis /analysis"
    else
        DUMPFILE_TEMPLATE="${DUMPDIR}/[0-9]/dump.[0-9] /dump.[0-9]"
        ANALYSIS_TEMPLATE="${DUMPDIR}/[0-9]/analysis.[0-9] /analysis.[0-9]"
    fi
    DUMPFILE=`/bin/ls -t ${DUMPFILE_TEMPLATE} 2> /dev/null | /usr/bin/head -n 1`
    ANALYSISFILE=`/bin/ls -t ${ANALYSIS_TEMPLATE} 2> /dev/null | /usr/bin/head -n 1`

    if [ -f $DUMPCHECKFILE ]; then
        if [ $ANALYSISFILE ] && [ $ANALYSISFILE -nt $DUMPCHECKFILE ]; then
            DUMPDIR=${ANALYSISFILE%analysis*}
            FILENAME=${ANALYSISFILE##*/}
            cd $DUMPDIR
            /bin/tar czf $LOGDIR/analysis$DATE.tgz $FILENAME 2> /dev/null
            cd $OLDPWD
        fi

        if [ $DUMPFILE ] && [ $DUMPFILE -nt $DUMPCHECKFILE ]; then
            /bin/echo $DATE > $DUMPCHECKFILE
            /bin/touch $DUMPCHECKFILE
            if [ -f $NO_OVERRIDE_DIE ]; then
                /bin/rm -f $NO_OVERRIDE_DIE
            fi
            /usr/bin/reboot
        fi
    fi
    /bin/echo $DATE > $DUMPCHECKFILE
    /bin/touch $DUMPCHECKFILE

    echo 16384 > /proc/sys/fs/file-max
    echo 10240 > /proc/sys/net/ipv4/neigh/default/gc_thresh3
    echo 5120  > /proc/sys/net/ipv4/neigh/default/gc_thresh2
    echo 1280  > /proc/sys/net/ipv4/neigh/default/gc_thresh1
    echo 0 > /proc/sys/kernel/core_uses_pid >& /var/tmp/roma_startup
    /bin/rm -f /core.* >& /var/tmp/roma_startup
    /bin/tar -czvlf /var/log/roma/roma_errs.tar.gz /var/log/roma/roma_err.* >& /var/tmp/roma_startup
    if [ $KERNEL_VERSION = "2.6.9-67.0.7.ELsmp" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.9-78.0.22.ELsmp" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.18-164.11.1.el5" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.18-164.11.1.el5PAE" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.18-194.el5" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.18-194.el5PAE" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.18-238.9.1.el5" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.18-238.9.1.el5PAE" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.18-308.4.1.el5" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    elif [ $KERNEL_VERSION = "2.6.18-308.4.1.el5PAE" ]; then
        /sbin/insmod /lib/modules/$KERNEL_VERSION/kernel/net/ipv4/kc.ko >& /var/tmp/roma_startup
        #/sbin/insmod ip_wccp >& /var/tmp/roma_startup
    else
        /sbin/insmod kc >& /var/tmp/roma_startup
        /sbin/insmod ip_wccp >& /var/tmp/roma_startup
    fi

    if [ -f $NO_OVERRIDE_DIE ]; then
        /bin/echo 0 > /proc/net/CacheBlast/param/override_die
    fi
    CRONDPS=`pgrep -P 1 crond`
    if [ "$CRONDPS" = "" ]; then
       /bin/rm -f /var/log/roma/roma_watcher_1st_flg > /dev/null 2>&1
       /bin/rm -f /var/log/roma/roma_chk_flg > /dev/null 2>&1
       /bin/rm -f /var/log/roma/roma_md_chk_flg > /dev/null 2>&1
       /bin/rm -f /var/backup/samba_conf_running > /dev/null 2>&1
       /bin/rm -f /var/backup/samba_proxy_running > /dev/null 2>&1
       /bin/rm -f /var/backup/samba_alizer_running > /dev/null 2>&1
       /bin/rm -f /var/backup/samba_dirinfo_running > /dev/null 2>&1
       /bin/rm -f /var/backup/samba_log_running > /dev/null 2>&1
       /bin/rm -f /var/backup/samba_ESMPROSA_running > /dev/null 2>&1
       /bin/rm -f /var/backup/ftp_conf_running > /dev/null 2>&1
       /bin/rm -f /var/backup/ftp_proxy_running > /dev/null 2>&1
       /bin/rm -f /var/backup/ftp_alizer_running > /dev/null 2>&1
       /bin/rm -f /var/backup/ftp_dirinfo_running > /dev/null 2>&1
       /bin/rm -f /var/backup/ftp_log_running > /dev/null 2>&1
       /bin/rm -f /var/backup/ftp_ESMPROSA_running > /dev/null 2>&1
       /bin/rm -f /var/log/roma/redundant_chk_flg > /dev/null 2>&1
    fi
    /bin/rm /var/tmp/roma.tmp > /dev/null 2>&1
    /opt/nec/roma/bin/roma -k start
    WATCHER_FLG=0
    while : ; do
      if [ -s /var/tmp/roma.tmp ]; then
        RETVAL=`head -1 /var/tmp/roma.tmp`
        if [ "$RETVAL" = "EOF" ]; then
            /bin/rm /var/tmp/watcher.tmp > /dev/null 2>&1
            /opt/nec/roma/bin/watcher -k start
            WATCHER_FLG=1
        fi
        if [ $WATCHER_FLG -eq 0 ] && [ "$CRONDPS" = "" ]; then
            /bin/touch /var/log/roma/roma_watcher_1st_flg
            logger -t roma failed in the first start.
        fi
        break;
      fi
      sleep 1
    done
    while [ $WATCHER_FLG -eq 1 ]
    do
            if [ -s /var/tmp/watcher.tmp ]; then
                RETVAL_WATCHER=`head -1 /var/tmp/watcher.tmp`
                if [ "$RETVAL_WATCHER" = "EOF" ];then
                    /bin/rm -f /var/log/roma/roma_watcher_1st_flg > /dev/null 2>&1
                else
                    if [ "$CRONDPS" = "" ];then
                        /bin/touch /var/log/roma/roma_watcher_1st_flg
                        logger -t watcher failed in the first start.
                    fi
                fi
                break;
            fi
            sleep 1
    done
    
    /bin/rm /var/log/roma/roma_chk_flg > /dev/null 2>&1
    ;;

stop)
    /bin/ps ax > /var/tmp/romachk_ps.tmp
    RETGREP=`/bin/cat /var/tmp/romachk_ps.tmp | /bin/grep romachk | perl -p -i -e "s/^\s+//g" | /bin/cut -d " " -f1`
    if [ "$RETGREP" != "" ]; then
        /bin/kill $RETGREP
        sleep 1
    fi
    /bin/rm /var/tmp/romachk_ps.tmp > /dev/null 2>&1
    /bin/touch /var/log/roma/roma_chk_flg
    /opt/nec/roma/bin/watcher -k stop
    sleep 1
    /opt/nec/roma/bin/roma -k stop > /var/tmp/roma_stop.tmp
    if [ -s /var/tmp/roma_stop.tmp ];then
        RETROMASTOP=`/bin/cat /var/tmp/roma_stop.tmp | /bin/grep -E "error\.\s*can't\s*stop\s*running\s*cacheserver\."`
        if [ "$RETROMASTOP" != "" ];then
            /bin/rm /var/tmp/roma_stop.tmp > /dev/null 2>&1
            sleep 5
            /bin/echo reboot > /dev/roma
            /sbin/reboot&
            exit 1
        fi
    fi
    /bin/rm /var/tmp/roma_stop.tmp > /dev/null 2>&1
    ;;

restart)
    /bin/ps ax > /var/tmp/romachk_ps.tmp
    RETGREP=`/bin/cat /var/tmp/romachk_ps.tmp | /bin/grep romachk | perl -p -i -e "s/^\s+//g" | /bin/cut -d " " -f1`
    if [ "$RETGREP" != "" ]; then
        /bin/kill $RETGREP
        sleep 1
    fi
    /bin/rm /var/tmp/romachk_ps.tmp > /dev/null 2>&1
    /bin/touch /var/log/roma/roma_chk_flg
    /opt/nec/roma/bin/watcher -k stop
    sleep 1
    /opt/nec/roma/bin/roma -k stop > /var/tmp/roma_stop.tmp
    if [ -s /var/tmp/roma_stop.tmp ];then
        RETROMASTOP=`/bin/cat /var/tmp/roma_stop.tmp | /bin/grep -E "error\.\s*can't\s*stop\s*running\s*cacheserver\."`
        if [ "$RETROMASTOP" != "" ];then
            /bin/rm /var/tmp/roma_stop.tmp > /dev/null 2>&1
            sleep 5
            /bin/echo reboot > /dev/roma
            /sbin/reboot&
            exit 1
        fi
    fi
    /bin/rm /var/tmp/roma_stop.tmp > /dev/null 2>&1
    /bin/rm /var/tmp/roma.tmp > /dev/null 2>&1
    /opt/nec/roma/bin/roma -k start
    WATCHER_FLG=0
    while : ; do
      if [ -s /var/tmp/roma.tmp ]; then
        RETVAL=`head -1 /var/tmp/roma.tmp`
        if [ "$RETVAL" = "EOF" ]; then
            /bin/rm /var/tmp/watcher.tmp > /dev/null 2>&1
            /opt/nec/roma/bin/watcher -k start
            WATCHER_FLG=1
        fi
        break;
      fi
      sleep 1
    done
    while [ $WATCHER_FLG -eq 1 ]
    do
       if [ -s /var/tmp/watcher.tmp ]; then
           RETVAL_WATCHER=`head -1 /var/tmp/watcher.tmp`
           if [ "$RETVAL_WATCHER" = "EOF" ];then
               /bin/rm -f /var/log/roma/roma_watcher_1st_flg > /dev/null 2>&1
           fi
           break;
       fi
       sleep 1
    done

    RETVAL=$?
    /bin/rm /var/log/roma/roma_chk_flg > /dev/null 2>&1
    exit $RETVAL
    ;;

reload)
    killproc /opt/nec/roma/bin/roma -HUP
    exit $?
    ;;

*)
    echo "Usage: $0 {start|stop|restart|reload}"
    exit 1
esac

exit 0
