1515WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1616-----------------------------------------------------------------
1717"""
18+ import copy
1819import math
1920from datetime import timedelta
2021from typing import Optional
@@ -73,6 +74,15 @@ def __render_timeframe(timeframe: timedelta) -> str:
7374 timeframe_unit = "s"
7475 return f"{ timeframe_value } { timeframe_unit } "
7576
77+ @staticmethod
78+ def __normalize_log_source (log_source : dict ) -> dict :
79+ prepared_log_source = {}
80+ for log_source_key , value in log_source .items ():
81+ if isinstance (value , list ):
82+ value = value [0 ]
83+ prepared_log_source [log_source_key ] = value .lower ()
84+ return prepared_log_source
85+
7686 def __get_data_for_roota_render (
7787 self , raw_query_container : RawQueryContainer , tokenized_query_container : TokenizedQueryContainer
7888 ) -> tuple :
@@ -90,14 +100,15 @@ def __get_data_for_roota_render(
90100 return_only_first_query_ctx_var .set (prev_state_return_only_first_query_ctx_var )
91101 wrap_query_with_meta_info_ctx_var .set (prev_state_wrap_query_with_meta_info_ctx_var )
92102
93- return rule_query , rule_query_language , tokenized_query_container .meta_info .parsed_logsources
103+ return (rule_query , rule_query_language ,
104+ self .__normalize_log_source (log_source = tokenized_query_container .meta_info .parsed_logsources ))
94105 rule_query_language = raw_query_container .language .replace ("rule" , "query" )
95106 rule_query = raw_query_container .query
96107 for source_mapping_id in tokenized_query_container .meta_info .source_mapping_ids :
97108 if source_mapping_id == "default" :
98109 continue
99110 if logsources := self .__get_logsources_by_source_mapping_id (source_mapping_id = source_mapping_id ):
100- return rule_query , rule_query_language , logsources
111+ return rule_query , rule_query_language , self . __normalize_log_source ( log_source = logsources )
101112 return rule_query , rule_query_language , {}
102113
103114 @staticmethod
@@ -114,7 +125,7 @@ def generate(
114125 raw_query_container = raw_query_container , tokenized_query_container = tokenized_query_container
115126 )
116127
117- rule = ROOTA_RULE_TEMPLATE . copy ( )
128+ rule = copy . deepcopy ( ROOTA_RULE_TEMPLATE )
118129 rule ["name" ] = tokenized_query_container .meta_info .title or _AUTOGENERATED_TEMPLATE
119130 rule ["details" ] = tokenized_query_container .meta_info .description or rule ["details" ]
120131 rule ["author" ] = tokenized_query_container .meta_info .author or rule ["author" ]
@@ -139,9 +150,6 @@ def generate(
139150 rule ["correlation" ]["timeframe" ] = self .__render_timeframe (tokenized_query_container .meta_info .timeframe )
140151
141152 if rule_logsources :
142- for logsource_str , value in rule_logsources .items ():
143- if isinstance (value , list ):
144- value = value [0 ]
145- rule ["logsource" ][logsource_str ] = value .lower ()
153+ rule ["logsources" ] = rule_logsources
146154
147155 return yaml .dump (rule , Dumper = IndentedListDumper , default_flow_style = False , sort_keys = False , indent = 4 )
0 commit comments