
#!/bin/sh
# File	: cdot_snapshot_check.sh
# By	: Maarten.deBoer@Atos.net, 230215
# Subject	: Script to check NetApp SnapShots for
# - old 
# - "wrong" names (SID in Qtree <> SID in name)
# Able to remove "wrong & old" ones
#(0.2),MdB	: Added SFILTER="${1}"
#(0.3),230216	: MOd's for CSV file
#(0.4),230216	: Mod for selecting date-stamp of snapshot-name
#(0.5),230222	: Add USAGE
#(0.6),230313	: Add Compare with SnapMirrors (for "orphaned" Snaps) + MAIL
#(0.7),230530	: ADD HOSTNAME at mailx -subject
#(0.8),240318	: "enable" CFILTER, Add -y
#(0.9),240321	: From cdot_chk_old_snaps.sh	
PGM=`basename $0|cut -d\. -f1`
VER="0.9"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
SSH="/bin/ssh -n"
RCFILE="${HOME}/etc/${PGM}.rc"
# Check Orphaned Snaps (Snaps without previos SnapMirror)
CHK_OS=""
HOSTNAME=`hostname | cut -d\. -f1`

CSV="/tmp/${PGM}_`date +%Y%m%d-%H%M%S`.csv"
CLUSTERS="${HOME}/etc/clusters"
CFILTER="[?]*"
#CFILTER="nlnaf101"
SFILTER="[?]*"
VFILTER="[?]*"
#SSFILTER="_20"
SSFILTER="_vol"
MAILTO="maarten.deboer@atos.net"
MAIL=""
CHK_SNAP_SID_QTREE=""

DATE_OLDER=`date --date="-90days" +%Y%m%d%H%M%S`
#DATE_OLDER=`date --date="-30days" +%Y%m%d%H%M%S`
#DATE_OLDER=`date --date="-10days" +%Y%m%d%H%M%S`
DATE_OLDER=0


USAGE()
{
  echo "Usage: $PGM [options] "
  echo "  Version: ${VER}"
  echo "  options          :"
  echo "    -c|--cluster   : Cluster filter (${CFILTER})"
  echo "    -s|--svm       : Svm filter (${SFILTER})"
  echo "    -v|--vol       : Volume filter (${VFILTER})"
#
  echo "    -e|--etc       : Etc/cluster-file (${CLUSTERS})"
  echo "    -d|--date      : Date older (${DATE_OLDER}) in days. When 0, then disable check."
  echo "    -ss|--snap     : SnapShot filter (${SSFILTER})"
  echo "    -co|--chk_os   : Check Orphaned snaps"
  echo "    -h|--help      : this help"
  echo "    -m|--mail      : send Mail"
  echo "    -y|--yesterday : date older then Yesterday"
  echo "    -ssq           : Check SNAP_SID_QTREE"
#
  echo "    -V             : Version"
  echo "    -x             : set -x"
  echo "    --mailto       : change MAILTO address & do send mail (${MAILTO})"
}
if [ -f ${RCFILE} ]; then
  echo "  RCFILE (${RCFILE}) found. Using it"
  . ${RCFILE}
fi  # RCFILE
# Check options
while [ $# -gt 0 ]
  do
  case ${1} in
    -d | --date) DATE_OLDER=${2}; shift ;;
    -e | --etc) CLUSTERS=${2}; shift ;;
    -m | --mail) MAIL=1 ;;
    --mailto) MAILTO=$2; MAIL=1; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -c | cluster) CFILTER=${2}; shift ;;
    -s | --svm) SFILTER=${2}; shift ;;
    -ss | --snap) SSFILTER=${2}; shift ;;
    -co | --chk_os) CHK_OS=1 ;;
    -v | --vol) VFILTER=${2}; shift ;;
    -y | --yesterday) DATE_OLDER=`date --date="-1days" +%Y%m%d%H%M%S` ;;
    -ssq ) CHK_SNAP_SID_QTREE=1 ;;
    -V) echo "${PGM}: v${VER}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done


echo "`date` ${PGM} v${VER} started in `hostname`."|tee -a ${LOG} ${TMP}.mail
echo "  CLUSTERS=${CLUSTERS}"| tee -a ${TMP}.mail
echo "  CFILTER=${CFILTER}"| tee -a ${TMP}.mail
echo "  SFILTER=${SFILTER}"| tee -a ${TMP}.mail
echo "  VFILTER=${VFILTER}"| tee -a ${TMP}.mail
echo "  CHK_OS=${CHK_OS}"| tee -a ${TMP}.mail
echo "  SSFILTER=${SSFILTER}"| tee -a ${TMP}.mail
echo "  DATE_OLDER=${DATE_OLDER}"| tee -a ${TMP}.mail
echo "  MAIL=${MAIL}"| tee -a ${TMP}.mail
echo "  MAILTO=${MAILTO}"| tee -a ${TMP}.mail
echo "  CHK_SNAP_SID_QTREE=${CHK_SNAP_SID_QTREE}"| tee -a ${TMP}.mail
sleep 1

echo "# CLUSTER;VSERVER;VOLUME;QTREE (SID);SNAPSHOT;SIZE [GB];SNAP_DATI;SNAP_CREATE_TIME;" > ${TMP}.csv

# Clusters
cat ${CLUSTERS}|grep -v ^#|grep "${CFILTER}"|while read CLUSTER
do
  echo "  CLUSTER=${CLUSTER}"
  ${SSH} ${CLUSTER} "vserver show -field vserver,operational-state"| grep running|grep "${SFILTER}"|awk '{print $1}'|while read VSERVER
  do
    echo "    VSERVER=${VSERVER}"
# Volumes
    ${SSH} ${CLUSTER} "volume show -vserver ${VSERVER} -field volume"|grep "${VFILTER}"|grep ${VSERVER}|grep -v vol0root|awk '{print $2}'|while read VOLUME
    do
#      echo "    CLUSTER=${CLUSTER} VSERVER=${VSERVER} VOLUME=${VOLUME}"

# ----------------------------------------------------------
# Snap-(SID)name <> Qtree-(SID)name
      if [ ${CHK_SNAP_SID_QTREE} ]; then
        echo "    CLUSTER=${CLUSTER} VSERVER=${VSERVER} VOLUME=${VOLUME}"
# Get list of SID from Qtree name (without db2) and only Dev & Qa SIDs
        ${SSH} ${CLUSTER} "set -showseparator \";\" -units GB ; qtree show -vserver ${VSERVER} -volume ${VOLUME} -field qtree" |grep "_"|awk -F\; '{print $3}'|sed 's/\"//g'|sed 's/db2//g1'|rev|cut -d\_ -f1|grep -E '^[dq]{1}'|rev|sort -u|while read LINE_QS
        do
# Select only Dev & Qa SIDs
# And Snaps <> SID (grep -v "${LINE_QS}")
# And no snapmirror snaps
          if [ "${LINE_QS}" != "" ]; then
            echo "      LINE_QS=${LINE_QS}"
            ${SSH} ${CLUSTER} "set -showseparator \";\" -units GB ; snap show -vserver ${VSERVER} -volume ${VOLUME} -field vserver,volume,snapshot,create-time,size"|grep -v "${LINE_QS}"|grep -v snapmirror|grep "GB"|while read LINE_S
            do
              SNAPSHOT=`echo ${LINE_S}|awk -F\; '{print $3}'`
              SNAP_CREATE_TIME=`echo ${LINE_S}|awk -F\; '{print $4}'|sed 's/"//g'`
              SIZE_GB=`echo ${LINE_S}|awk -F\; '{print $5}'|sed 's/GB//g'`
              SNAP_DATI=`date --date="${SNAP_CREATE_TIME}" +%Y%m%d%H%M%S`

              echo "${CLUSTER};${VSERVER};${VOLUME};${LINE_QS};${SNAPSHOT};${SIZE_GB};${SNAP_DATI};${SNAP_CREATE_TIME};"|tee -a ${TMP}.csv

            done  # LINE_S
          fi  # QTREE_SID
        done  # LINE_QS
      fi  # CHK_SNAP_SID_QTREE



# ----------------------------------------------------------
      if [ ${DATE_OLDER} -gt 0 ]; then
# When DATE_OLDER = 0 then disable
# SnapShots
#        ${SSH} ${CLUSTER} "set -showseparator \";\" ; snap show -vserver ${VSERVER} -volume ${VOLUME} -field vserver,volume,snapshot,create-time"|egrep "${SSFILTER}"|sed 's/_/;/g'| while read LINE
        ${SSH} ${CLUSTER} "set -showseparator \";\" -units GB ; snap show -vserver ${VSERVER} -volume ${VOLUME} -field vserver,volume,snapshot,create-time,size"|egrep "${SSFILTER}"|while read LINE
        do
          echo "      VOLUME=${VOLUME}"
#nlnafsctc02;ctc02_vol0root;4hour3.2023-02-20_1500;"Mon Feb 20 15:00:00 2023";
          SNAPSHOT=`echo ${LINE}|awk -F\; '{print $3}'`
          SNAP_CREATE_TIME=`echo ${LINE}|awk -F\; '{print $4}'|sed 's/"//g'`
#          SIZE_KB=`echo ${LINE}|awk -F\; '{print $5}'|sed 's/KB//g'`
          SIZE_GB=`echo ${LINE}|awk -F\; '{print $5}'|sed 's/GB//g'`
          SNAP_DATI=`date --date="${SNAP_CREATE_TIME}" +%Y%m%d%H%M%S`
#echo "  ${LINE}"
echo -n "."
# Snap-date <= Date To (nn days back)
          if [ ${DATE_OLDER} -gt 0 ] && [ "${SNAP_DATI}" = "" ] || ([ "${SNAP_DATI}" != "" ] && [ ${SNAP_DATI} -le ${DATE_OLDER} ]); then
#            echo "${CLUSTER};${VSERVER};${VOLUME};${LINE};${SNAP_DATI};"|tee -a ${TMP}.csv
            echo "${CLUSTER};${VSERVER};${VOLUME};${SNAPSHOT};${SIZE_GB};${SNAP_DATI};${SNAP_CREATE_TIME};"|tee -a ${TMP}.csv
          fi  # SNAP_DATI}" = ""
        done  # LINE (SnapShots)
      fi  # DATE_OLDER} -gt 0 

# Check Orphaned Snaps
      if [ ${CHK_OS} ]; then
        echo "      VOLUME=${VOLUME}"
    ${SSH} ${CLUSTER} "set -showseparator \";\" -units GB ; snapmirror show -vserver ${VSERVER} -destination-volume ${VOLUME} -field vserver,state"|grep "${VSERVER}"|while read LINE1
        do
#        echo "${LINE1}"
          SM_STATE=`echo ${LINE1}|awk -F\; '{print $4}'|grep -i snapmirror`
#          echo "        VOLUME=${VOLUME} SM_STATE=${SM_STATE}"
          if [ "${SM_STATE}" = "" ]; then
# NO SnapMirror
            ${SSH} ${CLUSTER} "set -showseparator \";\" -units GB ; snap show -vserver ${VSERVER} -volume ${VOLUME} -field vserver,volume,snapshot,create-time,size"|egrep "${SSFILTER}"|while read LINE2
            do
#              echo "LINE2=${LINE2}" | tee -a ${TMP}.csv
              SNAPSHOT=`echo ${LINE2}|awk -F\; '{print $3}'`
              SNAP_CREATE_TIME=`echo ${LINE2}|awk -F\; '{print $4}'|sed 's/"//g'`
              SIZE_GB=`echo ${LINE2}|awk -F\; '{print $5}'|sed 's/GB//g'`
              SNAP_DATI=`date --date="${SNAP_CREATE_TIME}" +%Y%m%d%H%M%S`
              echo "${CLUSTER};${VSERVER};${VOLUME};${SNAPSHOT};${SIZE_GB};${SNAP_DATI};${SNAP_CREATE_TIME};"|tee -a ${TMP}.csv
            done  # LINE2

          fi  # SM_STATE}" = "" 

        done  # LINE1, CHK_OS
      fi  # CHK_OS}






    done  # VOLUME

  done  # VSERVER

done  # CLUSTER


if [ ${MAIL} ] && [ "${MAILTO}" != "" ]; then
  echo "" >> ${TMP}.mail
  cp ${TMP}.csv ${CSV}
  cat ${TMP}.mail | mailx -a ${CSV} -s ":${HOSTNAME}: NetApp snapshot check [${PGM} v${VER}]" "${MAILTO}"
  rm ${CSV}
  echo "  Mailed to ${MAILTO}"|tee -a ${LOG}
fi  # ${MAILTO}" != ""


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

