
#!/bin/ksh
#set -x
# File	: proc_ssh_ansible.sh
# By	: Maarten.deBoer@Atos.net,180724, 221109
# Subject	: Script to receive info from SSH for Ansible-playbooks (from SAP-ART)
#(0.1),221109	: Copied from proc_ssh_input.sh, VOLUME
#(0.2),221110	: QTREE, QUOTA
#(0.3),221110	: NFS_EXPORT
#(0.4),221110	: SHOW-VOLUME
#(0.5),221116	: Upd: USAGE_ANSIBLE() and some help updates
#(0.6),221116	: Add; volume-delete
#(0.7),221116	: Add; SVM_POST
#(0.8),221122	: Add check ${1} = empty
#set -x
PGM=`basename $0|cut -d\. -f1`
VER="0.8"
TMP="/tmp/${PGM}.$$"
BASE="${HOME}"
LOG="${BASE}/log/${PGM}.log"
HBFILE="${BASE}/data/heartbeat"
CLUSTERS="${BASE}/etc/clusters"
SSH="/usr/bin/ssh -n"
OUT="${TMP}.out"
LAST="${BASE}/data/${PGM}.last"
STATUSENA="${BASE}/data/${PGM}.enable"
STATUSDIS="${BASE}/data/${PGM}.disable"
#FSOD_CLUSTER_VSERVER_CSV="${BASE}/export/fsod-clusters-vservers.csv"
CMDFILE="${BASE}/data/${PGM}.cmd"
INFO="${BASE}/data/${PGM}.info"
DATADIR="${BASE}/data"
# 14 days of retention of the DATADIR-data
DATADIRRET=14
# 14 days of retention of decommissioned qtrees
DAYRET=14
YEARDAY=`date '+%Y%j'`
SECUSTYLE="unix"
XC=0
HOSTNAME=`hostname|cut -d\. -f1`
RCFILE="${BASE}/etc/${PGM}.rc"
PLAYBOOK_DIR="/home/ansible/GIT/netapp-storage-container"
DATI=`date +%Y%m%d-%H%M%S`
SSH="/usr/bin/ssh -n"

# !! Can be set in RC-file !!
#CLUSTER_FILTER="nlnaf[1-9][0-9][0-9]"
CLUSTER_FILTER="nlnaf[1][0][23]"
#SVM_FILTER="nlnafs[a-z][a-z][a-z][0-9][0-9]"
SVM_FILTER="nlnafsmss1[89]"
#AGGR_FILTER="n[0-9][0-9][ace][0-9][0-9][0-9][0-9]"
AGGR_FILTER="n02a4001"
LIF_FILTER="[a-z][a-z][a-z][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]"
VOL_FILTER="mss1[89]_vol[0-9][0-9][0-9][0-9][0-9]"
#QTREE_FILTER="[a-zA-Z0-9]{1,-}"
QTREE_FILTER="*"
QTREE_STYLE_FILTER="unix|ntfs"
VOL_SIZE_FILTER="[0-9]{1,2}"
QUOTA_DISK_LIMIT_FILTER="[0-9]"
QTREE_EXPORT_ADDR_FILTER="^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,3}$"


USAGE_ANSIBLE()
{
  echo "  USAGE of the JSON-string:"
  echo "  JSON-string : {\"<variable1>\":\"<value1>\", \"<variable2>\":\"<value2>\" ...  } "
  echo "    variables: "
  echo "      \"ansible_ontap\" "
  echo "    values= "
  echo "      \"help\" "
  echo "      \"version\" "
  echo "      \"volume-update\" "
  echo "      \"volume-remove\" "
  echo "      \"qtree-update\" "
  echo "      \"quota-update\" "
  echo "      \"nfs-export-update\" "
#  echo "      \"volume-remove\" "
#  echo "      \"qtree-remove\" "
#  echo "      \"quota-remove\" "
#  echo "      \"nfs-export-remove\" "
  echo "  [${PGM} v${VER}]"
}

USAGE_CLI()
{
  echo "  USAGE of the JSON-string:"
  echo "  JSON-string : {\"<variable1>\":\"<value1>\", \"<variable2>\":\"<value2>\" ...  } "
  echo "    variables:"
  echo "      \"cli_ontap\" "
  echo "    values= "
  echo "      \"help\" "
  echo "      \"volume-show\" "
  echo "      \"qtree-show\" "
  echo "      \"quota-report\" "
  echo "      \"nfs-export-show\" "
  echo "  [${PGM} v${VER}]"
}

USAGE_CMD()
{
  echo "  USAGE of the JSON-string:"
  echo "  JSON-string : {\"<variable1>\":\"<value1>\", \"<variable2>\":\"<value2>\" ...  } "
  echo "    variables:"
  echo "      \"cmd\" "
  echo "    values= "
  echo "      \"filters\" "
  echo "      \"heartbeat\" "
  echo "      \"help\" "
  echo "      \"status\" "
  echo "      \"version\" "
  echo "  [${PGM} v${VER}]"
}

USAGE()
{
  echo "  USAGE:"
  echo "    input using stdin. "
  echo "      Like: ssh <user>@<host> 'JSON-string' "
  echo "    syntax: 'JSON-string = {\"<variable>\":\"<value>\", ...  } '"
  echo "      variable: "
  echo "        \"ansible_ontap\" "
  echo "        \"cli_ontap\" "
  echo "        \"cmd\" "
  echo "      values= "
  echo "        \"help\" "
  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(1): ${PGM} is NOT interactive. Use stdin for input [${PGM} v${VER}]. Exiting ..."
  echo "1" > ${TMP}.xc
  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} ${TMP}.xc
echo "255" > ${TMP}.xc
# Check existance RC-file
if [ -f ${RCFILE} ]; then
  echo "  RCfile (${RCFILE}) found. Reading ..."|tee -a ${LOG}
  . ${RCFILE}
fi
# Empty CMD-file
cp /dev/null ${CMDFILE}

# Layout:
# 'JSON-string : {\"<variable>\":\"<value>\", ...  } '"
# 'JSON-string : {\"ANSIBLE_ONTAP\":\"volume\", ...  } '"

#DEVICETYPE=`echo ${JSON_STR}|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i DEVICETYPE|awk -F\: '{print $2}'|sed 's/"//g'`

# Check ${1}

grep -v ^# |while read LINE
do
  echo "--LINE:${LINE}" >> ${LAST}
  if [ "${LINE}" = "" ]; then
    echo "  ERROR (99). NO input received."
    USAGE
    echo "99" > ${TMP}.xc
#  exit ${TMP}.xc
  fi  # ${LINE}

#  echo "--LINE:${LINE}"
  LINE_CMD=`echo "${LINE}"|cut -d\; -f1`
  PROC_CMD=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i cmd|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
  ANSIBLE_ONTAP=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i ansible_ontap|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
  CLI_ONTAP=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i cli_ontap|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`

#  echo "--LINE:${LINE} LINE_CMD=${LINE_CMD} (PROC_)CMD=${PROC_CMD} ANSIBLE_ONTAP=${ANSIBLE_ONTAP} CLI_ONTAP=${CLI_ONTAP}"

  # do, when IN_CMD is not empty

  CHK_LINE=`echo "${LINE}"|grep ^{`
  if [ "${LINE}" != "" ] && [ "${CHK_LINE}" = "" ]; then
    echo "  ERROR(99): JSON-string does NOT begin with { "
    USAGE
    echo "99" > ${TMP}.xc
  fi
  CHK_LINE=`echo "${LINE}"|grep }$`
  if [ "${LINE}" != "" ] && [ "${CHK_LINE}" = "" ]; then
    echo "  ERROR(99): JSON-string does NOT end with } "
    USAGE
    echo "99" > ${TMP}.xc
  fi
  if [ "${LINE_CMD}" = "help" ]; then
    echo "  HELP: "|tee -a ${LOG} ${LAST}
    USAGE
    echo "2" > ${TMP}.xc
  fi  # LINE_CMD

  if [ "${LINE}" != "" ] && [ "${PROC_CMD}" != "" ]; then
    case ${PROC_CMD} in
      help)
        USAGE_CMD
        echo "  HELP: "|tee -a ${LOG} ${LAST}
        echo "2" > ${TMP}.xc
        ;;
      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}
          echo "0" > ${TMP}.xc
        ;;
      filters)
        echo "  Filters:"|tee -a ${LAST}
        echo "    CLUSTER_FILTER=${CLUSTER_FILTER}"|tee -a ${LAST}
        echo "    SVM_FILTER=${SVM_FILTER}"|tee -a ${LAST}
        echo "    AGGR_FILTER=${AGGR_FILTER}"|tee -a ${LAST}
        echo "    LIF_FILTER=${LIF_FILTER}"|tee -a ${LAST}
        echo "    VOL_FILTER=${VOL_FILTER}"|tee -a ${LAST}
        echo "    QTREE_FILTER=${QTREE_FILTER}"|tee -a ${LAST}
        echo "    QTREE_STYLE_FILTER=${QTREE_FILTER}"|tee -a ${LAST}
        echo "    VOL_SIZE_FILTER="|tee -a ${LAST}
        echo "    QUOTA_DISK_LIMIT_FILTER="|tee -a ${LAST}
        echo "    QTREE_EXPORT_ADDR_FILTER="|tee -a ${LAST}
        ;;
      status)
        if [ -f ${STATUSENA} ]; then
          echo "  STATUS: ENAbled(-file found). (ALL actions are executed) [${PGM} v${VER}] @ ${HOSTNAME}"|tee -a ${LOG} ${LAST}
          echo "0" > ${TMP}.xc
        fi
        if [ -f ${STATUSDIS} ]; then
          echo "4" > ${TMP}.xc
          echo "  STATUS: DISabled(-file found) (ERROR(4)). (NOthing, also show, is allowed) [${PGM} v${VER}] @ ${HOSTNAME}"|tee -a ${LOG} ${LAST}
        fi
        if [ ! -f ${STATUSENA} ] && [ ! -f ${STATUSDIS} ]; then
          echo "4" > ${TMP}.xc
          echo "  STATUS: NO (enable/disable-file)found (ERROR(4)). (CLI-(show-)requests are accepted and executed. But NO Ansible playbooks are executed.) [${PGM} v${VER}] @ ${HOSTNAME}"|tee -a ${LOG} ${LAST}
        fi
        ;;

# WILDCARD
      *) echo "  ERROR(99): ${PROC_CMD} has wrong value for \"cmd\". Use \"cmd\":\"help\" for more info (`date +%Y-%m-%d-%H-%M-%S`) [${PGM} v${VER}]"|tee -a ${LOG} ${LAST}
         USAGE_CMD
         echo "99" > ${TMP}.xc
         ;;

    esac
  fi  # PROC_CMD

# ------------------------------------------------------------

  if [ "${ANSIBLE_ONTAP}" != "" ]; then
    case ${ANSIBLE_ONTAP} in
      help)
        echo "  ANSIBLE_ONTAP:help: "|tee -a ${LOG} ${LAST}
        USAGE_ANSIBLE
        echo "2" > ${TMP}.xc
        ;;
      version)  
        echo "  VERSION: ${VER} [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} 
        ;;
      volume-remove)
        echo "  ANSIBLE_ONTAP:volume-delete"|tee -a ${LOG} ${LAST}
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i clustername|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i svm_name|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i vol_name|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${VOL_FILTER}"`
        echo "    CLUSTERNAME=${CLUSTERNAME} SVM_NAME=${SVM_NAME} VOL_NAME=${VOL_NAME} "|tee -a ${LOG} ${LAST}
        if [ -f ${STATUSENA} ] && [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ]; then
          echo "    ANSIBLE PLAYBOOK -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} "

          source /var/lib/awx/venv/ansible/bin/activate
          ansible-playbook ${PLAYBOOK_DIR}/netapp-ontap_volume_remove.yml -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} 
          EC=${?}
          echo "ExitCode=${EC}"
        fi  # "${CLUSTERNAME}" != "" ...
        ;;

      volume-update)
        echo "  ANSIBLE_ONTAP:volume-update"|tee -a ${LOG} ${LAST}
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i CLUSTERNAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i SVM_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        SVM_POST=`echo ${SVM_NAME}|sed 's/nlnafs//g'`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i VOL_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${VOL_FILTER}"|grep "${SVM_POST}"`
        AGGR_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i AGGR_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${AGGR_FILTER}"`
        VOL_SIZE=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i VOL_SIZE|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${VOL_SIZE_FILTER}"`
        VOL_TYPE=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i VOL_TYPE|awk -F\: '{print $2}'|sed 's/"//g'|tr '[a-z]' '[A-Z]'|egrep 'RW'`
        VOL_STOR_CLASS=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i VOL_STOR_CLASS|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        VOL_COMMENT=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i VOL_COMMENT|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        VOL_COMMENT="${VOL_COMMENT} by ${PGM} v${VER} at ${HOSTNAME} at ${DATI}"
        VOL_COMMENT=`echo ${VOL_COMMENT}|sed 's/ /_/g'`

        echo "    CLUSTERNAME=${CLUSTERNAME} SVM_NAME=${SVM_NAME} VOL_NAME=${VOL_NAME} AGGR_NAME=${AGGR_NAME} VOL_SIZE=${VOL_SIZE} VOL_TYPE=${VOL_TYPE} VOL_STOR_CLASS=${VOL_STOR_CLASS} VOL_COMMENT=${VOL_COMMENT} "|tee -a ${LOG} ${LAST}

        if [ -f ${STATUSENA} ] && [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ] && [ ${AGGR_NAME} != "" ] && [ "${VOL_SIZE}" != "" ] && [ "${VOL_TYPE}" != "" ] && [ "${VOL_STOR_CLASS}" != "" ] && [ "${VOL_COMMENT}" != "" ]; then
          echo "    ANSIBLE PLAYBOOK -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} -e nao_vol_aggr_name=${AGGR_NAME} -e nao_vol_stor_class=${VOL_STOR_CLASS} -e nao_vol_size=${VOL_SIZE} -e nao_vol_size_unit=gb -e nao_vol_type=${VOL_TYPE} -e nao_vol_comment=\"${VOL_COMMENT}\" "

          source /var/lib/awx/venv/ansible/bin/activate
          ansible-playbook ${PLAYBOOK_DIR}/netapp-ontap_volume_create-update.yml -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} -e nao_vol_aggr_name=${AGGR_NAME} -e nao_vol_stor_class=${VOL_STOR_CLASS} -e nao_vol_size=${VOL_SIZE} -e nao_vol_size_unit=gb -e nao_vol_type=${VOL_TYPE} -e nao_vol_comment="${VOL_COMMENT}"
          EC=${?}
          echo "ExitCode=${EC}"
        else
          echo "    Some VAR's are NOT valid (being empty)"
        fi  # [ " " != "" ...
        ;;

      qtree-update)
        echo "  ANSIBLE_ONTAP:qtree-update"|tee -a ${LOG} ${LAST}
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i clustername|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i svm_name|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        SVM_POST=`echo ${SVM_NAME}|sed 's/nlnafs//g'`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i vol_name|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${VOL_FILTER}"|grep "${SVM_POST}"`
        QTREE_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i qtree_name|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        QTREE_STYLE=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i qtree_style|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|sed 's/ //g'|egrep "${QTREE_STYLE_FILTER}"`
        QTREE_STRING="{\"${QTREE_NAME}\":{\"nao_qtree_security_style\":\"${QTREE_STYLE}\"}}"

        echo "    CLUSTERNAME=${CLUSTERNAME} SVM_NAME=${SVM_NAME} VOL_NAME=${VOL_NAME} QTREE_STRING=${QTREE_STRING} "|tee -a ${LOG} ${LAST}
        if [ -f ${STATUSENA} ] && [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ] && [ "${QTREE_STRING}" != "" ]; then
          echo "    ANSIBLE PLAYBOOK -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} -e nao_qtree_string=${QTREE_STRING} "
          source /var/lib/awx/venv/ansible/bin/activate
          ansible-playbook ${PLAYBOOK_DIR}/netapp-ontap_qtree_create-update-loop.yml -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} -e nao_qtree_string="${QTREE_STRING}"
          EC=${?}
          echo "ExitCode=${EC}"
        else
          echo "    Some VAR's are NOT valid (being empty)"
        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;

      quota-update)
        echo "  ANSIBLE_ONTAP:quota-update"|tee -a ${LOG} ${LAST}
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i CLUSTERNAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i SVM_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        SVM_POST=`echo ${SVM_NAME}|sed 's/nlnafs//g'`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i VOL_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${VOL_FILTER}"|grep "${SVM_POST}"`
        QTREE_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i QTREE_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        QUOTA_DISK_LIMIT=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i QUOTA_DISK_LIMIT|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|sed 's/ //g'|grep -E -o "${QUOTA_DISK_LIMIT_FILTER}"`
        if [ "${QTREE_NAME} != "" ] && [ "${QUOTA_DISK_LIMIT} != "" ]; then
          QTREE_STRING="{\"${QTREE_NAME}\":{\"nao_quota_disk_limit\":\"${QUOTA_DISK_LIMIT}GB\"}}"
        else
          QTREE_STRING=""
        fi

        echo "    CLUSTERNAME=${CLUSTERNAME} SVM_NAME=${SVM_NAME} VOL_NAME=${VOL_NAME} QTREE_STRING=${QTREE_STRING} "|tee -a ${LOG} ${LAST}
        if [ -f ${STATUSENA} ] && [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ] && [ "${QTREE_STRING}" != "" ]; then
          echo "    ANSIBLE PLAYBOOK:quota-update -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} -e nao_qtree_string=${QTREE_STRING} "
          source /var/lib/awx/venv/ansible/bin/activate
          ansible-playbook ${PLAYBOOK_DIR}/netapp-ontap_quota_create-update-loop.yml -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} -e nao_qtree_string="${QTREE_STRING}"
          EC=${?}
          echo "ExitCode=${EC}"
        else
          echo "    Some VAR's are NOT valid (being empty)"
        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;

      nfs-export-update)
        echo "  ANSIBLE_ONTAP:nfs-export-update"|tee -a ${LOG} ${LAST}
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i CLUSTERNAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i SVM_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        SVM_POST=`echo ${SVM_NAME}|sed 's/nlnafs//g'`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i VOL_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${VOL_FILTER}"|grep "${SVM_POST}"`
        QTREE_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i QTREE_NAME|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        QTREE_EXPORT_POLICY=`echo ${LINE}|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i qtree_export_policy|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|sed 's/ //g'` 
        QTREE_EXPORT_ADDR=`echo ${LINE}|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i qtree_export_addr|awk -F\: '{print $2}'|sed 's/"//g'|sed 's/ //g'|grep -E -o "${QTREE_EXPORT_ADDR_FILTER}"`
#        QTREE_EXPORT_ADDR=`echo ${LINE}|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i QTREE_EXPORT_ADDR|awk -F\: '{print $2}'|sed 's/"//g'|sed 's/ //g'`
# Check regex at regex101.com

        echo "    QTREE_EXPORT_POLICY=${QTREE_EXPORT_POLICY} QTREE_EXPORT_ADDR=${QTREE_EXPORT_ADDR}"

        if [ "${QTREE_NAME}" != "" ] && [ "${QTREE_EXPORT_POLICY}" != "" ] && [ "${QTREE_EXPORT_ADDR}" != "" ]; then
          QTREE_STRING="{\"${QTREE_NAME}\":{\"nao_qtree_export_policy\":\"${QTREE_EXPORT_POLICY}\",\"nao_export_policy_client_match\":\"${QTREE_EXPORT_ADDR}\"}}"
        else
          QTREE_STRING=""
        fi

        echo "    CLUSTERNAME=${CLUSTERNAME} SVM_NAME=${SVM_NAME} VOL_NAME=${VOL_NAME} QTREE_STRING=${QTREE_STRING} "|tee -a ${LOG} ${LAST}
        if [ -f ${STATUSENA} ] && [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ] && [ "${QTREE_STRING}" != "" ]; then
          echo "    ANSIBLE PLAYBOOK:nfs-export-update -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} -e nao_qtree_string=${QTREE_STRING} "

          source /var/lib/awx/venv/ansible/bin/activate
          ansible-playbook ${PLAYBOOK_DIR}/netapp-ontap_export_create-update-loop.yml -e nao_clustername=${CLUSTERNAME} -e nao_svm_name=${SVM_NAME} -e nao_vol_name=${VOL_NAME} -e nao_qtree_string="${QTREE_STRING}"
          EC=${?}
          echo "ExitCode=${EC}"
        else
          echo "    Some VAR's are NOT valid (being empty)"
        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;


# WILDCARD
      *) echo "  ERROR(99): ${ANSIBLE_ONTAP} : \"ansible_ontap\" has wrong value. Use \"ansible_ontap\":\"help\" for more info (`date +%Y-%m-%d-%H-%M-%S`) [${PGM} v${VER}]"|tee -a ${LOG} ${LAST}
         USAGE_ANSIBLE
         echo "99" > ${TMP}.xc
         ;;

    esac
  fi  # ANSIBLE_ONTAP

# ------------------------------------------------------------

  if [ "${CLI_ONTAP}" != "" ]; then
    case ${CLI_ONTAP} in

      help)
        USAGE_CLI
        echo "2" > ${TMP}.xc
        ;;

      volume-show)
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "cluster|clustername"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "vol|volume"|grep -v "volume-show"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        echo "-- CLI_ONTAP:volume-show (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}) [vserver,volume,aggregate,total,used,autosize-mode] --"|tee -a ${LOG} ${LAST}
        if [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ]; then
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\";volume show -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,aggregate,total,used,autosize-mode"|grep ${SVM_NAME}
          EC=${?}
          echo "---------- (EC=${EC}) ----------"
          echo "${EC}" > ${TMP}.xc

        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;

      qtree-show)
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "cluster|clustername"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "vol|volume"|grep -v "qtree-show"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        echo "-- CLI_ONTAP:qtree-show (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}) [vserver,volume,qtree,export] --"|tee -a ${LOG} ${LAST}

        if [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ]; then
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; qtree show -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,qtree,export"| grep ${SVM_NAME}
          EC=${?}
          echo "---------- (EC=${EC}) ----------"
          echo "${EC}" > ${TMP}.xc

        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;


      quota-report)
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "cluster|clustername"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "vol|volume"|grep -v "quota-report"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        echo "-- CLI_ONTAP:quota-report (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}) [vserver,volume,tree,disk-used,disk-limit] --"|tee -a ${LOG} ${LAST}
        if [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ]; then
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; quota report -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,tree,disk-limit,disk-used" | grep ${SVM_NAME}
          EC=${?}
          echo "---------- (EC=${EC}) ----------"
          echo "${EC}" > ${TMP}.xc

        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;


      nfs-export-show)
        CLUSTERNAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "cluster|clustername"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${CLUSTER_FILTER}"`
        SVM_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "vol|volume"|grep -v "quota-report"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${VOL_FILTER}"`
        QTREE_NAME=`echo "${LINE}"|grep ^{|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|grep -i qtree_name|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`

        echo "-- CLI_ONTAP:nfs-export-show (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}:${QTREE_NAME}) --"|tee -a ${LOG} ${LAST}

        if [ "${CLUSTERNAME}" != "" ] && [ "${SVM_NAME}" != "" ] && [ "${VOL_NAME}" != "" ]; then
          VOL_POLICY=`${SSH} ${CLUSTERNAME} "set -showseparator \";\"; volume show -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,policy"|grep ${SVM_NAME}|awk -F\; '{print $3}'`
          QTREE_POLICY=`${SSH} ${CLUSTERNAME} "set -showseparator \";\"; qtree show -vserver ${SVM_NAME} -volume ${VOL_NAME} -qtree ${QTREE_NAME} -field vserver,volume,qtree,expor"|grep ${SVM_NAME}|awk -F\; '{print $4}'`
          echo "  VOL_POLICY=${VOL_POLICY}"
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; volume show -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,policy"|grep ${SVM_NAME}
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\" ; export-policy rule show -vserver ${SVM_NAME} -policy ${VOL_POLICY} -field vserver,policy,clientmatch" | grep ${SVM_NAME}
          echo "  QTREE_POLICY=${QTREE_POLICY}"
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; qtree show -vserver ${SVM_NAME} -volume ${VOL_NAME} -qtree ${QTREE_NAME} -field vserver,volume,export"|grep ${SVM_NAME}
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\" ; export-policy rule show -vserver ${SVM_NAME} -policy ${QTREE_POLICY} -field vserver,policy,clientmatch" | grep ${SVM_NAME}

          EC=${?}
          echo "---------- (EC=${EC}) ----------"
          echo "${EC}" > ${TMP}.xc

        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;


# WILDCARD
      *)echo "  ERROR(99): ${CLI_ONTAP} : \"cli_ontap\" has wrong value. Use \"cli_ontap\":\"help\" for more info (`date +%Y-%m-%d-%H-%M-%S`) [${PGM} v${VER}]"|tee -a ${LOG} ${LAST}
        USAGE_CLI
        echo "99" > ${TMP}.xc
        ;;
    esac
  fi  #CLI_ONTAP


done  # while read LINE

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

