#!/bin/bash

if [ -z "$1" ]; then
  echo "Usage: $0 guest_name [--start]"
  exit
fi

guest=$1

TGT="ftp://vs@backupserver/ImageBackup"

compress="pigz -c"; cext=".gz" # fastest compression
#compress="gzip -c -1"; cext=".gz"
#compress="xz -c -3 -T 24"; cext=".xz"
#compress="bzip2 -c"; cext=".bz2"
#compress="lbzip2 -c"; cext=".bz2"
#compress="cat"; cext="" # no compression

checksum="md5sum"
#checksum="md5deep"

date=`date +%Y%m%d`
disks=`virsh-xpath --guest $guest --query '//devices/disk/source/@dev' | cut -d'"' -f2`

# override parameters from configuration file
[ -f /etc/sysconfig/virt-backup ] && . /etc/sysconfig/virt-backup

drop_cache() {
  echo 3 > /proc/sys/vm/drop_caches
  sync
}

# check for utilities
check_bin() {
  if [ ! -x /usr/bin/$1 ]; then
    echo "ERROR: binary missing: $1"
    exit 101
  fi
}
check_bin $compress
check_bin $checksum

# exit if domain is already running
if [ "`virsh domstate $guest`" = "running" ]; then
  echo "ERROR: Domain is already running!"
  if [ "$2" != "--force" ]; then
    exit 100
  fi
fi

# create directory
curl -s -n -Q "mkdir ImageBackup/$guest" s$TGT #2>/dev/null

# send files
for disk in $disks; do
  name=`basename $disk`
  drop_cache
  echo "Starting backup for $disk ..."
  #dd if=$disk bs=10M iflag=direct | \
  pv $disk | \
    tee >($checksum | curl -s -S -T - -n s$TGT/$guest/${name}_${date}.md5) | \
    $compress | \
    curl -s -S -T - -n $TGT/$guest/${name}_${date}.img$cext
  drop_cache
done

if [ "$2" = "--start" ]; then
  vs start $guest
fi
