
#!/bin/sh
# File	: proc_automation-mail.sh
# By	: MaartenDeBoer.nl, 210615, 230808
# Subject	: Script to process automation by mail
# From proc_mail-subjects.sh
#(0.2),230808	: Old name proc_mail-automation.sh
#(0.3),230809	: Update
#(0.4),230809	: Add FILTERs
#(0.5),230810	: Check incomming FROM mail address, FROM_ALLOWED
#(0.6),230810	: Upd Help text & Info
#(0.7),230810	: Added RCFILE
# ToDos: 
# process)
# extend check)
# add RCFILE (for FILERs)
#
PGM=`basename $0|cut -d\. -f1`
VER="0.7"
TMP="/tmp/${PGM}.$$"
BASEDIR="${HOME}/automation"
LOG="${BASEDIR}/log/${PGM}.log"
RCFILE="${BASEDIR}/etc/${PGM}.rc"
HOSTNAME=`hostname|cut -d\. -f1`

ETCDIR="${BASEDIR}/etc"
DATADIR="${BASEDIR}/data"
INDIR="${DATADIR}/in"
DONEDIR="${DATADIR}/done"
SUBJECT=""
CHECK=""
MAIL=""
COMMAND=""
FROM=""
DATI=`date +%Y-%m-%d-%H-%M-%S`
NO_MOVE=""
FROM_ALLOWED="${ETCDIR}/${PGM}.allowed"
PRE_SUBJ="[nl-fsod] Automation"
MAILTO="maarten.deboer@atos.net"

# Filers for Clusters, SVMs, Volumes
CFILTER="[?]*"
CFILTER="nlnaf100"
SFILTER="[?]*"
SFILTER="nlnafs*"
VFILTER="[?]*"
VFILTER="avi*"
# n07a3801
AFILTER="[?]*"
AFILTER="n[0-9][0-9]a380[1-9]"


USAGE()
{
  echo "Usage: ${PGM} <options>"
  echo "  Version: ${VER}"
  echo "  options               :"
  echo "    -h | --help         : this help"
  echo "    -f | --from         : From"
  echo "    -s | --subject      : Subject"
  echo "    --no-move           : do NOt move from DATA/IN to DATA/DAONE (for testing purpose)"
  echo "    -V                  : Version"
  echo "    -x                  : set -x"
}
if [ ${#} -lt 1 ]; then
  echo "  Do NOT know what to do. Exiting ..."
  USAGE
  exit 1
fi
if [ -f ${RCFILE} ]; then
  echo "  RCFILE (${RCFILE}) found. Using it" | tee -a ${LOG}
  . ${RCFILE}
fi  # RCFILE
while [ ${#} -ge 1 ]
  do
  case ${1} in
    -f | --from) FROM="${2}"; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -s | --subject) SUBJECT="${2}"; shift ;;
    --no-move) NO_MOVE=1 ;;
    -V) echo "${PGM}: v${VER}"; exit 2 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done

echo "`date` ${PGM} v${VER} started."|tee -a ${LOG}
echo "  FROM=${FROM}|" |tee -a ${LOG}
echo "  SUBJECT=${SUBJECT}|" |tee -a ${LOG}
touch ${TMP}

if [ ! -d ${DATADIR} ]; then
  mkdir -p ${DATADIR}
  echo "  Dir. ${DATADIR} created."|tee -a ${LOG}
fi
if [ ! -d ${INDIR} ]; then
  mkdir -p ${INDIR}
  echo "  Dir. ${INDIR} created."|tee -a ${LOG}
fi
if [ ! -d ${DONEDIR} ]; then
  mkdir -p ${DONEDIR}
  echo "  Dir. ${DONEDIR} created."|tee -a ${LOG}
fi

# When CHECK=1, then no FROM is needed.
if [ ! ${CHECK} ] && [ "${FROM}" = "" ]; then
  echo "  NO FROM-address ($FROM}). So, no idea to answer to. Exiting ..."|tee -a ${LOG}
  exit 3
fi

# If FROM_ALLOWED does not exist. Create (empty) one
if [ ! -f ${FROM_ALLOWED} ]; then
  touch ${FROM_ALLOWED}
  echo "  NO FROM_ALLOWED (${FROM_ALLOWED}) found. Created one."|tee -a ${LOG}
fi
# Check if FROM address is allowed
ANSW=`grep -i "${FROM}" ${FROM_ALLOWED} |grep -v ^#`
if [ "${ANSW}" = "" ]; then
  ANSW=`echo ${FROM}|egrep "\@atos.net|\@eviden.com"`
  if [ "${ANSW}" != "" ]; then
# Is from Atos.net / Eviden.com, so answer. Otherwise not, but only MAILTO
    echo "Sorry, you're not allowed to send mail to this APPL. Please contact ${MAILTO} for assistance. [${PGM} v${VER}]"| mailx -s "${PRE_SUBJ} Not allowed." "${FROM} ${MAILTO}"
  else
    echo "${FROM} tried to mail to [${PGM} v${VER}]"| mailx -s "${PRE_SUBJ} Not allowed." "${MAILTO}"
  fi  # ANSW}" != "" 
  echo "  ${FROM} not allowed to send mails to this APPL. Mailed & Exit(4)" | tee -a ${LOG}
  exit 4
fi


# Check if " } " is in the SUBJECT. Then is COMMAND. And NOT to be stored
ANSW=`echo ${SUBJECT}|grep ':'`
# When a CMD (in ANSW) and a FROM-address
if [ "${ANSW}" != "" ] && [ "${FROM}" != "" ]; then
  COMMAND=`echo ${SUBJECT}|cut -d\: -f2-|tr [:upper:] [:lower:]|sed 's/ //g'`
  echo "    COMMAND=${COMMAND}|"|tee -a ${LOG}
  case ${COMMAND} in
# ----------------
    help)
      echo "nl-fsod: <commands> " > ${TMP}
      echo "  help : this help." >> ${TMP}
      echo "  info : Information about the APPLication." >> ${TMP}
      echo "  list : the INDIR." >> ${TMP}
      echo "  check : the attached CSV file(s)." >> ${TMP}
      echo "" >> ${TMP}
      cat ${TMP}| mailx -s "${PRE_SUBJ} Commands: " ${FROM}
      echo "  Mailed commands to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}
    ;;
#
# ----------------
    info)
      echo "info:" > ${TMP}
      echo "This APPLication is the front-end of the NetApp automation." >> ${TMP}
      echo "It processes the attached CSV-files." >> ${TMP}
      echo "And, when no failures, sends the info (from the CSV-file) to the Ansible part of the NetApp-automation" >> ${TMP}
      echo "Commands are given via the mail-subject (after the : )." >> ${TMP}
      echo "" >> ${TMP}
      echo "---" >> ${TMP}
      echo "`date` ${PGM} v${VER} @ ${HOSTNAME}" >> ${TMP}

      cat ${TMP}| mailx -s "${PRE_SUBJ} Info: " ${FROM}
      echo "  Mailed Info to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}
    ;;
# ----------------
    list)
      echo "list:" > ${TMP}
      ls -lr ${INDIR} >> ${TMP}

      cat ${TMP}| mailx -s "${PRE_SUBJ} List: " ${FROM}
      echo "  Mailed List to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}
    ;;
# ----------------
    check)
      echo "  Checking ${INDIR}" >> ${LOG}
      echo "Checking:" >> ${TMP}

      echo "  C(luster)FILTER=${CFILTER}" >> ${TMP}
      echo "  S(vm)FILTER=${SFILTER}" >> ${TMP}
      echo "  V(olume)FILTER=${VFILTER}" >> ${TMP}
      echo "  A(aggr)FILTER=${AFILTER}" >> ${TMP}
      echo "" >> ${TMP}
      cd ${INDIR}
# remove "text"-files 1st
      rm textfile* 
      ls -1 *.csv|while read INFILE
      do
        echo "  ${INFILE} :" |tee -a ${TMP} >> ${LOG}
        CH_NR=`echo "${INFILE}"| cut -d\_ -f1|grep ^CH`
        if [ "${CH_NR}" != "" ]; then
# 1st part of file name = CHange-nr
          NL_FSOD_FNAME=`echo "${INFILE}"| cut -d\_ -f2-|grep ^nl-fsod`
        else
          NL_FSOD_FNAME=`echo "${INFILE}"| cut -d\_ -f1-|grep ^nl-fsod`
        fi  # CH_NR}" != ""
        echo "    CH_NR=${CH_NR} NL_FSOD_FNAME=${NL_FSOD_FNAME}" >> ${LOG}

        LINE_CNT=0
        cat ${INFILE}|grep -v ^#|while read LINE
        do
# (1)NAO_CLUSTERNAME;(2)NAO_SVM_NAME;(3)NAO_VOL_NAME;(4)NAO_VOL_AGGR_NAME;(5)NAO_VOL_STOR_CLASS;(6)NAO_VOL_SIZE;(7)NAO_VOL_SIZE_UNIT;(8)NAO_VOL_TYPE;(9)ATOS_CHANGE_NR;(10)NAO_QTREE_NAME;(11)NAO_QUOTA_DISK_LIMIT;(12)NAO_QTREE_SECURITY_STYLE;(13)NAO_QTREE_EXPORT_POLICY;
#
          NAO_CLUSTERNAME=`echo ${LINE}|awk -F\; '{print $1}'|grep "${CFILTER}"`
          NAO_SVM_NAME=`echo ${LINE}|awk -F\; '{print $2}'|grep "${SFILTER}"`
          NAO_VOL_NAME=`echo ${LINE}|awk -F\; '{print $3}'|grep "${VFILTER}"`
          NAO_VOL_AGGR_NAME=`echo ${LINE}|awk -F\; '{print $4}'|grep "${AFILTER}"`
          NAO_VOL_STOR_CLASS=`echo ${LINE}|awk -F\; '{print $5}'`
          NAO_VOL_SIZE=`echo ${LINE}|awk -F\; '{print $6}'`
          NAO_VOL_SIZE_UNIT=`echo ${LINE}|awk -F\; '{print $7}'`
          NAO_VOL_TYPE=`echo ${LINE}|awk -F\; '{print $8}'`
          ATOS_CHANGE_NR=`echo ${LINE}|awk -F\; '{print $9}'`
          NAO_QTREE_NAME=`echo ${LINE}|awk -F\; '{print $10}'`
          NAO_QUOTA_DISK_LIMIT=`echo ${LINE}|awk -F\; '{print $11}'`
          NAO_QTREE_SECURITY_STYLE=`echo ${LINE}|awk -F\; '{print $12}'`
          NAO_QTREE_EXPORT_POLICY=`echo ${LINE}|awk -F\; '{print $13}'`
       
          LINE_CNT=`expr ${LINE_CNT} + 1`

          if [ "${NAO_CLUSTERNAME}" = "" ]; then
             echo "    NAO_CLUSTERNAME(1) = empty (${LINE_CNT})" |tee -a ${TMP}
          fi
          if [ "${NAO_SVM_NAME}" = "" ]; then
             echo "    NAO_SVM_NAME(2) = empty (${LINE_CNT})" |tee -a ${TMP}
          fi
          if [ "${NAO_VOL_NAME}" = "" ]; then
             echo "    NAO_VOL_NAME(3) = empty (${LINE_CNT})" |tee -a ${TMP}
          fi
          if [ "${NAO_VOL_AGGR_NAME}" = "" ]; then
             echo "    NAO_VOL_AGGR_NAME(4) = empty (${LINE_CNT})" |tee -a ${TMP}
          fi
          if [ "${NAO_VOL_STOR_CLASS}" = "" ]; then
             echo "    NAO_VOL_STOR_CLASS(5) = empty (${LINE_CNT})" |tee -a ${TMP}
          fi

          echo "    (${LINE_CNT}):${NAO_CLUSTERNAME};${NAO_SVM_NAME};${NAO_VOL_NAME};${NAO_VOL_AGGR_NAME};${NAO_VOL_STOR_CLASS};${NAO_VOL_SIZE};${NAO_QTREE_NAME};"

          echo ${LINE_CNT} > ${TMP}.line_cnt
        done  # LINEA
        LINE_CNT=`cat ${TMP}.line_cnt`
        echo "    ${LINE_CNT} line(s) found." >> ${TMP}
        
        echo "    Moving to ${DONEDIR}" >> ${LOG}
        if [ ! ${NO_MOVE} ]; then
          mv ${INFILE} ${DONEDIR}/${DATI}_${INFILE}
        fi  # NO_MOVE

      done  # .csv
      echo "---" >> ${TMP}
      echo "`date` ${PGM} v${VER} @ ${HOSTNAME}" >> ${TMP}
      cat ${TMP}| mailx -s "${PRE_SUBJ} Check: " ${FROM}
      echo "  Mailed Check to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}


    ;;
# ----------------
    *)
     echo "  Wrong command (${COMMAND}). Use \"nl-fsod: help\" in the subject for some help."|tee -a ${LOG}| mailx -s "${PRE_SUBJ} Wrong command." ${FROM}
     ;;
  esac
fi

# If NO COMMAND then store


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

