#!/bin/bash
#-------------------------------------------------------------------------------
# charon_logevent
#-------------------------------------------------------------------------------
# Script is running within crontab that periodically check for log events and
# send events in bulk mode
#-------------------------------------------------------------------------------
# Copyright (C) 2013-2023 STROMASYS.
# All rights reserved.
# Products: PAR
#
VERSION=2.1

for P in $(ls /etc/profile.d/charon*);do . $P;done
. $(dirname $0)/charon_common

function PrepareMail
{
  cat ${FILE}.tmp | sed -e "s=^=<li>=g" -e "s=$=</li><br>=g" \
      -e "s=:INFO :=<span class\=${COL_INFO}>:INFO :</span>=g" \
      -e "s=:WARN :=<span class\=${COL_WARN}>:WARN :</span>=g" \
      -e "s=:WARNING:=<span class\=${COL_WARN}>:WARNING:</span>=g" \
      -e "s=:ERROR:=<span class\=${COL_ERROR}>:ERROR:</span>=g" \
      -e "s=:FATAL:=<span class\=${COL_FATAL}>:FATAL:</span>=g" \
      -e "s=:warn:=<span class\=${COL_WARN}>:warn:</span>=g" \
      -e "s=:err:=<span class\=${COL_ERROR}>:err:</span>=g" \
      -e "s=:ERR:=<span class\=${COL_FATAL}>:ERR:</span>=g" \
      -e "s=:MPE system fail=:<span class\=textred1>MPE system fail</span>=g" \
      >>${MAILFILE}
  echo "</ul>" >>${MAILFILE}
  rm -f ${FILE}.tmp

  ALERTLOG=${CHARONDIR}/log/charon_alerts.log
  ( echo "--------------------------------------------------------------------------------"; \
    echo "$(date +%Y%m%d:%H%M%S):ALERT:$1"; \
    cat ${MAILFILE} | sed -e "s=<br>==g" \
      -e "s=<b>==g"     -e "s=</b>==g" \
      -e "s=<li>==g"    -e "s=</li>==g" \
      -e "s=<ul>==g"    -e "s=</ul>==g" \
      -e "s=</font>==g" -e "s=<font .*>==g" \
      -e "s=</span>==g" -e "s=<span .*>==g" \
      -e "s=</a>==g"    -e "s=<a .*>==g" ) >>${ALERTLOG}
}

function SendMail
{
  KITV=$(cat ${CHARONDIR}/utils/kit.version 2>/dev/null | cut -f1 -d';')
  KITD=$(cat ${CHARONDIR}/utils/kit.version 2>/dev/null | cut -f2 -d';')

  TMPMAIL=${MAILFILE}.tmp
  MAILFROM=$(cat ${MAILFRFILE} 2>/dev/null)
  MAILFROM=$(cat ${MAILFRFILE} 2>/dev/null)
  if test -z "${MAILFROM}"
  then
    echo "From: $(whoami)@$(hostname)" >${TMPMAIL}
  else
    if test -n "$(echo ${MAILFROM} | grep '@')"
    then
      echo "From: ${MAILFROM}" >${TMPMAIL}
    else
      echo "From: ${MAILFROM}<$(whoami)@$(hostname)>" >${TMPMAIL}
    fi
  fi

  echo "To: ${MAILTO}" >>${TMPMAIL}
  echo "Subject: [${MAILTAG:-CHARON}] $1" >>${TMPMAIL}

  PRIOSEVER="Warning"
  PRIORITY="Normal"
  case "$2"
  in
    "LOW")
      echo "Importance: low" >>${TMPMAIL}
      echo "X-Priority: 5" >>${TMPMAIL}
      PRIOSEVER="Information"
      PRIORITY="Low"
      ;;
    "HIGH")
      echo "Importance: high" >>${TMPMAIL}
      echo "X-Priority: 1" >>${TMPMAIL}
      PRIOSEVER="Error"
      PRIORITY="High"
      ;;
  esac

  if test "${MAILMODE}" = "TEXT"
  then
    cat ${MAILFILE} | sed -e "s=<br>==g" \
        -e "s=<b>==g"     -e "s=</b>==g" \
        -e "s=<li>==g"    -e "s=</li>==g" \
        -e "s=<ul>==g"    -e "s=</ul>==g" \
        -e "s=</font>==g" -e "s=<font .*>==g" \
        -e "s=</span>==g" -e "s=<span .*>==g" \
        -e "s=</a>==g"    -e "s=<a .*>==g"    >>${TMPMAIL}
    if test -s ${MAILFTFILE}
    then
      echo >>${TMPMAIL}
      echo "------------------------------------------------" >>${TMPMAIL}
      cat ${MAILFTFILE} >>${TMPMAIL}
    fi

    echo >>${TMPMAIL}
    echo "(Kit version ${KITV:-unknown}, dated ${KITD:-unknown})" >>${TMPMAIL}

    /usr/sbin/sendmail -t -i <${TMPMAIL} 
    RET=$?
    test ${RET} = 0 && rm -f ${TMPMAIL}

  else
      cat <<EOHTML >>${TMPMAIL}
Mime-Version: 1.0;
Content-Type: text/html; charset=\"ISO-8859-1\";
Content-Disposition: inline;
<html>
<title>[CHARON] $1</title>
<style type='text/css'>
table { width: 100%; border-style: none;	}
td.Low       { background-color:#3AAADC; foreground-color:#000000; font-size: 24px; text-align: center; }
td.Normal    { background-color:#F5A634;	foreground-color:#000000;	font-size: 24px;	text-align: center; }
td.High      { background-color:#E95F40;	foreground-color:#000000;	font-size: 24px; text-align: center; }
td.Default   { background-color:#F3E400; foreground-color:#000000; font-size: 24px; text-align: center; }
.textblue1   { color: #0A71B4; }
.textblue2   { color: #0062AB; }
.textblue3   { color: #3AAADC; }
.textgreen1  { color: #00A096; }
.textgreen2  { color: #3EA650; }
.textgreen3  { color: #97BE0D; }
.textorange1 { color: #F5A634; }
.textorange2 { color: #EB6F29; }
.textred1    { color: #E95F40; }
.textred2    { color: #D40050; }
.textgray    { color: #3E3E40; }
.textblack   { color: #000000; }
.textfatal   { color: #C71585; }
</style>
<body>
<table><tr><td class=${PRIORITY}><b>${PRIOSEVER} alert</b></td></tr></table>
<br><span class=textblue1>Time of event</span>: $(date +"%d-%b-%Y %H:%M:%S")
<br><span class=textblue1>Hostname</span>: $(hostname)
<br>
EOHTML

    cat ${MAILFILE} >>${TMPMAIL}
    if test -s ${MAILFTFILE}
    then
      echo "<br>" >>${TMPMAIL}
      echo "<hr color="#3aaadc">" >>${TMPMAIL}
      cat ${MAILFTFILE} | sed "s=$=<br>=g" >>${TMPMAIL}
    fi

    echo "<br>" >>${TMPMAIL}
    echo "<span class=textgray>(Kit version ${KITV:-unknown}, dated ${KITD:-unknown})</span><br>" >>${TMPMAIL}

    echo "</body>" >>${TMPMAIL}
    echo "</html>" >>${TMPMAIL}

    /usr/sbin/sendmail -t -i <${TMPMAIL} 
    RET=$?
    #echo DEBUG RET=${RET} >>/tmp/debug.log
    test ${RET} = 0 && rm -f ${TMPMAIL}

  fi
  rm -f ${MAILFILE}
}

test -d ${CHARONDIR}/utils/events || mkdir ${CHARONDIR}/utils/events 

if test -e ${MAILTOFILE}
then
  MAILTO=$(grep -v ^# ${MAILTOFILE} | sort -u | tr "\n" ","|sed "s=,$==g")
else
  MAILTO="root@$(hostname),support@stromasys.com"
fi

MAILMODE=$(cat ${MAILMODEFILE} 2>/dev/null)
test "${MAILMODE}" != "TEXT" && MAILMODE="HTML"

MAILFILE="/tmp/$(basename $0).$(date +"%Y%m%d.%H%M%S.%N")"

get_preferences
typeset -i LVLEVENT=${LOGSEVERITYALERT}

typeset -i NBR_INFO=0
typeset -i NBR_WARN=0
typeset -i NBR_ERROR=0
typeset -i NBR_FATAL=0

FILCOUNT="/tmp/$(basename $0).counter"
if test $(ls -1 ${CHARONDIR}/utils/events/*.partlog 2>/dev/null | wc -l) -eq 0
then
  rm -f ${FILCOUNT}.* 2>/dev/null
else
  for FILE in $(ls -1 ${CHARONDIR}/utils/events/*.partlog 2>/dev/null)
  do
    GUEST=$(basename ${FILE}|cut -f1 -d '.')
    mv -f ${FILE} ${FILE}.tmp
    FILCOUNT="/tmp/$(basename $0).counter.${GUEST}"

    NBR_INFO=$(grep -v ':warn:' ${FILE}.tmp | grep -v ':err:' | grep -v ':ERR:' | grep -v ':WARNING:' | grep -v ':ERROR:' | grep -v ':FATAL:' | wc -l)
    COL_INFO="textblack"
    test ${NBR_INFO} -gt 0 && COL_INFO="textblue2"
    NBD_INFO=${NBR_INFO}
    test ${LVLEVENT} -gt 1 && NBD_INFO="Not monitored"

    NBR_WARN=$(grep -c -e ':warn:' -e ':WARNING:' ${FILE}.tmp)
    COL_WARN="textblack"
    test ${NBR_WARN} -gt 0 && COL_WARN="textorange1"
    NBD_WARN=${NBR_WARN}
    test ${LVLEVENT} -gt 2 && NBD_WARN="Not monitored"

    NBR_ERROR=$(grep -c -e ':err:' -e ':ERROR:' ${FILE}.tmp)
    COL_ERROR="textblack"
    test ${NBR_ERROR} -gt 0 && COL_ERROR="textred1"
    NBD_ERROR=${NBR_ERROR}
    test ${LVLEVENT} -eq 0 && NBD_ERROR="Not monitored"

    NBR_FATAL=$(grep -c -e ':ERR:' -e ':FATAL:' -e ':MPE system fail' ${FILE}.tmp)
    COL_FATAL="textblack"
    test ${NBR_FATAL} -gt 0 && COL_FATAL="textfatal"
    NBD_FATAL=${NBR_FATAL}

    echo "$(date +%s), I:${NBD_INFO}, W:${NBD_WARN}, E:${NBD_ERROR}, F:${NBD_FATAL}" >>${FILCOUNT}

    #-----------------------------------------------------------------------
    # if FILCOUNT has more than 5 entries and its 1st entry is less than 20
    # minutes old then display alert and block next emails
    #-----------------------------------------------------------------------
    typeset -i CHKDATE=$(date +%s)-$(head -1 ${FILCOUNT} | cut -f1 -d',')
    NBLFILC=$(cat ${FILCOUNT} | wc -l)

    PRIO="DEFAULT"
    test ${NBR_INFO}  -gt 0 && PRIO="LOW"
    test ${NBR_WARN}  -gt 0 && PRIO="DEFAULT"
    test ${NBR_ERROR} -gt 0 && PRIO="HIGH"
    test ${NBR_FATAL} -gt 0 && PRIO="HIGH"

    case ${NBLFILC}
    in
      1|2|3|4)
        cat <<EOF1 >${MAILFILE}
<span class=textblue1>Events count:</span><br>
INFORMATIONAL: <b><span class=${COL_INFO}>${NBD_INFO}</span></b><br>
WARNING: <b><span class=${COL_WARN}>${NBD_WARN}</span></b><br>
ERROR: <b><span class=${COL_ERROR}>${NBD_ERROR}</span></b><br>
FATAL: <b><span class=${COL_FATAL}>${NBD_FATAL}</span></b><br>
<br>
<span class=textblue1>Events:</span><br>
<ul>
EOF1
        if test ! -e ${ETCCHARON}/CharonToolkit.${GUEST}.alertsdisabled
        then
          PrepareMail
          SendMail "Events found in ${GUEST}.log" "${PRIO}"
        else
          rm -f ${FILE}.tmp
        fi
        ;;
      5)
        if test ${CHKDATE} -lt 1200
        then
          cat <<EOF2 >${MAILFILE}
<span class=textblue1>Events count:</span><br>
INFORMATIONAL: <b><span class=${COL_INFO}>${NBD_INFO}</span></b><br>
WARNING: <b><span class=${COL_WARN}>${NBD_WARN}</span></b><br>
ERROR: <b><span class=${COL_ERROR}>${NBD_ERROR}</span></b><br>
FATAL: <b><span class=${COL_FATAL}>${NBD_FATAL}</span></b><br>
<br>
<b><span class=textred1>TOO MANY ALERTS, EMAILS PAUSED</span></b><br>
<b><span class=textred1>MANUAL CHECK OF THE LOG FILE REQUIRED</span></b><br>
<b><span class=textgray>Emails will be released after 20 minutes or if no event found on next check</span></b><br>
<br>
<span class=textblue1>Events:</span><br>
<ul>
EOF2
          if test ! -e ${ETCCHARON}/CharonToolkit.${GUEST}.alertsdisabled
          then
            PrepareMail
            SendMail "Events found in ${GUEST}.log (manual check required)" "HIGH"
          else
            rm -f ${FILE}.tmp
          fi
        else
          rm -f ${FILCOUNT} 2>/dev/null
          cat <<EOF3 >${MAILFILE}
<span class=textblue1>Events count:</span><br>
INFORMATIONAL: <b><span class=${COL_INFO}>${NBD_INFO}</span></b><br>
WARNING: <b><span class=${COL_WARN}>${NBD_WARN}</span></b><br>
ERROR: <b><span class=${COL_ERROR}>${NBD_ERROR}</span></b><br>
FATAL: <b><span class=${COL_FATAL}>${NBD_FATAL}</span></b><br>
<br>
<span class=textblue1>Events:</span><br>
<ul>
EOF3
          if test ! -e ${ETCCHARON}/CharonToolkit.${GUEST}.alertsdisabled
          then
            PrepareMail
            SendMail "Events found in ${GUEST}.log (restored alerts)" "${PRIO}"
          else
            rm -f ${FILE}.tmp
          fi
        fi
        ;;
      *)
        if test ${CHKDATE} -ge 1200
        then
          rm -f ${FILCOUNT} 2>/dev/null
          cat <<EOF4 >${MAILFILE}
<span class=textblue1>Events count:</span><br>
INFORMATIONAL: <b><span class=${COL_INFO}>${NBD_INFO}</span></b><br>
WARNING: <b><span class=${COL_WARN}>${NBD_WARN}</span></b><br>
ERROR: <b><span class=${COL_ERROR}>${NBD_ERROR}</span></b><br>
FATAL: <b><span class=${COL_FATAL}>${NBD_FATAL}</span></b><br>
<br>
<span class=textblue1>Events:</span><br>
<ul>
EOF4
          if test ! -e ${ETCCHARON}/CharonToolkit.${GUEST}.alertsdisabled
          then
            PrepareMail
            SendMail "Events found in ${GUEST}.log (restored alerts)" "${PRIO}"
          else
            rm -f ${FILE}.tmp
          fi
        fi
        ;;
    esac
  done
fi

exit
