#/bin/sh -x
###########################################################################
# $Id: clone.sh,v 1.4 2013/06/05 06:19:28 Andreas_A_Kempf Exp $
#
###########################################################################
#
# Clone VM Ware Virual Maschines
#
# 06/2013 Andreas Kempf
#
# Author        : $Author: Andreas_A_Kempf $
# Locker        : $Locker:  $
# Date          : $Date: 2013/06/05 06:19:28 $
# Symbolic Name : $Name:  $
# Revision      : $Revision: 1.4 $
# State         : $State: Exp $
###########################################################################
usage() {
cat <<EOF
	example:
	
	define the Datastore from the old VM
	Default read from the Inventory

	skip automatic search for Datastore 
	submitter manually the Datatore
	datastore=datastore2
	
	shutdown the old VM
	PowerOff=yes

	$0  newVM=VM02 oldVM=VM01
	
	The oldeVM have the Datastore in datastore2 and not registered in Inventory
	$0  newVM=VM02 oldVM=VM01 datastore=datastore2
EOF
exit 1;
}

LIST=$@
if [ -z "${LIST}" ]
then
	echo " ERROR: no Options";
	usage;
fi

valide_OPTIONS="newVM oldVM datastore PowerOff";
for OPTIONS in `echo ${LIST}` 
do
	OPTIONS_tmp=`echo ${OPTIONS}|sed s/"=[.A-Za-z0-9_-]*"//`
	check_OPTIONS=`echo ${valide_OPTIONS}|grep -i "${OPTIONS_tmp}"`
	if [ -z "${check_OPTIONS}" ]
	then
		echo "ERROR: ${OPTIONS} is invalide";
		shift; usage $0;
	fi
	
	eval `echo ${OPTIONS}|awk -vFS="=" '{gsub(/[[:space:]]+/,"",$2);print toupper($1)"='\''"$2"'\''"}'`
done

if [ -n "${NEWVM}" ]
then
	NEW_VM=$NEWVM
else
	echo "error: no new VM given";
	usage $0;
fi

if [ -z "${OLDVM}" ]
then
	SOURCEVM=audit21
else 
	SOURCEVM="${OLDVM}"
fi

VMwareVersion=`/bin/vmware -v|awk '{split($3,array,".");print array[1]"."array[2]}'`;

case $VMwareVersion in
  5*|4.1|6*|7*)  VMwareCMD="/bin/vim-cmd" ;;
  4.0) VMwareCMD="/bin/vmware-vim-cmd" ;;
  *) VMwareCMD="";;
esac


if [ -f "${VMwareCMD}" ]
then
        eval `$VMwareCMD vmsvc/getallvms|awk -vsearch=${OLDVM} '($2==search) {gsub("[[:space:]]","",$3);gsub("[\]|\[]","",$3);print  "_DATASTORE='\''" $3 "'\'';"  "Vmid='\''" $1 "'\'';" }'`
    if [ -z "${DATASTORE}" ]
    then
        if [ -n "${_DATASTORE}" ]
        then
            DATASTORE=$_DATASTORE
        fi
    fi

    if [ -n "${Vmid}" ]
    then
        echo "Virtual Machine ${OLDVM} found in Inventory";
        echo "investigate the power state of the virtual machine";
        Power=`$VMwareCMD vmsvc/power.getstate ${Vmid}|awk '{if ($1 ~ /^Powered/) print $2}'`;

        case $Power in
            on)  
            	if [ -n "${POWEROFF}" ]
            	then
            		echo "Shutdown Virtual Machine ${OLDVM}";
            		$VMwareCMD vmsvc/power.off ${Vmid}
            		
            		if [[ $? != 0 ]]
            		then
	                	echo "error: can not shutdown Virtual Machine ${OLDVM}"
	                	exit 1;
	                fi
            	else
                	echo "error: Virtual Machine is on"
                	echo "Please shutdown the Virtual Maschinei with PowerOff=yes";
                	usage $0;
                fi
            ;;
        esac
    fi
fi 

if [ -z "${DATASTORE}" ]
then
        $VMwareCMD vmsvc/getallvms
	echo "error: can not found Datastore for VM ${NEW_VM}";
	usage $0;
fi
	
UID=`ls -l /vmfs/volumes/${DATASTORE}|awk '{print $NF}'`

DATASTORE=/vmfs/volumes/${UID}
DATASTORE_OLD_VM="/vmfs/volumes/${UID}/$SOURCEVM"
DATASTORE_NEW_VM="/vmfs/volumes/${UID}/$NEW_VM"
VMX="$DATASTORE/$SOURCEVM/${SOURCEVM}.vmx";
NEW_VMX="$DATASTORE/$NEW_VM/${NEW_VM}.vmx";

test -d "$DATASTORE/$NEW_VM" ||  mkdir $DATASTORE/$NEW_VM

if [ -f "$VMX" ]
then
	echo "clone $SOURCEVM to ${NEW_VM}";
	echo "__________________________";

	if [ !  -f "$NEW_VMX" ]
	then
		cat ${VMX}|sed -e s/"${SOURCEVM}"/"${NEW_VM}"/g > ${NEW_VMX}
	fi

	if [ -f "$NEW_VMX" ]
	then
		for NEW_VMDK in `cat ${NEW_VMX}|grep .vmdk|grep -v ${UID}|cut -d "\"" -f2`
		do
			OLD_VMDK="";
			OLD_VMDK=`echo ${NEW_VMDK}|sed -e s/"${NEW_VM}"/"${SOURCEVM}"/g`;
			OLD_VMDK="${DATASTORE_OLD_VM}/${OLD_VMDK}";

			NEW_VMDK="${DATASTORE_NEW_VM}/${NEW_VMDK}";

			if [ -f "$OLD_VMDK" ]
			then
				vmkfstools -i ${OLD_VMDK} ${NEW_VMDK}
			fi
		done

	else
		echo "no new vmx file found:";
		echo "${NEW_VMX}";
		exit 1;
	fi
else
	echo "no vmx file found:"
	echo  "${VMX}";
	exit 1;
fi
