next up previous contents
Nächste Seite: Festlegen, ob eine Datei Aufwärts: Grundlegende Konzepte Vorherige Seite: Löschen von alten Backups   Inhalt


Definition von Regeln

Regeln können z.B. in storeBackup.pl (Optionen exceptRule, includeRule, comprRule) sowie in storeBackupSearch.pl (Option searchRule) definiert werden. Beide unterstützen die Definition von Regeln auf der Kommandozeile und in der Konfigurationsdatei.

Dieser Teil der Beschreibung zeigt, wie in storeBackup Regeln verwendet werden können. Wenn Du Dich nicht mit Pattern Matching in perl auskennst, solltest Du die Beispiele sehr vorsichtig und immer nur etwas verändern. Du kannst jedoch leicht Fehlermeldungen bekommen, die Du nicht verstehst.

Alle Beispiele sind so erklärt, wie sie in Konfigurationsdateien verwendet werden können. Meistens wird ein Schlüsselwort von storeBackup.pl benutzt (exceptRule22), aber die Syntax für die Regeln ist identisch für die anderen Schlüsselworte (z.B. includeRule oder searchRule). Später sehen wir dann, wie die Regeln auf der Kommandozeile verwendet werden können.

Alle Zeiten oder Zeiträume, die im folgenden erwähnt werden, betreffen die Zeit des Backups selbst, nicht die der Dateien im Backup selbst!

Allgemein gesagt: Regeln sind ein paar Zeilen Perl mit einigen Spezialitäten. Starten wir mit einem einfachen und typischen Beispiel:

BEISPIEL 1:

exceptRule = '$size > 1610612736'

(Beachte die Anführungszeichen und erzeuge eine Konfigurationsdatei mittels storeBackup.pl oder mit storeBackupSearch.pl und lies die Kommentare am Anfang darüber, wie das Quoting funktioniert und wie Environment-Variablen interpretiert werden.)

Diese Regel trifft für alle Dateien mit mehr 1.5GB ($1.5 * 1024^3$) Bytes zu. $size repräsentiert die Größe jeder individuellen Datei. In diesem Beispiel werden alle Dateien mit mehr als 1.5GB Größe nicht gesichert. Das ist nicht gut lesbar, daher gibt es folgende Möglichkeit:

exceptRule = '$size > &::SIZE("1.5G")'

(Beachte alle Anführungszeichen.) Dieses hat denselben Effekt wie sie Definition vorher. &::SIZE ist eine Funktion, wie den zahlenmäßigen Wert des Srings „1.5G`` errechnet. Du kannst Kennungen von 'k' bis 'P' mit der folgenden Bedeutung verwenden:

1k 1 kilobyte = 1024 Byte
1M 1 Megabyte = $1024^2$ Byte
1G 1 Gigabyte = $1024^3$ Byte
1T 1 Terabyte = $1024^4$ Byte
1P 1 Petabyte = $1024^5$ Byte

z.B. ist &::SIZE("0.4T") richtig, aber nicht &::SIZE("1G1M").

BEISPIEL 2:

exceptRule = '$file =~ m#\.bak$#'

(Beachte alle Anführungszeichen.) Diese Regel gilt für alle Dateien mit der Endung '.bak', was bedeutet, dass diese nicht gesichert werden. $file repräsentiert jeden individuellen Dateinamen mit dem relativen Pfad unterhalb der Option sourceDir von storeBackup.pl. Falls Du das komische Ding hinter $file nicht verstehst - das nennt sich regulärer Ausdruck. Siehe man perlretut (perl regular expression tutorial) für eine ausführliche Dokumentation. Aber Du solltest auch so in der Lage sein, es für einfache Anforderungen anzupassen:

exceptRule = '$file =~ m#\.bak$#' or '$file =~ m#\.mpg$#'

(Beachte alle Anführungszeichen und alle Leerstellen.) Diese Regel gilt für alle Dateien, die mit '.bak' oder mit '.mpg' enden und verhindert daher ihre Sicherung.

exceptRule = '$file =~ m#\.bak$#' or '$file =~ m#\.mpg$#'
	   or '$file =~ m#\.avi$#'

Es sollte jetzt keine Überraschung sein, dass hiermit Dateien mit '.bak', '.mpg' bzw. '.avi' nicht gesichert werden.

Nun schreiben wir eine Regel, die verhindert, dass Dateien gesichert werden, die mit '.bak', '.mpg' oder '.avi' enden sowie alle Dateien, die größer als 500 Megabyte sind:

exceptRule = '$file =~ m#\.bak$#' or '$file =~ m#\.mpg$#'
	   or '$file =~ m#\.avi$#' or '$size > &::SIZE("0.5G")'

Wenn Du debug = 2 setzt, kannst Du für jede einzelne Datei sehen, wie die Regeln ausgewertet werden. Wenn Du debug = 1 setzt, kannst Du für die einzelnen Dateien (nur) das Ergebnis sehen. Mit debug = 0 (default) erfolgt keine Ausgabe.

Du kannst die folgenden vorbelegten Variablen verwenden:

$file Dateiname mit relativem Pfad vom originalen sourceDir
$size Größe der Datei in Byte
$mode Rechte der Datei (Integer, verwende 0...mit oktalen Zahlen, z.B. $mode = 0644
$ctime Erzeugungszeit in Sekunden seit Epoch (1. Jan. 1970), siehe unten
$mtime Modifikationszeit in Sekunden seit Epoch, siehe unten
$uid User ID (String, falls im OS bekannt), z.B. $uid eq 'bob'
$uidn User ID (numerischer Wert), z.B. $uidn = 1001
$gid Gruppen ID (String, falls im OS bekannt), siehe $uid
$gidn Gruppen ID (numerischer Wert), see $uidn
$type Typ der Datei, ein Buchstabe von SbcFpl sein, s. Option exceptTypes in storeBackup.pl
$ENV{XXX} verwendet den Inhalt der Environment Variable XXX

Falls Du $ctime oder $mtime verwenden willst, ist es nicht das reine Vergnügen, die Anzahl der Sekunden seit Epoch (1.1.1970) zu berechnen. Aus diesem Grund unterstützt storeBackup eine spezielle Funktion &::DATE um Dein Leben angenehmer zu machen:

BEISPIEL 3:

searchRule = '$mtime > &::DATE("14d")' and '$mtime < &::DATE("3d12h")'

Mit dieser Suchregel (in storeBackupSearch.pl findest Du alle Dateien, die neuer als exakt 14 Tage und älter als 3 Tage und 12 Stunden sind. Die Syntax, die von &::DATE verstanden wird, ist:

  1. d day (Tag)
    h hour (Stunde)
    m minute (Minute)
    s second (Sekunde)


    Daher bedeutet „3d2h50s`` 3 Tage, 2 Sunden und 50 Sekunden. Mit Hilfe der Funktion oben kann „jetzt`` minus diesem Zeitraum angegeben werden.

  2. YYYY.MM.DD year.month.day (Jahr.Monat.Tag)
    YYYY.MM.DD_hh.mm.ss dasselbe Format wie backupDir
    2008.04.30 spezifiziert den 30. April 2008, 0:00,
    2008.04.30_14.03.05 spezifiziert den 30. April 2008, um 14 Uhr 3 Min. und 5 Sek.


    Mit der Funktion &::DATE kann auch ein fester Zeitpunkt angegeben werden.

Du hast bereits einige Möglichkeiten gesehen, wie „Variablen`` gruppiert werden können. Es geht mit and und or. Du kannst verwenden:

and, or, not, (, )

Alles ist wie in perl. (Um ehrlich zu sein: es wird auch durch den Perl-Interpreter ausgewertet.) Aber Du solltest diese Ausdrücke (also und, oder, (, etc.) mit einem oder mehreren Leerzeichen (white space) umgeben, ansonsten wird debug = 2 nicht richtig funktionieren!

BEISPIEL 4:

searchRule = ( '$mtime < &::DATE("14d")' and '$mtime > &::DATE("3d12h")' )
	     and not '$file =~ m#\.bak$'

Finde alle Dateien, die älter als 3 Tage und 12 Stunden und jünger als 14 Tage sind, aber nicht solche, die auf .bak enden.
Beachte, dass and, not, ( und ) mit mindestens einem Leerzeichen umrahmt werden.

BEISPIEL 5:

StoreBackup ermöglicht Dir, sein Verhalten mit Hilfe von Regeln, die durch das Setzen von „Merker-Dateien``, die im Quellverzeichnis gesetzt werden können, zu kontrollieren. Diese können Auswirkungen auf ein spezielles Verzeichnis oder auch rekursiv auf deren Unterverzeichnisse haben.

In der Konfigurationsdatei von storeBackup.pl definierst Du:

exceptRule= '&::MARK_DIR($file)'

Dann werden alle Dateien in Verzeichnissen mit der Default-„Marker``-Datei .storeBackupMark nicht gesichert, weil die Funktion MARK_DIR in diesen Fällen 1 zurückliefert.

Du kannst auch eine andere Marker-Datei verwenden, z.B. .dontBackup:

exceptRule= '&::MARK_DIR($file, ".dontBackup")'

In diesem Fall musst Du - natürlich - die Datei .dontBackup in den Verzeichnissen, die Du nicht sichern willst erzeugen:

$ touch .dontBackup

Wenn Du willst, dass alle Dateien rekursiv unter Verzeichnissen mit .dontBackup vom Backup ausgeschlossen werden, dann definiere die Regel folgendermaßen:

exceptRule= '&::MARK_DIR_REC($file, ".dontBackup")'

Da es sich um Regeln handelt, kannst Du die Bedeutung auch umdrehen:

exceptRule= not '&::MARK_DIR($file, ".backupThisDir")'

Als Namen für die Marker Datei verwendest Du hier .backupThisDir. Alle Backups ohne diesen Marker werden jetzt nicht gesichert.

Du kannst beliebige Kombinationen mit anderen Elementen der Regeln erstellen. Wenn Du z.B. in Verzeichnissen mit dem Marker .saveRootOnly oder deren Unterverzeichnissen nur Dateien vom User root sichern willst, definiere:

exceptRule= not ( '&::MARK_DIR_REC($file, ".saveRootOnly")'
                  and '$uid eq "root"' )

Jetzt stell Dir vor, Du willst rekursiv Dateien in Verzeichnissen mit dem Marker .dontBackup nicht sichern und rekursiv in Verzeichnissen mit Marker .saveRootOnly nur Dateien von root sichern. Das kannst Du folgendermaßen erreichen:

exceptRule = '&::MARK_DIR_REC($file, ".dontBackup")'
	     or not
 	     ( '&::MARK_DIR_REC($file, ".saveRootOnly")'
                and '$uid eq "root"' )

Du kannst jede Kombination mit unterschiedlichen Marker-Dateien in unterschiedlichen oder denselben Regeln verwenden.

Natürlich kannst Du MARK_DIR und MARK_DIR_REC auch in anderen Regeln verwenden, insbesondere bei Option comprRule.

Verwendung von Regeln auf der Kommandozeile

Sehen wir uns das an:

exceptRule = '$size > &::SIZE("1.5G")'

Wenn wir das Kommando so benutzen:

--exceptRule '$size > &::SIZE("1.5G")'               ### FALSCH ###

bekommen wir hier hässliche Fehlermeldungen, weil die Shell die einfachen Anführungszeichen (') entfernt und storeBackup das Resultat genauso interpretiert wie in der Konfigurationsdatei (siehe Erläuterung in jeder generierten Konfigurationsdatei ganz oben). Hier wird sich storeBackup darüber beklagen, dass die Environment-Variable $size nicht gesetzt ist. (Das $-Zeichen ist nicht mehr maskiert, weil die Shell die einfachen Anführungszeichen entfernt hat.) Daher müssen wir das $-Zeichen maskieren; außerdem auch die doppelten Anführungszeichen ("), weil storeBackup sie als Gruppierungszeichen interpretieren würde, also nicht direkt in den Perl-Interpreter weiterleiten würde. Die richtige Schreibweise für die Option wäre also:

--exceptRule '\$size > &::SIZE(\"1.5G\")'            ### RICHTIG ###

Beispiel 4 müssten wir so angeben:

--searchRule '( \$mtime < &::DATE(\"14d\") and \
   \$mtime > &::DATE(\"3d12h\") ) and not \$file =~ m#\.bak\$#'

Im Falle von Problemen solltest Du die Perl-Fehlermeldung lesen, die zeigt, was wirklich beim Perl-Interpreter ankommt. Abgesehen davon wird die Option --print jeden Parameter nach dem Parsen (Auswerten) durch die Shell und storeBackup anzeigen. Du kannst --print auch in Verbindung mit Konfigurationsdateien verwenden.

Die folgenden vordefinierten Funktionen können in den Regeln (rules) verwendet werden:

&::DATE(zeitraum)
Berechnet die relative Zeit von „jetzt`` und gibt Dir die Möglichkeit, diese mit $ctime oder $mtime zu vergleichen. Setze zeitraum z.B. auf "3d2h". Für Details siehe Beispiel 3 in diesem Kapitel.
&::SIZE(groesse)
Berechnet die Größe groesse, die in lesbarer Form (z.B. 1.5G) angegeben wird als einfache Zahl (in Bytes). Für Details siehe Beispiel 1 in diesem Kapitel.
&::MARK_DIR($file [, dateiMarkierung])
Überprüft, ob dateiMarkierung im Verzeichnis von $file existiert. Der Defaultwert für dateiMarkierung ist .storeBackupMark. Für Details siehe Beispiel 5 in diesem Kapitel.
&::MARK_DIR_REC($file [, dateiMarkierung])
Überprüft, ob dateiMarkierung im Verzeichnis von $file oder in einem darüber liegenden Verzeichnis existiert. Der Defaultwert für dateiMarkierung ist .storeBackupMarkRec. Für Details siehe Beispiel 5 in diesem Kapitel.



Unterabschnitte
next up previous contents
Nächste Seite: Festlegen, ob eine Datei Aufwärts: Grundlegende Konzepte Vorherige Seite: Löschen von alten Backups   Inhalt
Heinz-Josef Claes 2014-04-20