dissect.target 3.19.dev52__py3-none-any.whl → 3.19.dev54__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.
@@ -138,12 +138,18 @@ class MftPlugin(Plugin):
138
138
  FilesystemFilenameCompactRecord,
139
139
  ]
140
140
  )
141
- @arg("--compact", action="store_true", help="compacts the MFT entry timestamps into a single record")
141
+ @arg(
142
+ "--compact",
143
+ group="fmt",
144
+ action="store_true",
145
+ help="compacts the MFT entry timestamps into a single record",
146
+ )
142
147
  @arg("--fs", type=int, default=None, help="optional filesystem index, zero indexed")
143
148
  @arg("--start", type=int, default=0, help="the first MFT segment number")
144
149
  @arg("--end", type=int, default=-1, help="the last MFT segment number")
145
150
  @arg(
146
151
  "--macb",
152
+ group="fmt",
147
153
  action="store_true",
148
154
  help="compacts the MFT entry timestamps into aggregated records with MACB bitfield",
149
155
  )
@@ -171,9 +177,7 @@ class MftPlugin(Plugin):
171
177
 
172
178
  aggr = noaggr
173
179
 
174
- if compact and macb:
175
- raise ValueError("--macb and --compact are mutually exclusive")
176
- elif compact:
180
+ if compact:
177
181
  record_formatter = compacted_formatter
178
182
  elif macb:
179
183
  aggr = macb_aggr
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional
4
-
5
3
  from dissect.target.filesystem import Filesystem
6
4
  from dissect.target.plugin import export
7
5
  from dissect.target.plugins.os.unix.bsd._os import BsdPlugin
@@ -14,13 +12,13 @@ class FreeBsdPlugin(BsdPlugin):
14
12
  self._os_release = self._parse_os_release("/bin/freebsd-version*")
15
13
 
16
14
  @classmethod
17
- def detect(cls, target: Target) -> Optional[Filesystem]:
15
+ def detect(cls, target: Target) -> Filesystem | None:
18
16
  for fs in target.filesystems:
19
- if fs.exists("/net") or fs.exists("/.sujournal"):
17
+ if fs.exists("/net") and (fs.exists("/.sujournal") or fs.exists("/entropy")):
20
18
  return fs
21
19
 
22
20
  return None
23
21
 
24
22
  @export(property=True)
25
- def version(self) -> Optional[str]:
23
+ def version(self) -> str | None:
26
24
  return self._os_release.get("USERLAND_VERSION")
@@ -1,5 +1,6 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
- from typing import Optional
3
4
 
4
5
  from dissect.target.filesystem import Filesystem
5
6
  from dissect.target.helpers.network_managers import (
@@ -8,6 +9,8 @@ from dissect.target.helpers.network_managers import (
8
9
  )
9
10
  from dissect.target.plugin import OperatingSystem, export
10
11
  from dissect.target.plugins.os.unix._os import UnixPlugin
12
+ from dissect.target.plugins.os.unix.bsd.osx._os import MacPlugin
13
+ from dissect.target.plugins.os.windows._os import WindowsPlugin
11
14
  from dissect.target.target import Target
12
15
 
13
16
  log = logging.getLogger(__name__)
@@ -20,17 +23,13 @@ class LinuxPlugin(UnixPlugin, LinuxNetworkManager):
20
23
  self.network_manager.discover()
21
24
 
22
25
  @classmethod
23
- def detect(cls, target: Target) -> Optional[Filesystem]:
26
+ def detect(cls, target: Target) -> Filesystem | None:
24
27
  for fs in target.filesystems:
25
28
  if (
26
- fs.exists("/var")
27
- and fs.exists("/etc")
28
- and fs.exists("/opt")
29
- or (fs.exists("/sys") or fs.exists("/proc"))
30
- and not fs.exists("/Library")
31
- ):
29
+ (fs.exists("/var") and fs.exists("/etc") and fs.exists("/opt"))
30
+ or (fs.exists("/sys/module") or fs.exists("/proc/sys"))
31
+ ) and not (MacPlugin.detect(target) or WindowsPlugin.detect(target)):
32
32
  return fs
33
- return None
34
33
 
35
34
  @export(property=True)
36
35
  def ips(self) -> list[str]:
@@ -68,7 +67,7 @@ class LinuxPlugin(UnixPlugin, LinuxNetworkManager):
68
67
  return self.network_manager.get_config_value("netmask")
69
68
 
70
69
  @export(property=True)
71
- def version(self) -> str:
70
+ def version(self) -> str | None:
72
71
  distrib_description = self._os_release.get("DISTRIB_DESCRIPTION", "")
73
72
  name = self._os_release.get("NAME", "") or self._os_release.get("DISTRIB_ID", "")
74
73
  version = (
@@ -78,10 +77,9 @@ class LinuxPlugin(UnixPlugin, LinuxNetworkManager):
78
77
  )
79
78
 
80
79
  if len(f"{name} {version}") > len(distrib_description):
81
- return f"{name} {version}"
80
+ distrib_description = f"{name} {version}"
82
81
 
83
- else:
84
- return distrib_description
82
+ return distrib_description or None
85
83
 
86
84
  @export(property=True)
87
85
  def os(self) -> str:
@@ -95,12 +95,24 @@ def generate_argparse_for_unbound_method(
95
95
  parser = argparse.ArgumentParser(description=desc, formatter_class=help_formatter, conflict_handler="resolve")
96
96
 
97
97
  fargs = getattr(method, "__args__", [])
98
+ groups = {}
99
+ default_group_options = {"required": False}
98
100
  for args, kwargs in fargs:
99
- parser.add_argument(*args, **kwargs)
101
+ if "group" in kwargs:
102
+ group_name = kwargs.pop("group")
103
+ options = kwargs.pop("group_options") if "group_options" in kwargs else default_group_options
104
+ if group_name not in groups:
105
+ group = parser.add_mutually_exclusive_group(**options)
106
+ groups[group_name] = group
107
+ else:
108
+ group = groups[group_name]
109
+
110
+ group.add_argument(*args, **kwargs)
111
+ else:
112
+ parser.add_argument(*args, **kwargs)
100
113
 
101
114
  usage = parser.format_usage()
102
115
  offset = usage.find(parser.prog) + len(parser.prog)
103
-
104
116
  func_name = method.__name__
105
117
  usage_tmpl = usage_tmpl or "{prog} {usage}"
106
118
  parser.usage = usage_tmpl.format(prog=parser.prog, name=func_name, usage=usage[offset:])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.19.dev52
3
+ Version: 3.19.dev54
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
@@ -172,7 +172,7 @@ dissect/target/plugins/filesystem/resolver.py,sha256=HfyASUFV4F9uD-yFXilFpPTORAs
172
172
  dissect/target/plugins/filesystem/walkfs.py,sha256=rklbN805roy2fKAQe5L1JhTvI0qNgGS70ZNGFwevLB0,2740
173
173
  dissect/target/plugins/filesystem/yara.py,sha256=zh4hU3L_egddLqDeaHDVuCWYhTlNzPYPVak36Q6IMxI,6621
174
174
  dissect/target/plugins/filesystem/ntfs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
- dissect/target/plugins/filesystem/ntfs/mft.py,sha256=WzvKSlH4egvDsuonRQ3AjYS59t9jjFX_-GOsAPLUeSk,12418
175
+ dissect/target/plugins/filesystem/ntfs/mft.py,sha256=6r2uQrvJsuHGpKxx4vQPBuZ9yGLj-d8RS5y289-VoZI,12384
176
176
  dissect/target/plugins/filesystem/ntfs/mft_timeline.py,sha256=vvNFAZbr7s3X2OTYf4ES_L6-XsouTXcTymfxnHfZ1Rw,6791
177
177
  dissect/target/plugins/filesystem/ntfs/usnjrnl.py,sha256=uiT1ipmcAo__6VIUi8R_vvIu22vdnjMACKwLSAbzYjs,3704
178
178
  dissect/target/plugins/filesystem/ntfs/utils.py,sha256=xG7Lgw9NX4tDDrZVRm0vycFVJTOM7j-HrjqzDh0f4uA,3136
@@ -206,7 +206,7 @@ dissect/target/plugins/os/unix/bsd/citrix/__init__.py,sha256=47DEQpj8HBSa-_TImW-
206
206
  dissect/target/plugins/os/unix/bsd/citrix/_os.py,sha256=u9agLXoMt_k-nARtSJ78_-ScJae4clZhkqFiEVsB9b8,7910
207
207
  dissect/target/plugins/os/unix/bsd/citrix/history.py,sha256=cXMA4rZQBsOMwd_aLbXjW_CAEzNnsr2bUZB9cPufnQo,4498
208
208
  dissect/target/plugins/os/unix/bsd/freebsd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
209
- dissect/target/plugins/os/unix/bsd/freebsd/_os.py,sha256=Vqiyn08kv1IioNUwpgtBJ9SToCFhLCsJdpVhl5E7COM,789
209
+ dissect/target/plugins/os/unix/bsd/freebsd/_os.py,sha256=_r8htCB6wWNAU1siGKu4SSsKxSNR1KZ5j0mCF0ZAJDg,782
210
210
  dissect/target/plugins/os/unix/bsd/ios/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
211
  dissect/target/plugins/os/unix/bsd/ios/_os.py,sha256=VlJXGxkQZ4RbGbSC-FlbR2YWOJp2kLf9nrJaWCURdW4,1193
212
212
  dissect/target/plugins/os/unix/bsd/openbsd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -219,7 +219,7 @@ dissect/target/plugins/os/unix/esxi/_os.py,sha256=s6pAgUyfHh3QcY6sgvk5uVMmLvqK1t
219
219
  dissect/target/plugins/os/unix/etc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
220
220
  dissect/target/plugins/os/unix/etc/etc.py,sha256=px_UwtPuk_scD-3nKJQZ0ao5lus9-BrSU4lPZWelYzI,2541
221
221
  dissect/target/plugins/os/unix/linux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
222
- dissect/target/plugins/os/unix/linux/_os.py,sha256=n6VkfGYIdZUxcK2C1aPDUY_ZZQEIl0GkrpvIKeguv5o,2812
222
+ dissect/target/plugins/os/unix/linux/_os.py,sha256=DF4UV-s6XupV8bWck2Mkm4seFRb0oKjzeM-PtU8OV0k,2940
223
223
  dissect/target/plugins/os/unix/linux/cmdline.py,sha256=AyMfndt3UsmJtoOyZYC8nWq2GZg9oPvn8SiI3M4NxnE,1622
224
224
  dissect/target/plugins/os/unix/linux/environ.py,sha256=UOQD7Xmu754u2oAh3L5g5snuz-gv4jbWbVy46qszYjo,1881
225
225
  dissect/target/plugins/os/unix/linux/iptables.py,sha256=qTzY5PHHXA33WnPYb5NESgoSwI7ECZ8YPoEe_Fmln-8,6045
@@ -342,7 +342,7 @@ dissect/target/tools/mount.py,sha256=L_0tSmiBdW4aSaF0vXjB0bAkTC0kmT2N1hrbW6s5Jow
342
342
  dissect/target/tools/query.py,sha256=ONHu2FVomLccikb84qBrlhNmEfRoHYFQMcahk_y2c9A,15580
343
343
  dissect/target/tools/reg.py,sha256=FDsiBBDxjWVUBTRj8xn82vZe-J_d9piM-TKS3PHZCcM,3193
344
344
  dissect/target/tools/shell.py,sha256=dmshIriwdd_UwrdUcTfWkcYD8Z0mjzbDqwyZG-snDdM,50482
345
- dissect/target/tools/utils.py,sha256=ej9w2uOzPf52EslEamFpY4Bc_u5EUI9Ks4mU1QTmWPI,11664
345
+ dissect/target/tools/utils.py,sha256=nnhjNW8v99eVZQ-CgxTbsi8Wa6Z2XKDFr1aWakgq9jc,12191
346
346
  dissect/target/tools/yara.py,sha256=70k-2VMulf1EdkX03nCACzejaOEcsFHOyX-4E40MdQU,2044
347
347
  dissect/target/tools/dump/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
348
348
  dissect/target/tools/dump/run.py,sha256=aD84peRS4zHqC78fH7Vd4ni3m1ZmVP70LyMwBRvoDGY,9463
@@ -356,10 +356,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
356
356
  dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
357
357
  dissect/target/volumes/md.py,sha256=7ShPtusuLGaIv27SvEETtgsuoQyAa4iAAeOR1NEaajI,1689
358
358
  dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
359
- dissect.target-3.19.dev52.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
360
- dissect.target-3.19.dev52.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
361
- dissect.target-3.19.dev52.dist-info/METADATA,sha256=2kZD6yB3J2o7zvdcl5jfVbjDozCIuNddgLaGVoY14a0,12897
362
- dissect.target-3.19.dev52.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
363
- dissect.target-3.19.dev52.dist-info/entry_points.txt,sha256=BWuxAb_6AvUAQpIQOQU0IMTlaF6TDht2AIZK8bHd-zE,492
364
- dissect.target-3.19.dev52.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
365
- dissect.target-3.19.dev52.dist-info/RECORD,,
359
+ dissect.target-3.19.dev54.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
360
+ dissect.target-3.19.dev54.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
361
+ dissect.target-3.19.dev54.dist-info/METADATA,sha256=-r6p7_zLix0JuJSqAsy6kbYzI0Cqn2w67fYb_DRYGAQ,12897
362
+ dissect.target-3.19.dev54.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
363
+ dissect.target-3.19.dev54.dist-info/entry_points.txt,sha256=BWuxAb_6AvUAQpIQOQU0IMTlaF6TDht2AIZK8bHd-zE,492
364
+ dissect.target-3.19.dev54.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
365
+ dissect.target-3.19.dev54.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.0.0)
2
+ Generator: setuptools (74.1.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5