Open Source im professionellen Einsatz
Linux-Magazin 05/2017
753

Vorgefertigt

Zum Glück muss heutzutage niemand mehr diese Logik als Programm aufschreiben, denn mehrere Open-Source-Implementierungen erledigen den Job bereits perfekt. Für Python existiert zum Beispiel »Pygtail« [3], angeblich ein Python-Port des weit verbreiteten Utilty »logcheck« . Wer kein eigenes Python-Programm schreiben möchte und auf dynamische Wartbarkeit verzichten kann, darf für den ersten Teil der Alarm-Pipeline zum Parsen der System-Logdatei natürlich auch »logcheck« direkt verwenden.

Listing 1 importiert das mittels »pip3 install pygtail« installierte Modul für Python 3.x und schustert in Zeile 9 einen Pfad für die von Pygtail benötigte Merker-Datei im Verzeichnis »data« im Homedirectory des Users zusammen, im vorliegenden Fall »data/authwatch.auth.log.offset« . Hier legt Pygtail den Offset in der Datei ab, beim nächsten Aufruf liest es dahinter weiter. Falls dort neue Daten vorliegen, wird es sie auch ausgeben oder ansonsten stillschweigen.

Listing 1

authwatch

01 #!/usr/bin/python3
02 import sys
03 import os
04 import re
05 from pygtail import Pygtail
06
07 log_file    = '/var/log/auth.log'
08
09 offset_file = os.path.join(os.getenv("HOME"),"data",
10   os.path.basename(sys.argv[0]) + "." +
11   os.path.basename(log_file) +
12   ".offset" )
13
14 for line in Pygtail(log_file, offset_file=offset_file):
15     if not re.search('CRON',line) and \
16       not re.search('Connection closed',line):
17         sys.stdout.write(line)

Da Cron das Skript später im Fünf-Minuten-Takt aufruft und es sich nach getaner Arbeit sofort verabschiedet, braucht es diesen persistenten Merker. Das Verzeichnis »~/data« muss der Admin vor Benutzung des Skripts einmal manuell anlegen, falls es noch nicht existiert.

Weiter blendet Listing 1 regulär auftretende Events auf, etwa Einträge, in denen Schlüsselwörter wie »CRON« oder »Connection closed« auftauchen. Die Zeilen 15 und 16 suchen danach mittels regulärer Ausdrücke und des dafür importierten Standardmoduls »re« .

Wer ein Linux mit dem viel gescholtenen »systemd« fährt, findet dort keine Logdatei »auth.log« , sondern darf mittels »journalctl« auf der Kommandozeile oder den Python-Bindings von »systemd« und deren Methode »journal« die letzten Einträge des Systemlogs herauswringen.

Statt eines Offsets in einer Datei merkt sich das Skript dann den Zeitstempel der letzten Abfrage in einer extra Datei und springt bei der nächsten mit »seek_realtime()« knapp darüber hinaus, um keine Duplikate zu erfassen. Um rotierte Logdateien braucht sich das Skript in diesem Fall keine Gedanken zu machen, da »systemd« solche Implementierungsniederungen abstrahiert.

Bequeme Web-Requests

Der zweite Teil der Alarm-Pipeline steht in Listing 2, der dort abgesetzte REST-Request auf den Pushover-API-Server verlangt zwei Tokens, die der User mit seiner Registrierung auf dem Pushover-Service erhält. Die ersten vier Wochen sind kostenlos, wer Gefallen daran findet, erwirbt für 5 Dollar eine Lizenz.

Listing 2

pushover

01 #!/usr/bin/python3
02 import requests
03 import sys
04 import re
05
06 string = sys.stdin.read()[:1024]
07
08 if re.search('\S', string):
09     r = requests.post(
10       'https://api.pushover.net/1/messages.json',
11       data = {
12           'token':'XXXXXXXXXXXXXXX',
13           'user':'YYYYYYYYYYYYYYY',
14           'message':string
15       })

Den ersten Token unter dem Schlüssel »user« sehen registrierte User auf der Dashboard-Übersicht in Abbildung 4. Der zweite Token unter dem Schlüssel »token« identifiziert die App (Abbildung 5) gegenüber Pushover, im vorliegenden Fall das Python-Skript in Listing 2, das ich bei Pushover unter dem Namen »Snapshot« registriert habe.

Abbildung 4: Registrierte User sehen im Dashboard ihren User-Token.

Für einen erfolgreichen REST-Request mit der Python-Library »requests« fehlt nur noch der Parameter »message« mit dem Nachrichtentext – und schon setzt sich die Methode »post()« in Zeile 9 mit Pushover in Verbindung. Nach Python-Manier wirft die Bibliothek bei auftretenden Fehlern Exceptions, die ohne Bearbeitung das Programm abbrechen und einen Stacktrace ausgeben, der hoffentlich bei der Behebung hilft.

Abbildung 5: Neu registrierte Apps des Users bekommen einen Token.

Die Python-Library »requests« verspricht mit ihrem Werbeslogan "HTTP for Humans" nicht zu viel. Sie kommt jedenfalls durchdachter daher als die von mir bereits gebührend gescholtenen »urllib« und »urllib2« .

Zeile 6 in Listing 2 holt den vom ersten Teil der Pipeline gesendeten Text aus der Standardeingabe und stutzt ihn mit der in Python üblichen Syntax für Array-Slices »[:1024]« auf die bei Pushover maximal zulässige Nachrichtenlänge von 1024 Zeichen. Das »if« -Konstrukt ab Zeile 8 prüft dann mit dem regulären Ausdruck »\S« , ob die Nachricht druckbare Zeichen enthält, und beendet Leerfahrten ohne weiteres Federlesen.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • AWS S3

    Daten auf AWS S3 sitzen dort nicht zwangsläufig fest. Wer sie wiederhaben will, kann sie mit ein bisschen Python-Schmiermittel auf einen Rutsch abpumpen.

  • Tooltipps

    Im Kurztest: Colum's Cut 2.0, Findwin 0.11, Simpleproxy 3.5, Screenkey 0.9, PHP Server Monitor 3.1.1, Sshcommand 0.4.0

  • Snapshot

    Anhand von Trainingsdaten in Form von täglich im Auto erfassten Kilometerständen versucht Michael Schillis KI-Programm Muster im Fahrverhalten zu erkennen und Prognosen abzugeben.

  • Täglich auf Zack

    Wer hat schon Zeit, täglich seine Logdateien zu kontrollieren? Das im Folgenden vorgestellte Skript fasst alle aktuellen Veränderungen in einem Report zusammen und verschickt sie einmal täglich per E-Mail.

  • Screencast zum Perl-Snapshot 12/2014

    Diesmal geht es um asynchrone Programmflüsse und ihr Management in Perl.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.