Löschen einer Zeile aus einer Datei

Nehmen wir an, wir haben mittels eines Cron-Jobs und einen Shell-Scripts einen Parameter in eine Datei geschrieben, bspw. "UnserParameter=True". Das war einmal beabsichtigt, aber nicht 1000 Mal. CFEngine hat die nützliche edit_line Funktion "append_if_no_line", welche die gewünschte Zeile nur einfügt, wenn sie nicht bereits vorhanden ist. Wir wollen nun die 1000 doppelten Zeilen aus "Unserer.Datei" entfernen.

Wir geben im agent bundle mit dem Namen unserer Wahl, hier delete_line, unter files: unsere Datei an. In der gleichen Zeile rufen wir die edit_line Funktion delete_line auf, die drei Zeilen tiefer aufgerufen wird. "classes => classes_generic("line_deleted") setzt nach dem Löschen der Zeile/n die classes "line_deleted_repaired", "line_deleted_ok" und "line_deleted_kept". "line_deleted_repaired" wird gesetzt, wenn zumindest eine Zeile gelöscht wurde, wenn eine Aktion notwendig war, um den Zustand zu erreichen, zusätzlich wird aber auch "line_deleted_ok" gesetzt, weil der gewünschte Zustand vorhanden ist. War keine Zeile vorhanden, werden nur "line_deleted_ok" und "line_deleted_kept" gesetzt. Im delete_report bundle am Schluss nutzen wir "line_deleted_repaired", um zu entscheiden, wann wir den Report ausgegeben haben möchten; wir bekommen ihn nur, wenn Zeile/n gelöscht wurde/n. Würden wir hier "line_deleted_ok" gebrauchen, würden wir den Report auch jedesmal bekommen, wenn nur keine dieser Zeile/n vorhanden ist, also nichts gelöscht wurde.

bundle agent delete_line
{
  files:
      "/srv/www/htdocs/oo-data/data-$(sys.fqhost)" edit_line => delete_line,  
        classes => classes_generic("line_deleted");
  reports:
      line_deleted_repaired::
            "DELETE THIS LINE was deleted";
}

bundle edit_line delete_line
{
    delete_lines:
      "DELETE THIS LINE";
}