Skip to content

Commit 8a9a2a6

Browse files
committed
added registry method to PCAPNG
* added registry interface to foundation * updated docs for registry * updated pcapkit.all
1 parent d021ade commit 8a9a2a6

File tree

5 files changed

+216
-32
lines changed

5 files changed

+216
-32
lines changed

docs/source/pcapkit/foundation/registry.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ Protocol Registries
1414

1515
.. autofunction:: pcapkit.foundation.registry.register_pcap
1616

17+
.. autofunction:: pcapkit.foundation.registry.register_pcapng
18+
1719
Link Layer Registries
1820
---------------------
1921

@@ -49,6 +51,17 @@ Application Layer Registries
4951
Miscellaneous Registries
5052
------------------------
5153

54+
PCAP-NG Registries
55+
~~~~~~~~~~~~~~~~~~
56+
57+
.. autofunction:: pcapkit.foundation.registry.register_pcapng_block
58+
59+
.. autofunction:: pcapkit.foundation.registry.register_pcapng_option
60+
61+
.. autofunction:: pcapkit.foundation.registry.register_pcapng_record
62+
63+
.. autofunction:: pcapkit.foundation.registry.register_pcapng_secrets
64+
5265
Engine Registries
5366
~~~~~~~~~~~~~~~~~
5467

pcapkit/all.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,14 @@
7979

8080
# pcapkit.foundation.registry
8181
'register_protocol',
82-
'register_linktype', 'register_pcap',
82+
'register_linktype', 'register_pcap', 'register_pcapng',
8383
'register_ethertype', 'register_transtype',
8484
'register_port', 'register_tcp_port', 'register_udp_port',
8585
'register_output',
8686
'register_extractor_dumper', 'register_extractor_engine',
8787
'register_traceflow',
88+
'register_pcapng_block', 'register_pcapng_option', 'register_pcapng_secrets',
89+
'register_pcapng_record',
8890
'register_hopopt', 'register_ipv6_opts', 'register_ipv6_route',
8991
'register_ipv4', 'register_hip',
9092
'register_tcp', 'register_mptcp',

pcapkit/foundation/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@
2424

2525
'register_protocol',
2626

27-
'register_linktype', 'register_pcap',
27+
'register_linktype', 'register_pcap', 'register_pcapng',
2828
'register_ethertype', 'register_transtype',
2929
'register_port', 'register_tcp_port', 'register_udp_port',
3030

3131
'register_output',
3232
'register_extractor_dumper', 'register_extractor_engine',
3333
'register_traceflow',
3434

35+
'register_pcapng_block', 'register_pcapng_option', 'register_pcapng_secrets',
36+
'register_pcapng_record',
3537
'register_hopopt', 'register_ipv6_opts', 'register_ipv6_route',
3638
'register_ipv4', 'register_hip',
3739
'register_tcp', 'register_mptcp',

pcapkit/foundation/registry.py

Lines changed: 145 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,17 @@
3131
from pcapkit.protocols.transport.udp import UDP
3232
from pcapkit.utilities.exceptions import RegistryError
3333
from pcapkit.utilities.logging import logger
34+
from pcapkit.protocols.misc.pcapng import PCAPNG
3435

3536
if TYPE_CHECKING:
3637
from typing import Type
3738

3839
from typing_extensions import Literal
3940

41+
from pcapkit.const.pcapng.block_type import BlockType as PCAPNG_BlockType
42+
from pcapkit.const.pcapng.option_type import OptionType as PCAPNG_OptionType
43+
from pcapkit.const.pcapng.secrets_type import SecretsType as PCAPNG_SecretsType
44+
from pcapkit.const.pcapng.record_type import RecordType as PCAPNG_RecordType
4045
from pcapkit.const.hip.parameter import Parameter as HIP_Parameter
4146
from pcapkit.const.http.frame import Frame as HTTP_Frame
4247
from pcapkit.const.ipv4.option_number import OptionNumber as IPv4_OptionNumber
@@ -65,25 +70,36 @@
6570
from pcapkit.protocols.transport.tcp import OptionConstructor as TCP_OptionConstructor
6671
from pcapkit.protocols.transport.tcp import OptionParser as TCP_OptionParser
6772

73+
from pcapkit.protocols.misc.pcapng import BlockParser as PCAPNG_BlockParser
74+
from pcapkit.protocols.misc.pcapng import BlockConstructor as PCAPNG_BlockConstructor
75+
from pcapkit.protocols.misc.pcapng import OptionParser as PCAPNG_OptionParser
76+
from pcapkit.protocols.misc.pcapng import OptionConstructor as PCAPNG_OptionConstructor
77+
from pcapkit.protocols.misc.pcapng import SecretsParser as PCAPNG_SecretsParser
78+
from pcapkit.protocols.misc.pcapng import SecretsConstructor as PCAPNG_SecretsConstructor
79+
from pcapkit.protocols.misc.pcapng import RecordParser as PCAPNG_RecordParser
80+
from pcapkit.protocols.misc.pcapng import RecordConstructor as PCAPNG_RecordConstructor
81+
6882
__all__ = [
6983
'register_protocol',
7084

71-
'register_linktype', 'register_pcap',
85+
'register_linktype', 'register_pcap', 'register_pcapng',
7286
'register_ethertype', 'register_transtype',
7387
'register_port', 'register_tcp_port', 'register_udp_port',
7488

7589
'register_output',
7690
'register_extractor_dumper', 'register_extractor_engine',
7791
'register_traceflow',
7892

93+
'register_pcapng_block', 'register_pcapng_option', 'register_pcapng_secrets',
94+
'register_pcapng_record',
7995
'register_hopopt', 'register_ipv6_opts', 'register_ipv6_route',
8096
'register_ipv4', 'register_hip',
8197
'register_tcp', 'register_mptcp',
8298
'register_http',
8399
]
84100

85101
###############################################################################
86-
# pcapkit.protocols.Protocol.__proto__
102+
# pcapkit.protocols.Protocol
87103
###############################################################################
88104

89105

@@ -106,7 +122,7 @@ def register_protocol(protocol: 'Type[Protocol]') -> 'None':
106122

107123

108124
###############################################################################
109-
# pcapkit.foundation.extraction.Extractor.__output__
125+
# pcapkit.foundation.extraction.Extractor
110126
###############################################################################
111127

112128

@@ -135,11 +151,6 @@ def register_extractor_dumper(format: 'str', module: 'str', class_: 'str', ext:
135151
logger.info('registered extractor output dumper: %s', format)
136152

137153

138-
###############################################################################
139-
# pcapkit.foundation.extraction.Extractor.__engine__
140-
###############################################################################
141-
142-
143154
def register_extractor_engine(engine: 'str', module: 'str', class_: 'str') -> 'None': # pylint: disable=redefined-builtin
144155
r"""Registered a new engine class.
145156
@@ -165,7 +176,7 @@ def register_extractor_engine(engine: 'str', module: 'str', class_: 'str') -> 'N
165176

166177

167178
###############################################################################
168-
# pcapkit.foundation.traceflow.TraceFlow.__output__
179+
# pcapkit.foundation.traceflow.TraceFlow
169180
###############################################################################
170181

171182

@@ -195,7 +206,7 @@ def register_traceflow(format: 'str', module: 'str', class_: 'str', ext: 'str')
195206

196207

197208
###############################################################################
198-
# pcapkit.protocols.application.httpv2.HTTPv2.__frame__
209+
# pcapkit.protocols.application.httpv2.HTTPv2
199210
###############################################################################
200211

201212

@@ -243,7 +254,7 @@ def register_hip(code: 'HIP_Parameter', meth: 'str | tuple[HIP_ParameterParser,
243254

244255

245256
###############################################################################
246-
# pcapkit.protocols.internet.hopopt.HOPOPT.__option__
257+
# pcapkit.protocols.internet.hopopt.HOPOPT
247258
###############################################################################
248259

249260

@@ -267,7 +278,7 @@ def register_hopopt(code: 'IPv6_Option', meth: 'str | tuple[HOPOPT_OptionParser,
267278

268279

269280
###############################################################################
270-
# pcapkit.protocols.internet.internet.Internet.__proto__
281+
# pcapkit.protocols.internet.internet.Internet
271282
###############################################################################
272283

273284

@@ -323,7 +334,7 @@ def register_ipv4(code: 'IPv4_OptionNumber', meth: 'str | tuple[IPv4_OptionParse
323334

324335

325336
###############################################################################
326-
# pcapkit.protocols.internet.ipv6_opts.IPv6_Opts.__option__
337+
# pcapkit.protocols.internet.ipv6_opts.IPv6_Opts
327338
###############################################################################
328339

329340

@@ -347,7 +358,7 @@ def register_ipv6_opts(code: 'IPv6_Option', meth: 'str | tuple[IPv6_Opts_OptionP
347358

348359

349360
###############################################################################
350-
# pcapkit.protocols.internet.ipv6_route.IPv6_Route.__routing__
361+
# pcapkit.protocols.internet.ipv6_route.IPv6_Route
351362
###############################################################################
352363

353364

@@ -371,7 +382,7 @@ def register_ipv6_route(code: 'IPv6_Routing', meth: 'str | tuple[IPv6_Route_Type
371382

372383

373384
###############################################################################
374-
# pcapkit.protocols.link.link.Link.__proto__
385+
# pcapkit.protocols.link.link.Link
375386
###############################################################################
376387

377388

@@ -403,7 +414,7 @@ def register_ethertype(code: 'EtherType', module: str, class_: str) -> 'None':
403414

404415

405416
###############################################################################
406-
# pcapkit.protocols.misc.pcap.frame.Frame.__proto__
417+
# pcapkit.protocols.misc.pcap.frame.Frame
407418
###############################################################################
408419

409420

@@ -428,14 +439,123 @@ def register_pcap(code: 'LinkType', module: str, class_: str) -> 'None':
428439
raise RegistryError('protocol must be a Protocol subclass')
429440

430441
Frame.register(code, module, class_)
431-
logger.info('registered PCAP frame protocol: %s', code.name)
442+
logger.info('registered PCAP linktype protocol: %s', code.name)
443+
444+
# register protocol to protocol registry
445+
register_protocol(protocol)
446+
447+
448+
###############################################################################
449+
# pcapkit.protocols.misc.pcapng.PCAPNG
450+
###############################################################################
451+
452+
453+
def register_pcapng(code: 'LinkType', module: str, class_: str) -> 'None':
454+
r"""Register a new protocol class.
455+
456+
Notes:
457+
The full qualified class name of the new protocol class
458+
should be as ``{module}.{class_}``.
459+
460+
The function will register the given protocol class to the
461+
:data:`pcapkit.protocols.misc.pcapng.PCAPNG.__proto__` registry.
462+
463+
Arguments:
464+
code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType`
465+
module: module name
466+
class\_: class name
467+
468+
"""
469+
protocol = getattr(importlib.import_module(module), class_)
470+
if not issubclass(protocol, Protocol):
471+
raise RegistryError('protocol must be a Protocol subclass')
472+
473+
PCAPNG.register(code, module, class_)
474+
logger.info('registered PCAP-NG linktype protocol: %s', code.name)
432475

433476
# register protocol to protocol registry
434477
register_protocol(protocol)
435478

436479

480+
def register_pcapng_block(code: 'PCAPNG_BlockType', meth: 'str | tuple[PCAPNG_BlockParser, PCAPNG_BlockConstructor]') -> 'None':
481+
"""Registered a block parser.
482+
483+
The function will register the given block parser to the
484+
:data:`pcapkit.protocols.misc.pcapng.PCAPNG.__block__` registry.
485+
486+
Args:
487+
code: :class:`HTTP/2 <pcapkit.protocols.misc.pcapng.PCAPNG>` block type
488+
code as in :class:`~pcapkit.const.pcapng.block_type.BlockType`.
489+
meth: Method name or callable to parse and/or construct the block.
490+
491+
"""
492+
if isinstance(meth, str) and not hasattr(PCAPNG, f'_read_block_{meth}'):
493+
raise RegistryError('method must be a block parser function')
494+
495+
PCAPNG.register_block(code, meth)
496+
logger.info('registered PCAP-NG block parser: %s', code.name)
497+
498+
499+
def register_pcapng_option(code: 'PCAPNG_OptionType', meth: 'str | tuple[PCAPNG_OptionParser, PCAPNG_OptionConstructor]') -> 'None':
500+
"""Registered a option parser.
501+
502+
The function will register the given option parser to the
503+
:data:`pcapkit.protocols.misc.pcapng.PCAPNG.__option__` registry.
504+
505+
Args:
506+
code: :class:`PCAPNG <pcapkit.protocols.misc.pcapng.PCAPNG>` option type
507+
code as in :class:`~pcapkit.const.pcapng.option_type.OptionType`.
508+
meth: Method name or callable to parse and/or construct the option.
509+
510+
"""
511+
if isinstance(meth, str) and not hasattr(PCAPNG, f'_read_option_{meth}'):
512+
raise RegistryError('method must be a option parser function')
513+
514+
PCAPNG.register_option(code, meth)
515+
logger.info('registered PCAP-NG option parser: %s', code.name)
516+
517+
518+
def register_pcapng_record(code: 'PCAPNG_RecordType', meth: 'str | tuple[PCAPNG_RecordParser, PCAPNG_RecordConstructor]') -> 'None':
519+
"""Registered a name resolution record parser.
520+
521+
The function will register the given name resolution record parser to the
522+
:data:`pcapkit.protocols.misc.pcapng.PCAPNG.__record__` registry.
523+
524+
Args:
525+
code: :class:`PCAPNG <pcapkit.protocols.misc.pcapng.PCAPNG>` name
526+
resolution record type code as in :class:`~pcapkit.const.pcapng.record_type.RecordType`.
527+
meth: Method name or callable to parse and/or construct the name
528+
resolution record.
529+
530+
"""
531+
if isinstance(meth, str) and not hasattr(PCAPNG, f'_read_record_{meth}'):
532+
raise RegistryError('method must be a name resolution record parser function')
533+
534+
PCAPNG.register_record(code, meth)
535+
logger.info('registered PCAP-NG name resolution record parser: %s', code.name)
536+
537+
538+
def register_pcapng_secrets(code: 'PCAPNG_SecretsType', meth: 'str | tuple[PCAPNG_SecretsParser, PCAPNG_SecretsConstructor]') -> 'None':
539+
"""Registered a decryption secrets parser.
540+
541+
The function will register the given decryption secrets parser to the
542+
:data:`pcapkit.protocols.misc.pcapng.PCAPNG.__secrets__` registry.
543+
544+
Args:
545+
code: :class:`PCAPNG <pcapkit.protocols.misc.pcapng.PCAPNG>` decryption
546+
secrets type code as in :class:`~pcapkit.const.pcapng.secrets_type.SecretsType`.
547+
meth: Method name or callable to parse and/or construct the decryption secrets.
548+
549+
"""
550+
if isinstance(meth, str) and not hasattr(PCAPNG, f'_read_secrets_{meth}'):
551+
raise RegistryError('method must be a decryption secrets parser function')
552+
553+
PCAPNG.register_secrets(code, meth)
554+
logger.info('registered PCAP-NG decryption secrets parser: %s', code.name)
555+
556+
437557
###############################################################################
438-
# pcapkit.protocols.transport.tcp.TCP.__option__
558+
# pcapkit.protocols.transport.tcp.TCP
439559
###############################################################################
440560

441561

@@ -458,11 +578,6 @@ def register_tcp(code: 'TCP_Option', meth: 'str | tuple[TCP_OptionParser, TCP_Op
458578
logger.info('registered TCP option parser: %s', code.name)
459579

460580

461-
###############################################################################
462-
# pcapkit.protocols.transport.tcp.TCP.__mp_option__
463-
###############################################################################
464-
465-
466581
def register_mptcp(code: 'TCP_MPTCPOption', meth: 'str | tuple[TCP_MPOptionParser, TCP_MPOptionConstructor]') -> 'None':
467582
"""Register an MPTCP option parser.
468583
@@ -482,11 +597,6 @@ def register_mptcp(code: 'TCP_MPTCPOption', meth: 'str | tuple[TCP_MPOptionParse
482597
logger.info('registered MPTCP option parser: %s', code.name)
483598

484599

485-
###############################################################################
486-
# pcapkit.protocols.transport.tcp.TCP.__proto__
487-
###############################################################################
488-
489-
490600
def register_tcp_port(code: 'int', module: str, class_: str) -> 'None':
491601
r"""Register a new protocol class.
492602
@@ -515,7 +625,7 @@ def register_tcp_port(code: 'int', module: str, class_: str) -> 'None':
515625

516626

517627
###############################################################################
518-
# pcapkit.protocols.transport.udp.UDP.__proto__
628+
# pcapkit.protocols.transport.udp.UDP
519629
###############################################################################
520630

521631

@@ -590,10 +700,14 @@ def register_linktype(code: 'LinkType', module: str, class_: str) -> 'None':
590700
should be as ``{module}.{class_}``.
591701
592702
The function will register the given protocol class to the
593-
:data:`pcapkit.protocols.misc.pcap.frame.Frame.__proto__` registry.
703+
following registries:
704+
705+
- :data:`pcapkit.protocols.misc.pcap.frame.Frame.__proto__`
706+
- :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__proto__`
594707
595708
See Also:
596709
* :func:`pcapkit.foundation.registry.register_pcap`
710+
* :func:`pcapkit.foundation.registry.register_pcapng`
597711
598712
Arguments:
599713
code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType`
@@ -606,6 +720,7 @@ def register_linktype(code: 'LinkType', module: str, class_: str) -> 'None':
606720
raise RegistryError('protocol must be a Protocol subclass')
607721

608722
Frame.register(code, module, class_)
723+
PCAPNG.register(code, module, class_)
609724
logger.info('registered linktype protocol: %s', code.name)
610725

611726
# register protocol to protocol registry

0 commit comments

Comments
 (0)