
#!/bin/ksh
# File  : get_counters.ksh
# By    : Maarten.deBoer@Atos.net, 140324
# Subject       : Report CIFS OPS & Latency & Sessions, SHares, Files collected in CSV /day
#(0.2)	: Added options -p(erf) -c(ifs), moved header to mail-part
#(0.3)	: Added --repeat (when LatencyThreshold reached) & --lt (LatThresh=) & --rc (RepeatCount=); Added REM
#(0.4)  : STATSCIFS= /...  sed 's/\./,/g'
#(0.5)	: Added TMP in LOOP
PGM="`basename $0|cut -d\. -f1`"
VER="0.5"
TMP="/tmp/${PGM}.$$"
SSH="/usr/bin/ssh -n"
FILERS="${HOME}/etc/filers"
HOSTNAME="`hostname|cut -d\. -f1`"
MAILTO="maarten.deboer@atos.net"
FILTER="[?]*"
LOG="${HOME}/log/${PGM}.log"
CSV="${HOME}/data/out/${PGM}_`/bin/date +%Y'-'%m'-'%d`.csv"
DELETECSV=""
MAIL=""
MAILFILE="/tmp/${PGM}_`/bin/date +%Y'-'%m'-'%d`.csv"
PERFCNT=""
CIFSCNT=""
REPEAT=""
RC=5
LT=15
REM="."

# Functions
USAGE()
{
  echo "Usage: ${PGM} <option(s)>"
  echo "  Version: ${VER}"
  echo "  options         :"
  echo "    -c | --cifs   : CIFS counters"
  echo "    -d            : Delete CSV"
  echo "    -e            : specify Etc-file (${FILERS})"
  echo "    -f            : filter filername (${FILTER})"
  echo "    -h | --help   : this help"
  echo "    -m | --mail   : do send mail"
  echo "    -p | --perf   : Perf counters"
  echo "    -r | --repeat : Repeat"
  echo "    -V            : Version"
  echo "    -x            : set -x"
  echo "    --lt          : LatencyThreshold (${LT}) ms"
  echo "    --mailto      : change MAILTO address & do send mail (${MAILTO})"
  echo "    --rc          : RepeatCount (${RC}) times"
}
## MAIN
# 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
    -c | --cifs) CIFSCNT=1;;
    -d) DELETECSV=1;;
    -e) FILERS=${2}; shift ;;
    -f) FILTER=${2}; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -m | --mail) MAIL=1 ;;
    -p | --perf) PERFCNT=1 ;;
    -r | --repeat) REPEAT=1 ;;
    --lt) LT=${2}; REPEAT=1; shift ;;
    --mailto) MAILTO=${2}; MAIL=1; shift ;;
    --rc) RC=${2}; REPEAT=1; shift ;;
    -V) echo "${PGM}: v${VER}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option $1 not known."; USAGE; exit 1 ;;
  esac
    shift
done

if [ "${CIFSCNT}" = "" ] && [ "${PERFCNT}" = "" ]; then
# When both options not slected, then select both
  CIFSCNT=1
  PERFCNT=1
fi

echo "CIFSCNT=${CIFSCNT}"
echo "CSV=${CSV}"
echo "DELETECSV=${DELETECSV}"
echo "FILERS=${FILERS}"
echo "FILTER=${FILTER}"
echo "HOSTNAME=${HOSTNAME}"
echo "LOG=${LOG}"
echo "LT=${LT}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "PERFCNT=${PERFCNT}"
echo "PGM=${PGM}"
echo "REPEAT=${REPEAT}"
echo "RC=${RC}"
echo "VER=${VER}"
echo "`date` ${PGM} v${VER} Started"|tee -a ${LOG}

sleep 1

if [ ${DELETECSV} ]; then
  cp /dev/null ${CSV}
fi  # DELETECSV

touch ${TMP}

for FILER in `cat ${FILERS}|grep ${FILTER}`
do
  if [ ${PERFCNT} ]; then
    DATI="`/bin/date +%Y'-'%m'-'%d' '%H':'%M':'%S`"
    STATSSYSTEM="`${SSH} ${FILER} stats show -i 1 -n 1 system:system:avg_processor_busy system:system:cpu_busy|tail -1|awk '{print $2\";\"$3}'`"
    STATSCIFS="`${SSH} ${FILER} stats show -i 1 -n 1 cifs:cifs:cifs_ops cifs:cifs:cifs_latency|tail -1|awk '{print $2\";\"$3}'|sed 's/\./,/g'`"
    echo "${DATI};${FILER};;${STATSSYSTEM};${STATSCIFS};;;;;${REM};" |tee -a ${CSV}
    CIFSLAT="`echo ${STATSCIFS}|cut -d\; -f2|cut -d\, -f1`" 
    COUNT=${RC}
# While CifsLatency high the Threshold & Not max count reached.
    while [ ${CIFSLAT} -gt ${LT} ] && [ ${COUNT} -gt 0 ];
    do
      sleep 10
      DATI="`/bin/date +%Y'-'%m'-'%d' '%H':'%M':'%S`"
      STATSSYSTEM="`${SSH} ${FILER} stats show -i 1 -n 1 system:system:avg_processor_busy system:system:cpu_busy|tail -1|awk '{print $2\";\"$3}'`"
      STATSCIFS="`${SSH} ${FILER} stats show -i 1 -n 1 cifs:cifs:cifs_ops cifs:cifs:cifs_latency|tail -1|awk '{print $2\";\"$3}'|sed 's/\./,/g'`"
echo "`date` CIFSLAT=${CIFSLAT} COUNT=${COUNT}" | tee -a ${LOG}
      REM="Latency ${CIFSLAT} > ${LT}, count down ${COUNT}"
      echo "${DATI};${FILER};;${STATSSYSTEM};${STATSCIFS};;;;;${REM};" |tee -a ${CSV}
      CIFSLAT="`echo ${STATSCIFS}|cut -d\; -f2|cut -d\, -f1`" 
      let "COUNT = ${COUNT} -1 "
    done
    REM=""
  fi  # PERFCNT

  if [ ${CIFSCNT} ]; then
    ${SSH} ${FILER} vfiler status | grep -v vfiler|grep running|awk '{print $1}'|while read VFILER
    do
      DATI="`/bin/date +%Y'-'%m'-'%d' '%H':'%M':'%S`"
      SMBSES="`${SSH} ${FILER} vfiler run -q ${VFILER} cifs sessions -p smb|grep ' - '|wc -l`"
      SMB2SES="`${SSH} ${FILER} vfiler run -q ${VFILER} cifs sessions -p smb2|grep ' - '|wc -l`"
      ${SSH} ${FILER} vfiler run -q ${VFILER} cifs sessions|egrep ' - ' -A 1|grep -v ' - '|grep "[0-9]"|awk '{print $1" "$2}'> ${TMP}
      TOTSHARES=0
      TOTFILES=0
      cp /dev/null ${TMP}.cifscnt
      cat ${TMP} |while read SHARES FILES
      do
        let "TOTSHARES=${TOTSHARES} + ${SHARES}"
        let "TOTFILES=${TOTFILES} + ${FILES}"
# Needed to use a file, for "transporting" out of this loop
        echo "${TOTSHARES} ${TOTFILES}" >> ${TMP}.cifscnt
      done  # cat
      TOTSHARES="`tail -1 ${TMP}.cifscnt|awk '{print $1}'`"
      TOTFILES="`tail -1 ${TMP}.cifscnt|awk '{print $2}'`"
      rm ${TMP}.cifscnt
      echo  "${DATI};${FILER};${VFILER};;;;;${SMBSES};${SMB2SES};${TOTSHARES};${TOTFILES};${REM};"|tee -a ${CSV}

    done  # VFILER
  fi  # CIFSCNT

done  # for FILERS

if [ ${MAIL} ]; then
  echo "# Date Time;Filer;Vfiler;avg_processor_busy [%];cpu_busy [%];cifs_ops [/s];cifs_latency [ms];SMB-sessions [#];SMB2-sessions [#];Shares [#];Files [#];Remarks;" > ${MAILFILE}
  cat ${CSV} >> ${MAILFILE}
  echo "#"|tee -a ${MAILFILE}
  echo "# At: `date`"|tee -a ${MAILFILE}
  echo "# CSV=${CSV}"|tee -a ${MAILFILE}
  echo "# DELETECSV=${DELETECSV}"|tee -a ${MAILFILE}
  echo "# FILERS=${FILERS}"|tee -a ${MAILFILE}
  echo "# FILTER=${FILTER}"|tee -a ${MAILFILE}
  echo "# HOSTNAME=${HOSTNAME}"|tee -a ${MAILFILE}
  echo "# LOG=${LOG}"|tee -a ${MAILFILE}
  echo "# LT=${LT}"|tee -a ${MAILFILE}
  echo "# MAIL=${MAIL}"|tee -a ${MAILFILE}
  echo "# MAILTO=${MAILTO}"|tee -a ${MAILFILE}
  echo "# PGM=${PGM}"|tee -a ${MAILFILE}
  echo "# REPEAT=${REPEAT}"|tee -a ${MAILFILE}
  echo "# RC=${RC}"|tee -a ${MAILFILE}
  echo "# VER=${VER}"|tee -a ${MAILFILE}
  date|mailx -a ${MAILFILE} -s "@${HOSTNAME}: Filer counters [${PGM} v${VER}]" ${MAILTO}
  echo "`date` Mailed to ${MAILTO}"|tee -a ${LOG}
  rm ${MAILFILE}
fi  # MAIL

rm ${TMP}
echo "`date` ${PGM} v${VER} finished."|tee -a ${LOG}
exit 0

