#!/bin/bash
#set -x
#exec >/tmp/restore_$id 2>&1
# log contents
action=2
step=1
result=0
content="Restore to new vm start"
reason=
write_log(){
    sqlite3 /unas/etc/vmbackup/vmbackup.db "INSERT INTO t_log( log_time, hst_address, hst_port, vm_name, log_action, log_step, log_result, log_content, log_reason)VALUES( DATETIME(CURRENT_TIMESTAMP, 'localtime'), \"$ESXI_URL\", \"$ESXI_PORT\", \"$VM\", \"$action\", \"$step\", \"$result\", \"$content\", \"$reason\");"
}

run_dir=/run/vmbackup/restore_new/$id
[ -d "$tmp_dir" ] || mkdir -p "$tmp_dir"

src_vmdk(){
    OIFS="$IFS"
    IFS=$'\n'
    for vmdk_path in `find . -name '*.vmdk'`
    do
        vmdk=`basename "$vmdk_path"`
        if grep -wq "\"$vmdk\"" "$VM.vmx";then
            mv "$vmdk_path" ./
        else
            vmdk_preg=`echo "$vmdk" | sed 's/.vmdk$/-[0-9]{6}.vmdk/'`
            vmdk=`grep -Ewo "$vmdk_preg" "$VM.vmx"`
            if [ $? -eq 0 ];then
                mv $vmdk_path $vmdk
            fi
        fi
    done
    IFS=$OIFS
}

correct_vmx_resource(){
    src_vmdk

    # Remove iso
    for iso_device in `grep -w '"cdrom-image"' "$VM.vmx" | awk -F '.' '{print $1}'`
    do
        sed -i "s/^$iso_device\.deviceType = .*$/$iso_device\.deviceType = \"atapi-cdrom\"/g;s/^$iso_device\.fileName = .*$/$iso_device\.fileName = \"auto detect\"/g" "$VM.vmx"
        grep -q "$iso_device.startConnected" "$VM.vmx" || echo "$iso_device.startConnected = \"FALSE\"" >> "$VM.vmx"
        grep -q "$iso_device.autodetect" "$VM.vmx" || echo "$iso_device.autodetect = \"TRUE\"" >> "$VM.vmx"
        grep -q 'tools.guest.desktop.autolock' "$VM.vmx" || echo "tools.guest.desktop.autolock = \"FALSE\"" >> "$VM.vmx"
    done

    # Correct name
    sed -i "s/^displayName = \"$VM\"$/displayName = \"$VM_NEW\"/g;s/^nvram = \"$VM\.nvram\"$/nvram = \"$VM_NEW\.nvram\"/g" "$VM.vmx"

    # Power state
    sed -i "s/^powerType\.powerOff = \".*\"$/powerType\.powerOff = \"soft\"/g;s/^powerType\.suspend = \".*\"$/powerType\.suspend = \"soft\"/g;s/^powerType\.reset = \".*\"$/powerType\.reset = \"soft\"/g" "$VM.vmx"
}

if [ -f "$backup_dir/$VM.vmx" ];then
    cp "$backup_dir/$VM.vmx" "$tmp_dir/$VM.vmx"
fi

# $cond - "select current" by default
jobId=`echo restore where="$tmp_dir" client=$id fileset=$id jobid=$JOB_ID replace=always pluginoptions="python:localvmdk=yes" $cond done all yes | bconsole | grep -e 'Job queued\. JobId=[1-9][0-9]*' | awk -F = '{print $2}'`

write_log

if [ -n "$jobId" ];then
    status=`echo wait jobid=$jobId | bconsole | grep JobStatus=`
    if echo $status | grep -q 'JobStatus=OK (T)';then
        cd "$tmp_dir"
        correct_vmx_resource
        ovftool -o "$VM.vmx" ./
        GOVC_USERNAME="$ESXI_USER" GOVC_PASSWORD="$ESXI_PASS" /unas/sbin/vmbackup/engine import.ovf -u $ESXI_URL:$ESXI_PORT -ds="$DS" -k "./$VM_NEW/$VM_NEW.ovf"
        if [ $? -eq 0 ];then
            step=99
            content="Restore to new vm completed"
            result=0
            write_log
        else
            step=84
            content="Restore to new vm failed"
            reason="Failed to generate new vm. Please make sure ESXi is accessiable."
            result=1
            write_log
        fi
    else
        step=84
        content="Restore to new vm failed"
        reason="Failed to output VMDK"
        result=2
        write_log
        echo Failed to output VMDK
    fi
else
    step=84
    content="Restore to new vm failed"
    reason="Failed to create restore job"
    result=3
    write_log
    echo Insert job failed
fi

rm -rf $tmp_dir $run_dir
