
#!/bin/sh
# File	: cdot_rpt_aggr-vol.sh
# By	: Maarten.deBoer@Atos.net, 160617
# Subject	: Script to make aggr and volume report at cDOT
#(0.2)  : Volumes added
#(0.3),210914	: Added volume -fields
#(0.4),231024	: Ren. from cdot_make_aggr-vol_report.sh
PGM="`basename $0|cut -d\. -f1`"
VER="0.4"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
SSH="/usr/bin/ssh -n"
HOSTNAME="`hostname|cut -d\. -f1`"
MAIL=""
MAILTO="maarten.deboer@atos.net"
CFILTER="[?]*"
DATE="`date +%Y-%m-%d`"
CLUSTERS="${HOME}/etc/clusters"
PREFIX="nlnaf"
CSV=""
ERR="${HOME}/log/${PGM}.err"
TMPERR="/tmp/${PGM}.$$.err"
RCFILE="${HOME}/etc/${PGM}.rc"

USAGE()
{
  echo "Usage: ${PGM} [options]"
  echo "  Version: ${VER}"
  echo "  options          :"
  echo "    -c             : Cluster filter (${CFILTER})"
  echo "    -e             : Etc/clusters file (${CLUSTERS})"
  echo "    -h | --help    : this help"
  echo "    -m | --mail    : do send Mail (only)"
  echo "    --mailto       : change MAILTO address & do send mail (${MAILTO})"
  echo "    -V             : Version"
  echo "    -x             : set -x"
}
if [ -f ${RCFILE} ]; then
  echo "  RCFILE (${RCFILE}) found. Eginx it"|tee -a ${LOG}
  . ${RCFILE}
fi  # RCFILE
# Check options
while [ ${#} -gt 0 ]
  do
  case ${1} in
    -e) CLUSTERS=${2}; shift ;;
    -c) CFILTER=${2}; shift ;;
    -m | --mail) MAIL=1 ;;
    -h | --help) USAGE; exit 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




SSHCMD()
# 1: Filername 2:Command-string
# When issue with connection to cluster, try the nodes (-01 & -02)
# "There are no entries matching your query." => EC=255
# "no connection" is also EC=255
{
  /usr/bin/ssh -n ${1} "${2}" 2> ${TMPERR}
  EC=${?}
  # Check if "ssh: connect to host 10.192.109.202 port 22: Connection refused" If so (EC2=0), the 2nd
  grep 'Connection refused' ${TMPERR}
  EC2=${?}
  if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
    echo "  EC=${EC} EC2=${EC2} ${1} ${2} " >> ${ERR}
    sleep 2
    /usr/bin/ssh -n ${1}-01 "${2}" 2> ${TMPERR}
    EC=${?}
    grep 'Connection refused' ${TMPERR}
    EC2=${?}
    if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
      echo "  EC=${EC} EC2=${EC2} ${1}-01 ${2} " >> ${ERR}
      sleep 2
      /usr/bin/ssh -n ${1}-07 "${2}" 2> ${TMPERR}
      EC=${?}
      grep 'Connection refused' ${TMPERR}
      EC2=${?}
      if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
        echo "  EC=${EC} EC2=${EC2} ${1}-02 ${2} " >> ${ERR}
        sleep 2
        /usr/bin/ssh -n ${1}-08 "${2}" 2> ${TMPERR}
        EC=${?}
        grep 'Connection refused' ${TMPERR}
        EC2=${?}
        if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
          echo "  EC=${EC} EC2=${EC2} ${1}-09 ${2} " >> ${ERR}
          echo "  EC=${EC} sleep 2 ..."
          sleep 2
          /usr/bin/ssh -n ${1}-04 "${2}" 2> ${TMPERR}
          EC=${?}
          grep 'Connection refused' ${TMPERR}
          EC2=${?}
          if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
            echo "  EC=${EC} EC2=${EC2} ${1}-04 ${2} " >> ${ERR}
            echo  "`date` ${PGM} ERROR with communication to ${1}. Connection to -01 - -04 failed too."|tee -a ${LOG} ${ERR}
          fi
        fi
      fi
    fi
  fi
}

CSV="FSOD-cDOT_Aggr-Volume_report_${DATE}.csv"
if [ "${FILTER}" != '[?]*' ]; then
  CSV="FSOD-cDOT_Aggr-Volume_report_${FILTER}_${DATE}.csv"
fi

DISKUSED=""
DISKLIMIT=""

echo "`date` ${PGM} v${VER} started. (--mailto ${MAILTO} )"|tee -a ${LOG} ${ERR}
touch ${TMP}

echo "  CLUSTERS=${CLUSTERS}"|tee -a ${TMP}.mail
echo "  CFILTER=${CFILTER}"|tee -a ${TMP}.mail
echo "  CSV=${CSV}"|tee -a ${TMP}.mail
echo "  DATE=${DATE}"|tee -a ${TMP}.mail
echo "  HOSTNAME=${HOSTNAME}"|tee -a ${TMP}.mail
echo "  LOG=${LOG}"|tee -a ${TMP}.mail
echo "  MAIL=${MAIL}"|tee -a ${TMP}.mail
echo "  MAILTO=${MAILTO}"|tee -a ${TMP}.mail
echo "  PGM=${PGM}"|tee -a ${TMP}.mail
echo "  PREFIX=${PREFIX}"|tee -a ${TMP}.mail
echo "  TMP=${TMP}"|tee -a ${TMP}.mail
echo "  VER=${VER}"|tee -a ${TMP}.mail

#echo "# Cluster;Node;Aggregate;Size [GB];Available Size [GB];Used Size [GB];Total Physical Used Size [GB];Used Percentage [GB];Hybrid;Number Of Volumes;SVM;Vol.name;Vol.size [GB];Total User-Visible Size [GB];Vol.Used Size [GB];Space Saved by Storage Efficiency [GB];Space Saved by Deduplication [GB];Space Saved by Compression [GB];Volume Size Used by Snapshot Copies [GB];Space Guarantee Style; "|tee -a ${TMP}

#echo -n "# Cluster;Node;Aggregate;Size [GB];Available Size [GB];Used Size [GB];Total Physical Used Size [GB];Used Percentage [GB];Hybrid;Number Of Volumes;"|tee -a ${TMP}
echo -n "# Cluster;Node;Aggregate;Size [GB];Available Size [GB];Used Size [GB];Used Percentage [%];Total Physical Used Size [GB]; "|tee -a ${TMP}
#    echo "${CLUSTER};${NODE};${AGGRNAME};${SIZE};${USED_SIZE};${USED_PERC};${TOTAL_PHYS_USED};"|tee -a ${TMP}

#SVM;Vol.name;Vol.size [GB];Total User-Visible Size [GB];Vol.Used Size [GB];Space Saved by Storage Efficiency [GB];Space Saved by Deduplication [GB];Space Saved by Compression [GB];Volume Size Used by Snapshot Copies [GB];Space Guarantee Style; "|tee -a ${TMP}

#Vserver Name;Volume Name;Aggregate Name;Available Size;Total User-Visible Size;Used Size;Used Percentage;Space Guarantee Style;Node name;Space Saved by StorageEfficiency;Space Saved by Deduplication;Space Saved by Compression;Logical Used Size;Logical Used Percentage;Logical Available Size;Logical Space Reporting;Logical Space Enforcement;
#
#      echo "SVM;Volume Name;Total User-Visible Size [GB];Used Size [GB];Space Guarantee Style;Space Saved by StorageEfficiency [GB];Logical Used Size [GB];Logical Available Size;Logical Space Reporting;Logical Space Enforcement;"|tee -a ${TMP}
#
      echo "Vserver Name;Volume Name;Volume Type;Total User-Visible Size [GB];Used Size [GB];Used Percentage;Maximum Autosize [GB];Minimum Autosize [GB];Autosize Grow Threshold Percentage [%];Autosize Shrink Threshold Percentage [%];Autosize Mode;Space Guarantee Style;Space Saved by Storage Efficiency [GB];Logical Used Size [GB];"|tee -a ${TMP}

for CLUSTER in `cat ${CLUSTERS}|grep -v \^#|awk -F\; '{print $1}'|grep "${CFILTER}"`
do
  echo "  ${CLUSTER} ..."
  
  SSHCMD ${CLUSTER} 'set -unit GB -showseparator ";" ; aggr show -field cluster,node,size,usedsize,physical-used,availsize,percent-used,data-compaction-space-saved,data-compacted-count,sis-space-saved,sis-shared-count,availsize'|grep ${PREFIX}|while read LINE
  do
# Aggregate(1);Node(2);Node(3);Available Size(4);Cluster(5);Used Percentage(6);Size(7);Used Size(8);Total Physical Used Size(9);Space Saved by Data Compaction(10);Amount of compacted data(11);Space Saved by Storage Efficiency(12);Amount of Shared bytes count by Storage Efficiency(13);
#Aggregate;Node;Node;Available Size;Cluster;Used Percentage;Size;Used Size;Total Physical Used Size;Space Saved by Data Compaction;Amount of compacted data;Space Saved by Storage Efficiency;Amount of Shared bytes count by Storage Efficiency;

    AGGRNAME=`echo ${LINE}|awk -F\; '{print $1}'`
    NODE=`echo ${LINE}|awk -F\; '{print $2}'`
    AVAIL_SIZE=`echo ${LINE}|awk -F\; '{print $4}'|sed 's/GB//g'`
    C_NAME=`echo ${LINE}|awk -F\; '{print $5}'`
    USED_PERC=`echo ${LINE}|awk -F\; '{print $6}'|sed 's/\%//g'`
    SIZE=`echo ${LINE}|awk -F\; '{print $7}'|sed 's/GB//g'`
    USED_SIZE=`echo ${LINE}|awk -F\; '{print $8}'|sed 's/GB//g'`
    TOTAL_PHYS_USED=`echo ${LINE}|awk -F\; '{print $9}'|sed 's/GB//g'`

    SAVEDCOMPACT=`echo ${LINE}|awk -F\; '{print $10}'|sed 's/GB//g'`
    COMPACTDATA=`echo ${LINE}|awk -F\; '{print $11}'|sed 's/GB//g'`
    SISSAVED=`echo ${LINE}|awk -F\; '{print $12}'|sed 's/GB//g'`
    SHAREDSIS=`echo ${LINE}|awk -F\; '{print $13}'|sed 's/GB//g'`

#    echo "${CLUSTER};${NODE};${AGGRNAME};${SIZE};${ASIZE};${USIZE};${UPERC};${TOTALPUSED};${SAVEDCOMPACT};${COMPACTDATA}:${SISSAVED};${SHAREDSIS};"|tee -a ${TMP}
    echo "${CLUSTER};${NODE};${AGGRNAME};${SIZE};${AVAIL_SIZE};${USED_SIZE};${USED_PERC};${TOTAL_PHYS_USED};"|tee -a ${TMP}


    SSHCMD ${CLUSTER} "set -unit GB -showseparator \";\" ; volume show -aggregate ${AGGRNAME} -field vserver,volume,total,logical-used,percent-used,used,avail,sis-space-saved,space-guarantee,max,min,autosize-mode,autosize-grow-threshold-percent,autosize-shrink-threshold-percent,type"|grep ${PREFIX}|while read LINE2
    do
#vserver(1);volume(2);available(3);total(4);used(5);percent-used(6);max-autosize(7);min-autosize(8);autosize-grow-threshold-percent(9);autosize-shrink-threshold-percent(10);autosize-mode(11);space-guarantee(12);Volume Type(13);sis-space-saved(14);logical-used(15);


      SVM=`echo ${LINE2}|awk -F\; '{print $1}'`
      VOLNAME=`echo ${LINE2}|awk -F\; '{print $2}'`
      VOLTOTAL=`echo ${LINE2}|awk -F\; '{print $4}'|sed 's/GB//g'`
      VOLUSED=`echo ${LINE2}|awk -F\; '{print $5}'|sed 's/GB//g'`
      VOLPUSED=`echo ${LINE2}|awk -F\; '{print $6}'|sed 's/\%//g'`

      ASIZE_MAX=`echo ${LINE2}|awk -F\; '{print $7}'|sed 's/GB//g'`
      ASIZE_MIN=`echo ${LINE2}|awk -F\; '{print $8}'|sed 's/GB//g'`
      ASIZE_GROW_P=`echo ${LINE2}|awk -F\; '{print $9}'|sed 's/\%//g'`
      ASIZE_SHRINK_P=`echo ${LINE2}|awk -F\; '{print $10}'|sed 's/\%//g'`
      ASIZE_MODE=`echo ${LINE2}|awk -F\; '{print $11}'`

      SPACE_GAR_STYLE=`echo ${LINE2}|awk -F\; '{print $12}'`
      VOL_TYPE=`echo ${LINE2}|awk -F\; '{print $13}'`

      SPACE_SAVE_EFF=`echo ${LINE2}|awk -F\; '{print $14}'|sed 's/GB//g'`
      LOG_USED_SIZE=`echo ${LINE2}|awk -F\; '{print $15}'|sed 's/GB//g'`

      echo ";;;;;;;;${SVM};${VOLNAME};${VOL_TYPE};${VOLTOTAL};${VOLUSED};${VOLPUSED};${ASIZE_MAX};${ASIZE_MIN};${ASIZE_GROW_P};${ASIZE_SHRINK_P};${ASIZE_MODE};${SPACE_GAR_STYLE};${SPACE_SAVE_EFF};${LOG_USED_SIZE};"|tee -a ${TMP}

#echo "# Cluster;Node;Aggregate;Size;Available Size;Used Size;Total Physical Used Size;Used Percentage;Hybrid;Number Of Volumes;SVM;Vol.name;Vol.size;Total User-Visible Size;Vol.Used Size;Space Saved by Storage Efficiency;Space Saved by Deduplication;Space Saved by Compression;Volume Size Used by Snapshot Copies; "|tee -a ${TMP}

    done  # volume show
  done  # show aggr
done  # CLUSTER


 
if [ ${MAIL} ]; then
  echo "#" >> ${TMP}
  echo "# Produced by ${PGM} v${VER} @${HOSTNAME} at `date`" >> ${TMP}
  cp ${TMP} /tmp/${CSV}
  cat ${TMP}.mail | mailx -a /tmp/${CSV} -s "@${HOSTNAME}: FSOD cDOT Aggr-Volume report ${DATE} [${PGM} v${VER}]" ${MAILTO}
  echo "  Mailed ${CSV} to ${MAILTO}"|tee -a ${LOG}

  rm /tmp/${CSV}
fi  # MAIL


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

