# Backup eines Servers
# Erstellen von Backupgenerationen
#
# misc, 9/05
#


# Bitte diese Datei nicht veraendern fuer eine neue Sicherung,
# das Script arbeitet mit einer Parameterdatei!
# Stattdessen einmal mit -h  aufrufen und so die Hilfe 
# ausgeben lassen!

VERSION="1.2"
AUTHOR="Michael.Schaarwaechter@ub.uni-dortmund.de"
PROG=`basename $0`

###########################
# Config
###########################
OWNPATH=/root/backup
SAVETO=/export/backup                 # Hier wird ein Verzeichnis namens servername angelegt
GENERATION=/export/generation         # Hier werden alte Versionen der Sicherungen abgelegt
MAILERRORTO=meine@email.adresse       # Hierhin werden fehlerhaft abgebrochene Backups gemeldet

# Excludedatei=Standard
# Hier nicht veraendern sondern ggf modifizierte exclude_servername anlegen
EXCLUDE=$OWNPATH/exclude_standard

RSYNC="/usr/bin/rsync"
SSH="/usr/bin/ssh"
SSHKEY="/root/.ssh/rsync-key"
KEEPGEN=10

###########################
# Config Ende
###########################


if [  "$1" = "-h"  -o  "x$SERVER" = "x"  -o "x$SERVERPFAD" = "x" ]; then
   echo "---------------------------------------------------------------------------"
   echo $PROG Version $VERSION von $AUTHOR
   echo "---------------------------------------------------------------------------"
   echo "Bitte rufen Sie dieses Script ueber ein eigenes pro zu sicherndem Server auf, "
   echo "in dem die Variablen fuer Servernamen und Pfad definiert werden!"
   echo "Beispiel in backup-servername.sh !"
   echo "Die Datei muss mindestens die beiden folgenden Variablen enthalten,"
   echo "die anderen sind optional:"
   echo "export SERVER=servername"
   echo "export SERVERPFAD=remotepfad"
   echo "export AROPT=weitere_optionen_fuer_rsync"
   echo "export KEEPGEN=zahl_Generationen_die__erhalten_bleiben"
   echo "wobei die Daten rechts der Gleichheitszeichen individuell einzusetzen sind."
   echo "Default fuer KEEPGEN ist $KEEPGEN"
   echo "Wenn KEEPGEN angegeben wird, muss ein Wert enthalten sein!"
   echo
   echo "Zusaetzlich kann eine Datei exclude_servername angelegt werden,"
   echo "in der pro Zeile ein Pfad stehen kann, der bei der Sicherung"
   echo "ausgeschlossen werden soll."
   echo 
   echo "Auf dem Server servername muss vor der Sicherung der Inhalt von"
   echo "$SSHKEY.pub an die /root/.ssh/authorized_keys angehaengt werden."
   echo
   echo "Mehr: Siehe README ."
   echo
   echo "Michael Schaarwaechter, 9/05"
   echo "---------------------------------------------------------------------------"
   exit
fi

echo `/bin/date "+%y%m%d_%H%M%S"` Start $PROG Version $VERSION von $AUTHOR

###### Erst Generationssicherung des letzten Backups (falls vorhanden) erstellen
if [ $KEEPGEN -gt 0 ]; then
   if ! [ -d $GENERATION/$SERVER ]; then
      mkdir $GENERATION/$SERVER
   fi
   if [ -d $SAVETO/$SERVER/ ]; then
      GENDATUM=`/bin/date "+%Y%m%d_%H%M%S"`
      if [ -s $SAVETO/lastbackup-$SERVER ]; then
         GENDATUM=`cat $SAVETO/lastbackup-$SERVER`
      fi
      if ! [ -d $GENERATION/$SERVER/$GENDATUM ]; then
         echo `/bin/date "+%y%m%d_%H%M%S"` sichere letztes Backup von $SERVER nach $GENDATUM 
         mkdir $GENERATION/$SERVER/$GENDATUM
         cp -al $SAVETO/$SERVER/* $GENERATION/$SERVER/$GENDATUM/
         echo `/bin/date "+%y%m%d_%H%M%S"` letztes Backup von $SERVER gesichert
      else
         echo `/bin/date "+%y%m%d_%H%M%S"` $GENERATION/$SERVER/$GENDATUM bereits vorhanden, keine Generation erstellt
      fi
   fi
   if [ ! "x" = "x`ls  $GENERATION/$SERVER/??????_??????`" ]; then
      if [ `ls -dr $GENERATION/$SERVER/??????_?????? | grep -v "^\."| wc -l` -gt $KEEPGEN ]; then
         echo "`/bin/date "+%y%m%d_%H%M%S"` loesche aelteste Sicherung von $SERVER (mehr als $KEEPGEN Sicherungen vorhanden)"
         LASTBACKUP=`ls -dr $GENERATION/$SERVER/??????_?????? | grep -v "^\."|tail -1`
         rm -r $LASTBACKUP
         echo `/bin/date "+%y%m%d_%H%M%S"` aelteste Sicherung $LASTBACKUP von $SERVER geloescht
      fi
   fi
fi

if ! [ "x$BEFOREBACKUP" = "x" ]; then
   echo `/bin/date "+%y%m%d_%H%M%S"` BEFOREBACKUP Start: Fuehre $BEFOREBACKUP auf $SERVER aus
   $SSH -i $SSHKEY $SERVER $BEFOREBACKUP
   if [ $? = 0 ]; then
      echo `/bin/date "+%y%m%d_%H%M%S"` BEFOREBACKUP Ende: $BEFOREBACKUP auf $SERVER beendet
   else
      echo `/bin/date "+%y%m%d_%H%M%S"` BEFOREBACKUP Ende: $BEFOREBACKUP auf $SERVER gescheitert!
      echo "`/bin/date "+%y%m%d_%H%M%S"` Backup $SERVER gescheitert oder fehlerhaft! Logs ansehen!" | \
                     mailx -s "Backup $SERVER gescheitert!" $MAILERRORTO

      exit
   fi
fi

###### Jetzt rsync
echo `/bin/date "+%y%m%d_%H%M%S"` rsyncstart von $SERVER 
if [ -s $OWNPATH/exclude_$SERVER ]; then
   EXCLUDE=$OWNPATH/exclude_$SERVER
fi
RSYNCOPTIONS="-avz --stats --numeric-ids --timeout=3600 --delete --delete-excluded --exclude-from=$EXCLUDE"
echo "RSYNCOPTIONS = $RSYNCOPTIONS"

$RSYNC $RSYNCOPTIONS $AROPT -e "$SSH -i $SSHKEY" $SERVER:$SERVERPFAD $SAVETO/$SERVER

# Rueckgabewert pruefen.
# 0 = fehlerfrei,
# 24 ist harmlos; tritt auf, wenn waehrend der Laufzeit
# von Rsync noch Dateien verändert oder geloescht wurden.
# 23 heisst, einzelne Dateien konnte nicht uebertragen werden
# Alles andere ist fatal -- siehe man (1) rsync
if ! [ $? = 24 -o $? = 0 -o $? = 23 ] ; then
   echo "`/bin/date "+%y%m%d_%H%M%S"` rsync $SERVER gescheitert oder fehlerhaft! Logs ansehen!"
   echo "`/bin/date "+%y%m%d_%H%M%S"` rsync $SERVER gescheitert oder fehlerhaft! Logs ansehen!" | \
                     mailx -s "rsync $SERVER gescheitert!" $MAILERRORTO
else
   echo `/bin/date "+%y%m%d_%H%M%S"` > $SAVETO/lastbackup-$SERVER
fi

echo `/bin/date "+%y%m%d_%H%M%S"` rsync von $SERVER beendet 

if ! [ "x$AFTERBACKUP" = "x" ]; then
   echo `/bin/date "+%y%m%d_%H%M%S"` AFTERBACKUP Start: Fuehre $AFTERBACKUP auf $SERVER aus
   $SSH -i $SSHKEY $SERVER $AFTERBACKUP
   if [ $? = 0 ]; then
      echo `/bin/date "+%y%m%d_%H%M%S"` AFTERBACKUP Ende: $AFTERBACKUP auf $SERVER beendet
   else
      echo `/bin/date "+%y%m%d_%H%M%S"` AFTERBACKUP Ende: $AFTERBACKUP auf $SERVER gescheitert!
   fi
fi

echo `/bin/date "+%y%m%d_%H%M%S"` Ende $PROG Version $VERSION von $AUTHOR


