
#!/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
#(0.8),230810	: add check)-s
#(0.9),230814   : Add QFILTER
#(0.10),230814  : Add process) (part), Check, when ERROR, no action
#(0.11),230814	: Added RBAC, CUSTCODE
#(0.12),230814	:
# ToDos: 
# process) => Ansible
#
PGM=`basename $0|cut -d\. -f1`
VER="0.12"
TMP="/tmp/${PGM}.$$"
BASEDIR="${HOME}/automation"
LOG="${BASEDIR}/log/${PGM}.log"
RCFILE="${BASEDIR}/etc/${PGM}.rc"
HOSTNAME=`hostname|cut -d\. -f1`
SSH="/usr/bin/ssh -n"

ETCDIR="${BASEDIR}/etc"
DATADIR="${BASEDIR}/data"
INDIR="${DATADIR}/in"
REMDIR="${DATADIR}/remote"
DONEDIR="${DATADIR}/done"
SUBJECT=""
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"
NO_CHECK_ERR=1 
CUSTCODE=""
#REMHOST="ansible@nlxfsd18"
#REMHOST="ansible@161.89.52.125"
REMHOST="161.89.52.59"
REMINDIR="${REMHOST}:/home/ansible/automation/data/in"
REMSCRIPT="${REMHOST}:/home/ansible/automation/scripts/netapp-automation-menu.sh"
AP_DIR="/home/ansible/GIThub-atos-FIN/netapp-ontap-ansible"


# Filers for Clusters, SVMs, Volumes
CFILTER="[?]*"
SFILTER="[?]*"
VFILTER="[?]*"
VFILTER="mss*"
# n07a3801
AFILTER="[?]*"
QFILTER="[?]*"

# FUNCtions
CHECK()
{
  echo "  Checking:" >> ${TMP}
  NO_CHECK_ERR=""
  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
    echo ${LINE_CNT} > ${TMP}.line_cnt
    cat ${INFILE}|grep -v ^#|egrep "${CUSTCODE}"|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}'|grep "${QFILTER}"`
      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}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_SVM_NAME}" = "" ]; then
        echo "    NAO_SVM_NAME(2) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_VOL_NAME}" = "" ]; then
        echo "    NAO_VOL_NAME(3) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_VOL_AGGR_NAME}" = "" ]; then
        echo "    NAO_VOL_AGGR_NAME(4) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_VOL_STOR_CLASS}" = "" ]; then
        echo "    NAO_VOL_STOR_CLASS(5) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_VOL_SIZE}" = "" ]; then
        echo "    NAO_VOL_SIZE(6) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_VOL_SIZE_UNIT}" = "" ]; then
        echo "    NAO_VOL_SIZE_UNIT(7) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_VOL_TYPE}" = "" ]; then
        echo "    NAO_VOL_TYPE(8) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${ATOS_CHANGE_NR}" = "" ]; then
        echo "    ATOS_CHANGE_NR(9) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_QTREE_NAME}" = "" ]; then
        echo "    NAO_QTREE_NAME(10) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_QUOTA_DISK_LIMIT}" = "" ]; then
        echo "    NAO_QUOTA_DISK_LIMIT(11) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_QTREE_SECURITY_STYLE}" = "" ]; then
        echo "    NAO_QTREE_SECURITY_STYLE(12) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      fi
      if [ "${NAO_QTREE_SECURITY_STYLE}" = "" ]; then
        echo "    NAO_QTREE_SECURITY_STYLE(13) = empty (${LINE_CNT})" |tee -a ${TMP}
        echo "1" >> ${TMP}.no_err_chk
      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}
  done  # .csv
  LINE_CNT=`cat ${TMP}.line_cnt`
  NO_CHECK_ERR=`cat ${TMP}.no_err_chk|sort -u`
  if [ ${LINE_CNT} -eq 0 ]; then
# When no (0) lines, then error
    NO_CHECK_ERR=1
    echo "    ${LINE_CNT} line(s) found (due to other CUSTCODE / FILTER(s). This is an ERROR." >> ${TMP}
  fi  # LINE_CNT = 0
}


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 no FROM then exit
if [ "${FROM}" = "" ]; then
  echo "  NO FROM-address ($FROM}). So, no idea to answer to. Exiting ..."|tee -a ${LOG}
  rm ${TMP}*
  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}
  rm ${TMP}*
  exit 4
fi


if [ -f ${RCFILE} ]; then
 echo "  RCFILE (${RCFILE}) found and used.">> ${TMP}
fi  # RCFILE
echo "" >> ${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 "  Q(tree)FILTER=${QFILTER}" >> ${TMP}
echo "" >> ${TMP}

# 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}
# Check allowence of CMD (RBAC)
# 3rd part of FROM_ALLOWED
  ANSW=`grep -i "${FROM}" ${FROM_ALLOWED}|grep -v ^#|awk -F\; '{print $3}'|tr [:upper:] [:lower:]|grep ${COMMAND}`
  if [ "${ANSW}" = "" ]; then
    echo "    COMMAND (${COMMAND}) is not allowed (RBAC) for ${FROM}." | tee -a ${LOG} ${TMP}
    echo "    Mail ${MAILTO} for assistance." | tee -a ${LOG} ${TMP}
    echo "    Exiting ..." | tee -a ${LOG} ${TMP}
    
    echo "---" >> ${TMP}
    echo "`date` ${PGM} v${VER} @ ${HOSTNAME}" >> ${TMP}
    cat ${TMP}| mailx -s "${PRE_SUBJ}: " ${FROM}
    echo "  Mailed Exit to ${FROM}"|tee -a ${LOG}
    rm ${TMP}*
    exit 5
  fi  # ANSW}" != "" 


  CUSTCODE=`grep -i "${FROM}" ${FROM_ALLOWED}|grep -v ^#|awk -F\; '{print $2}'|tr [:upper:] [:lower:]|sed 's/\,/|/g'`

  echo "  CUST(omer)CODE=${CUSTCODE}" >> ${TMP}
  echo "" >> ${TMP}

  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 "  process : 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}
      cd ${INDIR}
# remove "text"-files 1st
      rm textfile* 
      rm *.png
      rm *.jpg

      CHECK

      if [ ${NO_CHECK_ERR} ]; then
        echo "    ERRors found. Fix them 1st before processing can be done." | tee -a ${LOG} >> ${TMP}
      else
        echo "    NO ERRors found. So, can be processed." | tee -a ${LOG} >> ${TMP}
      fi
# Move INFILEs to DONE
      cd ${INDIR}
      ls -1 *.csv|while read INFILE
      do
        if [ ! ${NO_MOVE} ]; then
          echo "    Moving ${INFILE} to ${DONEDIR}" >> ${LOG}
          mv ${INFILE} ${DONEDIR}/${DATI}_${INFILE}
        fi  # NO_MOVE
      done  # INFILE

      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}
    ;;
# ----------------
    process)
      echo "  Processing ${INDIR}" |tee -a ${TMP} >> ${LOG}
# Check 1st
      CHECK
      if [ ${NO_CHECK_ERR} ]; then
        echo "    ERRors found. Fix them 1st before processing can be done." | tee -a ${LOG} >> ${TMP}
      else
# Processing
        echo "    NO ERRors found. So, processing." | tee -a ${LOG} >> ${TMP}
#        cd ${INDIR}
        ls -1 ${INDIR}/*.csv|while read INFILE
        do
#           scp -v ${INFILE} ${REMHOST}:/home/nl19471/automation/data/in/ 1>> ${LOG} 2>&1

           mv -v ${INFILE} ${REMDIR}/ 1>> ${LOG} 2>&1
           EC=${?}
           echo "      mv(${EC}) to ${REMDIR}/ "|tee -a ${LOG}

#          echo "put ${INFILE} /home/ansible/automation/data/in" > ${TMP}.sftp-bat
#          sftp -v -b ${TMP}.sftp-bat ansible@161.89.52.125 1>> ${LOG} 2>&1
#          EC=${?}
#          echo "      sFTPed(${EC}) -b ${TMP}.sftp-bat to ansible@161.89.52.125"|tee -a ${LOG}
#          rm ${TMP}.sftp-bat
        done  # INFILE
      fi  # <> NO_CHECK_ERR

## Move INFILEs to DONE
#      cd ${INDIR}
#      ls -1 *.csv|while read INFILE
#      do
#        if [ ! ${NO_MOVE} ]; then
#          echo "    Moving ${INFILE} to ${DONEDIR}" >> ${LOG}
#          mv ${INFILE} ${DONEDIR}/${DATI}_${INFILE}
#        fi  # NO_MOVE
#      done  # INFILE

      echo "---" >> ${TMP}
      echo "`date` ${PGM} v${VER} @ ${HOSTNAME}" >> ${TMP}
      cat ${TMP}| mailx -s "${PRE_SUBJ} Process: " ${FROM}
      echo "  Mailed Proces to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}
    ;;  # process)
# ----------------
    *)
     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

