2323# SOFTWARE.
2424#
2525###############################################################################
26+ import re
2627from typing import Optional
2728
28- from nodescraper .enums import ExecutionStatus
29+ from nodescraper .enums import EventCategory , EventPriority , ExecutionStatus
2930from nodescraper .interfaces import DataAnalyzer
3031from nodescraper .models import TaskResult
3132
@@ -38,55 +39,63 @@ class KernelModuleAnalyzer(DataAnalyzer[KernelModuleDataModel, KernelModuleAnaly
3839
3940 DATA_MODEL = KernelModuleDataModel
4041
42+ def filter_modules_by_pattern (
43+ self , modules : dict [str , dict ], patterns : list [str ]
44+ ) -> dict [str , dict ]:
45+ pattern_regex = re .compile ("|" .join (patterns ), re .IGNORECASE )
46+
47+ return {name : data for name , data in modules .items () if pattern_regex .search (name )}
48+
49+ def filter_modules_by_name (
50+ self , modules : dict [str , dict ], names : list [str ] = None
51+ ) -> dict [str , dict ]:
52+
53+ if not names :
54+ return {name : data for name , data in modules .items ()}
55+
56+ return {name : data for name , data in modules .items () if name in names }
57+
4158 def analyze_data (
4259 self , data : KernelModuleDataModel , args : Optional [KernelModuleAnalyzerArgs ] = None
4360 ) -> TaskResult :
44- """Analyze the kernel data against expected versions .
61+ """Analyze the kernel modules and associated parameters .
4562
4663 Args:
4764 data (KernelModuleDataModel): KernelModule data to analyze.
48- args (Optional[KernelModuleAnalyzerArgs], optional): KernelModule analysis arguments. Defaults to None .
65+ args (Optional[KernelModuleAnalyzerArgs], optional): KernelModule analyzer args .
4966
5067 Returns:
5168 TaskResult: Result of the analysis containing status and message.
5269 """
5370 if not args :
54- self .result .message = "Expected kernel not provided"
55- self .result .status = ExecutionStatus .NOT_RAN
56- return self .result
71+ args = KernelModuleAnalyzerArgs ()
5772
58- self .result = None
59-
60- """
61- for kernel in args.exp_kernel:
62- if args.regex_match:
63- try:
64- regex_data = re.compile(kernel)
65- except re.error:
66- self._log_event(
67- category=EventCategory.RUNTIME,
68- description="KernelModule regex is invalid",
69- data={"regex": kernel},
70- priority=EventPriority.ERROR,
71- )
72- continue
73- if regex_data.match(data.kernel_version):
74- self.result.message = "KernelModule matches expected"
75- self.result.status = ExecutionStatus.OK
76- return self.result
77- elif data.kernel_version == kernel:
78- self.result.message = "KernelModule matches expected"
79- self.result.status = ExecutionStatus.OK
73+ self .result .message = "Kernel modules analyzed"
74+ self .result .status = ExecutionStatus .OK
75+ filtered_modules = {}
76+ if args .regex_match :
77+ try :
78+ filtered_modules = self .filter_modules_by_pattern (
79+ data .kernel_modules , args .modules_filter
80+ )
81+ except re .error :
82+ self ._log_event (
83+ category = EventCategory .RUNTIME ,
84+ description = "KernelModule regex is invalid" ,
85+ data = data ,
86+ priority = EventPriority .ERROR ,
87+ )
88+ self .result .message = "Kernel modules failed to match regex"
89+ self .result .status = ExecutionStatus .ERROR
8090 return self .result
8191
82- self.result.message = "KernelModule mismatch!"
83- self.result.status = ExecutionStatus.ERROR
92+ else :
93+ filtered_modules = self .filter_modules_by_name (data .kernel_modules , args .modules_filter )
94+
8495 self ._log_event (
85- category=EventCategory.OS,
86- description=f"{self.result.message}",
87- data={"expected": args.exp_kernel, "actual": data.kernel_version},
88- priority=EventPriority.CRITICAL,
89- console_log=True,
96+ category = EventCategory .RUNTIME ,
97+ description = "KernelModules analyzed" ,
98+ data = filtered_modules ,
99+ priority = EventPriority .INFO ,
90100 )
91- """
92101 return self .result
0 commit comments