
#!/usr/bin/ksh
# Script to automate the resizing of volumes
# 20070504, RtB
# 20070510, RtB Script LIVE | Aggrlimit=96%, Vollimit=89%
# 20070525, RtB Added solution for growth of small volumes
# 20070615, RtB Script Change | Aggrlimit=98%, Vollimit=89%
# 20070911, RtB Script Change | Aggrlimit=96%, Vollimit=91%
# 20071003, RtB Script Change | Aggrlimit=97%, Vollimit=91%, Voltarget=88%
# 20071010, RtB Script Change | Aggrlimit=ow_history.log
# 20071207, RtB Script Change | Changed the Aggregate size commands
# 20080128, RtB Script Change | Removed hwnaf02 mirror commands
# 20080410, RtB Script Change | Aggrlimit=97%, Vollimit=91%, Voltarget=88%
# 20080414, RtB Script Change | Aggrlimit=96%, Vollimit=90%, Voltarget=87%
# 20080416, RtB Script Change | Aggrlimit=96%, Vollimit=89%, Voltarget=87%
# 090806:MdB: NXP mod's
# 090807:MdB: INODS added
# 090827,1.3: One LOGFILE = volgrow-shrink.log
# 090929,1.4: 2>/dev/null added at "vol status" &
#    if [ `echo ${PCTGB} | grep '[0-9][0-9]'` ] && [ ${PCTGB} -gt 89 ]; then
#    date +%Y%m%d corrected &
#    DEBUGLOG disabled
# 091004, 1.5: DEBUGLOG enabled, because it looks vol size + did not work accourding $LOG
#    AGGR in $LOG
# 110509: 2.0: With USD messages about growed volumes
# 110511: 2.1: Added AGGRMAX
# 110512: 2.2: Changed LOGGER msg
# 110513: 2.3: For 1 volume (due to an Incident)
# 110517: 2.4: Vol's with fs_size_fixed=on can not grew.
# set -x

PGM="`basename $0|cut -d\. -f1`"
TMP="/tmp/${PGM}.$$"
HOSTNAME="`hostname`"
VERSION="2.4"

TIME=`date +%Y%m%d%H%M`
LOGFILE="${HOME}/log/${PGM}.log"
LOGFILE="${HOME}/log/volgrow-shrink.log"
EXCL="${HOME}/etc/${PGM}.excl"
DEBUGLOG="${HOME}/log/${PGM}.debuglog"
FILTER="naf"
FILERS="${HOME}/etc/filers"
LOGGER=""
MSGSTR=""
SSH="ssh -n"
RESIZE=""
VOLFILTER="vol"

AGGRMAX=0.96
AGGRMAX=0.98


# Functions
USAGE()
{
  echo "Usage: ${PGM} [-f <filter>] [-m] [-h] [-u] [-V] [-x] [--help] [--mail] [--mailto] [--usd]"
  echo "  Version: ${VERSION}"
  echo "  options    :"
  echo "    -f       : filter filername (${FILTER})"
  echo "    -l       : send (short)msg (to USD) via Logger"
  echo "    -r       : Resize"
  echo "    -v       : Volume"
  echo "    -h       : this help"
  echo "    -V       : Version"
  echo "    -x       : set -x"
  echo "    --help   : this help"
  echo "    --logger : send (short)msg (to USD) via Logger"
}

# Check options
while [ $# -gt 0 ]
  do
  case $1 in
    -f) FILTER=$2; shift ;;
    -v) VOLFILTER=$2; shift ;;
    -l | --logger) LOGGER=1;;
    -r) RESIZE=1;;
    -h | --help) USAGE; exit 1 ;;
    -V) echo "${PGM}: v${VERSION}"; exit 3 ;;
    -x)  set -x ;;
    -n | --nagios) NAGIOS=1;;
    *)  echo "Option $1 not known."; USAGE; exit 1 ;;
  esac
    shift
done

echo "`date +%Y%m%d_%H%M` ${PGM}: v${VERSION} @${HOSTNAME} Started with FILER=${FILTER} & VOLUME=${VOLFILTER}"
for FILER in `cat ${FILERS}|grep -v \^#|awk -F\; '{print $1}'|grep ${FILTER}`
do
# Check filer for volumes that must be enlarged
  echo "Filer: ${FILER} ..."
  for VOLUME in `${SSH} ${FILER} vol status|grep ${VOLFILTER} 2>/dev/null|grep online|grep -v Volume|awk '{print $1}'| sort`
  do
    PCTGB=`${SSH} ${FILER} df -g ${VOLUME} | grep -v File | grep -v snap | awk '{print $5}' | cut -d% -f1`
#    PCTINODES=`${SSH} ${FILER} df -i ${VOLUME} | grep -v File | awk '{print $4}' | cut -d% -f1`
# If the volume is more than 89% filled
#   Test if $PCTGB is number.
#   If the volume is less than 80% filled, more than 100GB and not 0GB used
    if [ `echo ${PCTGB} | grep '[0-9][0-9]'` ] && [ ${PCTGB} -gt 89 ]; then
     # Set variables
     VOLOLD=`${SSH} ${FILER} df -g ${VOLUME} | grep -v File | grep -v snap | awk '{print $2}' | cut -dG -f1`
     VOLUSED=`${SSH} ${FILER} df -g ${VOLUME} | grep -v File | grep -v snap | awk '{print $3}' | cut -dG -f1`
# Lets make NEWVOL 85%

     let "VOLNEW= ${VOLUSED} * 100 / 85"
     if test ${VOLNEW} = ${VOLOLD}
     then
        let "VOLNEW= ${VOLNEW} + 2"
     fi
     let "VOLDIFF= ${VOLNEW} - ${VOLOLD}"

# Check if enough room at Aggr
     AGGR=`${SSH} ${FILER} vol status ${VOLUME} | grep agg | cut -d\' -f2`
     AGGRS=`${SSH} ${FILER} df -Ag ${AGGR} | grep -v Aggr | grep -v snap | awk '{print $2}' | cut -dG -f1`
     AGGRU=`${SSH} ${FILER} df -Ag ${AGGR} | grep -v Aggr | grep -v snap | awk '{print $3}' | cut -dG -f1`
     AGGRPERC=`${SSH} ${FILER} df -Ag ${AGGR} | grep -v Aggr | grep -v snap | awk '{print $5}'`
#     let "AGGRL= ${AGGRS} * 96 / 100"
     let "AGGRL= ${AGGRS} * 98 / 100"
#     let "AGGRL= ${AGGRS} * ${AGGRMAX}"
     let "AGGRA= ${AGGRL} - ${AGGRU}"

     if test ${VOLDIFF} -lt ${AGGRA}
     then
       echo "`date +%Y%m%d_%H%M` ${PGM}: Volume ${FILER}:/${VOLUME} need to grow to ${VOLNEW}g (with ${VOLDIFF}) from ${VOLOLD}g. Used:${VOLUSED}g = ${PCTGB}% at Aggr=${AGGR} ${AGGRS}GB ${ARGGRPERC}"|tee -a ${LOGFILE}|tee -a ${DEBUGLOG}
     if [ ${RESIZE} ]; then
       ${SSH} ${FILER} vol size ${VOLUME} >> ${DEBUGLOG}
       # test if  fs_size_fixed=on (vol status). If so, resize can not be done
       # Can be a aport of a SnapMirror.
       SF="`${SSH} ${FILER} vol status ${VOLUME}|grep fs_size_fixed|cut -d\= -f2|sed -e 's/,//g'|sed -e 's/ //g'`"
echo "SF=${SF}"
       if [ "${SF}" = "on" ]; then
         SM="`${SSH} ${FILER} snapmirror status | grep ${VOLUME}`"
         MSGSTR="ATTENTION: Volume ${FILER}:/${VOLUME} has fs_size_fixed=on. So can not be resized form ${VOLOLD}g to ${VOLNEW}g. SnapMirror: ${SM} [${PGM} v${VERSION}]"
         echo "`date +%Y%m%d_%H%M` ${PGM}: ${MSGSTR}"|tee -a ${LOGFILE}
       else
         ${SSH} ${FILER} vol size ${VOLUME} ${VOLNEW}g >> ${DEBUGLOG}
         echo "Resized ${FILER}:/${VOLUME} to ${VOLNEW}g"
         MSGSTR="INFORMATION: Volume ${FILER}:/${VOLUME} grew to ${VOLNEW}g (with ${VOLDIFF}) from ${VOLOLD}g. Used:${VOLUSED}g = ${PCTGB}% at Aggr=${AGGR} ${AGGRS}GB ${ARGGRPERC} [${PGM} v${VERSION}]"
       fi
     else
       echo "RESIZE-cmd: ${FILER}:/${VOLUME} to ${VOLNEW}g. NO resizing done. Option -r is needed for this."
     fi # RESIZE
     else
#echo "AGGRSize=${AGGRS}"
#echo "AGGRUse=${AGGRU}"
#echo "AGGRLarge=${AGGRL}"
#echo "AGGRA=${AGGRA}"
       echo "`date +%Y%m%d_%H%M` ${PGM}: Aggregate ${FILER}:${AGGR} does not have enough space to extend ${VOLUME} with ${VOLDIFF} GB" | tee -a ${LOGFILE}
       MSGSTR="ATTENTION: Aggregate ${FILER}:${AGGR} does not have enough space to extend ${VOLUME} with ${VOLDIFF} GB [${PGM} v${VERSION}]"
     fi
     if [ ${LOGGER} ]; then
# To Nagios
# ------
# MINOR         Nagios-WARNING & SEV.3
# WARNING       Nagios-WARNING & SEV.3
# CRITICAL      Nagios-CRITICAL & SEV.2
# FATAL         Nagios-CRITICAL & SEV.2
# logger -t NOTIFY FSOD-SUPPORT <Nagios-SEV> "Text"
       NAGIOSSEV="MINOR"
       /usr/bin/logger -t NOTIFY FSOD-SUPPORT ${NAGIOSSEV} "${MSGSTR}" 
       echo "logger: NOTIFY FSOD-SUPPORT ${NAGIOSSEV} ${MSGSTR}" | tee -a ${LOGFILE}
     fi  # logger
   fi  #

  done
done

echo "`date +%Y%m%d_%H%M` ${PGM}: v${VERSION} @${HOSTNAME} finished."|tee -a ${LOGFILE}
exit 0

