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

View file

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

View file

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

View file

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

View file

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

View file

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

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

View file

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

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