
#!/bin/sh
# File	: cdot_make_qtree_rpt.sh
# By	: Maarten.deBoer@Atos.net, 160531
# Subject	: Script to make Qtree report at cDOT
#(2.0)	: 1.x was made by Martijn Boele. But did not work anymore. Therefore Maarten de Boer made new one.
#(2.1)	: Added SSHCMD
#(2.2)	: Added export policy (NFS)
#(2.3)	: Added ERRlog, export-policy is noet at volume, but at Qtree level
#(2.4)	: Added -s (share info)
#(2.5),160720	: SIS added, VER added in  CSV-name. 
#(2.6),170321	: Add "quota-type tree"
#(2.7),220921	: Added DISCLAIMER, Mod. SSHCMD
#(2.7),230302	: Added SnapLock reporting
PGM="`basename $0|cut -d\. -f1`"
VER="2v8"
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="nlnafs"
CUSTCODE=""
CUSTOMER=""
CSV=""
ERR="${HOME}/log/${PGM}.err"
TMPERR="/tmp/${PGM}.$$.err"
SHAREINFO=""
DISCLAIMER="${HOME}/etc/${PGM}.disclaimer"
SL_INFO=""

USAGE()
{
  echo "Usage: ${PGM} [options]"
  echo "  Version: ${VER}"
  echo "  options           :"
  echo "    -c              : Customer code (3 lower-case letters)"
  echo "    -e              : Etc/clusters file (${CLUSTERS})"
  echo "    -f              : Filter filername (${FILTER})"
  echo "    -h | --help     : this help"
  echo "    -m | --mail     : do send Mail (only)"
  echo "    -s | --shares   : with Shares info"
  echo "    -S | --snaplock : with Snaplock info"
  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
    -c) CUSTCODE=${2}; shift ;;
    -e) CLUSTERS=${2}; shift ;;
    -f) FILTER=${2}; shift ;;
    -s | --shares) SHAREINFO=1 ;;
    -S | --snaplock) SL_INFO=1 ;;
    -m | --mail) MAIL=1 ;;
    -h | --help) USAGE; exit 1 ;;
    --mailto) MAILTO=${2}; MAIL=1; shift ;;
    -V) echo "${PGM}: ${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}-05 "${2}" 2> ${TMPERR}
    EC=${?}
    grep 'Connection refused' ${TMPERR}
    EC2=${?}
    if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
      echo "  EC=${EC} EC2=${EC2} ${1}-05 ${2} " >> ${ERR}
      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}-06 ${2} " >> ${ERR}
        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}-06 ${2} " >> ${ERR}
          echo "  EC=${EC} sleep 2 ..."
          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}-08 ${2} " >> ${ERR}
            echo  "`date` ${PGM} ERROR with communication to ${1}. Connection to -05 - -08 failed too."|tee -a ${LOG} ${ERR}
          fi
        fi
      fi
    fi
  fi
}

if [ -z "${CUSTCODE}" ]
then
  echo "`date` ${PGM}: ERROR; No (part of) customer code given. So not to know what to do. Exiting..."|tee -a ${LOG} ${ERR} ; echo; USAGE;
  exit 1
fi

CUSTOMER=`echo "${CUSTCODE}"|tr [:lower:] [:upper:]`
CSV="FSOD-cDOT_Qtree_report_${VER}_${CUSTOMER}_${DATE}.csv"
if [ "${FILTER}" != '[?]*' ]; then
  CSV="FSOD-cDOT_Qtree_report_${VER}_${CUSTOMER}-${FILTER}_${DATE}.csv"
fi

DISKUSED=""
DISKLIMIT=""

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

echo "`date` ${PGM} ${VER} started. (-c ${CUSTCODE} --mailto ${MAILTO} )"|tee -a ${LOG} ${ERR} ${TMP}.mail
echo "" >> ${TMP}.mail
if [ -f ${DISCLAIMER} ]; then
  cat ${DISCLAIMER} >> ${TMP}.mail
fi  # DISCLAIMER
echo "" >> ${TMP}.mail
echo "" >> ${TMP}.mail
echo "" >> ${TMP}.mail
echo "CLUSTERS=${CLUSTERS}" |tee -a ${TMP}.mail
echo "CSV=${CSV}" |tee -a ${TMP}.mail
echo "CUSTCODE=${CUSTCODE}" |tee -a ${TMP}.mail
echo "CUSTOMER=${CUSTOMER}" |tee -a ${TMP}.mail
echo "DATE=${DATE}" |tee -a ${TMP}.mail
echo "DISCLAIMER=${DISCLAIMER}" |tee -a ${TMP}.mail
echo "FILE=${FILE}" |tee -a ${TMP}.mail
echo "FILTER=${FILTER}" |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 "SHAREINFO=${SHAREINFO}" |tee -a ${TMP}.mail
echo "SL_INFO=${SL_INFO}" |tee -a ${TMP}.mail
echo "TMP=${TMP}" |tee -a ${TMP}.mail
echo "VER=${VER}" |tee -a ${TMP}.mail

if [ ${SL_INFO} ]; then
  echo "# Cluster;SVM;Volume;Vol Size [KB];Vol Used [KB];SnapShot Used [KB];Used [%];SIS Space Saved [KB];Qtree Name;Qtree Style+Status;Qtree Used [KB];Qtree Quota [KB];(Qtree Used [%]);CIFS Share;Policy;SnapLock Type;Minimum Retention Period;Default Retention Period;Maximum Retention Period;Autocommit Period;Expiry Time;" > ${TMP}
else
  echo "# Cluster;SVM;Volume;Vol Size [KB];Vol Used [KB];SnapShot Used [KB];Used [%];SIS Space Saved [KB];Qtree Name;Qtree Style+Status;Qtree Used [KB];Qtree Quota [KB];(Qtree Used [%]);CIFS Share;Policy;" > ${TMP}
fi  # SL_INFO

for CLUSTER in `cat ${CLUSTERS}|grep -v \^#|awk -F\; '{print $1}'|grep "${FILTER}"`
do
  echo "  ${CLUSTER} ..."
  
  for SVM in `SSHCMD ${CLUSTER} 'vserver show -field vserver'|grep ${PREFIX}|grep ${CUSTCODE}|awk '{print $1}'|sort`
  do
    echo "  ${CLUSTER}/${SVM} ..."
    SSHCMD ${CLUSTER} "qtree show -vserver ${SVM} -field vserver,volume,qtree,security-style,status"|grep ${PREFIX}|while read LINE
    do
#      echo ${LINE}

      VOLUME="`echo ${LINE}|awk '{print $2}'`"
      QTREE="`echo ${LINE}|awk '{print $3}'`"
      SECUSTYLE="`echo ${LINE}|awk '{print $4}'`"
      STATUS="`echo ${LINE}|awk '{print $5}'`"

      VOL_SHOW=`SSHCMD ${CLUSTER} "set -showseparator \";\" -units KB ; volume show -vserver ${SVM} -volume ${VOLUME} -field size,used,size-used-by-snapshots,percent-used,sis-space-saved,snaplock-type "|grep ${SVM}|sed 's/KB//g'`
# vserver;volume;size;used;percent-used;sis-space-saved;size-used-by-snapshots;snaplock-type
#echo "VOL_SHOW=${VOL_SHOW}"
      
#      VOLSIZE="`SSHCMD ${CLUSTER} \"set -units KB ; volume show -vserver ${SVM} -volume ${VOLUME} -field size\"|grep ${PREFIX}|awk '{print $3}'|sed 's/KB//g'`"
      VOLSIZE=`echo ${VOL_SHOW}|awk -F\; '{print $3}'`
#      VOLUSED="`SSHCMD ${CLUSTER} \"set -units KB ; volume show -vserver ${SVM} -volume ${VOLUME} -field used\"|grep ${PREFIX}|awk '{print $3}'|sed 's/KB//g'`"
      VOLUSED=`echo ${VOL_SHOW}|awk -F\; '{print $4}'`
#      SSUSED="`SSHCMD ${CLUSTER} \"set -units KB ; volume show -vserver ${SVM} -volume ${VOLUME} -field size-used-by-snapshots\"|grep ${PREFIX}|awk '{print $3}'|sed 's/KB//g'`"
      SSUSED=`echo ${VOL_SHOW}|awk -F\; '{print $7}'`
#      PERCUSED="`SSHCMD ${CLUSTER} \"volume show -vserver ${SVM} -volume ${VOLUME} -field percent-used\"|grep ${PREFIX}|awk '{print $3}'`"
      PERCUSED=`echo ${VOL_SHOW}|awk -F\; '{print $5}'`
#      SISSAVE="`SSHCMD ${CLUSTER} \"set -units KB ; volume show -vserver ${SVM} -volume ${VOLUME} -field  sis-space-saved\"|grep ${PREFIX}|awk '{print $3}'|sed 's/KB//g'`"
      SISSAVE=`echo ${VOL_SHOW}|awk -F\; '{print $6}'`
#      SL_TYPE=`echo ${VOL_SHOW}|awk -F\; '{print $8}'`

# If Qtree is filled with "", empty it
      if [ "${QTREE}" = "\"\"" ]; then
        QTREE=""
      fi  # QTREE


      if [ "${QTREE}" != "" ]; then
        DISKUSED="`SSHCMD ${CLUSTER} "set -units KB ; quota report -vserver ${SVM} -volume ${VOLUME} -quota-type tree -tree ${QTREE} -field vserver,volume,tree,disk-used"|grep ${PREFIX}|awk '{print $5}'|sed 's/KB//g'`"
        DISKLIMIT="`SSHCMD ${CLUSTER} "set -units KB ; quota report -vserver ${SVM} -volume ${VOLUME} -quota-type tree -tree ${QTREE} -field vserver,volume,tree,disk-limit"|grep ${PREFIX}|awk '{print $5}'|sed 's/KB//g'`"

        CIFSSHARE=""
        if [ ${SHAREINFO} ]; then
          CIFSSHARE="`SSHCMD ${CLUSTER} \"vserver cifs share show -vserver ${SVM} -field path,share-name\"|grep \"${VOLUME}/${QTREE}\"|awk '{print $2}'|head -1`"
        fi

        EXPPOLICY="`SSHCMD ${CLUSTER} "qtree show -vserver ${SVM} -volume ${VOLUME} -qtree ${QTREE} -field export-policy"|grep ${PREFIX}|awk '{print $4}'`"

        if [ ${SL_INFO} ]; then
          SL_SHOW=`SSHCMD ${CLUSTER} "set -showseparator \";\" ; volume snaplock show -vserver ${SVM} -volume ${VOLUME} -field vserver,volume,type,minimum-retention-period,maximum-retention-period,autocommit-period,expiry-time,default-retention-period"|grep ${SVM}`
          SL_LINE=`echo ${SL_SHOW}|cut -d\; -f4-`
        fi  # SL_INFO

        echo "${CLUSTER};${SVM};${VOLUME};${VOLSIZE};${VOLUSED};${SSUSED};${PERCUSED};${SISSAVE};${QTREE};${SECUSTYLE} ${STATUS};${DISKUSED};${DISKLIMIT};${QUOTAPCT};${CIFSSHARE};${EXPPOLICY};${SL_LINE};"|tee -a ${TMP}

      fi  # QTREE

    done  # qtree show
  done  # SVM
done  # CLUSTER


 
if [ ${MAIL} ]; then
  echo "#" >> ${TMP}
  echo "# Produced by ${PGM} ${VER} @${HOSTNAME} at ${DATI}" >> ${TMP}
  if [ ${SHAREINFO} ]; then
    echo "# When with share info (option -s | --shares), only the FIRST one is reported." >> ${TMP}
  else  # SHAREINFO
    echo "# No share info added. Use option -s | --shares (But only the FIRST one is reported)." >> ${TMP}
  fi  # SHAREINFO
  if [ ${SL_INFO} ]; then
    echo "# Snaplock information (-S | --snaplock) is added at the end of the line." >> ${TMP}
  fi
  cp ${TMP} /tmp/${CSV}
  cat ${TMP}.mail | mailx -a /tmp/${CSV} -s "@${HOSTNAME}: FSOD cDOT Qtree report ${CUSTOMER} ${DATE} [${PGM} ${VER}]" ${MAILTO}
  echo "`date`  Mailed ${CSV} to ${MAILTO}"|tee -a ${LOG}
  rm /tmp/${CSV}
fi  # MAIL


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

