From dc45f8f10080f2d7aef9ecf50ce65b2f466c64ef Mon Sep 17 00:00:00 2001 From: JSCU-CNI <121175071+JSCU-CNI@users.noreply.github.com> Date: Thu, 15 Jan 2026 16:09:16 +0100 Subject: [PATCH 1/4] Fix ESXi configstore call in OS create method --- dissect/target/plugins/os/unix/esxi/_os.py | 2 +- dissect/target/plugins/os/unix/esxi/configstore.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/dissect/target/plugins/os/unix/esxi/_os.py b/dissect/target/plugins/os/unix/esxi/_os.py index c4c73513aa..d2ad4661c3 100644 --- a/dissect/target/plugins/os/unix/esxi/_os.py +++ b/dissect/target/plugins/os/unix/esxi/_os.py @@ -390,7 +390,7 @@ def _link_log_dir(target: Target, cfg: dict[str, str], plugin_obj: ESXiPlugin) - log_dir = None if version and version[0] == "7": try: - log_dir = plugin_obj._configstore["esx"]["syslog"]["global_settings"][""]["user_value"]["log_dir"] + log_dir = target.configstore._configstore["esx"]["syslog"]["global_settings"][""]["user_value"]["log_dir"] except KeyError: target.log.warning("Failed to read log_dir from configstore, falling back to /scratch/log") log_dir = "/scratch/log" diff --git a/dissect/target/plugins/os/unix/esxi/configstore.py b/dissect/target/plugins/os/unix/esxi/configstore.py index 3f3210529a..06032418a4 100644 --- a/dissect/target/plugins/os/unix/esxi/configstore.py +++ b/dissect/target/plugins/os/unix/esxi/configstore.py @@ -21,7 +21,7 @@ class ConfigstorePlugin(Plugin): def __init__(self, target: Target): super().__init__(target) - self._configstore = None + self._configstore = {} # ESXi 7 introduced the configstore # It's made available at /etc/vmware/configstore/current-store-1 during boot, but stored at @@ -30,9 +30,7 @@ def __init__(self, target: Target): self._configstore = parse_config_store(path) def check_compatible(self) -> None: - if self.target.os != "esxi": - raise UnsupportedPluginError("ESXi specific plugin loaded on non-ESXi target") - + # NOTE: Unable to use OS specific functions here, as this method can be called in ESXiPlugin.create if not self._configstore: raise UnsupportedPluginError("ESXi configstore not found on target") From c8a2a8e7b50c04296e12c77949d4d1e6329cf4b5 Mon Sep 17 00:00:00 2001 From: JSCU-CNI <121175071+JSCU-CNI@users.noreply.github.com> Date: Thu, 15 Jan 2026 17:23:25 +0100 Subject: [PATCH 2/4] add test --- .../plugins/os/unix/esxi/current-store-1 | 3 +++ tests/plugins/os/unix/esxi/test__os.py | 24 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tests/_data/plugins/os/unix/esxi/current-store-1 diff --git a/tests/_data/plugins/os/unix/esxi/current-store-1 b/tests/_data/plugins/os/unix/esxi/current-store-1 new file mode 100644 index 0000000000..d0b00a84b4 --- /dev/null +++ b/tests/_data/plugins/os/unix/esxi/current-store-1 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dd6ef72d972ff776298034c4b2179329f62b45cec2ad59feab067a6ce611a4d +size 12288 diff --git a/tests/plugins/os/unix/esxi/test__os.py b/tests/plugins/os/unix/esxi/test__os.py index 370ea8cdce..27bff2484b 100644 --- a/tests/plugins/os/unix/esxi/test__os.py +++ b/tests/plugins/os/unix/esxi/test__os.py @@ -1,13 +1,15 @@ from __future__ import annotations +from io import BytesIO from typing import TYPE_CHECKING from unittest.mock import patch +from dissect.target.filesystem import VirtualFilesystem from dissect.target.plugin import OperatingSystem from dissect.target.plugins.os.unix.esxi._os import ESXiPlugin, _create_local_fs, _decrypt_crypto_util +from tests._utils import absolute_path if TYPE_CHECKING: - from dissect.target.filesystem import VirtualFilesystem from dissect.target.target import Target @@ -73,3 +75,23 @@ def test_esxi_os_detection(target_bare: Target, fs_esxi: VirtualFilesystem) -> N assert target_bare.hostname == "localhost" assert target_bare.version == "6.7.0" assert target_bare.ips == ["192.168.56.101"] + + +def test_esxi_os_creation_version_7(target_bare: Target) -> None: + """Test handling of ``ESXiPlugin.create`` for ESXi 7 with separate partitions. + Indirectly tests the ESXi configstore plugin.""" + + fs1 = VirtualFilesystem() + fs1.map_file_fh("boot.cfg", BytesIO(b"build=7.13.37-1.2.3.4\nmodules=example.v00 --- example.tgz\n")) + fs1.map_file_fh("example.v00", BytesIO(b"")) + target_bare.filesystems.add(fs1) + + fs2 = VirtualFilesystem() + fs2.map_file_fh("/etc/vmware/esx.conf", BytesIO(b'/resourceGroups/version = "7.13.37"\n')) + fs2.map_file("/var/lib/vmware/configstore/backup/current-store-1", absolute_path("_data/plugins/os/unix/esxi/current-store-1")) + target_bare.filesystems.add(fs2) + + target_bare.apply() + + assert ESXiPlugin.detect(target_bare) + assert ESXiPlugin.create(target_bare, fs1) From c735971cc8497ca5c449a4bbbd06915974c8150d Mon Sep 17 00:00:00 2001 From: Erik Schamper <1254028+Schamper@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:24:42 +0100 Subject: [PATCH 3/4] Update tests/plugins/os/unix/esxi/test__os.py --- tests/plugins/os/unix/esxi/test__os.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/plugins/os/unix/esxi/test__os.py b/tests/plugins/os/unix/esxi/test__os.py index 27bff2484b..6e1124c151 100644 --- a/tests/plugins/os/unix/esxi/test__os.py +++ b/tests/plugins/os/unix/esxi/test__os.py @@ -79,7 +79,9 @@ def test_esxi_os_detection(target_bare: Target, fs_esxi: VirtualFilesystem) -> N def test_esxi_os_creation_version_7(target_bare: Target) -> None: """Test handling of ``ESXiPlugin.create`` for ESXi 7 with separate partitions. - Indirectly tests the ESXi configstore plugin.""" + + Indirectly tests the ESXi configstore plugin. + """ fs1 = VirtualFilesystem() fs1.map_file_fh("boot.cfg", BytesIO(b"build=7.13.37-1.2.3.4\nmodules=example.v00 --- example.tgz\n")) From 3bfe6bde4bab8e9595728379fa5efd04f110c189 Mon Sep 17 00:00:00 2001 From: Schamper <1254028+Schamper@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:27:36 +0100 Subject: [PATCH 4/4] Fix linter --- tests/plugins/os/unix/esxi/test__os.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/plugins/os/unix/esxi/test__os.py b/tests/plugins/os/unix/esxi/test__os.py index 6e1124c151..19fcae9eb3 100644 --- a/tests/plugins/os/unix/esxi/test__os.py +++ b/tests/plugins/os/unix/esxi/test__os.py @@ -90,7 +90,10 @@ def test_esxi_os_creation_version_7(target_bare: Target) -> None: fs2 = VirtualFilesystem() fs2.map_file_fh("/etc/vmware/esx.conf", BytesIO(b'/resourceGroups/version = "7.13.37"\n')) - fs2.map_file("/var/lib/vmware/configstore/backup/current-store-1", absolute_path("_data/plugins/os/unix/esxi/current-store-1")) + fs2.map_file( + "/var/lib/vmware/configstore/backup/current-store-1", + absolute_path("_data/plugins/os/unix/esxi/current-store-1"), + ) target_bare.filesystems.add(fs2) target_bare.apply()