= Backup bei
Sourceforge =

Manchmal ist es nötig, schnell und einfach Daten von einem anderen
Server zu sichern. So ist dies auch bei Sourceforge. Sourceforge
ist so nett, unsere Website und damit auch unser Wiki zu hosten.
Leider ist es bei Sourceforge jedoch so, dass alle vom Web her
aufgerufenen CGI-Skripten (also auch unser Wiki) aus
Sicherheitsgründen immer dieselbe User-ID haben. Deshalb kann
jemand anderes, der Zugriff auf ein anderes der zigtausend
SF-Projekte hat, ruck-zuck die vom Wiki-Skript angelegten Daten
ändern oder löschen.

Nun werdet Ihr meinen: So was tut bei Sourceforge doch keiner.
Leider reicht aber faktisch schon ein leichtfertiges '''rm -rf
/''', um das ganze Wiki verschwinden zu lassen. Also muss ein
Backup-System her. Dabei wollte ich folgende Anforderungen
erfüllen:

== Was soll geschehen? ==

* tägliche Sicherung des gesamten Wikis
* Auch Sicherung meines anderen SF-Projektes
* Sicherung nur des Wikis, nicht der ganzen Website
* Verbraten von möglichst wenig Bandbreite (Sourceforge zuliebe),
also nur übertragen, wenn sich was geändert hat
* Archivierung der Backups auf meinem heimischen Rechner

Dabei bin ich zu folgendem Skript gekommen. Wer es benutzen will
oder Fragen dazu hat, kann sich gerne bei mit (ThomasBayen) melden!

== So gehts ==

Vorbedingung ist, dass man sich mit ssh-keys ohne Passwort
einloggen kann. Wie dies geht, erklärt Sorceforge unter
http://sourceforge.net/docman/display_doc.php?docid=761&group_id=1

In meinem Skript benutze ich SSH1 (mit der -1 - Option). Dies liegt
nur daran, dass das Script schon länger läuft, als mein ssh mit
SSH2 umgehen kann. Bei einer neuen Installation sollten direkt
SSH2-Schlüssel erzeugt werden.


<pre>
#!/usr/bin/perl
# backup.pl
# Script f?r automatisches Backup meiner Sourceforge-Wikis
#
# Dieses Script sollte mit forgender Crontab gestartet werden:
#
----------------------------------------------------------------------
# MAILTO=tbayen@bayen.de
# @midnight /usr/bin/perl
/home/tbayen/perl/FinalEmpire/backup/backup.pl
#
----------------------------------------------------------------------


use warnings;
use diagnostics;
use strict;


# Parameter
###########
my $username='tbayen';                                 # Username
bei Sourceforge
my $shellserver='shell.sf.net';
my @projekte=('empire','lug-kr');                      # Namen der
symbolischen Links in meinem Home-Verzeichnis bei SF
my $backupdir='/home/tbayen/perl/FinalEmpire/backup';  # Directory
auf dem lokalen Rechner


chdir $backupdir;
foreach my $projekt(@projekte){

  # Hilfsvariablen werden erzeugt:
  my $backupfile="backup/${projekt}_wiki_daily.tgz";

  # Tar-File wird erzeugt und L?nge extrahiert:
  my $output=`ssh -1 $username\@$shellserver 'tar czf $backupfile
$projekt/wiki && wc -c $backupfile'`;
  die "Fehler beim Zugriff auf Sourceforge" unless $output;
  my $laenge=0;
  if(open FILE,"<${projekt}_laenge"){
    $laenge=<FILE>;
    close FILE;
  }
  $output=~/^\s*(\d+)\s/;
  my $neuelaenge=$1;
  # Wenn sich die L?nge ge?ndert hat, wird die Datei geholt
  if($laenge != $neuelaenge){
    # Datum soll mit in den Dateinamen, muss also erstmal berechnet
werden
    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
    my $time=($year+1900).($mon+1).$mday;
    system "scp -1 -q $username\@$shellserver:$backupfile
${projekt}_wiki_$time.tgz";
    # L?nge speichern, damit ?nderungen beim n?chsten Mal erkannt
werden:
    open FILE,">${projekt}_laenge";
    print FILE $neuelaenge;
    close FILE;
    print "Projekt $projekt gesichert.\n";
  }
}
</pre>

== Was fehlt ==

Im Moment prüfe ich, ob sich was geändert hat, indem ich die Länge
des *.tgz-Archivs vergleiche. Für Wikis, in denen jede Änderung
meist eine Menge Datenbytes erzeugt, ist das sicherlich völlig
ausreichend. Wer das Script jedoch für was anderes benutzen will,
sollte sich mal das Programm '''md5sum''' ansehen und in einem
zusätzlichen Schritt eine Checksumme der Datei vergleichen.

== Verbesserungen ==

Ich habe eine verallgemeinerte Version dieses Scripts geschrieben.
Sie ist auf der Seite 
BackupScript beschrieben. Dort habe ich z.B. auch md5sum benutzt.