Skip to content
Snippets Groups Projects
Commit 0163d76a authored by Rajmund Hruška's avatar Rajmund Hruška
Browse files

Filer: Filter keys in sent events. (Redmine issue: #6799)

parent 52fcd05b
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/python
"""Warden3 Filer Test Suite"""
import unittest2 as unittest
import warden_filer
idea_raw_1 = {
'ID': '4dd7cf5e-4a95-49f6-8f04-947de998012c',
'Format': 'IDEA0',
'DetectTime': '2016-06-21T13:08:27Z',
'WinStartTime': '2016-06-21T11:55:02Z',
'WinEndTime': '2016-06-21T12:00:02Z',
'Source': [
{
'IP4': ['188.14.166.39']
}
],
'Target': [
{
'IP4': ['195.113.165.128/25']
}
],
'_TO_DELETE': {
'key1' : 'value',
'key2' : 2
},
'Node': [
{
'Type': ['Relay'],
'Name': 'cz.cesnet.mentat.warden_filer'
}
],
'_CESNET': {
'StorageTime': '2016-06-21T14:00:07Z'
}
}
idea_filtered_1 = {
'ID': '4dd7cf5e-4a95-49f6-8f04-947de998012c',
'Format': 'IDEA0',
'DetectTime': '2016-06-21T13:08:27Z',
'WinStartTime': '2016-06-21T11:55:02Z',
'WinEndTime': '2016-06-21T12:00:02Z',
'Source': [
{
'IP4': ['188.14.166.39']
}
],
'Target': [
{
'IP4': ['195.113.165.128/25']
}
],
'Node': [
{
'Type': ['Relay'],
'Name': 'cz.cesnet.mentat.warden_filer'
}
]
}
class Warden3FilerTest(unittest.TestCase):
"""Warden3 Filer unit tests"""
def test_filter_by_regexp(self):
regexp = '^_+'
filtered = warden_filer.filter_by_regexp(idea_raw_1, regexp)
self.assertEquals(filtered, idea_filtered_1)
event = {
'ID' : '1',
'Node' : {
'_INTERNAL' : 'data'
}
}
filtered = warden_filer.filter_by_regexp(event, regexp)
# only first level keys are filtered
self.assertEquals(filtered, event)
if __name__ == "__main__":
unittest.main()
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
// "tag": null, // "tag": null,
// "notag": ["Honeypot"] // "notag": ["Honeypot"]
//}, //},
// Optional regexp filter for keys, matched keys are removed from events
//"key_filter" : "^_+",
// Optional information about detector to be prepended into Idea Node array // Optional information about detector to be prepended into Idea Node array
//"node": { //"node": {
// "Name": "cz.example.warden.test_sender", // "Name": "cz.example.warden.test_sender",
......
...@@ -17,6 +17,7 @@ import signal ...@@ -17,6 +17,7 @@ import signal
import resource import resource
import atexit import atexit
import argparse import argparse
import re
from os import path, mkdir from os import path, mkdir
from random import choice, randint; from random import choice, randint;
...@@ -249,7 +250,14 @@ def get_dir_list(sdir, owait_poll_time, owait_timeout, nfchunk, oneshot): ...@@ -249,7 +250,14 @@ def get_dir_list(sdir, owait_poll_time, owait_timeout, nfchunk, oneshot):
nflist = sdir.get_incoming() nflist = sdir.get_incoming()
return nflist return nflist
def filter_by_regexp(event, regexp):
"""
:param dict event: event where the keys should be filtered.
:param regexp: regular expression defining keys which should be left out.
:return: dictionary which does NOT contain keys matching regexp.
:rtype: dict
"""
return {k:event.get(k) for k in event.keys() if not re.match(regexp, k)}
def sender(config, wclient, sdir, oneshot): def sender(config, wclient, sdir, oneshot):
poll_time = config.get("poll_time", 5) poll_time = config.get("poll_time", 5)
...@@ -258,6 +266,8 @@ def sender(config, wclient, sdir, oneshot): ...@@ -258,6 +266,8 @@ def sender(config, wclient, sdir, oneshot):
node = config.get("node", None) node = config.get("node", None)
done_dir = config.get("done_dir", None) done_dir = config.get("done_dir", None)
conf_filt = config.get("filter", {}) conf_filt = config.get("filter", {})
# If no filter for keys is set then the filter which matches nothing is used
key_filter = config.get("key_filter", "a^")
filt = {} filt = {}
# Extract filter explicitly to be sure we have right param names for match_event # Extract filter explicitly to be sure we have right param names for match_event
for s in ("cat", "nocat", "tag", "notag", "group", "nogroup"): for s in ("cat", "nocat", "tag", "notag", "group", "nogroup"):
...@@ -301,7 +311,8 @@ def sender(config, wclient, sdir, oneshot): ...@@ -301,7 +311,8 @@ def sender(config, wclient, sdir, oneshot):
if node: if node:
nodelist = event.setdefault("Node", []) nodelist = event.setdefault("Node", [])
nodelist.insert(0, node) nodelist.insert(0, node)
events.append(event) # filter keys based on regular expression before appending to the list
events.append(filter_by_regexp(event, key_filter))
nf_sent.append(nf) nf_sent.append(nf)
except Exception as e: except Exception as e:
Error(message="Error loading event", exc=sys.exc_info(), file=str(nf), Error(message="Error loading event", exc=sys.exc_info(), file=str(nf),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment