Logo: monitord

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:

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

© monitord.de - http://www.monitord.de/?article=5 - 01.04.2011