
#!/bin/sh
# File	: clone_vol-lun.sh
# By	: Maarten.deBoer@Atos.net, 201022
# Subject	: Script to clone a volume (with LUNs) and map the LUN
#(0.2),201022	: Add -m | --mail
PGM=`basename $0|cut -d\. -f1`
VER="0.2"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
SSH="/usr/bin/ssh -n"
MAILTO="maarten.deboer@atos.net"

VOLNAME="bc_atl02_vol002"
SNAPLIST=""
SNAPNAME="nightly.7"
FILER="alnlfas3170b-mgt"
#LUNHOST="ALNLCLN012"
LUNHOSTS="ALNLCLN021 ALNLCLN022"
LUNLIST="alnlcluster02/LUN_CLUSTER02_2_CSV1 alnlcluster02/LUN_CLUSTER02_3_CSV2 alnlcluster02/LUN_CLUSTER02_4_CSV3"
CLONENAME=""
REMOVE=""
LIST=""
CLONE=""
MAIL=""

USAGE()
{
  echo "Usage: ${PGM} [<options>]"
  echo "  Version: ${VER}"
  echo "  options              :"
  echo "    -f | --filer       : Filer (7mode system) name (${FILER})"
  echo "    -h | --help        : this help"
  echo "    -m | --mail        : Mail output / result"
  echo "    -n | --snapname    : snapName (${SNAPNAME})"
  echo "    -s | --snaplist    : Snapshot list"
  echo "    -v | --vol         : Volumename"
  echo "    --clone            : Clone volume"
  echo "    --lunlist          : define a list with LUNs (${LUNLIST}) (space, comma / semicolon separated)"
  echo "    --lunhosts         : define a list with HOSTS (${LUNHOSTS}) (space, comma / semicolon separated)"
  echo "    --mailto           : change mailto (${MAILTO})"
  echo "    --remove           : Remove LUN-MAPs & Clone"
  echo "    -V                 : Version"
  echo "    -x                 : set -x"
}
# Check options
if [ $# -eq 0 ]; then
  echo "No option(s) given. So not to know what to do. Exiting..."; echo; USAGE;
  exit 1
fi
while [ ${#} -ge 1 ]
  do
  case ${1} in
    -h | --help) USAGE; exit 1 ;;
    -f | --filer) VOLNAME="${2}" ; shift ;;
    -v | --vol) VOLNAME="${2}" ; shift ;;
# change the ";" & "," into " " in LUNLIST entry
    --lunlist) LUNLIST=`echo "${2}"|sed 's/\;/ /g'|sed 's/\,/ /g'` ; shift ;;
    --lunhosts) LUNHOSTS=`echo "${2}"|sed 's/\;/ /g'|sed 's/\,/ /g'` ; shift ;;
    -n | --snapname) SNAPNAME="${2}" ; shift ;;
    --mailto) MAILTO="${2}" ; MAIL=1 ; shift ;;
    -m | --mail) MAIL=1 ;;
    -s | --snaplist) SNAPLIST=1 ;;
    -l | --list) LIST=1 ;;
    --clone) CLONE=1 ;;
    --remove) REMOVE=1 ;;
    -V) echo "${PGM}: v${VER}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done


# $ ssh alnlfas3170b-mgt 'vol clone create bc_atl02_vol002_clone_nightly1 -s none -b bc_atl02_vol002 nightly.1'
# $ ssh alnlfas3170b-mgt 'lun online /vol/bc_atl02_vol002_clone_nightly1/alnlcluster02/LUN_CLUSTER02_2_CSV1'
# $ ssh alnlfas3170b-mgt 'lun online /vol/bc_atl02_vol002_clone_nightly1/alnlcluster02/LUN_CLUSTER02_4_CSV3'
# $ ssh alnlfas3170b-mgt 'lun map /vol/bc_atl02_vol002_clone_nightly1/alnlcluster02/LUN_CLUSTER02_2_CSV1 ALNLCLN021'
# $ ssh alnlfas3170b-mgt 'lun map /vol/bc_atl02_vol002_clone_nightly1/alnlcluster02/LUN_CLUSTER02_4_CSV3 ALNLCLN021'


echo "`date` ${PGM} v${VER} started."|tee -a ${LOG}
echo "FILER=${FILER}"
echo "LIST=${LIST}"
echo "LUNLIST=${LUNLIST}"
echo "LUNHOSTS=${LUNHOSTS}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "SNAPLIST=${SNAPLIST}"
echo "SNAPNAME=${SNAPNAME}"
echo "CLONENAME=${CLONENAME}"
echo "REMOVE=${REMOVE}"
echo "VOLNAME=${VOLNAME}"
sleep 1

if [ "${VOLNAME}" = "" ]; then
  echo "  NO volumename (-v | --vol) defined. Exiting ..."|tee -a ${LOG}
  exit 2
fi  # VOLNAME

if [ "${SNAPNAME}" = "" ]; then
  echo "  NO snapname (-n | --snapname) defined. Exiting ..."|tee -a ${LOG}
  exit 3
fi  # VOLNAME

# Define the (new) CloneVolumeName
# Remove the "." in the SnapName
SNAPNAME2=`echo "${SNAPNAME}"|sed 's/\.//g'`
CLONENAME="/vol/${VOLNAME}_clone_${SNAPNAME2}"
echo "CLONENAME=${CLONENAME}"
sleep 1

touch ${TMP}

# Check volumename
ANSW=`${SSH} ${FILER} "vol status ${VOLNAME}"` 1> /dev/null 2>&1
if [ "${ANSW}"  != "" ]; then
# Volume is available
  echo "${ANSW}"
  if [ ${SNAPLIST} ]; then
    ${SSH} ${FILER} "snap list ${VOLNAME}"
  fi  # SNAPLIST

# Check clonevolumename
  ANSW=`${SSH} ${FILER} "vol status ${CLONENAME}"` 1> /dev/null 2>&1

  if [ ${CLONE} ] && [ "${ANSW}" = "" ]; then
# Do want to clone and clone-vol is not available, then clone
    echo "  Cloning volume ${VOLNAME} to ${CLONENAME} ..."|tee -a ${LOG} ${TMP}
    ${SSH} ${FILER} "vol clone create ${CLONENAME} -s none -b ${VOLNAME} ${SNAPNAME}"

# Set LUN online & MAP it to the LUNHOSTS
    for LUN in ${LUNLIST} 
    do
      echo "   Set LUN online : ${CLONENAME}/${LUN} "|tee -a ${LOG} ${TMP}
#      ${SSH} ${FILER} "lun show ${CLONENAME}/${LUN}"
      ${SSH} ${FILER} "lun online ${CLONENAME}/${LUN}"
      for LUNHOST in ${LUNHOSTS}
      do
        echo "      Mapping LUN to : ${LUNHOST}"|tee -a ${LOG} ${TMP}
        ${SSH} ${FILER} "lun map ${CLONENAME}/${LUN} ${LUNHOST}"
      done  # LUNHOST

# Done. Show LUN -verbose & put into file for mailing
      ${SSH} ${FILER} "lun show -v ${CLONENAME}/${LUN}"|tee -a ${TMP}
    done  # LUN

  else  # CLONENAME
    echo "  Clone(volume)name (${CLONENAME}) found at filer ${FILER}."|tee -a ${LOG}
    echo "${ANSW}"
# List the LUNs
    if [ ${LIST} ]; then
      echo ""
      echo "  LIST of LUNs:"
#      ${SSH} ${FILER} "lun show" | grep "${CLONENAME}"

      ${SSH} ${FILER} "lun show" | grep "${CLONENAME}"|awk '{print $1}'| while read LUN REST
      do
        ${SSH} ${FILER} "lun show -v ${LUN}" 

      done  # LUN
      echo ""
    fi  # LIST




# When REMOVE, then remove clone
    if [ ${REMOVE} ]; then

      echo "  Removing clone volume ${CLONENAME} ..."|tee -a ${LOG} ${TMP}

# Check online LUN's
      echo "    Checking mapped LUNs 1st ..."|tee -a ${LOG}
      ${SSH} ${FILER} "lun show"|grep "${CLONENAME}"|grep mapped|awk '{print $1}'|while read MAPPEDLUN REST
      do
        echo "      LUN ${MAPPEDLUN} mapped to:"|tee -a ${LOG} ${TMP}
        ${SSH} ${FILER} "lun show -v ${MAPPEDLUN}"|grep -i maps|cut -d\: -f2|cut -d\= -f1|while read MAPPEDHOST REST
        do
          echo "        UNmapping ${MAPPEDHOST} "|tee -a ${LOG} ${TMP}
          ${SSH} ${FILER} "lun unmap ${MAPPEDLUN} ${MAPPEDHOST}"
        done  # MAPPEDHOST
      done  # MAPPEDLUN

# Check online LUN's 2nd
      echo "    Checking online LUNs 2nd ..."|tee -a ${LOG}
      ${SSH} ${FILER} "lun show"|grep "${CLONENAME}"|grep online|awk '{print $1}'|while read ONLINELUN REST
      do
        echo "      OFFline-ing LUN ${ONLINELUN}"|tee -a ${LOG} ${TMP}
        ${SSH} ${FILER} "lun offline ${ONLINELUN}"

      done  # ONLINELUN

      echo "    Checking online LUNs 2nd ..."|tee -a ${LOG}
      echo "    OFFline clone volume ${CLONENAME} ..."|tee -a ${LOG} ${TMP}
      ${SSH} ${FILER} "vol offline ${CLONENAME}"
      echo "    Destroy clone volume ${CLONENAME} ..."|tee -a ${LOG} ${TMP}
      ${SSH} ${FILER} "vol destroy ${CLONENAME} -f"

    fi  # REMOVE



  fi  # ${CLONENAME}

else  # ${VOLNAME}
# No vol availabe
  echo "  Volumename (${VOLNAME}) NOT found at filer ${FILER}. Exiting ..."|tee -a ${LOG}
  exit 5
fi  # ${VOLNAME}

if [ ${MAIL} ] && [ -s ${TMP} ] ; then
  cat ${TMP} | mailx -s "Clone(d) volume & LUN actions [${PGM} v${VER}]" ${MAILTO}
  echo "  Mailed to ${MAILTO}"|tee -a ${LOG}
fi  # MAIL

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

