#!/bin/bash

# Ins aktuelle Verzeichnis wechseln
cd /usr/local/bin

# in /var/local/backup_time ist der Zeitpunkt des letzten Backups
# als Interger-Wert gespeichert
# Es können beliebig viele Backups gemacht werden
if [ ! -f /var/local/backup_time ] 
then
    echo 0 > /var/local/backup_time
fi

# Der mount hängt das vorgesehene Backup-Medium (hier eine USB-Disk).
# In /mnt/backup wird später das root-Verzeichnis des Betriebssystem kopiert.
# Der Einhängepunkt sollte in /etc/fstab definiert sein. Am besten eignet sich 
# hier die UUID di über 'sudo blkid' ermittelt werden kann.
mount /mnt/backup

# Prüft, ob auf der eingehängten USB-Disk die Datei /var/local/startup_time vorhanden ist.
# Die Datei wird mit einem Zeitstempel versehen, sobald über die USB-Disk gebootet wird.
# Der Zeitstempel wird über eine Anweisung in der Datei /etc/rc.local erzeugt:
# date +%s > /var/local/startup_time
# Achtung: Dieser Befehl muss von Hand eingefügt werden.
if [ ! -f /mnt/backup/var/local/startup_time ]
then
    echo 0 > /mnt/backup/var/local/startup_time
fi

lastbackup=`cat /var/local/backup_time`
laststartup=`cat /mnt/backup/var/local/startup_time`

# Hier wird geprüft, ob mit dem Backupmedium gearbeitet wurde.
# Dies wäre der Fall, wenn ein Rechner über die USB-Disk gebootet worden ist.
# In dem Fall darf dann kein Backup durchgeführt werden, da davon ausgegangen
# wird, dass der laufende Rechner erst zurückgesetzt werden muss und ein
# Backup einen aktuellen Stand mit einem älteren überschreiben würde.
# Das Programm wird in dem Fall mit Exit-Code -1 verlassen.
if (( $laststartup > $lastbackup ))
then
    echo "Backup ist nicht erlaubt, da das Backup-Medium benutzt wurde."
    echo "Bitte erst eine Widerherstellung starten."
    umount /mnt/backup

    exit -1
fi


# Backup ist erlaubt
# Aktuelle Backup-Zeit ausgeben
date +%s > /var/local/backup_time

if [ -d /mnt/backup/proc ]; then
	# service_stop ist ein eigenes Script, dass alle Services stoppt,
	# die bei einem Backup nicht laufen sollten; MySQL oder OpenLDAP z.B.
    service_stop

	# Sofern die root-Partition über ein LVM verfügt, kann ein Snapshot
	# erstellt werden. Dies hat den Vorteil, dass die beendeten Server 
	# anschließend sofort wieder gestartet werden können.
	# Das Script "snap" ist gehört ebenfalls zu dieser Script-Sammlung
    # Snapshot erstellen und einhägen
    /usr/local/bin/snap
    
    # Datenbank-Server wieder starten
    # Falls kein Snapshot via LVM gemacht werden kann, darf das folgende Script 
    # erst nach erfolgtem Backup ausgeführt werden
    service_start

    #Daten sichern
    # in der Exclude-Datei /usr/local/etc/backup/exclude stehen die Dateien, die nicht mitgesichert werden sollen.
    rsync -av --delete --exclude-from=/usr/local/etc/backup/exclude /mnt/snap/ /mnt/backup

	# Das Srript unsnap gehört ebenfalls zu dieser Scriptsammlung
	# Der Snapshop wird nicht mehr benötigt und kann damit gelöscht werden.
    # Snapshot aushängen und löschen
    /usr/local/bin/unsnap
else 
    echo "Backup-Gerät ist nicht eingehängt."
fi

umount /mnt/backup

# Hier könnte man "service_start" platzieren, falls kein LVM zur Verfügung steht.

