pypcapkit 1.3.3.post1__cp313-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pcapkit/__init__.py +126 -0
- pcapkit/__main__.py +138 -0
- pcapkit/all.py +136 -0
- pcapkit/const/__init__.py +81 -0
- pcapkit/const/arp/__init__.py +25 -0
- pcapkit/const/arp/hardware.py +181 -0
- pcapkit/const/arp/operation.py +131 -0
- pcapkit/const/ftp/__init__.py +25 -0
- pcapkit/const/ftp/command.py +309 -0
- pcapkit/const/ftp/return_code.py +304 -0
- pcapkit/const/hip/__init__.py +94 -0
- pcapkit/const/hip/certificate.py +77 -0
- pcapkit/const/hip/cipher.py +65 -0
- pcapkit/const/hip/di.py +59 -0
- pcapkit/const/hip/ecdsa_curve.py +59 -0
- pcapkit/const/hip/ecdsa_low_curve.py +56 -0
- pcapkit/const/hip/eddsa_curve.py +65 -0
- pcapkit/const/hip/esp_transform_suite.py +98 -0
- pcapkit/const/hip/group.py +86 -0
- pcapkit/const/hip/hi_algorithm.py +86 -0
- pcapkit/const/hip/hit_suite.py +68 -0
- pcapkit/const/hip/nat_traversal.py +62 -0
- pcapkit/const/hip/notify_message.py +200 -0
- pcapkit/const/hip/packet.py +89 -0
- pcapkit/const/hip/parameter.py +377 -0
- pcapkit/const/hip/registration.py +68 -0
- pcapkit/const/hip/registration_failure.py +84 -0
- pcapkit/const/hip/suite.py +71 -0
- pcapkit/const/hip/transport.py +59 -0
- pcapkit/const/http/__init__.py +39 -0
- pcapkit/const/http/error_code.py +95 -0
- pcapkit/const/http/frame.py +95 -0
- pcapkit/const/http/method.py +184 -0
- pcapkit/const/http/setting.py +96 -0
- pcapkit/const/http/status_code.py +294 -0
- pcapkit/const/ipv4/__init__.py +57 -0
- pcapkit/const/ipv4/classification_level.py +64 -0
- pcapkit/const/ipv4/option_class.py +55 -0
- pcapkit/const/ipv4/option_number.py +137 -0
- pcapkit/const/ipv4/protection_authority.py +63 -0
- pcapkit/const/ipv4/qs_function.py +51 -0
- pcapkit/const/ipv4/router_alert.py +251 -0
- pcapkit/const/ipv4/tos_del.py +51 -0
- pcapkit/const/ipv4/tos_ecn.py +55 -0
- pcapkit/const/ipv4/tos_pre.py +63 -0
- pcapkit/const/ipv4/tos_rel.py +51 -0
- pcapkit/const/ipv4/tos_thr.py +51 -0
- pcapkit/const/ipv4/ts_flag.py +53 -0
- pcapkit/const/ipv6/__init__.py +53 -0
- pcapkit/const/ipv6/extension_header.py +66 -0
- pcapkit/const/ipv6/option.py +137 -0
- pcapkit/const/ipv6/option_action.py +55 -0
- pcapkit/const/ipv6/qs_function.py +51 -0
- pcapkit/const/ipv6/router_alert.py +266 -0
- pcapkit/const/ipv6/routing.py +80 -0
- pcapkit/const/ipv6/seed_id.py +55 -0
- pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
- pcapkit/const/ipv6/tagger_id.py +62 -0
- pcapkit/const/ipx/__init__.py +27 -0
- pcapkit/const/ipx/packet.py +72 -0
- pcapkit/const/ipx/socket.py +104 -0
- pcapkit/const/l2tp/__init__.py +21 -0
- pcapkit/const/l2tp/type.py +51 -0
- pcapkit/const/mh/__init__.py +204 -0
- pcapkit/const/mh/access_type.py +92 -0
- pcapkit/const/mh/ack_status_code.py +71 -0
- pcapkit/const/mh/ani_suboption.py +74 -0
- pcapkit/const/mh/auth_subtype.py +53 -0
- pcapkit/const/mh/binding_ack_flag.py +66 -0
- pcapkit/const/mh/binding_error.py +51 -0
- pcapkit/const/mh/binding_revocation.py +59 -0
- pcapkit/const/mh/binding_update_flag.py +81 -0
- pcapkit/const/mh/cga_extension.py +66 -0
- pcapkit/const/mh/cga_sec.py +57 -0
- pcapkit/const/mh/cga_type.py +68 -0
- pcapkit/const/mh/dhcp_support_mode.py +53 -0
- pcapkit/const/mh/dns_status_code.py +65 -0
- pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
- pcapkit/const/mh/dsmipv6_home_address.py +74 -0
- pcapkit/const/mh/enumerating_algorithm.py +56 -0
- pcapkit/const/mh/fb_ack_status.py +62 -0
- pcapkit/const/mh/fb_action.py +71 -0
- pcapkit/const/mh/fb_indication_trigger.py +65 -0
- pcapkit/const/mh/fb_type.py +59 -0
- pcapkit/const/mh/flow_id_status.py +77 -0
- pcapkit/const/mh/flow_id_suboption.py +71 -0
- pcapkit/const/mh/handoff_type.py +71 -0
- pcapkit/const/mh/handover_ack_flag.py +54 -0
- pcapkit/const/mh/handover_ack_status.py +92 -0
- pcapkit/const/mh/handover_initiate_flag.py +57 -0
- pcapkit/const/mh/handover_initiate_status.py +62 -0
- pcapkit/const/mh/home_address_reply.py +71 -0
- pcapkit/const/mh/lla_code.py +63 -0
- pcapkit/const/mh/lma_mag_suboption.py +59 -0
- pcapkit/const/mh/mn_group_id.py +59 -0
- pcapkit/const/mh/mn_id_subtype.py +77 -0
- pcapkit/const/mh/operator_id.py +63 -0
- pcapkit/const/mh/option.py +260 -0
- pcapkit/const/mh/packet.py +119 -0
- pcapkit/const/mh/qos_attribute.py +89 -0
- pcapkit/const/mh/revocation_status_code.py +83 -0
- pcapkit/const/mh/revocation_trigger.py +86 -0
- pcapkit/const/mh/status_code.py +232 -0
- pcapkit/const/mh/traffic_selector.py +62 -0
- pcapkit/const/mh/upa_status.py +71 -0
- pcapkit/const/mh/upn_reason.py +80 -0
- pcapkit/const/ospf/__init__.py +27 -0
- pcapkit/const/ospf/authentication.py +65 -0
- pcapkit/const/ospf/packet.py +71 -0
- pcapkit/const/pcapng/__init__.py +51 -0
- pcapkit/const/pcapng/block_type.py +152 -0
- pcapkit/const/pcapng/filter_type.py +48 -0
- pcapkit/const/pcapng/hash_algorithm.py +59 -0
- pcapkit/const/pcapng/option_type.py +233 -0
- pcapkit/const/pcapng/record_type.py +57 -0
- pcapkit/const/pcapng/secrets_type.py +56 -0
- pcapkit/const/pcapng/verdict_type.py +53 -0
- pcapkit/const/reg/__init__.py +34 -0
- pcapkit/const/reg/apptype.py +32702 -0
- pcapkit/const/reg/ethertype.py +714 -0
- pcapkit/const/reg/linktype.py +902 -0
- pcapkit/const/reg/transtype.py +523 -0
- pcapkit/const/tcp/__init__.py +35 -0
- pcapkit/const/tcp/checksum.py +55 -0
- pcapkit/const/tcp/flags.py +73 -0
- pcapkit/const/tcp/mp_tcp_option.py +80 -0
- pcapkit/const/tcp/option.py +198 -0
- pcapkit/const/vlan/__init__.py +23 -0
- pcapkit/const/vlan/priority_level.py +71 -0
- pcapkit/corekit/__init__.py +59 -0
- pcapkit/corekit/fields/__init__.py +45 -0
- pcapkit/corekit/fields/collections.py +282 -0
- pcapkit/corekit/fields/field.py +269 -0
- pcapkit/corekit/fields/ipaddress.py +274 -0
- pcapkit/corekit/fields/misc.py +722 -0
- pcapkit/corekit/fields/numbers.py +375 -0
- pcapkit/corekit/fields/strings.py +245 -0
- pcapkit/corekit/infoclass.py +394 -0
- pcapkit/corekit/io.py +506 -0
- pcapkit/corekit/module.py +39 -0
- pcapkit/corekit/multidict.py +626 -0
- pcapkit/corekit/protochain.py +263 -0
- pcapkit/corekit/version.py +33 -0
- pcapkit/dumpkit/__init__.py +15 -0
- pcapkit/dumpkit/common.py +199 -0
- pcapkit/dumpkit/null.py +77 -0
- pcapkit/dumpkit/pcap.py +144 -0
- pcapkit/foundation/__init__.py +45 -0
- pcapkit/foundation/engines/__init__.py +36 -0
- pcapkit/foundation/engines/dpkt.py +230 -0
- pcapkit/foundation/engines/engine.py +194 -0
- pcapkit/foundation/engines/pcap.py +188 -0
- pcapkit/foundation/engines/pcapng.py +310 -0
- pcapkit/foundation/engines/pyshark.py +166 -0
- pcapkit/foundation/engines/scapy.py +161 -0
- pcapkit/foundation/extraction.py +915 -0
- pcapkit/foundation/reassembly/__init__.py +49 -0
- pcapkit/foundation/reassembly/data/__init__.py +48 -0
- pcapkit/foundation/reassembly/data/ip.py +117 -0
- pcapkit/foundation/reassembly/data/tcp.py +145 -0
- pcapkit/foundation/reassembly/ip.py +192 -0
- pcapkit/foundation/reassembly/ipv4.py +50 -0
- pcapkit/foundation/reassembly/ipv6.py +50 -0
- pcapkit/foundation/reassembly/reassembly.py +389 -0
- pcapkit/foundation/reassembly/tcp.py +249 -0
- pcapkit/foundation/registry/__init__.py +41 -0
- pcapkit/foundation/registry/foundation.py +327 -0
- pcapkit/foundation/registry/protocols.py +885 -0
- pcapkit/foundation/traceflow/__init__.py +44 -0
- pcapkit/foundation/traceflow/data/__init__.py +30 -0
- pcapkit/foundation/traceflow/data/tcp.py +105 -0
- pcapkit/foundation/traceflow/tcp.py +159 -0
- pcapkit/foundation/traceflow/traceflow.py +390 -0
- pcapkit/interface/__init__.py +22 -0
- pcapkit/interface/core.py +185 -0
- pcapkit/interface/misc.py +120 -0
- pcapkit/protocols/__init__.py +85 -0
- pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
- pcapkit/protocols/application/NotImplemented/dns.py +0 -0
- pcapkit/protocols/application/NotImplemented/imap.py +0 -0
- pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
- pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
- pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
- pcapkit/protocols/application/NotImplemented/pop.py +0 -0
- pcapkit/protocols/application/NotImplemented/rip.py +0 -0
- pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/sip.py +0 -0
- pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
- pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
- pcapkit/protocols/application/NotImplemented/tls.py +0 -0
- pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
- pcapkit/protocols/application/__init__.py +34 -0
- pcapkit/protocols/application/application.py +114 -0
- pcapkit/protocols/application/ftp.py +206 -0
- pcapkit/protocols/application/http.py +176 -0
- pcapkit/protocols/application/httpv1.py +320 -0
- pcapkit/protocols/application/httpv2.py +1255 -0
- pcapkit/protocols/data/__init__.py +192 -0
- pcapkit/protocols/data/application/__init__.py +57 -0
- pcapkit/protocols/data/application/ftp.py +59 -0
- pcapkit/protocols/data/application/httpv1.py +79 -0
- pcapkit/protocols/data/application/httpv2.py +293 -0
- pcapkit/protocols/data/data.py +25 -0
- pcapkit/protocols/data/internet/__init__.py +298 -0
- pcapkit/protocols/data/internet/ah.py +31 -0
- pcapkit/protocols/data/internet/hip.py +804 -0
- pcapkit/protocols/data/internet/hopopt.py +351 -0
- pcapkit/protocols/data/internet/ipv4.py +369 -0
- pcapkit/protocols/data/internet/ipv6.py +67 -0
- pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
- pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
- pcapkit/protocols/data/internet/ipv6_route.py +86 -0
- pcapkit/protocols/data/internet/ipx.py +56 -0
- pcapkit/protocols/data/internet/mh.py +509 -0
- pcapkit/protocols/data/link/__init__.py +33 -0
- pcapkit/protocols/data/link/arp.py +74 -0
- pcapkit/protocols/data/link/ethernet.py +28 -0
- pcapkit/protocols/data/link/l2tp.py +63 -0
- pcapkit/protocols/data/link/ospf.py +58 -0
- pcapkit/protocols/data/link/vlan.py +42 -0
- pcapkit/protocols/data/misc/__init__.py +109 -0
- pcapkit/protocols/data/misc/null.py +18 -0
- pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
- pcapkit/protocols/data/misc/pcap/frame.py +56 -0
- pcapkit/protocols/data/misc/pcap/header.py +53 -0
- pcapkit/protocols/data/misc/pcapng.py +925 -0
- pcapkit/protocols/data/misc/raw.py +25 -0
- pcapkit/protocols/data/protocol.py +32 -0
- pcapkit/protocols/data/transport/__init__.py +71 -0
- pcapkit/protocols/data/transport/tcp.py +555 -0
- pcapkit/protocols/data/transport/udp.py +29 -0
- pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
- pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
- pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
- pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
- pcapkit/protocols/internet/__init__.py +43 -0
- pcapkit/protocols/internet/ah.py +275 -0
- pcapkit/protocols/internet/hip.py +4727 -0
- pcapkit/protocols/internet/hopopt.py +1879 -0
- pcapkit/protocols/internet/internet.py +240 -0
- pcapkit/protocols/internet/ip.py +51 -0
- pcapkit/protocols/internet/ipsec.py +50 -0
- pcapkit/protocols/internet/ipv4.py +1782 -0
- pcapkit/protocols/internet/ipv6.py +361 -0
- pcapkit/protocols/internet/ipv6_frag.py +258 -0
- pcapkit/protocols/internet/ipv6_opts.py +1890 -0
- pcapkit/protocols/internet/ipv6_route.py +710 -0
- pcapkit/protocols/internet/ipx.py +230 -0
- pcapkit/protocols/internet/mh.py +2764 -0
- pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
- pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
- pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
- pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
- pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
- pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
- pcapkit/protocols/link/__init__.py +35 -0
- pcapkit/protocols/link/arp.py +421 -0
- pcapkit/protocols/link/ethernet.py +248 -0
- pcapkit/protocols/link/l2tp.py +267 -0
- pcapkit/protocols/link/link.py +140 -0
- pcapkit/protocols/link/ospf.py +342 -0
- pcapkit/protocols/link/rarp.py +82 -0
- pcapkit/protocols/link/vlan.py +225 -0
- pcapkit/protocols/misc/__init__.py +37 -0
- pcapkit/protocols/misc/null.py +129 -0
- pcapkit/protocols/misc/pcap/__init__.py +17 -0
- pcapkit/protocols/misc/pcap/frame.py +478 -0
- pcapkit/protocols/misc/pcap/header.py +358 -0
- pcapkit/protocols/misc/pcapng.py +5520 -0
- pcapkit/protocols/misc/raw.py +180 -0
- pcapkit/protocols/protocol.py +1216 -0
- pcapkit/protocols/schema/__init__.py +140 -0
- pcapkit/protocols/schema/application/__init__.py +40 -0
- pcapkit/protocols/schema/application/ftp.py +21 -0
- pcapkit/protocols/schema/application/httpv1.py +21 -0
- pcapkit/protocols/schema/application/httpv2.py +384 -0
- pcapkit/protocols/schema/internet/__init__.py +294 -0
- pcapkit/protocols/schema/internet/ah.py +40 -0
- pcapkit/protocols/schema/internet/hip.py +1184 -0
- pcapkit/protocols/schema/internet/hopopt.py +679 -0
- pcapkit/protocols/schema/internet/ipv4.py +576 -0
- pcapkit/protocols/schema/internet/ipv6.py +63 -0
- pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
- pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
- pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
- pcapkit/protocols/schema/internet/ipx.py +40 -0
- pcapkit/protocols/schema/internet/mh.py +718 -0
- pcapkit/protocols/schema/link/__init__.py +19 -0
- pcapkit/protocols/schema/link/arp.py +39 -0
- pcapkit/protocols/schema/link/ethernet.py +51 -0
- pcapkit/protocols/schema/link/l2tp.py +88 -0
- pcapkit/protocols/schema/link/ospf.py +90 -0
- pcapkit/protocols/schema/link/vlan.py +69 -0
- pcapkit/protocols/schema/misc/__init__.py +108 -0
- pcapkit/protocols/schema/misc/null.py +18 -0
- pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
- pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
- pcapkit/protocols/schema/misc/pcap/header.py +63 -0
- pcapkit/protocols/schema/misc/pcapng.py +1689 -0
- pcapkit/protocols/schema/misc/raw.py +24 -0
- pcapkit/protocols/schema/schema.py +809 -0
- pcapkit/protocols/schema/transport/__init__.py +69 -0
- pcapkit/protocols/schema/transport/tcp.py +928 -0
- pcapkit/protocols/schema/transport/udp.py +90 -0
- pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
- pcapkit/protocols/transport/__init__.py +27 -0
- pcapkit/protocols/transport/tcp.py +3025 -0
- pcapkit/protocols/transport/transport.py +158 -0
- pcapkit/protocols/transport/udp.py +214 -0
- pcapkit/py.typed +0 -0
- pcapkit/toolkit/__init__.py +57 -0
- pcapkit/toolkit/dpkt.py +306 -0
- pcapkit/toolkit/pcap.py +212 -0
- pcapkit/toolkit/pcapng.py +251 -0
- pcapkit/toolkit/pyshark.py +99 -0
- pcapkit/toolkit/scapy.py +297 -0
- pcapkit/utilities/__init__.py +20 -0
- pcapkit/utilities/compat.py +196 -0
- pcapkit/utilities/decorators.py +192 -0
- pcapkit/utilities/exceptions.py +365 -0
- pcapkit/utilities/logging.py +55 -0
- pcapkit/utilities/warnings.py +185 -0
- pcapkit/vendor/__init__.py +105 -0
- pcapkit/vendor/__main__.py +92 -0
- pcapkit/vendor/arp/__init__.py +27 -0
- pcapkit/vendor/arp/hardware.py +29 -0
- pcapkit/vendor/arp/operation.py +29 -0
- pcapkit/vendor/default.py +474 -0
- pcapkit/vendor/ftp/__init__.py +27 -0
- pcapkit/vendor/ftp/command.py +244 -0
- pcapkit/vendor/ftp/return_code.py +256 -0
- pcapkit/vendor/hip/__init__.py +94 -0
- pcapkit/vendor/hip/certificate.py +29 -0
- pcapkit/vendor/hip/cipher.py +29 -0
- pcapkit/vendor/hip/di.py +29 -0
- pcapkit/vendor/hip/ecdsa_curve.py +29 -0
- pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
- pcapkit/vendor/hip/eddsa_curve.py +85 -0
- pcapkit/vendor/hip/esp_transform_suite.py +29 -0
- pcapkit/vendor/hip/group.py +87 -0
- pcapkit/vendor/hip/hi_algorithm.py +29 -0
- pcapkit/vendor/hip/hit_suite.py +29 -0
- pcapkit/vendor/hip/nat_traversal.py +29 -0
- pcapkit/vendor/hip/notify_message.py +29 -0
- pcapkit/vendor/hip/packet.py +88 -0
- pcapkit/vendor/hip/parameter.py +88 -0
- pcapkit/vendor/hip/registration.py +29 -0
- pcapkit/vendor/hip/registration_failure.py +29 -0
- pcapkit/vendor/hip/suite.py +29 -0
- pcapkit/vendor/hip/transport.py +29 -0
- pcapkit/vendor/http/__init__.py +39 -0
- pcapkit/vendor/http/error_code.py +95 -0
- pcapkit/vendor/http/frame.py +91 -0
- pcapkit/vendor/http/method.py +167 -0
- pcapkit/vendor/http/setting.py +93 -0
- pcapkit/vendor/http/status_code.py +185 -0
- pcapkit/vendor/ipv4/__init__.py +57 -0
- pcapkit/vendor/ipv4/classification_level.py +91 -0
- pcapkit/vendor/ipv4/option_class.py +80 -0
- pcapkit/vendor/ipv4/option_number.py +105 -0
- pcapkit/vendor/ipv4/protection_authority.py +84 -0
- pcapkit/vendor/ipv4/qs_function.py +78 -0
- pcapkit/vendor/ipv4/router_alert.py +93 -0
- pcapkit/vendor/ipv4/tos_del.py +78 -0
- pcapkit/vendor/ipv4/tos_ecn.py +95 -0
- pcapkit/vendor/ipv4/tos_pre.py +84 -0
- pcapkit/vendor/ipv4/tos_rel.py +78 -0
- pcapkit/vendor/ipv4/tos_thr.py +77 -0
- pcapkit/vendor/ipv4/ts_flag.py +79 -0
- pcapkit/vendor/ipv6/__init__.py +53 -0
- pcapkit/vendor/ipv6/extension_header.py +171 -0
- pcapkit/vendor/ipv6/option.py +104 -0
- pcapkit/vendor/ipv6/option_action.py +90 -0
- pcapkit/vendor/ipv6/qs_function.py +78 -0
- pcapkit/vendor/ipv6/router_alert.py +93 -0
- pcapkit/vendor/ipv6/routing.py +87 -0
- pcapkit/vendor/ipv6/seed_id.py +81 -0
- pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
- pcapkit/vendor/ipv6/tagger_id.py +81 -0
- pcapkit/vendor/ipx/__init__.py +37 -0
- pcapkit/vendor/ipx/packet.py +123 -0
- pcapkit/vendor/ipx/socket.py +125 -0
- pcapkit/vendor/l2tp/__init__.py +21 -0
- pcapkit/vendor/l2tp/type.py +78 -0
- pcapkit/vendor/mh/__init__.py +204 -0
- pcapkit/vendor/mh/access_type.py +87 -0
- pcapkit/vendor/mh/ack_status_code.py +88 -0
- pcapkit/vendor/mh/ani_suboption.py +88 -0
- pcapkit/vendor/mh/auth_subtype.py +83 -0
- pcapkit/vendor/mh/binding_ack_flag.py +148 -0
- pcapkit/vendor/mh/binding_error.py +78 -0
- pcapkit/vendor/mh/binding_revocation.py +87 -0
- pcapkit/vendor/mh/binding_update_flag.py +147 -0
- pcapkit/vendor/mh/cga_extension.py +91 -0
- pcapkit/vendor/mh/cga_sec.py +91 -0
- pcapkit/vendor/mh/cga_type.py +74 -0
- pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
- pcapkit/vendor/mh/dns_status_code.py +87 -0
- pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
- pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
- pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
- pcapkit/vendor/mh/fb_ack_status.py +87 -0
- pcapkit/vendor/mh/fb_action.py +88 -0
- pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
- pcapkit/vendor/mh/fb_type.py +88 -0
- pcapkit/vendor/mh/flow_id_status.py +87 -0
- pcapkit/vendor/mh/flow_id_suboption.py +87 -0
- pcapkit/vendor/mh/handoff_type.py +87 -0
- pcapkit/vendor/mh/handover_ack_flag.py +143 -0
- pcapkit/vendor/mh/handover_ack_status.py +87 -0
- pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
- pcapkit/vendor/mh/handover_initiate_status.py +87 -0
- pcapkit/vendor/mh/home_address_reply.py +87 -0
- pcapkit/vendor/mh/lla_code.py +97 -0
- pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
- pcapkit/vendor/mh/mn_group_id.py +87 -0
- pcapkit/vendor/mh/mn_id_subtype.py +87 -0
- pcapkit/vendor/mh/operator_id.py +87 -0
- pcapkit/vendor/mh/option.py +83 -0
- pcapkit/vendor/mh/packet.py +82 -0
- pcapkit/vendor/mh/qos_attribute.py +87 -0
- pcapkit/vendor/mh/revocation_status_code.py +87 -0
- pcapkit/vendor/mh/revocation_trigger.py +87 -0
- pcapkit/vendor/mh/status_code.py +91 -0
- pcapkit/vendor/mh/traffic_selector.py +87 -0
- pcapkit/vendor/mh/upa_status.py +87 -0
- pcapkit/vendor/mh/upn_reason.py +87 -0
- pcapkit/vendor/ospf/__init__.py +27 -0
- pcapkit/vendor/ospf/authentication.py +29 -0
- pcapkit/vendor/ospf/packet.py +29 -0
- pcapkit/vendor/pcapng/__init__.py +51 -0
- pcapkit/vendor/pcapng/block_type.py +94 -0
- pcapkit/vendor/pcapng/filter_type.py +77 -0
- pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
- pcapkit/vendor/pcapng/option_type.py +287 -0
- pcapkit/vendor/pcapng/record_type.py +81 -0
- pcapkit/vendor/pcapng/secrets_type.py +81 -0
- pcapkit/vendor/pcapng/verdict_type.py +79 -0
- pcapkit/vendor/reg/__init__.py +34 -0
- pcapkit/vendor/reg/apptype.py +338 -0
- pcapkit/vendor/reg/ethertype.py +121 -0
- pcapkit/vendor/reg/linktype.py +110 -0
- pcapkit/vendor/reg/transtype.py +111 -0
- pcapkit/vendor/tcp/__init__.py +35 -0
- pcapkit/vendor/tcp/checksum.py +80 -0
- pcapkit/vendor/tcp/flags.py +149 -0
- pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
- pcapkit/vendor/tcp/option.py +103 -0
- pcapkit/vendor/vlan/__init__.py +23 -0
- pcapkit/vendor/vlan/priority_level.py +97 -0
- pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
- pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
- pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
- pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
- pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
- pypcapkit-1.3.3.post1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,263 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Protocol Chain
|
3
|
+
====================
|
4
|
+
|
5
|
+
.. module:: pcapkit.corekit.protochain
|
6
|
+
|
7
|
+
:mod:`pcapkit.corekit.protochain` contains special protocol
|
8
|
+
collection class :class:`~pcapkit.corekit.protochain.ProtoChain`.
|
9
|
+
|
10
|
+
"""
|
11
|
+
import collections.abc
|
12
|
+
import copy
|
13
|
+
from typing import TYPE_CHECKING, overload
|
14
|
+
|
15
|
+
from pcapkit.utilities.compat import cached_property
|
16
|
+
from pcapkit.utilities.exceptions import IndexNotFound
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
from typing import Iterator, Optional, Type
|
20
|
+
|
21
|
+
from typing_extensions import Self
|
22
|
+
|
23
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
24
|
+
|
25
|
+
__all__ = ['ProtoChain']
|
26
|
+
|
27
|
+
|
28
|
+
class ProtoChain(collections.abc.Sequence):
|
29
|
+
"""Protocols chain.
|
30
|
+
|
31
|
+
Args:
|
32
|
+
proto: New protocol class on the top stack.
|
33
|
+
alias: New protocol alias on the top stack.
|
34
|
+
basis: Original protocol chain as base stacks.
|
35
|
+
|
36
|
+
"""
|
37
|
+
|
38
|
+
#: Internal data storage for protocol chain.
|
39
|
+
__data__: 'tuple[tuple[str, Type[Protocol]], ...]'
|
40
|
+
|
41
|
+
##########################################################################
|
42
|
+
# Properties.
|
43
|
+
##########################################################################
|
44
|
+
|
45
|
+
@cached_property
|
46
|
+
def protocols(self) -> 'tuple[Type[Protocol], ...]':
|
47
|
+
"""List of protocols in the chain."""
|
48
|
+
return tuple(data[1] for data in self.__data__)
|
49
|
+
|
50
|
+
@cached_property
|
51
|
+
def aliases(self) -> 'tuple[str, ...]':
|
52
|
+
"""Protocol names."""
|
53
|
+
return tuple(data[0] for data in self.__data__)
|
54
|
+
|
55
|
+
@property
|
56
|
+
def chain(self) -> 'str':
|
57
|
+
"""Protocol chain string."""
|
58
|
+
return self.__str__()
|
59
|
+
|
60
|
+
##########################################################################
|
61
|
+
# Methods.
|
62
|
+
##########################################################################
|
63
|
+
|
64
|
+
@classmethod
|
65
|
+
def from_list(cls, data: 'list[Protocol | Type[Protocol]]') -> 'Self':
|
66
|
+
"""Create a protocol chain from a list.
|
67
|
+
|
68
|
+
Args:
|
69
|
+
data: Protocol chain list.
|
70
|
+
|
71
|
+
"""
|
72
|
+
from pcapkit.protocols.protocol import \
|
73
|
+
ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
|
74
|
+
|
75
|
+
temp_data = []
|
76
|
+
for proto in data:
|
77
|
+
if isinstance(proto, Protocol):
|
78
|
+
alias = proto.alias
|
79
|
+
proto = type(proto)
|
80
|
+
|
81
|
+
temp_data.append((alias, proto))
|
82
|
+
|
83
|
+
obj = cls.__new__(cls)
|
84
|
+
obj.__data__ = tuple(temp_data)
|
85
|
+
return obj
|
86
|
+
|
87
|
+
def index(self, value: 'str | Protocol | Type[Protocol]',
|
88
|
+
start: 'Optional[int]' = None, stop: 'Optional[int]' = None) -> 'int':
|
89
|
+
"""First index of ``value``.
|
90
|
+
|
91
|
+
Args:
|
92
|
+
value: Value to search.
|
93
|
+
start: start offset.
|
94
|
+
stop: stop offset.
|
95
|
+
|
96
|
+
Raises:
|
97
|
+
IndexNotFound: If the value is not present.
|
98
|
+
|
99
|
+
"""
|
100
|
+
if start is None:
|
101
|
+
start = 0
|
102
|
+
elif start < 0:
|
103
|
+
start = max(len(self) + start, 0)
|
104
|
+
|
105
|
+
if stop is not None and stop < 0:
|
106
|
+
stop += len(self)
|
107
|
+
|
108
|
+
# prepare comparison values
|
109
|
+
from pcapkit.protocols.protocol import \
|
110
|
+
ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
|
111
|
+
comp = Protocol.expand_comp(value)
|
112
|
+
|
113
|
+
pool = self.__data__[start:stop]
|
114
|
+
for idx, (alias, proto) in enumerate(pool):
|
115
|
+
test_comp = (proto, alias.upper(), *(name.upper() for name in proto.id()))
|
116
|
+
for test in comp:
|
117
|
+
if test in test_comp:
|
118
|
+
return start + idx
|
119
|
+
raise IndexNotFound(f'{value!r} is not in {self.__class__.__name__!r}')
|
120
|
+
|
121
|
+
def count(self, value: 'str | Protocol | Type[Protocol]') -> int:
|
122
|
+
"""Number of occurrences of ``value``.
|
123
|
+
|
124
|
+
Args:
|
125
|
+
value: Value to search.
|
126
|
+
|
127
|
+
"""
|
128
|
+
# prepare comparison values
|
129
|
+
from pcapkit.protocols.protocol import \
|
130
|
+
ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
|
131
|
+
comp = Protocol.expand_comp(value)
|
132
|
+
|
133
|
+
cnt = 0
|
134
|
+
for alias, proto in self.__data__:
|
135
|
+
test_comp = (proto, alias.upper(), *(name.upper() for name in proto.id()))
|
136
|
+
for test in comp:
|
137
|
+
if test in test_comp:
|
138
|
+
cnt += 1
|
139
|
+
break
|
140
|
+
return cnt
|
141
|
+
|
142
|
+
##########################################################################
|
143
|
+
# Data models.
|
144
|
+
##########################################################################
|
145
|
+
|
146
|
+
def __init__(self, proto: 'Protocol | Type[Protocol]', alias: 'Optional[str]' = None, *,
|
147
|
+
basis: 'Optional[ProtoChain]' = None):
|
148
|
+
"""Initialisation.
|
149
|
+
|
150
|
+
Args:
|
151
|
+
proto: New protocol class on the top stack.
|
152
|
+
alias: New protocol alias on the top stack.
|
153
|
+
basis: Original protocol chain as base stacks.
|
154
|
+
|
155
|
+
"""
|
156
|
+
from pcapkit.protocols.protocol import \
|
157
|
+
ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
|
158
|
+
if isinstance(proto, Protocol):
|
159
|
+
if alias is None:
|
160
|
+
alias = proto.alias
|
161
|
+
proto = type(proto)
|
162
|
+
|
163
|
+
if alias is None:
|
164
|
+
alias = proto.__name__
|
165
|
+
|
166
|
+
temp_data = [(alias, proto)]
|
167
|
+
if basis is not None:
|
168
|
+
temp_data.extend(basis)
|
169
|
+
self.__data__ = tuple(temp_data)
|
170
|
+
|
171
|
+
def __repr__(self) -> 'str':
|
172
|
+
"""Returns representation of protocol chain data.
|
173
|
+
|
174
|
+
Example:
|
175
|
+
>>> protochain
|
176
|
+
ProtoChain(Ethernet, IPv6, Raw)
|
177
|
+
|
178
|
+
"""
|
179
|
+
return f"ProtoChain({', '.join(map(lambda p: p[1].__name__, self.__data__))})"
|
180
|
+
|
181
|
+
def __str__(self) -> 'str':
|
182
|
+
"""Returns formatted hex representation of source data stream.
|
183
|
+
|
184
|
+
Example:
|
185
|
+
>>> protochain
|
186
|
+
ProtoChain(Ethernet, IPv6, Raw)
|
187
|
+
>>> print(protochain)
|
188
|
+
Ethernet:IPv6:Raw
|
189
|
+
|
190
|
+
"""
|
191
|
+
return ':'.join(map(lambda p: p[0], self.__data__))
|
192
|
+
|
193
|
+
def __contains__(self, name: 'str | Protocol | Type[Protocol]') -> 'bool': # type: ignore[override]
|
194
|
+
"""Returns if ``name`` is in the chain.
|
195
|
+
|
196
|
+
Args:
|
197
|
+
name: Name to search.
|
198
|
+
|
199
|
+
Returns:
|
200
|
+
Whether ``name`` is in the chain.
|
201
|
+
|
202
|
+
"""
|
203
|
+
from pcapkit.protocols.protocol import \
|
204
|
+
ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
|
205
|
+
comp = Protocol.expand_comp(name)
|
206
|
+
|
207
|
+
for alias, proto in self.__data__:
|
208
|
+
test_comp = (proto, alias.upper(), *(name.upper() for name in proto.id()))
|
209
|
+
for test in comp:
|
210
|
+
if test in test_comp:
|
211
|
+
return True
|
212
|
+
return False
|
213
|
+
|
214
|
+
@overload
|
215
|
+
def __getitem__(self, index: 'int') -> 'str': ...
|
216
|
+
@overload
|
217
|
+
def __getitem__(self, index: 'slice') -> 'tuple[str, ...]': ...
|
218
|
+
|
219
|
+
def __getitem__(self, index: 'int | slice') -> 'str | tuple[str, ...]':
|
220
|
+
"""Subscription (``getitem``) support.
|
221
|
+
|
222
|
+
Args:
|
223
|
+
index: Indexing key.
|
224
|
+
|
225
|
+
Returns:
|
226
|
+
Protocol alias at such index.
|
227
|
+
|
228
|
+
"""
|
229
|
+
if isinstance(index, slice):
|
230
|
+
return tuple(data[0] for data in self.__data__[index])
|
231
|
+
return self.__data__[index][0]
|
232
|
+
|
233
|
+
def __iter__(self) -> 'Iterator[tuple[str, Type[Protocol]]]':
|
234
|
+
"""Iterator support.
|
235
|
+
|
236
|
+
Returns:
|
237
|
+
Iterator of protocol alias and class.
|
238
|
+
|
239
|
+
"""
|
240
|
+
return iter(self.__data__)
|
241
|
+
|
242
|
+
def __len__(self) -> 'int':
|
243
|
+
"""Length support.
|
244
|
+
|
245
|
+
Returns:
|
246
|
+
Length of protocol chain.
|
247
|
+
|
248
|
+
"""
|
249
|
+
return len(self.__data__)
|
250
|
+
|
251
|
+
def __add__(self, other: 'ProtoChain') -> 'ProtoChain':
|
252
|
+
"""Merge protocol chain by appending protocols from ``other``.
|
253
|
+
|
254
|
+
Args:
|
255
|
+
other: Protocol chain to be merged.
|
256
|
+
|
257
|
+
Returns:
|
258
|
+
Merged protocol chain.
|
259
|
+
|
260
|
+
"""
|
261
|
+
new = copy.copy(self)
|
262
|
+
new.__data__ += other.__data__
|
263
|
+
return new
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Version Info
|
3
|
+
==================
|
4
|
+
|
5
|
+
.. module:: pcapkit.corekit.version
|
6
|
+
|
7
|
+
:mod:`pcapkit.corekit.version` contains :obj:`tuple`
|
8
|
+
like class :class:`~pcapkit.corekit.version.VersionInfo`,
|
9
|
+
which is originally designed alike :class:`sys.version_info`.
|
10
|
+
|
11
|
+
"""
|
12
|
+
import collections
|
13
|
+
|
14
|
+
__all__ = ['VersionInfo']
|
15
|
+
|
16
|
+
|
17
|
+
class VersionInfo(collections.namedtuple('VersionInfo', ['major', 'minor'])):
|
18
|
+
"""VersionInfo is alike :class:`sys.version_info`."""
|
19
|
+
|
20
|
+
__slots__ = ()
|
21
|
+
|
22
|
+
#: Major version.
|
23
|
+
major: int
|
24
|
+
#: Minor version.
|
25
|
+
minor: int
|
26
|
+
|
27
|
+
@property
|
28
|
+
def version(self) -> 'str':
|
29
|
+
"""Return version string."""
|
30
|
+
return f'{self.major}.{self.minor}'
|
31
|
+
|
32
|
+
def __str__(self) -> 'str':
|
33
|
+
return f'{self.major}.{self.minor}'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Dump Utilities
|
3
|
+
====================
|
4
|
+
|
5
|
+
.. module:: pcapkit.dumpkit
|
6
|
+
|
7
|
+
:mod:`pcapkit.dumpkit` is the collection of dumpers for
|
8
|
+
:mod:`pcapkit` implementation, which is alike those described
|
9
|
+
in :mod:`dictdumper`.
|
10
|
+
|
11
|
+
"""
|
12
|
+
from pcapkit.dumpkit.null import NotImplementedIO
|
13
|
+
from pcapkit.dumpkit.pcap import PCAPIO
|
14
|
+
|
15
|
+
__all__ = ['PCAPIO', 'NotImplementedIO']
|
@@ -0,0 +1,199 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Common Utilities
|
3
|
+
======================
|
4
|
+
|
5
|
+
.. module:: pcapkit.dumpkit.common
|
6
|
+
|
7
|
+
:mod:`pcapkit.dumpkit.common` is the collection of common utility
|
8
|
+
functions for :mod:`pcapkit.dumpkit` implementation, which is
|
9
|
+
generally the customised hooks for :class:`dictdumper.Dumper`
|
10
|
+
classes.
|
11
|
+
|
12
|
+
"""
|
13
|
+
import collections
|
14
|
+
import datetime
|
15
|
+
import decimal
|
16
|
+
import enum
|
17
|
+
import ipaddress
|
18
|
+
import tempfile
|
19
|
+
from typing import TYPE_CHECKING
|
20
|
+
|
21
|
+
import aenum
|
22
|
+
import dictdumper.dumper
|
23
|
+
|
24
|
+
from pcapkit.corekit.infoclass import Info
|
25
|
+
from pcapkit.corekit.multidict import MultiDict, OrderedMultiDict
|
26
|
+
from pcapkit.protocols.schema.schema import Schema
|
27
|
+
from pcapkit.utilities.logging import logger
|
28
|
+
|
29
|
+
__all__ = ['make_dumper']
|
30
|
+
|
31
|
+
if TYPE_CHECKING:
|
32
|
+
from typing import Any, DefaultDict, Optional, TextIO, Type
|
33
|
+
|
34
|
+
from dictdumper.dumper import Dumper as ABCDumper
|
35
|
+
from typing_extensions import Literal
|
36
|
+
|
37
|
+
|
38
|
+
class DumperBase(dictdumper.dumper.Dumper):
|
39
|
+
"""Base :class:`~dictdumper.dumper.Dumper` object.
|
40
|
+
|
41
|
+
Note:
|
42
|
+
This class is for internal use only. For customisation, please use
|
43
|
+
:class:`Dumper` instead.
|
44
|
+
|
45
|
+
"""
|
46
|
+
|
47
|
+
|
48
|
+
class Dumper(DumperBase):
|
49
|
+
"""Base :class:`~dictdumper.dumper.Dumper` object.
|
50
|
+
|
51
|
+
This class is a customised :class:`~dictdumper.dumper.Dumper` for the
|
52
|
+
:mod:`pcapkit.dumpkit` implementation, which is generally customised
|
53
|
+
for automatic registration to the
|
54
|
+
:class:`~pcapkit.foundation.extraction.Extractor` and
|
55
|
+
:class:`~pcapkit.foundation.traceflow.traceflow.TraceFlow` output
|
56
|
+
dumper registries.
|
57
|
+
|
58
|
+
"""
|
59
|
+
|
60
|
+
def __init_subclass__(cls, /, fmt: 'Optional[str]' = None,
|
61
|
+
ext: 'Optional[str]' = None, *args: 'Any', **kwargs: 'Any') -> 'None':
|
62
|
+
"""Initialise subclass.
|
63
|
+
|
64
|
+
This method is used to register the subclass to the
|
65
|
+
:class:`~pcapkit.foundation.extraction.Extraction` and
|
66
|
+
:class:`~pcapkit.foundation.traceflow.traceflow.TraceFlow`
|
67
|
+
output dumper registries.
|
68
|
+
|
69
|
+
Args:
|
70
|
+
fmt: Output format to register.
|
71
|
+
ext: Output file extension.
|
72
|
+
*args: Arbitrary positional arguments.
|
73
|
+
**kwargs: Arbitrary keyword arguments.
|
74
|
+
|
75
|
+
If the ``fmt`` is not provided, we will try to get it from the
|
76
|
+
:attr:`~dictdumper.dumper.Dumper.kind` property of the subclass.
|
77
|
+
And if the ``ext`` is not provided, we will infer it from the
|
78
|
+
``fmt``.
|
79
|
+
|
80
|
+
See Also:
|
81
|
+
- :func:`pcapkit.foundation.registry.foundation.register_dumper`
|
82
|
+
- :func:`pcapkit.foundation.registry.foundation.register_extractor_dumper`
|
83
|
+
- :func:`pcapkit.foundation.registry.foundation.register_traceflow_dumper`
|
84
|
+
- :meth:`pcapkit.foundation.extraction.Extractor.register_dumper`
|
85
|
+
- :meth:`pcapkit.foundation.traceflow.traceflow.TraceFlow.register_dumper`
|
86
|
+
|
87
|
+
"""
|
88
|
+
if fmt is None:
|
89
|
+
with tempfile.NamedTemporaryFile() as temp:
|
90
|
+
fmt = cls(temp.name).kind
|
91
|
+
fmt = fmt.lower()
|
92
|
+
|
93
|
+
if ext is None:
|
94
|
+
ext = f'.{fmt}'
|
95
|
+
|
96
|
+
from pcapkit.foundation.extraction import Extractor
|
97
|
+
Extractor.register_dumper(fmt, cls, ext)
|
98
|
+
|
99
|
+
from pcapkit.foundation.traceflow.traceflow import TraceFlow
|
100
|
+
TraceFlow.register_dumper(fmt, cls, ext)
|
101
|
+
|
102
|
+
return super().__init_subclass__()
|
103
|
+
|
104
|
+
|
105
|
+
def make_dumper(output: 'Type[ABCDumper]') -> 'Type[ABCDumper]':
|
106
|
+
"""Create a customised :class:`~dictdumper.dumper.Dumper` object.
|
107
|
+
|
108
|
+
Args:
|
109
|
+
output: Output class to customise.
|
110
|
+
|
111
|
+
Returns:
|
112
|
+
Customised :class:`~dictdumper.dumper.Dumper` object.
|
113
|
+
|
114
|
+
"""
|
115
|
+
class DictDumper(output):
|
116
|
+
"""Customised :class:`~dictdumper.dumper.Dumper` object."""
|
117
|
+
|
118
|
+
def object_hook(self, o: 'Any') -> 'Any':
|
119
|
+
"""Convert content for function call.
|
120
|
+
|
121
|
+
Args:
|
122
|
+
self: Dumper instance.
|
123
|
+
o: object to convert
|
124
|
+
|
125
|
+
Returns:
|
126
|
+
Converted object.
|
127
|
+
|
128
|
+
"""
|
129
|
+
if isinstance(o, decimal.Decimal):
|
130
|
+
return str(o)
|
131
|
+
if isinstance(o, datetime.timedelta):
|
132
|
+
return o.total_seconds()
|
133
|
+
if isinstance(o, (Info, Schema)):
|
134
|
+
return o.to_dict()
|
135
|
+
if isinstance(o, (ipaddress.IPv4Address, ipaddress.IPv6Address)):
|
136
|
+
return str(o)
|
137
|
+
if isinstance(o, (MultiDict, OrderedMultiDict)):
|
138
|
+
temp = collections.defaultdict(list) # type: DefaultDict[str, list[Any]]
|
139
|
+
for key, val in o.items(multi=True):
|
140
|
+
if isinstance(key, (enum.Enum, aenum.Enum)):
|
141
|
+
key = f'{type(key).__name__}::{key.name} [{key.value}]'
|
142
|
+
temp[key].append(val)
|
143
|
+
return temp
|
144
|
+
if isinstance(o, (enum.Enum, aenum.Enum)):
|
145
|
+
addon = {key: val for key, val in o.__dict__.items() if not key.startswith('_')}
|
146
|
+
if addon:
|
147
|
+
return {
|
148
|
+
'enum': f'{type(o).__name__}::{o.name} [{o.value}]',
|
149
|
+
**addon,
|
150
|
+
}
|
151
|
+
return f'{type(o).__name__}::{o.name} [{o.value}]'
|
152
|
+
return super(type(self), self).object_hook(o) # type: ignore[unreachable]
|
153
|
+
|
154
|
+
def default(self, o: 'Any') -> 'Literal["fallback"]': # pylint: disable=unused-argument
|
155
|
+
"""Check content type for function call.
|
156
|
+
|
157
|
+
Args:
|
158
|
+
self: Dumper instance.
|
159
|
+
o: Object to check.
|
160
|
+
|
161
|
+
Returns:
|
162
|
+
Fallback string.
|
163
|
+
|
164
|
+
Notes:
|
165
|
+
This function is a fallback for :meth:`dictdumper.dumper.Dumper.default`.
|
166
|
+
It will be called when :meth:`dictdumper.dumper.Dumper.default` fails
|
167
|
+
to find a suitable function for dumping and it should pair with
|
168
|
+
:func:`pcapkit.dumpkit.common._append_fallback` for use.
|
169
|
+
|
170
|
+
"""
|
171
|
+
return 'fallback'
|
172
|
+
|
173
|
+
def _append_fallback(self, value: 'Any', file: 'TextIO') -> 'None':
|
174
|
+
"""Fallback function for dumping.
|
175
|
+
|
176
|
+
Args:
|
177
|
+
self: Dumper instance.
|
178
|
+
value: Value to dump.
|
179
|
+
file: File object to write.
|
180
|
+
|
181
|
+
Notes:
|
182
|
+
This function is a fallback for :meth:`dictdumper.dumper.Dumper.default`.
|
183
|
+
It will be called when :meth:`dictdumper.dumper.Dumper.default` fails
|
184
|
+
to find a suitable function for dumping and it should pair with
|
185
|
+
:func:`pcapkit.dumpkit.common.default` for use.
|
186
|
+
|
187
|
+
"""
|
188
|
+
if hasattr(value, '__slots__'):
|
189
|
+
new_value = {key: getattr(value, key) for key in value.__slots__}
|
190
|
+
elif hasattr(value, '__dict__'):
|
191
|
+
new_value = vars(value)
|
192
|
+
else:
|
193
|
+
logger.warning('unsupported object type: %s', type(value))
|
194
|
+
new_value = str(value) # type: ignore[assignment]
|
195
|
+
|
196
|
+
func = self._encode_func(new_value)
|
197
|
+
func(new_value, file)
|
198
|
+
|
199
|
+
return DictDumper
|
pcapkit/dumpkit/null.py
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Null Dumper
|
3
|
+
=================
|
4
|
+
|
5
|
+
.. module:: pcapkit.dumper.null
|
6
|
+
|
7
|
+
:mod:`pcapkit.dumpkit.null` is the dumper for :mod:`pcapkit` implementation,
|
8
|
+
specifically for **NotImplemented** format, which is alike those described in
|
9
|
+
:mod:`dictdumper`.
|
10
|
+
|
11
|
+
Notes:
|
12
|
+
This dumper is used when the given format is not supported, as a fallback.
|
13
|
+
It shall not produce any output.
|
14
|
+
|
15
|
+
"""
|
16
|
+
from typing import TYPE_CHECKING
|
17
|
+
|
18
|
+
from pcapkit.dumpkit.common import DumperBase as Dumper
|
19
|
+
|
20
|
+
if TYPE_CHECKING:
|
21
|
+
from typing import IO, Any, Optional
|
22
|
+
|
23
|
+
from typing_extensions import Literal
|
24
|
+
|
25
|
+
__all__ = ['NotImplementedIO']
|
26
|
+
|
27
|
+
|
28
|
+
class NotImplementedIO(Dumper):
|
29
|
+
"""Unspecified output format."""
|
30
|
+
|
31
|
+
##########################################################################
|
32
|
+
# Properties.
|
33
|
+
##########################################################################
|
34
|
+
|
35
|
+
@property
|
36
|
+
def kind(self) -> 'Literal["null"]':
|
37
|
+
"""File format of current dumper."""
|
38
|
+
return 'null'
|
39
|
+
|
40
|
+
##########################################################################
|
41
|
+
# Data models.
|
42
|
+
##########################################################################
|
43
|
+
|
44
|
+
def __call__(self, value: 'dict[str, Any]', name: 'Optional[str]' = None) -> 'NotImplementedIO': # pylint: disable=unused-argument
|
45
|
+
"""Dump a new frame.
|
46
|
+
|
47
|
+
Args:
|
48
|
+
value: content to be dumped
|
49
|
+
name: name of current content block
|
50
|
+
|
51
|
+
Returns:
|
52
|
+
The dumper class itself (to support chain calling).
|
53
|
+
|
54
|
+
"""
|
55
|
+
return self
|
56
|
+
|
57
|
+
##########################################################################
|
58
|
+
# Utilities.
|
59
|
+
##########################################################################
|
60
|
+
|
61
|
+
def _dump_header(self, **kwargs: 'Any') -> 'None': # pylint: disable=unused-argument
|
62
|
+
"""Initially dump file heads and tails.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
**kwargs: arbitrary keyword arguments
|
66
|
+
|
67
|
+
"""
|
68
|
+
|
69
|
+
def _append_value(self, value: 'dict[str, Any]', file: 'IO[bytes]', name: 'str') -> 'None': # pylint: disable=unused-argument
|
70
|
+
"""Call this function to write contents.
|
71
|
+
|
72
|
+
Args:
|
73
|
+
value: content to be dumped
|
74
|
+
file: output file
|
75
|
+
name: name of current content block
|
76
|
+
|
77
|
+
"""
|