
#!/usr/bin/ksh
# File	: volshrink.ksh
# Subject: Script to automate the shrinking of volumes
# 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.5)191007,MdB: Mod for Tech.Lab
#
PGM="`basename $0|cut -d\. -f1`"
VER="0.5"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
FILTERSTR="[?]*"
HOSTNAME=`hostname|cut -d\. -f1`
FILERS="${HOME}/etc/filers"
SSH="/usr/bin/ssh -n"
EXCL="${HOME}/etc/volshrink_excl"
VOLSTR="[?]*"
RESIZE=""
MAIL=""
MAILTO="maarten.deboer@atos.net"
CSV="/tmp/${PGM}.csv"

USAGE()
{
  echo "Usage: ${PGM} [<options>]"
  echo "  Version: ${VER}"
  echo "  options:"
  echo "    -f <filter> : filter filername (${FILTER})"
  echo "    -m          : Mail (${CSV}-file to ${MAILTO})"
  echo "    -r          : Resize"
  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
    -f) FILTER=$2; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -m) MAIL=1;;
    -r) RESIZE=1;;
    -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

if [ ! -f ${EXCL} ]; then
  echo "No ${EXCL} found. Exiting ..."
  exit 4
fi

echo "FILTER=${FILTER}"
echo "RESIZE=${RESIZE}"
echo "VOLSTR=${VOLSTR}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "CSV=${CSV}"

echo "`date` ${PGM}: v${VER} @${HOSTNAME} Started with FILTER=${FILTER}"|tee -a ${LOG}
touch ${TMP}
echo "# FILER;VOL1;VOLOLD;VOLUSED;PCT;VOLNEW;" > ${TMP}

for FILER in `cat ${FILERS}|grep -v \^#|grep ${FILTER}|awk -F\; '{print $1}'|sort`
do
# Check for volumes that can be shrunk (i.e. less than 85% filled)
  for VOL1 in `${SSH} ${FILER} vol status|grep "${VOLSTR}"|grep -i _vol|egrep -v -f ${EXCL}|awk '{print $1}'|sort`
  do
    PCT=`${SSH} ${FILER} df -g ${VOL1}|grep -v File|grep -v snap|awk '{print $5}'|cut -d% -f1`
    echo "${FILER}:${VOL1} = ${PCT} %"
# If the volume is less than 85% filled, more than 100GB and not 0GB used
    if [ ${PCT} -lt 85 ]; then
      VOLOLD=`${SSH} ${FILER} df -g ${VOL1}|grep -v File|grep -v snap|awk '{print $2}'|cut -dG -f1`
      VOLUSED=`${SSH} ${FILER} df -g ${VOL1}|grep -v File|grep -v snap|awk '{print $3}'|cut -dG -f1`
      echo "${FILER}:${VOL1} =  ${VOLUSED}g / ${VOLOLD}g "
      if [ ${VOLUSED} -ne 0 ]; then
        let "VOLNEW= ${VOLUSED} * 100 / 85"
# When < GB sized. Rounding can cause low %. Therefore +1
        let "VOLNEW= ${VOLNEW} + 1"
        echo "${FILER}:${VOL1} => ${VOLNEW}g"

## Smalest size of volume = 10(+1) g. To cope with fast growing of SnapVaults
#        if [ ${VOLNEW} -lt 11 ]; then
#          echo "${FILER}:${VOL1} < 10+1g => Vol size is set to 10g"
#          VOLNEW=10
#        fi

        let "VOLDELTA= ${VOLOLD} - ${VOLNEW}"
        ${SSH} ${FILER} vol size ${VOL1}|tee -a ${LOG}
        echo "  Need to shrink ${FILER}:${VOL1} from ${VOLOLD}g to ${VOLNEW}g"|tee -a ${LOG}
        if [ ${RESIZE} ]; then
          echo "  Resize"
          ${SSH} ${FILER} vol size ${VOL1} ${VOLNEW}g|tee -a ${LOG}
        fi
        echo "${FILER};${VOL1};${VOLOLD};${VOLUSED};${PCT};${VOLNEW};" >> ${TMP}
      fi
    fi
  done  # for VOL1

done  # for FILER

if [ ${MAIL} ]; then
  cp ${TMP} ${CSV}
  echo "`date` VolShrink-CSV" |mailx -a ${CSV} -s ":${HOSTNAME}: VolShrink-CSV [${PGM} v${VER}]" ${MAILTO}
  echo "  Mailed CSV (${CSV}) to ${MAILTO}"|tee -a ${LOG}
fi

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

