Homepage Inspire-world | Forum
CGI/Perl Workshops Tägliches automatisches Backup

 Inhaltsverzeichnis/Workshops Übersichtsseite/Tägliches automatisches Backup
Das Backup - eigentlich die "Lebensversicherung" des Webmasters, nur leider sehr Stiefmütterlich behandelt. Meist kommt die Panik erst dann wenn es mal was zerschossen hat. In diesem Workshop soll der Webmaster mal etwas entlastet werden, stattdessen lassen wir unsere Besucher das mit dem Backup erledigen. Um allerdings die Besucher die Arbeit machen zu lassen muss der Webmaster schon erstmal selbst aktiv werden.

Grundgedanke ist das der erste Benutzer eines Sciptes zu beginn eines neuen Tages die Funktion auslösen soll bevor überhaupt etwas anderes passiert.

1. Der Scriptaufbau

Nötig ist zuerst ein Stück Code welches einen Datum in der Form 17-11-2002 zurückgibt. Ich habe das hier wieder in eine Subroutine gepackt. So ist das ganze wieder in verschiedenen Scripten einbindbar.
# - - - - - - - - - - - - - - - - - - - - - - - - - - #
# Datumsroutine
# - - - - - - - - - - - - - - - - - - - - - - - - - - #
sub datumsausgabe {

($sec, $min, $stunde, $mtag, $mon, $jahr, $tag, $nr_tag, $isdst) = localtime(time);
$monat = $mon+1;
if($monat < 10) { $monat = "0$monat"; }
if($stunde < 10) { $stunde = "0$stunde"; }
if ($min < 10) { $min = "0$min"; }
if ($sec < 10) { $sec = "0$sec"; }
$jahr = 1900 + $jahr;

# Backupdatum erzeugen fuer die Verwendung als Backupverzeichnisname
# Es wird hier ein solches Datumsformat zurückgegeben: 17-11-2002
$datum_backup = "$mtag-$monat-$jahr";
}
Um nun abzufragen ob denn ein neuer Tag erreicht ist muss der Datum des aktuellen Tages in einer Datei gespeeichert werden.

Erläuterungen dazu:
  • +< bedeutet das diese Datei zum lesen und schreiben geöffnet wird
  • unless ($inhalt eq $datum_backup) { per unless (wenn nicht) werden nun der Dateiinhalt und der tatsächliche Datum verglichen. Entsprechen sich die Werte nicht so wird der aktuelle Datum in die Datei geschrieben.
  • Ist die Bedingung erfüllt das sich die Beiden Werte nicht entsprechen, so wird $datumswert = 1;, Das wird später als Backupauslöser eingesetzt.
  • truncate löscht nun den Dateiinhalt und seek setzt Den Dateizeiger an den Dateianfang.
  • Mit print DATUM $datum_backup; wird dann der aktualisierte Datum in die Datei geschrieben
open (DATUM, "+<$pfad/backuptime.dat");
$inhalt = <DATUM>;
unless ($inhalt eq $datum_backup) {
$datumswert = 1;
truncate(DATUM,0);
seek(DATUM,0,0);
print DATUM $datum_backup;
}
close (DATUM);
Das wichtigste bei der Backupgeschichte ist die Einbindung des File Copy Modules welches zur Perl Standardausstattung gehört.
# Modul File Copy 
use File::Copy;
So, nun sind die Vorarbeiten erledigt, jetzt wird das Backup angelegt.
Zuerst wird mit if ($datumswert) abgefragt ob $datumswert Wahr ist. Im nächsten Schritt wird das Backupverzeichnis angelegt und mit CHMOD 777 versehen. Das Verzeichnis backups muss hier aber schon existieren!
if ($datumswert) {

mkdir "$pfad/backups/$datum_backup",0777;
chmod(0777, "$pfad/backups/$datum_backup");
Nun werden die Dateien angegeben die vom Ausgangsverzeichnis in das Backupverzeichnis kopiert werden sollen.
copy("$startpfad/userdaten.dat","$zielpfad/backups/$datum_backup/userdaten.dat");
copy("$startpfad/email.dat","$zielpfad/backups/$datum_backup/email.dat");
Anschließend wird der CHMOD gesetzt auf die Dateien.
chmod(0777, "$zielpfad/backups/$datum_backup/userdaten.dat");
chmod(0777, "$zielpfad/backups/$datum_backup/email.dat");
Will man ein ganzes Verzeichnis mit Dateien sichern deren Anzahl und Dateinamen nicht bekannt sind so kann dies auf diese Weise geschehen.
opendir(DIR,"$startpfad/Verzeichnis") or die "Kann Verzeichnis nicht oeffnen";;
@files=readdir(DIR);
closedir(DIR);
foreach(@files){
copy("$startpfad/Verzeichnis/$_","$zielpfad/backups/$datum_backup/$_",0777);
chmod(0777, "$zielpfad/backups/$datum_backup/$_");
}
} « Diese schließende Klammer beendet die bei if ($datumswert) { geöffnete If-Abfrage.

Dieses Beispiel hier ist nahezu beliebigst erweiterbar, man sollte allerdings beachten das unter Umständen auch noch weitere Verzeichnise nötig werden die Dateien aufnehmen können. Hat man so eine Backuproutine einmal in Betrieb und es wird eine oder mehrere Datei(en) zerstört oder beschädigt kann man zumindest auf die Daten des vorangegangenen Tages zurückgreifen.

2. Ein komplettes Beispielscript

#!/usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);

# Modul File Copy 
use File::Copy;

&datumsausgabe;

open (DATUM, "+<$pfad/backuptime.dat");
$inhalt = <DATUM>;
unless ($inhalt eq $datum_backup) {
$datumswert = 1;
truncate(DATUM,0);
seek(DATUM,0,0);
print DATUM $datum_backup;
}
close (DATUM);

if ($datumswert) {

mkdir "$pfad/backups/$datum_backup",0777;
chmod(0777, "$pfad/backups/$datum_backup");
copy("$startpfad/userdaten.dat","$zielpfad/backups/$datum_backup/userdaten.dat"); copy("$startpfad/email.dat","$zielpfad/backups/$datum_backup/email.dat"); chmod(0777, "$zielpfad/backups/$datum_backup/userdaten.dat"); chmod(0777, "$zielpfad/backups/$datum_backup/email.dat"); opendir(DIR,"$startpfad/Verzeichnis") or die "Kann Verzeichnis nicht oeffnen";; @files=readdir(DIR); closedir(DIR); foreach(@files){ copy("$startpfad/Verzeichnis/$_","$zielpfad/backups/$datum_backup/$_",0777); chmod(0777, "$zielpfad/backups/$datum_backup/$_"); } } # - - - - - - - - - - - - - - - - - - - - - - - - - - # # Datumsroutine # - - - - - - - - - - - - - - - - - - - - - - - - - - # sub datumsausgabe { ($sec, $min, $stunde, $mtag, $mon, $jahr, $tag, $nr_tag, $isdst) = localtime(time); $monat = $mon+1; if($monat < 10) { $monat = "0$monat"; } if($stunde < 10) { $stunde = "0$stunde"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } $jahr = 1900 + $jahr; $datum_backup = "$mtag-$monat-$jahr"; }



 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Tägliches automatisches Backup
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!