
#!/bin/ksh
# File  : make_sv_report.ksh
# KSH is needed for the (internal) calculating
# By    : Maarten.deBoer@Atos.net, 130311
# Subject       : Script to make ONLY VolumeSnapMirror report (for ING)
# The report need to show amount of SMs done within 17 min & 30 min
# Should run at Sat 23:55, because log/snapmirror will be switched at Sun 00:00 to .0
#(0.2)  : More rows with times. Added MAILSRC, mod. SECONDS
#(0.3) : Added; logging of ERROR-entry in LOG-file
#(0.4)  : Add SMLOGFILENAME+NR, if [ ${LExx} -gt 0 ]
#(0.5)  : Mod. LOG-output
#(0.6)  : Mod. day switch & Day added in exception (<= 1800)
#(0.7)	: Copied from make_vsm_report. Added LE01..PR=0
#set -x
PGM="`basename $0|cut -d\. -f1`"
TMP="/tmp/${PGM}.$$"
VERSION="0.7"
MAILTO="maarten.deboer@atos.net"
HOSTNAME="`hostname|cut -d\. -f1`"
MAIL=""
FILERS="${HOME}/etc/filers"
MAILFILE="/tmp/${PGM}.$$.mail"
SSH="/usr/bin/ssh -n"
FILTERSTR="[?]*"
FILTER="${FILTERSTR}"
SUBJECT="FSOD SnapVault report"
DATE="`date +%d-%m-%Y`"
TOLL=""
FILERS="${HOME}/etc/filers"
LOG="${HOME}/log/${PGM}.log"
LOGFILENR=""
RHREL="`/bin/rpm -qa|grep redhat-release|cut -d\- -f4| grep -i server`"
SMLOGFILENAME="/etc/log/snapmirror"
SMLOGFILENR=""

MAILSRC()
{
  if [ "${RHREL}" = "5Server" ]; then
    cat ${0}|uuencode ${PGM}.txt|mailx -s "${PGM}" ${MAILTO}
  fi
  if [ "${RHREL}" = "6Server" ]; then
    cp ${0} ${TMP}/${PGM}.txt
    echo "${PGM} at `date`"|mailx -s "${PGM}" -a ${TMP}/${PGM}.txt ${MAILTO}
    rm ${TMP}/${PGM}.txt
  fi
  echo "`date` Mailed ${0} to ${MAILTO}. RHEL=${RHREL} "|tee -a ${LOG}
}

USAGE()
{
  echo "Usage: ${PGM} <options> "
  echo "  Version: ${VERSION}"
  echo "  options:"
  echo "    -e|--etc       : Etc/filers-file (${FILERS})"
  echo "    -f             : Filter filername (${FILTER})"
  echo "    -h|--help      : this Help"
  echo "    -l|--logfilenr : Logfilenumber (without .)"
  echo "    -m|--mail      : do send Mail"
  echo "    -C             : Customername (only for filename purpose)"
  echo "    -V             : show Version"
  echo "    -x             : set -x"
  echo "    --mailto       : change MAILTO address & do send mail (${MAILTO})"
  echo "    --toll         : send to LiveLink (via mailbox-role of ${MAILTO})"
}
# Check options
if [ ${#} -eq 0 ]; then
  echo "No option(s) given. So not to know what to do. Exiting..."; echo; USAGE;
  exit 1
fi
while [ ${#} -ge 1 ]
  do
  case ${1} in
    -e | --etc) FILERS=${2}; shift ;;
    -f) FILTER=${2}; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -l | --logfilenr) SMLOGFILENR=".${2}"; shift ;;
    -m | --mail) MAIL=1 ;;
    -C) CUST="-${2}"; shift;;
    -V) echo "${PGM}: v${VERSION}"; exit 3 ;;
    -x)  set -x ;;
    --mailsrc) MAILSRC; exit 1 ;;
    --mailto) MAILTO=$2; MAIL=1; shift ;;
    --toll) TOLL=1; MAIL=1 ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done
if [ ! -d ${HOME}/log ]; then
  mkdir ${HOME}/log
fi
echo "`date` ${PGM} Started "|tee -a ${LOG}

SUBJECT="FSOD${CUST} SnapVault"
CSVSTR="FSOD${CUST}_SnapVault"
SUBJECT="${SUBJECT} report ${DATE}"
CSVSTR="${CSVSTR}_report"
SMLOGFILENAME="${SMLOGFILENAME}${SMLOGFILENR}"

# FILTER (-f) is altered, then add in filename
if [ "${FILTERSTR}" != "${FILTER}" ]; then
  CSV="${CSVSTR}_${FILTER}_`date +%Y-%m-%d`.csv"
else
  CSV="${CSVSTR}_`date +%Y-%m-%d`.csv"
fi

echo "CUST=${CUST}"
echo "CSV=${CSV}"
echo "FILERS=${FILERS}"
echo "FILTER=${FILTER}"
echo "LOGFILENR=${LOGFILENR}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "PGM=${PGM}"
echo "SUBJECT=${SUBJECT}"
echo "SMLOGFILENAME=${SMLOGFILENAME}"
echo "TOLL=${TOLL}"
echo "VERSION=${VERSION}"

sleep 2

touch ${TMP}

echo "# Filername;Volumename;Number of SnapVaults [#];SV time <=1min. [#];<=1min. [%];<=2min. [#];<=2min. [%];<=3min. [#];<=3min. [%];<=4min. [#];<=4min. [%];<=5min. [#];<=5min. [%];<=10min. [#];<=10min. [%];<=15in. [#];<=15min. [%];<=17min. [#];<=17min. [%];<=30min. [#];<=30min. [%];Remarks;"|tee -a ${TMP}.3 

for FILER in `cat ${FILERS}|grep -v \#|awk -F\; '{print$1}'|grep "${FILTER}"`
do
  echo "`date` ${FILER} ..."
  if [ -f /filers/${FILER}/vol0/${SMLOGFILENAME} ]; then
    echo "`date`   cp ${SMLOGFILENAME} ..."
    cp /filers/${FILER}/vol0/${SMLOGFILENAME} ${TMP}
  else
    echo "`date`   rdfile ${SMLOGFILENAME} ..."
    ${SSH} ${FILER} rdfile ${SMLOGFILENAME} > ${TMP}
  fi
  if [ ! -s ${TMP} ]; then
    echo "${TMP} is empty. Exiting ..."
    rm ${TMP}
    exit 4
  fi
  echo "`date`   SV status ..."
# Get a list of SnapVaulted (destination) SnapVaults
  ${SSH} ${FILER} snapvault status|grep Snapvaulted|grep ${FILER}|grep -v vfiler|awk '{print $2}'|sort -u|while read FILER_VOLUME
  do
    echo "${FILER_VOLUME} .."
    touch ${TMP}.2
    grep ${FILER_VOLUME} ${TMP}|egrep 'Start|End'| while read LINE
    do
      echo "${LINE}"|awk '{print "# "$3,$4";"}' >> ${TMP}.1
      STARTMON="`echo ${LINE}|grep Start|awk '{print $3}'`"
      STARTDAY="`echo ${LINE}|grep Start|awk '{print $4}'`"
      STARTTIME="`echo ${LINE}|grep Start|awk '{print $5}'`"
      if [ "${STARTTIME}" != "" ]; then
        STARTHR="`echo ${STARTTIME}|cut -d\: -f1`"
        STARTMIN="`echo ${STARTTIME}|cut -d\: -f2`"
        STARTSEC="`echo ${STARTTIME}|cut -d\: -f3`"
        let "STARTSECONDS= (${STARTHR} * 3600) + (${STARTMIN} * 60) + ${STARTSEC}"
        echo -n "${FILER_VOLUME} ${STARTMON} ${STARTDAY} ${STARTSECONDS} ${STARTTIME} ">> ${TMP}.2
      fi  # if [ "${STARTTIME}" = "" ]
      ENDTIME="`echo ${LINE}|grep End|awk '{print $5}'`"
      if [ "${ENDTIME}" != "" ]; then
        ENDHR="`echo ${ENDTIME}|cut -d\: -f1`"
        ENDMIN="`echo ${ENDTIME}|cut -d\: -f2`"
        ENDSEC="`echo ${ENDTIME}|cut -d\: -f3`"
        let "ENDSECONDS= (${ENDHR} * 3600) + (${ENDMIN} * 60) + ${ENDSEC}"
        echo "${ENDSECONDS} ${ENDTIME} " >> ${TMP}.2
      fi  # if [ "${ENDTIME}" != "" ]

    done  # while read LINE

    COUNT=0
    LE01=0
    LE02=0
    LE03=0
    LE04=0
    LE05=0
    LE10=0
    LE15=0
    LE17=0
    LE30=0
    cat ${TMP}.2 | while read FILERVOL STARTMON STARTDAY STARTSECONDS STARTTIME ENDSECONDS ENDTIME
    do
      let "COUNT=${COUNT} + 1"
      VOLUME="`echo ${FILERVOL}|cut -d\: -f2`"
      let "DURATION= ${ENDSECONDS} - ${STARTSECONDS} "
      if [ ${DURATION} -le 0 ]; then  # < 0 sec. Is day switch, so +86400 sec.
        let "DURATION= ${DURATION} + 86400"
#        echo "${FILER};${VOLUME};;;;;;;;;;;;;;;;;;;;${FILERVOL} <= 0s ${DURATION}s. ${STARTTIME} (${STARTSECONDS}s.) ${ENDTIME} (${ENDSECONDS}s.);"|tee -a ${LOG}|tee -a ${TMP}.3
#        grep ${STARTTIME} ${TMP}|grep ${FILERVOL}|tee -a ${LOG}
#        grep ${ENDTIME} ${TMP}|grep ${FILERVOL}|tee -a ${LOG}
      fi
      if [ ${DURATION} -le 60 ]; then  # <= 1min.
        let "LE01= ${LE01} + 1"
      fi
      if [ ${DURATION} -le 120 ]; then  # <= 2min.
        let "LE02= ${LE02} + 1"
      fi
      if [ ${DURATION} -le 180 ]; then  # <= 3min.
        let "LE03= ${LE03} + 1"
      fi
      if [ ${DURATION} -le 240 ]; then  # <= 4min.
        let "LE04= ${LE04} + 1"
      fi
      if [ ${DURATION} -le 300 ]; then  # <= 5min.
        let "LE05= ${LE05} + 1"
      fi
      if [ ${DURATION} -le 600 ]; then  # <= 10min.
        let "LE10= ${LE10} + 1"
      fi
      if [ ${DURATION} -le 900 ]; then  # <= 15min.
        let "LE15= ${LE15} + 1"
      fi
      if [ ${DURATION} -le 1020 ]; then  # <= 17min.
        let "LE17= ${LE17} + 1"
      fi
      if [ ${DURATION} -le 1800 ]; then  # <= 30min.
        let "LE30= ${LE30} + 1"
      else
        echo "${FILER};${VOLUME};;;;;;;;;;;;;;;;;;;;${FILERVOL} > 1800s = ${DURATION}s. ${STARTMON} ${STARTDAY} ${STARTTIME} (${STARTSECONDS}s.) ${ENDTIME} (${ENDSECONDS}s.);"|tee -a ${LOG}|tee -a ${TMP}.3
        grep ${STARTTIME} ${TMP}|grep ${FILERVOL}|tee -a ${LOG}
        grep ${ENDTIME} ${TMP}|grep ${FILERVOL}|tee -a ${LOG}
      fi
    done  # while read START END
    LE01PT=0
    LE02PT=0
    LE03PT=0
    LE04PT=0
    LE05PT=0
    LE10PT=0
    LE15PT=0
    LE17PT=0
    LE30PT=0
# When LE's -GreaterThen 0 then
    if [ ${COUNT} -gt 0 ]; then
      let "LE01PT= ( ${LE01} * 100 ) / ( ${COUNT} )"
      let "LE02PT= ( ${LE02} * 100 ) / ( ${COUNT} )"
      let "LE03PT= ( ${LE03} * 100 ) / ( ${COUNT} )"
      let "LE04PT= ( ${LE04} * 100 ) / ( ${COUNT} )"
      let "LE05PT= ( ${LE05} * 100 ) / ( ${COUNT} )"
      let "LE10PT= ( ${LE10} * 100 ) / ( ${COUNT} )"
      let "LE15PT= ( ${LE15} * 100 ) / ( ${COUNT} )"
      let "LE17PT= ( ${LE17} * 100 ) / ( ${COUNT} )"
      let "LE30PT= ( ${LE30} * 100 ) / ( ${COUNT} )"
    fi
    echo "${FILER};${VOLUME};${COUNT};${LE01};${LE01PT}%;${LE02};${LE02PT}%;${LE03};${LE03PT}%;${LE04};${LE04PT}%;${LE05};${LE05PT}%;${LE10};${LE10PT}%;${LE15};${LE15PT}%;${LE17};${LE17PT}%;${LE30};${LE30PT}%;"|tee -a ${TMP}.3

    rm ${TMP}.2
  done  # while read VOLUME

done  # for FILER in


echo "" >>  ${TMP}.3
echo "# From ${PGM} (v${VERSION})" >>  ${TMP}.3
echo "# At;${HOSTNAME};`date`" >> ${TMP}.3
echo "# Filers;${FILERS};" >> ${TMP}.3
echo "# Filter;${FILTER};" >> ${TMP}.3
echo "# SnapMirrorLogfileName;${SMLOGFILENAME};" >> ${TMP}.3
echo "# Days:" >> ${TMP}.3
cat ${TMP}.1 | sort -u >> ${TMP}.3
if [ ${MAIL} ]; then
  SUBJECT=":${HOSTNAME}: ${SUBJECT} [${PGM} v${VERSION}]"
  if [ ${TOLL} ]; then
    SUBJECT="${SUBJECT} {TO_LL:fsod_ing}"
  fi
  RHREL="`/bin/rpm -qa|grep redhat-release|cut -d\- -f4| grep -i server`"
  if [ "${RHREL}" = "5Server" ]; then
    cat ${TMP}.3|uuencode ${CSV}|mailx -s "${SUBJECT}" ${MAILTO}
  fi
  if [ "${RHREL}" = "6Server" ]; then
    cp ${TMP}.3 /tmp/${CSV}
    echo "${SUBJECT} at `date`"|mailx -s "${SUBJECT}" -a /tmp/${CSV} ${MAILTO}
    rm /tmp/${CSV}
  fi
  echo "`date` Mailed ${CSV} to ${MAILTO} (${SUBJECT}). RHEL=${RHREL} "|tee -a ${LOG}
fi

echo ""
rm ${TMP} ${TMP}.3
echo "`date` ${PGM} Finished "|tee -a ${LOG}
exit 0

