Wir wollen wissen, ob in einer Textdatei eine bestimme Zeile vorhanden ist. Dazu nutzen wir die eingebaute Funktion "regline". Es gibt viele Funktionen, mit denen Text in Dateien behandeln werden kann. All diese Funktionen nennen sich Edit-Line-Funktionen, weil die Dateien von CFEngine editiert werden. Mit diesen Funktionen können wir Dateien durchsuchen und dann entsprechend weiter agieren: die Zeile löschen oder eine weitere hinzufügen oder bei "Schlüssel - Wert" Paaren in Konfigurationsdateien den Wert ändern oder das Paar auskommentieren oder in Abhängigkeit von diesem Wert, bspw. wird für eine Anwendung ein Modul aktiviert, dieses Modul installieren oder oder oder. Die Möglichkeiten sind kaum aufzuzählen, es muss von Fall zu Fall entscheiden, was wie am besten gelöst wird. Hier suchen wir zunächst nach einer Zeile in einer Datei und geben dann eine Report-Zeile (im syslog) aus, ob die Zeile enthalten ist oder nicht.
Hier ist der Inhalt unserer Beispiel-Konfigurationsdatei:
Parameter=Wert
Hier ist das Bundle, welches den Promiser (das versprechende Element, in diesem Fall ein File) enthält und für diesen die Funktion edit_line mit einem von uns frei vergebenen Namen "SuchZeile" aufruft:
bundle agent SuchZeile<br>
{
files:
"/Verzeichnis/Beispieldatei" edit_line => SucheZeile;
}
Die oben aufgerufene edit_line-Funktion ruft folgendes Bundle auf:
bundle edit_line SucheZeile
{
classes:
"ZeileGefunden" expression => regline("Parameter=Wert","$(edit.filename)");
reports:
ZeileGefunden::
"Die Zeile ist in der Datei vorhanden.";
!ZeileGefunden::
"Die Zeile ist nicht in der Datei.";
}
Die Klasse "ZeileGefunden" wird gesetzt, wenn der reguläre Ausdruck "Parameter=Wert" in $(edit.filename) gefunden wird. $(edit.filename) ist eine eingebaute Variable, die den Dateinamen enthält, der aktuell editiert wird, also der Name unserer Beispieldatei.
regline("Para.","/Verzeichnis/Beispieldatei") hätte zum gleichen Ergebnis geführt. Der erste Parameter in den regline-Klammern ist ein regulärer Ausdruck, "." steht hier für ein beliebiges Zeichen und "" für 0, 1 oder beliebig viele davon, also für "egal was nach "Para" noch kommt. Reguläre Ausdrücke sind ein Thema für sich, welches hier nicht zwischendurch behandelt werden kann, sie sind kein CFEngine-spezifisches Thema und finden in vielen Programmiersprachen Verwendung.
Wird der Ausdruck nun in der Datei gefunden, wird "ZeileGefunden" gesetzt und "Die Zeile ist in der Datei vorhanden." wird ausgegeben.
Wir der Ausdruck nicht gefunden, wird "ZeileGefunden" nicht gesetzt und entsprechend ist !ZeileGefunden zutreffend; das ! negiert die Klasse: ist die Klasse nicht gesetzt, passt !Klasse und in diesem Fall wird dann "Die Zeile ist nicht in der Datei." ausgegeben.