
#!/bin/ksh
# File	: rpt_volshrink.ksh
# Subject: Script to report for volshrink
# 20070504, RtB
# 20071015 vollimit=88%, voltarget=90%, volsize=75g
# 20080128, RtB Script Change | Removed hwnaf02 mirror commands
# 20080414, vollimit=85%, voltarget=87%, volsize=75g
#(0.3)	: Mod; FILTER, /bin/ksh, mailx -a; grep online
#(0.4)	: Resize based on Quotas. So Vfilers need to be used. + LOWPCT
#(0.5)	: Added -e; LOWPCT=75%, | egrep -v 'vol0_vfiler|av_|ao_'
#(0.6)  : Added snapshot space
#(0.7)	: Renamed to rpt_volshrink.ksh
#(0.8)	: Wrong SNAPUSED, awk '{print $3 -> $4
#(0.9)	: Wrong SNAPUSED "snap reserv" & ".snapshot"
#(0.10)	: 
# Wanneer de vulling van een volume onder 75% komt wordt het geresized naar: New_vol-size = Vol used/80% (1x per dag)
#
PGM="`basename $0|cut -d\. -f1`"
VER="0.10"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
FILTER="[?]*"
HOSTNAME="`hostname|cut -d\. -f1`"
SSH="/usr/bin/ssh -n"
EXCL=${HOME}/etc/volshrink_excl
VOLSTR="[?]*"
MAIL=""
MAILTO="maarten.deboer@atos.net"
CSV="${PGM}.csv"
CUSTCODE="[?]*"
LOWPCT=75
ETC="${HOME}/etc/filers"


USAGE()
{
  echo "Usage: ${PGM} [<options>]"
  echo "  Version: ${VER}"
  echo "  options          :"
  echo "    -c <cust.code> : Custromer code (${CUSTCODE})"
  echo "    -e             : set Etc/vfiler_default-file (${ETC})"
  echo "    -f <filter>    : filter filername (${FILTER})"
  echo "    -l | --lowpct  : Low % when shrink (${LOWPCT})"
  echo "    -m | --mail    : Mail (${CSV}-file to ${MAILTO})"
  echo "    --mailto       : change MAILTO address & do send mail (${MAILTO})"
  echo "    -v <str>       : Voltype (string)"
  echo "    -h | --help    : this help"
  echo "    -x             : set -x"
  echo "    -V             : Version"
}
# Check options
while [ ${#} -gt 0 ]
  do
  case ${1} in
    -c | --cust) CUSTCODE=${2}; shift ;;
    -e) ETC=${2}; shift ;;
    -f) FILTER=$2; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -l | --lowpct) LOWPCT=${2}; shift ;;
    -m | --mail) MAIL=1;;
    --mailto) MAILTO=${2}; MAIL=1; shift ;;
    -v) VOLSTR=$2; shift ;;
    -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} @${HOSTNAME} Started with FILTER=${FILTER}"|tee -a ${LOG}

if [ ! -f ${EXCL} ]; then
  echo "`date` ${PGM}: No exclude-file ${EXCL} found. Exiting ..."|tee -a ${LOG}
  exit 4
fi

if [ ! -f ${ETC} ]; then
  echo "`date` ${PGM}: No etc-file ${ETC} found. Exiting ..."|tee -a ${LOG}
  exit 4
fi

FILERS=${ETC}
echo "CSV=${CSV}"
echo "FILERS=${FILERS}"
echo "FILTER=${FILTER}"
echo "VOLSTR=${VOLSTR}"
echo "LOWPCT=${LOWPCT}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"

touch ${TMP} 
echo "# Filer;Volume;Vol.Total [kB];Vol.Used [kB];PCT [%];SnapUsed [kB];Quota [kB];Vol.New [kB];Remarks;" > ${TMP}

for FILER in `cat ${FILERS}|grep -v \^#|grep ${FILTER}|awk -F\; '{print $1}'|sort`
do
  ${SSH} ${FILER} vfiler status|grep running|grep -v vfiler0|awk '{print $1}'|grep ${CUSTCODE}|while read VFILER
  do
    for VOLUME in `${SSH} ${FILER} vfiler run -q ${VFILER} vol status|grep online|grep "${VOLSTR}"|egrep -v -f ${EXCL}|egrep -v 'vol0_vfiler|av_|ao_'|awk '{print $1}'|sort`
    do
      COMMENT=""
      PCT=`${SSH} ${FILER} vfiler run -q ${VFILER} df -g ${VOLUME}|grep -v File|grep -v snap|awk '{print $5}'|cut -d% -f1`
      echo "${FILER}:${VOLUME} = ${PCT}% used"
# If the volume is less than ${LOWPCT} (85)% filled, more than 10GB and not 0GB used
      if [ ${PCT} -lt ${LOWPCT} ]; then
        VOLTOTAL=`${SSH} ${FILER} df -k ${VOLUME}|grep -v File|grep -v snap|awk '{print $2}'|sed 's/KB//g'`
        VOLUSED=`${SSH} ${FILER} df -k ${VOLUME}|grep -v File|grep -v snap|awk '{print $3}'|sed 's/KB//g'`
        SNAPUSED=`${SSH} ${FILER} df -k ${VOLUME}|grep -v File|egrep 'snapshot|snap reserve'|awk '{print $3}'|sed 's/KB//g'`
        if [ "${SNAPUSED}" != "" ] && [ ${SNAPUSED} -eq 0 ]; then
          SNAPUSED=`${SSH} ${FILER} df -k ${VOLUME}|grep -v File|grep 'snap reserve'|awk '{print $4}'|sed 's/KB//g'`
        fi
#        echo "${FILER}:${VOLUME} =  ${VOLUSED}k / ${VOLTOTAL}k (used/total) = ${PCT}%"
        if [ ${VOLUSED} -ne 0 ] && [ ${VOLTOTAL} -gt 10 ]; then
          TOTQUOTA=0
          ${SSH} ${FILER} vfiler run -q ${VFILER} quota report|grep ${VOLUME}|awk '{print $6}'|grep "[1234567890]"| while read QUOTA
          do
            let TOTQUOTA="${TOTQUOTA} + ${QUOTA}"
          done  # QUOTA
#          echo "Total Quota = ${TOTQUOTA} (VOLTOTAL=${VOLTOTAL})"
#          echo "${FILER}:${VOLUME} =  ${VOLUSED}k / ${VOLTOTAL}k (used/total) = ${PCT}%"
#          echo "Total Quota = ${TOTQUOTA} (VOLTOTAL=${VOLTOTAL})"

# New volume size = Total Quota + Snapshot used.
#          let VOLNEW="${TOTQUOTA} + ${SNAPUSED}"
          let VOLNEW="${VOLUSED} / 0.8"
          COMMENT="80% filling"
          if [ ${VOLNEW} -lt ${TOTQUOTA} ]; then
            let VOLNEW="${TOTQUOTA}"
            COMMENT="Total Quota"
          fi

# When no Quota; remark & volume stays the same
          if [ ${TOTQUOTA} -eq 0 ]; then
            echo "${FILER}:${VOLUME} has NO Quota !!!" 
            echo "${FILER};${VOLUME};;;;;NO Quota;;!;" >> ${TMP}
            VOLNEW="${VOLTOTAL}"
          fi 
          if [ ${TOTQUOTA} -gt ${VOLTOTAL} ]; then
            echo "${FILER}:${VOLUME} is over committed !!!" 
            echo "${FILER};${VOLUME};;;;;is over committed;;!;" >> ${TMP}
          fi

# FILER;VOLUME;VOLTOTAL;VOLUSED;PCT;TOTQUOTA;SNAPUSED;VOLNEW;REMARKS;"
          if [ ${VOLNEW} -lt ${VOLTOTAL} ]; then
            echo "${FILER}:${VOLUME} can shrink" 
            echo "${FILER};${VOLUME};${VOLTOTAL};${VOLUSED};${PCT};${SNAPUSED};${TOTQUOTA};${VOLNEW};'< (${COMMENT});" >> ${TMP}
          fi
          if [ ${VOLNEW} -eq ${VOLTOTAL} ]; then
            echo "${FILER};${VOLUME};${VOLTOTAL};${VOLUSED};${PCT};${SNAPUSED};${TOTQUOTA};${VOLNEW};'= (${COMMENT});" >> ${TMP}
          fi
          if [ ${VOLNEW} -gt ${VOLTOTAL} ]; then
            echo "${FILER};${VOLUME};${VOLTOTAL};${VOLUSED};${PCT};${SNAPUSED};${TOTQUOTA};${VOLNEW};'> (${COMMENT});" >> ${TMP}
          fi

        fi  # if [ ${VOLUSED} -ne 0 ]
      fi  # if [ ${PCT} -lt ${LOWPCT} ]
    done  # for VOLUME
  done  # VFILER
done  # for FILER

if [ ${MAIL} ]; then
  echo "#" >> ${TMP}
  echo "# `date` ${PGM} v${VER} ETC=${ETC} @${HOSTNAME} " >> ${TMP}
  cp ${TMP} /tmp/${CSV}
  date|mailx -a /tmp/${CSV} -s "Volume shrink report (${CSV}) with ETC=${ETC} [${PGM} v${VER}]" ${MAILTO}
  echo "`date` Mailed to ${MAILTO}"| tee -a ${LOG}
fi

rm ${TMP} /tmp/${CSV}
echo "`date` ${PGM} Finished "| tee -a ${LOG}
exit 0

