Flow Tracing Base Class¶
pcapkit.foundation.traceflow.traceflow contains
TraceFlow, the abstract base
class of a custom flow tracing class, and
TraceFlowBase, which it and the
built-in TCP flow tracing class derive from.
- class pcapkit.foundation.traceflow.traceflow.TraceFlow[_DT, _BT: Info, _IT: Info, _PT: Info](fout, format, byteorder=sys.byteorder, nanosecond=False, bidirectional=True, analyse=False)[source]¶
Bases:
TraceFlowBase[_DT,_BT,_IT,_PT],Generic[_DT,_BT,_IT,_PT]Base flow tracing class.
Example
Registration is opt-in. Pass keyword argument
protocolat class definition to register the flow tracing class under that protocol name:class MyProtocol(TraceFlow, protocol='my_protocol'): ...
Omit it and the subclass is not registered, which is how a class that is not meant to be selectable by name declines:
class MyMixin(TraceFlow): # not registered ...
Such a class can still be registered later, on demand:
Extractor.register_traceflow('my_mixin', MyMixin)
- Parameters:
Changed in version 1.3.0:
nameandprotocolare read from__protocol_name__and__protocol_type__, where they were abstract properties each flow tracing class implemented, and the built-in name is short:'TCP'rather than'Transmission Control Protocol'. A subclass registers itself withExtractorat class definition.Changed in version 1.5.0: Registration is opt-in, under the
protocolclass keyword; 1.4.x registered every subclass, under itsnamewhen the keyword was omitted (#514). Thebidirectionalandanalysearguments are added, and a flow covers both directions of a conversation unlessbidirectional=Falseis passed.See also
For customisation and extension, see Customisation & Extensions.
- property name: str¶
Protocol name of current class.
Note
Also a class variable, set by
__protocol_name__.
- property protocol: Type[pcapkit.protocols.protocol.ProtocolBase]¶
Protocol of current class.
Note
Also a class variable, set by
__protocol_type__.
- property registry: dict[str, ModuleDescriptor[TraceFlowBase] | Type[TraceFlowBase]]¶
Mapping of protocol names to flow tracing classes.
Note
A class variable only, defined on
TraceFlowMeta. It is not per-class: it reads__traceflow__, the one table every flow tracing registration lands in. It is not__output__, the separate output-dumper table this class owns.
- classmethod register_dumper(format, dumper, ext)¶
Register a new dumper class.
Notes
The fully qualified class name of the new dumper class should be
{dumper.module}.{dumper.name}.The overwrite guard fires only when the incumbent dumper differs from the replacement, so re-registering the exact same object is a silent no-op rather than a warning about nothing displaced – the identity guard of the code-keyed registrars (#718, #739).
__output__maps each format to a(dumper, ext)pair, so the identity check compares the incumbent dumper (index0), not the pair – a re-registration that only changesextis still identity-equal on the dumper and stays silent, since the dumper is what “the same object” means here, not the pair as a whole.__output__is also acollections.defaultdict, unlike theExtractorengine, reassembly and flow tracing registries;dict.get()does not invoke the default factory the waycls.__output__[format]would, so it stays non-inserting here as well.The dumper
formatshipped with, as its descriptor or as the class it names, restores the shipped entry rather than storing the class, so an override can be undone and the deferred import is kept (#1363, #1364).- Parameters:
format (
str) – format namedumper (
ModuleDescriptor[dictdumper.dumper.Dumper] |Type[dictdumper.dumper.Dumper]) – module descriptor or adictdumper.dumper.Dumpersubclassext (
str) – file extension
- Raises:
RegistryError – If
dumperis not a class, or not adictdumper.dumper.Dumpersubclass, such asDumper.- Warns:
RegistryWarning– If a different dumper is already registered forformat; it is overwritten.
Removed in version 1.1.1.post2:
register, which this replaces with no alias.Changed in version 1.3.0:
dumper, a module descriptor or a class, replaces themoduleandclass_name pair, with no alias.
- classmethod register_callback(callback, *, index=None)¶
Register callback function.
- Parameters:
callback (
Callable[[_IT],None]) – callback function, which will be called when a traced flow is finalised, with the flow’s index entry (trace.tcp.index) as its only argumentindex (
int|None) – index to be inserted in the callback list; by default, the callback will be appended to the end of the list
- Return type:
- classmethod make_fout(fout='./tmp', fmt='pcap')¶
Make root path for output.
- Parameters:
- Return type:
- Returns:
Dumper of specified format and file extension of output file.
- Warns:
FormatWarning– Iffmtis not supported.FileWarning– Iffoutexists but is not a directory, andfmtis not supported.
- Raises:
FileExists – If
foutexists but is not a directory, andfmtis supported.
- abstractmethod dump(packet)¶
Dump frame to output files.
- Parameters:
packet (
_PT) – a flow packet (trace.tcp.packet)
- abstractmethod trace(packet, *, output=False)¶
Trace packets.
- Overloads:
- Parameters:
packet (
_PT) – a flow packet (trace.tcp.packet)output (
bool) – flag if has formatted dumper
- Returns:
If
outputisTrue, returns the initiatedDumperobject, which will dump data to the output file named after the flow label; otherwise, returns the flow label itself.
- finish()¶
Finalise every flow still being traced.
Called by
Extractor._cleanuponce the capture has been read to its end, which is the point at which a flow that was never superseded can be said to be over.The base implementation does nothing, so a tracer that has no such notion need not override it.
submit()must remain able to report a flow that was never finalised, since nothing guarantees this is called: a tracer driven directly rather than through anExtractornever sees an end of capture.Implementations must be idempotent:
Extractor._cleanupcan run more than once for one extraction.
- abstractmethod submit()¶
Submit traced TCP flows.
- Return type:
- Returns:
Traced TCP flow (trace.tcp.index).
- __output__: DefaultDict[str, tuple[ModuleDescriptor[dictdumper.dumper.Dumper] | Type[dictdumper.dumper.Dumper], str | None]]¶
Format dumper mapping for writing output files. Each value pairs the dumper, as a module descriptor or a
dictdumper.dumper.Dumpersubclass, with the file extension of its format.
- _bidir¶
Bidirectional tracing flag. If set to
True, both halves of a conversation share one buffer entry, one label and one output file; otherwise each direction is a flow of its own.- Type:
- _endian¶
Output file byte order.
- Type:
Literal[‘little’, ‘big’]
- _analyse¶
Application-layer analysis flag. If set to
True, each flow reassembles the payload it carries so that itspacketcan be read; otherwise no payload is buffered andpacketisNone.- Type:
- __call__(packet)¶
Dump frame to output files.
- Parameters:
packet (
_PT) – a flow packet (trace.tcp.packet)
- classmethod __init_subclass__(protocol=None, *args, **kwargs)[source]¶
Initialise subclass.
This method is to be used for registering the flow tracing class to
Extractorclass.- Parameters:
- Raises:
UnsupportedCall – If any unrecognised class keyword is given.
- Return type:
Registration is opt-in: the subclass is registered if and only if
protocolis given. This is what lets a subclass decline registration rather than having to inheritTraceFlowBaseto avoid it, and it matchesEnumSchema.__init_subclass__, which guards on its owncodekeyword the same way.Note
__protocol_name__is not an opt-in. It supplies thenamethe class reports, which it does whether or not the class is registered; only the keyword decides registration.See also
For more details, please refer to
pcapkit.foundation.extraction.Extractor.register_traceflow().
- __protocol_type__: Type[ProtocolBase]¶
Protocol of current flow tracing object.
Internal Definitions¶
- class pcapkit.foundation.traceflow.traceflow.TraceFlowBase[_DT, _BT: Info, _IT: Info, _PT: Info](fout, format, byteorder=sys.byteorder, nanosecond=False, bidirectional=True, analyse=False)[source]¶
Bases:
Generic[_DT,_BT,_IT,_PT]Base flow tracing class.
- Parameters:
Note
This class is for internal use only. For customisation, please use
TraceFlowinstead.
- class pcapkit.foundation.traceflow.traceflow.TraceFlowMeta(name, bases, namespace, /, **kwargs)[source]¶
Bases:
ABCMetaMeta class to add dynamic support to
TraceFlow.It provides
TraceFlow.name,TraceFlow.protocolandTraceFlow.registryas class properties, the first two read from__protocol_name__and__protocol_type__where a subclass sets them.
Type Variables¶
- pcapkit.foundation.traceflow.traceflow._BT: pcapkit.corekit.infoclass.Info¶
Buffer data structure.
- pcapkit.foundation.traceflow.traceflow._IT: pcapkit.corekit.infoclass.Info¶
Index data structure.
- pcapkit.foundation.traceflow.traceflow._PT: pcapkit.corekit.infoclass.Info¶
Packet data structure.