diff --git a/docu/docs/modul/double_filter.md b/docu/docs/modul/double_filter.md new file mode 100644 index 0000000..e857c79 --- /dev/null +++ b/docu/docs/modul/double_filter.md @@ -0,0 +1,49 @@ +#
Double Filter
+--- + +## 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 + diff --git a/docu/mkdocs.yml b/docu/mkdocs.yml index df708b9..ff4f904 100644 --- a/docu/mkdocs.yml +++ b/docu/mkdocs.yml @@ -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 diff --git a/module/filter/___doubleFilter.py b/module/filter/doubleFilter.py similarity index 53% rename from module/filter/___doubleFilter.py rename to module/filter/doubleFilter.py index aa8ba9f..4b0a20a 100644 --- a/module/filter/___doubleFilter.py +++ b/module/filter/doubleFilter.py @@ -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