From 8b5a538c5f300af997a78e79a9a221226aec38f8 Mon Sep 17 00:00:00 2001 From: B-Watch Date: Thu, 9 Jul 2020 21:17:44 +0200 Subject: [PATCH 1/6] first draft doubleFilter --- .../{___doubleFilter.py => doubleFilter.py} | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) rename module/filter/{___doubleFilter.py => doubleFilter.py} (53%) 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..82ee672 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"]) elif bwPacket.get("mode") == "zvei": - scanWord = "zvei" + filterFields = ["zvei"] else: logging.error("No Filter for '%s'", bwPacket) return False @@ -45,30 +57,35 @@ 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") From 8bd9e26fe1fbb5be03541aaf7b121ff55a315d80 Mon Sep 17 00:00:00 2001 From: B-Watch Date: Fri, 10 Jul 2020 21:25:03 +0200 Subject: [PATCH 2/6] fixed wrong return --- module/filter/doubleFilter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/filter/doubleFilter.py b/module/filter/doubleFilter.py index 82ee672..f23e17e 100644 --- a/module/filter/doubleFilter.py +++ b/module/filter/doubleFilter.py @@ -89,4 +89,4 @@ class BoswatchModule(ModuleBase): return False logging.debug("doubleFilter ok") - return True + return bwPacket From 2f96e4aa9bfa7e6bc2a54f5d651d0630b62e05be Mon Sep 17 00:00:00 2001 From: B-Watch Date: Fri, 10 Jul 2020 21:35:08 +0200 Subject: [PATCH 3/6] added documentation --- docu/docs/modul/double_filter.md | 49 ++++++++++++++++++++++++++++++++ docu/mkdocs.yml | 1 + 2 files changed, 50 insertions(+) create mode 100644 docu/docs/modul/double_filter.md diff --git a/docu/docs/modul/double_filter.md b/docu/docs/modul/double_filter.md new file mode 100644 index 0000000..7fb28f8 --- /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`| + +**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 From 1aac3ce2cf3913ed0ce2b25967a7b2d577f2521a Mon Sep 17 00:00:00 2001 From: B-Watch Date: Fri, 10 Jul 2020 21:41:19 +0200 Subject: [PATCH 4/6] Merge branch 'develop' into FR-DoubleFilter --- module/template_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/template_module.py b/module/template_module.py index 2cb6eb1..2fe0568 100644 --- a/module/template_module.py +++ b/module/template_module.py @@ -25,7 +25,7 @@ from module.moduleBase import ModuleBase logging.debug("- %s loaded", __name__) -class BoswatchModul(ModuleBase): +class BoswatchModule(ModuleBase): """!Description of the Module""" def __init__(self, config): """!Do not change anything here!""" From 6e2ee6ba6a1b40a2988d32132c14867225aae86c Mon Sep 17 00:00:00 2001 From: B-Watch Date: Mon, 13 Jul 2020 19:56:38 +0200 Subject: [PATCH 5/6] Changed return to None --- module/filter/doubleFilter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/filter/doubleFilter.py b/module/filter/doubleFilter.py index f23e17e..dfcdd72 100644 --- a/module/filter/doubleFilter.py +++ b/module/filter/doubleFilter.py @@ -89,4 +89,4 @@ class BoswatchModule(ModuleBase): return False logging.debug("doubleFilter ok") - return bwPacket + return None From 4e95d14d889b4ee6f321796917436af66421f010 Mon Sep 17 00:00:00 2001 From: B-Watch Date: Wed, 15 Jul 2020 08:09:57 +0200 Subject: [PATCH 6/6] added changes from PR-Discussion --- docu/docs/modul/double_filter.md | 2 +- module/filter/doubleFilter.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docu/docs/modul/double_filter.md b/docu/docs/modul/double_filter.md index 7fb28f8..e857c79 100644 --- a/docu/docs/modul/double_filter.md +++ b/docu/docs/modul/double_filter.md @@ -17,7 +17,7 @@ Mit diesem Modul ist es möglich, die Pakete auf Duplikate zu Filtern. Je nach K |----|------------|-------| |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`| +|pocsagFields|Liste der Pocsag Felder zum Vergleichen: `ric`, `subric` und/oder `message`|`ric,subric`| **Beispiel:** ```yaml diff --git a/module/filter/doubleFilter.py b/module/filter/doubleFilter.py index dfcdd72..4b0a20a 100644 --- a/module/filter/doubleFilter.py +++ b/module/filter/doubleFilter.py @@ -46,9 +46,9 @@ class BoswatchModule(ModuleBase): if bwPacket.get("mode") == "fms": filterFields = ["fms"] elif bwPacket.get("mode") == "pocsag": - filterFields = self.config.get("pocsagFields", default=["ric"]) + filterFields = self.config.get("pocsagFields", default=["ric", "subric"]) elif bwPacket.get("mode") == "zvei": - filterFields = ["zvei"] + filterFields = ["tone"] else: logging.error("No Filter for '%s'", bwPacket) return False