#!/bin/bash

RATIO=4
EXCLUDE="/etc/backup.exclude"
LOGFILE="/var/log/backup/`date +%F`"
VG="rootvg"
RET=0
# COMPRESS=bzip2
# EXT=tar.bz2
COMPRESS=gzip
EXT=tgz
MOUNTDIR="/mnt/xenbk"
LVMNTOPT="-o ro,noexec,nodev"

export PATH=$PATH:/usr/bin:/usr/sbin:/bin:/sbin:/usr/local/bin

function print_error {
    ARG=shift
    case $ARG in
        snapshot)
            echo "[`date '+%F %r'`] Error while creating snapshot of lvm $2" | tee -a $LOGFILE
            exit 1
	;;
        tar)
            echo "[`date '+%F %r'`] Error while backing up lvm $2" | tee -a $LOGFILE
            exit 2
	;;
        *)
            echo "[`date '+%F %r'`] Unknown error " | tee -a $LOGFILE
            exit 3
	;;
    esac
}

mkdir -p $(dirname $LOGFILE) >/dev/null 2>&1
touch $LOGFILE
echo "[`date '+%F %r'`] #########  S T A R T  ########"  | tee -a $LOGFILE

echo "[`date '+%F %r'`] Verifying working space mounted"  | tee -a $LOGFILE
mount | grep -q " $MOUNTDIR " || mount $MOUNTDIR
RET=$?
if [ $RET -ne 0 ]
then
    print_error "mount" "failed" && exit 1
fi
echo "[`date '+%F %r'`] Working space mounted correctly"  | tee -a $LOGFILE

# BACKUP ROTATION (LAST 2 DAYS)
WORKDIR=${MOUNTDIR}/today
echo "[`date '+%F %r'`] Verify previous backup"  | tee -a $LOGFILE
if [ -d $WORKDIR ]
then
    [ -e ${MOUNTDIR}/yesterday ] && \
        echo "[`date '+%F %r'`] Remove old backups"  | tee -a $LOGFILE && \
        rm -rf ${MOUNTDIR}/yesterday > /dev/null 2>&1
    mv $WORKDIR ${MOUNTDIR}/yesterday > /dev/null 2>&1
fi
mkdir -p $WORKDIR > /dev/null 2>&1

echo "[`date '+%F %r'`] Backup of disk and LVM structure"  | tee -a $LOGFILE
/sbin/sfdisk -d /dev/sda > $WORKDIR/sfdisk.sda.txt
/sbin/sfdisk -d /dev/sdb > $WORKDIR/sfdisk.sdb.txt
/sbin/vgdisplay > $WORKDIR/vgdisplay.txt
/sbin/lvdisplay > $WORKDIR/lvdisplay.txt
/sbin/pvdisplay > $WORKDIR/pvdisplay.txt

echo "[`date '+%F %r'`] Performing dom0 backup" | tee -a $LOGFILE 
EXFILE=`mktemp`
(grep -v "^vol:" $EXCLUDE ; echo $MOUNTDIR) | sed 's/^./--exclude=/' | tr '\n' ' ' > $EXFILE
(cd / ; (tar -c --one-file-system `cat $EXFILE` -f - . | $COMPRESS > $WORKDIR/xen-dom0.$EXT ) 2>&1 || print_error "tar" "dom0" ; cd - > /dev/null ) | tee -a $LOGFILE
rm $EXFILE > /dev/null 2>&1
echo "[`date '+%F %r'`] Finished dom0 backup" | tee -a $LOGFILE 

for VM in `/usr/sbin/xm list | tail -n +3 | awk '{print $1}' `
do
    echo "[`date '+%F %r'`] Processing VM: $VM" | tee -a $LOGFILE 
    for LVM in `cd /dev/$VG/ ; ls ${VM}_*`
    do
        echo -n "[`date '+%F %r'`]   Processing Logical Volume: ${LVM}: " | tee -a $LOGFILE 
        if grep -q "^vol:$LVM$" $EXCLUDE
        then
            echo "EXCLUDED"  | tee -a $LOGFILE
        else
            echo "BACKUP"  | tee -a $LOGFILE
            SIZE=$(($(lvdisplay --unit M /dev/$VG/$LVM | grep "LV Size" | awk '{print $3}'| cut -f1 -d'.') / $RATIO ))
            lvremove -f /dev/$VG/${LVM}_snapshot > /dev/null 2>&1 
            echo "[`date '+%F %r'`]     Creating snapshot for lvm $LVM (SIZE: $SIZE MB)" | tee -a $LOGFILE
            ( lvcreate -s -n "${LVM}_snapshot" -L ${SIZE}M /dev/$VG/$LVM 2>&1 || print_error "snapshot" "$LVM" ) | tee -a $LOGFILE
 
            mkdir -p /tmp/${LVM}_snapshot
            echo "[`date '+%F %r'`]     Mounting snapshot ${LVM}_snapshot" | tee -a $LOGFILE 
            (mount $LVMNTOPT /dev/$VG/${LVM}_snapshot /tmp/${LVM}_snapshot 2>&1; export RET=$? ) | tee -a $LOGFILE
            if [ $(($RET)) -eq 0 ]
            then
                echo "[`date '+%F %r'`]     Creating archive $LVM.$EXT"  | tee -a $LOGFILE
                cd /tmp/${LVM}_snapshot;
                (tar -c -f - . | $COMPRESS > $WORKDIR/$LVM.$EXT) 2>&1 || print_error "tar" "$LVM" | tee -a $LOGFILE
                cd -;
                echo "[`date '+%F %r'`]     Umounting snapshot ${LVM}_snapshot"  | tee -a $LOGFILE
                umount /tmp/${LVM}_snapshot || handle_error "umount" "$LVM" | tee -a $LOGFILE
            else
                echo "[`date '+%F %r'`] Cannot perform backup of $LVM since mount has failed."  | tee -a $LOGFILE
            fi

            echo "[`date '+%F %r'`] Removing the snapshot of volume ${LVM}" | tee -a $LOGFILE
            lvremove -f /dev/$VG/${LVM}_snapshot 2>&1 | tee -a $LOGFILE
        fi
    done
    echo "[`date '+%F %r'`] Finished $VM backup" | tee -a $LOGFILE 
done

echo "[`date '+%F %r'`] Unmounting Working Space"  | tee -a $LOGFILE
umount $MOUNTDIR
echo "[`date '+%F %r'`] #########    E N D    ########"  | tee -a $LOGFILE


