# 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