Location configuration based on POC message elements

This commit is contained in:
Marco Schotthöfer 2021-01-25 17:53:51 +01:00
parent 4f5b4854c7
commit fed8c46382
4 changed files with 109 additions and 0 deletions

View file

@ -15,6 +15,7 @@ import re # Regex for validation
from includes import globalVars # Global variables
from includes import doubleFilter # double alarm filter
from includes import locationCoordinates
##
#
@ -161,6 +162,9 @@ def decode(freq, decoded):
if has_geo == True:
data["lon"] = lon
data["lat"] = lat
else:
locationCoordinates.findCoordinates(data)
# Add function as character a-d to dataset
data["functionChar"] = data["function"].replace("1", "a").replace("2", "b").replace("3", "c").replace("4", "d")
data["ricFuncChar"] = data["ric"] + data["functionChar"]

View file

@ -0,0 +1,77 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Functions for the location RegEX
@author: Marco Schotthöfer
@requires: Configuration has to be set in the config.ini
"""
import logging # Global logger
import re #Regex for Filter Check
from includes import globalVars # Global variables
# local variables
filterList = []
def loadFilters():
try:
logging.debug("Loading Location Coordinates")
for key,val in globalVars.config.items("LocationCoordinates"):
logging.debug(" - %s = %s", key, val)
filterData = val.split(";")
# at least 3 items needed (field1;pattern1;lat,lon), and in any case an uneven count of items
if len(filterData) < 3 and len(filterData) % 2 == 0:
logging.debug("Invalid argument count; skipping")
else:
# first store all regular expressions in list
filterItem = []
i = 0
while i < len(filterData) - 2:
filterItem.append({"field": filterData[i], "pattern": filterData[i+1]})
# step to next field
i += 2
# then transfer to filterList; include coordinates
filterList.append({"name": key, "filterItem": filterItem, "coordinates": filterData[len(filterData) - 1]})
except:
logging.error("cannot read config file")
logging.debug("cannot read config file", exc_info=True)
return
def findCoordinates(data):
try:
logging.debug("Find coordinates")
for i in filterList:
logging.debug("Filter: " + str(i))
regexMatch = True
for k in i["filterItem"]:
logging.debug("Pattern : " + str(k))
if k["field"] not in data.keys():
logging.debug("field " + k["field"] + " not in data structure, hence no match")
regexMatch = False
break
else:
if (k["field"] and not re.search(k["pattern"], data.get(k["field"]))):
logging.debug("No match")
regexMatch = False
if regexMatch:
coordinatesString = i["coordinates"]
logging.debug("Coordinate String: " + coordinatesString)
coordinatesList = coordinatesString.replace(" ", "").split(",")
if len(coordinatesList) == 2:
data["lat"] = coordinatesList[0]
data["lon"] = coordinatesList[1]
data["has_geo"] = True
logging.info("Coordinates found!")
break
except:
logging.error("cannot read config file")
logging.debug("cannot read config file", exc_info=True)