Erweiterungen
LUA-Skriptunterstützung
Einleitung
LUA ist eine Skriptsprache (siehe http://www.lua.org). Die Einbindung in den monitord ermöglicht die serverseitige (Vor-)Verarbeitung der empfangenen Daten, im simpelsten Fall eine Filterung. Vorerst wird nur diese an dieser Stelle erklärt - mit dem LUA-Konstrukt "os.execute()" lassen sich serverseitig auch Aktionen bzw. externe Programme ausführen.
Generell gilt: Das LUA-Skript muss 0 oder 1 zurück geben. 0 bedeutet, die Daten sollen an einen Client gesendet bzw. in einer Datenbank gespeichert oder allgemein das Plugin zur Speicherung oder Varbeitung der Daten angewiesen werden. mit "return 1" wird die Weiterverarbeitung oder Speicherung unterdrückt. Dies ist z.B. für Systemnachrichten beim FMS oder POCSAG interessant, auch kann so ein Probelarm zu festen Zeiten unterdrückt oder anders behandelt werden.
Die auszuführenden Skripte werden in der monitord.xml definiert (siehe "Konfiguration"):
<SocketFilterScript> socketfilter.lua </SocketFilterScript> <PluginFilterScript> pluginfilter.lua </PluginFilterScript>
Für alle Sockets wird dabei das SocketFilterScript ausgeführt, für alle Plugins (z.B. mySQL-Dataplugin) das PluginFilterScript. Die angegebenen Skripte gelten jeweils für alle alle Clients an allen Sockets bzw. alle Plugins.
Filtern der Socket-Ausgaben
Direkt zum Einstieg in dieses Kapitel stellen wir ein Beispielskript für die Filterung der Ausgaben am Socket bereit:
-- SocketFilter.lua -- -- Filter für den SocketServer - wird pro aktiven Client aufgerufen -- -- Globales Array "arg" enthält die Daten vom Auswertermodul -- -- Zusätzliche Werte im Array: -- -- client_authenticated: 0/1 (1=angemeldet) -- client_ip: IP-Adresse des Clients -- client_loginname: Anmeldename -- client_type: fms32, crusader, monitord -- -- Rückgabewert: -- 0 = an Client senden, -- 1= nicht an Client senden, -- alle anderen = an Client senden -- local toShowFMS = {"11111111", "22222222"} ; local toShowPOCSAG = {"1111111", "2222222"} ; local toShowZVEI = {"99000", "99001"} ; function myfilterFMS32() for index,testwert in pairs(toShowFMS) do if (testwert==arg["ric"]) then return 0 end end return 1 ; end function myfilterMONITORD() -- ZVEI if(arg["typ"] == "zvei") then for index,testwert in pairs(toShowZVEI) do if(testwert == arg["zvei"]) then return 0 end end end -- FMS if(arg["typ"] == "fms") then for index,testwert in pairs(toShowFMS) do if(testwert == arg["fmskennung"]) then return 0 end end end -- POCSAG if(arg["typ"] == "pocsag") then for index,testwert in pairs(toShowPOCSAG) do if(testwert == arg["ric"]) then return 0 end end end -- default: anzeige unterdruecken return 1; end function filter() local dummyValue=1 ; -- DEBUG-Info: Alles ausgeben for index,testwert in pairs(arg) do print(index) print(testwert) end -- wird für jedes Telegramm (pocsag, fms, zvei) aufgerufen if (arg["client_type"]=="fms32") then return 0; -- delete this line to enable and uncomment the next one! -- return myfilterFMS32() ; end if (arg["client_type"]=="crusader") then -- nix dummyValue=2 ; end if (arg["client_type"]=="monitord") then return 0; -- delete this line to enable and uncomment the next one! -- return myfilterMONITORD() ; end -- default: alles anzeigen; ändern auf "1" um nichts anzuzeigen! return 0; end
Wir hoffen, die Zeilen sind mehr oder weniger selbsterklärend - im Groben passiert folgendes:
- Definition der anzuzeigenden Meldungen
- Definition von Filterfunktionen (hier nur einer) für die einzelnen Sockets, die je nach Typ die entsprechende Filterliste durchgeht und returnt
- Definition der Funktion filter(), die vom monitord erwartet und initial aufgerufen wird (vgl. 'main()')
Filtern der Datenbank-INSERTs
Das Filtern der Datenbank-INSERTs ist prinzipiell analog zum oben genannten socketfilter. Einziger Unterschied ist, dass die zu implementierende Funktion "pluginFilter()" heißen muss. Die Konstrukte sind ansonsten 1:1 übernehmbar.
Ausführen von Programmen
Viele User des monitord und anderer Auswerter benötigen die Möglichkeit, automatisch SMS zu versenden oder auch andere Dinge zu tun. Mit LUA ist auch das möglich, hierfür gibt es den Befehl 'os.execute()'. Über diesen kann z.B. ein externes Programm zum SMS-Versand angestoßen, aber auch ein PHP-Skript ausgeführt oder sonst eine interessante Methode genutzt werden.
Ein Beispiel zur Syntax bei Ausführung eines PHP-Skripts:
if(arg["typ"] == "zvei" and string.sub(arg["zvei"], 0, 3) == "007" and arg["channelnum"] == "0") then toexecute = "cmd /c c:\\xampp\\php\\php.exe "; toexecute = toexecute .. "c:\\programme\\monitord\\sendsms.php "; toexecute = toexecute .. arg["zvei"] ; os.execute(toexecute); end
Hier wird PHP an der Kommandozeile aufgerufen, das Skript 'sendsms.php' im monitord-Verzeichnis ausgeführt, und dieses bekommt als Parameter die aktuell alarmierte Schleife angezeigt - der IF-Abfrage vorher gemäß aber nur, wenn diese mit '007' beginnt und vom linken Kanal der ersten Soundkarte (channelnum) ausgewertet wurde. Das entsprechende PHP-Skript kann dann den Zugriff auf eine SMS-Schnittstelle enthalten, aber z.B. auch per Jabber/XMPP oder E-Mail einen Alarm auslösen, da sind der Fantasie ja keine Grenzen gesetzt.
Beispiel zum SMS-Versand
Als Basis wurde hier das AlarmierungsTool von http://ffwug.jimdo.com/ eingesetzt. Die Entwickler des monitord stehen in keiner Verbindung zu diesem Tool, daher können wir auch keine Aussagen zu Sicherheit und Zuverlässigkeit desselben machen - Benutzung auf eigene Gefahr. Der Programmierer des Tools bietet eine gute Anleitung zur Konfiguration der Handynummern und SMS-Anbieter, so dass wir dahingehend nur darauf verweisen, die Anleitung befindet sich dort im Download-Bereich.
Skript zum Aufruf des konfigurierten AlarmierungsTools durch den monitord:
if(arg["typ"] == "zvei" and string.sub(arg["zvei"], 0, 3) == "001") then toexecute = "cmd /c c:\\Programme\AlarmierungsTool\\Alarm.exe "; toexecute = toexecute .. arg["uhrzeit"] ; toexecute = toexecute .. " " ; toexecute = toexecute .. arg["zvei"] ; os.execute(toexecute); end
Mit diesem Aufruf werden dem AlarmierungsTool die Alarmzeit als erster Parameter und die alarmierte Schleife als zweiter Parameter übergeben. Diese können dann bei der automatisch generierten Alarmmeldung im AlarmierungsTool als &1 bzw. &2 in die SMS eingetragen werden. Für digitale Alarmierungen (POCSAG) etc. kann der gleiche Weg gewählt werden, lediglich die Parameter und das dazwischen eingefügte Leerzeichen (wichtig!) müssen dann entsprechend der verfügbaren Daten angepasst werden.
Allgemeine Infos zu Skripts
- Immer auf den Typ der bearbeiteten Ausgaben achten, sonst kommt es zu Fehlern im Programmablauf - der Telegrammtyp 'POCSAG' hat kein Feld 'zvei', in dem eine Alarmschleife erwartet wird, während ein ZVEI-Telegramm keinen Alarmtext enthält...
- Die in 'arg' enthaltenen Felder sind im Kapitel mySQL beschrieben bzw. aufgelistet.
- Die Programmaufrufe sind blockierend. Bevor das aufgerufene Programm beendet ist, wird also das LUA-Skript nicht weiter ausgeführt. Dies kann unter Windows durch Vorstellen des Wortes 'start', unter Linux/Unix-Systemen durch Nachstellen des '&'-Zeichens unterbunden werden.