dissect.target 3.20.dev16__py3-none-any.whl → 3.20.dev17__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/plugins/child/parallels.py +68 -0
- {dissect.target-3.20.dev16.dist-info → dissect.target-3.20.dev17.dist-info}/METADATA +1 -1
- {dissect.target-3.20.dev16.dist-info → dissect.target-3.20.dev17.dist-info}/RECORD +8 -7
- {dissect.target-3.20.dev16.dist-info → dissect.target-3.20.dev17.dist-info}/COPYRIGHT +0 -0
- {dissect.target-3.20.dev16.dist-info → dissect.target-3.20.dev17.dist-info}/LICENSE +0 -0
- {dissect.target-3.20.dev16.dist-info → dissect.target-3.20.dev17.dist-info}/WHEEL +0 -0
- {dissect.target-3.20.dev16.dist-info → dissect.target-3.20.dev17.dist-info}/entry_points.txt +0 -0
- {dissect.target-3.20.dev16.dist-info → dissect.target-3.20.dev17.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
from typing import Iterator
|
3
|
+
|
4
|
+
from dissect.target.exceptions import UnsupportedPluginError
|
5
|
+
from dissect.target.helpers.fsutil import TargetPath
|
6
|
+
from dissect.target.helpers.record import ChildTargetRecord
|
7
|
+
from dissect.target.plugin import ChildTargetPlugin
|
8
|
+
from dissect.target.target import Target
|
9
|
+
|
10
|
+
PARALLELS_USER_PATHS = [
|
11
|
+
"Parallels",
|
12
|
+
"Documents/Parallels",
|
13
|
+
"Library/Group Containers/*.com.parallels.desktop.appstore/Shared/Parallels",
|
14
|
+
]
|
15
|
+
|
16
|
+
PARALLELS_SYSTEM_PATHS = [
|
17
|
+
"/Users/Shared/Parallels",
|
18
|
+
]
|
19
|
+
|
20
|
+
|
21
|
+
def find_pvms(target: Target) -> Iterator[TargetPath]:
|
22
|
+
"""Finds virtual machines located in default folders on a macOS target.
|
23
|
+
|
24
|
+
Resources:
|
25
|
+
- https://kb.parallels.com/117333
|
26
|
+
"""
|
27
|
+
for user_details in target.user_details.all_with_home():
|
28
|
+
for parallels_path in PARALLELS_SYSTEM_PATHS:
|
29
|
+
if (path := target.fs.path(parallels_path)).exists():
|
30
|
+
yield from iter_vms(path)
|
31
|
+
|
32
|
+
for parallels_path in PARALLELS_USER_PATHS:
|
33
|
+
if "*" in parallels_path:
|
34
|
+
start_path, pattern = parallels_path.split("*", 1)
|
35
|
+
for path in user_details.home_path.joinpath(start_path).rglob("*" + pattern):
|
36
|
+
yield from iter_vms(path)
|
37
|
+
else:
|
38
|
+
if (path := user_details.home_path.joinpath(parallels_path)).exists():
|
39
|
+
yield from iter_vms(path)
|
40
|
+
|
41
|
+
|
42
|
+
def iter_vms(path: Path) -> Iterator[TargetPath]:
|
43
|
+
"""Glob for .pvm folders in the provided folder."""
|
44
|
+
for file in path.rglob("*.pvm"):
|
45
|
+
if file.is_dir():
|
46
|
+
yield file
|
47
|
+
|
48
|
+
|
49
|
+
class ParallelsChildTargetPlugin(ChildTargetPlugin):
|
50
|
+
"""Child target plugin that yields Parallels Desktop VM files."""
|
51
|
+
|
52
|
+
__type__ = "parallels"
|
53
|
+
|
54
|
+
def __init__(self, target: Target):
|
55
|
+
super().__init__(target)
|
56
|
+
self.pvms = list(find_pvms(target))
|
57
|
+
|
58
|
+
def check_compatible(self) -> None:
|
59
|
+
if not self.pvms:
|
60
|
+
raise UnsupportedPluginError("No Parallels pvm file(s) found")
|
61
|
+
|
62
|
+
def list_children(self) -> Iterator[ChildTargetRecord]:
|
63
|
+
for pvm in self.pvms:
|
64
|
+
yield ChildTargetRecord(
|
65
|
+
type=self.__type__,
|
66
|
+
path=pvm,
|
67
|
+
_target=self.target,
|
68
|
+
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: dissect.target
|
3
|
-
Version: 3.20.
|
3
|
+
Version: 3.20.dev17
|
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
|
@@ -157,6 +157,7 @@ dissect/target/plugins/child/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
157
157
|
dissect/target/plugins/child/docker.py,sha256=frBZ8UUzbtkT9VrK1fwUzXDAdkHESdPCb-QI_OP9Jj4,872
|
158
158
|
dissect/target/plugins/child/esxi.py,sha256=GfgQzxntcHcyxAE2QjMJ-TrFhklweSXLbYh0uuv-klg,693
|
159
159
|
dissect/target/plugins/child/hyperv.py,sha256=R2qVeu4p_9V53jO-65znN0LwX9v3FVA-9jbbtOQcEz8,2236
|
160
|
+
dissect/target/plugins/child/parallels.py,sha256=jeBT_NvTQbQBaUjqGWTy2I5Q5OWlrogoyWHRXjOhLis,2255
|
160
161
|
dissect/target/plugins/child/qemu.py,sha256=vNzQwzFO964jYaI67MlX8vpWyHxpegjIU5F29zHKOGI,791
|
161
162
|
dissect/target/plugins/child/virtuozzo.py,sha256=Mx4ZxEl21g7IYkzraw4FBZup5EfrkFDv4WuTE3hxguw,1206
|
162
163
|
dissect/target/plugins/child/vmware_workstation.py,sha256=8wkA_tSufvBUyp4XQHzRzFETf5ROlyyO_MVS3TExyfw,1570
|
@@ -365,10 +366,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
|
|
365
366
|
dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
|
366
367
|
dissect/target/volumes/md.py,sha256=7ShPtusuLGaIv27SvEETtgsuoQyAa4iAAeOR1NEaajI,1689
|
367
368
|
dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
|
368
|
-
dissect.target-3.20.
|
369
|
-
dissect.target-3.20.
|
370
|
-
dissect.target-3.20.
|
371
|
-
dissect.target-3.20.
|
372
|
-
dissect.target-3.20.
|
373
|
-
dissect.target-3.20.
|
374
|
-
dissect.target-3.20.
|
369
|
+
dissect.target-3.20.dev17.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
|
370
|
+
dissect.target-3.20.dev17.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
|
371
|
+
dissect.target-3.20.dev17.dist-info/METADATA,sha256=b-FuP0zAaieA2KU6NYBKK1oQK45_bIreeC9TCgCLHvE,12897
|
372
|
+
dissect.target-3.20.dev17.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
373
|
+
dissect.target-3.20.dev17.dist-info/entry_points.txt,sha256=BWuxAb_6AvUAQpIQOQU0IMTlaF6TDht2AIZK8bHd-zE,492
|
374
|
+
dissect.target-3.20.dev17.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
|
375
|
+
dissect.target-3.20.dev17.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
{dissect.target-3.20.dev16.dist-info → dissect.target-3.20.dev17.dist-info}/entry_points.txt
RENAMED
File without changes
|
File without changes
|