#!/bin/sh


#Edit these values to match you environment
#####################################
#The datastore to backup to
backupDataStore=datastore1

#The directory on the above datastore to backup to(the default is mm-dd-yyyy)
#backupDirectory=back_temp/$(date +%m-%d-%Y)
backupDirectory=back_temp

distBaseDir=/vmfs/volumes/$backupDataStore/$backupDirectory

#The name of a virtual machine. allow to contain space in name.
# vmsToBackup="$*"
vmName="$*"

LINE_SEP='
'
#####################################

check_running_task (){
  for i in `vim-cmd vimsvc/task_list | grep vim.Task:haTask-$1 | grep $2 | sed -e 's/.*vim.Task://' -e "s/[', ]//g"`; do
    if [ "`vim-cmd vimsvc/task_info $i | grep running`" != "" ] ; then
      return 0
    fi
  done
  return 1
}

# getVmId (){
# vim-cmd vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/   /g' | awk -F'   ' '{ if ($2 == vmname) print $1}' vmname="$*"
# }
# 
# getVmx (){
# vim-cmd vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/   /g' | awk -F'   ' '{ if ($1 == vmid) print $3}' vmid=$1
# }

# 
getVMDKs(){
  OLD_IFS=$IFS
  IFS=$LINE_SEP
  
  for i in $(grep '.vmdk"' "$*" | awk -F "\"" '{print $2}'); do
    firstchar=`echo "$i" | cut -c 1-1`
    if [ "$firstchar" = "/" ]; then
      echo $i
    else
      echo ${*%/*}/$i
    fi
    #echo $i
  done
  
  IFS=$OLD_IFS
}


startTime=$(date)
echo Backup start time: $startTime

echo Creating backup directory "$distBaseDir"
mkdir -p "$distBaseDir"

echo Backing up ESXi host configuration...
vim-cmd hostsvc/firmware/backup_config
cp /scratch/downloads/*.tgz "$distBaseDir"

# vmid=`getVmId $vmName`
# echo $vmid
# vmx=`getVmx $vmid`
# echo $vmx

vmIdAndConfigPath=$( vim-cmd vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/   /g' | awk -F'   ' '{ if ($2 == vmname) print $1 ";" $3}' vmname="$vmName")
vmId=${vmIdAndConfigPath%;*}

if [ "$vmId" != "" ]; then
  echo Backing up virtual machine: $vmName 
  
  echo Backing up the virtual machines configuration...
  vmConfigurationFileInfo=$(echo ${vmIdAndConfigPath#*;} | sed -e 's/\[\(.*\)\] \(.*\)/\1;\2/')
  vmConfigurationSourceDataStore=${vmConfigurationFileInfo%;*}
  vmConfigurationFile=${vmConfigurationFileInfo#*;}
  vmBaseDir=${vmConfigurationFile%/*}
  vmConfigurationFile=${vmConfigurationFile##*/}
  srcBaseDir="/vmfs/volumes/$vmConfigurationSourceDataStore/${vmBaseDir}"
  
  echo Backup source directory : "$srcBaseDir"
  echo vmx : "$vmConfigurationFile"
  
  echo Making directory "$distBaseDir/$vmBaseDir"
  mkdir -p "$distBaseDir/$vmBaseDir"
  echo Copying "$srcBaseDir/$vmConfigurationFile"  to "$distBaseDir/$vmBaseDir/$vmConfigurationFile"
  cp "$srcBaseDir/$vmConfigurationFile" "$distBaseDir/$vmBaseDir/$vmConfigurationFile"
  
  vmDiskFilePaths=`getVMDKs "$srcBaseDir/$vmConfigurationFile"`
  # echo $vmdks
  
  
  echo Taking the snapshot...
  vim-cmd vmsvc/snapshot.create $vmId "Backup"
  
  # echo Waiting $waitTime for the snapshot to complete...
  #sleep $waitTime
  echo Waiting for the snapshot to complete...
  while check_running_task $vmId createSnapshot; do sleep 1; done
  
  # echo Getting diskFile list...
  # vmDiskFilePaths=$(vim-cmd vmsvc/get.filelayout $vmId | grep -i snapshotFile -A2000 | sed -n -e 's/\"\[\(.*\)\]\s\(.*\.vmdk\)\"\,\?/\1;\2/pg')
  echo $vmDiskFilePaths
  echo Found $(echo "$vmDiskFilePaths" | wc -l) disk file\(s\)...
  OLD_IFS=$IFS
  IFS=$LINE_SEP
  for vmDiskFilePath in $vmDiskFilePaths; do
    # vmDiskFileSourceDataStore=${vmDiskFilePath%;*}
    vmDiskFile="${vmDiskFilePath##*/}"
    echo $vmDiskFilePath
    
    if [ -e "$vmDiskFilePath" ]; then
      echo Cloning "$vmDiskFilePath" to "$distBaseDir/$vmBaseDir/$vmDiskFile"
      vmkfstools -d thin -i "$vmDiskFilePath" "$distBaseDir/$vmBaseDir/$vmDiskFile"
    fi
  done
  IFS=$OLD_IFS
  
  echo Removing the snapshot...
  # vim-cmd vmsvc/snapshot.removeall $vmId
  SNAPSHOT_ID=$(vim-cmd vmsvc/snapshot.get $vmId | grep -E '(Snapshot Name|Snapshot Id)' | grep -A1 "Backup" | grep "Snapshot Id" | awk -F ":" '{print $2}' | sed -e 's/^[[:blank:]]*//;s/[[:blank:]]*$//')
  for id in $SNAPSHOT_ID; do
    vim-cmd vmsvc/snapshot.remove $vmId ${id} 
  done
  
else
  echo ERROR: Could not get an id for $vmName
fi
# done


#cd /vmfs/volumes/$backupDataStore/$backupDirectory/
#dirnames=`ls -F /vmfs/volumes/$backupDataStore/$backupDirectory/ | grep /`
#
#for d  in ${dirnames};do
#  dirname=`echo $d | cut -d / -f 1`
#  echo compress ${dirname}
#
#  tar -czvf ${dirname}.tar.gz ${dirname}
#  rm -r ${dirname}
#done


endTime=$(date)
echo Backup end time: $endTime
#echo Elapsed time: $(($startTime - $endTime))
