#!/bin/bash
#
# Script zieht per rsync Backups
# http://www.heinlein-partner.de
#
# Aufruf: backup-rsync <fqdn-servername>
#

# ### Aufrufparameter des Scripts ist ein FQDN-Hostname
if [ -n "$1" ] ; then
	SERVER="$1"
else
	echo "Error: Usage $0 <fqdn-hostname>"
	exit
fi
	


# ### Konfiguration
# Sollen wir pruefen, ob noch ein gewisser Prozentsatz 
# an Plattenplatz und Inodes frei ist?
CHECK_HDMINFREE=true
HDMINFREE=90

# Soll die Daten-Partition readonly gemountet werden, 
# wenn wir sie nicht mehr brauchen?
MOUNT_RO=false
MOUNT_DEVICE=/dev/hdc1

# Unter welchem Pfad wird gesichert?
DATA_PATH=/DATA

# Liste von Dateipattern, die nicht gebackupt werden sollen
EXCLUDES=/root/.excludeliste-rsync

# Weitere Optionen für rsync. Ggf. macht eine Limitierung 
# der Bandbreite Sinn, Angabe in kbyte/sec:
# EXTRAOPT="--bwlimit=256"
EXTRAOPT=""


# ### Let´s Rock`n`Roll

# Pruefe auf freien Plattenplatz
GETPERCENTAGE='s/.* \([0-9]\{1,3\}\)%.*/\1/'
if $CHECK_HDMINFREE ; then
	KBISFREE=`df /$DATA_PATH | tail -n1 | sed -e "$GETPERCENTAGE"`
	INODEISFREE=`df -i /$DATA_PATH | tail -n1 | sed -e "$GETPERCENTAGE"`
	if [ $KBISFREE -ge $HDMINFREE -o $INODEISFREE -ge $HDMINFREE ] ; then
		echo "Fatal: Not enough space left for rsyncing backups!"
		logger "Fatal: Not enough space left for rsyncing backups!"
		exit
	fi
fi

# Festplatte rw remounten falls gewünscht!
if $MOUNT_RO ; then
        if `mount -o remount,rw $MOUNT_DEVICE $DATA_PATH` ; then
                echo "Error: Could not remount $MOUNT_DEV readwrite"
                logger "Error: Could not remount $MOUNT_DEV readwrite"
                exit
        fi
fi

# Ggf. Verzeichnis anlegen
if ! [ -d $DATA_PATH/$SERVER/daily.0 ] ; then
        $MKDIR -p $SNAPSHOT_RW/$SERVER/daily.0
fi

# Los geht`s: rsync zieht ein Vollbackup
echo "Starting rsync backup from $SERVER..."
logger "Starting rsync backup from $SERVER..."

rsync  -avz --numeric-ids -e ssh --delete --delete-excluded   \
        --exclude-from="$EXCLUDES"  $EXTRAOPT                   \
        $SERVER:/ $DATA_PATH/$SERVER/daily.0

# Rückgabewert prüfen.
# 0 = fehlerfrei, 
# 24 ist harmlos; tritt auf, wenn während der Laufzeit
# von rsync noch (/tmp?) Dateien verändert oder gelöscht wurden.
# Alles andere ist fatal -- siehe man (1) rsync
if ! [ $? = 24 -o $? = 0 ] ; then
	echo "Fatal: rsync finished $SERVER with errors!"
	logger "Fatal: rsync finished $SERVER with errors!"
fi

# Verzeichnis anfassen, um Backup-Datum zu speichern
touch $DATA_PATH/$SERVER/daily.0

# Fertig!
echo "Finished rsync backup from $SERVER..."
logger "Finished rsync backup from $SERVER..."

# Sicher ist sicher...
sync

# Festplatte ro remounten falls gewünscht!
if $MOUNT_RO ; then
        if `mount -o remount,ro $MOUNT_DEVICE $DATA_PATH` ; then
                echo "Error: Could not remount $MOUNT_DEV readonly"
                logger "Error: Could not remount $MOUNT_DEV readonly"
                exit
        fi
fi

