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
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.
#!/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"; } }
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.