Ich habe Config.cpp
die Datei durchgesehen , die für das Parsen der Konfiguration verantwortlich ist. Die Beispielkonfiguration macht tatsächlich einen ziemlich guten Job beim Erfassen der verfügbaren Optionen - es gibt nicht sehr viele
Wenn ich mich unten auf "die Beispielausgabe" beziehe, spreche ich von dieser Zeile (zufällig von der Beispielseite gezogen):
17:29:35 (src/loggedfs.cpp:136) getattr /var/ {SUCCESS} [ pid = 8700 kded [kdeinit] uid = 1000 ]
Das Root-Tag ist <loggedFS>
. Es hat zwei optionale Attribute:
- logEnabled ist eine Zeichenfolge - "true" bedeutet, dass tatsächlich Protokollinformationen ausgegeben werden sollen. Alles andere deaktiviert die gesamte Protokollierung. Der Standardwert ist "true", da dies der springende Punkt des Programms ist
- printProcessName ist eine Zeichenfolge - "true" bedeutet, dass die Protokollausgabe den Prozessnamen enthält, alles andere bedeutet, dass dies nicht der Fall ist. Der Standardwert ist "true". In der Beispielausgabe
kded [kdeinit]
ist der Prozessname
Die einzigen untergeordneten Knoten, die es interessiert, sind <include>
und <exclude>
. Im Beispiel gruppieren sie diese unter <includes>
und <excludes>
Blöcke, aber diese werden vom Parser ignoriert (wie alle anderen Knoten außer <include>
und <exclude>
).
Natürlich führen <include>
Regeln dazu, dass die Protokollzeile ausgegeben wird, wenn sie übereinstimmt, während <exclude>
Zeilen dies nicht tun. Im Falle einer Überlappung <exclude>
überschreiben <include>
. Normalerweise muss mindestens eine <include>
Regel übereinstimmen, damit ein Ereignis protokolliert werden kann. Eine Ausnahme ist jedoch, wenn 0 <include>
Regeln vorhanden sind. Alle Ereignisse werden protokolliert, auch wenn übereinstimmende <exclude>
Zeilen vorhanden sind .
Beide <include>
und <exclude>
nehmen die gleichen Attribute:
- Die Erweiterung ist ein regulärer Ausdruck, der mit dem absoluten Pfad der Datei abgeglichen wird, auf die zugegriffen wurde / die geändert wurde / was auch immer (
extension
ist ein ziemlich schlechter Name, aber ich denke, das ist die übliche Verwendung). Wenn Sie dies beispielsweise tun touch /mnt/loggedfs/some/file
, muss der reguläre Ausdruck in extension
(teilweise) übereinstimmen/mnt/loggedfs/some/file
- uid ist eine Zeichenfolge, die entweder eine Ganzzahl oder enthält
*
. Die Regel stimmt nur mit einer bestimmten Operation überein, wenn der Eigentümer des Prozesses, der die Operation verursacht hat, über die angegebene Benutzer-ID verfügt (was *
natürlich bedeutet, dass eine Benutzer-ID übereinstimmt). In der Beispielausgabe 1000
ist die UID
- Aktion ist die spezifische Art der Operation, die auf dem Dateisystem ausgeführt wird. In der Beispielausgabe
getattr
ist die Aktion. Die möglichen Aktionen sind:
- Zugriff
- chmod
- chown
- getattr
- Verknüpfung
- mkdir
- mkfifo
- mknod
- öffnen
- nur offen lesbar
- Open-Readwrite
- nur offen schreiben
- lesen
- readdir
- readlink
- umbenennen
- rmdir
- statfs
- symlink
- kürzen
- Verknüpfung aufheben
- utime
- utimens
- schreiben
- retname ist ein regulärer Ausdruck. Wenn der Rückkehrcode der von LoggedFS ausgeführten tatsächlichen Dateisystemoperation 0 ist, wird der reguläre Ausdruck mit der Zeichenfolge abgeglichen
SUCCESS
. Ein Rückkehrcode ungleich Null bewirkt, dass er mit übereinstimmt FAILURE
. Das sind die einzigen möglichen Werte, so dass die meisten wahrscheinlich wirst du entweder hart codieren SUCCESS
, FAILURE
oder die Verwendung , .*
wenn Sie beide wollen. In der Beispielausgabe SUCCESS
ist dieretname
Im Gegensatz zu den <loggedFS>
Attributen haben diese keine Standardeinstellungen. Während der Parser unbekannte Attribute und Fehler erkennt, erkennt er keine fehlenden Attribute. Wenn Sie also ein Attribut vergessen, wird nicht initialisierter Speicher verwendet.
/a
, ausschließen/a/b
und einschließen/a/b/c
, wird/a/b/c
beobachtet? Enthält das Einfügen eines Verzeichnisses immer dessen Inhalt?