-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConfigLoader.py
90 lines (75 loc) · 2.55 KB
/
ConfigLoader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# -*- Mode:Python;indent-tabs-mode:nil; -*-
#
# ConfigLoader.py
#
# Loads a JSON configuration file and performs some sanity checks.
#
# Author: jju / VTT Technical Research Centre of Finland Ltd., 2016
#
import json
class ParseError( Exception ):
def __init__( self, value ):
super( ParseError, self ).__init__( value )
self.value = value
def __str__ ( self ):
return repr( self.value )
class ObjectEnum( object ):
Connection, Port, Address = range( 3 )
def parseObjectEnum( value ):
if value == 'OBJ_CONNECTION':
return ObjectEnum.Connection
if value == 'OBJ_PORT':
return ObjectEnum.Port
if value == 'OBJ_ADDRESS':
return ObjectEnum.Address
raise ParseError( 'Invalid ObjectEnum: ' + value )
class EventEnum( object ):
File, Connection = range( 2 )
def parseEventEnum( value ):
if value == 'EVENT_FILE':
return EventEnum.File
if value == 'EVENT_CONNECTION':
return EventEnum.Connection
raise ParseError( 'Invalid EventEnum: ' + value )
class ActionEnum( object ):
Log = range( 1 )
def parseActionEnum( value ):
if value == 'log':
return ActionEnum.Log
raise ParseError( 'Invalid ActionEnum: ' + value )
def parseMultiValueDictionary( data ):
to = {}
for item in data:
key = item[ 'type' ]
value = item[ 'value' ]
to.setdefault( key, [] )
to[ key ].append( value )
return to
def parseHSPL( data ):
to = {}
to[ 'id' ] = data[ 'id' ]
to[ 'text' ] = data[ 'text' ]
return to
class Rule( object ):
ruleId = None # Rule ID string
event = None # Event Enum
operation = None # Operation name (bro module name)
action = None # Action Enum
parameters = {} # Dictionary of parameters: type as a key, list of values
conditions = {} # Dictionary of conditions: type as a key, list of values
def __init__( self, data ):
self.ruleId = data[ 'id' ]
self.hspl = parseHSPL( data[ 'hspl' ] )
self.event = parseEventEnum( data[ 'event' ] )
self.action = parseActionEnum( data[ 'action' ] )
self.operation = data[ 'operation' ]
self.parameters = parseMultiValueDictionary( data[ 'parameters' ] )
self.conditions = parseMultiValueDictionary( data[ 'conditions' ] )
def load( filename ):
out = []
with open( filename, 'r' ) as data_file:
data = json.load( data_file )
rules = data[ 'rules' ]
for rule in rules:
out.append( Rule( rule ) )
return out