mirror of
https://github.com/BOSWatch/BW3-Core.git
synced 2026-04-18 04:33:51 +00:00
Merge branch 'develop' into update_check
This commit is contained in:
commit
30a384c12d
13 changed files with 204 additions and 82 deletions
127
_info/config.md
Normal file
127
_info/config.md
Normal 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
|
||||||
|
|
@ -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, )
|
|
||||||
|
|
@ -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`.
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
pyyaml
|
pyyaml
|
||||||
|
|
||||||
|
# for develope only
|
||||||
pytest
|
pytest
|
||||||
pytest-cov
|
pytest-cov
|
||||||
pytest-pep8
|
pytest-pep8
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
|
||||||
53
module/filter/modeFilter.py
Normal file
53
module/filter/modeFilter.py
Normal 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
|
||||||
|
|
@ -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"""
|
||||||
|
|
|
||||||
|
|
@ -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"""
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue