From 4f72691c6550b83ece3e5deee300bce36add231a Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Sat, 3 Feb 2018 16:09:56 +0100 Subject: [PATCH] rework double filter --- boswatch/filter/doubeFilter.py | 61 +++++++++++++++++++++++----------- boswatch/packet/packet.py | 4 +-- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/boswatch/filter/doubeFilter.py b/boswatch/filter/doubeFilter.py index 9053a2a..60747b0 100644 --- a/boswatch/filter/doubeFilter.py +++ b/boswatch/filter/doubeFilter.py @@ -27,33 +27,56 @@ logging.debug("- %s loaded", __name__) class DoubleFilter: """!Double Filter Class""" - def __init__(self, scanWord): + def __init__(self): """!init""" self._config = Config() - self._filterList = [] - self._scanWord = scanWord + self._filterLists = {} - def check(self, bwPacket): + def filter(self, bwPacket): - self._deleteTooOld() + if bwPacket.get("mode") is "fms": + scanWord = "fms" + elif bwPacket.get("mode") is "pocsag": + scanWord = "ric" + elif bwPacket.get("mode") is "zvei": + scanWord = "zvei" + else: + logging.error("No Filter for '%s'", bwPacket) + return False - for listPacket in self._filterList: - if listPacket.get(self._scanWord) is bwPacket.get(self._scanWord): - self._filterList.remove(listPacket) - logging.debug("found duplicate: %s", bwPacket.get(self._scanWord)) + if not bwPacket.get("mode") in self._filterLists: + logging.debug("create new doubleFilter list for '%s'", bwPacket.get("mode")) + self._filterLists[bwPacket.get("mode")] = [] - self._filterList.insert(0, bwPacket) - self._deleteTooMuch() + # for debug + print(len(self._filterLists[bwPacket.get("mode")])) - def _deleteTooOld(self): + logging.debug("scanWord for '%s' is '%s'", bwPacket.get("mode"), scanWord) + + return self.check(bwPacket, scanWord) + + def check(self, bwPacket, scanWord): + self._filterLists[bwPacket.get("mode")].insert(0, bwPacket) + + # delete entrys that are to old counter = 0 - for listPacket in self._filterList: + for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one + print(str(listPacket.get("timestamp")), str(time.time() - self._config.getInt("doubleFilter", "IgnoreTime", "serverConfig"))) if listPacket.get("timestamp") < (time.time() - self._config.getInt("doubleFilter", "IgnoreTime", "serverConfig")): - self._filterList.remove(listPacket) - counter += 1 + self._filterLists[bwPacket.get("mode")].remove(listPacket) + counter += 1 if counter: - logging.debug("%d old entry removed", counter) + logging.debug("%d old entry(s) removed", counter) - def _deleteTooMuch(self): - if len(self._filterList) > self._config.getInt("doubleFilter", "MaxEntry", "serverConfig"): - self._filterList.pop() + # delete last entry if list is to big + if len(self._filterLists[bwPacket.get("mode")]) > self._config.getInt("doubleFilter", "MaxEntry", "serverConfig"): + 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)) + return False + + print("OK!") + return True diff --git a/boswatch/packet/packet.py b/boswatch/packet/packet.py index ff75f7c..c761d34 100644 --- a/boswatch/packet/packet.py +++ b/boswatch/packet/packet.py @@ -35,7 +35,7 @@ class Packet: else: logging.debug("create bwPacket from string") try: - self._packet = eval(bwPacket.strip()) + self._packet = eval(str(bwPacket.strip())) except: # todo can we repair the packet anyway? logging.exception("error while create packet from string") @@ -49,7 +49,7 @@ class Packet: @param fieldName: Name of the data to set @param value: Value to set""" - self._packet[fieldName] = str(value) + self._packet[fieldName] = value def get(self, fieldName): """!Returns the value from a single field.