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,390 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# mypy: disable-error-code=dict-item
|
3
|
+
"""Base Class
|
4
|
+
================
|
5
|
+
|
6
|
+
.. module:: pcapkit.foundation.traceflow.traceflow
|
7
|
+
|
8
|
+
:mod:`pcapkit.foundation.traceflow.traceflow` contains
|
9
|
+
:class:`~pcapkit.foundation.traceflow.traceflow.TraceFlow` only,
|
10
|
+
which is an abstract base class for all flow tracing classes.
|
11
|
+
|
12
|
+
"""
|
13
|
+
import abc
|
14
|
+
import collections
|
15
|
+
import os
|
16
|
+
import sys
|
17
|
+
from typing import TYPE_CHECKING, Generic, TypeVar, cast, overload
|
18
|
+
|
19
|
+
from dictdumper.dumper import Dumper
|
20
|
+
|
21
|
+
from pcapkit.corekit.module import ModuleDescriptor
|
22
|
+
from pcapkit.dumpkit.common import make_dumper
|
23
|
+
from pcapkit.protocols import __proto__ as protocol_registry
|
24
|
+
from pcapkit.protocols.misc.raw import Raw
|
25
|
+
from pcapkit.utilities.exceptions import FileExists, RegistryError, stacklevel
|
26
|
+
from pcapkit.utilities.warnings import FileWarning, FormatWarning, RegistryWarning, warn
|
27
|
+
|
28
|
+
__all__ = ['TraceFlow']
|
29
|
+
|
30
|
+
if TYPE_CHECKING:
|
31
|
+
from typing import Any, Callable, DefaultDict, Optional, Type
|
32
|
+
|
33
|
+
from typing_extensions import Literal, Self
|
34
|
+
|
35
|
+
from pcapkit.corekit.infoclass import Info
|
36
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
37
|
+
|
38
|
+
CallbackFn = Callable[['_IT'], None]
|
39
|
+
|
40
|
+
_DT = TypeVar('_DT')
|
41
|
+
_BT = TypeVar('_BT', bound='Info')
|
42
|
+
_IT = TypeVar('_IT', bound='Info')
|
43
|
+
_PT = TypeVar('_PT', bound='Info')
|
44
|
+
|
45
|
+
|
46
|
+
class TraceFlowMeta(abc.ABCMeta):
|
47
|
+
"""Meta class to add dynamic support to :class:`TraceFlow`.
|
48
|
+
|
49
|
+
This meta class is used to generate necessary attributes for the
|
50
|
+
:class:`TraceFlow` class. It can be useful to reduce unnecessary
|
51
|
+
registry calls and simplify the customisation process.
|
52
|
+
|
53
|
+
"""
|
54
|
+
if TYPE_CHECKING:
|
55
|
+
#: Protocol name of current object.
|
56
|
+
__protocol_name__: 'str'
|
57
|
+
#: Protocol of current object.
|
58
|
+
__protocol_type__: 'Type[Protocol]'
|
59
|
+
|
60
|
+
@property
|
61
|
+
def name(cls) -> 'str':
|
62
|
+
"""Protocol name of current object."""
|
63
|
+
if hasattr(cls, '__protocol_name__'):
|
64
|
+
return cls.__protocol_name__
|
65
|
+
return cls.__name__
|
66
|
+
|
67
|
+
@property
|
68
|
+
def protocol(cls) -> 'Type[Protocol]':
|
69
|
+
"""Protocol of current object."""
|
70
|
+
if hasattr(cls, '__protocol_type__'):
|
71
|
+
return cls.__protocol_type__
|
72
|
+
return protocol_registry.get(cls.name.upper(), Raw)
|
73
|
+
|
74
|
+
|
75
|
+
class TraceFlowBase(Generic[_DT, _BT, _IT, _PT], metaclass=TraceFlowMeta):
|
76
|
+
"""Base flow tracing class.
|
77
|
+
|
78
|
+
Arguments:
|
79
|
+
fout: output path
|
80
|
+
format: output format
|
81
|
+
byteorder: output file byte order
|
82
|
+
nanosecond: output nanosecond-resolution file flag
|
83
|
+
|
84
|
+
Note:
|
85
|
+
This class is for internal use only. For customisation, please use
|
86
|
+
:class:`TraceFlow` instead.
|
87
|
+
|
88
|
+
"""
|
89
|
+
if TYPE_CHECKING:
|
90
|
+
#: Protocol name of current reassembly object.
|
91
|
+
__protocol_name__: 'str'
|
92
|
+
#: Protocol of current reassembly object.
|
93
|
+
__protocol_type__: 'Type[Protocol]'
|
94
|
+
|
95
|
+
#: List of callback functions upon reassembled datagram.
|
96
|
+
__callback_fn__: 'list[CallbackFn]'
|
97
|
+
|
98
|
+
# Internal data storage for cached properties.
|
99
|
+
__cached__: 'dict[str, Any]'
|
100
|
+
|
101
|
+
##########################################################################
|
102
|
+
# Defaults.
|
103
|
+
##########################################################################
|
104
|
+
|
105
|
+
#: DefaultDict[str, tuple[ModuleDescriptor[Dumper] | Type[Dumper], str | None]]:
|
106
|
+
#: Format dumper mapping for writing output files. The values should be a
|
107
|
+
#: tuple representing the module name and class name, or a
|
108
|
+
#: :class:`dictdumper.dumper.Dumper` subclass, and corresponding file extension.
|
109
|
+
__output__ = collections.defaultdict(
|
110
|
+
lambda: (ModuleDescriptor('pcapkit.dumpkit', 'NotImplementedIO'), None),
|
111
|
+
{
|
112
|
+
'pcap': (ModuleDescriptor('pcapkit.dumpkit', 'PCAPIO'), '.pcap'),
|
113
|
+
'cap': (ModuleDescriptor('pcapkit.dumpkit', 'PCAPIO'), '.pcap'),
|
114
|
+
'plist': (ModuleDescriptor('dictdumper', 'PLIST'), '.plist'),
|
115
|
+
'xml': (ModuleDescriptor('dictdumper', 'PLIST'), '.plist'),
|
116
|
+
'json': (ModuleDescriptor('dictdumper', 'JSON'), '.json'),
|
117
|
+
'tree': (ModuleDescriptor('dictdumper', 'Tree'), '.txt'),
|
118
|
+
'text': (ModuleDescriptor('dictdumper', 'Text'), '.txt'),
|
119
|
+
'txt': (ModuleDescriptor('dictdumper', 'Tree'), '.txt'),
|
120
|
+
},
|
121
|
+
) # type: DefaultDict[str, tuple[ModuleDescriptor[Dumper] | Type[Dumper], str | None]]
|
122
|
+
|
123
|
+
##########################################################################
|
124
|
+
# Properties.
|
125
|
+
##########################################################################
|
126
|
+
|
127
|
+
@property
|
128
|
+
def name(self) -> 'str':
|
129
|
+
"""Protocol name of current flow tracing object.
|
130
|
+
|
131
|
+
Note:
|
132
|
+
This property is not available as a class
|
133
|
+
attribute.
|
134
|
+
|
135
|
+
"""
|
136
|
+
if hasattr(self, '__protocol_name__'):
|
137
|
+
return self.__protocol_name__
|
138
|
+
return type(self).name # type: ignore[return-value]
|
139
|
+
|
140
|
+
@property
|
141
|
+
def protocol(self) -> 'Type[Protocol]':
|
142
|
+
"""Protocol of current flow tracing object.
|
143
|
+
|
144
|
+
Note:
|
145
|
+
This property is not available as a class
|
146
|
+
attribute.
|
147
|
+
|
148
|
+
"""
|
149
|
+
if hasattr(self, '__protocol_type__'):
|
150
|
+
return self.__protocol_type__
|
151
|
+
return type(self).protocol # type: ignore[return-value]
|
152
|
+
|
153
|
+
@property
|
154
|
+
def index(self) -> 'tuple[_IT, ...]':
|
155
|
+
"""_IT table for traced flow."""
|
156
|
+
if self._buffer:
|
157
|
+
return self.submit()
|
158
|
+
return tuple(self._stream)
|
159
|
+
|
160
|
+
##########################################################################
|
161
|
+
# Methods.
|
162
|
+
##########################################################################
|
163
|
+
|
164
|
+
@classmethod
|
165
|
+
def register_dumper(cls, format: 'str', dumper: 'ModuleDescriptor[Dumper] | Type[Dumper]', ext: 'str') -> 'None':
|
166
|
+
r"""Register a new dumper class.
|
167
|
+
|
168
|
+
Notes:
|
169
|
+
The full qualified class name of the new dumper class
|
170
|
+
should be as ``{dumper.module}.{dumper.name}``.
|
171
|
+
|
172
|
+
Arguments:
|
173
|
+
format: format name
|
174
|
+
dumper: module descriptor or a :class:`dictdumper.dumper.Dumper` subclass
|
175
|
+
ext: file extension
|
176
|
+
|
177
|
+
"""
|
178
|
+
if isinstance(dumper, ModuleDescriptor):
|
179
|
+
dumper = dumper.klass
|
180
|
+
if not issubclass(dumper, Dumper):
|
181
|
+
raise RegistryError(f'dumper must be a Dumper subclass, not {dumper!r}')
|
182
|
+
if format in cls.__output__:
|
183
|
+
warn(f'dumper {format} already registered, overwriting', RegistryWarning)
|
184
|
+
cls.__output__[format] = (dumper, ext)
|
185
|
+
|
186
|
+
@classmethod
|
187
|
+
def register_callback(cls, callback: 'CallbackFn', *, index: 'Optional[int]' = None) -> 'None':
|
188
|
+
"""Register callback function.
|
189
|
+
|
190
|
+
Arguments:
|
191
|
+
callback: callback function, which will be called
|
192
|
+
when reassembled datagram is obtained, with the
|
193
|
+
list of reassembled datagrams as its only argument
|
194
|
+
index: index of datagram to be called
|
195
|
+
|
196
|
+
"""
|
197
|
+
if index is not None:
|
198
|
+
cls.__callback_fn__.insert(index, callback)
|
199
|
+
else:
|
200
|
+
cls.__callback_fn__.append(callback)
|
201
|
+
|
202
|
+
@classmethod
|
203
|
+
def make_fout(cls, fout: 'str' = './tmp', fmt: 'str' = 'pcap') -> 'tuple[Type[Dumper], str | None]':
|
204
|
+
"""Make root path for output.
|
205
|
+
|
206
|
+
Args:
|
207
|
+
fout: root path for output
|
208
|
+
fmt: output format
|
209
|
+
|
210
|
+
Returns:
|
211
|
+
Dumper of specified format and file extension of output file.
|
212
|
+
|
213
|
+
Warns:
|
214
|
+
FormatWarning: If ``fmt`` is not supported.
|
215
|
+
FileWarning: If ``fout`` exists and ``fmt`` is :data:`None`.
|
216
|
+
|
217
|
+
Raises:
|
218
|
+
FileExists: If ``fout`` exists and ``fmt`` is **NOT** :data:`None`.
|
219
|
+
|
220
|
+
"""
|
221
|
+
output, ext = cls.__output__[fmt]
|
222
|
+
if ext is None:
|
223
|
+
warn(f'Unsupported output format: {fmt}; disabled file output feature',
|
224
|
+
FormatWarning, stacklevel=stacklevel())
|
225
|
+
if isinstance(output, ModuleDescriptor):
|
226
|
+
output = output.klass
|
227
|
+
|
228
|
+
try:
|
229
|
+
os.makedirs(fout, exist_ok=True)
|
230
|
+
except FileExistsError as error:
|
231
|
+
if ext is None:
|
232
|
+
warn(error.strerror, FileWarning, stacklevel=stacklevel())
|
233
|
+
else:
|
234
|
+
raise FileExists(*error.args).with_traceback(error.__traceback__)
|
235
|
+
return make_dumper(output), ext
|
236
|
+
|
237
|
+
@abc.abstractmethod
|
238
|
+
def dump(self, packet: '_PT') -> 'None':
|
239
|
+
"""Dump frame to output files.
|
240
|
+
|
241
|
+
Arguments:
|
242
|
+
packet: a flow packet (:term:`trace.tcp.packet`)
|
243
|
+
|
244
|
+
"""
|
245
|
+
|
246
|
+
@overload
|
247
|
+
def trace(self, packet: '_PT', *, output: 'Literal[True]' = ...) -> 'Dumper': ...
|
248
|
+
@overload
|
249
|
+
def trace(self, packet: '_PT', *, output: 'Literal[False]' = ...) -> 'str': ...
|
250
|
+
|
251
|
+
@abc.abstractmethod
|
252
|
+
def trace(self, packet: '_PT', *, output: 'bool' = False) -> 'Dumper | str':
|
253
|
+
"""Trace packets.
|
254
|
+
|
255
|
+
Arguments:
|
256
|
+
packet: a flow packet (:term:`trace.tcp.packet`)
|
257
|
+
output: flag if has formatted dumper
|
258
|
+
|
259
|
+
Returns:
|
260
|
+
If ``output`` is :data:`True`, returns the initiated
|
261
|
+
:class:`~dictdumper.dumper.Dumper` object, which will dump data to
|
262
|
+
the output file named after the flow label; otherwise, returns the
|
263
|
+
flow label itself.
|
264
|
+
|
265
|
+
"""
|
266
|
+
|
267
|
+
@abc.abstractmethod
|
268
|
+
def submit(self) -> 'tuple[_IT, ...]':
|
269
|
+
"""Submit traced TCP flows.
|
270
|
+
|
271
|
+
Returns:
|
272
|
+
Traced TCP flow (:term:`trace.tcp.index`).
|
273
|
+
|
274
|
+
"""
|
275
|
+
|
276
|
+
##########################################################################
|
277
|
+
# Data models.
|
278
|
+
##########################################################################
|
279
|
+
|
280
|
+
def __new__(cls, *args: 'Any', **kwargs: 'Any') -> 'Self': # pylint: disable=unused-argument
|
281
|
+
self = super().__new__(cls)
|
282
|
+
|
283
|
+
# NOTE: Assign this attribute after ``__new__`` to avoid shared memory
|
284
|
+
# reference between instances.
|
285
|
+
self.__cached__ = {}
|
286
|
+
|
287
|
+
return self
|
288
|
+
|
289
|
+
def __init__(self, fout: 'Optional[str]', format: 'Optional[str]', # pylint: disable=redefined-builtin
|
290
|
+
byteorder: 'Literal["little", "big"]' = sys.byteorder,
|
291
|
+
nanosecond: bool = False) -> 'None':
|
292
|
+
"""Initialise instance.
|
293
|
+
|
294
|
+
Arguments:
|
295
|
+
fout: output path
|
296
|
+
format: output format
|
297
|
+
byteorder: output file byte order
|
298
|
+
nanosecond: output nanosecond-resolution file flag
|
299
|
+
|
300
|
+
"""
|
301
|
+
if fout is None:
|
302
|
+
fout = './tmp'
|
303
|
+
if format is None:
|
304
|
+
format = 'pcap'
|
305
|
+
|
306
|
+
#: str: Output root path.
|
307
|
+
self._fproot = fout
|
308
|
+
|
309
|
+
#: dict[_DT, _BT]: Buffer field (:term:`trace.tcp.buffer`).
|
310
|
+
self._buffer = {} # type: dict[_DT, _BT]
|
311
|
+
#: list[_IT]: Stream index (:term:`trace.tcp.index`).
|
312
|
+
self._stream = [] # type: list[_IT]
|
313
|
+
|
314
|
+
#: Literal['little', 'big']: Output file byte order.
|
315
|
+
self._endian = byteorder
|
316
|
+
#: bool: Output nanosecond-resolution file flag.
|
317
|
+
self._nnsecd = nanosecond
|
318
|
+
|
319
|
+
# dump I/O object
|
320
|
+
fio, ext = self.make_fout(fout, format)
|
321
|
+
#: Type[Dumper]: Dumper class.
|
322
|
+
self._foutio = fio
|
323
|
+
#: Optional[str]: Output file extension.
|
324
|
+
self._fdpext = ext
|
325
|
+
|
326
|
+
def __call__(self, packet: '_PT') -> 'None':
|
327
|
+
"""Dump frame to output files.
|
328
|
+
|
329
|
+
Arguments:
|
330
|
+
packet: a flow packet (:term:`trace.tcp.packet`)
|
331
|
+
|
332
|
+
"""
|
333
|
+
# trace frame record
|
334
|
+
self.dump(packet)
|
335
|
+
|
336
|
+
def __init_subclass__(cls) -> 'None':
|
337
|
+
"""Initialise subclass.
|
338
|
+
|
339
|
+
This method is to be used for generating necessary attributes
|
340
|
+
for the :class:`TraceFlow` class. It can be useful to reduce
|
341
|
+
unnecessary registry calls and simplify the customisation process.
|
342
|
+
|
343
|
+
"""
|
344
|
+
cls.__callback_fn__ = []
|
345
|
+
|
346
|
+
|
347
|
+
class TraceFlow(TraceFlowBase[_DT, _BT, _IT, _PT], Generic[_DT, _BT, _IT, _PT]):
|
348
|
+
"""Base flow tracing class.
|
349
|
+
|
350
|
+
Example:
|
351
|
+
|
352
|
+
Use keyword argument ``protocol`` to specify the protocol
|
353
|
+
name at class definition:
|
354
|
+
|
355
|
+
.. code-block:: python
|
356
|
+
|
357
|
+
class MyProtocol(TraceFlow, protocol='my_protocol'):
|
358
|
+
...
|
359
|
+
|
360
|
+
Arguments:
|
361
|
+
fout: output path
|
362
|
+
format: output format
|
363
|
+
byteorder: output file byte order
|
364
|
+
nanosecond: output nanosecond-resolution file flag
|
365
|
+
|
366
|
+
"""
|
367
|
+
|
368
|
+
def __init_subclass__(cls, /, protocol: 'Optional[str]' = None, *args: 'Any', **kwargs: 'Any') -> 'None':
|
369
|
+
"""Initialise subclass.
|
370
|
+
|
371
|
+
This method is to be used for registering the engine class to
|
372
|
+
:class:`~pcapkit.foundation.extraction.Extractor` class.
|
373
|
+
|
374
|
+
Args:
|
375
|
+
name: Protocol name, default to class name.
|
376
|
+
*args: Arbitrary positional arguments.
|
377
|
+
**kwargs: Arbitrary keyword arguments.
|
378
|
+
|
379
|
+
See Also:
|
380
|
+
For more details, please refer to
|
381
|
+
:meth:`pcapkit.foundation.extraction.Extractor.register_traceflow`.
|
382
|
+
|
383
|
+
"""
|
384
|
+
if protocol is None:
|
385
|
+
protocol = cast('str', cls.name)
|
386
|
+
|
387
|
+
from pcapkit.foundation.extraction import Extractor
|
388
|
+
Extractor.register_traceflow(protocol.lower(), cls)
|
389
|
+
|
390
|
+
return super().__init_subclass__()
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# pylint: disable=unused-import
|
3
|
+
"""User Interface
|
4
|
+
====================
|
5
|
+
|
6
|
+
.. module:: pcapkit.interface
|
7
|
+
|
8
|
+
:mod:`pcapkit.interface` defines several user-oriented
|
9
|
+
interfaces, variables, and etc. These interfaces are
|
10
|
+
designed to help and simplify the usage of :mod:`pcapkit`.
|
11
|
+
|
12
|
+
"""
|
13
|
+
|
14
|
+
from pcapkit.interface.core import (APP, DPKT, INET, JSON, LINK, PCAP, PLIST, RAW, TRANS, TREE,
|
15
|
+
PCAPKit, PyShark, Scapy, extract, reassemble, trace)
|
16
|
+
|
17
|
+
__all__ = [
|
18
|
+
'extract', 'reassemble', 'trace', # interface functions
|
19
|
+
'TREE', 'JSON', 'PLIST', 'PCAP', # format macros
|
20
|
+
'LINK', 'INET', 'TRANS', 'APP', 'RAW', # layer macros
|
21
|
+
'DPKT', 'Scapy', 'PyShark', 'PCAPKit', # engine macros
|
22
|
+
]
|
@@ -0,0 +1,185 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Core Interface
|
3
|
+
====================
|
4
|
+
|
5
|
+
.. module:: pcapkit.interface.core
|
6
|
+
|
7
|
+
:mod:`pcapkit.interface.core` defines core user-oriented
|
8
|
+
interfaces, variables, and etc., which wraps around the
|
9
|
+
foundation classes from :mod:`pcapkit.foundation`.
|
10
|
+
|
11
|
+
"""
|
12
|
+
import io
|
13
|
+
import sys
|
14
|
+
from typing import TYPE_CHECKING
|
15
|
+
|
16
|
+
from pcapkit.foundation.extraction import Extractor
|
17
|
+
from pcapkit.foundation.reassembly.ipv4 import IPv4 as IPv4_Reassembly
|
18
|
+
from pcapkit.foundation.reassembly.ipv6 import IPv6 as IPv6_Reassembly
|
19
|
+
from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly
|
20
|
+
from pcapkit.foundation.traceflow.tcp import TCP as TCP_TraceFlow
|
21
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
22
|
+
from pcapkit.utilities.exceptions import FormatError
|
23
|
+
|
24
|
+
if TYPE_CHECKING:
|
25
|
+
from typing import IO, Optional, Type
|
26
|
+
|
27
|
+
from typing_extensions import Literal
|
28
|
+
|
29
|
+
from pcapkit.foundation.extraction import Engines, Formats, Layers, Protocols, VerboseHandler
|
30
|
+
from pcapkit.foundation.reassembly.reassembly import ReassemblyBase as Reassembly
|
31
|
+
from pcapkit.foundation.traceflow.traceflow import TraceFlowBase as TraceFlow
|
32
|
+
|
33
|
+
__all__ = [
|
34
|
+
'extract', 'reassemble', 'trace', # interface functions
|
35
|
+
'TREE', 'JSON', 'PLIST', 'PCAP', # format macros
|
36
|
+
'LINK', 'INET', 'TRANS', 'APP', 'RAW', # layer macros
|
37
|
+
'DPKT', 'Scapy', 'PyShark', 'PCAPKit', # engine macros
|
38
|
+
]
|
39
|
+
|
40
|
+
# output file formats
|
41
|
+
TREE = 'tree'
|
42
|
+
JSON = 'json'
|
43
|
+
PLIST = 'plist'
|
44
|
+
PCAP = 'pcap'
|
45
|
+
|
46
|
+
# layer thresholds
|
47
|
+
RAW = 'none'
|
48
|
+
LINK = 'link'
|
49
|
+
INET = 'internet'
|
50
|
+
TRANS = 'transport'
|
51
|
+
APP = 'application'
|
52
|
+
|
53
|
+
# extraction engines
|
54
|
+
DPKT = 'dpkt'
|
55
|
+
Scapy = 'scapy'
|
56
|
+
PCAPKit = 'default'
|
57
|
+
PyShark = 'pyshark'
|
58
|
+
|
59
|
+
|
60
|
+
def extract(fin: 'Optional[str | IO[bytes]]' = None, fout: 'Optional[str]' = None, format: 'Optional[Formats]' = None, # basic settings # pylint: disable=redefined-builtin
|
61
|
+
auto: 'bool' = True, extension: 'bool' = True, store: 'bool' = True, # internal settings # pylint: disable=line-too-long
|
62
|
+
files: 'bool' = False, nofile: 'bool' = False, verbose: 'bool | VerboseHandler' = False, # output settings # pylint: disable=line-too-long
|
63
|
+
engine: 'Optional[Engines]' = None, layer: 'Optional[Layers] | Type[Protocol]' = None, # extraction settings # pylint: disable=line-too-long
|
64
|
+
protocol: 'Optional[Protocols]' = None, # extraction settings # pylint: disable=line-too-long
|
65
|
+
reassembly: 'bool' = False, reasm_strict: 'bool' = True, reasm_store: 'bool' = True, # reassembly settings # pylint: disable=line-too-long
|
66
|
+
trace: 'bool' = False, trace_fout: 'Optional[str]' = None, trace_format: 'Optional[Formats]' = None, # trace settings # pylint: disable=line-too-long
|
67
|
+
trace_byteorder: 'Literal["big", "little"]' = sys.byteorder, trace_nanosecond: 'bool' = False, # trace settings # pylint: disable=line-too-long
|
68
|
+
ip: 'bool' = False, ipv4: 'bool' = False, ipv6: 'bool' = False, tcp: 'bool' = False, # reassembly/trace settings # pylint: disable=line-too-long
|
69
|
+
buffer_size: 'int' = io.DEFAULT_BUFFER_SIZE, buffer_save: 'bool' = False, buffer_path: 'Optional[str]' = None, # buffer settings # pylint: disable=line-too-long
|
70
|
+
no_eof: 'bool' = False) -> 'Extractor':
|
71
|
+
"""Extract a PCAP file.
|
72
|
+
|
73
|
+
Arguments:
|
74
|
+
fin: file name to be read or a binary IO object;
|
75
|
+
if file not exist, raise :exc:`FileNotFound`
|
76
|
+
fout: file name to be written
|
77
|
+
format: file format of output
|
78
|
+
|
79
|
+
auto: if automatically run till EOF
|
80
|
+
extension: if check and append extensions to output file
|
81
|
+
store: if store extracted packet info
|
82
|
+
|
83
|
+
files: if split each frame into different files
|
84
|
+
nofile: if no output file is to be dumped
|
85
|
+
verbose: a :obj:`bool` value or a function takes the :class:`Extractor`
|
86
|
+
instance and current parsed frame (depends on engine selected) as
|
87
|
+
parameters to print verbose output information
|
88
|
+
|
89
|
+
engine: extraction engine to be used
|
90
|
+
layer: extract til which layer
|
91
|
+
protocol: extract til which protocol
|
92
|
+
|
93
|
+
reassembly: if perform reassembly
|
94
|
+
reasm_strict: if set strict flag for reassembly
|
95
|
+
reasm_store: if store reassembled datagrams
|
96
|
+
|
97
|
+
trace: if trace TCP traffic flows
|
98
|
+
trace_fout: path name for flow tracer if necessary
|
99
|
+
trace_format: output file format of flow tracer
|
100
|
+
trace_byteorder: output file byte order
|
101
|
+
trace_nanosecond: output nanosecond-resolution file flag
|
102
|
+
|
103
|
+
ip: if record data for IPv4 & IPv6 reassembly (must be used with ``reassembly=True``)
|
104
|
+
ipv4: if perform IPv4 reassembly (must be used with ``reassembly=True``)
|
105
|
+
ipv6: if perform IPv6 reassembly (must be used with ``reassembly=True``)
|
106
|
+
tcp: if perform TCP reassembly and/or flow tracing
|
107
|
+
(must be used with ``reassembly=True`` or ``trace=True``)
|
108
|
+
|
109
|
+
buffer_size: buffer size for reading input file (for :class:`~pcapkit.corekit.io.SeekableReader` only)
|
110
|
+
buffer_save: if save buffer to file (for :class:`~pcapkit.corekit.io.SeekableReader` only)
|
111
|
+
buffer_path: path name for buffer file if necessary (for :class:`~pcapkit.corekit.io.SeekableReader` only)
|
112
|
+
|
113
|
+
no_eof: if not raise :exc:`EOFError` when reach EOF
|
114
|
+
|
115
|
+
Returns:
|
116
|
+
An :class:`~pcapkit.foundation.extraction.Extractor` object.
|
117
|
+
|
118
|
+
"""
|
119
|
+
if isinstance(layer, type) and issubclass(layer, Protocol):
|
120
|
+
layer = (layer.__layer__ or 'none').lower() # type: ignore[assignment]
|
121
|
+
|
122
|
+
return Extractor(fin=fin, fout=fout, format=format,
|
123
|
+
store=store, files=files, nofile=nofile,
|
124
|
+
auto=auto, verbose=verbose, extension=extension,
|
125
|
+
engine=engine, layer=layer, protocol=protocol, # type: ignore[arg-type]
|
126
|
+
ip=ip, ipv4=ipv4, ipv6=ipv6, tcp=tcp,
|
127
|
+
reassembly=reassembly, reasm_store=reasm_store, reasm_strict=reasm_strict,
|
128
|
+
trace=trace, trace_fout=trace_fout, trace_format=trace_format,
|
129
|
+
trace_byteorder=trace_byteorder, trace_nanosecond=trace_nanosecond,
|
130
|
+
buffer_size=buffer_size, buffer_path=buffer_path, buffer_save=buffer_save,
|
131
|
+
no_eof=no_eof)
|
132
|
+
|
133
|
+
|
134
|
+
def reassemble(protocol: 'str | Type[Protocol]', strict: 'bool' = False) -> 'Reassembly':
|
135
|
+
"""Reassemble fragmented datagrams.
|
136
|
+
|
137
|
+
Arguments:
|
138
|
+
protocol: protocol to be reassembled
|
139
|
+
strict: if return all datagrams (including those not implemented) when submit
|
140
|
+
|
141
|
+
Returns:
|
142
|
+
A :class:`~pcapkit.foundation.reassembly.reassembly.Reassembly` object of corresponding protocol.
|
143
|
+
|
144
|
+
Raises:
|
145
|
+
FormatError: If ``protocol`` is **NOT** any of IPv4, IPv6 or TCP.
|
146
|
+
|
147
|
+
"""
|
148
|
+
if isinstance(protocol, type) and issubclass(protocol, Protocol):
|
149
|
+
protocol = protocol.id()[0]
|
150
|
+
|
151
|
+
if protocol == 'IPv4':
|
152
|
+
return IPv4_Reassembly(strict=strict)
|
153
|
+
if protocol == 'IPv6':
|
154
|
+
return IPv6_Reassembly(strict=strict)
|
155
|
+
if protocol == 'TCP':
|
156
|
+
return TCP_Reassembly(strict=strict)
|
157
|
+
raise FormatError(f'Unsupported reassembly protocol: {protocol}')
|
158
|
+
|
159
|
+
|
160
|
+
def trace(protocol: 'str | Type[Protocol]', fout: 'Optional[str]',
|
161
|
+
format: 'Optional[str]', # pylint: disable=redefined-builtin
|
162
|
+
byteorder: 'Literal["little", "big"]' = sys.byteorder,
|
163
|
+
nanosecond: bool = False) -> 'TraceFlow':
|
164
|
+
"""Trace flows.
|
165
|
+
|
166
|
+
Arguments:
|
167
|
+
protocol: protocol to be reassembled
|
168
|
+
fout: output path
|
169
|
+
format: output format
|
170
|
+
byteorder: output file byte order
|
171
|
+
nanosecond: output nanosecond-resolution file flag
|
172
|
+
|
173
|
+
Returns:
|
174
|
+
A :class:`~pcapkit.foundation.traceflow.traceflow.TraceFlow` object.
|
175
|
+
|
176
|
+
Raises:
|
177
|
+
FormatError: If ``protocol`` is **NOT** TCP.
|
178
|
+
|
179
|
+
"""
|
180
|
+
if isinstance(protocol, type) and issubclass(protocol, Protocol):
|
181
|
+
protocol = protocol.id()[0]
|
182
|
+
|
183
|
+
if protocol == 'TCP':
|
184
|
+
return TCP_TraceFlow(fout=fout, format=format, byteorder=byteorder, nanosecond=nanosecond)
|
185
|
+
raise FormatError(f'Unsupported flow tracing protocol: {protocol}')
|