diff --git a/boswatch/configYaml.py b/boswatch/configYaml.py index 74af87e..3eb6521 100644 --- a/boswatch/configYaml.py +++ b/boswatch/configYaml.py @@ -33,6 +33,10 @@ class ConfigYAML: else: yield item + def __len__(self): + """!returns the length of an config element""" + return len(self._config) + def __str__(self): """!Returns the string representation of the internal config dict""" return str(self._config) diff --git a/boswatch/wildcard.py b/boswatch/wildcard.py index 814d7a4..bedaac6 100644 --- a/boswatch/wildcard.py +++ b/boswatch/wildcard.py @@ -35,6 +35,7 @@ def registerWildcard(wildcard, bwPacketField): def replaceWildcards(message, bwPacket): _wildcards = { # formatting wildcards + # todo check if br and par are needed - if not also change config "{BR}": "\r\n", "{LPAR}": "(", "{RPAR}": ")", diff --git a/docu/docs/modul/mode_filter.md b/docu/docs/modul/mode_filter.md index e837261..f805835 100644 --- a/docu/docs/modul/mode_filter.md +++ b/docu/docs/modul/mode_filter.md @@ -2,7 +2,7 @@ --- ## Beschreibung -Mit diesem Modul ist es Möglich, die Pakete auf bestimmte Modes (FMS, POCSAG, ZVEI) zu Filtern. Je nach Konfiguration werden Pakete eines bestimmten Modes im aktuellen Router weitergeleitet oder verworfen. +Mit diesem Modul ist es möglich, die Pakete auf bestimmte Modes (FMS, POCSAG, ZVEI) zu Filtern. Je nach Konfiguration werden Pakete eines bestimmten Modes im aktuellen Router weitergeleitet oder verworfen. ## Resource `filter.modeFilter` diff --git a/docu/docs/modul/regex_filter.md b/docu/docs/modul/regex_filter.md new file mode 100644 index 0000000..8b19aba --- /dev/null +++ b/docu/docs/modul/regex_filter.md @@ -0,0 +1,70 @@ +#
Regex Filter
+--- + +## Beschreibung +Mit diesem Modul ist es möglich, komplexe Filter basierend auf Regulären Ausdrücken (Regex) anzulegen. +Für einen Filter können beliebig viele Checks angelegt werden, welche Felder eines BOSWatch Pakets mittels Regex prüfen. + +Folgendes gilt: + +- Die Filter werden nacheinander abgearbeitet +- Innerhalb des Filters werden die Checks nacheinander abgearbeitet +- Sobald ein einzelner Check fehlschlägt ist der ganze Filter fehlgeschlagen +- Sobald ein Filter mit all seinen Checks besteht, wird mit der Ausführung des Routers fortgefahren +- Sollten alle Filter fehlschlagen wird die Ausführung des Routers beendet + +## Resource +`filter.regexFilter` + +## Konfiguration + +|Feld|Beschreibung|Default| +|----|------------|-------| +|filter|Enthält eine Liste der einzelnen Filter|| + +#### `filter:` + +|Feld|Beschreibung|Default| +|----|------------|-------| +|name|Beliebiger Name des Filters|| +|checks|Liste der einzelnen Checks innerhalb des Filters|| + +#### `checks:` + +|Feld|Beschreibung|Default| +|----|------------|-------| +|field|Name des Feldes innerhalb des BOSWatch Pakets welches untersucht werden soll|| +|regex|Regulärer Ausdruck (Bei Sonderzeichen " " verwenden)|| + +**Beispiel:** +```yaml +- type: module + res: filter.regexFilter + config: + filter: + - name: "Zvei filter" + checks: + - field: zvei + regex: "65[0-9]{3}" # all zvei with starting 65 + - name: "FMS Stat 3" + checks: + - field: mode + regex: "fms" # check if mode is fms + - field: status + regex: "3" # check if status is 3 +``` + +--- +## Abhängigkeiten + +- keine + +--- +## Paket Modifikationen + +- keine + +--- +## Zusätzliche Wildcards + +- keine diff --git a/docu/mkdocs.yml b/docu/mkdocs.yml index 296b21e..1942050 100644 --- a/docu/mkdocs.yml +++ b/docu/mkdocs.yml @@ -19,6 +19,7 @@ nav: - Changelog: changelog.md - Module: - Mode Filter: modul/mode_filter.md + - Regex Filter: modul/regex_filter.md - Plugins: tbd.md - Entwickler: - Eigenes Modul/Plugin schreiben: develop/ModulPlugin.md diff --git a/module/filter/modeFilter.py b/module/filter/modeFilter.py index 4e08623..2e97d1b 100644 --- a/module/filter/modeFilter.py +++ b/module/filter/modeFilter.py @@ -38,8 +38,7 @@ class BoswatchModule(Module): def doWork(self, bwPacket): """!start an run of the module. - @param bwPacket: A BOSWatch packet instance - @return bwPacket or False""" + @param bwPacket: A BOSWatch packet instance""" for mode in self.config.get("allowed", default=[]): if bwPacket.get("mode") == mode: diff --git a/module/filter/regexFilter.py b/module/filter/regexFilter.py new file mode 100644 index 0000000..7f9556c --- /dev/null +++ b/module/filter/regexFilter.py @@ -0,0 +1,65 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +"""! + ____ ____ ______ __ __ __ _____ + / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / + / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ < + / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / +/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/ + German BOS Information Script + by Bastian Schroll + +@file: regexFilter.py +@date: 26.10.2019 +@author: Bastian Schroll +@description: Regex filter module +""" +import logging +from module.module import Module + +# ###################### # +# Custom plugin includes # +import re +# ###################### # + +logging.debug("- %s loaded", __name__) + + +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 class on 'self.config' + + def onLoad(self): + """!Called by import of the plugin""" + pass + + def doWork(self, bwPacket): + """!start an run of the module. + + @param bwPacket: A BOSWatch packet instance""" + for filter in self.config.get("filter"): + checkFailed = False + logging.debug("try filter '%s' with %d check(s)", filter.get("name"), len(filter.get("checks"))) + + for check in filter.get("checks"): + fieldData = bwPacket.get(check.get("field")) + + if not fieldData or not re.search(check.get("regex"), fieldData): + logging.debug("[-] field '%s' with regex '%s'", check.get("field"), check.get("regex")) + checkFailed = True + break # if one check failed we break this filter + else: + logging.debug("[+] field '%s' with regex '%s'", check.get("field"), check.get("regex")) + + if not checkFailed: + logging.debug("[PASSED] filter '%s'", filter.get("name")) + return None # None -> Router will go on with this packet + logging.debug("[FAILED] filter '%s'", filter.get("name")) + + return False # False -> Router will stop further processing + + def onUnload(self): + """!Called by destruction of the plugin""" + pass diff --git a/module/template_module.py b/module/template_module.py index fe6a557..a0d7d15 100644 --- a/module/template_module.py +++ b/module/template_module.py @@ -38,8 +38,7 @@ class BoswatchModule(Module): def doWork(self, bwPacket): """!start an run of the module. - @param bwPacket: A BOSWatch packet instance - @return bwPacket or False""" + @param bwPacket: A BOSWatch packet instance""" if bwPacket.get("mode") == "fms": pass elif bwPacket.get("mode") == "zvei":