diff --git a/_info/config.md b/_info/config.md new file mode 100644 index 0000000..7c00dbc --- /dev/null +++ b/_info/config.md @@ -0,0 +1,127 @@ +## Konfiguration + +Die Konfiguration von BOSWatch 3 ist im YAML Format abgelegt und wird nachfolgend beschrieben. +Immer wenn für eine Einstellung ein **Default** Wert angegeben ist, muss diese Einstellung nicht +zwingend in die Konfiguration eingetragen werden. + + +### Client +Nachfolgend alle Paramater der Client Konfiguration + +#### `client:` +|Feld|Beschreibung|Default| +|----|------------|-------| +|name|Name zur Identifizierung der Client Instanz|| +|inoutSource|Art der zu nutzenden Input Quelle (aktuell nur `sdr`)|| +|useBroadcast|Verbindungsdaten per Broadcast beziehen|no| + +#### `server:` +Der Abschnitt `server:` wird nur genutzt, wenn `useBroadcast: no` gesetzt ist. + +|Feld|Beschreibung|Default| +|----|------------|-------| +|ip|IP Adresse des Servers|127.0.0.1| +|port|Port des Sever|8080| + +#### `inputSource:` +Aktuell gibt es nur `sdr:` als Input Quelle + +##### `sdr:` +|Feld|Beschreibung|Default| +|----|------------|-------| +|device|rtl_fm Device ID|0| +|frequency|Frequenz des Empfängers|| +|error|Frequenz Abweichung in ppm|0| +|squelch|Einstellung der Rauschsperre|0| +|gain|Verstärkung des Eingangssignals|100| + +Bsp: +```yaml +inputSource: + sdr: + device: 0 + frequency: 85.000M + error: 0 + squelch: 0 + gain: 100 +``` + +#### `decoder:` +|Feld|Beschreibung|Default| +|----|------------|-------| +|fms|FMS Decoder|no| +|zvei|ZVEI Decoder|no| +|poc512|POCSAG Decoder (Bitrate 512)|no| +|poc1200|POCSAG Decoder (Bitrate 1200)|no| +|poc2400|POCSAG Decoder (Bitrate 2400)|no| + +--- +### Server +Nachfolgend alle Paramater der Server Konfiguration + +#### `server:` +|Feld|Beschreibung|Default| +|----|------------|-------| +|port|Port auf dem der Server lauscht|8080 +|name|Name zur Identifizierung der Server Instanz|| +|useBroadcast|Verbindungsdaten per Broadcast Server bereitstellen|no| + +#### `alarmRouter:` +Enthält eine Liste der Router Namen, welche bei einem Alarm direkt gestartet werden sollen. + +Bsp: +```yaml +alarmRouter: +- Name des Routers +- ein weiter Router +``` + +#### `router:` +Mit den Routern kann der Verarbeitungsweg eines Alarm-Paketes festgelegt werden. +Diese werden als Liste angegeben + +|Feld|Beschreibung|Default| +|----|------------|-------| +|name|Name des Routers|| +|route|Definiten des Routenverlaufs + +Die einzelnen Routen werden wie folgt definiert + +|Feld|Beschreibung|Default| +|----|------------|-------| +|type|Art des Routenpunktes (module, plugin, router)|| +|name|Zu ladende Resource (vollständige Liste siehe !!!TBD!!!)|| +|config|Konfigurationseinstellungen des Routenpunktes|| + +Bsp: +```yaml +router: + - name: Router 1 + route: + - type: module + name: filter.modeFilter + config: + allowed: + - fms +``` + +--- +### Module +Nachfolgend alle Paramater der Modul Konfigurationen +#### `filter.modeFilter` + +|Feld|Beschreibung|Default| +|----|------------|-------| +|allowed|Liste der erlaubten Paket Typen `fms` `zvei` `pocsag`|| + +Bsp: +```yaml +config: + allowed: + - fms + - zvei +``` + +--- +### Plugins +Nachfolgend alle Paramater der Plugin Konfigurationen \ No newline at end of file diff --git a/_info/functions.txt b/_info/functions.txt deleted file mode 100644 index 7461841..0000000 --- a/_info/functions.txt +++ /dev/null @@ -1,20 +0,0 @@ -Facts: -Dokumentation mittels Doxygen -Unittests mittels pytest (zufällige Reihenfolge durch pytest-randomly) -Codeabdeckung mittels pytest-cov -PEP8 Design Kontrolle mittels pytest-pep8 -Logging mittels eigener Config-Datei einstellbar -Multi-Threading Server - -Fuktionen: -Server- Client Anwendung -Verarbeitung von FMS, POCSAG und ZVEI -Komfortables Plugin System -Beschreibung aus CSV File -Konfigurationsdateien Modulweit teilbar über "Sharepoints" -Alarm-Daten Übermittlung per definierten bwPacket-Paket -Plugin Statistiken sowie Ausführungszeiten -Plugin Priorisierung -Funktionaler und dynamischer Pluginloader -Automatische Wildcard-Ersetzung in Plugins -Verschiedene Filterfunktionen (doubleFilter, ) diff --git a/plugin/readme.md b/_info/ownModulePlugin.md similarity index 94% rename from plugin/readme.md rename to _info/ownModulePlugin.md index b4382a2..55bb5be 100644 --- a/plugin/readme.md +++ b/_info/ownModulePlugin.md @@ -13,6 +13,7 @@ Die Modul Basisklasse bietet einige Methoden, welche vom Modul überschrieben we - `onLoad()` wird direkt beim Import des Moduls ausgeführt - `doWork(bwPacket)` wird bei der Ausführung aufgerufen - `onUnload()` wird beim Zerstören der Plugin Modul zum Programmende ausgeführt + #### 2.2 Plugin Die Plugin Basisklasse bietet einige Methoden, welche vom Plugin überschrieben werden können. - `onLoad()` wird direkt beim Import des Plugins ausgeführt @@ -39,6 +40,7 @@ Jedes Modul oder Plugin wird in einem Router folgendermaßen deklariert: - list 1 - list 2 ``` +Eine entsprechende Dokumentation der Parameter ist in der Config-Readme zu hinterlegen. #### 3.2 Konfiguration nutzen Wird der Instanz eine Konfiguration übergeben wird diese in `self.config` @@ -74,11 +76,13 @@ Diese Änderungen werden im Router entsprechend weitergeleitet. Mögliche Rückgabewerte eines Moduls: - `return bwPacket` gibt das modifizierte bwPacket an den Router zurück - `return None` Router fährt mit dem unveränderten bwPacket fort (Input = Output) -- `return False` Router stopt sofort die Ausführung (zB. in Filter verwendet) +- `return False` Router stopt sofort die Ausführung (zB. in Filtern verwendet) + #### 4.2 Zu beachten bei Plugins Plugins geben keine Pakete mehr zurück. Sie fungieren ausschließlich als Endpunkt. -Die Plugin Basisklasse liefert intern immer ein `None` an den Router. +Die Plugin Basisklasse liefert intern immer ein `None` an den Router zurück, +was zur weiteren Ausführung des Routers führt. -### 5 Wildcards parsen (NUR PLUGIN) +### 5 Wildcards parsen (NUR IN PLUGIN) Das parsen der Wildcars funktioniert komfortabel über die interne Methode `self.parseWildcards(MSG)`. Die Platzhalter für die Wildcards findet man in `boswatch/utils/wildcard.py` oder in der `packet.md`. diff --git a/_info/requirements.txt b/_info/requirements.txt index 30f6f37..5133ad3 100644 --- a/_info/requirements.txt +++ b/_info/requirements.txt @@ -3,6 +3,7 @@ pyyaml +# for develope only pytest pytest-cov pytest-pep8 diff --git a/boswatch/router/routerManager.py b/boswatch/router/routerManager.py index 6e608d6..f78e64c 100644 --- a/boswatch/router/routerManager.py +++ b/boswatch/router/routerManager.py @@ -65,7 +65,7 @@ class RouterManager: for route in router.get("route"): routeType = route.get("type") routeName = route.get("name") - routeConfig = route.get("Config", default=ConfigYAML()) # if no config - build a empty + routeConfig = route.get("config", default=ConfigYAML()) # if no config - build a empty if routeType is None or routeName is None: logging.error("type or name not found in route: %s", route) diff --git a/bw_server.py b/bw_server.py index 4980b4f..aff6f89 100644 --- a/bw_server.py +++ b/bw_server.py @@ -69,7 +69,8 @@ if not bwConfig.loadConfigFile(paths.CONFIG_PATH + args.config): try: bwRoutMan = RouterManager() - bwRoutMan.buildRouter(bwConfig) + if not bwRoutMan.buildRouter(bwConfig): + exit() if bwConfig.get("server", "useBroadcast", default=False): bcServer = BroadcastServer() diff --git a/config/client.yaml b/config/client.yaml index 2f9b09a..a3e33c1 100644 --- a/config/client.yaml +++ b/config/client.yaml @@ -20,9 +20,9 @@ inputSource: sdr: device: 0 frequency: 85.000M - PPMError: 0 - Squelch: 0 - Gain: 100 + error: 0 + squelch: 0 + gain: 100 decoder: fms: yes diff --git a/config/server.yaml b/config/server.yaml index dfd8640..bf17173 100644 --- a/config/server.yaml +++ b/config/server.yaml @@ -14,25 +14,13 @@ server: alarmRouter: - Router 1 -- Test router: - - name: Router 1 - route: - - type: module - name: template_module - config: - maxEntry: 30 - ignoreTime: 10 - checkMsg: no - - type: router - name: Router 2 - - type: plugin - name: template_plugin - config: - user: test - pass: test - - name: Router 2 - route: - - type: module - name: template_module +- name: Router 1 + route: + - type: module + name: filter.modeFilter + config: + allowed: + - fms + - zvei diff --git a/module/filter/doubleFilter.py b/module/filter/___doubleFilter.py similarity index 100% rename from module/filter/doubleFilter.py rename to module/filter/___doubleFilter.py diff --git a/module/filter/modeFilter.py b/module/filter/modeFilter.py new file mode 100644 index 0000000..a7c1f6f --- /dev/null +++ b/module/filter/modeFilter.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +"""! + ____ ____ ______ __ __ __ _____ + / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / + / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ < + / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / +/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/ + German BOS Information Script + by Bastian Schroll + +@file: modeFilter.py +@date: 09.03.2019 +@author: Bastian Schroll +@description: Filter module for the packet type +""" +import logging +from module.module import Module + +# ###################### # +# Custom plugin includes # + +# ###################### # + +logging.debug("- %s loaded", __name__) + + +class BoswatchModule(Module): + """!Filter of specific bwPacket mode""" + def __init__(self, config): + """!Do not change anything here!""" + super().__init__(__name__, config) # you can access the config class on 'self.config' + + def onLoad(self): + """!Called by import of the plugin""" + pass + + def doWork(self, bwPacket): + """!start an rund of the module. + + @param bwPacket: A BOSWatch packet instance + @return bwPacket or False""" + + for mode in self.config.get("allowed", default=[]): + if bwPacket.get("mode") == mode: + logging.debug("mode is allowed: %s", bwPacket.get("mode")) + return None + logging.debug("mode is denied: %s", bwPacket.get("mode")) + return False + + def onUnload(self): + """!Called by destruction of the plugin""" + pass diff --git a/module/template_module.py b/module/template_module.py index 15eb12e..add7047 100644 --- a/module/template_module.py +++ b/module/template_module.py @@ -29,7 +29,7 @@ class BoswatchModule(Module): """!Description of the Module""" def __init__(self, config): """!Do not change anything here!""" - super().__init__(__name__, config) # you can access the config DICT by 'self._config' + super().__init__(__name__, config) # you can access the config class on 'self.config' def onLoad(self): """!Called by import of the plugin""" diff --git a/plugin/template_plugin.py b/plugin/template_plugin.py index 99fb80c..87b7ff3 100644 --- a/plugin/template_plugin.py +++ b/plugin/template_plugin.py @@ -29,7 +29,7 @@ class BoswatchPlugin(Plugin): """!Description of the Plugin""" def __init__(self, config): """!Do not change anything here!""" - super().__init__(__name__, config) # you can access the config DICT by 'self._config' + super().__init__(__name__, config) # you can access the config class on 'self.config' def onLoad(self): """!Called by import of the plugin""" diff --git a/test/module/test_doubleFilter.py b/test/module/test_doubleFilter.py deleted file mode 100644 index 0f118ad..0000000 --- a/test/module/test_doubleFilter.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -"""! - ____ ____ ______ __ __ __ _____ - / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / - / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ < - / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / -/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/ - German BOS Information Script - by Bastian Schroll - -@file: test_doubleFilter.py -@date: 15.12.2017 -@author: Bastian Schroll -@description: Unittests for BOSWatch. File have to run as "pytest" unittest -""" -# problem of the pytest fixtures -# pylint: disable=redefined-outer-name -import logging -import pytest - -from module.filter.doubleFilter import DoubleFilter - - -@pytest.mark.skip -class Test_DoubleFilter: - - def setup_method(self, method): - logging.debug("[TEST] %s.%s", method.__module__, method.__name__) - - def test_none(self): - pass