dissect.volume 3.13.dev1__tar.gz → 3.14.dev2__tar.gz
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_volume-3.14.dev2/.git-blame-ignore-revs +6 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/PKG-INFO +2 -2
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/ddf/ddf.py +2 -2
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/disk.py +8 -4
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/partition.py +10 -6
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/apm.py +7 -5
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/bsd.py +8 -5
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/gpt.py +6 -1
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/mbr.py +7 -2
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/dm/btree.py +3 -3
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/dm/c_dm.py +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/dm/thin.py +3 -3
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/ldm.py +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/lvm2.py +9 -7
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/metadata.py +127 -109
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/physical.py +10 -7
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/md/md.py +3 -5
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/raid/raid.py +5 -6
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/raid/stream.py +3 -3
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/vinum/c_vinum.py +5 -3
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/vinum/config.py +11 -12
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/vinum/vinum.py +5 -8
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/vss.py +56 -71
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/PKG-INFO +2 -2
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/SOURCES.txt +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/pyproject.toml +48 -5
- dissect_volume-3.14.dev2/tests/__init__.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/conftest.py +13 -8
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_apm.py +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_bsd.py +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_ddf.py +3 -1
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_dm.py +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_gpt.py +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_lvm.py +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_mbr.py +2 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_md.py +3 -1
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_vinum.py +6 -6
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_vinum_config.py +30 -24
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tox.ini +4 -17
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/.gitattributes +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/COPYRIGHT +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/LICENSE +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/MANIFEST.in +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/README.md +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/__init__.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/ddf/__init__.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/ddf/c_ddf.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/__init__.py +1 -1
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/__init__.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/dm/__init__.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/exceptions.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/__init__.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/c_lvm2.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/md/__init__.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/md/c_md.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/raid/__init__.py +0 -0
- {dissect_volume-3.13.dev1/tests → dissect_volume-3.14.dev2/dissect/volume/vinum}/__init__.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/dependency_links.txt +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/requires.txt +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/top_level.txt +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/setup.cfg +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/apm.bin +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/bsd.bin +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/bsd64.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-3.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-raid1-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-raid1-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid1-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid1-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid10-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid10-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid10-3.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid10-4.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid4-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid4-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid5-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid5-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid5-3.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid6-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid6-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid6-3.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid6-4.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/dm/dm-thin-data.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/dm/dm-thin-empty-data.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/dm/dm-thin-empty-metadata.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/dm/dm-thin-metadata.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt.bin +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt_4k.bin +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt_esxi.bin +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt_hybrid.bin +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt_no_name_xff.bin +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/lvm/lvm-mirror-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/lvm/lvm-mirror-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/lvm/lvm-thin.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/lvm/lvm.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/mbr.bin +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-90-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-90-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-90-raid1-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-90-raid1-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-linear-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-linear-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid0-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid0-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid0-3.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid1-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid1-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid10-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid10-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid4-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid4-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid4-3.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid5-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid5-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid5-3.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid6-1.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid6-2.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid6-3.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid6-4.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-concat_diska.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-concat_diskb.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-mirror_diska.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-mirror_diskb.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-raid5_diska.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-raid5_diskb.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-raid5_diskc.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-raid5_diskd.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-striped_diska.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-striped_diskb.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-stripedmirror_diska.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-stripedmirror_diskb.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-stripedmirror_diskc.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-stripedmirror_diskd.bin.gz +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/docs/Makefile +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/docs/conf.py +0 -0
- {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/docs/index.rst +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: dissect.volume
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.14.dev2
|
|
4
4
|
Summary: A Dissect module implementing a parser for different disk volume and partition systems, for example LVM2, GPT and MBR
|
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
|
6
6
|
License: Affero General Public License v3
|
|
@@ -68,7 +68,7 @@ class DDFConfiguration(Configuration):
|
|
|
68
68
|
if pds != 0xFFFFFFFF:
|
|
69
69
|
i += 1
|
|
70
70
|
|
|
71
|
-
virtual_disks = [DDFVirtualDisk(vdcr_map[guid], vde_map[guid], vd_map[guid]) for guid in vd_map
|
|
71
|
+
virtual_disks = [DDFVirtualDisk(vdcr_map[guid], vde_map[guid], vd_map[guid]) for guid in vd_map]
|
|
72
72
|
super().__init__(physical_disks, virtual_disks)
|
|
73
73
|
|
|
74
74
|
|
|
@@ -84,7 +84,7 @@ class DDFVirtualDisk(VirtualDisk):
|
|
|
84
84
|
self.disks = disks
|
|
85
85
|
|
|
86
86
|
if (block_size := self.vdcr.block_size) == 0xFFFF:
|
|
87
|
-
block_size =
|
|
87
|
+
block_size = next(iter(disks.values()))[1].block_size
|
|
88
88
|
|
|
89
89
|
level, layout, num_disks = _convert_raid_layout(
|
|
90
90
|
vdcr.primary_raid_level,
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, BinaryIO
|
|
2
4
|
|
|
3
|
-
from dissect.volume.disk.partition import Partition
|
|
4
5
|
from dissect.volume.disk.schemes import APM, BSD, GPT, MBR
|
|
5
6
|
from dissect.volume.exceptions import DiskError
|
|
6
7
|
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from dissect.volume.disk.partition import Partition
|
|
10
|
+
|
|
7
11
|
|
|
8
12
|
class Disk:
|
|
9
13
|
def __init__(self, fh: BinaryIO, sector_size: int = 512):
|
|
@@ -40,11 +44,11 @@ class Disk:
|
|
|
40
44
|
else:
|
|
41
45
|
self.partitions.append(partition)
|
|
42
46
|
|
|
43
|
-
if isinstance(self.scheme, MBR) and any(
|
|
47
|
+
if isinstance(self.scheme, MBR) and any(p.type == 0xEE for p in self.partitions):
|
|
44
48
|
raise DiskError("Found GPT type partition, but MBR scheme detected. Maybe 4K sector size.")
|
|
45
49
|
|
|
46
50
|
@property
|
|
47
|
-
def serial(self) ->
|
|
51
|
+
def serial(self) -> int | None:
|
|
48
52
|
if isinstance(self.scheme, MBR):
|
|
49
53
|
return self.scheme.mbr.vol_no
|
|
50
54
|
return None
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any, BinaryIO
|
|
2
4
|
from uuid import UUID
|
|
3
5
|
|
|
4
|
-
from dissect.cstruct import Structure
|
|
5
6
|
from dissect.util.stream import RangeStream
|
|
6
7
|
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from dissect.cstruct import Structure
|
|
10
|
+
|
|
7
11
|
PARTITION_TYPES = {
|
|
8
12
|
0x00: "Empty",
|
|
9
13
|
0x01: "FAT12,CHS",
|
|
@@ -180,11 +184,11 @@ class Partition:
|
|
|
180
184
|
number: int,
|
|
181
185
|
offset: int,
|
|
182
186
|
size: int,
|
|
183
|
-
vtype:
|
|
187
|
+
vtype: int | UUID,
|
|
184
188
|
name: str,
|
|
185
|
-
flags:
|
|
186
|
-
guid:
|
|
187
|
-
vtype_str:
|
|
189
|
+
flags: int | None = None,
|
|
190
|
+
guid: UUID | None = None,
|
|
191
|
+
vtype_str: str | None = None,
|
|
188
192
|
raw: Structure = None,
|
|
189
193
|
):
|
|
190
194
|
self.disk = disk
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, BinaryIO
|
|
2
4
|
|
|
3
5
|
from dissect.cstruct import cstruct
|
|
4
6
|
|
|
5
7
|
from dissect.volume.disk.partition import Partition
|
|
6
8
|
from dissect.volume.exceptions import DiskError
|
|
7
9
|
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from collections.abc import Iterator
|
|
12
|
+
|
|
8
13
|
apm_def = """
|
|
9
14
|
struct partition_entry {
|
|
10
15
|
char signature[2];
|
|
@@ -54,10 +59,7 @@ class APM:
|
|
|
54
59
|
def _partitions(self) -> Iterator[Partition]:
|
|
55
60
|
self.fh.seek(self._partitions_offset)
|
|
56
61
|
for i in range(self.apm.partition_count):
|
|
57
|
-
if i == 0
|
|
58
|
-
p = self.apm
|
|
59
|
-
else:
|
|
60
|
-
p = c_apm.partition_entry(self.fh)
|
|
62
|
+
p = self.apm if i == 0 else c_apm.partition_entry(self.fh)
|
|
61
63
|
|
|
62
64
|
yield Partition(
|
|
63
65
|
disk=self,
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Reference:
|
|
2
2
|
# - https://github.com/freebsd/freebsd-src/blob/main/sys/geom/part/g_part_bsd.c
|
|
3
|
+
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import io
|
|
5
|
-
from typing import
|
|
6
|
+
from typing import TYPE_CHECKING, BinaryIO
|
|
6
7
|
from uuid import UUID
|
|
7
8
|
|
|
8
9
|
from dissect.cstruct import cstruct
|
|
@@ -10,6 +11,9 @@ from dissect.cstruct import cstruct
|
|
|
10
11
|
from dissect.volume.disk.partition import Partition
|
|
11
12
|
from dissect.volume.exceptions import DiskError
|
|
12
13
|
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from collections.abc import Iterator
|
|
16
|
+
|
|
13
17
|
bsd_def = """
|
|
14
18
|
/* The disk magic number */
|
|
15
19
|
#define BSD_MAGIC 0x82564557
|
|
@@ -270,7 +274,7 @@ FS_NAMES = {
|
|
|
270
274
|
class BSD:
|
|
271
275
|
"""BSD disklabel."""
|
|
272
276
|
|
|
273
|
-
TYPES =
|
|
277
|
+
TYPES = (
|
|
274
278
|
# MBR FreeBSD
|
|
275
279
|
0xA5,
|
|
276
280
|
# MBR OpenBSD
|
|
@@ -285,7 +289,7 @@ class BSD:
|
|
|
285
289
|
UUID("3D48CE54-1D16-11DC-8696-01301BB8A9F5").bytes_le,
|
|
286
290
|
# GPT FreeBSD disklabel
|
|
287
291
|
UUID("516E7CB4-6ECF-11D6-8FF8-00022D09712B").bytes_le,
|
|
288
|
-
|
|
292
|
+
)
|
|
289
293
|
|
|
290
294
|
def __init__(self, fh: BinaryIO, sector_size: int = 512):
|
|
291
295
|
self.fh = fh
|
|
@@ -313,8 +317,7 @@ class BSD:
|
|
|
313
317
|
self.type = 64
|
|
314
318
|
else:
|
|
315
319
|
raise DiskError(
|
|
316
|
-
f"Invalid BSD disklabel magic, expected {c_bsd.BSD_MAGIC:#x} or {c_bsd.DISKMAGIC64:#x}, "
|
|
317
|
-
f"got {magic:#x}."
|
|
320
|
+
f"Invalid BSD disklabel magic, expected {c_bsd.BSD_MAGIC:#x} or {c_bsd.DISKMAGIC64:#x}, got {magic:#x}."
|
|
318
321
|
)
|
|
319
322
|
|
|
320
323
|
self._partitions_offset = offset + len(self.disklabel)
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, BinaryIO
|
|
2
4
|
|
|
3
5
|
from dissect.cstruct import cstruct
|
|
4
6
|
|
|
@@ -6,6 +8,9 @@ from dissect.volume.disk.partition import Partition
|
|
|
6
8
|
from dissect.volume.disk.schemes.mbr import MBR
|
|
7
9
|
from dissect.volume.exceptions import DiskError
|
|
8
10
|
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from collections.abc import Iterator
|
|
13
|
+
|
|
9
14
|
gpt_def = """
|
|
10
15
|
// http://en.wikipedia.org/wiki/GUID_Partition_Table
|
|
11
16
|
struct GPT_HEADER {
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, BinaryIO
|
|
2
4
|
|
|
3
5
|
from dissect.cstruct import cstruct
|
|
4
6
|
|
|
5
7
|
from dissect.volume.disk.partition import Partition
|
|
6
8
|
from dissect.volume.exceptions import DiskError
|
|
7
9
|
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from collections.abc import Iterator
|
|
12
|
+
|
|
8
13
|
mbr_def = """
|
|
9
14
|
typedef struct part_s {
|
|
10
15
|
uint8 bootable; // +0: 0x80/0x00 - bootable/not bootable
|
|
@@ -52,7 +57,7 @@ class MBR:
|
|
|
52
57
|
self.partitions: list[Partition] = list(self._partitions(self.mbr, self.offset))
|
|
53
58
|
|
|
54
59
|
def _partitions(
|
|
55
|
-
self, mbr: c_mbr.mbr_s, offset: int, num_start: int = 0, ebr_offset:
|
|
60
|
+
self, mbr: c_mbr.mbr_s, offset: int, num_start: int = 0, ebr_offset: int | None = None
|
|
56
61
|
) -> Iterator[Partition]:
|
|
57
62
|
for num, partition in enumerate(mbr.part):
|
|
58
63
|
if partition.type == 0x00:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from functools import lru_cache
|
|
4
|
-
from typing import BinaryIO
|
|
4
|
+
from typing import BinaryIO
|
|
5
5
|
|
|
6
6
|
from dissect.volume.dm.c_dm import SECTOR_SIZE, c_dm
|
|
7
7
|
|
|
@@ -19,7 +19,7 @@ class BTree:
|
|
|
19
19
|
self.fh.seek(block * self._block_size_bytes)
|
|
20
20
|
return Node(self.fh.read(self._block_size_bytes))
|
|
21
21
|
|
|
22
|
-
def lookup(self, keys:
|
|
22
|
+
def lookup(self, keys: int | list[int], want_high: bool = False) -> bytes | None:
|
|
23
23
|
keys = [keys] if not isinstance(keys, list) else keys
|
|
24
24
|
|
|
25
25
|
root = self.root
|
|
@@ -35,7 +35,7 @@ class BTree:
|
|
|
35
35
|
|
|
36
36
|
return value
|
|
37
37
|
|
|
38
|
-
def _lookup(self, root: int, key: int, want_high: bool = False) -> tuple[
|
|
38
|
+
def _lookup(self, root: int, key: int, want_high: bool = False) -> tuple[int | None, bytes | None]:
|
|
39
39
|
block = root
|
|
40
40
|
while True:
|
|
41
41
|
node = self._read_node(block)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import BinaryIO
|
|
3
|
+
from typing import BinaryIO
|
|
4
4
|
|
|
5
5
|
from dissect.util.stream import AlignedStream
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ class ThinPool:
|
|
|
18
18
|
|
|
19
19
|
self.metadata = Metadata(metadata_fh)
|
|
20
20
|
|
|
21
|
-
def open(self, device_id: int, size_hint:
|
|
21
|
+
def open(self, device_id: int, size_hint: int | None = None) -> ThinDevice:
|
|
22
22
|
"""Open a thin device on this pool.
|
|
23
23
|
|
|
24
24
|
No size information is stored in the pool, so it's recommended to provide a size hint.
|
|
@@ -55,7 +55,7 @@ class ThinDevice(AlignedStream):
|
|
|
55
55
|
size_hint: Optional device size hint.
|
|
56
56
|
"""
|
|
57
57
|
|
|
58
|
-
def __init__(self, pool: ThinPool, device_id: int, size_hint:
|
|
58
|
+
def __init__(self, pool: ThinPool, device_id: int, size_hint: int | None = None):
|
|
59
59
|
self.pool = pool
|
|
60
60
|
self.device_id = device_id
|
|
61
61
|
self.block_size = self.pool.metadata.data_block_size * SECTOR_SIZE
|
|
@@ -2,8 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import os
|
|
5
|
-
from
|
|
6
|
-
from typing import BinaryIO, Optional, Union
|
|
5
|
+
from typing import TYPE_CHECKING, BinaryIO
|
|
7
6
|
|
|
8
7
|
from dissect.util import ts
|
|
9
8
|
|
|
@@ -11,6 +10,9 @@ from dissect.volume.exceptions import LVM2Error
|
|
|
11
10
|
from dissect.volume.lvm.metadata import VolumeGroup
|
|
12
11
|
from dissect.volume.lvm.physical import LVM2Device
|
|
13
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
|
|
14
16
|
log = logging.getLogger(__name__)
|
|
15
17
|
log.setLevel(os.getenv("DISSECT_LOG_LVM", "CRITICAL"))
|
|
16
18
|
|
|
@@ -18,7 +20,7 @@ log.setLevel(os.getenv("DISSECT_LOG_LVM", "CRITICAL"))
|
|
|
18
20
|
class LVM2:
|
|
19
21
|
"""Logical Volume Manager"""
|
|
20
22
|
|
|
21
|
-
def __init__(self, fh:
|
|
23
|
+
def __init__(self, fh: list[BinaryIO | LVM2Device] | BinaryIO | LVM2Device):
|
|
22
24
|
self.fh = [fh] if not isinstance(fh, list) else fh
|
|
23
25
|
if not self.fh:
|
|
24
26
|
raise ValueError("At least one file-like object is required")
|
|
@@ -29,11 +31,11 @@ class LVM2:
|
|
|
29
31
|
self.metadata = devices[0].metadata
|
|
30
32
|
self.contents: str = self.metadata["contents"]
|
|
31
33
|
self.version: int = self.metadata["version"]
|
|
32
|
-
self.description:
|
|
33
|
-
self.creation_host:
|
|
34
|
-
self.creation_time:
|
|
34
|
+
self.description: str | None = self.metadata.get("description")
|
|
35
|
+
self.creation_host: str | None = self.metadata.get("creation_host")
|
|
36
|
+
self.creation_time: datetime | None = None
|
|
35
37
|
if creation_time := self.metadata.get("creation_time"):
|
|
36
|
-
self.creation_time:
|
|
38
|
+
self.creation_time: datetime | None = ts.from_unix(creation_time)
|
|
37
39
|
|
|
38
40
|
vg = [VolumeGroup.from_dict(value, name=key) for key, value in self.metadata.items() if isinstance(value, dict)]
|
|
39
41
|
if len(vg) != 1:
|