
#!/bin/sh
# File	: proc_ssh_input.sh
# By	: Maarten.deBoer@Atos.net, 180724
# Subject	: Script to receive info from SSH
#(0.2),180724	: Added heartbeat
#(0.3),180725	: Added, ${TMP}, FILTERS
#(0.4),180725	: Added CLUSTERS to find the SVM
#(0.5),180726	: Added COMMENT in 2nd position
#(0.6),180726	: Remove ^# before while & check stdin
#(0.7),180726	: Added VERSION, Mod. 'list'
#(0.8),180726	: Added (cDOT).cmd file in data/, QTREE_FILTER
#(0.9),180731	: Changed aggr. Can also be left out
#(0.10),180913	: Mod. Enabling the LIST command
#(0.11),180913	: Mod. `date` in LOG
#(0.12),180913	: Add show-lif
#(0.13),180913	: Add export-policy (list)
#(0.14),180913	: Add remove-export
#set -x
PGM=`basename $0|cut -d\. -f1`
VER="0.14"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
HBFILE="${HOME}/data/heartbeat"
PROCFILE="${HOME}/data/procfile"
CLUSTERS="${HOME}/etc/clusters"
SSH="/usr/bin/ssh -n"
OUT="${TMP}.out"
LAST="${HOME}/data/${PGM}.last"
STATUSENA="${HOME}/data/${PGM}.enable"
STATUSDIS="${HOME}/data/${PGM}.disable"
FSOD_CLUSTER_VSERVER_CSV="/home/aodfm01a/export/fsod-clusters-vservers.csv"
CMDFILE="${HOME}/data/${PGM}.cmd"
INFO="${HOME}/data/${PGM}.info"
DATADIR="${HOME}/data"

CLUSTER_FILTER="nlnaf[1-9][0-9][0-9]"
SVM_FILTER="nlnafs[a-z][a-z][a-z][0-9][0-9]"
SVM_FILTER="nlnafsmss[0-9][0-9]"
#SVM_FILTER="nlnafsuod[0-9][0-9]"
AGGR_FILTER="n[0-9][0-9][ace][0-9][0-9][0-9][0-9]"
LIF_FILTER="[a-z][a-z][a-z][0-9][0-9]-*"
LIF_FILTER="mss[0-9][0-9][-]*"
#LIF_FILTER="uod[0-9][0-9][-]*"
VOL_FILTER="[a-z][a-z][a-z][0-9][0-9]_vol[0-9][0-9][0-9][0-9][0-9]"
QTREE_FILTER="[a-zA-Z0-9]*"

USAGE()
{
  echo "  USAGE:"
  echo "    input using stdin. "
  echo "      Like (local): 'echo <text> | ${PGM}.sh' OR 'cat <file> | ${PGM}.sh'"
  echo "      Like (remote): 'echo <text> | ssh <user>@<host>' OR 'cat <file> | ssh <user>@<host>'"
  echo "    syntax: '<cmd> ; <comment> ; <svm> ; <aggr>|* ; <volume>|* ; <qtree> ; <export-policy> ; <new_size> ; '"
  echo "    cmd:"
  echo "      - help"
  echo "      - version"
  echo "      - heartbeat"
  echo "      - status"
  echo "      - list (list;[<comment>];<svm>;[<aggr>|*];<volume>|*;[<qtree>];[<export-policy-name>])"
  echo "      - show-lif (show-lif;[<comment>];[<svm>];<lif_name>)"
  echo "      - remove-export (remove-export;[<comment>];<svm>;*;<volume>;<qtree_name>;<export-policy-name>)"
  echo "  [${PGM} v${VER}]"
}


# If a (local)tty (interactive, 0), then exit
tty -s
EC=${?}
if [ ${EC} -eq 0 ]; then
# Check remote (ssh) interactive
  echo "  ERROR: ${PGM} is NOT interactive. Use stdin for input [${PGM} v${VER}]. Exiting ..."
  echo
  USAGE
  exit 1
fi

# empty ${LAST} before start
cp /dev/null ${LAST}
echo "`date +%Y-%m-%d' '%H:%M:%S` ${PGM} v${VER} started."|tee -a ${LOG} ${LAST}
touch ${TMP} ${OUT} 
# Empty CMD-file
cp /dev/null ${CMDFILE}

# Layout:
# <cmd> ; <comment> ; <svm> ; <aggr> ; <volume> ; <qtree> ; <export-policy> ; <new_size> ; 
# - help 
# - heartbeat 
# - list
# - remove
# - unremove;

grep -v ^# |while read LINE
do
  echo "--LINE:${LINE}" >> ${LAST}
  IN_CMD=`echo ${LINE}|awk -F\; '{print $1}'`
  IN_COMMENT=`echo ${LINE}|awk -F\; '{print $2}'`
  IN_SVM=`echo ${LINE}|awk -F\; '{print $3}'`
  IN_AGGR=`echo ${LINE}|awk -F\; '{print $4}'`
  IN_VOL=`echo ${LINE}|awk -F\; '{print $5}'`
  IN_QTREE=`echo ${LINE}|awk -F\; '{print $6}'`
  IN_EXPORT_POLICY=`echo ${LINE}|awk -F\; '{print $7}'`
  IN_NEW_SIZE=`echo ${LINE}|awk -F\; '{print $8}'`

  # do, when IN_CMD is not empty

  if [ "${IN_CMD}" != "" ]; then
    case ${IN_CMD} in
      help)
        USAGE
        echo "  HELP: "|tee -a ${LOG} ${LAST}
        ;;
      version)  echo "  VERSION: ${VER} [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} ;;
      heartbeat)  echo "  HEARTBEAT: OK (`date +%Y-%m-%d-%H-%M-%S`) [${PGM} v${VER}]"|tee -a ${LOG} ${LAST}|tee ${HBFILE} ;;
      status)  
        if [ -f ${STATUSENA} ]; then
          echo "  STATUS: ENAbled. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
        fi
        if [ -f ${STATUSDIS} ]; then
          echo "  STATUS: DISabled. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
        fi
        if [ ! -f ${STATUSENA} ] && [ ! -f ${STATUSDIS} ]; then
          echo "  STATUS: NO (file)found. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
        fi
        ;;
# LIST
      list) 
        # Check 1st if ENAbled
        if [ -f ${STATUSENA} ]; then
          # Checks against FILTERs
          SVM=`echo "${IN_SVM}"|grep "${SVM_FILTER}"`
          AGGR=`echo "${IN_AGGR}"|grep "${AGGR_FILTER}"`
          if [ "${IN_AGGR}" = "*" ]; then
            AGGR="*"
          fi  # *
          VOL=`echo "${IN_VOL}"|grep "${VOL_FILTER}"`
          if [ "${IN_VOL}" = "*" ]; then
            VOL="*"
          fi  # *
          QTREE=`echo "${IN_QTREE}"`
          EXPORT_POLICY=`echo "${IN_EXPORT_POLICY}"`
          if [ "${IN_EXPORT_POLICY}" = "*" ]; then
            EXPORT_POLICY="*"
          fi  # *

          echo "  LIST: of SVM=${SVM}  AGGR=${AGGR}  VOL=${VOL} (QTREE=${QTREE}) (EXPORT_POLICY=${EXPORT_POLICY}) "|tee -a ${LAST}
          # Check is SVM if not empty
          if [ "${SVM}" != "" ] && [ "${VOL}" != "" ]; then
            # find the SVM at a cluster, using the CSV-file AND check against CLUSTER_FILTER
            if [ -f ${FSOD_CLUSTER_VSERVER_CSV} ]; then
              CLUSTER=`grep "${SVM}" ${FSOD_CLUSTER_VSERVER_CSV}|awk -F\; '{print $1}'|grep ${CLUSTER_FILTER}|head -1`
              if [ "${CLUSTER}" != "" ]; then
                echo "    CLUSTER=${CLUSTER}"|tee -a ${LAST}
                # show aggr, when not empty
                if [ "${AGGR}" != "" ]; then
                  echo "$ ${SSH} ${CLUSTER} 'set -showseparator \";\" ; aggr show -aggregate ${AGGR} -field node,aggregate' | grep ${CLUSTER}"|tee -a ${CMDFILE} ${LOG} ${LAST} > /dev/null
                  echo "---------- aggr (aggregate;node;node;) ---------"|tee -a ${LAST}
                  ${SSH} ${CLUSTER} "set -showseparator \";\" ; aggr show -aggregate ${AGGR} -field node,aggregate" | grep ${CLUSTER}|tee -a ${LAST}
                  EC=${?}
                  echo "---------- (EC=${EC}) ----------"|tee -a ${CMDFILE} ${LAST}
                fi  # AGGR
                # show vol, when not empty
                if [ "${VOL}" != "" ]; then
                  echo "$ ${SSH} ${CLUSTER} 'set -showseparator \";\" ; volume show -vserver ${SVM} -volume ${VOL} -field volume' | grep ${SVM}"|tee -a ${CMDFILE} ${LOG} ${LAST} > /dev/null
                  echo "---------- volume (vserver;volume) ---------"|tee -a ${LAST}
                  ${SSH} ${CLUSTER} "set -showseparator \";\" ; volume show -vserver ${SVM} -volume ${VOL} -field volume" | grep ${SVM}|tee -a ${LAST}
                  EC=${?}
                  echo "---------- (EC=${EC}) ----------"|tee -a ${CMDFILE} ${LAST}
                fi  # VOL
                # show qtree, when QTREE not empty
                if [ "${QTREE}" != "" ]; then
                  echo "$ ${SSH} ${CLUSTER} 'set -showseparator \";\" ; qtree show -vserver ${SVM} -volume ${VOL} -qtree ${QTREE} -field qtree,volume,export'|grep ${SVM}"|tee -a ${CMDFILE} ${LOG} ${LAST} > /dev/null
                  echo "---------- qtree (vserver;volume;qtree;export-policy) ----------"|tee -a ${LAST}
                  ${SSH} ${CLUSTER} "set -showseparator \";\" ; qtree show -vserver ${SVM} -volume ${VOL} -qtree ${QTREE} -field qtree,volume,export"|grep ${SVM}|tee -a ${LAST}
                  EC=${?}
                  echo "---------- (EC=${EC}) ----------"|tee -a ${CMDFILE} ${LAST}

                fi  # QTREE
# Export-policy 
                if [ "${EXPORT_POLICY}" != "" ]; then
                  echo "$ ${SSH} ${CLUSTER} 'set -showseparator \";\" ; export-policy rule show -vserver ${SVM} -policy ${EXPORT_POLICY} -field policy,client'|grep ${SVM}"|tee -a ${CMDFILE} ${LOG} ${LAST} > /dev/null
                  echo "---------- export-policy (vserver;policyname;ruleindex;clientmatch;) ----------"|tee -a ${LAST}
                  ${SSH} ${CLUSTER} "set -showseparator \";\" ; export-policy rule show -vserver ${SVM} -policy ${EXPORT_POLICY} -field policy,client"|grep ${SVM}|tee -a ${LAST} 
                  EC=${?}
                  echo "---------- (EC=${EC}) ----------"|tee -a ${CMDFILE} ${LAST}
                fi  # Export-policy
              else
                echo "  ERROR: cDOT-cluster-name NOT found for SVM (${SVM}). Cannot proceed with 'list'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
              fi  # CLUSTER
            else
              echo "  ERROR: FSOD_CLUSTER_VSERVER_CSV (${FSOD_CLUSTER_VSERVER_CSV}) NOT found. Cannot proceed with 'list'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
            fi  # FSOD_CLUSTER_VSERVER_CSV
          else
            echo "  ERROR: Var SVM or VOL is empty. Maybe due to filters (${SVM_FILTER}, ${AGGR_FILTER}, ${VOL_FILTER}) at input (${IN_SVM}, ${IN_AGGR}, ${IN_VOL}). Cannot proceed with 'list'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
          fi  # SVM != ""
        else
          echo "  ERROR: ${PGM} NOT ENAbled. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
        fi  # ENAbled
        ;;
# show-lif
      show-lif)
        # Check 1st if ENAbled
        if [ -f ${STATUSENA} ]; then
          # Checks against FILTERs
          SVM=`echo "${IN_SVM}"|grep "${SVM_FILTER}"`
          if [ "${IN_SVM}" = "*" ]; then
            SVM="*"
          fi  # *
          LIF=`echo "${IN_AGGR}"|grep "${LIF_FILTER}"`
          # Check if SVM & LIF if not empty
          if [ "${SVM}" != "" ] && [ "${LIF}" != "" ]; then
            echo "  SHOW-LIF: of SVM=${SVM}  LIF=${LIF}"|tee -a ${LAST}
# Get SVM-part from LIF-name
            SVM_PART=`echo ${LIF}|cut -d\- -f1`
# If SVM is *, then use LIF for getting CLUSTERNAME. Else use SVM name
            if [ -f ${FSOD_CLUSTER_VSERVER_CSV} ]; then
              if [ "${SVM}" = "*" ]; then
                CLUSTER=`grep "${SVM_PART}" ${FSOD_CLUSTER_VSERVER_CSV}|awk -F\; '{print $1}'|grep ${CLUSTER_FILTER}|head -1`
              else
                CLUSTER=`grep "${SVM}" ${FSOD_CLUSTER_VSERVER_CSV}|awk -F\; '{print $1}'|grep ${CLUSTER_FILTER}|head -1`
              fi  # if  "${SVM}" = "*"
              if [ "${CLUSTER}" != "" ]; then
                echo "    CLUSTER=${CLUSTER}"|tee -a ${LAST}
# show-lif: cmd
                echo "$ ${SSH} ${CLUSTER} 'set -showseparator \";\" ; network interface show -vserver ${SVM} -lif ${LIF} -field vserver,address'|grep ${LIF}"|tee -a ${CMDFILE} ${LOG} ${LAST} 
                echo "---------- lif ----------"|tee -a ${LAST}
                ${SSH} ${CLUSTER} "set -showseparator \";\" ; network interface show -vserver ${SVM} -lif ${LIF} -field vserver,address"|grep ${LIF}|tee -a ${LAST} 
                echo "---------- (EC=${EC}) ----------"|tee -a ${CMDFILE} ${LAST}


              else
                echo "  ERROR: cDOT-cluster-name NOT found for SVM (${SVM}). Cannot proceed with 'list'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
              fi  # CLUSTER
            else
              echo "  ERROR: FSOD_CLUSTER_VSERVER_CSV (${FSOD_CLUSTER_VSERVER_CSV}) NOT found. Cannot proceed with 'list'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
            fi  # FSOD_CLUSTER_VSERVER_CSV
          else
            echo "  ERROR: Var SVM or LIF is empty. Maybe due to filters (${SVM_FILTER}, ${LIF_FILTER}) at input (${IN_SVM}, ${IN_AGGR}). Cannot proceed with 'show-lif'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
          fi  # SVM != ""

        else
          echo "  ERROR: ${PGM} NOT ENAbled. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
        fi  # ENAbled
        ;;

# remove-export
      remove-export)
        # Check 1st if ENAbled
        if [ -f ${STATUSENA} ]; then
          # Checks against FILTERs
          SVM=`echo "${IN_SVM}"|grep "${SVM_FILTER}"`
          AGGR=""
          VOL=`echo "${IN_VOL}"|grep "${VOL_FILTER}"`
          QTREE=`echo "${IN_QTREE}"`
          EXPORT=`echo "${IN_EXPORT_POLICY}"`

          # Check if SVM , VOL, QTREE, EXPORT if not empty
          if [ "${SVM}" != "" ] && [ "${VOL}" != "" ] && [ "${QTREE}" != "" ] && [ "${EXPORT}" != "" ]; then
            echo "  REMOVE-EXPORT: of SVM=${SVM} VOL=${VOL} QTREE=${QTREE} EXPORT=${EXPORT}"|tee -a ${LAST}
            if [ -f ${FSOD_CLUSTER_VSERVER_CSV} ]; then
              CLUSTER=`grep "${SVM}" ${FSOD_CLUSTER_VSERVER_CSV}|awk -F\; '{print $1}'|grep ${CLUSTER_FILTER}|head -1`
              if [ "${CLUSTER}" != "" ]; then
                echo "    CLUSTER=${CLUSTER}"|tee -a ${LAST}
                ${SSH} ${CLUSTER} "set -showseparator \";\" ;qtree show -vserver ${SVM} -volume ${VOL} -qtree ${QTREE} -export-policy ${EXPORT} -field export-policy" 1> ${TMP} 2>&1
                EC=${?}
                if [ ${EC} -eq 0 ]; then
                  echo "  saving info ..."
                  DATI=`date +%Y-%m-%d-%H-%M-%S`
                  DATAFILE="${DATADIR}/${SVM}-${VOL}-${QTREE}_export-policy-rule_${DATI}.asc"
                  echo "# DATI=${DATI}" > ${DATAFILE}
                  echo "# CLUSTER=${CLUSTER}" >> ${DATAFILE}
                  echo "# SVM=${SVM}" >> ${DATAFILE}
                  echo "# VOL=${VOL}" >> ${DATAFILE}
                  echo "# QTREE=${QTREE}" >> ${DATAFILE}
                  echo "# EXPORT=${EXPORT}" >> ${DATAFILE}
                  ${SSH} ${CLUSTER} "set -showseparator \";\" ; export-policy rule show -vserver ${SVM} -policy ${EXPORT} -field policy,client"|grep ${SVM} 1>> ${DATAFILE}

# Removing the export-rule
# By changing to none

                  ${SSH} ${CLUSTER} "export-policy show -vserver ${SVM} -policyname none"
                  EC=${?}
# if no "none" policy (EC<>0) then create
                  if [ ${EC} -ne 0 ]; then
                    ${SSH} ${CLUSTER} "export-policy create -vserver ${SVM} -policyname none"
                  fi  # ${EC} -ne 0
                  ${SSH} ${CLUSTER} "export-policy rule show -vserver ${SVM} -policyname none"
                  EC=${?}
# if no "none" policy (EC<>0) then create
                  if [ ${EC} -ne 0 ]; then
                    ${SSH} ${CLUSTER} "export-policy rule create -vserver ${SVM} -policyname none -clientmatch 255.255.255.255/32 -rorule sys -rwrule none -superuser none -protocol any "

                  fi  # ${EC} -ne 0
                  ${SSH} ${CLUSTER} "qtree modify -vserver ${SVM} -volume ${VOL} -qtree ${QTREE} -export-policy none" 

                  ${SSH} ${CLUSTER} "set -showseparator \";\" ; export-policy rule show -vserver ${SVM} -policy ${EXPORT} -field policy,client"

                else
                  echo "  ERROR: SVM,Volume,Qtree,Export-policy information NOT correct (${SVM} ${VOL} ${QTREE} ${EXPORT}). Cannot proceed with 'remove-export'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
                  cat ${TMP} >> ${LAST}
                fi  # EC=0
              else
                echo "  ERROR: cDOT-cluster-name NOT found for SVM (${SVM}). Cannot proceed with 'list'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
              fi  # CLUSTER
            else
              echo "  ERROR: FSOD_CLUSTER_VSERVER_CSV (${FSOD_CLUSTER_VSERVER_CSV}) NOT found. Cannot proceed with 'list'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
            fi  # FSOD_CLUSTER_VSERVER_CSV
          else
            echo "  ERROR: Var SVM, VOL, QTREE & EXPORT are empty. Maybe due to filters (${SVM_FILTER}, ${VOL_FILTER}) at input (${IN_SVM}, ${IN_VOL}, ${IN_QTREE}, ${IN_EXPORT_POLICY}). Cannot proceed with 'remove-export'. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
          fi  # SVM != ""

        else
          echo "  ERROR: ${PGM} NOT ENAbled. [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
        fi  # ENAbled
        ;;







# WILDCARD
      *) echo "  ERROR: ${IN_CMD} = wrong command. Use 'help' for more info (`date +%Y-%m-%d-%H-%M-%S`) [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} ;;
    esac
  fi  # if .. != ""

done

rm ${TMP}
echo "`date +%Y-%m-%d' '%H:%M:%S` ${PGM} v${VER} finished."|tee -a ${LOG} ${LAST}
exit 0

