PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : monitord - LUA als Skriptsprache ?



Buebchen
12.07.2009, 15:51
Hallo @all,

nach langer Zeit habe ich nochmal ein wenig am monitord arbeiten können. Da immer wieder die Frage nach serverbasierten Funktionen aufkommt habe ich mir überlegt, ob es nicht Sinn macht LUA als Skriptsprache am Server einzuführen.

Die Integration scheint recht einfach zu sein. Vielleicht könnten die anderen Entwickler mal sagen, wie Sie das sehen.

Mögliche Stellen wo man LUA einsetzen könnte:

In den Socketthreads um z.B. Informationen zu verändern bevor sie weitergegeben werden (NA durch Notarzt ersetzen, RICs filtern, Um eigene Kommandos zu erstellen [ Client schickt an Server -> LUA erkennt das und führt eine Aktion aus] ...)
Im globalen Dispatcher um z.B. die Aufnahme zu starten / stoppen - oder auch im externe Programme aufzurufen.

wie genau die Integration gemacht wird muss man noch überlegen.

[Edit]
Da ich nicht weiss, wie lua mit verschiedene Threads harmoniert würde ich vorschlagen, daß erstmal am Globaldispatcher lua Skripte hängen. Damit sollten die meisten Funktion möglich sein. (Mal abgesehen von Custom-Commands von den Clients).

nepomuck
15.07.2009, 22:57
ob es nicht Sinn macht LUA als Skriptsprache am Server einzuführen.

Ich finde es keine gute Idee, neue Funktionen einführen zu wollen bevor die Alten überhaupt komplett implementiert wurden.

Allen voran fehlt die ursprünglich geplante History-Funktion. Darüber könnte ein Client vergangene Events nachfordern und beim Start beispielsweise den Staus der Fahrzeuge aus der Server-DB erhalten.

Das Protokoll dümpelt irgendwo zwischen Version 0,3 und 0,4 herum. Wir sollten langsam an den Punkt kommen, wo wir eine Art Stable-Release vom monitord und dem zugehörigen Protokoll festlegen. Dann haben wir eine solide Basis für die Client-Entwickler. (sofern es welche gibt -- ich arbeite seit ein paar Tagen übrigens wieder aktiv an einem Java-Frontend!)

Was LUA angeht sehe ich bei der bestehenden Architektur eigentlich keine Notwendigkeit, so etwas direkt in den Server zu integrieren. Die von dir vorgeschlagenen Features liessen sich in ein eigenständiges Filterprogramm einbauen, welches direkt auf dem Server läuft und via localhost:9333 mit dem Server spricht. Die "gefilterten" Werte gäbe der LUA-Layer dann mit dem Original-Protokoll z.B. auf Port 9334 aus.

Ein Client könnte dann entscheiden, ob er "RAW"- oder "Filtered"-Access zum Server haben will.

Anders gesagt: Ein monitord-Server wertet alle Daten auf einem Feuerwehr-Kanal aus. Der Client des neugieregen Funkwarts bekommt alle Daten aus dem Landkreis, wärend der Client in der Zentrale nur die Informationen zur eigenen Wehr sieht.

viele Grüße,
Andreas

Buebchen
16.07.2009, 21:20
Dann lass es mich anders formulieren: Aus persönlichem Interesse kann man den monitord demnächst mit LUA kompilieren. Wer das im configure nicht selektiert kann natürlich wie gehabt arbeiten.

Ein eigenes Frontend wäre etwas tolles. Das würde mich dann auch aus persönlichem Interesse dazu motivieren über eine Historie nachzudenken :)

nepomuck
16.07.2009, 23:39
Aus persönlichem Interesse kann man den monitord demnächst mit LUA kompilieren.
Wenn du das konkret brauchst ist das ja ok.


Ein eigenes Frontend wäre etwas tolles.
Code steht online (sieh neuen Post in diesem Forum).
Was "Tolles" ist das noch nicht -- aber zumindest mal ein Anfang.

Andreas

Buebchen
14.08.2009, 18:41
Notiz zum Thema lua:

In der Konfig kann man nun zwei scripts angeben:



?>
<monitordconfig version="1.0">
<name> Monitord </name>
<logfile> screen </logfile>
<loglevel> DEBUG1 </loglevel>
<SocketFilterScript> socketfilter.lua </SocketFilterScript>
<PluginFilterScript> pluginfilter.lua </PluginFilterScript>


Diese Skripte müssen jeweils eine Funktion bereitstellen, die bei jedem Paket, das verteilt wird aufgerufen wird.

Für die Sockets ist das die function filter() - z.B. so:



-- 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




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.



-- 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



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 :)

Wichtig: Es muss LUA Version 5.1 oder höher sein !

mdi
01.03.2010, 15:06
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

codeman2001
01.04.2010, 10:14
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ß

mdi
03.04.2010, 17:17
Hallo,

anbei ein laufendes LUA-Skript als Beispiel.

-- 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


Edit1: Ich komme derzeit nicht an den monitord-Server ran (Passwort vergessen). Eine entsprechende Anfrage an den Hoster ist raus.

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/371914010/monitord-mingw32-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

FF Pulsnitz
19.04.2010, 11:20
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?

mdi
21.04.2010, 18:32
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

frank34
08.01.2011, 17:52
Hallo Leute,
habe monitord auf einem WinXP System laufen. Geht prima.
Jetzt habe ich das pluginfilter.lua angepasst.

Rufe ich monitord direkt im Verzeichnis C:\Programme\monitord auf wird auch alles so gefiltert wie ich es möchte.

Installiere ich monitord aber als Dienst wird keine Filterung vorgenommen.

Muss ich in monitord.xml noch einen Pfad angeben, wo das lua script steht ???

Grüsse Frank

mdi
09.01.2011, 01:43
Hallo Frank,

dass das schonmal prima läuft an sich, ist gut - danke auch für dieses Feedback :)!

Die pluginfilter.lua sollte in dem Verzeichnis liegen, in dem auch der monitord liegt. Ich erinnere mich dunkel, dass bei Installation als Dienst Probleme mit (relativen) Pfaden auftreten können. Das heißt, es ist am geschicktesten, in der monitord.xml absoulte Pfade anzugeben (nicht ./pluginfilter.lua - sondern c:\programme\monitord\pluginfilter.lua, natürlich an Abhängigkeit der jeweiligen Gegebenheiten und Pfade).

Genauer herausbekommen kannst Du das, in dem Du den Loglevel auf "DEBUG" stellst, dann erscheinen beim Start des Dienstes im Logfile Meldungen wie: "successfully loaded filterskript pluginfilter.lua" oder halt "not found: pluginfilter.lua" (vergleichbar, ich hab den genauen Text nicht im Kopf...).

Ich hoffe, das hilft Dir erstmal :)?!

Viele Grüße
Martin