
#!/bin/sh
# File	: cdot_efficiency_start.sh
# By	: Maarten.deBoer@atos.net, 211104
# Subject	: Script to start Efficiency at NetApp
#(0.2),211109	: START_EFF, SHOW_STATUS
#(0.3),211109	: Added MAIL & MAILTO
#(0.4),211110,MdB	: Added 'df -g', moved read RCFILE, rm TMP.asc
#(0.5),211110,MdB	: Renamed
#(0.6),211111,MdB	: Added .vlst
#(0.7),211111,MdB	: Added .eff (started eff. So, not done a next time)
#
# Run background scanner to compress existing data in the volumes (Advanced mode command)
#
#:>priv set advanced
#
#::>volume efficiency start -vserver $SVM_NAME -volume $VOL_NAME -scan-old-data true - compression true –dedupe true
#
#This will compress non-shared data in active filesystem. To compress shared blocks in active filesystem as well as blocks locked in snapshots, use the below command.
#Note: Uncompressed blocks trapped in the snapshots are locked and cannot be changed. So, compressed snapshot blocks will consume additional space in the filesystem. Space savings from the locked blocks will be realized once the snapshots are deleted/expired. 
#
#::>volume efficiency start -vserver $SVM_NAME -volume $VOL_NAME -scan-old-data true - compression true -snapshot-blocks true -shared-blocks true –dedupe true
#
#Best Practice: It is not recommended to take any snapshots while the background scanner is running. If snapshots are taken while the background scanner is running, data trapped in snapshots will remain uncompressed (even after the snapshots are deleted/expired).
#
PGM="`basename $0|cut -d\. -f1`"
VER="0.7"
TMP="/tmp/${PGM}.$$.asc"
LOG="${HOME}/log/${PGM}.log"
RCFILE="${HOME}/etc/${PGM}.rc"
DATADIR="${HOME}/data/${PGM}"
SSH="/usr/bin/ssh -n"
HOSTNAME="`hostname|cut -d\. -f1`"
CLUSTERS="${HOME}/etc/clusters"
CFILTER="[?]*"
SFILTER="[?]*"
VFILTER="[?]*"
#VFILTER="nl"
START_EFF=""
SHOW_STATUS=""
MAILTO="maarten.deboer@atos.net"
MAIL=""
VLSTFILE="${HOME}/etc/${PGM}.vlst"
TMPLST="/tmp/${PGM}.$$.lst"
EFF="${HOME}/data/${PGM}.eff"
# In $HOME/data/ because this file is mod. by script. 
# In $HOME}/etc/ would be for config (outside script)


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
{
  TMPERR="/tmp/${PGM}.$$.err"
  /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
    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
      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
        sleep 2
        /usr/bin/ssh -n ${1}-03 "${2}" 2> ${TMPERR}
        EC=${?}
        grep 'Connection refused' ${TMPERR}
        EC2=${?}
        if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
          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} sleep 2 ..."
            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} sleep 2 ..."
              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  "`date` ${PGM} ERROR with communication to ${1}. Connection to -01 - -06 failed too."|tee -a ${LOG} 
              fi  # EC=0 & EC2=0

            fi  # -06
          fi  # -05
        fi  # -04
      fi  # -03
    fi  # -02
  fi  # -01
  rm ${TMPERR}
}

USAGE()
{
  echo "Usage: ${PGM} [options]"
  echo "  Version: ${VER}"
  echo "  options          :"
  echo "    -e | --eff     : start Efficiency"
  echo "    -c | --cluster : Cluster filter (${CFILTER})"
  echo "    -s | --svm     : Svm filter (${SFILTER})"
  echo "    -v | --vol     : Volume filter (${VFILTER})"
  echo "    -h | --help    : this help"
  echo "    -m | --mail    : send Mail"
  echo "    --mailto       : set new MAILTO (${MAILTO})"
  echo "    -V             : Version"
  echo "    -x             : set -x"
}
# Read RC-file 1st, and then options
if [ -f ${RCFILE} ]; then
  echo "  Reading RCFILE (${RCFILE}) ..."|tee -a ${LOG}
  . ${RCFILE}
fi
# Check options
while [ ${#} -gt 0 ]
  do
  case ${1} in
    -e | --eff) START_EFF=1 ;;
    -c | --cluster) CFILTER=${2}; shift ;;
    -s | --svm) SFILTER=${2}; shift ;;
    -v | --vol) VFILTER=${2}; shift ;;
    -m | mail) MAIL=1 ;;
    --mailto) MAILTO=${2}; MAIL=1; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -V) echo "${PGM}: v${VER}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done

# MAIN
echo "`date` ${PGM} v${VER} started."|tee -a ${LOG}
if [ ! -d ${DATADIR} ]; then
  echo "  NO DATADIR (${DATADIR}) found. Creating dir..."|tee -a ${LOG}
  mkdir -p ${DATADIR}
fi

echo "  CLUSTERS=${CLUSTERS}"| tee -a ${LOG}
echo "  DATADIR=${DATADIR}"| tee -a ${LOG}
echo "  CFILTER=${CFILTER}"| tee -a ${LOG}
echo "  SFILTER=${SFILTER}"| tee -a ${LOG}
echo "  VFILTER=${VFILTER}"| tee -a ${LOG}
echo "  LOG=${LOG}"| tee -a ${LOG}
echo "  VLSTFILE=${VLSTFILE}"| tee -a ${LOG}
echo "  MAILTO=${MAILTO}"| tee -a ${LOG}
echo "  MAIL=${MAIL}"| tee -a ${LOG}
echo "  START_EFF=${START_EFF}"| tee -a ${LOG}
sleep 1
touch ${TMP} ${EFF}

# When -f ${VLSTFILE} then use this for TMPLST
# If not, then create "empty"-LST
if [ -f ${VLSTFILE} ]; then
  cp ${VLSTFILE} ${TMPLST}
else
  touch ${TMPLST}
fi

for CLUSTER in `cat ${CLUSTERS}|grep -v ^#|grep "${CFILTER}"`
do
#  echo "${CLUSTER} ..."

  SSHCMD ${CLUSTER} 'vserver show -operational-state running -field vserver,operational-state'|grep running|grep "${SFILTER}"|while read VSERVER REST
  do
    echo "  ${CLUSTER}/${VSERVER} ..."

# Volume
    SSHCMD ${CLUSTER} "set -showseparator \";\" ;volume show -vserver ${VSERVER} -field volume"|grep ${VSERVER}|grep -f ${TMPLST}|grep ${VFILTER}|awk -F\; '{print $2}'|sort|while read VOLUME REST
    do
      echo "    ${CLUSTER}/${VSERVER}:${VOLUME} ..."

# Check if VOLUME is in EFF(FILE). Then has been started already. Not to be done again (ANSW <> "")
      ANSW=`echo ${VOLUME}|grep -f ${EFF}`
      if [ ${START_EFF} ] && [ "${ANSW}" = "" ]; then
        echo "    Saving volume (${CLUSTER}/${VSERVER}:${VOLUME}) info in ${DATADIR}/${PGM} "|tee -a ${LOG}
        echo "===== `date +%Y-%m-%d-%H-%M-%S` =====" >> ${DATADIR}/${CLUSTER}.${VSERVER}.${VOLUME}.instance
        echo "::> volume show -vserver ${VSERVER} -volume ${VOLUME} -instance :" >> ${DATADIR}/${CLUSTER}.${VSERVER}.${VOLUME}.instance
        SSHCMD ${CLUSTER} "volume show -vserver ${VSERVER} -volume ${VOLUME} -instance" >> ${DATADIR}/${CLUSTER}.${VSERVER}.${VOLUME}.instance

        echo "::> volume efficiency show -vserver ${VSERVER} -volume ${VOLUME} -instance :" >> ${DATADIR}/${CLUSTER}.${VSERVER}.${VOLUME}.instance
        SSHCMD ${CLUSTER} "volume efficiency show -vserver ${VSERVER} -volume ${VOLUME} -instance" >> ${DATADIR}/${CLUSTER}.${VSERVER}.${VOLUME}.instance

        echo "::> volume efficiency stat -vserver ${VSERVER} -volume ${VOLUME} -instance :" >> ${DATADIR}/${CLUSTER}.${VSERVER}.${VOLUME}.instance
        SSHCMD ${CLUSTER} "volume efficiency stat -vserver ${VSERVER} -volume ${VOLUME} -instance" >> ${DATADIR}/${CLUSTER}.${VSERVER}.${VOLUME}.instance

        SSHCMD ${CLUSTER} "set -privilege advanced; volume efficiency start -vserver ${VSERVER} -volume ${VOLUME} -scan-old-data true -compression true -snapshot-blocks true -shared-blocks true"
        echo "${VOLUME}" >> ${EFF}
      fi  # START_EFF

# Also when no option
      echo "===========================================================" >> ${TMP}
      echo "::> volume efficiency show -vserver ${VSERVER} -volume ${VOLUME} -field state,progress " 
      SSHCMD ${CLUSTER} "volume efficiency show -vserver ${VSERVER} -volume ${VOLUME} -field state,progress " | tee -a ${LOG} ${TMP}
      echo "-----------------------------------------------------------" >> ${TMP}
      SSHCMD ${CLUSTER} "volume show -vserver ${VSERVER} -volume ${VOLUME} -field vserver,aggregate,volume " | tee -a ${LOG} ${TMP}
      SSHCMD ${CLUSTER} "df -g ${VOLUME}" | tee -a ${LOG} ${TMP}
      SSHCMD ${CLUSTER} "snap show -vserver ${VSERVER} -volume ${VOLUME}" | tee -a ${LOG} ${TMP}
    done  # VOLUME

  done  # VSERVER
done  # for CLUSTER

if [ ${MAIL} ] && [ "${MAILTO}" != "" ] && [ -s ${TMP} ]; then
#  cat ${TMP}| while read LINE
#  do
#    echo "${LINE}" >> ${TMP}.asc
#  done
  echo "See attached (ASCII-)file for more efficiency status info (`date`)"| mailx -a ${TMP} -s "Storage efficiency status [${PGM} v${VER}]" ${MAILTO}
  echo "  Mail send to ${MAILTO}"|tee -a ${LOG}
#  rm ${TMP}.asc
fi  # MAIL


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

