acquire 3.17.dev7__tar.gz → 3.18.dev1__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.
- {acquire-3.17.dev7/acquire.egg-info → acquire-3.18.dev1}/PKG-INFO +1 -1
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/version.py +2 -2
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/volatilestream.py +35 -2
- {acquire-3.17.dev7 → acquire-3.18.dev1/acquire.egg-info}/PKG-INFO +1 -1
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire.egg-info/SOURCES.txt +1 -0
- acquire-3.18.dev1/tests/test_volatile.py +20 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/COPYRIGHT +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/LICENSE +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/MANIFEST.in +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/README.md +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/__init__.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/acquire.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/collector.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/crypt.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/dynamic/__init__.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/dynamic/windows/__init__.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/dynamic/windows/collect.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/dynamic/windows/exceptions.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/dynamic/windows/handles.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/dynamic/windows/named_objects.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/dynamic/windows/ntdll.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/dynamic/windows/types.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/esxi.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/gui/__init__.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/gui/base.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/gui/win32.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/hashes.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/log.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/outputs/__init__.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/outputs/base.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/outputs/dir.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/outputs/tar.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/outputs/zip.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/tools/__init__.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/tools/decrypter.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/uploaders/__init__.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/uploaders/minio.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/uploaders/plugin.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/uploaders/plugin_registry.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire/utils.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire.egg-info/dependency_links.txt +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire.egg-info/entry_points.txt +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire.egg-info/requires.txt +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/acquire.egg-info/top_level.txt +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/pyproject.toml +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/setup.cfg +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/__init__.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/conftest.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/data/private_key.pem +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/data/public_key.pem +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/docs/Makefile +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/docs/conf.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/docs/index.rst +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_acquire_command.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_acquire_modules.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_collector.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_decryptor_funcs.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_esxi_memory.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_file_sorting.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_gui.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_minio_uploader.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_misc_users.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_outputs_dir.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_outputs_tar.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_outputs_zip.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_plugin.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tests/test_utils.py +0 -0
- {acquire-3.17.dev7 → acquire-3.18.dev1}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: acquire
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.18.dev1
|
|
4
4
|
Summary: A tool to quickly gather forensic artifacts from disk images or a live system into a lightweight container
|
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
|
6
6
|
License: Affero General Public License v3
|
|
@@ -12,5 +12,5 @@ __version__: str
|
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
|
13
13
|
version_tuple: VERSION_TUPLE
|
|
14
14
|
|
|
15
|
-
__version__ = version = '3.
|
|
16
|
-
__version_tuple__ = version_tuple = (3,
|
|
15
|
+
__version__ = version = '3.18.dev1'
|
|
16
|
+
__version_tuple__ = version_tuple = (3, 18, 'dev1')
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import os
|
|
2
|
+
from concurrent import futures
|
|
2
3
|
from io import SEEK_SET, UnsupportedOperation
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
from stat import S_IRGRP, S_IROTH, S_IRUSR
|
|
6
|
+
from typing import Any, Callable
|
|
5
7
|
|
|
6
8
|
from dissect.util.stream import AlignedStream
|
|
7
9
|
|
|
@@ -14,6 +16,35 @@ except ImportError:
|
|
|
14
16
|
HAS_FCNTL = False
|
|
15
17
|
|
|
16
18
|
|
|
19
|
+
def timeout(func: Callable, *, timelimit: int) -> Callable:
|
|
20
|
+
"""Timeout a function if it takes too long to complete.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
func: a function to wrap.
|
|
24
|
+
timelimit: The time in seconds that an operation is allowed to run.
|
|
25
|
+
|
|
26
|
+
Raises:
|
|
27
|
+
TimeoutError: If its time exceeds the timelimit
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
31
|
+
with futures.ThreadPoolExecutor(max_workers=1) as executor:
|
|
32
|
+
future = executor.submit(func, *args, **kwargs)
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
result = future.result(timelimit)
|
|
36
|
+
except futures.TimeoutError:
|
|
37
|
+
raise TimeoutError
|
|
38
|
+
finally:
|
|
39
|
+
# Make sure the thread stops right away.
|
|
40
|
+
executor._threads.clear()
|
|
41
|
+
futures.thread._threads_queues.clear()
|
|
42
|
+
|
|
43
|
+
return result
|
|
44
|
+
|
|
45
|
+
return wrapper
|
|
46
|
+
|
|
47
|
+
|
|
17
48
|
class VolatileStream(AlignedStream):
|
|
18
49
|
"""Streaming class to handle various procfs and sysfs edge-cases. Backed by `AlignedStream`.
|
|
19
50
|
|
|
@@ -41,6 +72,8 @@ class VolatileStream(AlignedStream):
|
|
|
41
72
|
st_mode = os.fstat(self.fd).st_mode
|
|
42
73
|
write_only = (st_mode & (S_IRUSR | S_IRGRP | S_IROTH)) == 0 # novermin
|
|
43
74
|
|
|
75
|
+
self._os_read = timeout(os.read, timelimit=5)
|
|
76
|
+
|
|
44
77
|
super().__init__(0 if write_only else size)
|
|
45
78
|
|
|
46
79
|
def seek(self, pos: int, whence: int = SEEK_SET) -> int:
|
|
@@ -53,8 +86,8 @@ class VolatileStream(AlignedStream):
|
|
|
53
86
|
result = []
|
|
54
87
|
while length:
|
|
55
88
|
try:
|
|
56
|
-
buf =
|
|
57
|
-
except BlockingIOError:
|
|
89
|
+
buf = self._os_read(self.fd, min(length, self.size - offset))
|
|
90
|
+
except (BlockingIOError, TimeoutError):
|
|
58
91
|
break
|
|
59
92
|
|
|
60
93
|
if not buf:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: acquire
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.18.dev1
|
|
4
4
|
Summary: A tool to quickly gather forensic artifacts from disk images or a live system into a lightweight container
|
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
|
6
6
|
License: Affero General Public License v3
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from time import sleep, time
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from acquire.volatilestream import timeout
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_timeout():
|
|
9
|
+
def snooze():
|
|
10
|
+
sleep(10)
|
|
11
|
+
|
|
12
|
+
function = timeout(snooze, timelimit=5)
|
|
13
|
+
start = time()
|
|
14
|
+
|
|
15
|
+
with pytest.raises(TimeoutError):
|
|
16
|
+
function()
|
|
17
|
+
|
|
18
|
+
end = time()
|
|
19
|
+
|
|
20
|
+
assert end - start < 6
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|