5
5
6
6
from plaso .formatters import default
7
7
from plaso .formatters import logger
8
+ from plaso .formatters import yaml_formatters_file
8
9
9
10
10
11
class FormattersManager (object ):
@@ -13,6 +14,9 @@ class FormattersManager(object):
13
14
_formatter_classes = {}
14
15
_formatter_objects = {}
15
16
17
+ # TODO: work-around to prevent the tests re-reading the tests.
18
+ file_was_read = False
19
+
16
20
@classmethod
17
21
def DeregisterFormatter (cls , formatter_class ):
18
22
"""Deregisters a formatter class.
@@ -27,9 +31,8 @@ def DeregisterFormatter(cls, formatter_class):
27
31
"""
28
32
formatter_data_type = formatter_class .DATA_TYPE .lower ()
29
33
if formatter_data_type not in cls ._formatter_classes :
30
- raise KeyError (
31
- 'Formatter class not set for data type: {0:s}.' .format (
32
- formatter_class .DATA_TYPE ))
34
+ raise KeyError ('Formatter class not set for data type: {0:s}.' .format (
35
+ formatter_class .DATA_TYPE ))
33
36
34
37
del cls ._formatter_classes [formatter_data_type ]
35
38
@@ -55,8 +58,8 @@ def GetFormatterObject(cls, data_type):
55
58
formatter_object = formatter_class ()
56
59
57
60
if not formatter_object :
58
- logger .warning (
59
- 'Using default formatter for data type: {0:s}' . format ( data_type ))
61
+ logger .warning ('Using default formatter for data type: {0:s}' . format (
62
+ data_type ))
60
63
formatter_object = default .DefaultFormatter ()
61
64
62
65
cls ._formatter_objects [data_type ] = formatter_object
@@ -95,6 +98,27 @@ def GetSourceStrings(cls, event, event_data):
95
98
formatter_object = cls .GetFormatterObject (event_data .data_type )
96
99
return formatter_object .GetSources (event , event_data )
97
100
101
+ @classmethod
102
+ def ReadFormattersFromFile (cls , path ):
103
+ """Reads formatters from a file.
104
+
105
+ Args:
106
+ path (str): path of file that contains the formatters configuration.
107
+
108
+ Raises:
109
+ KeyError: if formatter class is already set for the corresponding
110
+ data type.
111
+ """
112
+ formatters_file = yaml_formatters_file .YAMLFormattersFile ()
113
+ for formatter in formatters_file .ReadFromFile (path ):
114
+ # TODO: refactor RegisterFormatter to only use formatter objects.
115
+ cls .RegisterFormatter (formatter )
116
+
117
+ data_type = formatter .DATA_TYPE .lower ()
118
+ cls ._formatter_objects [data_type ] = formatter
119
+
120
+ cls .file_was_read = True
121
+
98
122
@classmethod
99
123
def RegisterFormatter (cls , formatter_class ):
100
124
"""Registers a formatter class.
@@ -110,9 +134,8 @@ def RegisterFormatter(cls, formatter_class):
110
134
"""
111
135
formatter_data_type = formatter_class .DATA_TYPE .lower ()
112
136
if formatter_data_type in cls ._formatter_classes :
113
- raise KeyError ((
114
- 'Formatter class already set for data type: {0:s}.' ).format (
115
- formatter_class .DATA_TYPE ))
137
+ raise KeyError ('Formatter class already set for data type: {0:s}.' .format (
138
+ formatter_class .DATA_TYPE ))
116
139
117
140
cls ._formatter_classes [formatter_data_type ] = formatter_class
118
141
0 commit comments