
#!/bin/sh
# File	: cdot_make_aggr-vol-qtree-lun_report.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),230112	: Mod. TLe
#(0.5),230112	: Added Qtree & LUNs
PGM="`basename $0|cut -d\. -f1`"
VER="0.5"
TMP="/tmp/${PGM}.$$"
HOSTNAME="`hostname|cut -d\. -f1`"
LOG="${HOME}/log/${PGM}.log"
SSH="/usr/bin/ssh -n"
MAIL=""
MAILTO="maarten.deboer@atos.net"
FILTER="[?]*"
DATE="`date +%Y-%m-%d`"
DATI="`date +%Y-%m-%d' '%H:%M`"
CLUSTERS="${HOME}/etc/clusters"
PREFIX="tle"
CSV=""
ERR="${HOME}/log/${PGM}.err"
TMPERR="/tmp/${PGM}.$$.err"

USAGE()
{
  echo "Usage: ${PGM} [options]"
  echo "  Version: ${VER}"
  echo "  options          :"
  echo "    -e             : Etc/clusters file (${CLUSTERS})"
  echo "    -f             : Filter filername (${FILTER})"
  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"
}

# Check options
while [ ${#} -gt 0 ]
  do
  case ${1} in
    -e) CLUSTERS=${2}; shift ;;
    -f) FILTER=${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}-02 "${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}-04 "${2}" 2> ${TMPERR}
        EC=${?}
        grep 'Connection refused' ${TMPERR}
        EC2=${?}
        if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
          echo "  EC=${EC} EC2=${EC2} ${1}-03 ${2} " >> ${ERR}
          echo "  EC=${EC} sleep 2 ..."
          sleep 2
          /usr/bin/ssh -n ${1}-06 "${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}"
echo "CSV=${CSV}"
echo "DATE=${DATE}"
echo "FILE=${FILE}"
echo "FILTER=${FILTER}"
echo "HOSTNAME=${HOSTNAME}"
echo "LOG=${LOG}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "PGM=${PGM}"
echo "PREFIX=${PREFIX}"
echo "TMP=${TMP}"
echo "VER=${VER}"

      echo -n "CLUSTER;NODE;AGGRNAME;SIZE;ASIZE;USIZE;UPERC;TOTALPUSED;SAVEDCOMPACT;COMPACTDATA:SISSAVED;SHAREDSIS;HYBRID;"|tee -a ${TMP}

      echo -n "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 -n "Qtree Name;Security Style;Export Policy;"|tee -a ${TMP}

      echo "Qtree Name;LUN Name;LUN Size;OS Type;Space Reservation;State;Mapped;Used Size;Maximum Resize Size;"|tee -a ${TMP}


for CLUSTER in `cat ${CLUSTERS}|grep -v \^#|awk -F\; '{print $1}'|grep "${FILTER}"`
do
  echo "  ${CLUSTER} ..."

# Aggr  
  SSHCMD ${CLUSTER} 'set -unit GB -showseparator ";" ; aggr show -field cluster,node,size,usedsize,physical-used,availsize,hybrid,percent-used,data-compaction-space-saved,data-compacted-count,sis-space-saved,sis-shared-count '|grep ${PREFIX}|while read LINE
  do

# Aggregate;Node;Node;Available Size;Cluster;Hybrid;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}'|sed 's/GB//g'`"
    NODE="`echo ${LINE}|awk -F\; '{print $2}'|sed 's/GB//g'`"
    ASIZE="`echo ${LINE}|awk -F\; '{print $4}'|sed 's/GB//g'`"
    CNAME="`echo ${LINE}|awk -F\; '{print $5}'|sed 's/GB//g'`"
    HYBRID="`echo ${LINE}|awk -F\; '{print $6}'|sed 's/GB//g'`"
    UPERC="`echo ${LINE}|awk -F\; '{print $7}'|sed 's/GB//g'`"
    SIZE="`echo ${LINE}|awk -F\; '{print $8}'|sed 's/GB//g'`"
    USIZE="`echo ${LINE}|awk -F\; '{print $9}'|sed 's/GB//g'`"
    TOTALPUSED="`echo ${LINE}|awk -F\; '{print $10}'|sed 's/GB//g'`"
    SAVEDCOMPACT="`echo ${LINE}|awk -F\; '{print $11}'|sed 's/GB//g'`"
    COMPACTDATA="`echo ${LINE}|awk -F\; '{print $12}'|sed 's/GB//g'`"
    SISSAVED="`echo ${LINE}|awk -F\; '{print $13}'|sed 's/GB//g'`"
    SHAREDSIS="`echo ${LINE}|awk -F\; '{print $14}'|sed 's/GB//g'`"

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


# Volume
    SSHCMD ${CLUSTER} "set -unit GB -showseparator \";\" ; volume show -aggregate ${AGGRNAME} -field vserver,node,volume,total,logical-used,is-space-reporting-logical, logical-available,is-space-enforce,percent-used,logical-used-percent, used,avail,sis-space-saved,space-guarantee"|grep ${PREFIX}|while read LINE2
    do
#Vserver Name;Volume Name;Available Size;Total User-Visible Size;Used Size;Used Percentage;Space Guarantee Style;Node name;Space Saved by Storage Efficiency;Logical Used Size;Logical Used Percentage;Logical Available Size;Logical Space Reporting;Logical Space Enforcement;

      SVM="`echo ${LINE2}|awk -F\; '{print $1}'`"
      VOLNAME="`echo ${LINE2}|awk -F\; '{print $2}'`"
      AVAILSIZE="`echo ${LINE2}|awk -F\; '{print $3}'|sed 's/GB//g'`"
      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'`"
      VOLSPGAR="`echo ${LINE2}|awk -F\; '{print $7}'|sed 's/GB//g'`"
      NODENAME="`echo ${LINE2}|awk -F\; '{print $8}'|sed 's/GB//g'`"
      VOLSISSAVE="`echo ${LINE2}|awk -F\; '{print $9}'|sed 's/GB//g'`"
      VOLLOGUSED="`echo ${LINE2}|awk -F\; '{print $10}'|sed 's/GB//g'`"
      VOLLOGPUSED="`echo ${LINE2}|awk -F\; '{print $11}'|sed 's/\%//g'`"
      VOLLOGAVAIL="`echo ${LINE2}|awk -F\; '{print $12}'|sed 's/GB//g'`"
      ISSPCREPLOG="`echo ${LINE2}|awk -F\; '{print $13}'|sed 's/GB//g'`"
      ISSPCENFLOG="`echo ${LINE2}|awk -F\; '{print $14}'|sed 's/GB//g'`"
      echo "${CLUSTER};${NODE};${AGGRNAME} ;;;;;;;;;;${SVM};${VOLNAME};${VOLTOTAL};${VOLUSED};${VOLSPGAR};${VOLSISSAVE};${VOLLOGUSED};${VOLLOGAVAIL};${ISSPCREPLOG};${ISSPCENFLOG};"|tee -a ${TMP}

# Qtree
      SSHCMD ${CLUSTER} "set -unit GB -showseparator \";\" ; qtree show -volume ${VOLNAME} -field volume,qtree,security-style,export-policy"|grep ${PREFIX}|while read LINE3
      do
# vserver;volume;qtree;security-style;export-policy;
        QTREE="`echo ${LINE3}|awk -F\; '{print $3}'`"
        SECU_STYLE="`echo ${LINE3}|awk -F\; '{print $4}'`"
        EXP_POL="`echo ${LINE3}|awk -F\; '{print $5}'`"
        if [ "${QTREE}" != "\"\"" ]; then
          echo "${CLUSTER};${NODE};;;;;;;;;;;${SVM};${VOLNAME};;;;;;;;;${QTREE};${SECU_STYLE};${EXP_POL};"|tee -a ${TMP}
        fi

# LUN
        SSHCMD ${CLUSTER} "set -unit GB -showseparator \";\" ; lun show -vserver ${SVM} -volume ${VOLNAME} -field qtree,lun,size,ostype,space-reserve,state,mapped,size-used,max-resize-size"|grep ${PREFIX}|while read LINE4
        do
# Vserver Name;LUN Path;Qtree Name;LUN Name;LUN Size;OS Type;Space Reservation;State;Mapped;Used Size;Maximum Resize Size;
          L_QTREE="`echo ${LINE4}|awk -F\; '{print $3}'`"
          LUN="`echo ${LINE4}|awk -F\; '{print $4}'`"
          L_SIZE="`echo ${LINE4}|awk -F\; '{print $5}'`"
          OS_TYPE="`echo ${LINE4}|awk -F\; '{print $6}'`"
          SPACE_RSV="`echo ${LINE4}|awk -F\; '{print $7}'`"
          STATE="`echo ${LINE4}|awk -F\; '{print $8}'`"
          MAPPED="`echo ${LINE4}|awk -F\; '{print $9}'`"
          SIZE_USED="`echo ${LINE4}|awk -F\; '{print $10}'`"
          MAX_RESIZE="`echo ${LINE4}|awk -F\; '{print $11}'`"

          echo "${CLUSTER};${NODE};;;;;;;;;;;${SVM};${VOLNAME};;;;;;;;;${QTREE};;;${L_QTREE};${LUN};${L_SIZE};${OS_TYPE};${SPACE_RSV};${STATE};${MAPPED};${SIZE_USED};${MAX_RESIZE};"|tee -a ${TMP}


        done  # LINE4
     
      done  # LINE3

    done  # volume show

  done  # show aggr

done  # CLUSTER


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


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

