Module refinery.units.pattern.carve_tar
Expand source code Browse git
from __future__ import annotations
import tarfile
from refinery.lib.structures import MemoryFile
from refinery.units import Unit
class carve_tar(Unit):
"""
Extracts anything from the input data that looks like a tar archive file.
"""
def process(self, data: bytearray):
memory = memoryview(data)
stream = MemoryFile(data)
offset = 0
while (p := data.find(B'ustar', offset)) > 0:
stream.seekset(start := p - 0x101)
try:
success = False
with tarfile.open(mode='r|*', fileobj=stream) as t:
while t.next():
success = True
except Exception:
success = False
if success:
offset = stream.tell()
yield memory[start:offset]
else:
offset = p + 1
Classes
class carve_tar-
Extracts anything from the input data that looks like a tar archive file.
Expand source code Browse git
class carve_tar(Unit): """ Extracts anything from the input data that looks like a tar archive file. """ def process(self, data: bytearray): memory = memoryview(data) stream = MemoryFile(data) offset = 0 while (p := data.find(B'ustar', offset)) > 0: stream.seekset(start := p - 0x101) try: success = False with tarfile.open(mode='r|*', fileobj=stream) as t: while t.next(): success = True except Exception: success = False if success: offset = stream.tell() yield memory[start:offset] else: offset = p + 1Ancestors
Subclasses
Inherited members