Check fileage: C

Aus ITwiki
Wechseln zu: Navigation, Suche

Vorwort[Bearbeiten]

Bevor ich loslege: das hier angebotene Tool check_fileage stelle ich als Freeware, also zur freien, kostenlosen Verwendung zur Verfügung. Für Datenverluste, Systemabstürze oder sonstige Schäden, die durch das Tool verursacht werden/wurden, übernehme ich keinerlei Haftung, die Verwendung geschieht auf eigenes Risiko. Nach dieser rechtlichen Aufklärung kann's ja los gehen :-)

Verzweifelt war ich auf der Suche nach einem Nagios Plugin, welches auf einfache, logische Art und Weiße ermöglicht, das Änderungsdatum einer Datei, die auf einem Windows Rechner abgespeichert ist, zu überwachen. Primärziel: Überwachung von Backup-Dateien. Zwar gibt es NRPE - mit dem Tool überwache ich z. B. den freien Speicherplatz auf einer Windows Festplatte - und den zugehörigen Befehl check_nrpe, mit dessen Hilfe der Command-Befehl checkFile2 zum Überwachen des Dateierstelldatums eingesetzt werden kann. Allerdings war das Überwachen mit diesem Tool nahezu unmöglich: mir ist aufgefallen, dass die Rückgabewerte mit der jeweils am Host installierten NSClient++ Version unterschiedlich, ja sogar komplett falsch waren oder überhaupt nicht funktionierte. So hatte ich etwa den Fall, dass eine Datei C:\xyz.bak zwar vor 1 Jahr zuletzt geändert wurde, check_nrpe lieferte aber irgendwas mit über 700 Tage - so ein Quatsch. Mit der neuesten NSClient-Version lieferte check_nrpe eine Speicherzugriffsverletzung. Kurzum: eine andere Möglichkeit musste her. Problem: ich fand nichts. Lösung: selbst programmieren :-) So entstand das Tool check_fileage, geschrieben in C#, einer .Net Programmiersprache.

check_fileage.exe - die C# Lösung[Bearbeiten]

Da check_nrpe bzw. NSClient++ es ermöglichen, am Remote-Host (von Nagios aus gesehen) ein Skript auszuführen und dessen Rückgabe auszuwerten, benötigt man nach wie vor diese zwei Programmteile, um check_fileage.exe verwenden zu können. Natürlich muss am Windows-Host eine .Net Laufzeitumgebung (.Net Framework 3.5) installiert sein, sonst funktioniert check_fileage.exe nicht - ist ja logisch. Bevor ich nun zur Parametererklärung von check_fileage.exe komme, kurz wichtige Vorarbeiten, die mich fast in den Wahnsinn getrieben hätten: das C# Programm war schnell entwickelt, aber bis das Ganze dann in Nagios die korrekten Werte anzeigte... Man man man :-) Deshalb nachfolgend die wichtigen, zu beachtenden Schritte (ich gehe von der NSClient-Version 0.3.9 aus).

Öffne die nsc.ini-Datei am Windows Host und stelle sicher, dass folgende Parameter korrekt eingerichtet sind:

  1. Unter [modules] muss CheckExternalScripts.dll aktiviert sein (Semikolon am Zeilenanfang entfernen)
  2. Unter [NRPE] muss allow_arguments=1 sowie allow_nasty_meta_chars=1 eingerichtet sein
  3. Unter [External Script] (nicht Scripts!) habe ich command_timeout=60, allow_arguments=1 und allow_nasty_meta_chars=1 gesetzt
  4. Unter [External Scripts] (beachte das s!) ist hinzuzufügen check_fileage=scripts\check_fileage.exe $ARG1$
  5. Kopiere die Datei check_fileage.exe in den Unterordner scripts des NSClient-Programmverzeichnisses

Speichere die nsc.ini ab und starte den Windows-Dienst NSClient++ neu, um die gemachten Einstellungen zu übernehmen.

Zum Testen kannst du nun am Host z. B. mal eine Datei C:\temp\test.txt anlegen, führe am Nagios-Server dann folgenden Befehl aus:

/usr/lib/nagios/plugins/check_nrpe -H <client_host_ip> -p 5666 -c check_fileage -a '--file "C:\temp\test.txt" --warn 100 --critical 400'

Sollte die Datei eben gerade angelegt bzw. geändert (!) worden sein, müsste ein OK zurückkommen:

OK - File "C:\temp\test.txt" is in appropriate state, modified at 09.02.2013 11:34:04, WARN at 09.02.2013 11:35:44, CRITICAL at 09.02.2013 11:40:44

Parameter-Erklärung[Bearbeiten]

Parameter zum Überwachen einer einzelnen Datei[Bearbeiten]

check_fileage.exe akzeptiert folgende Parameter, um eine einzelne Datei zu prüfen:

  1. --file <filename>: Datei, die überprüft werden soll
  2. --warn <seconds>: Ganzzahlwert (Integer) in Sekunden, nachdem eine Warnung auszugeben ist. Angenommen die Datei wurde zuletzt um 11:10:10 geändert und ich gebe den Wert 10 ein, dann gibt check_fileage.exe ab 11:10:20 eine Warnung aus - 10 Sekunden nach Änderung also
  3. --critical <seconds>: Ganzzahlwert (Integer) in Sekunden, nachdem eine kritische Meldung auszugeben ist. Erklärung ist identisch mit der unter --warn

Wie eingangs erwähnt, habe ich dieses Tool programmiert, um Dateien, die durch ein Backup (z. B. vom Microsoft SQL Server Agent) erzeugt wurden, zu überwachen. Ein Beispielt: unter D:\Backup wird täglich die Sicherungsdatei sql_datenbank.bak geschrieben. Wir wollen eine Warnung erhalten, wenn diese Datei älter ist als 30 Stunden (bedenke: nach 24 Stunden wird die Sicherung gemacht, je nach Größe der DB kann der Sicherungsvorgang 2, 3 Stunden dauern - also erst eine Warnung nach 30 Stunden ausgeben...), sollte die Datei über 48 Stunden alt sein, wird's kritisch. Der Befehl lautet dann wie folgt:

/usr/lib/nagios/plugins/check_nrpe -H <client_host_ip> -p 5666 -c check_fileage -a '--file "D:\backup\sql_datenbank.bak" --warn 108000 --critical 172800'

Man muss die 30 bzw. 48 Stunden in Sekunden umrechnen, der Rest sollte klar sein.

Parameter zum Überwachen von Dateien in einem Ordner[Bearbeiten]

check_fileage.exe akzeptiert folgende Parameter, um mehrere Dateien in einem Verzeichnis zu überwachen:

  1. --dir <directory>: Ordner, dessen Dateien geprüft werden sollen (es werden keine Unterverzeichnisse geprüft!)
  2. --warn <seconds>: Ganzzahlwert (Integer) in Sekunden, nachdem eine Warnung auszugeben ist. Angenommen eine Datei im Ordner wurde zuletzt um 11:10:10 geändert und ich gebe den Wert 10 ein, dann ist diese Datei ab 11:10:20 als Warnung einzustufen - 10 Sekunden nach Änderung also
  3. --wp <percent>: Ganzzahlwert (Integer) in Prozent. Angenommen, ich habe im Ordner 10 Dateien, es ist --warn 60 (Warnung nach 60 Sekunden) und -wp 20 angegeben, dann tritt eine Warnung auf, sofern 2 der Dateien (= 20%) als "Warnung" eingestuft wurden
  4. --critical <seconds>: Ganzzahlwert (Integer) in Sekunden, nachdem eine kritische Meldung auszugeben ist. Erklärung ist identisch mit der unter --warn
  5. --cp <percent>: Ganzzahlwert (Integer) in Prozent. Erklärung ist identisch mit der unter --wp

Ein Beispiel, um die Verwendung zu veranschaulichen. Wir haben einen SQL-Server, der alle 2 Stunde über den SQL Server Agent eine Datei nach D:\Backup schreibt, der Dateiname sieht etwa so aus: sql_datenbank_09022013_080000 - die Datei wurde am 09.02.2013 um 08:00:00 Uhr erstellt, der Dateiname ist also bei jeder Sicherung anders, eine Überwachung mittels --file ist nicht möglich. Des Weiteren werden nach 24 Stunden die Backups vom Vortag gelöscht bzw. überschrieben.

Laut Adam Riese und Eva Zwerg haben wir in dem Ordner D:\Backup stets 12 Dateien drinnen, die nicht älter sein dürften wie 24 Stunden - damit lässt sich eine Prüfung durchführen:

/usr/lib/nagios/plugins/check_nrpe -H <client_host_ip> -p 5666 -c check_fileage -a '--dir "D:\backup" --warn 108000 --wp 24 --critical 172800 --cp 16'

Der Befehl reagiert wie folgt: sind mehr als 24 % (bei 12 Dateien sind das 3) älter als 30 Stunden (= 108000 Sekunden), wird eine Warnung ausgelöst. Sind 16 % (bei 12 Dateien sind das 2) der Dateien älter als 48 Stunden (= 172800 Sekunden), liefert uns der Aufruf einen CRITICAL. Ich denke, das sollte einleuchtend sein.

Ach ja, wichtig: --dir und --file können NICHT zusammen verwendet werden. Sollte aber klar / verständlich sein.

Probleme bzw. Fehler, die auftreten können[Bearbeiten]

Abhängig davon, welcher Fehler angezeigt wird, das Problem kann eines der Folgenden sein:

  1. Du hast dich bei den Parametern vertippt
  2. Die angegebene Datei existiert nicht
  3. Die angegebene Datei existiert aber der Zugriff auf das Verzeichnis wird verweigert (bedenke: der Dienst NSClient++ am Windows-Host wird als System-Dienst ausgeführt, demzufolge muss SYSTEM auf die Datei Lesezugriff haben!)
  4. Es wurden die falschen Hochkommas bzw. Anführungszeichen gesetzt - achte hierbei peinlichst genau darauf, dass nach dem Parameter -a ein einfaches Hockomma ' kommt, während der Dateiname in normale Anführungszeichen " geschrieben werden muss
  5. Der Pfad zur angegebenen Datei ist länger als 260 Zeichen (.Net Problem ^^)
  6. Wenn der Ordnerpfad oder Dateiname einen deutschen Umlaut - ganz Schlimm hier ist das scharfe s ß - enthält, tritt unter Umständen ein Fehler auf (bei mir hatte es damit zu tun, dass ich NagiosQL zum Erstellen der Nagios Konfig-Dateien verwendete und die erstellte Nagios-Datei anstelle dem ß ein Geschnörxel enthielt, was check_fileage.exe natürlich nicht auswerten konnte...)
  7. check_nrpe kommt mit der Schreibweiße "C:\temp\test.txt" zurecht, in der Nagios-Konfigurationsdatei musst du aber mit doppelten Backslashes arbeiten, also "C:\\temp\\test.txt"

Geplante Erweiterung[Bearbeiten]

Wenn ich Zeit (und Lust ^^) habe, erweitere ich das Tool noch um den Parameter --filter, um in Kombination mit dem Parameter --dir nur bestimmte Dateien unterhalb des angegebenen Verzeichnisses zu prüfen, z. B. nur alle Dateien mit der Endung *.bak. Wird aber erst in einer Folgeversion kommen, bislang fehlt mir die Zeit, dass ich mir darüber einen Kopf mache.

Downloads[Bearbeiten]

Versions-Historie[Bearbeiten]

Version 1.0.0.2[Bearbeiten]

- Bei einem Dateinamen wie z. B. "C:\test\nagios.txt" wird das "\n" als Zeilenumbruch gewertet, was im Webinterface zur inkorrekten Darstellung der Status-Information führt. Der Dateiname wird desshalb in Grossbuchstaben ausgegeben.

Version 1.0.0.1[Bearbeiten]

- Bugfix im Bezug auf den --dir Parameter behoben - Anzeige der Statusinfo für --dir gekürzt_ nur noch Ordner-, keine Dateinamen werde mehr angezeigt, da Nagios die Anzeige ohnehin kürzt

Version 1.0.0.0[Bearbeiten]

Erster Release.

Wie zufrieden sind Sie mit dem Tool check_fileage und der hier aufgeführten Dokumentation?
Bitte stimme unten ab.
2
1
0
Es wurden seit Erstellung der Umfrage am 15:45, 11. Jul. 2017 3 Stimmen abgegeben.
poll-id 3303DEB2709C8F8A3F07F07D4CE393DC