
#!/bin/sh
# File	: noc_export-policy-rule_update.sh
# By	: Maarten.deBoer@Atos.net, 230905
# Subject	: Script to create/update NetappOntap via Cli export-policy rules
# Copied from	: cdot_cre_export-policy-rule.sh
#(0.2),240216	: Mod. FILTER, CSV
#(0.3),240228	: Mod. for check hostnames
#(0.4),240326	: Mod. CSV-layout, added modify
#(0.5),241030	: Chnaged to RC-files
#(0.6),241111	: Mod.
#(0.7),250331	: Mod's RCDIR, CSV: When no CSV do RC's. Otherwise use CSV
PGM=`basename $0|cut -d\. -f1`
VER="0.7"
LOG="${HOME}/log/${PGM}.log"
SSH="/usr/bin/ssh -n"

DATA_DIR="${HOME}/data"
RC_DIR="${DATA_DIR}/rc"
CSV="${HOME}/data/csv/${PGM}.csv"


# Policy-filter
FILTER="mss"

if [ "${1}" != "" ]; then
  FILTER="${1}"
fi
if [ "${2}" != "" ]; then
  RC_DIR="${2}"
fi

echo "`date` ${PGM} v${VER} started."|tee -a ${LOG}
echo "  FILTER(1)=${FILTER}"
echo "  RC_DIR(2)=${DATAINDIR}"
echo "  CSV=${CSV}"
sleep 1

echo ""

# UPD_EXPORT
UPD_EXPORT()
{
  echo "NAO_CLUSTERNAME=${NAO_CLUSTERNAME}"
  echo "NAO_VSERVER_NAME=${NAO_VSERVER_NAME}"
  echo "NAO_QTREE_EXPORT_POLICY=${NAO_QTREE_EXPORT_POLICY}"
  echo "NAO_RULEINDEX=${NAO_RULEINDEX}"
  echo "NAO_PROTOCOL=${NAO_PROTOCOL}"
  echo "NAO_CLIENTMATCH=${NAO_CLIENTMATCH}"
  echo "NAO_RORULE=${NAO_RORULE}"
  echo "NAO_RWRULE=${NAO_RWRULE}"
  echo "NAO_ANON=${NAO_ANON}"
  echo "NAO_SUPERUSER=${NAO_SUPERUSER}"
  echo "NAO_ALLOW_SUID=${NAO_ALLOW_SUID}"
  echo "NAO_ALLOW_DEV=${NAO_ALLOW_DEV}"

# Check if hostname is in (local) 'dns hosts'
  CLIENT_HOSTNAME=`echo ${NAO_CLIENTMATCH}| grep  -vE "^([0-9]{1,3}[\.]){3}[0-9]{1,3}/[0-9]{1,2}$"`
  if [ "${CLIENT_HOSTNAME}" != "" ]; then
# When hostname, then check in dns / hosts
    DNS_SHOW=`${SSH} ${NAO_CLUSTERNAME} "dns show -vserver ${NAO_VSERVER_NAME}"| grep ${NAO_VSERVER_NAME}`
    echo "    CLIENT_HOSTNAME=${CLIENT_HOSTNAME} DNS_SHOW=${DNS_SHOW}"
    if [ "${DNS_SHOW}" = "" ]; then
# When no DNS, then check ("local") host entry
      CHK_HOSTNAME=`${SSH} ${NAO_CLUSTERNAME} "dns hosts show -vserver ${NAO_VSERVER_NAME} -hostname ${CLIENT_HOSTNAME}"| grep ${CLIENT_HOSTNAME}`
      if [ "${CHK_HOSTNAME}" = "" ]; then
        echo "!!  NO hostname (${CLIENT_HOSTNAME}) found in (local) DNS (dns hosts)"
        echo "" 
        sleep 2
      fi  # CHK_HOSTNAME}" = ""
    fi  # DNS_SHOW}" != ""
  fi  # CLIENT_HOSTNAME}" != ""


  if [ "${NAO_CLUSTERNAME}" != "" ] && [ "${NAO_VSERVER_NAME}" != "" ]; then

#    echo "  NAO_CLUSTERNAME=${NAO_CLUSTERNAME} NAO_VSERVER_NAME=${NAO_VSERVER_NAME} NAO_QTREE_EXPORT_POLICY=${NAO_QTREE_EXPORT_POLICY} NAO_RULEINDEX=${NAO_RULEINDEX} NAO_PROTOCOL=${NAO_PROTOCOL} NAO_CLIENTMATCH=${NAO_CLIENTMATCH} NAO_RWRULE=${NAO_RWRULE} NAO_RORULE=${NAO_RORULE} NAO_SUPERUSER=${NAO_SUPERUSER} NAO_ANON=${NAO_ANON} NAO_ALLOW_SUID=${NAO_ALLOW_SUID} NAO_ALLOW_DEV=${NAO_ALLOW_DEV} "
#    sleep 1

    if [ "${NAO_RULEINDEX}" != "" ]; then
# Check is rule(index) is already added

      EXP_POL=`${SSH} ${NAO_CLUSTERNAME} "export-policy show -vserver ${NAO_VSERVER_NAME} -policy ${NAO_QTREE_EXPORT_POLICY} -field policyname "|grep ${NAO_VSERVER_NAME} `
      if [ "${EXP_POL}" = "" ]; then
        ${SSH} ${NAO_CLUSTERNAME} "export-policy create -vserver ${NAO_VSERVER_NAME} -policy ${NAO_QTREE_EXPORT_POLICY} "
      fi  # EXP_POL

      EXP_POL_RULE=`${SSH} ${NAO_CLUSTERNAME} "export-policy rule show -vserver ${NAO_VSERVER_NAME} -policy ${NAO_QTREE_EXPORT_POLICY} -ruleindex ${NAO_RULEINDEX}"|grep ${NAO_VSERVER_NAME} `
      if [ "${EXP_POL_RULE}" = "" ]; then
# When ruleindex not there, then create new one
        ${SSH} ${NAO_CLUSTERNAME} "export-policy rule create -vserver ${NAO_VSERVER_NAME} -policy ${NAO_QTREE_EXPORT_POLICY} -ruleindex ${NAO_RULEINDEX} -protocol ${NAO_PROTOCOL} -clientmatch \"${NAO_CLIENTMATCH}\"  -rorule ${NAO_RORULE} -rwrule ${NAO_RWRULE} -anon ${NAO_ANON} -superuser ${NAO_SUPERUSER} -allow-suid ${NAO_ALLOW_SUID} -allow-dev ${NAO_ALLOW_DEV} "
      else
        ${SSH} ${NAO_CLUSTERNAME} "export-policy rule modify -vserver ${NAO_VSERVER_NAME} -policy ${NAO_QTREE_EXPORT_POLICY} -ruleindex ${NAO_RULEINDEX} -protocol ${NAO_PROTOCOL} -clientmatch \"${NAO_CLIENTMATCH}\"  -rorule ${NAO_RORULE} -rwrule ${NAO_RWRULE} -anon ${NAO_ANON} -superuser ${NAO_SUPERUSER} -allow-suid ${NAO_ALLOW_SUID} -allow-dev ${NAO_ALLOW_DEV} "
      fi  # EXP_POL_RULE}" = ""

    fi  # NAO_RULEINDEX}" != ""

# Check default-export
    EXPORT_DEFAULT=`${SSH} ${NAO_CLUSTERNAME} "export-policy rule show -vserver ${NAO_VSERVER_NAME} -policy default -field policy"|grep ${NAO_VSERVER_NAME} `
    if [ "${EXPORT_DEFAULT}" = "" ]; then

# Update default export
      EXPORT_DEFAULT_CLIENT=`${SSH} ${NAO_CLUSTERNAME} "network interface show -vserver ${NAO_VSERVER_NAME} -field address"|grep ${NAO_VSERVER_NAME}|awk '{print $3}'|awk -F\. '{print $1"."$2"."$3".0"}' `
      EXPORT_DEFAULT_NETM_LEN=`${SSH} ${NAO_CLUSTERNAME} "network interface show -vserver ${NAO_VSERVER_NAME} -field netmask-length"|grep ${NAO_VSERVER_NAME} | awk '{print $3}' `

#    if [ ${EXPORT_DEFAULT_NETM_LEN} -eq 24 ]; then
#       EXPORT_DEFAULT_CLIENT="`echo ${EXPORT_DEFAULT_CLIENT}|cut -d\. -f1-3`.0"
#    fi  # /24

      echo "  EXPORT_DEFAULT_CLIENT=${EXPORT_DEFAULT_CLIENT}  EXPORT_DEFAULT_NET_LAN=${EXPORT_DEFAULT_NETM_LEN}"
      sleep 1

      if [ "${EXPORT_DEFAULT_CLIENT}" != "" ] && [ "${EXPORT_DEFAULT_NETM_LEN}" != "" ]; then
        ${SSH} ${NAO_CLUSTERNAME} "export-policy rule create -vserver ${NAO_VSERVER_NAME} -policy default -ruleindex 2 -protocol nfs -clientmatch \"${EXPORT_DEFAULT_CLIENT}/${EXPORT_DEFAULT_NETM_LEN}\"  -rorule sys -rwrule never -super none"
      fi
    fi  # EXPORT_DEFAULT

    echo "= default export(s):"
    ${SSH} ${NAO_CLUSTERNAME} "export-policy rule show -vserver ${NAO_VSERVER_NAME} -policy default -field vserver,policy,protocol,clientmatch,ruleindex,ro,rw,super,anon"|tee -a ${LOG}

    echo "= export-policy rule(s):"
    ${SSH} ${NAO_CLUSTERNAME} "export-policy rule show -vserver ${NAO_VSERVER_NAME} -policy ${NAO_QTREE_EXPORT_POLICY} -field vserver,policy,protocol,clientmatch,ruleindex,ro,rw,super,anon"|tee -a ${LOG}
    ${SSH} ${NAO_CLUSTERNAME} "export-policy rule show -vserver ${NAO_VSERVER_NAME} -field vserver,policy,protocol,clientmatch,ruleindex,ro,rw,super,anon"|tee -a ${LOG}
    echo "= dns hosts:"
    ${SSH} ${NAO_CLUSTERNAME} "dns hosts show -vserver ${NAO_VSERVER_NAME} "|tee -a ${LOG}
    sleep 1
  fi  # !=
}

if [ -f ${CSV} ]; then
  echo "  Found CSV($CSV)"
  cat ${CSV}|grep -v ^#|grep "${FILTER}"|while read LINE
  do
    echo "  LINE=${LINE}"

    NAO_CLUSTERNAME=`echo ${LINE}|awk -F\; '{print $1}'`
    NAO_VSERVER_NAME=`echo ${LINE}|awk -F\; '{print $2}'`
    NAO_QTREE_EXPORT_POLICY=`echo ${LINE}|awk -F\; '{print $3}'`
    NAO_RULEINDEX=`echo ${LINE}|awk -F\; '{print $4}'`
    NAO_PROTOCOL=`echo ${LINE}|awk -F\; '{print $5}'`
    NAO_CLIENTMATCH=`echo ${LINE}|awk -F\; '{print $6}'`
    NAO_RORULE=`echo ${LINE}|awk -F\; '{print $7}'`
    NAO_RWRULE=`echo ${LINE}|awk -F\; '{print $8}'`
    NAO_ANON=`echo ${LINE}|awk -F\; '{print $9}'`
    NAO_SUPERUSER=`echo ${LINE}|awk -F\; '{print $10}'`
    NAO_ALLOW_SUID=`echo ${LINE}|awk -F\; '{print $11}'`
    NAO_ALLOW_DEV=`echo ${LINE}|awk -F\; '{print $12}'`

    UPD_EXPORT

  done  # LINE
else
  if [ ! -d ${DATAINDIR} ]; then
    echo "  NO RC_DIR (${RC_DIR}) found. Exiting ..."|tee -a ${LOG}
    exit 4
  fi  # ! DATAINDIR

# RC-filed
  cd ${RC_DIR}
  ls -1 export*.rc|grep "${FILTER}"|while read FNAME
  do
    echo "FNAME=${FNAME}|"
      . ${RC_DIR}/${FNAME}
  
      UPD_EXPORT

  done  # FNAME (*.rc)
fi  # CSV


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

