
#!/bin/sh
# File	: chk_ifgrp.sh
# By	: Maarten.deBoer@Atos.net, 131012
# Subject	: Check status of IFGRP
#(0.2)	: Check if media1 is < then media2 & alert
#(0.3)	: Added --mailto & ERROR at 1st in mail. Mod: < is LESSTHEN
#set -x

PGM="`basename $0|cut -d\. -f1`"
VER="0.3"
TMP="/tmp/${PGM}.$$"
ERRMSG="/tmp/${PGM}.$$.err"
MAILMSG="/tmp/${PGM}.$$.asc"
HOSTNAME="`hostname`"
LOG="${HOME}/log/${PGM}.log"
FILERS="${HOME}/etc/filers"
MAIL=""
MAILTO="maarten.deboer@atos.net"
MAXLOGSIZE=1024   # In K's
SSH="/usr/bin/ssh -n"
FILTER="[?]*"
SUBJECT=""
LOGGER=""

USAGE()
{
  echo "Usage: ${PGM} [<option(s)>] "
  echo "  Version: ${VERSION}"
  echo "  options         :"
  echo "    -f            : Filter filername (${FILTER})"
  echo "    -h | --help   : this help"
  echo "    -m | --mail   : do send mail (to ${MAILTO})"
  echo "    -l | --logger : send (short)msg (to USD) via Logger (, Nagios & ANGate)"
  echo "    -V            : Version"
  echo "    -x            : set -x"
  echo "    --mailto      : change MAILTO address & do send mail (${MAILTO})"
}

# Check options
while [ ${#} -gt 0 ]
  do
  case ${1} in
    -f) FILTER=${2}; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -l | --logger) LOGGER=1;;
    -m | --mail) MAIL=1;;
    --mailto) MAILTO=${2}; MAIL=1; shift ;;
    -V) echo "${PGM}: v${VER}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done

touch ${TMP} ${ERRMSG} ${MAILMSG}

# Check & move LOG-file if longer then max.
LOGSIZE=`du -ka ${LOG} | cut -f1`
if [ ${LOGSIZE} -ge ${MAXLOGSIZE} ]; then
  mv ${LOG} ${LOG}.old
  touch ${LOG}
fi

echo "`date` ${PGM} (v${VER}) started."|tee -a ${LOG}
echo "FILTER=${FILTER}"
echo "LOGGER=${LOGGER}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"

for FILER in `cat ${FILERS}|grep -v \^#|grep ${FILTER}|awk -F\; '{print $1}'|sort`
do
  echo "${FILER} ..."
# Get ifgrp's
  ${SSH} ${FILER} ifgrp status|grep 'Ifgrp'|grep link|cut -d\: -f1|sort|egrep 'svif|sig'|while read SIFGRP
  do
    echo "${FILER}:${SIFGRP}: "|tee -a ${TMP}
    STATE1=""
    STATE2=""
    ${SSH} ${FILER} ifgrp status ${SIFGRP}|egrep 'mvif|mig'|while read LINE
    do
      echo "  ${LINE}"|tee -a ${TMP}
      MIFGRP="`echo ${LINE}|cut -d\: -f1`"
      STATE_TYPE="`${SSH} ${FILER} ifgrp status ${MIFGRP}|egrep 'state|mediatype'`"
      echo "${STATE_TYPE}"|tee -a ${TMP}
# Fill STATE1, when empty. If not empty; already done. So STATE2 need to be used
      if [ "${STATE1}" = "" ]; then
        STATE1CNT="`${SSH} ${FILER} ifgrp status ${MIFGRP}|egrep 'mediatype'|wc -l`"
# If > 1 (rows), then remove CR-LFs
        if [ ${STATE1CNT} -gt 1 ]; then
          STATE1="`${SSH} ${FILER} ifgrp status ${MIFGRP}|egrep 'mediatype'|cut -d\: -f2|awk 'BEGIN {RS=""}
{
  t=0
  while (++t<=NF) {printf "%s ", $t}
  printf "\n"
}'file`"
        else
          STATE1="`${SSH} ${FILER} ifgrp status ${MIFGRP}|egrep 'mediatype'|cut -d\: -f2`"
        fi  # -gt 1
      else
        STATE2CNT="`${SSH} ${FILER} ifgrp status ${MIFGRP}|egrep 'mediatype'|wc -l`"
# If > 1 (rows), then remove CR-LFs
        if [ ${STATE2CNT} -gt 1 ]; then
          STATE2="`${SSH} ${FILER} ifgrp status ${MIFGRP}|egrep 'mediatype'|cut -d\: -f2|awk 'BEGIN {RS=""}
{
  t=0
  while (++t<=NF) {printf "%s ", $t}
  printf "\n"
}'file`"
        else
          STATE2="`${SSH} ${FILER} ifgrp status ${MIFGRP}|egrep 'mediatype'|cut -d\: -f2`"
        fi  # -gt 1
      fi  # STATE1

#      echo "|${STATE1}|${STATE2}|"


# Check both states
# If = , then OK. If not, then 2nd check
# 2nd check; if STATE2 is empty, Then only 1 IF. No problem
    if [ "${STATE1}" != "${STATE2}" ] && [ "${STATE2}" != "" ]; then
# MIND the <space> before "auto"
      if [ "${STATE1}" != " auto-10g_sr-fd-up" ]; then
        MSGSTR="CI=${FILER} ifgrp ${SIFGRP} state1:${STATE1} LESSTHEN state2:${STATE2} [${PGM}@${HOSTNAME}]"
        echo "ERROR: ${MSGSTR} "|tee -a ${ERRMSG}|tee -a ${LOG}
        cat ${TMP}|tee -a ${MAILMSG}
        cp /dev/null ${TMP}
# if (send) to Nagios via LOGGER
        if [ ${LOGGER} ]; then
          NAGIOSSEV="WARNING"
          /usr/bin/logger -t NOTIFY FSOD-SUPPORT ${NAGIOSSEV} "${MSGSTR}"
          echo "`date` ${PGM}: logger -t NOTIFY FSOD-SUPPORT ${NAGIOSSEV} ${MSGSTR}"|tee -a ${LOG}
        fi  # LOGGER
     
      fi  # [ "${STATE1}" != "auto-10g_sr-fd-up" ]

    fi  # [ "${STATE1}" != "${STATE2}" ]

    done  # MIFGRP

  done  # SIFGRP

done  # for FILER .. do

if [ ${MAIL} ]; then
  SUBJECT=":${HOSTNAME}: Check interface group(s) ${SUBJECT} [${PGM} v${VER}]"
# Place ERR ontop of the MAIL
# So MAIL will be copied at the end of ERR. And ERR will be mailed.
  echo "" >> ${ERRMSG}
  echo "Details in attachment." >> ${ERRMSG}
  cat ${ERRMSG} | mailx -a ${MAILMSG} -s "${SUBJECT}" ${MAILTO}
  echo "`date` Mailed to ${MAILTO} (${SUBJECT})."|tee -a ${LOG}
fi  # MAIL

rm ${TMP} ${ERRMSG} 
#${MAILMSG}
echo "`date` ${PGM} finished."|tee -a $LOG
exit 0

