amd-node-scraper 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- amd_node_scraper-0.0.1.dist-info/LICENSE +21 -0
- amd_node_scraper-0.0.1.dist-info/METADATA +424 -0
- amd_node_scraper-0.0.1.dist-info/RECORD +197 -0
- amd_node_scraper-0.0.1.dist-info/WHEEL +5 -0
- amd_node_scraper-0.0.1.dist-info/entry_points.txt +2 -0
- amd_node_scraper-0.0.1.dist-info/top_level.txt +1 -0
- nodescraper/__init__.py +32 -0
- nodescraper/base/__init__.py +34 -0
- nodescraper/base/inbandcollectortask.py +118 -0
- nodescraper/base/inbanddataplugin.py +39 -0
- nodescraper/base/regexanalyzer.py +120 -0
- nodescraper/cli/__init__.py +29 -0
- nodescraper/cli/cli.py +511 -0
- nodescraper/cli/constants.py +27 -0
- nodescraper/cli/dynamicparserbuilder.py +171 -0
- nodescraper/cli/helper.py +517 -0
- nodescraper/cli/inputargtypes.py +129 -0
- nodescraper/configbuilder.py +123 -0
- nodescraper/configregistry.py +66 -0
- nodescraper/configs/node_status.json +19 -0
- nodescraper/connection/__init__.py +25 -0
- nodescraper/connection/inband/__init__.py +46 -0
- nodescraper/connection/inband/inband.py +171 -0
- nodescraper/connection/inband/inbandlocal.py +93 -0
- nodescraper/connection/inband/inbandmanager.py +151 -0
- nodescraper/connection/inband/inbandremote.py +173 -0
- nodescraper/connection/inband/sshparams.py +43 -0
- nodescraper/constants.py +26 -0
- nodescraper/enums/__init__.py +40 -0
- nodescraper/enums/eventcategory.py +89 -0
- nodescraper/enums/eventpriority.py +42 -0
- nodescraper/enums/executionstatus.py +44 -0
- nodescraper/enums/osfamily.py +34 -0
- nodescraper/enums/systeminteraction.py +41 -0
- nodescraper/enums/systemlocation.py +33 -0
- nodescraper/generictypes.py +36 -0
- nodescraper/interfaces/__init__.py +44 -0
- nodescraper/interfaces/connectionmanager.py +143 -0
- nodescraper/interfaces/dataanalyzertask.py +138 -0
- nodescraper/interfaces/datacollectortask.py +185 -0
- nodescraper/interfaces/dataplugin.py +356 -0
- nodescraper/interfaces/plugin.py +127 -0
- nodescraper/interfaces/resultcollator.py +56 -0
- nodescraper/interfaces/task.py +164 -0
- nodescraper/interfaces/taskresulthook.py +39 -0
- nodescraper/models/__init__.py +48 -0
- nodescraper/models/analyzerargs.py +93 -0
- nodescraper/models/collectorargs.py +30 -0
- nodescraper/models/connectionconfig.py +34 -0
- nodescraper/models/datamodel.py +171 -0
- nodescraper/models/datapluginresult.py +39 -0
- nodescraper/models/event.py +158 -0
- nodescraper/models/pluginconfig.py +38 -0
- nodescraper/models/pluginresult.py +39 -0
- nodescraper/models/systeminfo.py +44 -0
- nodescraper/models/taskresult.py +185 -0
- nodescraper/models/timerangeargs.py +38 -0
- nodescraper/pluginexecutor.py +274 -0
- nodescraper/pluginregistry.py +152 -0
- nodescraper/plugins/__init__.py +25 -0
- nodescraper/plugins/inband/__init__.py +25 -0
- nodescraper/plugins/inband/amdsmi/__init__.py +28 -0
- nodescraper/plugins/inband/amdsmi/amdsmi_analyzer.py +821 -0
- nodescraper/plugins/inband/amdsmi/amdsmi_collector.py +1313 -0
- nodescraper/plugins/inband/amdsmi/amdsmi_plugin.py +43 -0
- nodescraper/plugins/inband/amdsmi/amdsmidata.py +1002 -0
- nodescraper/plugins/inband/amdsmi/analyzer_args.py +50 -0
- nodescraper/plugins/inband/amdsmi/cper.py +65 -0
- nodescraper/plugins/inband/bios/__init__.py +29 -0
- nodescraper/plugins/inband/bios/analyzer_args.py +64 -0
- nodescraper/plugins/inband/bios/bios_analyzer.py +93 -0
- nodescraper/plugins/inband/bios/bios_collector.py +93 -0
- nodescraper/plugins/inband/bios/bios_plugin.py +43 -0
- nodescraper/plugins/inband/bios/biosdata.py +30 -0
- nodescraper/plugins/inband/cmdline/__init__.py +25 -0
- nodescraper/plugins/inband/cmdline/analyzer_args.py +80 -0
- nodescraper/plugins/inband/cmdline/cmdline_analyzer.py +113 -0
- nodescraper/plugins/inband/cmdline/cmdline_collector.py +77 -0
- nodescraper/plugins/inband/cmdline/cmdline_plugin.py +43 -0
- nodescraper/plugins/inband/cmdline/cmdlinedata.py +30 -0
- nodescraper/plugins/inband/device_enumeration/__init__.py +29 -0
- nodescraper/plugins/inband/device_enumeration/analyzer_args.py +73 -0
- nodescraper/plugins/inband/device_enumeration/device_enumeration_analyzer.py +81 -0
- nodescraper/plugins/inband/device_enumeration/device_enumeration_collector.py +176 -0
- nodescraper/plugins/inband/device_enumeration/device_enumeration_plugin.py +45 -0
- nodescraper/plugins/inband/device_enumeration/deviceenumdata.py +36 -0
- nodescraper/plugins/inband/dimm/__init__.py +25 -0
- nodescraper/plugins/inband/dimm/collector_args.py +31 -0
- nodescraper/plugins/inband/dimm/dimm_collector.py +151 -0
- nodescraper/plugins/inband/dimm/dimm_plugin.py +40 -0
- nodescraper/plugins/inband/dimm/dimmdata.py +30 -0
- nodescraper/plugins/inband/dkms/__init__.py +25 -0
- nodescraper/plugins/inband/dkms/analyzer_args.py +85 -0
- nodescraper/plugins/inband/dkms/dkms_analyzer.py +106 -0
- nodescraper/plugins/inband/dkms/dkms_collector.py +76 -0
- nodescraper/plugins/inband/dkms/dkms_plugin.py +43 -0
- nodescraper/plugins/inband/dkms/dkmsdata.py +33 -0
- nodescraper/plugins/inband/dmesg/__init__.py +28 -0
- nodescraper/plugins/inband/dmesg/analyzer_args.py +33 -0
- nodescraper/plugins/inband/dmesg/collector_args.py +39 -0
- nodescraper/plugins/inband/dmesg/dmesg_analyzer.py +503 -0
- nodescraper/plugins/inband/dmesg/dmesg_collector.py +164 -0
- nodescraper/plugins/inband/dmesg/dmesg_plugin.py +44 -0
- nodescraper/plugins/inband/dmesg/dmesgdata.py +116 -0
- nodescraper/plugins/inband/fabrics/__init__.py +28 -0
- nodescraper/plugins/inband/fabrics/fabrics_collector.py +726 -0
- nodescraper/plugins/inband/fabrics/fabrics_plugin.py +37 -0
- nodescraper/plugins/inband/fabrics/fabricsdata.py +140 -0
- nodescraper/plugins/inband/journal/__init__.py +28 -0
- nodescraper/plugins/inband/journal/collector_args.py +33 -0
- nodescraper/plugins/inband/journal/journal_collector.py +107 -0
- nodescraper/plugins/inband/journal/journal_plugin.py +40 -0
- nodescraper/plugins/inband/journal/journaldata.py +44 -0
- nodescraper/plugins/inband/kernel/__init__.py +25 -0
- nodescraper/plugins/inband/kernel/analyzer_args.py +64 -0
- nodescraper/plugins/inband/kernel/kernel_analyzer.py +91 -0
- nodescraper/plugins/inband/kernel/kernel_collector.py +129 -0
- nodescraper/plugins/inband/kernel/kernel_plugin.py +43 -0
- nodescraper/plugins/inband/kernel/kerneldata.py +32 -0
- nodescraper/plugins/inband/kernel_module/__init__.py +25 -0
- nodescraper/plugins/inband/kernel_module/analyzer_args.py +59 -0
- nodescraper/plugins/inband/kernel_module/kernel_module_analyzer.py +211 -0
- nodescraper/plugins/inband/kernel_module/kernel_module_collector.py +264 -0
- nodescraper/plugins/inband/kernel_module/kernel_module_data.py +60 -0
- nodescraper/plugins/inband/kernel_module/kernel_module_plugin.py +43 -0
- nodescraper/plugins/inband/memory/__init__.py +25 -0
- nodescraper/plugins/inband/memory/analyzer_args.py +45 -0
- nodescraper/plugins/inband/memory/memory_analyzer.py +98 -0
- nodescraper/plugins/inband/memory/memory_collector.py +330 -0
- nodescraper/plugins/inband/memory/memory_plugin.py +43 -0
- nodescraper/plugins/inband/memory/memorydata.py +90 -0
- nodescraper/plugins/inband/network/__init__.py +28 -0
- nodescraper/plugins/inband/network/network_collector.py +1828 -0
- nodescraper/plugins/inband/network/network_plugin.py +37 -0
- nodescraper/plugins/inband/network/networkdata.py +319 -0
- nodescraper/plugins/inband/nvme/__init__.py +28 -0
- nodescraper/plugins/inband/nvme/nvme_collector.py +167 -0
- nodescraper/plugins/inband/nvme/nvme_plugin.py +37 -0
- nodescraper/plugins/inband/nvme/nvmedata.py +45 -0
- nodescraper/plugins/inband/os/__init__.py +25 -0
- nodescraper/plugins/inband/os/analyzer_args.py +64 -0
- nodescraper/plugins/inband/os/os_analyzer.py +73 -0
- nodescraper/plugins/inband/os/os_collector.py +131 -0
- nodescraper/plugins/inband/os/os_plugin.py +43 -0
- nodescraper/plugins/inband/os/osdata.py +31 -0
- nodescraper/plugins/inband/package/__init__.py +25 -0
- nodescraper/plugins/inband/package/analyzer_args.py +48 -0
- nodescraper/plugins/inband/package/package_analyzer.py +253 -0
- nodescraper/plugins/inband/package/package_collector.py +273 -0
- nodescraper/plugins/inband/package/package_plugin.py +43 -0
- nodescraper/plugins/inband/package/packagedata.py +41 -0
- nodescraper/plugins/inband/pcie/__init__.py +29 -0
- nodescraper/plugins/inband/pcie/analyzer_args.py +63 -0
- nodescraper/plugins/inband/pcie/pcie_analyzer.py +1081 -0
- nodescraper/plugins/inband/pcie/pcie_collector.py +690 -0
- nodescraper/plugins/inband/pcie/pcie_data.py +2017 -0
- nodescraper/plugins/inband/pcie/pcie_plugin.py +43 -0
- nodescraper/plugins/inband/process/__init__.py +25 -0
- nodescraper/plugins/inband/process/analyzer_args.py +45 -0
- nodescraper/plugins/inband/process/collector_args.py +31 -0
- nodescraper/plugins/inband/process/process_analyzer.py +91 -0
- nodescraper/plugins/inband/process/process_collector.py +115 -0
- nodescraper/plugins/inband/process/process_plugin.py +46 -0
- nodescraper/plugins/inband/process/processdata.py +34 -0
- nodescraper/plugins/inband/rocm/__init__.py +25 -0
- nodescraper/plugins/inband/rocm/analyzer_args.py +66 -0
- nodescraper/plugins/inband/rocm/rocm_analyzer.py +100 -0
- nodescraper/plugins/inband/rocm/rocm_collector.py +205 -0
- nodescraper/plugins/inband/rocm/rocm_plugin.py +43 -0
- nodescraper/plugins/inband/rocm/rocmdata.py +62 -0
- nodescraper/plugins/inband/storage/__init__.py +25 -0
- nodescraper/plugins/inband/storage/analyzer_args.py +38 -0
- nodescraper/plugins/inband/storage/collector_args.py +31 -0
- nodescraper/plugins/inband/storage/storage_analyzer.py +152 -0
- nodescraper/plugins/inband/storage/storage_collector.py +110 -0
- nodescraper/plugins/inband/storage/storage_plugin.py +44 -0
- nodescraper/plugins/inband/storage/storagedata.py +70 -0
- nodescraper/plugins/inband/sysctl/__init__.py +29 -0
- nodescraper/plugins/inband/sysctl/analyzer_args.py +67 -0
- nodescraper/plugins/inband/sysctl/sysctl_analyzer.py +81 -0
- nodescraper/plugins/inband/sysctl/sysctl_collector.py +101 -0
- nodescraper/plugins/inband/sysctl/sysctl_plugin.py +43 -0
- nodescraper/plugins/inband/sysctl/sysctldata.py +42 -0
- nodescraper/plugins/inband/syslog/__init__.py +28 -0
- nodescraper/plugins/inband/syslog/syslog_collector.py +121 -0
- nodescraper/plugins/inband/syslog/syslog_plugin.py +37 -0
- nodescraper/plugins/inband/syslog/syslogdata.py +46 -0
- nodescraper/plugins/inband/uptime/__init__.py +25 -0
- nodescraper/plugins/inband/uptime/uptime_collector.py +88 -0
- nodescraper/plugins/inband/uptime/uptime_plugin.py +37 -0
- nodescraper/plugins/inband/uptime/uptimedata.py +31 -0
- nodescraper/resultcollators/__init__.py +25 -0
- nodescraper/resultcollators/tablesummary.py +159 -0
- nodescraper/taskresulthooks/__init__.py +28 -0
- nodescraper/taskresulthooks/filesystemloghook.py +88 -0
- nodescraper/typeutils.py +171 -0
- nodescraper/utils.py +412 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
from datetime import datetime
|
|
27
|
+
from typing import Optional
|
|
28
|
+
|
|
29
|
+
from nodescraper.models import AnalyzerArgs
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class AmdSmiAnalyzerArgs(AnalyzerArgs):
|
|
33
|
+
|
|
34
|
+
check_static_data: bool = False
|
|
35
|
+
expected_gpu_processes: Optional[int] = None
|
|
36
|
+
expected_max_power: Optional[int] = None
|
|
37
|
+
expected_driver_version: Optional[str] = None
|
|
38
|
+
expected_memory_partition_mode: Optional[str] = None
|
|
39
|
+
expected_compute_partition_mode: Optional[str] = None
|
|
40
|
+
expected_pldm_version: Optional[str] = None
|
|
41
|
+
l0_to_recovery_count_error_threshold: Optional[int] = 3
|
|
42
|
+
l0_to_recovery_count_warning_threshold: Optional[int] = 1
|
|
43
|
+
vendorid_ep: Optional[str] = None
|
|
44
|
+
vendorid_ep_vf: Optional[str] = None
|
|
45
|
+
devid_ep: Optional[str] = None
|
|
46
|
+
devid_ep_vf: Optional[str] = None
|
|
47
|
+
sku_name: Optional[str] = None
|
|
48
|
+
expected_xgmi_speed: Optional[list[float]] = None
|
|
49
|
+
analysis_range_start: Optional[datetime] = None
|
|
50
|
+
analysis_range_end: Optional[datetime] = None
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
|
|
27
|
+
import io
|
|
28
|
+
from datetime import datetime
|
|
29
|
+
from typing import Dict, Optional
|
|
30
|
+
|
|
31
|
+
from nodescraper.enums import EventCategory, EventPriority
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class CperAnalysisTaskMixin:
|
|
35
|
+
def analyzer_cpers(
|
|
36
|
+
self,
|
|
37
|
+
cper_data: Dict[str, io.BytesIO],
|
|
38
|
+
analysis_range_start: Optional[datetime],
|
|
39
|
+
analysis_range_end: Optional[datetime],
|
|
40
|
+
):
|
|
41
|
+
"""Generate Events from CPER data.
|
|
42
|
+
|
|
43
|
+
Note: CPER analysis is not currently implemented. This is a stub that logs
|
|
44
|
+
a warning when CPER data is present.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
cper_data (Dict[str, io.BytesIO]): Dictionary of CPER file names to file contents
|
|
48
|
+
analysis_range_start (Optional[datetime]): Optional start time for analysis range
|
|
49
|
+
analysis_range_end (Optional[datetime]): Optional end time for analysis range
|
|
50
|
+
"""
|
|
51
|
+
# check the self._log_event method is defined
|
|
52
|
+
if not hasattr(self, "_log_event") or not callable(self._log_event):
|
|
53
|
+
raise NotImplementedError("The class must implement the _log_event method.")
|
|
54
|
+
|
|
55
|
+
if cper_data:
|
|
56
|
+
self._log_event(
|
|
57
|
+
category=EventCategory.RAS,
|
|
58
|
+
priority=EventPriority.WARNING,
|
|
59
|
+
description="CPER data found but analysis is not implemented",
|
|
60
|
+
data={
|
|
61
|
+
"cper_file_count": len(cper_data),
|
|
62
|
+
"cper_files": list(cper_data.keys()),
|
|
63
|
+
"note": "CPER analysis requires additional dependencies not currently available",
|
|
64
|
+
},
|
|
65
|
+
)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
from .analyzer_args import BiosAnalyzerArgs
|
|
27
|
+
from .bios_plugin import BiosPlugin
|
|
28
|
+
|
|
29
|
+
__all__ = ["BiosPlugin", "BiosAnalyzerArgs"]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
from typing import Union
|
|
27
|
+
|
|
28
|
+
from pydantic import Field, field_validator
|
|
29
|
+
|
|
30
|
+
from nodescraper.models import AnalyzerArgs
|
|
31
|
+
from nodescraper.plugins.inband.os.osdata import OsDataModel
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class BiosAnalyzerArgs(AnalyzerArgs):
|
|
35
|
+
exp_bios_version: list[str] = Field(default_factory=list)
|
|
36
|
+
regex_match: bool = False
|
|
37
|
+
|
|
38
|
+
@field_validator("exp_bios_version", mode="before")
|
|
39
|
+
@classmethod
|
|
40
|
+
def validate_exp_bios_version(cls, exp_bios_version: Union[str, list]) -> list:
|
|
41
|
+
"""support str or list input for exp_bios_version
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
exp_bios_version (Union[str, list]): expected BIOS version(s) to match against
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
list: a list of expected BIOS versions
|
|
48
|
+
"""
|
|
49
|
+
if isinstance(exp_bios_version, str):
|
|
50
|
+
exp_bios_version = [exp_bios_version]
|
|
51
|
+
|
|
52
|
+
return exp_bios_version
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def build_from_model(cls, datamodel: OsDataModel) -> "BiosAnalyzerArgs":
|
|
56
|
+
"""build analyzer args from data model
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
datamodel (BiosDataModel): data model for plugin
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
BiosAnalyzerArgs: instance of analyzer args class
|
|
63
|
+
"""
|
|
64
|
+
return cls(exp_bios_version=datamodel.bios_version)
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
|
|
27
|
+
import re
|
|
28
|
+
from typing import Optional
|
|
29
|
+
|
|
30
|
+
from nodescraper.enums import EventCategory, EventPriority, ExecutionStatus
|
|
31
|
+
from nodescraper.interfaces import DataAnalyzer
|
|
32
|
+
from nodescraper.models import TaskResult
|
|
33
|
+
|
|
34
|
+
from .analyzer_args import BiosAnalyzerArgs
|
|
35
|
+
from .biosdata import BiosDataModel
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class BiosAnalyzer(DataAnalyzer[BiosDataModel, BiosAnalyzerArgs]):
|
|
39
|
+
"""Check bios matches expected bios details"""
|
|
40
|
+
|
|
41
|
+
DATA_MODEL = BiosDataModel
|
|
42
|
+
|
|
43
|
+
def analyze_data(
|
|
44
|
+
self, data: BiosDataModel, args: Optional[BiosAnalyzerArgs] = None
|
|
45
|
+
) -> TaskResult:
|
|
46
|
+
"""Analyze the BIOS data against expected BIOS versions.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
data (BiosDataModel): The BIOS data to analyze.
|
|
50
|
+
args (Optional[BiosAnalyzerArgs], optional): Expected BIOS data. Defaults to None.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
TaskResult: The result of the analysis, indicating whether the BIOS data matches
|
|
54
|
+
the expected versions or not.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
if not args or not args.exp_bios_version:
|
|
58
|
+
self.result.message = "Expected bios not provided"
|
|
59
|
+
self.result.status = ExecutionStatus.NOT_RAN
|
|
60
|
+
return self.result
|
|
61
|
+
|
|
62
|
+
for bios_version in args.exp_bios_version:
|
|
63
|
+
self.logger.info(bios_version)
|
|
64
|
+
if args.regex_match:
|
|
65
|
+
try:
|
|
66
|
+
bios_regex = re.compile(bios_version)
|
|
67
|
+
except re.error:
|
|
68
|
+
self._log_event(
|
|
69
|
+
category=EventCategory.BIOS,
|
|
70
|
+
description=f"Invalid regex pattern: {bios_version}",
|
|
71
|
+
priority=EventPriority.ERROR,
|
|
72
|
+
)
|
|
73
|
+
continue
|
|
74
|
+
if bios_regex.match(data.bios_version):
|
|
75
|
+
self.result.message = "Bios data matches expected"
|
|
76
|
+
self.result.status = ExecutionStatus.OK
|
|
77
|
+
return self.result
|
|
78
|
+
elif data.bios_version == bios_version:
|
|
79
|
+
self.result.message = "Bios data matches expected"
|
|
80
|
+
self.result.status = ExecutionStatus.OK
|
|
81
|
+
return self.result
|
|
82
|
+
|
|
83
|
+
self.result.message = (
|
|
84
|
+
f"Bios data mismatch! Expected {args.exp_bios_version}, actual: {data.bios_version}"
|
|
85
|
+
)
|
|
86
|
+
self.result.status = ExecutionStatus.ERROR
|
|
87
|
+
self._log_event(
|
|
88
|
+
category=EventCategory.BIOS,
|
|
89
|
+
description=f"{self.result.message}, Actual: {data.bios_version}",
|
|
90
|
+
priority=EventPriority.ERROR,
|
|
91
|
+
console_log=True,
|
|
92
|
+
)
|
|
93
|
+
return self.result
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
from typing import Optional
|
|
27
|
+
|
|
28
|
+
from nodescraper.base import InBandDataCollector
|
|
29
|
+
from nodescraper.enums import EventCategory, EventPriority, ExecutionStatus, OSFamily
|
|
30
|
+
from nodescraper.models import TaskResult
|
|
31
|
+
|
|
32
|
+
from .biosdata import BiosDataModel
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class BiosCollector(InBandDataCollector[BiosDataModel, None]):
|
|
36
|
+
"""Collect BIOS details"""
|
|
37
|
+
|
|
38
|
+
DATA_MODEL = BiosDataModel
|
|
39
|
+
CMD_WINDOWS = "wmic bios get SMBIOSBIOSVersion /Value"
|
|
40
|
+
CMD = "sh -c 'cat /sys/devices/virtual/dmi/id/bios_version'"
|
|
41
|
+
|
|
42
|
+
def collect_data(
|
|
43
|
+
self,
|
|
44
|
+
args=None,
|
|
45
|
+
) -> tuple[TaskResult, Optional[BiosDataModel]]:
|
|
46
|
+
"""Collect BIOS version information from the system.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
tuple[TaskResult, Optional[BiosDataModel]]: tuple containing the task result and an instance of BiosDataModel
|
|
50
|
+
or None if the BIOS version could not be determined.
|
|
51
|
+
"""
|
|
52
|
+
bios = None
|
|
53
|
+
|
|
54
|
+
if self.system_info.os_family == OSFamily.WINDOWS:
|
|
55
|
+
res = self._run_sut_cmd(self.CMD_WINDOWS)
|
|
56
|
+
if res.exit_code == 0:
|
|
57
|
+
bios = [line for line in res.stdout.splitlines() if "SMBIOSBIOSVersion=" in line][
|
|
58
|
+
0
|
|
59
|
+
].split("=")[1]
|
|
60
|
+
else:
|
|
61
|
+
res = self._run_sut_cmd(self.CMD)
|
|
62
|
+
if res.exit_code == 0:
|
|
63
|
+
bios = res.stdout
|
|
64
|
+
|
|
65
|
+
if res.exit_code != 0:
|
|
66
|
+
self._log_event(
|
|
67
|
+
category=EventCategory.OS,
|
|
68
|
+
description="Error checking BIOS version",
|
|
69
|
+
data={"command": res.command, "exit_code": res.exit_code},
|
|
70
|
+
priority=EventPriority.ERROR,
|
|
71
|
+
console_log=True,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
if bios:
|
|
75
|
+
bios_data = BiosDataModel(bios_version=bios)
|
|
76
|
+
self._log_event(
|
|
77
|
+
category="BIOS_READ",
|
|
78
|
+
description="BIOS version read",
|
|
79
|
+
data=bios_data.model_dump(),
|
|
80
|
+
priority=EventPriority.INFO,
|
|
81
|
+
)
|
|
82
|
+
self.result.message = f"BIOS: {bios}"
|
|
83
|
+
else:
|
|
84
|
+
bios_data = None
|
|
85
|
+
self._log_event(
|
|
86
|
+
category=EventCategory.BIOS,
|
|
87
|
+
description="BIOS version not found",
|
|
88
|
+
priority=EventPriority.CRITICAL,
|
|
89
|
+
)
|
|
90
|
+
self.result.message = "BIOS version not found"
|
|
91
|
+
self.result.status = ExecutionStatus.ERROR
|
|
92
|
+
|
|
93
|
+
return self.result, bios_data
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
from nodescraper.base import InBandDataPlugin
|
|
27
|
+
|
|
28
|
+
from .analyzer_args import BiosAnalyzerArgs
|
|
29
|
+
from .bios_analyzer import BiosAnalyzer
|
|
30
|
+
from .bios_collector import BiosCollector
|
|
31
|
+
from .biosdata import BiosDataModel
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class BiosPlugin(InBandDataPlugin[BiosDataModel, None, BiosAnalyzerArgs]):
|
|
35
|
+
"""Plugin for collection and analysis of BIOS data"""
|
|
36
|
+
|
|
37
|
+
DATA_MODEL = BiosDataModel
|
|
38
|
+
|
|
39
|
+
COLLECTOR = BiosCollector
|
|
40
|
+
|
|
41
|
+
ANALYZER = BiosAnalyzer
|
|
42
|
+
|
|
43
|
+
ANALYZER_ARGS = BiosAnalyzerArgs
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
from nodescraper.models import DataModel
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class BiosDataModel(DataModel):
|
|
30
|
+
bios_version: str
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
#
|
|
3
|
+
# MIT License
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 Advanced Micro Devices, Inc.
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
###############################################################################
|
|
26
|
+
from typing import Union
|
|
27
|
+
|
|
28
|
+
from pydantic import Field, field_validator
|
|
29
|
+
|
|
30
|
+
from nodescraper.models import AnalyzerArgs
|
|
31
|
+
from nodescraper.plugins.inband.cmdline.cmdlinedata import CmdlineDataModel
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class CmdlineAnalyzerArgs(AnalyzerArgs):
|
|
35
|
+
required_cmdline: Union[str, list] = Field(default_factory=list)
|
|
36
|
+
banned_cmdline: Union[str, list] = Field(default_factory=list)
|
|
37
|
+
|
|
38
|
+
@field_validator("required_cmdline", mode="before")
|
|
39
|
+
@classmethod
|
|
40
|
+
def validate_required_cmdline(cls, required_cmdline: Union[str, list]) -> list:
|
|
41
|
+
"""support str or list input for required_cmdline
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
required_cmdline (Union[str, list]): required command line arguments
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
list: list of required command line arguments
|
|
48
|
+
"""
|
|
49
|
+
if isinstance(required_cmdline, str):
|
|
50
|
+
required_cmdline = [required_cmdline]
|
|
51
|
+
|
|
52
|
+
return required_cmdline
|
|
53
|
+
|
|
54
|
+
@field_validator("banned_cmdline", mode="before")
|
|
55
|
+
@classmethod
|
|
56
|
+
def validate_banned_cmdline(cls, banned_cmdline: Union[str, list]) -> list:
|
|
57
|
+
"""support str or list input for banned_cmdline
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
banned_cmdline (Union[str, list]): banned command line arguments
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
list: a list of banned command line arguments
|
|
64
|
+
"""
|
|
65
|
+
if isinstance(banned_cmdline, str):
|
|
66
|
+
banned_cmdline = [banned_cmdline]
|
|
67
|
+
|
|
68
|
+
return banned_cmdline
|
|
69
|
+
|
|
70
|
+
@classmethod
|
|
71
|
+
def build_from_model(cls, datamodel: CmdlineDataModel) -> "CmdlineAnalyzerArgs":
|
|
72
|
+
"""build analyzer args from data model
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
datamodel (CmdlineDataModel): data model for plugin
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
CmdlineAnalyzerArgs: instance of analyzer args class
|
|
79
|
+
"""
|
|
80
|
+
return cls(required_cmdline=datamodel.cmdline)
|