#!/bin/sh
# Kleines Backup Script
# Autor: Thorsten Gunkel <tgunkel@gmx.de>
# 1. Parameter: Typ
# 2. Parameter: Haltedauer

typ=$1
hdauer=$2
config_file="/etc/tg-backup/tg-backup.conf"

beende()
{
 # Ausgabe wieder herstellen
 exec 1>&3
 exec 2>&4
 if [ -s "$backup_err" ]; then
  cat "$backup_err" >&2
 fi
}

beende_mit_fehler()
{
 beende
 exit 1
}

# Konfiguration einlesen
. "$config_file"
if [ "X$file_perm" = "X" ]; then file_perm="0400"; fi
if [ "X$file_owner" = "X" ]; then file_owner="root"; fi
if [ "X$file_group" = "X" ]; then file_group="root"; fi

# Die erzeugten Backups und Logdaten muessen geschuetzt werden
umask 377

# Die Standardein- Ausgabe retten
exec 3>&1
exec 4>&2

# Typ
if [ "$typ" ]; then
 echo -n "Das gewuenschte Backupprofil ist: "; echo -n $typ; echo "."
else
 echo "Dieses Script unterstuetzt mehrere Backupprofile. Damit diese"  >&2
 echo "unterschieden werden koennen muß als erster Parameter ein Name" >&2
 echo "fuer das gewuenschte Profil genannt werden. Sinnvolle Name sind" >&2
 echo "vielleicht:  komplett, teilweise, home, etc, ...."             >&2
 echo                                                                 >&2
 beende_mit_fehler
fi

# Haltedauer
if [ "$hdauer" ]; then
  if [ $hdauer -gt 0 ]; then
   echo -n "Es bleiben "; echo -n $hdauer; echo " Version(en) erhalten.";
  else
   echo "Es muß mindestens eine Version erhalten bleiben." >&2
   echo                                                    >&2
   beende_mit_fehler
  fi;
else
 echo "Als zweiter Parameter wird eine positive Ganzzahl erwartet die" >&2
 echo "angibt wieviel Versionen des Backups verfuegbar sein sollen."    >&2
 echo                                                                  >&2
 beende_mit_fehler
fi

# Datum
datum=`date +%Y-%m-%d`

# Hier wird der Vorgang geloggt
backup_inf="/var/log/tg-backup/backup_"$typ".inf.log"
backup_err="/var/log/tg-backup/backup_"$typ".err.log"

# Die Ausgabe in die Logdateien umlenken
exec 1>>$backup_inf
exec 2>>$backup_err

# Hier werden die eigentlichen Backups abgelegt
daten_dir="/var/backups/tg-backup/"

# So fangen/hoeren die Backups an/auf
daten_file_pre=$daten_dir"backup_"$typ"."
daten_file_end=".tar"
zip_file_end=".bz2"

# Diese Backups werden angelegt.
daten_file="$daten_file_pre$datum$daten_file_end"
zip_file="$daten_file""$zip_file_end"

# Eigentlich nur zum taeglichen Einsatz geplannt
if [ -e "$zip_file" ]; then
 echo "Die Backupdatei existiert bereits."                                  >&2
 echo "Eigentlich sollte das Programm nur einmal am Tag ausgefuehrt werden." >&2
 echo "FIXME?"                                                              >&2
 beende_mit_fehler
fi

echo Backup
echo ------

echo Loesche alte Backups
echo ----------------------------

rm -vf "$daten_file_pre"*"$daten_file_end""$zip_file_end"".tmp" >&2

# Soviel Backups gibt es im Moment
old_list_counter=`ls "$daten_file_pre"*"$daten_file_end""$zip_file_end" | wc -l`

# Sobald $old_list_counter unter Null faellt wird nichts mehr geloescht
# $hdauer Dateien werden auf jeden Fall gerettet
old_list_counter=`expr $old_list_counter - $hdauer + 1`
for old_list in "$daten_file_pre"*"$daten_file_end""$zip_file_end"
    do
	# Solange $old_list_counter nicht Eins ist loeschen
	if  [ 1 -le $old_list_counter ]; then
	    echo Loesche $old_list
	    rm $old_list
	fi
	# Ein Schritt naeher an die rettende Eins
	old_list_counter="`expr $old_list_counter - 1`"	
done;

# Die Liste der (nicht) zu sichernden Dateien
include_list="/etc/tg-backup/tg-backup_"$typ".list"
execlude_list="/etc/tg-backup/tg-backup_"$typ".excl"

if ! [ -r "$include_list" ]; then
 echo "Alle Dateien und Pfade die fuer dieses Profil gesichert werden sollen" >&2
 echo -n "in der Datei: "                                                    >&2
 echo "$include_list"                                                        >&2
 echo "auffuehren."                                                           >&2
 echo                                                                        >&2
 beende_mit_fehler
else
 echo Backup der folgenden Verzeichnisse wird erstellt:
 cat $include_list
 echo
fi

if ! [ -r "$execlude_list" ]; then
 echo "Alle Dateien und Pfade die fuer dieses Profil von der Sicherung" >&2
 echo -n "ausgeschlossen werden sollen in der Datei: "                 >&2
 echo "$include_list"                                                  >&2
 echo "auffuehren."                                                     >&2
 echo                                                                  >&2
 beende_mit_fehler
else
 echo Folgende Dateien werden ausgeschlossen
 cat $execlude_list
 echo
fi

nice -n 5 tar -f "$zip_file"".tmp" -p -P -v --bzip2 -c -T $include_list -X $execlude_list --exclude="$backup_inf" --exclude="$backup_err" --exclude=/var/backups/tg-backup

mv "$zip_file"".tmp" "$zip_file"


# Dateirechte wie gewuenscht aendern
chmod "$file_perm" "$zip_file"
chown "$file_owner"".""$file_group" "$zip_file"

echo
echo Backup beendet!

beende
