Skip to content

Commit 5e1992d

Browse files
committed
addressed reviews
1 parent 565fc7e commit 5e1992d

File tree

5 files changed

+39
-41
lines changed

5 files changed

+39
-41
lines changed

nodescraper/plugins/inband/kernel_module/analyzer_args.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#
2525
###############################################################################
2626
import re
27+
from typing import ClassVar
2728

2829
from nodescraper.models import AnalyzerArgs
2930
from nodescraper.plugins.inband.kernel_module.kernel_module_data import (
@@ -34,12 +35,14 @@
3435
class KernelModuleAnalyzerArgs(AnalyzerArgs):
3536
kernel_modules: dict[str, dict] = {}
3637

37-
regex_filter: list[str] = ["amd"]
38-
regex_match: bool = True
38+
DEFAULT_REGEX_FILTER: ClassVar[list[str]] = ["amd"]
39+
DEFAULT_REGEX_MATCH: ClassVar[bool] = True
40+
regex_filter: list[str] = DEFAULT_REGEX_FILTER
41+
regex_match: bool = DEFAULT_REGEX_MATCH
3942

4043
@classmethod
4144
def build_from_model(cls, datamodel: KernelModuleDataModel) -> "KernelModuleAnalyzerArgs":
42-
"""build analyzer args from data model and filter by datamodel.regex_filter
45+
"""build analyzer args from data model and filter by regex_filter
4346
4447
Args:
4548
datamodel (KernelModuleDataModel): data model for plugin
@@ -48,7 +51,7 @@ def build_from_model(cls, datamodel: KernelModuleDataModel) -> "KernelModuleAnal
4851
KernelModuleAnalyzerArgs: instance of analyzer args class
4952
"""
5053

51-
pattern_regex = re.compile("|".join(datamodel.regex_filter), re.IGNORECASE)
54+
pattern_regex = re.compile("|".join(cls.DEFAULT_REGEX_FILTER), re.IGNORECASE)
5255
filtered_mods = {
5356
name: data
5457
for name, data in datamodel.kernel_modules.items()
@@ -57,6 +60,6 @@ def build_from_model(cls, datamodel: KernelModuleDataModel) -> "KernelModuleAnal
5760

5861
return cls(
5962
kernel_modules=filtered_mods,
60-
regex_filter=datamodel.regex_filter,
61-
regex_match=datamodel.regex_match,
63+
regex_filter=cls.DEFAULT_REGEX_FILTER,
64+
regex_match=cls.DEFAULT_REGEX_MATCH,
6265
)

nodescraper/plugins/inband/kernel_module/kernel_module_analyzer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ def analyze_data(
161161
return self.result
162162

163163
self._log_event(
164-
category=EventCategory.RUNTIME,
164+
category=EventCategory.OS,
165165
description="KernelModules analyzed",
166166
data={"filtered_modules": filtered_modules},
167167
priority=EventPriority.INFO,
@@ -200,5 +200,7 @@ def analyze_data(
200200
else:
201201
self.result.message = "Kernel modules matched"
202202
return self.result
203-
203+
else:
204+
self.result.message = "Kernel modules and regex_match failed"
205+
self.result.status = ExecutionStatus.ERROR
204206
return self.result

nodescraper/plugins/inband/kernel_module/kernel_module_collector.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,33 @@ def collect_all_module_info(self) -> tuple[dict, CommandArtifact]:
9090
Returns:
9191
tuple[dict, CommandArtifact]: modules found and exit code
9292
"""
93+
modules = {}
9394
res = self._run_sut_cmd("cat /proc/modules")
9495
if res.exit_code != 0:
95-
raise RuntimeError("Failed to read /proc/modules")
96+
self._log_event(
97+
category=EventCategory.OS,
98+
description="Failed to read /proc/modules",
99+
data={"command": res.command, "exit_code": res.exit_code},
100+
priority=EventPriority.ERROR,
101+
console_log=True,
102+
)
103+
return modules
96104

97105
modules = self.parse_proc_modules(res.stdout)
98106

99107
for mod in modules:
100108
modules[mod]["parameters"] = self.get_module_parameters(mod)
101109

102-
return modules, res
110+
if not modules:
111+
self._log_event(
112+
category=EventCategory.OS,
113+
description="Error checking kernel modules",
114+
data={"command": res.command, "exit_code": res.exit_code},
115+
priority=EventPriority.ERROR,
116+
console_log=True,
117+
)
118+
119+
return modules
103120

104121
def collect_data(self, args=None) -> tuple[TaskResult, KernelModuleDataModel | None]:
105122
"""
@@ -120,16 +137,7 @@ def collect_data(self, args=None) -> tuple[TaskResult, KernelModuleDataModel | N
120137
break
121138

122139
else:
123-
kernel_modules, res = self.collect_all_module_info()
124-
125-
if not kernel_modules:
126-
self._log_event(
127-
category=EventCategory.OS,
128-
description="Error checking kernel modules",
129-
data={"command": res.command, "exit_code": res.exit_code},
130-
priority=EventPriority.ERROR,
131-
console_log=True,
132-
)
140+
kernel_modules = self.collect_all_module_info()
133141

134142
if kernel_modules:
135143
km_data = KernelModuleDataModel(kernel_modules=kernel_modules)
@@ -142,10 +150,7 @@ def collect_data(self, args=None) -> tuple[TaskResult, KernelModuleDataModel | N
142150
self.result.message = f"{len(km_data.kernel_modules)} kernel modules collected"
143151
self.result.status = ExecutionStatus.OK
144152
else:
145-
kernel_modules = None
153+
self.result.message = "Kernel modules not found"
154+
self.result.status = ExecutionStatus.ERROR
146155

147-
self.result.message = (
148-
"Kernel modules collected" if kernel_modules else "Kernel modules not found"
149-
)
150-
self.result.status = ExecutionStatus.OK if kernel_modules else ExecutionStatus.ERROR
151156
return self.result, km_data

nodescraper/plugins/inband/kernel_module/kernel_module_data.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,3 @@
2929

3030
class KernelModuleDataModel(DataModel):
3131
kernel_modules: dict
32-
regex_filter: list[str] = ["amd"]
33-
regex_match: bool = True

test/unit/plugin/test_kernel_module_collector.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,10 @@ def test_collect_all_module_info_success(linux_collector):
6262
make_artifact("ls /sys/module/modX/parameters", 0, ""),
6363
]
6464
linux_collector._run_sut_cmd = lambda cmd, seq=seq: seq.pop(0)
65-
modules, artifact = linux_collector.collect_all_module_info()
66-
assert isinstance(artifact, SimpleNamespace)
65+
modules = linux_collector.collect_all_module_info()
6766
assert modules == {"modX": {"parameters": {}}}
6867

6968

70-
def test_collect_all_module_info_failure(linux_collector):
71-
linux_collector._run_sut_cmd = lambda cmd: make_artifact(cmd, 1, "")
72-
with pytest.raises(RuntimeError):
73-
linux_collector.collect_all_module_info()
74-
75-
7669
def test_collect_data_linux_success(linux_collector):
7770
seq = [
7871
make_artifact("cat /proc/modules", 0, "m1 0 0 - Live\n"),
@@ -87,7 +80,7 @@ def test_collect_data_linux_success(linux_collector):
8780
evt = result.events[-1]
8881
assert evt.category == "KERNEL_READ"
8982
assert evt.priority == EventPriority.INFO.value
90-
assert result.message == "Kernel modules collected"
83+
assert result.message == "1 kernel modules collected"
9184
assert data.kernel_modules == {"m1": {"parameters": {}}}
9285

9386

@@ -98,7 +91,7 @@ def bad(cmd):
9891
linux_collector._run_sut_cmd = bad
9992

10093
result, data = linux_collector.collect_data()
101-
assert result.status == ExecutionStatus.EXECUTION_FAILURE
94+
assert result.status == ExecutionStatus.ERROR
10295
assert data is None
10396
evt = result.events[0]
10497
assert evt.category == EventCategory.RUNTIME.value or evt.category == EventCategory.OS.value
@@ -113,14 +106,11 @@ def test_collect_data_windows_success(win_collector):
113106
assert result.status == ExecutionStatus.OK
114107
assert isinstance(data, KernelModuleDataModel)
115108
assert data.kernel_modules == {"10.0.19041": {"parameters": {}}}
116-
assert result.message == "Kernel modules collected"
109+
assert result.message == "1 kernel modules collected"
117110

118111

119112
def test_collect_data_windows_not_found(win_collector):
120113
win_collector._run_sut_cmd = lambda cmd: make_artifact("wmic os get", 0, "")
121114
result, data = win_collector.collect_data()
122115
assert result.status == ExecutionStatus.ERROR
123116
assert data is None
124-
evt = result.events[0]
125-
assert evt.category == EventCategory.OS.value
126-
assert "Error checking kernel modules" in evt.description

0 commit comments

Comments
 (0)