dissect.target 3.19.dev52__py3-none-any.whl → 3.19.dev54__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -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