dissect.target 3.17.dev9__py3-none-any.whl → 3.17.dev11__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.
- dissect/target/helpers/configutil.py +6 -6
- dissect/target/helpers/network_managers.py +22 -21
- dissect/target/loaders/target.py +12 -9
- {dissect.target-3.17.dev9.dist-info → dissect.target-3.17.dev11.dist-info}/METADATA +2 -2
- {dissect.target-3.17.dev9.dist-info → dissect.target-3.17.dev11.dist-info}/RECORD +10 -10
- {dissect.target-3.17.dev9.dist-info → dissect.target-3.17.dev11.dist-info}/COPYRIGHT +0 -0
- {dissect.target-3.17.dev9.dist-info → dissect.target-3.17.dev11.dist-info}/LICENSE +0 -0
- {dissect.target-3.17.dev9.dist-info → dissect.target-3.17.dev11.dist-info}/WHEEL +0 -0
- {dissect.target-3.17.dev9.dist-info → dissect.target-3.17.dev11.dist-info}/entry_points.txt +0 -0
- {dissect.target-3.17.dev9.dist-info → dissect.target-3.17.dev11.dist-info}/top_level.txt +0 -0
@@ -29,11 +29,11 @@ from dissect.target.filesystem import FilesystemEntry
|
|
29
29
|
from dissect.target.helpers.fsutil import TargetPath
|
30
30
|
|
31
31
|
try:
|
32
|
-
import
|
32
|
+
from ruamel.yaml import YAML
|
33
33
|
|
34
|
-
|
34
|
+
HAS_YAML = True
|
35
35
|
except ImportError:
|
36
|
-
|
36
|
+
HAS_YAML = False
|
37
37
|
|
38
38
|
try:
|
39
39
|
if sys.version_info < (3, 11):
|
@@ -413,11 +413,11 @@ class Yaml(ConfigurationParser):
|
|
413
413
|
"""Parses a Yaml file."""
|
414
414
|
|
415
415
|
def parse_file(self, fh: TextIO) -> None:
|
416
|
-
if
|
417
|
-
parsed_data =
|
416
|
+
if HAS_YAML:
|
417
|
+
parsed_data = YAML(typ="safe").load(fh)
|
418
418
|
self.parsed_data = ListUnwrapper.unwrap(parsed_data)
|
419
419
|
else:
|
420
|
-
raise ConfigurationParsingError("Failed to parse file, please install
|
420
|
+
raise ConfigurationParsingError("Failed to parse file, please install ruamel.yaml.")
|
421
421
|
|
422
422
|
|
423
423
|
class Toml(ConfigurationParser):
|
@@ -12,11 +12,11 @@ from dissect.target.helpers.fsutil import TargetPath
|
|
12
12
|
from dissect.target.target import Target
|
13
13
|
|
14
14
|
try:
|
15
|
-
import
|
15
|
+
from ruamel.yaml import YAML
|
16
16
|
|
17
|
-
|
17
|
+
HAS_YAML = True
|
18
18
|
except ImportError:
|
19
|
-
|
19
|
+
HAS_YAML = False
|
20
20
|
|
21
21
|
IGNORED_IPS = [
|
22
22
|
"0.0.0.0",
|
@@ -49,7 +49,7 @@ class Template:
|
|
49
49
|
"""Sets the name of the the used parsing template to the name of the discovered network manager."""
|
50
50
|
self.name = name
|
51
51
|
|
52
|
-
def create_config(self, path: TargetPath) ->
|
52
|
+
def create_config(self, path: TargetPath) -> Optional[dict]:
|
53
53
|
"""Create a network config dictionary based on the configured template and supplied path.
|
54
54
|
|
55
55
|
Args:
|
@@ -73,26 +73,26 @@ class Template:
|
|
73
73
|
config = self._parse_configparser_config(path)
|
74
74
|
return config
|
75
75
|
|
76
|
-
def _parse_netplan_config(self,
|
76
|
+
def _parse_netplan_config(self, path: TargetPath) -> Optional[dict]:
|
77
77
|
"""Internal function to parse a netplan YAML based configuration file into a dict.
|
78
78
|
|
79
79
|
Args:
|
80
|
-
fh: A
|
80
|
+
fh: A path to the configuration file to be parsed.
|
81
81
|
|
82
82
|
Returns:
|
83
83
|
Dictionary containing the parsed YAML based configuration file.
|
84
84
|
"""
|
85
|
-
if
|
86
|
-
return self.parser(
|
85
|
+
if HAS_YAML:
|
86
|
+
return self.parser(path.open("rb"))
|
87
87
|
else:
|
88
|
-
self.target.log.error("Failed to parse %s. Cannot import
|
88
|
+
self.target.log.error("Failed to parse %s. Cannot import ruamel.yaml", self.name)
|
89
89
|
return None
|
90
90
|
|
91
|
-
def _parse_wicked_config(self,
|
91
|
+
def _parse_wicked_config(self, path: TargetPath) -> dict:
|
92
92
|
"""Internal function to parse a wicked XML based configuration file into a dict.
|
93
93
|
|
94
94
|
Args:
|
95
|
-
fh: A
|
95
|
+
fh: A path to the configuration file to be parsed.
|
96
96
|
|
97
97
|
Returns:
|
98
98
|
Dictionary containing the parsed xml based Linux network manager based configuration file.
|
@@ -101,44 +101,43 @@ class Template:
|
|
101
101
|
# we have to replace the ":" for this with "___" (three underscores) to make the xml config non-namespaced.
|
102
102
|
pattern = compile(r"(?<=\n)\s+(<.+?>)")
|
103
103
|
replace_match: Callable[[Match]] = lambda match: match.group(1).replace(":", "___")
|
104
|
-
text = sub(pattern, replace_match,
|
104
|
+
text = sub(pattern, replace_match, path.open("rt").read())
|
105
105
|
|
106
106
|
xml = self.parser.parse(StringIO(text))
|
107
107
|
return self._parse_xml_config(xml, self.sections, self.options)
|
108
108
|
|
109
|
-
def _parse_configparser_config(self,
|
109
|
+
def _parse_configparser_config(self, path: TargetPath) -> dict:
|
110
110
|
"""Internal function to parse ConfigParser compatible configuration files into a dict.
|
111
111
|
|
112
112
|
Args:
|
113
|
-
|
113
|
+
path: A path to the configuration file to be parsed.
|
114
114
|
|
115
115
|
Returns:
|
116
116
|
Dictionary containing the parsed ConfigParser compatible configuration file.
|
117
117
|
"""
|
118
118
|
try:
|
119
|
-
self.parser.read_string(
|
119
|
+
self.parser.read_string(path.open("rt").read(), path.name)
|
120
120
|
return self.parser._sections
|
121
121
|
except MissingSectionHeaderError:
|
122
122
|
# configparser does like config files without headers, so we inject a header to make it work.
|
123
|
-
self.parser.read_string(f"[{self.name}]\n" +
|
123
|
+
self.parser.read_string(f"[{self.name}]\n" + path.open("rt").read(), path.name)
|
124
124
|
return self.parser._sections
|
125
125
|
|
126
|
-
def _parse_text_config(self, comments: str, delim: str,
|
126
|
+
def _parse_text_config(self, comments: str, delim: str, path: TargetPath) -> dict:
|
127
127
|
"""Internal function to parse a basic plain text based configuration file into a dict.
|
128
128
|
|
129
129
|
Args:
|
130
130
|
comments: A string value defining the comment style of the configuration file.
|
131
131
|
delim: A string value defining the delimiters used in the configuration file.
|
132
|
-
|
132
|
+
path: A path to the configuration file to be parsed.
|
133
133
|
|
134
134
|
Returns:
|
135
135
|
Dictionary with a parsed plain text based Linux network manager configuration file.
|
136
136
|
"""
|
137
137
|
config = defaultdict(dict)
|
138
138
|
option_dict = {}
|
139
|
-
fh = fh.open("rt")
|
140
139
|
|
141
|
-
for line in
|
140
|
+
for line in path.open("rt"):
|
142
141
|
line = line.strip()
|
143
142
|
|
144
143
|
if not line or line.startswith(comments):
|
@@ -631,7 +630,9 @@ TEMPLATES = {
|
|
631
630
|
["netctl"],
|
632
631
|
["address", "gateway", "dns", "ip"],
|
633
632
|
),
|
634
|
-
"netplan": Template(
|
633
|
+
"netplan": Template(
|
634
|
+
"netplan", YAML(typ="safe").load if HAS_YAML else None, ["network"], ["addresses", "dhcp4", "gateway4"]
|
635
|
+
),
|
635
636
|
"NetworkManager": Template(
|
636
637
|
"NetworkManager",
|
637
638
|
ConfigParser(delimiters=("="), comment_prefixes="#", dict_type=dict),
|
dissect/target/loaders/target.py
CHANGED
@@ -1,27 +1,30 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
from typing import TYPE_CHECKING
|
3
|
+
|
1
4
|
try:
|
2
|
-
import
|
5
|
+
from ruamel.yaml import YAML
|
3
6
|
except ImportError:
|
4
|
-
raise ImportError("Missing
|
7
|
+
raise ImportError("Missing ruamel.yaml dependency")
|
5
8
|
|
6
9
|
from dissect.target import container
|
7
10
|
from dissect.target.loader import Loader
|
8
11
|
|
12
|
+
if TYPE_CHECKING:
|
13
|
+
from dissect.target.target import Target
|
14
|
+
|
9
15
|
|
10
16
|
class TargetLoader(Loader):
|
11
17
|
"""Load target files."""
|
12
18
|
|
13
|
-
def __init__(self, path, **kwargs):
|
19
|
+
def __init__(self, path: Path, **kwargs):
|
14
20
|
super().__init__(path)
|
15
21
|
self.base_dir = path.parent
|
16
|
-
self.definition =
|
22
|
+
self.definition = YAML(typ="safe").load(path.open("rb"))
|
17
23
|
|
18
24
|
@staticmethod
|
19
|
-
def detect(path):
|
25
|
+
def detect(path: Path) -> bool:
|
20
26
|
return path.suffix.lower() == ".target"
|
21
27
|
|
22
|
-
def map(self, target):
|
28
|
+
def map(self, target: Target) -> None:
|
23
29
|
for disk in self.definition["disks"]:
|
24
30
|
target.disks.add(container.open(disk))
|
25
|
-
|
26
|
-
def open(self, path):
|
27
|
-
return self.base_dir.joinpath(path).open("rb")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: dissect.target
|
3
|
-
Version: 3.17.
|
3
|
+
Version: 3.17.dev11
|
4
4
|
Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
6
6
|
License: Affero General Public License v3
|
@@ -56,7 +56,7 @@ Requires-Dist: dissect.xfs <4.0.dev,>=3.0.dev ; extra == 'full'
|
|
56
56
|
Requires-Dist: ipython ; extra == 'full'
|
57
57
|
Requires-Dist: fusepy ; extra == 'full'
|
58
58
|
Requires-Dist: pycryptodome ; extra == 'full'
|
59
|
-
Requires-Dist:
|
59
|
+
Requires-Dist: ruamel.yaml ; extra == 'full'
|
60
60
|
Requires-Dist: zstandard ; extra == 'full'
|
61
61
|
Requires-Dist: tomli ; (python_version < "3.11") and extra == 'full'
|
62
62
|
Provides-Extra: mqtt
|
@@ -44,7 +44,7 @@ dissect/target/filesystems/zip.py,sha256=WT1bQhzX_1MXXVZTKrJniae4xqRqMZ8FsfbvhgG
|
|
44
44
|
dissect/target/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
45
|
dissect/target/helpers/cache.py,sha256=_0w_iPD1OM066Ueyadb70erQW05jNnpJe-bDDN1UyXc,8444
|
46
46
|
dissect/target/helpers/config.py,sha256=6917CZ6eDHaK_tOoiVEIndyhRXO6r6eCBIleq6f47PQ,2346
|
47
|
-
dissect/target/helpers/configutil.py,sha256=
|
47
|
+
dissect/target/helpers/configutil.py,sha256=Q4qVD_XSawG0MYrTzAjezWL-pCZMAW14Zmg54KGUddU,25637
|
48
48
|
dissect/target/helpers/cyber.py,sha256=Ki5oSU0GgQxjgC_yWoeieGP7GOY5blQCzNX7vy7Pgas,16782
|
49
49
|
dissect/target/helpers/descriptor_extensions.py,sha256=uT8GwznfDAiIgMM7JKKOY0PXKMv2c0GCqJTCkWFgops,2605
|
50
50
|
dissect/target/helpers/docs.py,sha256=J5U65Y3yOTqxDEZRCdrEmO63XQCeDzOJea1PwPM6Cyc,5146
|
@@ -56,7 +56,7 @@ dissect/target/helpers/loaderutil.py,sha256=kiyMWra_gVxfNSGwLlgxLcuuqAYuCMDc5NiC
|
|
56
56
|
dissect/target/helpers/localeutil.py,sha256=Y4Fh4jDSGfm5356xSLMriUCN8SZP_FAHg_iodkAxNq4,1504
|
57
57
|
dissect/target/helpers/mount.py,sha256=JxhUYyEbDnHfzPpfuWy4nV9OwCJPoDSGdHHNiyvd_l0,3949
|
58
58
|
dissect/target/helpers/mui.py,sha256=i-7XoHbu4WO2fYapK9yGAMW04rFlgRispknc1KQIS5Q,22258
|
59
|
-
dissect/target/helpers/network_managers.py,sha256=
|
59
|
+
dissect/target/helpers/network_managers.py,sha256=FSFYVuHsOzxLc68_LTzfFUd3IIBQQpI7rJRwTg7xznQ,24494
|
60
60
|
dissect/target/helpers/polypath.py,sha256=h8p7m_OCNiQljGwoZh5Aflr9H2ot6CZr6WKq1OSw58o,2175
|
61
61
|
dissect/target/helpers/protobuf.py,sha256=NwKrZD4q9v7J8GnZX9gbzMUMV5pR78eAV17jgWOz_EY,1730
|
62
62
|
dissect/target/helpers/record.py,sha256=lWl7k2Mp9Axllm0tXzPGJx2zj2zONsyY_p5g424T0Lc,4826
|
@@ -98,7 +98,7 @@ dissect/target/loaders/res.py,sha256=8b178x05t9K31wOeP8yGD1IdR3RpiMGz7wcvtHmmHjk
|
|
98
98
|
dissect/target/loaders/smb.py,sha256=qP8m4Jq7hvAvUCF9jB4yr2Zut7p_R02_vxziNN3R1to,13070
|
99
99
|
dissect/target/loaders/tanium.py,sha256=P9euiQzvVaQQtMQlEmNe0V25w1BkQFRZBuS-0-ksHpY,1585
|
100
100
|
dissect/target/loaders/tar.py,sha256=ah5t9tzplJp-fJrvwTTtfqdjXTpZLQIikWglnaTKQHs,4087
|
101
|
-
dissect/target/loaders/target.py,sha256=
|
101
|
+
dissect/target/loaders/target.py,sha256=MU_HUtg58YdhdZu6ga1sYG7fK61Dn7N0TBkWXDCWwyc,798
|
102
102
|
dissect/target/loaders/targetd.py,sha256=sfbn2_j3il2G-rPywAoNT5YPtD5KmKkmBv1zrPDRs6I,8250
|
103
103
|
dissect/target/loaders/utm.py,sha256=e5x5ZI3HeL0STh4S-CaQb68Rnug4SVZR9zlmHaGFj0M,978
|
104
104
|
dissect/target/loaders/vb.py,sha256=CnQcn7bAkMzIB1y-lWLtPPXdIVsyeDaT6hTZEurjkV4,2072
|
@@ -336,10 +336,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
|
|
336
336
|
dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
|
337
337
|
dissect/target/volumes/md.py,sha256=j1K1iKmspl0C_OJFc7-Q1BMWN2OCC5EVANIgVlJ_fIE,1673
|
338
338
|
dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
|
339
|
-
dissect.target-3.17.
|
340
|
-
dissect.target-3.17.
|
341
|
-
dissect.target-3.17.
|
342
|
-
dissect.target-3.17.
|
343
|
-
dissect.target-3.17.
|
344
|
-
dissect.target-3.17.
|
345
|
-
dissect.target-3.17.
|
339
|
+
dissect.target-3.17.dev11.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
|
340
|
+
dissect.target-3.17.dev11.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
341
|
+
dissect.target-3.17.dev11.dist-info/METADATA,sha256=IWvuvSd5YuV8CNcAMgSB_Wyovg2fnHzh7cZzU41v1TY,11300
|
342
|
+
dissect.target-3.17.dev11.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
343
|
+
dissect.target-3.17.dev11.dist-info/entry_points.txt,sha256=tvFPa-Ap-gakjaPwRc6Fl6mxHzxEZ_arAVU-IUYeo_s,447
|
344
|
+
dissect.target-3.17.dev11.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
|
345
|
+
dissect.target-3.17.dev11.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|