6
6
from plaso .formatters import default
7
7
from plaso .formatters import logger
8
8
from plaso .lib import definitions
9
+ from plaso .formatters import yaml_formatters_file
9
10
10
11
11
12
class FormattersManager (object ):
@@ -15,6 +16,9 @@ class FormattersManager(object):
15
16
_formatter_objects = {}
16
17
_unformatted_attributes = {}
17
18
19
+ # Work-around to prevent the tests re-reading the formatters file.
20
+ _file_was_read = False
21
+
18
22
@classmethod
19
23
def DeregisterFormatter (cls , formatter_class ):
20
24
"""Deregisters a formatter class.
@@ -29,9 +33,8 @@ def DeregisterFormatter(cls, formatter_class):
29
33
"""
30
34
formatter_data_type = formatter_class .DATA_TYPE .lower ()
31
35
if formatter_data_type not in cls ._formatter_classes :
32
- raise KeyError (
33
- 'Formatter class not set for data type: {0:s}.' .format (
34
- formatter_class .DATA_TYPE ))
36
+ raise KeyError ('Formatter class not set for data type: {0:s}.' .format (
37
+ formatter_class .DATA_TYPE ))
35
38
36
39
del cls ._formatter_classes [formatter_data_type ]
37
40
@@ -57,8 +60,8 @@ def GetFormatterObject(cls, data_type):
57
60
formatter_object = formatter_class ()
58
61
59
62
if not formatter_object :
60
- logger .warning (
61
- 'Using default formatter for data type: {0:s}' . format ( data_type ))
63
+ logger .warning ('Using default formatter for data type: {0:s}' . format (
64
+ data_type ))
62
65
formatter_object = default .DefaultFormatter ()
63
66
64
67
cls ._formatter_objects [data_type ] = formatter_object
@@ -124,6 +127,28 @@ def GetUnformattedAttributes(cls, event_data):
124
127
125
128
return unformatted_attributes
126
129
130
+ @classmethod
131
+ def ReadFormattersFromFile (cls , path ):
132
+ """Reads formatters from a file.
133
+
134
+ Args:
135
+ path (str): path of file that contains the formatters configuration.
136
+
137
+ Raises:
138
+ KeyError: if formatter class is already set for the corresponding
139
+ data type.
140
+ """
141
+ if not cls ._file_was_read :
142
+ formatters_file = yaml_formatters_file .YAMLFormattersFile ()
143
+ for formatter in formatters_file .ReadFromFile (path ):
144
+ # TODO: refactor RegisterFormatter to only use formatter objects.
145
+ cls .RegisterFormatter (formatter )
146
+
147
+ data_type = formatter .DATA_TYPE .lower ()
148
+ cls ._formatter_objects [data_type ] = formatter
149
+
150
+ cls ._file_was_read = True
151
+
127
152
@classmethod
128
153
def RegisterFormatter (cls , formatter_class ):
129
154
"""Registers a formatter class.
@@ -139,9 +164,8 @@ def RegisterFormatter(cls, formatter_class):
139
164
"""
140
165
formatter_data_type = formatter_class .DATA_TYPE .lower ()
141
166
if formatter_data_type in cls ._formatter_classes :
142
- raise KeyError ((
143
- 'Formatter class already set for data type: {0:s}.' ).format (
144
- formatter_class .DATA_TYPE ))
167
+ raise KeyError ('Formatter class already set for data type: {0:s}.' .format (
168
+ formatter_class .DATA_TYPE ))
145
169
146
170
cls ._formatter_classes [formatter_data_type ] = formatter_class
147
171
0 commit comments