
#!/bin/ksh
#--------------------------------------------------------------------------#
# Name: make_qtree_report.sh                                               #
# Description: Script collects data about qtree information, volume size   #
#              and filesystem size of all FSOD filers per customer         #
#              and sends information by mail.                              #
# References:                                                              #
# Documentation:                                                           #
# Global Description:                                                      #
# Author(s): Atos                                                   #
# Change log:                                                              #
# aut   Date        Vers Comments                                      #
# RL    09-06-2008  1.0  Initial version Richard Loos                  #
# RL    06-11-2008  1.1  Update qtree information                      #
# RL    14-01-2009  1.2  Update CIFS share information                 #
# RtB   05-03-2009  1.3  Copy from make_report.sh / New report layout  #
# RL    25-08-2009  1.4  Exclude user and group information            #
# MdB   13-10-2010  1.5  Mods; VAR's, Header, mailx, DATE. ${LOG} Added
# MdB	06-01-2011  2.0  Added; filer 1st column, Grand Volume Total/Used, 2> /dev/null
# MdB	17-04-2012  2.1  Changed "Free(KB) / Qtree Style" -> "Used(KB) / Qtree Style"
# MdB	25-04-2012  2.2  Added  Qtree Style + Status
# MdB	18-06-2012  2.3  Mod: echo "Grand;Usage;Volume Total / Used (Gb)
# MdB	10-09-2012  2.4  Mod: Sending to LL
# MdB	16-10-2012  3.0  Mod: USAGE, Linux
#                                                                          #
set +x
#set -x
# Initialize variabels                                                     #
PGM="`basename ${0}|cut -d\. -f1`"
VERSION="3.0"
TMP="/tmp/${PGM}.$$"
DATUM=`date '+%m-%d-%Y'`
DATADIR=${HOME}/data/out
MAILTO="maarten.deboer@atos.net"
SSH="/usr/bin/ssh -n"
FILERS="${HOME}/etc/filers"
HOSTNAME="`hostname|cut -d\. -f1`"
MAXLOGSIZE=1024   # In K's
DATE=`date '+%Y-%m-%d'`
LOG="${HOME}/log/${PGM}.log"
CUSTCODE=""
FILTER="[1234567890]"
TOLL=""
MAIL=""

# Functions
USAGE()
{
  echo "Usage: ${PGM} <options>"
  echo "  Version: ${VERSION}"
  echo "  options     :"
  echo "    -c|--cust : Customercode"
  echo "    -e|--etc  : Etc/filers-file (${FILERS})"
  echo "    -f        : Filter filername (${FILTER})"
  echo "    -h|--help : this Help"
  echo "    -m|--mail : do send Mail"
  echo "    --mailto  : change MAILTO address & do send mail (${MAILTO})"
  echo "    --toll    : send TO LiveLink (via private mailbox-rule)"
  echo "    -x        : set -x"
  echo "    -V        : show Version"
}
## MAIN
# 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
    -f) FILTER=${2}; shift ;;
    -c | --cust) CUSTCODE=${2}; shift ;;
    -e | --etc) FILERS=${2}; shift ;;
    --mailto) MAILTO=${2}; MAIL=1; shift ;;
    -m | --mail) MAIL=1 ;;
    --toll) TOLL=1; MAIL=1 ;;
    -h | --help) USAGE; exit 1 ;;
    -V) echo "${PGM}: v${VERSION}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known. Exiting..."; echo; USAGE; exit 1 ;;
  esac
    shift
done

if [ -z "${CUSTCODE}" ]
then
  echo "No (part of) customer code given. So not to know what to do. Exiting..."; echo; USAGE;
  exit 1
fi

CUSTOMER=`echo "${CUSTCODE}"|tr [:lower:] [:upper:]`
FILE="${DATADIR}/${PGM}_${CUSTOMER}_${DATE}.csv"
CSVFILE="FSOD_Qtree_report_${CUSTOMER}_${DATE}.csv"
if [ "${FILTER}" != "[1234567890]" ]; then
  CSVFILE="FSOD_Qtree_report_${CUSTOMER}-${FILTER}_${DATE}.csv"
fi

echo "CSVFILE=${CSVFILE}"
echo "CUSTCODE=${CUSTCODE}"
echo "CUSTOMER=${CUSTOMER}"
echo "DATE=${DATE}"
echo "FILE=${FILE}"
echo "FILERS=${FILERS}"
echo "FILTER=${FILTER}"
echo "LOG=${LOG}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "TOLL=${TOLL}"

#  LOG rotating
touch ${LOG} ${TMP}
# Check & move LOG-file if longer then max.
LOGSIZE=`du -ka $LOG | cut -f1`
if [ $LOGSIZE -ge $MAXLOGSIZE ]; then
  mv $LOG $LOG.old
  touch $LOG
fi

echo "`date` $0 (v${VERSION}) started."|tee -a $LOG

# Collect data of vfilers, volumes, qtrees, quotas and exportfs            #
echo "# Filer;vFiler;Volume;Vol Size [KB];Vol Used [KB];Used [%];SnapShot Used [KB];Qtree name;Qtree Style+Status;Qtree Used [KB];Qtree Quota [KB];Qtree Used [%];CIFS Share;Clients RW;Clients Root;" > ${FILE}

for FILER in `cat ${FILERS}|grep -v ^\#|grep ${FILTER}|awk -F\; '{print $1}'`
do
  for VFILER in `${SSH} ${FILER} vfiler status|grep ${CUSTCODE}|awk '{print $1}'`
  do
    echo ${FILER}";"${VFILER} >> ${FILE}
    ${SSH} ${FILER} vfiler run ${VFILER} vol status 1> ${DATADIR}/vol${VFILER} 
    ${SSH} ${FILER} vfiler run ${VFILER} qtree status  | grep -v "        mixed  enabled" | grep -v "        ntfs  enabled" | grep -v "        unix  enabled" 1> ${DATADIR}/qtree${VFILER} 
    ${SSH} ${FILER} vfiler run ${VFILER} quota report | grep "tree  " 1> ${DATADIR}/quota${VFILER} 
    ${SSH} ${FILER} vfiler run ${VFILER} exportfs 1> ${DATADIR}/export${VFILER}
    ${SSH} ${FILER} vfiler run ${VFILER} cifs shares 1> ${DATADIR}/cifs${VFILER} 

    for VOLUME in $(cat ${DATADIR}/vol${VFILER}|grep online|awk '{print $1}'|grep "${CUSTCODE}"|grep -v ^vol0|sort )
    do
      echo -n "${FILER}; " >> ${FILE}
      ${SSH} ${FILER} df /vol/${VOLUME}|tail -n 2|grep -v snap|awk '{print ";"$1";"$2";"$3";"$5}' >> ${FILE}
      VOLUMEUSED=`${SSH} ${FILER} df /vol/${VOLUME}|tail -n 2 |grep -v snap|awk '{print $5}'`
      for QTREE in $(cat ${DATADIR}/qtree${VFILER}|grep "${VOLUME} "|awk '{ print $1 " " $2 " " $3 " " $5}'|awk '{ print $2";"$3"+"$4 }')
      do
        QTREE2=`echo ${QTREE}|awk -F";" '{print $1}'`
        QUOTAUSE=`grep "${VOLUME} .*${QTREE2} " ${DATADIR}/quota${VFILER}|awk '{ print $5 }'`
        QUOTASET=`grep "${VOLUME} .*${QTREE2} " ${DATADIR}/quota${VFILER}|awk '{ print $6 }'`
        if [ -n "${QUOTAUSE}" -a -n "${QUOTASET}" -a "${QUOTASET}" != "-" ]
        then
          QTREEUSED=0
          let QTREEUSED=${QTREEUSED}+${QUOTAUSE}*100/${QUOTASET}
          QTREEUSED=${QTREEUSED}"%"
        else
          QTREEUSED="${VOLUMEUSED}"
        fi
        CLIENT=`cat ${DATADIR}/export${VFILER} | grep ${VOLUME}/${QTREE2} |
        awk -F"," '{
                    for ( i=1 ; i <= NF ; i++ ) {
                                                 if ( $i ~ /rw=/ ) { RW=substr($i,4) }
                                                 if ( $i ~ /root=/ ) { ROOT=substr($i,6) }
                                                }
                   } END {
                          printf("%s;%s\n", RW, ROOT)
                   }'`
        SHARE=`cat ${DATADIR}/cifs${VFILER} | grep ${VOLUME}/${QTREE2} | awk '{ print $1 }'`
# Added : Qtree moves with ; ; ; ;
        echo ${FILER}";"${VFILER}";"/vol/${VOLUME}/"; ; ; ; ;"${QTREE}";"${QUOTAUSE}";"${QUOTASET}";"${QTREEUSED}";"${SHARE}";"${CLIENT} >> ${FILE}
      done
      echo -n "${FILER}; " >> ${FILE}
# Mod ;;
      ssh ${FILER} df /vol/${VOLUME} | tail -n 2 | grep snap | sed 's/snap reserve/snap_reserve/g' | awk '{ print ";"$1";"$2"; ;"$5";"$3 }' >> ${FILE}
    done

    rm ${DATADIR}/vol${VFILER}
    rm ${DATADIR}/qtree${VFILER}
    rm ${DATADIR}/quota${VFILER}
    rm ${DATADIR}/export${VFILER}
    rm ${DATADIR}/cifs${VFILER}
  done

done 

# Summarize all numbers. Output will be visible in excel document.         #
LASTLINE=`cat ${FILE}| wc -l | tr -d ' '`
echo "" >> ${FILE}
echo "# Grand;Usage;Volume Total / Used [GiB];=SUM(D2:D${LASTLINE})/1024/1024;=SUM(E2:E${LASTLINE})/1024/1024;">> ${FILE}
let LASTLINE=${LASTLINE}+3
echo ";" >> ${FILE}
echo "# Processed ; at `date` ; by ${HOSTNAME}:${PGM} v${VERSION} ; with Customer selection ${CUSTCODE} ; and Filter ${FILTER} ;">>${FILE}


SUBJECT=":${HOSTNAME}: FSOD Qtree ${CUSTOMER} ${DATE} [${PGM} v${VERSION}]"
if [ "${FILTER}" != "[1234567890]" ]; then
  SUBJECT=":${HOSTNAME}: FSOD Qtree ${CUSTOMER} (${FILTER}) ${DATE} [${PGM} v${VERSION}]"
fi
if [ ${TOLL} ]; then
# Send to LiveLink via mail-rule (fsod_qtree@elink.atos.net)
  SUBJECT=":${HOSTNAME}: FSOD Qtree report ${CUSTOMER} ${DATE} [${PGM} v${VERSION}] {TO_LL:fsod_qtree}"
fi
if [ ${MAIL} ]; then
  cat ${FILE}|uuencode ${CSVFILE}|mailx -s "${SUBJECT}" ${MAILTO}
  echo "`date` Mailed ${CSVFILE} to ${MAILTO} (${SUBJECT}) "|tee -a ${LOG}
fi

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

