
#!/bin/ksh
# File	: make_capacity_report.sh
# OLD: get_filer_aggr_vols.sh
# By	: Maarten.deBoer@Atos.net (Richard.Loos@Atos.net), 130124
# Subject	: Make FSOD-Capacity report
#(0.2)	: Added df -S
#(0.3)	: Added df -i & SpareCnt
#(0.4)	: Added SpareDisks + MAXFILES
#(0.5)	: Added Quotas + -C
#(0.6)	: Added --snapshots
#(0.7)	: Added % in col I, L, N en Q & report when volume OFFLINE
PGM="`basename $0|cut -d\. -f1`"
VERSION="0.7"
TMP="/tmp/${PGM}.$$"
MAILTO="maarten.deboer@atos.net"
HOSTNAME="`hostname|cut -d\. -f1`"
MAIL=""
FILERS="${HOME}/etc/filers"
MAILFILE="/tmp/${PGM}.$$.mail"
SSH="/usr/bin/ssh -n"
FILTERSTR="[1234567890]*"
AGGRONLY=""
SUBJECT="FSOD Capacity report"
DATE="`date +%d-%m-%Y`"
TOLL=""
FILTER="${FILTERSTR}"
LOG="${HOME}/log/${PGM}.log"
CUST=""
SNAPSHOT=""

USAGE()
{
  echo "Usage: ${PGM} <options> "
  echo "  Version: ${VERSION}"
  echo "  options:"
  echo "    -a|--aggronly : Aggr only"
  echo "    -e|--etc      : Etc/filers-file (${FILERS})"
  echo "    -f            : filter filername (${FILTER})"
  echo "    -h|--help     : this help"
  echo "    -m|--mail     : do send Mail"
  echo "    -C            : Customername (only for filename purpose)"
  echo "    -V            : show Version"
  echo "    -x            : set -x"
  echo "    --mailto      : change MAILTO address & do send mail (${MAILTO})"
  echo "    --snapshot    : with Snapshot information"
  echo "    --toll        : send to LiveLink (via mailbox-rule)"
}

# Check options
if [ ${#} -eq 0 ]; then
  echo "No option(s) given. So not to know what to do. Exiting..."; echo; USAGE;
  exit 1
fi
while [ ${#} -ge 1 ]
  do
  case $1 in
    -a | --aggronly) AGGRONLY=1 ;;
    -e | --etc) FILERS=${2}; shift ;;
    -f) FILTER=${2}; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -m | --mail) MAIL=1 ;;
    -C) CUST="-${2}"; shift;;
    -V) echo "${PGM}: v${VERSION}"; exit 3 ;;
    -x)  set -x ;;
    --snapshot) SNAPSHOT=1 ;;
    --mailto) MAILTO=$2; MAIL=1; shift ;;
    --toll) TOLL=1; MAIL=1; MAILTO="maarten.deboer@atos.net" ;;
    *)  echo "Option $1 not known."; USAGE; exit 1 ;;
  esac
    shift
done

if [ ! -d ${HOME}/log ]; then
  mkdir ${HOME}/log
fi
echo "`date` ${PGM} Started "|tee -a ${LOG}

SUBJECT="FSOD${CUST} Capacity"
CSVSTR="FSOD${CUST}_Capacity"
if [ ${AGGRONLY} ]; then
  SUBJECT="FSOD${CUST} Capacity (aggr only)"
  CSVSTR="FSOD${CUST}_Capacity(aggr_only)"
fi
if [ ${SNAPSHOT} ]; then
  SUBJECT="${SUBJECT} with snapshot"
  CSVSTR="${CSVSTR}_snapshot"
fi
SUBJECT="${SUBJECT} report ${DATE}"
CSVSTR="${CSVSTR}_report"

# FILTER (-f) is altered, then add in filename
if [ "${FILTERSTR}" != "${FILTER}" ]; then
  CSV="${CSVSTR}_${FILTER}_`date +%Y-%m-%d`.csv"
else
  CSV="${CSVSTR}_`date +%Y-%m-%d`.csv"
fi

echo "AGGRONLY=${AGGRONLY}"
echo "CUST=${CUST}"
echo "CSV=${CSV}"
echo "FILERS=${FILERS}"
echo "FILTER=${FILTER}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "SNAPSHOT=${SNAPSHOT}"
echo "SUBJECT=${SUBJECT}"
echo "PGM=${PGM}"
echo "TOLL=${TOLL}"
echo "VERSION=${VERSION}"
 
echo "# Date (of creation) [d-m-yyyy];Filer (Frame) [name];Aggr (Pool) [name];Volume [name];Aggr Total (Available) [GB];Aggr Used (Allocated) [GB];Volume Total (Available) [GB];Volume Used (Allocated) [GB];Perc. (Available-Allocated) [%];Quota Limit [GB];Proposed Volume Size [GB];(SnapReserve) [%];Volume (de-dupe / a-sis) savings [#];Volume (de-dupe / saving) ratio (perc.) [%];Maxfiles [#];Inodes (Files) Used [#];Inodes (Files) [%];Spare disks [#]; Type spares ... ;" >> ${TMP}

touch ${TMP} ${TMP}.spares ${TMP}.vol
for FILER in `cat ${FILERS}|grep -v \#|awk -F\; '{print$1}'|grep ${FILTER}`
do
  echo "${FILER} ... "
  echo -n "${DATE};${FILER};;;;;;;;;;;;;;;;" >> ${TMP}

# Get number of spare disks (per filer)
# Spares per type disk
  ${SSH} ${FILER} sysconfig -r|egrep 'SA:|FC:'|grep -v FAILED|egrep 'spare'|awk '{print $8,$9,$10}'|cut -d\/ -f1|sed -e's/ /\-/g' > ${TMP}.spares
  SPARECNT="`cat ${TMP}.spares|wc -l`"
  echo -n "${SPARECNT};" >> ${TMP}
  cat ${TMP}.spares|sort -u|while read DISKTYPE
  do
    SPARES="`grep -c ${DISKTYPE} ${TMP}.spares`"
    echo -n "${DISKTYPE}=${SPARES};" >> ${TMP}
  done
  echo " "|tee -a ${TMP}

# When NOT --aggronly, Quota (per vfiler) need to be collected as well, for later.
  if [ "${AGGRONLY}" = "" ]; then
# Quota
# Get list of volumes per vfiler                                           #
# This part (of code) copied from Richard Loos (130130)
    cp /dev/null ${TMP}.vol
    ${SSH} ${FILER} vfiler status|grep running|grep -v vfiler0|awk '{print $1}'|while read VFILER
    do
      echo -n "${VFILER} ... "
      ${SSH} ${FILER} vfiler run ${VFILER} vol status|grep online|awk '{print $1}'|grep -v ^vol0|sort |while read VOLUME
      do
      # Get quota limit values of all volume variables
        VOLTOTAL=`${SSH} ${FILER} df /vol/${VOLUME}|tail -n+2|egrep -v ".snapshot|snap reserve"|awk '{print $2}'`
        VOLUSED=`${SSH} ${FILER} df /vol/${VOLUME}|tail -n+2|egrep -v ".snapshot|snap reserve"|awk '{print $3}'`
        QUOTAUSED=0
        QUOTALIMIT=0
        ${SSH} ${FILER} vfiler run ${VFILER} quota report|grep tree|grep " ${VOLUME}"|grep -v "* ${VOLUME} "|awk '{print $5";"$6}'|while read QUOTADEF
        do
          QUOTAUSED0=`echo ${QUOTADEF} |awk -F";" '{print $1}'`
          QUOTALIMIT0=`echo ${QUOTADEF} |awk -F";" '{print $2}'`
          if [ "${QUOTALIMIT0}" = "-" ]; then
            QUOTAUSED=${VOLUSED}
            QUOTALIMIT=${VOLTOTAL}
          else
            let QUOTAUSED=${QUOTAUSED}+${QUOTAUSED0}
            let QUOTALIMIT=${QUOTALIMIT}+${QUOTALIMIT0}
          fi
        done  # QUOTADEF
        PRC_SAVED="`${SSH} ${FILER} df -s|grep ${VOLUME}|awk '{print $4}'|awk  -F"%" '{print $1}'`"
        if [ ${PRC_SAVED} == "0" ]; then
          VOL_NEW_SIZE=${QUOTALIMIT}
        else
          let "QUOTAFREE= ${QUOTALIMIT} - ${QUOTAUSED}"
          let "VOL_NEW_SIZE= ${VOLUSED} + ${QUOTAFREE}"
        fi
        let "VOL_CHK_SIZE= ${VOLUSED} * 111 / 100"
        if [ "${VOL_CHK_SIZE}" -ge "${VOL_NEW_SIZE}" ]; then
          let "VOL_NEW_SIZE= ${VOLUSED} * 118 / 100"
        fi
        let "VOL_NEW_SIZE= ${VOL_NEW_SIZE} / 1048576"
        let "QUOTALIMIT= ${QUOTALIMIT} / 1048576"
        echo "${VOLUME} ${QUOTALIMIT};${VOL_NEW_SIZE}" >> ${TMP}.vol

      done  # while read VOLUME
    done  # while read VFILER
  fi  # if [ "${AGGRONLY}" != "" ];
  echo ""

# Get info per Aggr
  ${SSH} ${FILER} aggr status|grep online|grep -v Aggr|awk '{print $1}'|sort|while read AGGR
  do
    echo "${FILER} ; ${AGGR}" 
    echo -n "${DATE};${FILER};" >> ${TMP}
# df -A:
# Aggregate                total       used      avail capacity
    AGGRDF=`${SSH} ${FILER} df -gA ${AGGR}|grep -v Aggregate|grep -v snapshot|awk '{print $1";;"$2";"$3";;;"$5";;;"}'|sed -e 's/GB//g'`
    AGGRSNAPRES=`${SSH} ${FILER} snap reserve -A ${AGGR}|awk '{print $7}'`
    echo "${AGGRDF}${AGGRSNAPRES};"  >> ${TMP}

# When not "--aggronly" (is AGGR only), then also Volume info
    if [ "${AGGRONLY}" = "" ]; then
# Get volume information, Using aggr show_space. Others did not work.
# MIND: Volume-name-syntax with '_vol' (bc_ing01_vol001) need to be used.
      ${SSH} ${FILER} aggr show_space ${AGGR}|awk '{print $1}'|grep _vol|sort|while read VOL
      do
        echo -n "${DATE};${FILER};${AGGR};" >> ${TMP}

        LINE="`${SSH} ${FILER} vol status ${VOL}|egrep 'online|offline'|awk '{print $2}'`"
# When online, do the rest
        if [ "${LINE}" = "offline" ]; then
          echo "${VOL};;;OFFLINE;;;;;;;;;;;;;;;;;;;" >> ${TMP}
        else
# df -g:
# Filesystem               total       used      avail capacity  Mounted on
          VOLDF=`${SSH} ${FILER} df -g ${VOL}|grep -v Filesystem|grep -v snapshot|awk '{print $1";;;"$2";"$3";"$5";"}'|sed -e 's/GB//g'`
          echo -n "${VOLDF}" >> ${TMP}

# Get Quota info from ${TMP}.vol-file
          QUOTA_NEW="`grep \"${VOL} \" ${TMP}.vol|awk '{print $2}'`"
          if [ "${QUOTA_NEW}" = "" ]; then
            QUOTA_NEW=";"
          fi
          echo -n "${QUOTA_NEW};" >> ${TMP}

# SnapReserve
          VOLSNAPRES=`${SSH} ${FILER} snap reserve ${VOL}|awk '{print $7";"}'`
          echo -n "${VOLSNAPRES}" >> ${TMP}

# De-dupe (Savings); df -s: 
# Filesystem                used      saved       %saved
          VOLDF_S=`${SSH} ${FILER} df -s ${VOL}|grep -v Filesystem|awk '{print $3";"$4";"}'`
          echo -n "${VOLDF_S}" >> ${TMP}

# Maxfiles
          MAXFILES=`${SSH} ${FILER} maxfiles ${VOL}|awk '{print $9";"}'`
          echo -n "${MAXFILES}" >> ${TMP}
# df -i:
# Filesystem               iused      ifree  %iused  Mounted on
          VOLDF_I=`${SSH} ${FILER} df -i ${VOL}|grep -v Filesystem|awk '{print $2";"$4";"}'`
          echo -n "${VOLDF_I}" >> ${TMP}


          echo " " >> ${TMP}
          if [ ${SNAPSHOT} ]; then
# df -g:
# Filesystem               total       used      avail capacity  Mounted on
            VOLDF=`${SSH} ${FILER} df -g ${VOL}|grep -v Filesystem|grep snapshot|awk '{print $1";;;"$2";"$3";"$5";"}'|sed -e 's/GB//g'`
            echo "${DATE};${FILER};${AGGR};${VOLDF}" >> ${TMP}
          fi  # if [ ${SNAPSHOT} ]

        fi  # if [ "$LINE}" 

      done  # ${SSH} ${FILER} aggr show_space

    fi  # [ ! ${AGGRONLY} ]
  done  # while read AGGR
done  # for FILER in

echo "" >>  ${TMP}
echo "# From ${PGM} (v${VERSION})" >>  ${TMP}
echo "# At;${HOSTNAME};`date`" >> ${TMP}
echo "# Filers;${FILERS};" >> ${TMP}
echo "# Filter;${FILTER};" >> ${TMP}

if [ ${MAIL} ]; then
  SUBJECT=":${HOSTNAME}: ${SUBJECT} [${PGM} v${VERSION}]"
  if [ ${TOLL} ]; then
    SUBJECT="${SUBJECT} {TO_LL:fsod_capacity}"
  fi
  RHREL="`/bin/rpm -qa|grep redhat-release|cut -d\- -f4| grep -i server`"
  if [ "${RHREL}" = "5Server" ]; then
    cat ${TMP}|uuencode ${CSV}|mailx -s "${SUBJECT}" ${MAILTO}
  fi
  if [ "${RHREL}" = "6Server" ]; then
    cp ${TMP} /tmp/${CSV}
    echo "${SUBJECT} at `date`"|mailx -s "${SUBJECT}" -a /tmp/${CSV} ${MAILTO}
    rm /tmp/${CSV}
  fi
  echo "`date` Mailed ${CSV} to ${MAILTO} (${SUBJECT}). RHEL=${RHREL} "|tee -a ${LOG}
fi

echo ""
rm ${TMP} ${TMP}.spares ${TMP}.vol
echo "`date` ${PGM} Finished "|tee -a ${LOG}
exit 0

