
#!/bin/ksh
# File	: get_filer_figs.ksh
# By	: Maarten de Boer, 100115
# Subject	: Get filer figures and put this in a .CSV file
# (0.2)	: .ksh, Totalize Aggr + CSV
#(0.3)  : Added hostname in CSV
#(0.4)	: Added # Aggr's > 90%, Raw. cap,  # disks & spares
#{0.5)	: Added Aggr's > 80% AGGR_GT1 & _GT2
#(0.6)	: Made 3 Aggr col's & shifted to end of sheet.
#	: Added ${SSH}
#(0.7)	: Added PING to test connection + ${FILTER}
#(0.8)	: Added "SA:" & USAGE, MAILTO
#(0.9)	: Customer after each other + ->nlxfsd02 (ping + HOSTNAME)
#(0.10)	: Added TOLL, FILTERSTR
#(0.11)	: For RHEL6 & remove --toll, Added ${LOG}
# set -x
PGM="`basename $0|cut -d\. -f1`"
VERSION="0.10" 
TMP="/tmp/${PGM}.$$"
MAIL=""
MAILFILE="${TMP}.mailfile"
MAILTO="maarten.deboer@atos.net"
HOSTNAME="`hostname|cut -d\. -f1`"
FILERS="${HOME}/etc/filers"
SSH="/usr/bin/ssh -n"
DATE="`date +%Y-%m-%d`"
CSVSTR="FSOD_filer_figures"
AGGR_GT1=80
AGGR_GT2=90
SSH="/usr/bin/ssh -n"
DATUM="`date +%d-%m-%Y`"
PING="/bin/ping" 
SUBJECT=""
FILTERSTR="[?]*"
FILTER="${FILTERSTR}"
LOG="${HOME}/log/${PGM}.log"

USAGE()
{
  echo "Usage: ${PGM} [<options>]"
  echo "  Version: ${VERSION}"
  echo "  options:"
  echo "    -f          : filter filername (${FILTER})"
  echo "    -h | --help : this help"
  echo "    -m |--mail  : Mail .csv-file"
  echo "    -x          : set -x"
  echo "    -V          : Version"
  echo "    --mailto    : give other mailto address (=${MAILTO})"
}
# Check options
while [ ${#} -gt 0 ]
  do
  case ${1} in
    -f) FILTER=$2; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -m | --mail) MAIL=1 ;;
    --mailto) MAILTO=$2; MAIL=1; shift ;;
    -V) echo "${PGM}: v${VERSION}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done

echo "`date` ${PGM} started"|tee -a ${LOG}
# FILTER (-f) is altered, then add in filename
if [ "${FILTERSTR}" != "${FILTER}" ]; then
  CSV="${CSVSTR}_${FILTER}_${DATE}.csv"
else
  CSV="${CSVSTR}_${DATE}.csv"
fi

echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "FILTER=${FILTER}"
echo "SUBJECT=${SUBJECT}"
echo "TOLL=${TOLL}"
echo "CSV=${CSV}"

echo "# Date(NL);Filername;Allocated (Aggr Used) [TB];Available (Aggr Total) [TB];Avg Used [%];Raw cap. [TB];Disks [#];Aggr <= ${AGGR_GT1}% [#];Aggr > ${AGGR_GT1}% [#];Aggr > ${AGGR_GT2}% [#];Spares [#];Spares per type [#]" >> ${TMP}.csv
TTL_AGGR_TOTAL_TB=0
TTL_AGGR_USED_TB=0
for FILER in `cat ${FILERS}|grep -v \^#|grep ${FILTER}|awk -F\; '{print $1}'|sort`
do
  echo "${FILER} ..."
  # PINGable?
  ${PING} -c 1 ${FILER} 1> /dev/null 2>&1
  EC=$?
  if [ ${EC} -gt 0 ]; then
    echo "`date +%Y-%m-%d_%H:%M:%S` ${PGM}: Ping-Error to ${FILER} "|tee -a ${LOG}|tee -a ${ERR}
    echo "${DATUM};${FILER};Ping-Error;(${EC});;;;;;;;;;" >> ${TMP}.csv
    MSGSTR="${MSGSTR}, Ping-Error:${FILER}"
  else
    AGGR_TOTAL=0
    AGGR_USED=0
    AGGR_LE1_CNT=0
    AGGR_GT1_CNT=0
    AGGR_GT2_CNT=0
    ${SSH} ${FILER} df -gA|grep -v snapshot|awk '{print $2,$3,$5}'|grep -v used|sed -e's/GB//g'|sed -e's/%//g'| while read TOTAL USED PERC
    do
      let "AGGR_TOTAL=${AGGR_TOTAL}+${TOTAL}"
      let "AGGR_USED=${AGGR_USED}+${USED}"
# Check if Aggr% less / equal then $AGGR_GT%
      if [ ${PERC} -le ${AGGR_GT1} ]; then
        let "AGGR_LE1_CNT= $AGGR_LE1_CNT + 1"
      fi
# Check if Aggr% greater then $AGGR_GT%
      if [ ${PERC} -gt ${AGGR_GT1} ]; then
        let "AGGR_GT1_CNT= $AGGR_GT1_CNT + 1"
      fi
      if [ ${PERC} -gt ${AGGR_GT2} ]; then
        let "AGGR_GT2_CNT= $AGGR_GT2_CNT + 1"
      fi
    done
    let "AGGR_TOTAL_TB=${AGGR_TOTAL}/1024"
    let "AGGR_USED_TB=${AGGR_USED}/1024"
    if [ ${AGGR_TOTAL_TB} -gt 0 ]; then
      let "AGGR_PERC=(${AGGR_USED_TB} *100) / ${AGGR_TOTAL_TB}"
    else
      AGGR_PERC=0
    fi

  # Get RAW disk cap
    DISKCNT=0
    DISKMB=0
    ${SSH} $FILER sysconfig -r|egrep 'SA:|FC:'|grep -v FAILED|egrep 'dparity|parity|spare|data'|awk '{print $10}'|cut -d\/ -f1|while read LINE
    do
      let "DISKCNT= $DISKCNT + 1"
      let "DISKMB= $DISKMB + $LINE"
    done
    let "DISKGB = $DISKMB / 1024"
    let "DISKTB = $DISKMB / 1024/1024"

# Spare cnt
##  SPARECNT="`/usr/bin/ssh $FILER sysconfig -r|grep -v FAILED|egrep 'spare'|wc -l`"

# Spares per type disk
    ${SSH} ${FILER} sysconfig -r|egrep 'SA:|FC:'|grep -v FAILED|egrep 'spare'|awk '{print $8,$9,$10}'|cut -d\/ -f1|sed -e's/ /\-/g' > ${TMP}.spares
    SPARECNT="`cat ${TMP}.spares|wc -l`"
    SPARESTR=""
    cat ${TMP}.spares|sort -u|while read DISKTYPE
    do
      SPARES="`grep -c ${DISKTYPE} ${TMP}.spares`"
      SPARESTR="${SPARESTR} ${DISKTYPE}=${SPARES};"
    done
echo "SPARESTR=${SPARESTR}"

    echo "${DATUM};${FILER};${AGGR_USED_TB};${AGGR_TOTAL_TB};${AGGR_PERC};${DISKTB};${DISKCNT};${AGGR_LE1_CNT};${AGGR_GT1_CNT};${AGGR_GT2_CNT};${SPARECNT};${SPARESTR};" >> ${TMP}.csv
    let "TTL_AGGR_TOTAL_TB=${TTL_AGGR_TOTAL_TB}+${AGGR_TOTAL_TB}"
    let "TTL_AGGR_USED_TB=${TTL_AGGR_USED_TB}+${AGGR_USED_TB}"
#  Get vfiler/Customer info
    ${SSH} ${FILER} vfiler status|awk '{print $1}'|grep -v vfiler|sed -e 's/nlnafv//g'|sed -e 's/hwnafv//g'|sed -e 's/[0123456789]//g' >> ${TMP}.cust

  fi  # if PING
done  # for

let "TTL_AGGR_PERC=(${TTL_AGGR_USED_TB} *100) / ${TTL_AGGR_TOTAL_TB} "
echo "${DATUM};Total;${TTL_AGGR_USED_TB};${TTL_AGGR_TOTAL_TB};${TTL_AGGR_PERC};" >> ${TMP}.csv

echo ";" >> ${TMP}.csv
echo "${DATUM};Filers (heads);`cat ${FILERS}|grep -v \^#|grep ${FILTER}|awk -F\; '{print $1}'|wc -l`;" >> ${TMP}.csv
# Count nr of customers after above collection
echo -n "${DATUM};Customers;`cat ${TMP}.cust|sort -u|wc -l`;" >> ${TMP}.csv
cat ${TMP}.cust|sort -u|while read CUSTCODE
do
  echo -n "${CUSTCODE};" >> ${TMP}.csv
done
echo "" >> ${TMP}.csv
echo "#From;${PGM} (v${VERSION});" >> ${TMP}.csv
echo "#At ;${HOSTNAME};`date`;" >> ${TMP}.csv
echo "#With filter;${FILTER};" >> ${TMP}.csv

# If MAIL, Mail the info
if [ ${MAIL} ]; then
  RHREL="`/bin/rpm -qa|grep redhat-release|cut -d\- -f4| grep -i server`"
# Subject
  SUBJECT="@${HOSTNAME}: FSOD filer figures at ${DATE} [${PGM} v${VERSION}]"
  if [ "${RHREL}" = "5Server" ]; then
    cat ${TMP}.csv|uuencode ${CSV}|mailx -s "${SUBJECT}" ${MAILTO}
  fi
  if [ "${RHREL}" = "6Server" ]; then
    cp ${TMP}.csv /tmp/${CSV}
    echo "${PGM}: [${PGM} v${VERSION}] at `date`"|mailx -s "${SUBJECT}" -a /tmp/${CSV} ${MAILTO}
  fi
  echo "`date` Mailed ${CSV} to ${MAILTO} (${SUBJECT}) "|tee -a ${LOG}
fi

# Cleanup
rm ${TMP}.csv ${TMP}.cust ${TMP}.spares
echo "`date` ${PGM} finished"|tee -a ${LOG}
exit 0

