
#!/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
#(0.3),201022	: Mod. (internal) layout
PGM=`basename $0|cut -d\. -f1`
VER="0.3"
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 "    -l | --list        : List"
  echo "    -m | --mail        : Mail output / result"
  echo "    -n | --snapname    : snapName (${SNAPNAME})"
  echo "    -s | --snaplist    : Snapshot list"
  echo "    -v | --vol         : Volumename (${VOLNAME})"
  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}

# LIST cloned volumes
if [ ${LIST} ]; then
  ${SSH} ${FILER} "df -h" | grep -i clone|grep -v snapshot|awk '{print $1}'|while read CLONENAME REST
  do
    if [ "${CLONENAME}" != "" ]; then
# List the LUNs
       echo ""
       echo "  LIST of LUNs in (clone)volume ${CLONENAME}:"|tee -a ${LOG} ${TMP}
       ${SSH} ${FILER} "lun show" | grep "${CLONENAME}"|awk '{print $1}'| while read LUN REST
       do
         ${SSH} ${FILER} "lun show -v ${LUN}" |tee -a ${TMP}
       done  # LUN
       echo ""
    fi  # ! CLONENAME
  done  # CLONENAME
fi  # LIST

if [ ${SNAPLIST} ]; then
  echo "  LIST of snaps (for cloning) in volume ${VOLNAME}:"|tee -a ${LOG} ${TMP}
  ${SSH} ${FILER} "snap list ${VOLNAME}"|tee -a ${TMP}
fi  # SNAPLIST

if [ ${CLONE} ]; then
  echo "  Source volume ${VOLNAME}:"
  # Check volumename
  ANSW=`${SSH} ${FILER} "df -h ${VOLNAME}"|grep -v snapshot 2>/dev/null` 
  if [ "${ANSW}"  != "" ]; then
# Volume is available, so can be cloned
    echo "${ANSW}"
# Check clonevolumename
    ANSW=`${SSH} ${FILER} "df -h ${CLONENAME}"|grep -v snapshot 2>/dev/null`
    if [ "${ANSW}" = "" ]; then
# If clone-vol is not available, then clone
      echo ""
      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 ""
      echo "  Clone(volume)name (${CLONENAME}) found at filer ${FILER}. NO cloning done."|tee -a ${LOG}
      echo "${ANSW}"
    fi  # ${CLONENAME}
  else  # vol status ${VOLNAME}
    echo "    NOT found at filer ${FILER}. NOT possible to clone."|tee -a ${LOG}
  fi  # vol status ${VOLNAME}
fi  # CLONE



# When REMOVE, then remove clone
if [ ${REMOVE} ]; then
# Check clonevolname
  ANSW=`${SSH} ${FILER} "vol status ${CLONENAME}"` 1> /dev/null 2>&1
# If not empty, then clonename is there
  if [ "${ANSW}" != "" ]; 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  # vol status CLONENAME
fi  # REMOVE

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

