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":