Base Class¶
pcapkit.foundation.traceflow.traceflow contains
TraceFlow only,
which is an abstract base class for all flow tracing classes.
- class pcapkit.foundation.traceflow.traceflow.TraceFlow(fout, format, byteorder='little', 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:
See also
For more information on customisation and extension, please refer to Customisation & Extensions.
- property name: str¶
Protocol name of current class.
Note
This property is also available as a class variable. Its value can be set by
__protocol_name__class attribute.
- property protocol: Type[pcapkit.protocols.protocol.ProtocolBase]¶
Protocol of current class.
Note
This property is also available as a class variable. Its value can be set by
__protocol_type__class attribute.
- property registry: python:dict[str, ModuleDescriptor[TraceFlowBase] | typing.Type[TraceFlowBase]]¶
Mapping of protocol names to flow tracing classes.
Note
This property is only available as a class variable, since it is defined on
TraceFlowMeta. It reads__traceflow__, the single table every flow tracing registration lands in, so it is not a per-class mapping. It is not__output__, which is the separate output-dumper table this class also owns.
- classmethod register_dumper(format, dumper, ext)¶
Register a new dumper class.
Notes
The full qualified class name of the new dumper class should be as
{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 GitHub issue #718 gave the code-keyed registrars, extended here by GitHub issue #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 the other three registrars this issue touches;dict.get()does not invoke the default factory the waycls.__output__[format]would, so it stays non-inserting here as well.- Parameters:
format (
str) – format namedumper (
ModuleDescriptor[Dumper] |Type[Dumper]) – module descriptor or adictdumper.dumper.Dumpersubclassext (
str) – file extension
- classmethod register_callback(callback, *, index=None)¶
Register callback function.
- 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 – If
fmtis not supported.FileWarning – If
foutexists andfmtisNone.
- Raises:
FileExists – If
foutexists andfmtis NOTNone.
- abstractmethod dump(packet)¶
Dump frame to output files.
- Parameters:
packet (
TypeVar(_PT, bound= Info)) – a flow packet (trace.tcp.packet)
- abstractmethod trace(packet, *, output=False)¶
Trace packets.
- Overloads:
self, packet (_PT), output (Literal[True]) → Dumper
self, packet (_PT), output (Literal[False]) → str
- Parameters:
packet (
TypeVar(_PT, bound= Info)) – 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 – or an existing third-party subclass that predates this method – keeps working unchanged.
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[Dumper] | Type[Dumper], str | None]]¶
DefaultDict[str, tuple[ModuleDescriptor[Dumper] | ~typing.Type[Dumper], str | None]]: Format dumper mapping for writing output files. The values should be a tuple representing the module name and class name, or a
dictdumper.dumper.Dumpersubclass, and corresponding file extension.
- _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 (
TypeVar(_PT, bound= Info)) – 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.
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 has guarded on its owncodekeyword all along.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 reassembly object.
Internal Definitions¶
- class pcapkit.foundation.traceflow.traceflow.TraceFlowBase(fout, format, byteorder='little', 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.This meta class is used to generate necessary attributes for the
TraceFlowclass. It can be useful to reduce unnecessary registry calls and simplify the customisation process.
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.