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.
Files changed (138) hide show
  1. dissect_volume-3.14.dev2/.git-blame-ignore-revs +6 -0
  2. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/PKG-INFO +2 -2
  3. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/ddf/ddf.py +2 -2
  4. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/disk.py +8 -4
  5. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/partition.py +10 -6
  6. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/apm.py +7 -5
  7. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/bsd.py +8 -5
  8. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/gpt.py +6 -1
  9. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/mbr.py +7 -2
  10. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/dm/btree.py +3 -3
  11. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/dm/c_dm.py +2 -0
  12. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/dm/thin.py +3 -3
  13. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/ldm.py +2 -0
  14. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/lvm2.py +9 -7
  15. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/metadata.py +127 -109
  16. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/physical.py +10 -7
  17. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/md/md.py +3 -5
  18. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/raid/raid.py +5 -6
  19. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/raid/stream.py +3 -3
  20. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/vinum/c_vinum.py +5 -3
  21. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/vinum/config.py +11 -12
  22. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/vinum/vinum.py +5 -8
  23. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/vss.py +56 -71
  24. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/PKG-INFO +2 -2
  25. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/SOURCES.txt +2 -0
  26. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/pyproject.toml +48 -5
  27. dissect_volume-3.14.dev2/tests/__init__.py +0 -0
  28. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/conftest.py +13 -8
  29. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_apm.py +2 -0
  30. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_bsd.py +2 -0
  31. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_ddf.py +3 -1
  32. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_dm.py +2 -0
  33. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_gpt.py +2 -0
  34. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_lvm.py +2 -0
  35. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_mbr.py +2 -0
  36. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_md.py +3 -1
  37. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_vinum.py +6 -6
  38. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/test_vinum_config.py +30 -24
  39. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tox.ini +4 -17
  40. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/.gitattributes +0 -0
  41. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/COPYRIGHT +0 -0
  42. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/LICENSE +0 -0
  43. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/MANIFEST.in +0 -0
  44. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/README.md +0 -0
  45. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/__init__.py +0 -0
  46. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/ddf/__init__.py +0 -0
  47. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/ddf/c_ddf.py +0 -0
  48. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/__init__.py +1 -1
  49. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/disk/schemes/__init__.py +0 -0
  50. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/dm/__init__.py +0 -0
  51. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/exceptions.py +0 -0
  52. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/__init__.py +0 -0
  53. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/lvm/c_lvm2.py +0 -0
  54. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/md/__init__.py +0 -0
  55. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/md/c_md.py +0 -0
  56. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect/volume/raid/__init__.py +0 -0
  57. {dissect_volume-3.13.dev1/tests → dissect_volume-3.14.dev2/dissect/volume/vinum}/__init__.py +0 -0
  58. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/dependency_links.txt +0 -0
  59. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/requires.txt +0 -0
  60. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/dissect.volume.egg-info/top_level.txt +0 -0
  61. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/setup.cfg +0 -0
  62. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/apm.bin +0 -0
  63. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/bsd.bin +0 -0
  64. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/bsd64.bin.gz +0 -0
  65. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-1.bin.gz +0 -0
  66. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-2.bin.gz +0 -0
  67. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-3.bin.gz +0 -0
  68. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-raid1-1.bin.gz +0 -0
  69. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid0-raid1-2.bin.gz +0 -0
  70. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid1-1.bin.gz +0 -0
  71. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid1-2.bin.gz +0 -0
  72. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid10-1.bin.gz +0 -0
  73. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid10-2.bin.gz +0 -0
  74. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid10-3.bin.gz +0 -0
  75. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid10-4.bin.gz +0 -0
  76. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid4-1.bin.gz +0 -0
  77. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid4-2.bin.gz +0 -0
  78. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid5-1.bin.gz +0 -0
  79. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid5-2.bin.gz +0 -0
  80. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid5-3.bin.gz +0 -0
  81. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid6-1.bin.gz +0 -0
  82. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid6-2.bin.gz +0 -0
  83. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid6-3.bin.gz +0 -0
  84. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/ddf/ddf-raid6-4.bin.gz +0 -0
  85. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/dm/dm-thin-data.bin.gz +0 -0
  86. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/dm/dm-thin-empty-data.bin.gz +0 -0
  87. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/dm/dm-thin-empty-metadata.bin.gz +0 -0
  88. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/dm/dm-thin-metadata.bin.gz +0 -0
  89. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt.bin +0 -0
  90. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt_4k.bin +0 -0
  91. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt_esxi.bin +0 -0
  92. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt_hybrid.bin +0 -0
  93. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/gpt_no_name_xff.bin +0 -0
  94. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/lvm/lvm-mirror-1.bin.gz +0 -0
  95. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/lvm/lvm-mirror-2.bin.gz +0 -0
  96. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/lvm/lvm-thin.bin.gz +0 -0
  97. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/lvm/lvm.bin.gz +0 -0
  98. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/mbr.bin +0 -0
  99. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-90-1.bin.gz +0 -0
  100. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-90-2.bin.gz +0 -0
  101. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-90-raid1-1.bin.gz +0 -0
  102. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-90-raid1-2.bin.gz +0 -0
  103. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-linear-1.bin.gz +0 -0
  104. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-linear-2.bin.gz +0 -0
  105. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid0-1.bin.gz +0 -0
  106. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid0-2.bin.gz +0 -0
  107. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid0-3.bin.gz +0 -0
  108. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid1-1.bin.gz +0 -0
  109. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid1-2.bin.gz +0 -0
  110. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid10-1.bin.gz +0 -0
  111. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid10-2.bin.gz +0 -0
  112. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid4-1.bin.gz +0 -0
  113. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid4-2.bin.gz +0 -0
  114. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid4-3.bin.gz +0 -0
  115. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid5-1.bin.gz +0 -0
  116. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid5-2.bin.gz +0 -0
  117. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid5-3.bin.gz +0 -0
  118. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid6-1.bin.gz +0 -0
  119. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid6-2.bin.gz +0 -0
  120. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid6-3.bin.gz +0 -0
  121. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/md/md-raid6-4.bin.gz +0 -0
  122. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-concat_diska.bin.gz +0 -0
  123. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-concat_diskb.bin.gz +0 -0
  124. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-mirror_diska.bin.gz +0 -0
  125. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-mirror_diskb.bin.gz +0 -0
  126. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-raid5_diska.bin.gz +0 -0
  127. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-raid5_diskb.bin.gz +0 -0
  128. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-raid5_diskc.bin.gz +0 -0
  129. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-raid5_diskd.bin.gz +0 -0
  130. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-striped_diska.bin.gz +0 -0
  131. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-striped_diskb.bin.gz +0 -0
  132. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-stripedmirror_diska.bin.gz +0 -0
  133. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-stripedmirror_diskb.bin.gz +0 -0
  134. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-stripedmirror_diskc.bin.gz +0 -0
  135. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/data/vinum/vinum-stripedmirror_diskd.bin.gz +0 -0
  136. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/docs/Makefile +0 -0
  137. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/docs/conf.py +0 -0
  138. {dissect_volume-3.13.dev1 → dissect_volume-3.14.dev2}/tests/docs/index.rst +0 -0
@@ -0,0 +1,6 @@
1
+ # Formatting commits. You can ignore them during git-blame with `--ignore-rev` or `--ignore-revs-file`.
2
+ #
3
+ # $ git config --add 'blame.ignoreRevsFile' '.git-blame-ignore-revs'
4
+ #
5
+ # Change linter to Ruff (#44)
6
+ 8fefd76a54ff43b2fdbedbbb3cd330c27b1a0b14
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: dissect.volume
3
- Version: 3.13.dev1
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.keys()]
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 = list(disks.values())[0][1].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 typing import BinaryIO, Optional
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([p.type == 0xEE for p in self.partitions]):
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) -> Optional[int]:
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 typing import Any, BinaryIO, Optional, Union
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: Union[int, UUID],
187
+ vtype: int | UUID,
184
188
  name: str,
185
- flags: Optional[int] = None,
186
- guid: Optional[UUID] = None,
187
- vtype_str: Optional[str] = None,
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 typing import BinaryIO, Iterator
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 BinaryIO, Iterator
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 typing import BinaryIO, Iterator
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 typing import BinaryIO, Iterator, Optional
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: Optional[int] = None
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, Optional, Union
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: Union[int, list[int]], want_high: bool = False) -> Optional[bytes]:
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[Optional[int], Optional[bytes]]:
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,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  from dissect.cstruct import cstruct
2
4
 
3
5
  dm_def = """
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import BinaryIO, Optional
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: Optional[int] = None) -> ThinDevice:
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: Optional[int] = None):
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,6 +2,8 @@
2
2
  #
3
3
  # This file is still a WIP
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import logging
6
8
  import os
7
9
 
@@ -2,8 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import os
5
- from datetime import datetime
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: Union[list[Union[BinaryIO, LVM2Device]], Union[BinaryIO, LVM2Device]]):
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: Optional[str] = self.metadata.get("description")
33
- self.creation_host: Optional[str] = self.metadata.get("creation_host")
34
- self.creation_time: Optional[datetime] = None
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: Optional[datetime] = ts.from_unix(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: