
#!/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                                 #
# RL	22-02-2012  3.1  Mod: Change .snapshot output                      #
# RL    22-02-2012  3.3  Mod: Change .snapshot output                      #
# MdB	03-04-2013  3.4  Mod: Quota                                        #
# RL    12-04-2013  3.5  Mod: Change user quota                            #
# MdB	08-04-2014  3.6  Mod: Some (RHEL6) mod's & remove TOLL
#                                                                          #
#--------------------------------------------------------------------------#
set +x
#set -x
#--------------------------------------------------------------------------#
# Initialize variabels                                                     #
#--------------------------------------------------------------------------#
PGM="`basename ${0}|cut -d\. -f1`"
VERSION="3.6"
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="[?]*"
TOLL=""
MAIL=""
USERQ=""
VERBOSE=""

# 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 "    -u        : add User quota-info"
  echo "    --mailto  : change MAILTO address & do send mail (${MAILTO})"
  echo "    -v        : Verbose (gives some progres information)"
  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 ;;
    -u) USERQ=1 ;;
    -m | --mail) MAIL=1 ;;
    -h | --help) USAGE; exit 1 ;;
    -V) echo "${PGM}: v${VERSION}"; exit 3 ;;
    -v) VERBOSE="1";;
    -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}" != '[?]*' ]; 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 "PGM=${PGM}"
echo "TOLL=${TOLL}"
echo "USERQ=${USERQ}"
echo "VERBOSE=${VERBOSE}"
echo "VERSION=${VERSION}"

#  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];SnapShot Used [KB];Used [%];Qtree Name;Qtree Style+Status;Qtree Used [KB];Qtree Quota [KB];Qtree Used [%];CIFS Share;Clients RW;Clients Root;ID;Quota Specifier;Used Files;" > ${FILE}

for FILER in `cat ${FILERS}|grep -v ^\#|grep ${FILTER}|awk -F\; '{print $1}'`
do
  for VFILER in `${SSH} ${FILER} vfiler status|grep running|grep ${CUSTCODE}|awk '{print $1}'`
  do
    if [ ${VERBOSE} ]; then
      echo "${FILER}/${VFILER}"
    fi
    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}
    if [ "${USERQ}" ]; then
      ${SSH} ${FILER} vfiler run ${VFILER} quota report -x 1> ${DATADIR}/quota${VFILER}
    else
      ${SSH} ${FILER} vfiler run ${VFILER} quota report -x | grep "tree  " 1> ${DATADIR}/quota${VFILER}
    fi
    ${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 } '`
        for QUOTADEFS in $(cat ${DATADIR}/quota${VFILER} | grep " ${VOLUME} " ${DATADIR}/quota${VFILER}|grep " ${QTREE2} "|awk '{ print $5 ";" $6 ";" $8 ";" $2 ";" $10 }' )
        do
          QUOTAUSE=`echo ${QUOTADEFS} | awk -F";" '{ print $1 }'`
          QUOTASET=`echo ${QUOTADEFS} | awk -F";" '{ print $2 }'`
          USEDFILES=`echo ${QUOTADEFS} | awk -F";" '{ print $3 }'`
          ID=`echo ${QUOTADEFS} | awk -F";" '{ print $4 }'`
          QUOTASPEC=`echo ${QUOTADEFS} | awk -F";" '{ print $5 }'`
          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}";"${ID}";"${QUOTASPEC}";"${USEDFILES} >> ${FILE}
        done
      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"; ;"$3";"$5";" }' >> ${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` " >>${FILE}
echo "# by ${HOSTNAME}:${PGM} v${VERSION} " >>${FILE}
echo "# with Customer selection ${CUSTCODE} " >>${FILE}
echo "# 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
  RHREL="`/bin/rpm -qa|grep redhat-release|cut -d\- -f4| grep -i server`"
  if [ "${RHREL}" = "5Server" ]; then
    cat ${FILE}|uuencode ${CSVFILE}|mailx -s "${SUBJECT}" ${MAILTO}
  fi
  if [ "${RHREL}" = "6Server" ]; then
    cp ${FILE} /tmp/${CSVFILE}
    echo "${PGM}:${ZIPFILE} [${PGM} v${VERSION}] at `date`"|mailx -s "@${HOSTNAME}: FSOD Qtree report ${CUSTOMER} ${DATE} [${PGM} v${VERSION}]" -a /tmp/${CSVFILE} ${MAILTO}
  fi
  echo "`date` Mailed ${CSVFILE} to ${MAILTO} (${SUBJECT}) "|tee -a ${LOG}
fi

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

