Merge branch 'develop' into update_check

This commit is contained in:
Bastian Schroll 2019-03-10 19:44:38 +01:00
commit 30a384c12d
13 changed files with 204 additions and 82 deletions

127
_info/config.md Normal file
View file

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

View file

@ -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, )

View file

@ -13,6 +13,7 @@ Die Modul Basisklasse bietet einige Methoden, welche vom Modul überschrieben we
- `onLoad()` wird direkt beim Import des Moduls ausgeführt - `onLoad()` wird direkt beim Import des Moduls ausgeführt
- `doWork(bwPacket)` wird bei der Ausführung aufgerufen - `doWork(bwPacket)` wird bei der Ausführung aufgerufen
- `onUnload()` wird beim Zerstören der Plugin Modul zum Programmende ausgeführt - `onUnload()` wird beim Zerstören der Plugin Modul zum Programmende ausgeführt
#### 2.2 Plugin #### 2.2 Plugin
Die Plugin Basisklasse bietet einige Methoden, welche vom Plugin überschrieben werden können. Die Plugin Basisklasse bietet einige Methoden, welche vom Plugin überschrieben werden können.
- `onLoad()` wird direkt beim Import des Plugins ausgeführt - `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 1
- list 2 - list 2
``` ```
Eine entsprechende Dokumentation der Parameter ist in der Config-Readme zu hinterlegen.
#### 3.2 Konfiguration nutzen #### 3.2 Konfiguration nutzen
Wird der Instanz eine Konfiguration übergeben wird diese in `self.config` 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: Mögliche Rückgabewerte eines Moduls:
- `return bwPacket` gibt das modifizierte bwPacket an den Router zurück - `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 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 #### 4.2 Zu beachten bei Plugins
Plugins geben keine Pakete mehr zurück. Sie fungieren ausschließlich als Endpunkt. 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)`. 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`. Die Platzhalter für die Wildcards findet man in `boswatch/utils/wildcard.py` oder in der `packet.md`.

View file

@ -3,6 +3,7 @@
pyyaml pyyaml
# for develope only
pytest pytest
pytest-cov pytest-cov
pytest-pep8 pytest-pep8

View file

@ -65,7 +65,7 @@ class RouterManager:
for route in router.get("route"): for route in router.get("route"):
routeType = route.get("type") routeType = route.get("type")
routeName = route.get("name") 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: if routeType is None or routeName is None:
logging.error("type or name not found in route: %s", route) logging.error("type or name not found in route: %s", route)

View file

@ -69,7 +69,8 @@ if not bwConfig.loadConfigFile(paths.CONFIG_PATH + args.config):
try: try:
bwRoutMan = RouterManager() bwRoutMan = RouterManager()
bwRoutMan.buildRouter(bwConfig) if not bwRoutMan.buildRouter(bwConfig):
exit()
if bwConfig.get("server", "useBroadcast", default=False): if bwConfig.get("server", "useBroadcast", default=False):
bcServer = BroadcastServer() bcServer = BroadcastServer()

View file

@ -20,9 +20,9 @@ inputSource:
sdr: sdr:
device: 0 device: 0
frequency: 85.000M frequency: 85.000M
PPMError: 0 error: 0
Squelch: 0 squelch: 0
Gain: 100 gain: 100
decoder: decoder:
fms: yes fms: yes

View file

@ -14,25 +14,13 @@ server:
alarmRouter: alarmRouter:
- Router 1 - Router 1
- Test
router: router:
- name: Router 1 - name: Router 1
route: route:
- type: module - type: module
name: template_module name: filter.modeFilter
config: config:
maxEntry: 30 allowed:
ignoreTime: 10 - fms
checkMsg: no - zvei
- type: router
name: Router 2
- type: plugin
name: template_plugin
config:
user: test
pass: test
- name: Router 2
route:
- type: module
name: template_module

View file

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

View file

@ -29,7 +29,7 @@ class BoswatchModule(Module):
"""!Description of the Module""" """!Description of the Module"""
def __init__(self, config): def __init__(self, config):
"""!Do not change anything here!""" """!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): def onLoad(self):
"""!Called by import of the plugin""" """!Called by import of the plugin"""

View file

@ -29,7 +29,7 @@ class BoswatchPlugin(Plugin):
"""!Description of the Plugin""" """!Description of the Plugin"""
def __init__(self, config): def __init__(self, config):
"""!Do not change anything here!""" """!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): def onLoad(self):
"""!Called by import of the plugin""" """!Called by import of the plugin"""

View file

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