#!/bin/sh
VERSION=260604
SCRIPT=$(readlink -f $0)
SCRIPTNAME=$(basename $SCRIPT)
SCRIPTDIR=$(dirname $SCRIPT)
if [ "$1" = "-v" ] ; then echo "$VERSION $SCRIPTNAME $SCRIPTDIR";exit 0; fi
if [ -e "$SCRIPTDIR/esc.sh" ] ; then . "$SCRIPTDIR/esc.sh"; fi
LOG=$LOGDIR/log-$SCRIPTNAME.log

if [ -z "$1" ] ; then
	echo "$SCRIPTNAME $version"
	echo ""
	echo "snaps [remove]	- check for existings snapshots. opt. remove aka consolidate them"
	echo "check		- check VM count"
	echo "list		- list backups"
	echo "sum		- show used backup space summary"
	exit
fi

function cmd(){
	ts
	echo -n "$ts $SCRIPTNAME cmd> $@ <rc " >> $LOG
	#echo "$ts $SCRIPTNAME cmd> $@" | tee -a $LOG
        eval "$@"
	rc=$?
	echo $rc >> $LOG
	return $rc
}

if [ "$1" == "snaps" ] ; then
	# https://irg-net.com/index.php/create-show-delete-snapshots-with-esxi-cli/
	rc=0
	count=0
        allvmsids=$(vim-cmd vmsvc/getallvms | awk '$3 ~ /^\[/ {print $1"|"$2}')
        #echo "$allvmsids"
        for e in $(echo "$allvmsids") ; do
                #echo $e
                id=$(echo $e | cut -d"|" -f1)
                name=$(echo $e | cut -d"|" -f2)
		state=$(vim-cmd vmsvc/power.getstate $id | grep -v "runtime info" | cut -d" " -f2)
                res=$(vim-cmd vmsvc/get.snapshotinfo $id)
                #echo "$res"
                lines=$(echo "$res" | wc -l)
                if [ "$lines" -ge 1 ] ; then
			count=$(echo "$res" | grep id | wc -l)
			rc=1
                fi
		echo -n "id:$id name:$name power:$state snapshots:$count remove:"
		if [ "$2" == "remove" ] && [ "$count" -ge 1 ] ; then
			echo "yes"
			cmd "vim-cmd vmsvc/snapshot.removeall $id"
			echo rc:$?
		else
			echo "no";
		fi
        done
        exit $rc
fi

if [ -z "$bkpdir" ] ; then echo "bkpdir var unset.check esc.sh/settings.local"; exit 1; fi
if [ ! -e "$bkpdir" ] ; then echo "backup directory:$bkpdir not existing"; exit 1; fi

if [ "$1" == "check" ] ; then
        ts=$(date +"%Y-%m-%d")
        bkps=$(find $bkpdir -mtime 0 -name STATUS.ok)
        count=$(echo "$bkps" | wc -l)
        vms=$($SCRIPTDIR/list.sh -c) # get the count of all to be backupped VMs
        echo "ts:$ts bkpdir:$bkpdir count-should:$vms count-is:$count"
        # if count of should-amount is to current-amount , exit with 0 otherwise with 1
        if [ "$vms" == "$count" ] ; then exit 0; else exit 1; fi
fi

if [ "$1" == "list" ] ; then
        #echo $bkpdir
        len=$(echo $bkpdir | wc -m)
        echo "existing backups:"
        for f in $(find $bkpdir -mtime 0 -name STATUS.ok)
        do
                sec=${f:$len}
                # deduct name from backup path
                vm=$(echo $sec | cut -d"/" -f1)
                #echo $vm:$f
                echo $vm
                listis="$list $vm"
                echo $vm >> list.tmp
        done
        #echo "list-is: $listis"
        cat list.tmp | sort > 1
        cat list.vms | sort > 2
        echo
        echo "missing backups:"
        for vm in $(diff 1 2 | grep ^+ | grep -v "+++")
        do
                name=${vm:1}
                echo $name
        done
        rm list.tmp 1 2
        exit
fi

if [ "$1" == "sum" ] ; then
	for dir in $(ls -1 $bkpdir) ; do
        	echo "dir: $bkpdir/$dir"
	        du -h -d 1 -c $bkpdir/$dir
	done
	echo
	echo -n "sum: "
	du -h -c -d 0 $bkpdir
	echo
	df -h $bkpdir
	exit
fi

exit
