
#!/bin/sh
# File	: cdot_init_vol_move.sh
# By	: Maarten.deBoer@Atos.net, 221219
# Subject	: Script for moving LIFs
PGM=`basename $0|cut -d\. -f1` 
VER="0.1"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.$$"
SSH="/usr/bin/ssh -n"

INTPUTFILE="${HOME}/data/${PGM}_input.csv"
PINGFILE="${HOME}/data/cdot_ping-addr.csv"
CLUSTER="nlnaf103"
SFILTER="[?]*"
SFILTER="mss"
NFILTER="nlnaf103"

echo "`date` ${PGM} v${VER} started."|tee -a ${LOG}
if [ "${1}" != "" ]; then
  SFILTER=`echo ${1}|grep "[a-z][a-z][a-z]"`
fi
echo "  CLUSTER=${CLUSTER} SFILTER=${SFILTER} NFILTER=${NFILTER}"|tee -a ${LOG}
sleep 1

#echo "  Gathering export info for ping usage in ${PINGFILE} ..."
#${SSH} ${CLUSTER} " export-policy rule show "|grep -v "0.0.0.0" > ${PINGFILE}

cat ${INTPUTFILE}|grep -v ^#|grep "${SFILTER}"|grep "${NFILTER}"|while read LINE
do
# LIF ;Status;Network address/mask;Current Node;Current Port;Is home;New node
  LIF=`echo ${LINE}|awk -F\; '{print $1}'|sed 's/ //g'`
  NETW_ADDR=`echo ${LINE}|awk -F\; '{print $3}'|cut -d\/ -f1`
  CURR_NODE=`echo ${LINE}|awk -F\; '{print $4}'|sed 's/ //g'`
  CURR_PORT=`echo ${LINE}|awk -F\; '{print $5}'`
  NEW_NODE=`echo ${LINE}|awk -F\; '{print $7}'`

  VSERVER="nlnafs${LIF}"
  VLAN=`echo ${LINE}|awk -F\; '{print $5}'|cut -d\- -f2`
  NETWORK=`echo ${LINE}|awk -F\; '{print $3}'|cut -d\/ -f1|awk -F\. '{print $1"."$2"."$3}'`
 
  ${SSH} ${CLUSTER} "vserver show -vserver ${VSERVER} -operational-state running" 1> /dev/null
  EC=${?}
  if [ ${EC} -eq 0 ]; then
    VSERVER_ADDR=`${SSH} ${CLUSTER} "network interface show -vserver ${VSERVER} -lif ${LIF} -field address"|grep ${VSERVER}|awk '{print $3}'`
#    echo "      VSERVER=${VSERVER} LIF=${LIF} NETW_ADDR=${NETW_ADDR} CURR_NODE=${CURR_NODE} CURR_PORT=${CURR_PORT} NEW_NODE=${NEW_NODE} VLAN=${VLAN} VSERVER_ADDR=${VSERVER_ADDR}"
#    echo "    VSERVER=${VSERVER} VLAN=${VLAN} NETWORK=${NETWORK}"
    echo "    VSERVER=${VSERVER}"

# Get Ping-IP-address (not its own)
#    PING_IP_ADDR=`grep ${VLAN} ${PINGFILE}|grep "${NETWORK}"|grep -v ${VSERVER_ADDR}|awk -F\; '{print $3}'|head -1`
    PING_IP_ADDR=`grep "\-${VLAN}" ${PINGFILE}|grep -v ${VSERVER_ADDR}|awk -F\; '{print $3}'|head -1`
    if [ "${PING_IP_ADDR}" = "" ]; then
      echo "      PING_IP_ADDR=${PING_IP_ADDR} NETWORK=${NETWORK} VSERVER_ADDR=${VSERVER_ADDR}"
    fi

# Get Curr node (maybe already moves)
    CURR_NODE=`${SSH} ${CLUSTER} "network inter show -vserver ${VSERVER} -field curr-node"|grep ${VSERVER}|awk '{print $3}'`
    
    if [ "${CURR_NODE}" != "${NEW_NODE}" ] && [ "${PING_IP_ADDR}" != "" ]; then
      echo "      CURR_NODE=${CURR_NODE} NEW_NODE=${NEW_NODE} PING_IP_ADDR=${PING_IP_ADDR}"

      ${SSH} ${CLUSTER} "ping -vserver ${VSERVER} -lif ${LIF} -dest ${PING_IP_ADDR}" 1> /dev/null 2>&1
      EC=${?}
      if [ ${EC} -eq 0 ]; then
        ANSW=""
        echo "Moving LIF ${LIF} at port ${CURR_PORT} from ${CURR_NODE} to ${NEW_NODE}"|tee -a ${LOG}
# REAL MOVE / migrate
        ${SSH} ${CLUSTER} "network interface migrate -vserver ${VSERVER} -lif ${LIF} -destination-node ${NEW_NODE}"
        echo "=== 2nd ping test"
        ${SSH} ${CLUSTER} "ping -vserver ${VSERVER} -lif ${LIF} -dest ${PING_IP_ADDR}" 
        EC=${?}
        if [ ${EC} -eq 0 ]; then
          echo "  Move ${VSERVER}:${LIF} to ${NEW_NODE} = ok"|tee -a ${LOG}
        else
          echo "! Move ${VSERVER}:${LIF} to ${NEW_NODE} NOT ok (EC=${EC})"|tee -a ${LOG}
          echo "Revering back to ${CURR_NODE}"
        ${SSH} ${CLUSTER} "network interface migrate -vserver ${VSERVER} -lif ${LIF} -destination-node ${CURR_NODE}"
          
        fi  # EC} -eq 0
      fi  # EC} -eq 0
    else
      echo "      CURR_NODE=${CURR_NODE} NEW_NODE=${NEW_NODE} PING_IP_ADDR=${PING_IP_ADDR}"
    fi  # PING_IP_ADDR}" != ""
  fi  # VSERVER running
done  # NODE





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

