Notiz zum Thema lua:
In der Konfig kann man nun zwei scripts angeben:
Diese Skripte müssen jeweils eine Funktion bereitstellen, die bei jedem Paket, das verteilt wird aufgerufen wird.Code:?>Monitord screen DEBUG1 socketfilter.lua pluginfilter.lua
Für die Sockets ist das die function filter() - z.B. so:
für die plugins ( bisher nur das mysql plugin ) es es die function pluginfilter. Der Name des plugins wird in der monitord.xml definiert (name="mysql", name="mysql1", ...). Man kann also auch mehrere mysql Plugins laden um die Daten in einzelne DBs zu schreiben. Anhand des Namen kann man dann unterschiedliche Daten sperren oder passieren lassen.Code:-- 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 sperrliste = {"1111111", "2222222"} ; function myfilterFMS32() for index,testwert in pairs(sperrliste) do if (testwert==arg["ric"]) then return 1 end end return 0 ; end function filter() local dummyValue=1 ; -- wird für jedes Telegramm (pocsag, fms, zvei) aufgerufen if (arg["client_type"]=="fms32") then return myfilterFMS32() ; end if (arg["client_type"]=="crusader") then -- nix dummyValue=2 ; end if (arg["client_type"]=="monitord") then -- nix dummyValue=3 ; end return 0; end
den Inhalt des arg Array kann man einsehen, wenn man sich im Debugmodus das Protokoll anschaut. Ich schreibe das hier, damit ich später selbst noch weiss, was ich getan habe :)Code:-- pluginfilter.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: -- -- plugin_name: z.B. mysql (aus monitord.xml) -- -- Rückgabewert: 0 = an Client senden, 1= nicht an Client senden, alle anderen = an Client senden -- local sperrliste = {"1111111", "2222222"} ; function pluginFilter() if (arg["plugin_name"]=="mysql1") then for index,testwert in pairs(sperrliste) do if (testwert==arg["ric"]) then return 1 end end end return 0 ; end
Wichtig: Es muss LUA Version 5.1 oder höher sein !
Geändert von Buebchen (17.08.2009 um 13:39 Uhr)
Moinmoin,
ich habe ein Problem... ;).
Eben habe ich mir die Geschichte anschauen wollen und den monitord mit LUA (--with-lua) compiliert. Scheinbar interessiert es ihn aber überhaupt nicht, dass er den socketfilter nutzen soll - weder im Log erscheint ein Hinweis darauf, dass LUA jetzt etwas tut, noch wird die Ausgabe gefiltert (selbst bei "return 1" als einziger Funktionsinhalt). Gibt es a) etwas zu beachten und b) woran kann man sehen, dass arbeitet?
Edit: Es tut. LUA-Sourcen laden, im MSYS make install und dann ab dafür. Woran man sehen kann, dass LUA arbeitet? Print-Ausgabe, steht dann im monitord-Fenster. os.execute() läuft auch auf einem Windows XP SP3.
Viele Grüße
Martin
Geändert von mdi (15.03.2010 um 14:09 Uhr)
kann das jetzt nochmal einer in "deutsch" erklären, wie ich RIC#s aufn Socket und für MySQL filtern kann?
Funzt das jetzt richig?
vielleicht wäre es ja möglich eine kompilierte version mit LUA für Socket und MySQL zur Filterung von RIC's online zu stellen?
von mir auch auch via icq, mail ;)
Gruß
Geändert von codeman2001 (01.04.2010 um 09:33 Uhr)
Tüddeldraht - ein Mittel für jeden Zweck ;)
Hallo,
anbei ein laufendes LUA-Skript als Beispiel.
Edit1: Ich komme derzeit nicht an den monitord-Server ran (Passwort vergessen). Eine entsprechende Anfrage an den Hoster ist raus.Code:-- 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ückgabewerte: -- 0 = an Client senden -- 1 = nicht an Client senden -- alle anderen = an Client senden -- filterDoppelteZVEI = 1 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() -- DEBUG-Info: Alles ausgeben for index,testwert in pairs(arg) do print(index) print(testwert) end -- genau zweimal gesendete Auslösungen filtern (Fünftonfolgen) if(filterDoppelteZVEI == 1) then if (arg["zvei"] == altZVEI) then altZVEI = nil; return 1; end altZVEI = arg["zvei"] 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
Edit2: Ich habe ein Paket geschnürt und es bei Rapidshare hochgeladen. Beispiel-LUA-Skripte von Buebchen und mir sind enthalten, ebenso eine MySQL-Tabellendefinition, die mit der monitord-Konfigurationsdatei überein stimmen sollte. Wenn es Probleme gibt, bitte hier im Thread oder per PM an mich! Download-URL: http://rapidshare.com/files/37191401...w32-2.0svn.exe
Edit3: Verbessertes Skript-Beispiel hier im Beitrag.
Edit4: Der Download geht jetzt auch wieder über die monitord.de-Webseite.
Edit5: Skript um Filter für Fünfton-Doppelauslösungen ergänzt.
Viele Grüße
Martin
Geändert von mdi (21.04.2010 um 17:31 Uhr)
Alles Gut und Schön. Aber wenn ich ehrlich bin, schaue ich hier wie ein Schwein ins Uhrwerk. Verstehe nicht wie, wo ich hier Einstellungen vornehmen muß. Es wäre schön wenn man Anhand eines Beispieles dies hier mal erklärt bekommt. Außerdem, ist es evtl. auch möglich wiederholte Meldungen zu unterdrücken?
Hallo,
ja das glaube ich, wenn man "es nur nutzen möchte", ist das ganze nicht gar so einfach zu handhaben.
Ich habe mal den "Doppelauslösefilter" für Fünftonfolgen ins Beispiel oben eingebaut. Was verstehst Du denn am Beispiel nicht bzw. was genau möchtest Du denn haben?
Edit: Das mit dem Filter scheint nicht richtig zu tun. Schon weil das Skript augenscheinlich bei jeder Folge _neu_ getriggert wird, also quasi "zustandslos" (wie HTTP) arbeitet und nichts über vorherige Aufrufe weiß. Open problem so far.
Viele Grüße
Martin
Geändert von mdi (18.08.2010 um 15:34 Uhr)
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)