mirror of
https://github.com/BOSWatch/BW3-Core.git
synced 2025-12-06 07:12:04 +01:00
commit
e742283216
49
docu/docs/modul/double_filter.md
Normal file
49
docu/docs/modul/double_filter.md
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
# <center>Double Filter</center>
|
||||
---
|
||||
|
||||
## Beschreibung
|
||||
Mit diesem Modul ist es möglich, die Pakete auf Duplikate zu Filtern. Je nach Konfiguration werden doppelte Pakete im aktuellen Router weitergeleitet oder verworfen.
|
||||
|
||||
## Unterstütze Alarmtypen
|
||||
- Fms
|
||||
- Pocsag
|
||||
- Zvei
|
||||
|
||||
## Resource
|
||||
`filter.doubleFilter`
|
||||
|
||||
## Konfiguration
|
||||
|Feld|Beschreibung|Default|
|
||||
|----|------------|-------|
|
||||
|ignoreTime|Zeitfenster für doppelte Pakte in Sekunden|10|
|
||||
|maxEntry|Maximale Anzahl an Paketen in der Vergleichsliste|20|
|
||||
|pocsagFields|Liste der Pocsag Felder zum Vergleichen: `ric`, `subric` und/oder `message`|`ric,subric`|
|
||||
|
||||
**Beispiel:**
|
||||
```yaml
|
||||
- type: module
|
||||
res: filter.doubleFilter
|
||||
config:
|
||||
ignoreTime: 30
|
||||
maxEntry: 10
|
||||
pocsagFields:
|
||||
- ric
|
||||
- subric
|
||||
```
|
||||
|
||||
---
|
||||
## Modul Abhängigkeiten
|
||||
- keine
|
||||
|
||||
---
|
||||
## Externe Abhängigkeiten
|
||||
- keine
|
||||
|
||||
---
|
||||
## Paket Modifikationen
|
||||
- keine
|
||||
|
||||
---
|
||||
## Zusätzliche Wildcards
|
||||
- keine
|
||||
|
||||
|
|
@ -22,6 +22,7 @@ nav:
|
|||
- Geocoding: modul/geocoding.md
|
||||
- Mode Filter: modul/mode_filter.md
|
||||
- Regex Filter: modul/regex_filter.md
|
||||
- Double Filter: modul/double_filter.md
|
||||
- Plugins:
|
||||
- Http: plugin/http.md
|
||||
- Telegram: plugin/telegram.md
|
||||
|
|
|
|||
|
|
@ -10,33 +10,45 @@
|
|||
by Bastian Schroll
|
||||
|
||||
@file: doubleFilter.py
|
||||
@date: 15.01.2018
|
||||
@author: Bastian Schroll
|
||||
@description: Class to implement a filter for double alarms
|
||||
@todo test, refactor and document / check_msg is not implemented yet
|
||||
@date: 09.07.2020
|
||||
@author: Bastian Schroll, b-watch
|
||||
@description: Filter module for double packages
|
||||
"""
|
||||
import logging
|
||||
from module.moduleBase import ModuleBase
|
||||
|
||||
# ###################### #
|
||||
# Custom plugin includes #
|
||||
import time
|
||||
# ######################
|
||||
|
||||
logging.debug("- %s loaded", __name__)
|
||||
|
||||
|
||||
class DoubleFilter:
|
||||
"""!Double Filter Class"""
|
||||
|
||||
class BoswatchModule(ModuleBase):
|
||||
"""!Description of the Module"""
|
||||
def __init__(self, config):
|
||||
"""!init"""
|
||||
self._config = config
|
||||
"""!Do not change anything here!"""
|
||||
super().__init__(__name__, config) # you can access the config class on 'self.config'
|
||||
self._filterLists = {}
|
||||
logging.debug("Configured ignoreTime: %d", self.config.get("ignoreTime", default=10))
|
||||
logging.debug("Configured maxEntry: %d", self.config.get("maxEntry", default=10))
|
||||
|
||||
def filter(self, bwPacket):
|
||||
def onLoad(self):
|
||||
"""!Called by import of the plugin
|
||||
Remove if not implemented"""
|
||||
pass
|
||||
|
||||
def doWork(self, bwPacket):
|
||||
"""!start an run of the module.
|
||||
|
||||
@param bwPacket: A BOSWatch packet instance"""
|
||||
if bwPacket.get("mode") == "fms":
|
||||
scanWord = "fms"
|
||||
filterFields = ["fms"]
|
||||
elif bwPacket.get("mode") == "pocsag":
|
||||
scanWord = "ric"
|
||||
filterFields = self.config.get("pocsagFields", default=["ric", "subric"])
|
||||
elif bwPacket.get("mode") == "zvei":
|
||||
scanWord = "zvei"
|
||||
filterFields = ["tone"]
|
||||
else:
|
||||
logging.error("No Filter for '%s'", bwPacket)
|
||||
return False
|
||||
|
|
@ -45,31 +57,36 @@ class DoubleFilter:
|
|||
logging.debug("create new doubleFilter list for '%s'", bwPacket.get("mode"))
|
||||
self._filterLists[bwPacket.get("mode")] = []
|
||||
|
||||
logging.debug("scanWord for '%s' is '%s'", bwPacket.get("mode"), scanWord)
|
||||
logging.debug("filterFields for '%s' is '%s'", bwPacket.get("mode"), ", ".join(filterFields))
|
||||
|
||||
return self._check(bwPacket, scanWord)
|
||||
return self._check(bwPacket, filterFields)
|
||||
|
||||
def _check(self, bwPacket, scanWord):
|
||||
def onUnload(self):
|
||||
"""!Called by destruction of the plugin
|
||||
Remove if not implemented"""
|
||||
pass
|
||||
|
||||
def _check(self, bwPacket, filterFields):
|
||||
self._filterLists[bwPacket.get("mode")].insert(0, bwPacket)
|
||||
|
||||
# delete entries that are to old
|
||||
counter = 0
|
||||
for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
|
||||
if listPacket.get("timestamp") < (time.time() - self._config["ignoreTime"]):
|
||||
if float(listPacket.get("timestamp")) < (time.time() - self.config.get("ignoreTime", default=10)):
|
||||
self._filterLists[bwPacket.get("mode")].remove(listPacket)
|
||||
counter += 1
|
||||
if counter:
|
||||
logging.debug("%d old entry(s) removed", counter)
|
||||
|
||||
# delete last entry if list is to big
|
||||
if len(self._filterLists[bwPacket.get("mode")]) > self._config["maxEntry"]:
|
||||
if len(self._filterLists[bwPacket.get("mode")]) > self.config.get("maxEntry", default=20):
|
||||
logging.debug("MaxEntry reached - delete oldest")
|
||||
self._filterLists[bwPacket.get("mode")].pop()
|
||||
|
||||
for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
|
||||
if listPacket.get(scanWord) is bwPacket.get(scanWord):
|
||||
logging.debug("found duplicate: %s", bwPacket.get(scanWord))
|
||||
if all(listPacket.get(x) == bwPacket.get(x) for x in filterFields):
|
||||
logging.debug("found duplicate: %s", bwPacket.get("mode"))
|
||||
return False
|
||||
|
||||
logging.debug("doubleFilter ok")
|
||||
return True
|
||||
return None
|
||||
Loading…
Reference in a new issue