Skip to content

Commit 32adb86

Browse files
committed
bugfix in Extractor
* raise unsupported call on reassembly/trace if needed * add logging message for reassembly/trace enable notification * udpated docstring for more reassembly/trace args * bugfix for JarryShaw#155
1 parent 64abffd commit 32adb86

File tree

1 file changed

+47
-19
lines changed

1 file changed

+47
-19
lines changed

pcapkit/foundation/extraction.py

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
from pcapkit.utilities.exceptions import (CallableError, FileNotFound, FormatError, IterableError,
2929
UnsupportedCall, stacklevel)
3030
from pcapkit.utilities.warnings import EngineWarning, FormatWarning, warn
31+
from pcapkit.foundation.reassembly.data import ReassemblyData
32+
from pcapkit.foundation.traceflow.data import TraceFlowData
33+
from pcapkit.utilities.logging import logger
3134

3235
if TYPE_CHECKING:
3336
from types import ModuleType, TracebackType
@@ -40,8 +43,6 @@
4043
from typing_extensions import Literal
4144

4245
from pcapkit.foundation.engines.engine import Engine
43-
from pcapkit.foundation.reassembly.data import ReassemblyData
44-
from pcapkit.foundation.traceflow.data import TraceFlowData
4546
from pcapkit.protocols.misc.pcap.frame import Frame
4647
from pcapkit.protocols.misc.pcapng import PCAPNG
4748
from pcapkit.protocols.protocol import Protocol
@@ -208,7 +209,7 @@ def frame(self) -> 'tuple[Packet, ...]':
208209
209210
Raises:
210211
UnsupportedCall: If :attr:`self._flag_d <pcapkit.foundation.extraction.Extractor._flag_d>`
211-
is :data:`True`, as storing frame data is disabled.
212+
is :data:`False`, as storing frame data is disabled.
212213
213214
"""
214215
if self._flag_d:
@@ -219,25 +220,41 @@ def frame(self) -> 'tuple[Packet, ...]':
219220
def reassembly(self) -> 'ReassemblyData':
220221
"""Frame record for reassembly.
221222
222-
* ``ipv4`` -- tuple of TCP payload fragment (:term:`reasm.ipv4.datagram`)
223-
* ``ipv6`` -- tuple of TCP payload fragment (:term:`reasm.ipv6.datagram`)
223+
* ``ipv4`` -- tuple of IPv4 payload fragment (:term:`reasm.ipv4.datagram`)
224+
* ``ipv6`` -- tuple of IPv6 payload fragment (:term:`reasm.ipv6.datagram`)
224225
* ``tcp`` -- tuple of TCP payload fragment (:term:`reasm.tcp.datagram`)
225226
227+
Raises:
228+
UnsupportedCall: If :attr:`self._flag_r <pcapkit.foundation.extraction.Extractor._flag_r>`
229+
is :data:`False`, as reassembly is disabled.
230+
226231
"""
227-
data = ReassemblyData(
228-
ipv4=tuple(self._reasm.ipv4.datagram) if self._ipv4 else None,
229-
ipv6=tuple(self._reasm.ipv6.datagram) if self._ipv6 else None,
230-
tcp=tuple(self._reasm.tcp.datagram) if self._tcp else None,
231-
)
232-
return data
232+
if self._flag_r:
233+
data = ReassemblyData(
234+
ipv4=tuple(self._reasm.ipv4.datagram) if self._ipv4 else None,
235+
ipv6=tuple(self._reasm.ipv6.datagram) if self._ipv6 else None,
236+
tcp=tuple(self._reasm.tcp.datagram) if self._tcp else None,
237+
)
238+
return data
239+
raise UnsupportedCall("'Extractor(reassembly=False)' object has no attribute 'reassembly'")
233240

234241
@property
235242
def trace(self) -> 'TraceFlowData':
236-
"""Index table for traced flow."""
237-
data = TraceFlowData(
238-
tcp=tuple(self._trace.tcp.index) if self._tcp else None,
239-
)
240-
return data
243+
"""Index table for traced flow.
244+
245+
* ``tcp`` -- tuple of TCP flows (:term:`trace.tcp.index`)
246+
247+
Raises:
248+
UnsupportedCall: If :attr:`self._flag_t <pcapkit.foundation.extraction.Extractor._flag_t>`
249+
is :data:`False`, as flow tracing is disabled.
250+
251+
"""
252+
if self._flag_t:
253+
data = TraceFlowData(
254+
tcp=tuple(self._trace.tcp.index) if self._tcp else None,
255+
)
256+
return data
257+
raise UnsupportedCall("'Extractor(trace=False)' object has no attribute 'trace'")
241258

242259
@property
243260
def engine(self) -> 'Engine':
@@ -536,10 +553,11 @@ def __init__(self,
536553
trace_byteorder: output file byte order
537554
trace_nanosecond: output nanosecond-resolution file flag
538555
539-
ip: if record data for IPv4 & IPv6 reassembly
540-
ipv4: if perform IPv4 reassembly
541-
ipv6: if perform IPv6 reassembly
556+
ip: if record data for IPv4 & IPv6 reassembly (must be used with ``reassembly=True``)
557+
ipv4: if perform IPv4 reassembly (must be used with ``reassembly=True``)
558+
ipv6: if perform IPv6 reassembly (must be used with ``reassembly=True``)
542559
tcp: if perform TCP reassembly and/or flow tracing
560+
(must be used with ``reassembly=True`` or ``trace=True``)
543561
544562
Warns:
545563
FormatWarning: Warns under following circumstances:
@@ -599,6 +617,13 @@ def __init__(self,
599617
from pcapkit.foundation.reassembly.ipv6 import IPv6 as IPv6_Reassembly
600618
from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly
601619

620+
if self._ipv4:
621+
logger.info('IPv4 reassembly enabled')
622+
if self._ipv6:
623+
logger.info('IPv6 reassembly enabled')
624+
if self._tcp:
625+
logger.info('TCP reassembly enabled')
626+
602627
self._reasm = ReassemblyManager(
603628
ipv4=IPv4_Reassembly(strict=strict) if self._ipv4 else None,
604629
ipv6=IPv6_Reassembly(strict=strict) if self._ipv6 else None,
@@ -613,6 +638,9 @@ def __init__(self,
613638
"using 'trace_format=None' instead", FormatWarning, stacklevel=stacklevel())
614639
trace_format = None
615640

641+
if self._tcp:
642+
logger.info('TCP flow tracing enabled')
643+
616644
self._trace = TraceFlowManager(
617645
tcp=TCP_TraceFlow(fout=trace_fout, format=trace_format, byteorder=trace_byteorder,
618646
nanosecond=trace_nanosecond) if self._tcp else None,

0 commit comments

Comments
 (0)