
#!/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
#(0.9),221122	: Added VERBOSE
#(0.10),221123	: Mod. JSON output (for "cmd")
#(0.11),221123	: Mod. JSON output (for "cli-ontap"). 
#(0.12),221129	: Updated to "new" JSON output for help part
#(0.13),221129	: Upd cli-ontap for JSON
#(0.14),230306	: Added vserver-list
#set -x
PGM=`basename $0|cut -d\. -f1`
VER="0.14"
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"
VERBOSE=""

# !! Can be set in RC-file !!
#CLUSTER_FILTER="nlnaf[1-9][0-9][0-9]"
#CLUSTER_FILTER="nlnaf[1][0][23]"
CLUSTER_FILTER="nlnaf[1][0][2]"
#SVM_FILTER="nlnafs[a-z][a-z][a-z][0-9][0-9]"
#SVM_FILTER="nlnafsmss1[89]"
SVM_FILTER="nlnafsmss1[8]"
#AGGR_FILTER="n[0-9][0-9][ace][0-9][0-9][0-9][0-9]"
#AGGR_FILTER="n02a4001"
AGGR_FILTER="n09a9001"
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]"
VOL_FILTER="mss1[8]_vol[0][2-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_CMD()
{
  echo "  {\"id\":\"header\",\"fields\":\"variable,values\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cmd\",\"values\":\"help\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cmd\",\"values\":\"status\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cmd\",\"values\":\"filters\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cmd\",\"values\":\"heartbeat\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cmd\",\"values\":\"version\"}," 
}

USAGE_CLI()
{
  echo "  {\"id\":\"header\",\"fields\":\"variable,values\"}," 

  echo "    {\"id\":\"data\",\"variable\":\"cli-ontap\",\"values\":\"help\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cli-ontap\",\"values\":\"volume-show\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"cluster|clustername\",\"values\":\"${CLUSTER_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"svm_name|vserver\",\"values\":\"${SVM_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"vol_name|volume\",\"values\":\"${VOL_FILTER}\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cli-ontap\",\"values\":\"qtree-show\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"cluster|clustername\",\"values\":\"${CLUSTER_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"svm_name|vserver\",\"values\":\"${SVM_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"vol_name|volume\",\"values\":\"${VOL_FILTER}\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cli-ontap\",\"values\":\"quota-report\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"cluster|clustername\",\"values\":\"${CLUSTER_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"svm_name|vserver\",\"values\":\"${SVM_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"vol_name|volume\",\"values\":\"${VOL_FILTER}\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cli-ontap\",\"values\":\"nfs-export-show\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"cluster|clustername\",\"values\":\"${CLUSTER_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"svm_name|vserver\",\"values\":\"${SVM_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"vol_name|volume\",\"values\":\"${VOL_FILTER}\"}," 
  echo "      {\"id\":\"data\",\"variable\":\"qtree_name|qtree\",\"values\":\"${QTREE_FILTER}\"}," 
}

USAGE_ANSIBLE()
{
  echo "  {\"id\":\"header\",\"fields\":\"variable,values\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"ansible-ontap\",\"values\":\"help\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"ansible-ontap\",\"values\":\"volume-update\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"ansible-ontap\",\"values\":\"volume-remove\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"ansible-ontap\",\"values\":\"qtree-update\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"ansible-ontap\",\"values\":\"quota-update\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"ansible-ontap\",\"values\":\"nfs-export-update\"}," 

  echo "      \"version\" "
}
USAGE()
{
  echo "  {\"id\":\"header\",\"fields\":\"variable,values\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cmd\",\"values\":\"help\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"cli-ontap\",\"values\":\"help\"}," 
  echo "    {\"id\":\"data\",\"variable\":\"ansible-ontap\",\"values\":\"help\"}," 
}

ERR_MSG()
# $1 NR $2 = MSG
{
  echo "  ERROR(${1}): ${2}" >> ${LOG}
  echo "  {\"id\":\"header\",\"fields\":\"status,nr,msg\"}," 
  echo "    {\"id\":\"data\",\"status\":\"error\",\"nr\":\"${1}\",\"msg\":\"${2}\"}," 
}



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

# empty ${LAST} before start
cp /dev/null ${LAST}

echo "`date +%Y-%m-%d' '%H:%M:%S` ${PGM} v${VER} started." >> ${LOG}
echo "[{\"id\":\"started\",\"timestamp\":\"`date +%Y-%m-%d-%H-%M-%S`\",\"script\":\"${PGM}\",\"version\":\"${VER}\" },"

touch ${TMP} ${OUT} ${TMP}.xc
echo "255" > ${TMP}.xc
# Check existance RC-file
if [ -f ${RCFILE} ]; then
  echo "  RCfile (${RCFILE}) found. Reading ..." >> ${LOG}
  . ${RCFILE}
fi
# Empty CMD-file
cp /dev/null ${CMDFILE}

#DEVICETYPE=`echo ${JSON_STR}|cut -d\{ -f2|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 "250" > ${TMP}.xc
    ERR_MSG `cat ${TMP}.xc` "NO input received."
    USAGE
#  exit ${TMP}.xc
  fi  # ${LINE}

#  echo "--LINE:${LINE}"
  LINE_CMD=`echo "${LINE}"|cut -d\{ -f1|sed 's/ //g'`

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

  if [ "${LINE_CMD}" = "" ] && [ "${PROC_CMD}" = "" ] && [ "${ANSIBLE_ONTAP}" = "" ] && [ "${CLI_ONTAP}" = "" ]; then
    echo "254" > ${TMP}.xc
    ERR_MSG `cat ${TMP}.xc` "No variables defined."
    USAGE
  fi

  if [ "${LINE_CMD}" = "verbose" ]; then
    VERBOSE=1
  fi  # LINE_CMD=verbose
  if [ ${VERBOSE} ]; then
    echo "--LINE:${LINE}|LINE_CMD=${LINE_CMD}|(PROC_)CMD=${PROC_CMD}|ANSIBLE_ONTAP=${ANSIBLE_ONTAP}|CLI_ONTAP=${CLI_ONTAP}|"
  fi  # LINE_CMD

  CHK_LINE=`echo "${LINE}"|grep '{'`
  if [ "${LINE}" != "" ] && [ "${CHK_LINE}" = "" ]; then
    echo "251" > ${TMP}.xc
    ERR_MSG `cat ${TMP}.xc` "JSON-string does NOT begin with { "
    USAGE
  fi
  CHK_LINE=`echo "${LINE}"|cut -d\{ -f2|grep }$`
  if [ "${LINE}" != "" ] && [ "${CHK_LINE}" = "" ]; then
    echo "251" > ${TMP}.xc
    ERR_MSG `cat ${TMP}.xc` "JSON-string does NOT ends with } "
    USAGE
  fi

  if [ "${LINE_CMD}" = "help" ]; then
    echo "0" > ${TMP}.xc
    echo "  HELP: "| >> ${LOG}
    USAGE
  fi  # LINE_CMD


  if [ "${LINE}" != "" ] && [ "${PROC_CMD}" != "" ]; then
    case ${PROC_CMD} in
      help)
        echo "  CMD-HELP: " >> ${LOG}
        USAGE_CMD
        echo "0" > ${TMP}.xc
        ;;
      version)
        echo "  VERSION: ${VER} [${PGM} v${VER}]" >> ${LOG}
        echo "  {\"id\":\"header\":\"fields\":\"script,version\"},"
        echo "    {\"id\":\"data\",\"script\":\"${PGM}\",\"version\":\"${VER}\"}," 
        echo "0" > ${TMP}.xc
        ;;
      heartbeat)  
        echo "  HEARTBEAT: OK (`date +%Y-%m-%d-%H-%M-%S`) [${PGM} v${VER}]"|tee -a ${LOG} ${LAST} > ${HBFILE}
        echo "  {\"id\":\"info\",\"heartbeat\":\"ok\",\"timestamp\":\"`date +%Y-%m-%d-%H-%M-%S`\"}," 
        echo "0" > ${TMP}.xc
        ;;
      filters)
        echo "  FILTERS:" >> ${LOG}
        echo "  {\"id\":\"header\",\"fields\":\"_filter\"},"
        echo "    {\"id\":\"data\",\"CLUSTER_FILTER\":\"${CLUSTER_FILTER}\"},"
        echo "    {\"id\":\"data\",\"SVM_FILTER\":\"${SVM_FILTER}\"},"
        echo "    {\"id\":\"data\",\"AGGR_FILTER\":\"${AGGR_FILTER}\"},"
        echo "    {\"id\":\"data\",\"LIF_FILTER\":\"${LIF_FILTER}\"},"
        echo "    {\"id\":\"data\",\"VOL_FILTER\":\"${VOL_FILTER}\"},"
        echo "    {\"id\":\"data\",\"QTREE_FILTER\":\"${QTREE_FILTER}\"},"
        echo "    {\"id\":\"data\",\"QTREE_STYLE_FILTER\":\"${QTREE_STYLE_FILTER}\"},"
        echo "    {\"id\":\"data\",\"VOL_SIZE_FILTER\":\"${VOL_SIZE_FILTER}\"},"
        echo "    {\"id\":\"data\",\"QUOTA_DISK_LIMIT_FILTER\":\"${QUOTA_DISK_LIMIT_FILTER}\"}," 
        echo "    {\"id\":\"data\",\"QTREE_EXPORT_ADDR_FILTER\":\"${QTREE_EXPORT_ADDR_FILTER}\"},"
        echo "0" > ${TMP}.xc
        ;;
      status)
        if [ -f ${STATUSENA} ]; then
          echo "  STATUS: ENAbled (-file found). (ALL actions are executed) [${PGM} v${VER}] @ ${HOSTNAME}" >> ${LOG}
          echo "  {\"id\":\"header\",\"fields\":\"status,msg\"},"
          echo "    {\"id\":\"data\",\"status\":\"enabled\",\"msg\":\"ENAble-file found. ALL actions are executed.\"}," 
          echo "0" > ${TMP}.xc
        fi
        if [ -f ${STATUSDIS} ]; then
          echo "252" > ${TMP}.xc
          echo "  STATUS: DISabled(-file found) (ERROR(`cat ${TMP}.xc`)). (NOthing, also show, is allowed) [${PGM} v${VER}] @ ${HOSTNAME}" >> ${LOG} 
          echo "  {\"id\":\"header\",\"fields\":\"status,msg\"},"
          echo "    {\"id\":\"data\",\"status\":\"disabled\",\"msg\":\"NOthing (also show) is allowed.\"}," 
        fi
        if [ ! -f ${STATUSENA} ] && [ ! -f ${STATUSDIS} ]; then
          echo "1" > ${TMP}.xc
          echo "  STATUS: NO (enable/disable-file)found (ERROR(`cat ${TMP}.xc`)). (CLI-(show-)requests are accepted and executed. But NO Ansible playbooks are executed.) [${PGM} v${VER}] @ ${HOSTNAME}" >> ${LOG}
          echo "  {\"id\":\"header\",\"fields\":\"status,msg\"},"
          echo "    {\"id\":\"data\",\"status\":\"not-enabled-disabled\",\"msg\":\"NO enable-/disable-file found. CLI-(show-)requests are accepted and executed. But NO Ansible playbooks are executed.\"}," 
        fi
        ;;

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

    esac
  fi  # PROC_CMD

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

  if [ "${ANSIBLE_ONTAP}" != "" ]; then
    case ${ANSIBLE_ONTAP} in
      help)
        echo "  ANSIBLE_ONTAP:help " >> ${LOG}
        USAGE_ANSIBLE
        echo "0" > ${TMP}.xc
        ;;
      volume-remove)
        echo "  ANSIBLE_ONTAP:volume-delete" >> ${LOG} 
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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" >> ${LOG}
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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" >> ${LOG}
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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" >> ${LOG}
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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" >> ${LOG}
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}"|cut -d\{ -f2|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}|cut -d\{ -f2|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}|cut -d\{ -f2|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}|cut -d\{ -f2|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 "253" > ${TMP}.xc
        echo "  ERROR(`cat ${TMP}.xc`): ${ANSIBLE_ONTAP} : \"ansible_ontap\" has wrong value. Use \"ansible_ontap\":\"help\" for more info (`date +%Y-%m-%d-%H-%M-%S`) [${PGM} v${VER}]" >> ${LOG}
        ERR_MSG `cat ${TMP}.xc` "${ANSIBLE_ONTAP} has wrong value for \"ansible-ontap\" "
        USAGE_ANSIBLE
        ;;

    esac
  fi  # ANSIBLE_ONTAP

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

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

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

      volume-show)
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver|svm_name"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "vol|volume|vol_name"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${VOL_FILTER}"`
        if [ "${CLUSTERNAME}" = "" ]; then
          CLUSTERNAME="<clustername>"
        fi
        if [ "${SVM_NAME}" = "" ]; then
          SVM_NAME="<svm_name>"
        fi
        if [ "${VOL_NAME}" = "" ]; then
          VOL_NAME="<vol_name>"
        fi
        echo "-- CLI_ONTAP:volume-show (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}) [vserver,volume,aggregate,total,used,autosize-mode] --" >> ${LOG}

        if [ "${CLUSTERNAME}" != "<clustername>" ] && [ "${SVM_NAME}" != "<svm_name>" ] && [ "${VOL_NAME}" != "<vol_name>" ]; then
          echo "  {\"id\":\"header\",\"cli-ontap\":\"volume-show\",\"fields\":\"clustername,vserver,volume,aggregate,total,used,autosize-mode\"},"

          ${SSH} ${CLUSTERNAME} "set -showseparator \";\";volume show -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,aggregate,total,used,autosize-mode"|grep ${SVM_NAME}| while read LINE2
          do
            L2_VSERVER=`echo ${LINE2}|awk -F\; '{print $1}'`
            L2_VOLUME=`echo ${LINE2}|awk -F\; '{print $2}'`
            L2_AGGR=`echo ${LINE2}|awk -F\; '{print $3}'`
            L2_TOTAL=`echo ${LINE2}|awk -F\; '{print $4}'`
            L2_USED=`echo ${LINE2}|awk -F\; '{print $5}'`
            L2_AS_MODE=`echo ${LINE2}|awk -F\; '{print $6}'`
            echo "    {\"id\":\"data\",\"clustername\":\"${CLUSTERNAME}\",\"vserver\":\"${L2_VSERVER}\",\"volume\":\"${L2_VOLUME}\",\"aggregate\":\"${L2_AGGR}\",\"total\":\"${L2_TOTAL}\",\"used\":\"${L2_USED}\",\"autosize-mode\":\"${L2_AS_MODE}\"},"
          done  # LINE2

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

        else
          echo "254" > ${TMP}.xc
          ERR_MSG `cat ${TMP}.xc` "Not all variables defined (clustername=${CLUSTERNAME}, svm_name|vserver=${SVM_NAME}, vol_name|volume=${VOL_NAME})"
          USAGE_CLI
        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;

      qtree-show)
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver|svm_name"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "vol|volume|vol_name"|grep -v "qtree-show"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        if [ "${CLUSTERNAME}" = "" ]; then
          CLUSTERNAME="<clustername>"
        fi
        if [ "${SVM_NAME}" = "" ]; then
          SVM_NAME="<svm_name>"
        fi
        if [ "${VOL_NAME}" = "" ]; then
          VOL_NAME="<vol_name>"
        fi
        echo "-- CLI_ONTAP:qtree-show (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}) [vserver,volume,qtree,export] --" >> ${LOG}

        if [ "${CLUSTERNAME}" != "<clustername>" ] && [ "${SVM_NAME}" != "<svm_name>" ] && [ "${VOL_NAME}" != "<vol_name>" ]; then
          echo "  {\"id\":\"header\",\"cli-ontap\":\"qtree-show\",\"fields\":\"clustername,vserver,volume,qtree,export\"},"

          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; qtree show -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,qtree,export"| grep ${SVM_NAME}|grep ${SVM_NAME}| while read LINE2
          do
            L2_VSERVER=`echo ${LINE2}|awk -F\; '{print $1}'`
            L2_VOLUME=`echo ${LINE2}|awk -F\; '{print $2}'`
            L2_QTREE=`echo ${LINE2}|awk -F\; '{print $3}'`
            L2_EXPORT=`echo ${LINE2}|awk -F\; '{print $4}'`
            echo "    {\"id\":\"data\",\"clustername\":\"${CLUSTERNAME}\",\"vserver\":\"${L2_VSERVER}\",\"volume\":\"${L2_VOLUME}\",\"qtree\":\"${L2_QTREE}\",\"export\":\"${L2_EXPORT}\"},"
          done  # LINE2

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

        else
          echo "254" > ${TMP}.xc
          ERR_MSG `cat ${TMP}.xc` "Not all variables defined (clustername=${CLUSTERNAME}, svm_name|vserver=${SVM_NAME}, vol_name|volume=${VOL_NAME})"
          USAGE_CLI
        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;

      quota-report)
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver|svm_name"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "vol|volume|vol_name"|grep -v "qtree-show"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        if [ "${CLUSTERNAME}" = "" ]; then
          CLUSTERNAME="<clustername>"
        fi
        if [ "${SVM_NAME}" = "" ]; then
          SVM_NAME="<svm_name>"
        fi
        if [ "${VOL_NAME}" = "" ]; then
          VOL_NAME="<vol_name>"
        fi
        echo "-- CLI_ONTAP:quota-report (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}) [vserver,volume,tree,disk-used,disk-limit] --" >>${LOG}

        if [ "${CLUSTERNAME}" != "<clustername>" ] && [ "${SVM_NAME}" != "<svm_name>" ] && [ "${VOL_NAME}" != "<vol_name>" ]; then
          echo "  {\"id\":\"header\",\"cli-ontap\":\"quota-report\",\"fields\":\"clustername,volume,tree,disk-used,disk-limit\"},"

          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; quota report -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,tree,disk-used,disk-limit"|grep ${SVM_NAME}|grep ${SVM_NAME}| while read LINE2
          do
            L2_VSERVER=`echo ${LINE2}|awk -F\; '{print $1}'`
            L2_VOLUME=`echo ${LINE2}|awk -F\; '{print $2}'`
            L2_INDEX=`echo ${LINE2}|awk -F\; '{print $3}'`
            L2_TREE=`echo ${LINE2}|awk -F\; '{print $4}'`
            L2_DISK_USED=`echo ${LINE2}|awk -F\; '{print $5}'`
            L2_DISK_LIMIT=`echo ${LINE2}|awk -F\; '{print $6}'`

            echo "    {\"id\":\"data\",\"clustername\":\"${CLUSTERNAME}\",\"vserver\":\"${L2_VSERVER}\",\"volume\":\"${L2_VOLUME}\",\"tree\":\"${L2_TREE}\",\"disk-used\":\"${L2_DISK_USED}\",\"disk-limit\":\"${L2_DISK_LIMIT}\"},"
          done

          EC=${?}
#          echo "---------- (EC=${EC}) ----------"
          echo "${EC}" > ${TMP}.xc
        else
          echo "254" > ${TMP}.xc
          ERR_MSG `cat ${TMP}.xc` "Not all variables defined (clustername=${CLUSTERNAME}, svm_name|vserver=${SVM_NAME}, vol_name|volume=${VOL_NAME})"
          USAGE_CLI
        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;


      nfs-export-show)
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver|svm_name"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        VOL_NAME=`echo "${LINE}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "vol|volume|vol_name"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        QTREE_NAME=`echo "${LINE}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "qtree|qtree_name"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'`
        if [ "${CLUSTERNAME}" = "" ]; then
          CLUSTERNAME="<clustername>"
        fi
        if [ "${SVM_NAME}" = "" ]; then
          SVM_NAME="<svm_name>"
        fi
        if [ "${VOL_NAME}" = "" ]; then
          VOL_NAME="<vol_name>"
        fi
        if [ "${QTREE_NAME}" = "" ]; then
          QTREE_NAME="<qtree_name>"
        fi
        echo "-- CLI_ONTAP:nfs-export-show (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}:${QTREE_NAME}) --" >> ${LOG}

        if [ "${CLUSTERNAME}" != "<clustername>" ] && [ "${SVM_NAME}" != "<svm_name>" ] && [ "${VOL_NAME}" != "<vol_name>" ] && [ "${QTREE_NAME}" != "<qtree_name>" ]; then
          echo "  {\"id\":\"header\",\"cli-ontap\":\"nfs-export-show\",\"fields\":\"clustername,volume,export-policy\"},"

          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}'`

#          echo "  VOL_POLICY=${VOL_POLICY} QTREE_POLICY=${QTREE_POLICY}"

          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; volume show -vserver ${SVM_NAME} -volume ${VOL_NAME} -field vserver,volume,policy"|grep ${SVM_NAME}|while read LINE2
          do
            L2_VSERVER=`echo ${LINE2}|awk -F\; '{print $1}'`
            L2_VOLUME=`echo ${LINE2}|awk -F\; '{print $2}'`
            L2_EXP_POLICY=`echo ${LINE2}|awk -F\; '{print $3}'`
            echo "    {\"id\":\"data\",\"clustername\":\"${CLUSTERNAME}\",\"vserver\":\"${L2_VSERVER}\",\"volume\":\"${L2_VOLUME}\",\"export-policy\":\"${L2_EXP_POLICY}\"},"
          done  # LINE2

          echo "  {\"id\":\"header\",\"cli-ontap\":\"nfs-export-show\",\"fields\":\"clustername,policy,ruleindex,clientmatch\"},"
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\" ; export-policy rule show -vserver ${SVM_NAME} -policy ${VOL_POLICY} -field vserver,policy,clientmatch" | grep ${SVM_NAME}|while read LINE2
          do
            L2_VSERVER=`echo ${LINE2}|awk -F\; '{print $1}'`
            L2_POLICY=`echo ${LINE2}|awk -F\; '{print $2}'`
            L2_RULEINDEX=`echo ${LINE2}|awk -F\; '{print $3}'`
            L2_CLIENTMATCH=`echo ${LINE2}|awk -F\; '{print $4}'`
            echo "    {\"id\":\"data\",\"clustername\":\"${CLUSTERNAME}\",\"vserver\":\"${L2_VSERVER}\",\"policy\":\"${L2_POLICY}\",\"ruleindex\":\"${L2_RULEINDEX}\",\"clientmatch\":\"${L2_CLIENTMATCH}\"},"
          done  # LINE2

#          echo "  QTREE_POLICY=${QTREE_POLICY}"
          echo "  {\"id\":\"header\",\"cli-ontap\":\"nfs-export-show\",\"fields\":\"clustername,vserver,qtree,export-policy\"},"
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; qtree show -vserver ${SVM_NAME} -volume ${VOL_NAME} -qtree ${QTREE_NAME} -field vserver,volume,qtree,export-policy"|grep ${SVM_NAME}|while read LINE2
          do
            L2_VSERVER=`echo ${LINE2}|awk -F\; '{print $1}'`
            L2_VOLUME=`echo ${LINE2}|awk -F\; '{print $2}'`
            L2_QTREE=`echo ${LINE2}|awk -F\; '{print $3}'`
            L2_EXP_POLICY=`echo ${LINE2}|awk -F\; '{print $4}'`
            echo "    {\"id\":\"data\",\"clustername\":\"${CLUSTERNAME}\",\"vserver\":\"${L2_VSERVER}\",\"qtree\":\"${L2_QTREE}\",\"export-policy\":\"${L2_EXP_POLICY}\"},"
          done  # LINE3

          QTREE_POLICY=`${SSH} ${CLUSTERNAME} "set -showseparator \";\"; qtree show -vserver ${SVM_NAME} -volume ${VOL_NAME} -qtree ${QTREE_NAME} -field vserver,volume,qtree,export-policy"|grep ${SVM_NAME}|awk -F\; '{print $4}'`
          echo "  {\"id\":\"header\",\"cli-ontap\":\"nfs-export-show\",\"fields\":\"clustername,vserver,policy,ruleindex,clientmatch\"},"
          ${SSH} ${CLUSTERNAME} "set -showseparator \";\" ; export-policy rule show -vserver ${SVM_NAME} -policy ${QTREE_POLICY} -field vserver,policy,clientmatch" | grep ${SVM_NAME}|while read LINE2
          do
            L2_VSERVER=`echo ${LINE2}|awk -F\; '{print $1}'`
            L2_POLICY=`echo ${LINE2}|awk -F\; '{print $2}'`
            L2_RULEINDEX=`echo ${LINE2}|awk -F\; '{print $3}'`
            L2_CLIENTMATCH=`echo ${LINE2}|awk -F\; '{print $4}'`
            echo "    {\"id\":\"data\",\"clustername\":\"${CLUSTERNAME}\",\"vserver\":\"${L2_VSERVER}\",\"policy\":\"${L2_POLICY}\",\"ruleindex\":\"${L2_RULEINDEX}\",\"clientmatch\":\"${L2_CLIENTMATCH}\"},"
          done  # LINE2

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

        else
          echo "254" > ${TMP}.xc
          ERR_MSG `cat ${TMP}.xc` "Not all variables defined (clustername=${CLUSTERNAME}, svm_name|vserver=${SVM_NAME}, vol_name|volume=${VOL_NAME}, qtree_name|qtree=${QTREE_NAME})"
          USAGE_CLI
        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;


      vserver-show)
        CLUSTERNAME=`echo "${LINE}"|cut -d\{ -f2|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}"|cut -d\{ -f2|sed 's/^{//g'|sed 's/}$//g'|tr ',' '\n'|egrep -i "svm|vserver|svm_name"|awk -F\: '{print $2}'|sed 's/"//g'|tr '[A-Z]' '[a-z]'|grep -E -o "${SVM_FILTER}"`
        if [ "${CLUSTERNAME}" = "" ]; then
          CLUSTERNAME="<clustername>"
        fi
        if [ "${SVM_NAME}" = "" ]; then
          SVM_NAME="nlnafs*"
        fi
        echo "-- CLI_ONTAP:vserver-show (${CLUSTERNAME}:${SVM_NAME}:${VOL_NAME}) [vserver,volume,tree,disk-used,disk-limit] --" >>${LOG}

        if [ "${CLUSTERNAME}" != "<clustername>" ]; then
          echo "  {\"id\":\"header\",\"cli-ontap\":\"vsever-show\",\"fields\":\"vserver,operational-state\"},"

          ${SSH} ${CLUSTERNAME} "set -showseparator \";\"; vserver show -vserver ${SVM_NAME} -field vserver,operational-state"|grep ${SVM_NAME}| while read LINE2
          do
            L2_VSERVER=`echo ${LINE2}|awk -F\; '{print $1}'`
            L2_OPS_STATE=`echo ${LINE2}|awk -F\; '{print $2}'`
            echo "    {\"id\":\"data\",\"clustername\":\"${CLUSTERNAME}\",\"vserver\":\"${L2_VSERVER}\",\"operational-state\":\"${L2_OPS_STATE}\"},"

          done  # LINE2
          EC=${?}
          echo "${EC}" > ${TMP}.xc

        else
          echo "254" > ${TMP}.xc
          ERR_MSG `cat ${TMP}.xc` "Not all variables defined (clustername=${CLUSTERNAME})"
          USAGE_CLI
        fi  # [ "${CLUSTERNAME}" != "" ] ...
        ;;


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

done  # while read LINE

rm ${TMP}
XC=`cat ${TMP}.xc`
echo "{\"id\":\"finished\",\"timestamp\":\"`date +%Y-%m-%d-%H-%M-%S`\",\"exitcode\":\"${XC}\"}]"

echo "`date +%Y-%m-%d' '%H:%M:%S` ${PGM} v${VER} finished (XC=${XC})." >> ${LOG}
exit ${XC}

