mirror of
https://github.com/BOSWatch/BW3-Core.git
synced 2026-01-01 06:10:16 +01:00
Merge branch 'develop' into update_check
This commit is contained in:
commit
30a384c12d
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
|
||||
- `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`.
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
pyyaml
|
||||
|
||||
# for develope only
|
||||
pytest
|
||||
pytest-cov
|
||||
pytest-pep8
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
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"""
|
||||
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"""
|
||||
|
|
|
|||
|
|
@ -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"""
|
||||
|
|
|
|||
|
|
@ -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…
Reference in a new issue