#! /bin/sh
#      (Messenger for InterSec LB)
USAGESTR="usage: lbmsgr [-d 1][-?]"
DEBUG=0
LINEMAX=1000
PROCREP=0
FILEREP=0
FOREP=0
FBREP=0
NODEDOWN=0
MAILADR1=root
MAILSVIP1=localhost
MAILADR2=root
MAILSVIP2=localhost
MAILSW2=0
SLEEPTIME=1m
HN=localhost
PROCESS_RECOV=0

WATCHDAT=/etc/iplb4.d/watch.dat
WATCHLOG=/var/log/iplb4/watch.log
WATCHLOGNEW=/var/log/iplb4/watch.log.new
LBMSGTMP=/var/log/iplb4/lbmsgr.msg
LOCKF=/tmp/.iplbwatch-lock
PIDF=/var/log/iplb4/.lbmsgr-pid



get_lock() {
#	if [ ! -e $PIDF ]; then
		echo $$ > $PIDF
#	fi
	until ln -s $PIDF $LOCKF 2>/dev/null
	do
		sleep 1
	done
}



release_lock() {
    if [ -e $LOCKF ] && [ $$ == `/bin/cat $LOCKF` ]; then
        /bin/rm -f $LOCKF > /dev/null 2>&1
    fi
}



trap "release_lock; /bin/rm -f $PIDF $LOCKF >/dev/null 2>&1; exit 99" 1 2 3 15



while getopts 'd:\?' c
do
    case $c in
    d)    DEBUG=$OPTARG;;
    \?)   echo $USAGESTR
          exit 2;;
    esac
done



while true
do
if [ ! -e $LOCKF ] && [ -s $WATCHLOG ]; then
# եɤ߹
    if [ -s $WATCHDAT ]; then
        PROCREP=`/usr/bin/cut -f2 -d' ' $WATCHDAT`
        FILEREP=`/usr/bin/cut -f4 -d' ' $WATCHDAT`
        FOREP=`/usr/bin/cut -f6 -d' ' $WATCHDAT`
        FBREP=`/usr/bin/cut -f8 -d' ' $WATCHDAT`
        NODEDOWN=`/usr/bin/cut -f10 -d' ' $WATCHDAT`
        MAILADR1=`/usr/bin/cut -f11 -d' ' $WATCHDAT`
        MAILSVIP1=`/usr/bin/cut -f12 -d' ' $WATCHDAT`
        MAILADR2=`/usr/bin/cut -f13 -d' ' $WATCHDAT`
        MAILSVIP2=`/usr/bin/cut -f14 -d' ' $WATCHDAT`
        MAILSW2=`/usr/bin/cut -f15 -d' ' $WATCHDAT`
        SLEEPTIME=`/usr/bin/cut -f16 -d' ' $WATCHDAT`m
        PROCESS_RECOV=`/usr/bin/cut -f17 -d' ' $WATCHDAT`
        HN=`/bin/hostname`
    else
        if [ "0" != $DEBUG ]; then
            echo "There isn't $WATCHDAT"
        fi
    fi

# ɤ߹
    VAR=`/usr/bin/printf '%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s' $PROCREP $FILEREP $FOREP $FBREP $NODEDOWN $MAILADR1 $MAILSVIP1 $MAILADR2 $MAILSVIP2 $MAILSW2 $HN $LBMSGTMP $WATCHLOGNEW $DEBUG`
    get_lock
    /bin/awk -v VAR="$VAR" '
        BEGIN {
            split(VAR, a, ":")
            PROCREP=a[1]
            FILEREP=a[2]
            FOREP=a[3]
            FBREP=a[4]
            NODEDOWN=a[5]
            MAILADR1=a[6]
            MAILSVIP1=a[7]
            MAILADR2=a[8]
            MAILSVIP2=a[9]
            MAILSW2=a[10]
            HN=a[11]
            LBMSGTMP=a[12]
            WATCHLOGNEW=a[13]
            DEBUG=a[14]
        }
        $0 ~ /^[0-9].*/ {
            if ("0" != DEBUG)
                print $0
            YYYY=substr($0, 1, 4)
            MM=substr($0, 5, 2)
            DD=substr($0, 7, 2)
            hour=substr($0, 9, 2)
            min=substr($0, 11, 2)
            sec=substr($0, 13, 2)
            STR = sprintf("")
            RESULT = -1
            if (1 == PROCREP && $0 ~ /.*Process error$/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥץ۾郎ȯޤ\n", YYYY, MM, DD, hour, min, sec, HN)

            if (1 == PROCREP && $0 ~ /.*Contents Process error$/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥƥĥǥХץ۾郎ȯޤ\n", YYYY, MM, DD, hour, min, sec, HN)

            if (1 == FILEREP && $0 ~ /.*File error.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥե\(%s\)ΰ۾郎ȯޤ\n", YYYY, MM, DD, hour, min, sec, HN, $NF)

            if (1 == FOREP && $0 ~ /.*Fail Over$/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)إե륪Сޤ\n", YYYY, MM, DD, hour, min, sec, HN)

            if (1 == FBREP && $0 ~ /.*Fail Back$/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)˥եХåޤ\n", YYYY, MM, DD, hour, min, sec, HN)

            if (1 == NODEDOWN && $0 ~ /.*LBH Down.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥ롼\(%s\)ʬΡ\(%s\)Υ򸡽Фޤ\n", YYYY, MM, DD, hour, min, sec, HN, $5, $NF)

            if (1 == PROCREP && $0 ~ /.*Process recover$/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥץ줬λޤ\nѤ꤬ʤ Management ConsoleLoadBalancer˥ʬǧƤ\n", YYYY, MM, DD, hour, min, sec, HN)

            if (1 == PROCREP && $0 ~ /.*Contents Process recover$/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥƥĥǥХץ줬λޤ\nѤ꤬ʤ Management ConsoleLoadBalancer˥ʬǧƤ\n", YYYY, MM, DD, hour, min, sec, HN)

            if (1 == FILEREP && $0 ~ /.*File recover.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥե\(%s\)줬λޤ\nޥեƤϥ֡ȸͭˤʤޤ\nѤ꤬ʤ Management ConsoleLoadBalancer˥ʬǧƤ\n", YYYY, MM, DD, hour, min, sec, HN, $NF)

            if (1 == NODEDOWN && $0 ~ /.*LBH recover.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥ롼\(%s\)ʬΡ\(%s\)򸡽Фޤ\n", YYYY, MM, DD, hour, min, sec, HN, $5, $NF)

            if (1 == PROCREP && $0 ~ /.*Process recover error$/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥץ˼Ԥޤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, HN)

            if (1 == PROCREP && $0 ~ /.*Contents Process recover error$/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥƥĥǥХץ˼Ԥޤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, HN)

            if (1 == FILEREP && $0 ~ /.*File recover error.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - LB\(:%s\)ǥե\(%s\)˼Ԥޤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, HN, $NF)

            if (1 == FILEREP && $0 ~ /.*Contents Delivery Successful.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - 롼%sΥ٥%sΥƥĥǥХ꤬ｪλޤ\n", YYYY, MM, DD, hour, min, sec, $6, $NF)

            if (1 == FILEREP && $0 ~ /.*Contents Get error.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - 롼%sΥ٥%sϼ˼Ԥޤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, $6, $NF)

            if (1 == FILEREP && $0 ~ /.*Contents Distribute error nosync.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - 롼%sΥ٥%sۿ˼Ԥޤ\nʬΡɤƱȤƤʤƥĤƤޤ塢ۿκƼ¹ԤɬפǤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, $7, $NF)

            if (1 == FILEREP && $0 ~ /.*Contents Distribute error old.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - 롼%sΥ٥%sۿ˼Ԥޤ\nʬΡɤϸŤƥĤƤޤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, $7, $NF)

            if (1 == FILEREP && $0 ~ /.*Contents Distribute with Switch error new.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - 롼%sΥ٥%sϽۿ˼Ԥޤ\nʬΡɤϽ֤ǿƥĤƤޤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, $9, $NF)

            if (1 == FILEREP && $0 ~ /.*Contents Distribute with Switch error old.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - 롼%sΥ٥%sϽۿ˼Ԥޤ\nʬΡɤϽ֤ǸŤƥĤƤޤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, $9, $NF)


            if (1 == FILEREP && $0 ~ /.*Contents Switch error.*/)
                STR = sprintf("%s.%s.%s %s:%s:%s - 롼%sΥ٥%sϸ˼Ԥޤ\nʬΡɤΥƥĸǤ\n۾ĴƤ\n", YYYY, MM, DD, hour, min, sec, $6, $NF)

            if ("" != STR && "" != MAILADR1 && "" != MAILSVIP1) {
                printf "Subject: Express5800/LB᡼\n" > LBMSGTMP
                close(LBMSGTMP)
                CMD = sprintf("/usr/bin/nkf -M %s | /usr/bin/tr -d [\\\\012] > %s.mime", LBMSGTMP, LBMSGTMP)
                system(CMD)
                printf("\nTo: %s\nFrom: %s\n\n", MAILADR1, MAILADR1) > LBMSGTMP
                close(LBMSGTMP)
                CMD = sprintf("/bin/cat %s.mime %s > %s.head", LBMSGTMP, LBMSGTMP, LBMSGTMP)
                system(CMD)
                printf("%s\n---\nExpress5800/LB \(᡼ؤֿϤǤޤ\)\n", STR) > LBMSGTMP
                close(LBMSGTMP)
                CMD = sprintf("/usr/bin/nkf -j %s > %s.jis", LBMSGTMP, LBMSGTMP)
                system(CMD)
                CMD = sprintf("/bin/cat %s.head %s.jis > %s", LBMSGTMP, LBMSGTMP, LBMSGTMP)
                system(CMD)
                if (2 <= DEBUG) {
                    CMD = sprintf("/bin/cat %s", LBMSGTMP)
                    system(CMD)
                }
                MAILADR1_BAK = sprintf("%s", MAILADR1)
# 2004/02/23 SMNT MAIL TYPE -START
#                sub(/@/, "%", MAILADR1)
#                CMD = sprintf("/usr/sbin/sendmail %s@[%s] < %s > /dev/null 2>&1", MAILADR1, MAILSVIP1, LBMSGTMP)
                CMD = sprintf("/usr/bin/perl /usr/lib/iplb4/smtp.pl %s %s root@%s %s > /dev/null 2>&1", MAILSVIP1, MAILADR1, HN, LBMSGTMP)
# 2004/02/23 SMNT MAIL TYPE -END
                if ("0" != DEBUG)
                    printf("%s\n", CMD)
                RESULT = system(CMD)
                if ("1" == MAILSW2 && "" != MAILADR2 && "" != MAILSVIP2) {
                    CMD = sprintf("/bin/sed \"s/%s/%s/g\" %s > %s.2", MAILADR1_BAK, MAILADR2, LBMSGTMP, LBMSGTMP)
                    if ("0" != DEBUG)
                        printf("%s\n", CMD)
                    system(CMD)
# 2004/02/23 SMNT MAIL TYPE -START
#                    sub(/@/, "%", MAILADR2)
#                    CMD = sprintf("/usr/sbin/sendmail %s@[%s] < %s.2 > /dev/null 2>&1", MAILADR2, MAILSVIP2, LBMSGTMP)
                    CMD = sprintf("/usr/bin/perl /usr/lib/iplb4/smtp.pl %s %s root@%s %s.2 > /dev/null 2>&1", MAILSVIP2, MAILADR2, HN, LBMSGTMP)
# 2004/02/23 SMNT MAIL TYPE -END
                    if ("0" != DEBUG)
                        printf("%s\n", CMD)
		    RESULT = system(CMD)
                }
                if ("0" != DEBUG)
                    print "removing..."
                CMD = sprintf("/bin/rm -f %s* > /dev/null 2>&1", LBMSGTMP)
                system(CMD)
                if (0 == RESULT || 67 == RESULT)
                    STR="*"
                else
                    STR="X"
                if (0 != RESULT)
                    STR = sprintf("%s\(%d\)", STR, RESULT)
                printf "%s%s\n", STR, $0 >> WATCHLOGNEW
            } else
                printf "%s\n", $0 >> WATCHLOGNEW
            if ("0" != DEBUG)
                print "closing..."
            close(WATCHLOGNEW)
        }
        $0 ~ /^[X\*].*/ {
            printf "%s\n", $0 >> WATCHLOGNEW
            close(WATCHLOGNEW)
        }
        END {close(WATCHLOGNEW)}
    ' $WATCHLOG
    if [ -s $WATCHLOGNEW ]; then
        /usr/bin/tail -n -$LINEMAX $WATCHLOGNEW > $WATCHLOG
        if [ $? -eq 0 ]; then
            /bin/rm -f $WATCHLOGNEW
        fi
    fi
    release_lock
else
    if [ "0" != $DEBUG ]; then
        echo "I can't run, because, there is the $LOCKF or isn't $WATCHLOG"
    fi
fi
if [ "0" != $DEBUG ]; then
    /usr/bin/printf "sleep $SLEEPTIME ...\n---------------\n"
fi
sleep $SLEEPTIME
done
