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,474 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Base Crawler
|
3
|
+
==================
|
4
|
+
|
5
|
+
.. module:: pcapkit.vendor.default
|
6
|
+
|
7
|
+
:mod:`pcapkit.vendor.default` contains :class:`~pcapkit.vendor.default.Vendor`
|
8
|
+
only, which is the base meta class for all vendor crawlers.
|
9
|
+
|
10
|
+
"""
|
11
|
+
import abc
|
12
|
+
import collections
|
13
|
+
import contextlib
|
14
|
+
import csv
|
15
|
+
import inspect
|
16
|
+
import os
|
17
|
+
import re
|
18
|
+
import tempfile
|
19
|
+
import textwrap
|
20
|
+
import webbrowser
|
21
|
+
from typing import TYPE_CHECKING
|
22
|
+
|
23
|
+
import requests
|
24
|
+
|
25
|
+
from pcapkit.utilities.exceptions import VendorNotImplemented
|
26
|
+
from pcapkit.utilities.logging import BOOLEAN_STATES
|
27
|
+
from pcapkit.utilities.warnings import VendorRequestWarning, warn
|
28
|
+
|
29
|
+
if TYPE_CHECKING:
|
30
|
+
from collections import Counter
|
31
|
+
from typing import Callable, Optional
|
32
|
+
|
33
|
+
__all__ = ['Vendor']
|
34
|
+
|
35
|
+
MAX_RETRY = int(os.environ.get('PCAPKIT_VENDOR_RETRY', 5)) or 1
|
36
|
+
CI_MODE = BOOLEAN_STATES.get(os.environ.get('PCAPKIT_CI_MODE', 'false').casefold(), False)
|
37
|
+
|
38
|
+
#: Default constant template of enumerate registry from IANA CSV.
|
39
|
+
LINE = lambda NAME, DOCS, FLAG, ENUM, MISS, MODL: f'''\
|
40
|
+
# -*- coding: utf-8 -*-
|
41
|
+
# pylint: disable=line-too-long,consider-using-f-string
|
42
|
+
"""{(name := DOCS.split(' [', maxsplit=1)[0])}
|
43
|
+
{'=' * (len(name) + 6)}
|
44
|
+
|
45
|
+
.. module:: {MODL.replace('vendor', 'const')}
|
46
|
+
|
47
|
+
This module contains the constant enumeration for **{name}**,
|
48
|
+
which is automatically generated from :class:`{MODL}.{NAME}`.
|
49
|
+
|
50
|
+
"""
|
51
|
+
|
52
|
+
from aenum import IntEnum, extend_enum
|
53
|
+
|
54
|
+
__all__ = ['{NAME}']
|
55
|
+
|
56
|
+
|
57
|
+
class {NAME}(IntEnum):
|
58
|
+
"""[{NAME}] {DOCS}"""
|
59
|
+
|
60
|
+
{ENUM}
|
61
|
+
|
62
|
+
@staticmethod
|
63
|
+
def get(key: 'int | str', default: 'int' = -1) -> '{NAME}':
|
64
|
+
"""Backport support for original codes.
|
65
|
+
|
66
|
+
Args:
|
67
|
+
key: Key to get enum item.
|
68
|
+
default: Default value if not found.
|
69
|
+
|
70
|
+
:meta private:
|
71
|
+
"""
|
72
|
+
if isinstance(key, int):
|
73
|
+
return {NAME}(key)
|
74
|
+
if key not in {NAME}._member_map_: # pylint: disable=no-member
|
75
|
+
return extend_enum({NAME}, key, default)
|
76
|
+
return {NAME}[key] # type: ignore[misc]
|
77
|
+
|
78
|
+
@classmethod
|
79
|
+
def _missing_(cls, value: 'int') -> '{NAME}':
|
80
|
+
"""Lookup function used when value is not found.
|
81
|
+
|
82
|
+
Args:
|
83
|
+
value: Value to get enum item.
|
84
|
+
|
85
|
+
"""
|
86
|
+
if not ({FLAG}):
|
87
|
+
raise ValueError('%r is not a valid %s' % (value, cls.__name__))
|
88
|
+
{MISS}
|
89
|
+
{'' if (test := ''.join(MISS.splitlines()[-1:])).startswith('return') or test[8:].startswith('return') else 'return super()._missing_(value)'}
|
90
|
+
'''.strip() # type: Callable[[str, str, str, str, str, str], str]
|
91
|
+
|
92
|
+
|
93
|
+
def get_proxies() -> 'dict[str, str]':
|
94
|
+
"""Get proxy for blocked sites.
|
95
|
+
|
96
|
+
The function will read :envvar:`PCAPKIT_HTTP_PROXY`
|
97
|
+
and :envvar:`PCAPKIT_HTTPS_PROXY`, if any, for the
|
98
|
+
proxy settings of |requests|_.
|
99
|
+
|
100
|
+
.. |requests| replace:: ``requests``
|
101
|
+
.. _requests: https://requests.readthedocs.io
|
102
|
+
|
103
|
+
Returns:
|
104
|
+
Proxy settings for |requests|_.
|
105
|
+
|
106
|
+
"""
|
107
|
+
HTTP_PROXY = os.getenv('PCAPKIT_HTTP_PROXY')
|
108
|
+
HTTPS_PROXY = os.getenv('PCAPKIT_HTTPS_PROXY')
|
109
|
+
PROXIES = {} # type: dict[str, str]
|
110
|
+
if HTTP_PROXY is not None:
|
111
|
+
PROXIES['http'] = HTTP_PROXY
|
112
|
+
if HTTPS_PROXY is not None:
|
113
|
+
PROXIES['https'] = HTTPS_PROXY
|
114
|
+
return PROXIES
|
115
|
+
|
116
|
+
|
117
|
+
class VendorMeta(abc.ABCMeta):
|
118
|
+
"""Meta class to add dynamic support to :class:`Vendor`.
|
119
|
+
|
120
|
+
This meta class is used to generate necessary attributes for the
|
121
|
+
:class:`Vendor` class. It can be useful to reduce unnecessary
|
122
|
+
registry calls and simplify the customisation process.
|
123
|
+
|
124
|
+
"""
|
125
|
+
|
126
|
+
|
127
|
+
class Vendor(metaclass=VendorMeta):
|
128
|
+
"""Default vendor generator.
|
129
|
+
|
130
|
+
Inherit this class with :attr:`~Vendor.FLAG` &
|
131
|
+
:attr:`~Vendor.LINK` attributes, etc., to implement
|
132
|
+
a new vendor generator.
|
133
|
+
|
134
|
+
"""
|
135
|
+
###############
|
136
|
+
# Macros
|
137
|
+
###############
|
138
|
+
|
139
|
+
#: Name of constant enumeration.
|
140
|
+
NAME: 'str'
|
141
|
+
#: Docstring of constant enumeration.
|
142
|
+
DOCS: 'str'
|
143
|
+
|
144
|
+
#: Value limit checker.
|
145
|
+
FLAG: 'str' = None # type: ignore[assignment]
|
146
|
+
#: Link to registry.
|
147
|
+
LINK: 'str' = None # type: ignore[assignment]
|
148
|
+
|
149
|
+
###############
|
150
|
+
# Processors
|
151
|
+
###############
|
152
|
+
|
153
|
+
@staticmethod
|
154
|
+
def wrap_comment(text: 'str') -> 'str':
|
155
|
+
"""Wraps long-length text to shorter lines of comments.
|
156
|
+
|
157
|
+
Args:
|
158
|
+
text: Source text.
|
159
|
+
|
160
|
+
Returns:
|
161
|
+
Wrapped comments.
|
162
|
+
|
163
|
+
"""
|
164
|
+
return '\n #: '.join(textwrap.wrap(text.strip(), 76))
|
165
|
+
|
166
|
+
def safe_name(self, name: 'str') -> 'str':
|
167
|
+
"""Convert enumeration name to :class:`enum.Enum` friendly.
|
168
|
+
|
169
|
+
Args:
|
170
|
+
name: original enumeration name
|
171
|
+
|
172
|
+
Returns:
|
173
|
+
Converted enumeration name.
|
174
|
+
|
175
|
+
"""
|
176
|
+
temp = '_'.join(
|
177
|
+
filter(
|
178
|
+
None,
|
179
|
+
re.sub(
|
180
|
+
r'\W',
|
181
|
+
'_',
|
182
|
+
'_'.join(
|
183
|
+
re.sub(
|
184
|
+
r'\(.*\)',
|
185
|
+
'',
|
186
|
+
name
|
187
|
+
).split(),
|
188
|
+
),
|
189
|
+
).split('_')
|
190
|
+
)
|
191
|
+
)
|
192
|
+
if temp.isidentifier():
|
193
|
+
return temp
|
194
|
+
return f'{self.NAME}_{temp}'
|
195
|
+
|
196
|
+
def rename(self, name: 'str', code: 'str', *, original: 'Optional[str]' = None) -> 'str': # pylint: disable=redefined-outer-name
|
197
|
+
"""Rename duplicated fields.
|
198
|
+
|
199
|
+
Args:
|
200
|
+
name: Field name.
|
201
|
+
code: Field code.
|
202
|
+
original: Original field name (extracted from CSV records).
|
203
|
+
|
204
|
+
Returns:
|
205
|
+
Revised field name.
|
206
|
+
|
207
|
+
Example:
|
208
|
+
If ``name`` has multiple occurrences in the source registry,
|
209
|
+
the field name will be sanitised as ``${name}_${code}``.
|
210
|
+
|
211
|
+
Otherwise, the plain ``name`` will be returned.
|
212
|
+
|
213
|
+
"""
|
214
|
+
index = original or name
|
215
|
+
if self.record[self.safe_name(index)] > 1 or self.safe_name(index).upper() in ['RESERVED', 'UNASSIGNED']:
|
216
|
+
name = f'{name}_{code}'
|
217
|
+
return self.safe_name(name)
|
218
|
+
|
219
|
+
def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
|
220
|
+
"""Process CSV data.
|
221
|
+
|
222
|
+
Args:
|
223
|
+
data: CSV data.
|
224
|
+
|
225
|
+
Returns:
|
226
|
+
Enumeration fields and missing fields.
|
227
|
+
|
228
|
+
"""
|
229
|
+
reader = csv.reader(data)
|
230
|
+
next(reader)
|
231
|
+
|
232
|
+
enum = [] # type: list[str]
|
233
|
+
miss = [] # type: list[str]
|
234
|
+
for item in reader:
|
235
|
+
name = item[1]
|
236
|
+
rfcs = item[2]
|
237
|
+
|
238
|
+
temp = [] # type: list[str]
|
239
|
+
for rfc in filter(None, re.split(r'\[|\]', rfcs)):
|
240
|
+
if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
|
241
|
+
#temp.append(f'[{rfc[:3]} {rfc[3:]}]')
|
242
|
+
temp_split = rfc[3:].split(', ', maxsplit=1)
|
243
|
+
if len(temp_split) > 1:
|
244
|
+
temp.append(f'[:rfc:`{temp_split[0]}#{temp_split[1].lower()}`]'.replace(' ', '-'))
|
245
|
+
else:
|
246
|
+
temp.append(f'[:rfc:`{temp_split[0]}`]')
|
247
|
+
else:
|
248
|
+
temp.append(f'[{rfc}]'.replace('_', ' '))
|
249
|
+
desc = self.wrap_comment(re.sub(r'\r*\n', ' ', '%s %s' % ( # pylint: disable=consider-using-f-string
|
250
|
+
name, ''.join(temp) if rfcs else '',
|
251
|
+
), re.MULTILINE))
|
252
|
+
|
253
|
+
try:
|
254
|
+
code, _ = item[0], int(item[0])
|
255
|
+
renm = self.rename(name, code)
|
256
|
+
|
257
|
+
pres = f'{renm} = {code}'
|
258
|
+
sufs = f'#: {desc}'
|
259
|
+
|
260
|
+
#if len(pres) > 74:
|
261
|
+
# sufs = f"\n{' '*80}{sufs}"
|
262
|
+
|
263
|
+
#enum.append(f'{pres.ljust(76)}{sufs}')
|
264
|
+
enum.append(f'{sufs}\n {pres}')
|
265
|
+
except ValueError:
|
266
|
+
start, stop = item[0].split('-')
|
267
|
+
|
268
|
+
miss.append(f'if {start} <= value <= {stop}:')
|
269
|
+
miss.append(f' #: {desc}')
|
270
|
+
miss.append(f" return extend_enum(cls, '{self.safe_name(name)}_%d' % value, value)")
|
271
|
+
return enum, miss
|
272
|
+
|
273
|
+
def count(self, data: 'list[str]') -> 'Counter[str]':
|
274
|
+
"""Count field records.
|
275
|
+
|
276
|
+
Args:
|
277
|
+
data: CSV data.
|
278
|
+
|
279
|
+
Returns:
|
280
|
+
Field recordings.
|
281
|
+
|
282
|
+
"""
|
283
|
+
reader = csv.reader(data)
|
284
|
+
next(reader) # header
|
285
|
+
return collections.Counter(map(lambda item: self.safe_name(item[1]),
|
286
|
+
filter(lambda item: len(item[0].split('-')) != 2, reader)))
|
287
|
+
|
288
|
+
def context(self, data: 'list[str]') -> 'str':
|
289
|
+
"""Generate constant context.
|
290
|
+
|
291
|
+
Args:
|
292
|
+
data: CSV data.
|
293
|
+
|
294
|
+
Returns:
|
295
|
+
Constant context.
|
296
|
+
|
297
|
+
"""
|
298
|
+
enum, miss = self.process(data)
|
299
|
+
|
300
|
+
ENUM = '\n\n '.join(map(lambda s: s.rstrip(), enum)).strip()
|
301
|
+
MISS = '\n '.join(map(lambda s: s.rstrip(), miss)).strip()
|
302
|
+
|
303
|
+
return LINE(self.NAME, self.DOCS, self.FLAG, ENUM, MISS, self.__module__)
|
304
|
+
|
305
|
+
def request(self, text: 'Optional[str]' = None) -> 'list[str]':
|
306
|
+
"""Fetch CSV file.
|
307
|
+
|
308
|
+
Args:
|
309
|
+
text: Context from :attr:`~Vendor.LINK`.
|
310
|
+
|
311
|
+
Returns:
|
312
|
+
CSV data.
|
313
|
+
|
314
|
+
"""
|
315
|
+
if text is None:
|
316
|
+
return []
|
317
|
+
return text.strip().split('\r\n')
|
318
|
+
|
319
|
+
###############
|
320
|
+
# Defaults
|
321
|
+
###############
|
322
|
+
|
323
|
+
def __new__(cls) -> 'Vendor':
|
324
|
+
"""Subclassing checkpoint.
|
325
|
+
|
326
|
+
Raises:
|
327
|
+
VendorNotImplemented: If ``cls`` is not a subclass of
|
328
|
+
:class:`~pcapkit.vendor.default.Vendor`.
|
329
|
+
|
330
|
+
"""
|
331
|
+
if cls is Vendor:
|
332
|
+
raise VendorNotImplemented('cannot initiate Vendor instance')
|
333
|
+
return super().__new__(cls)
|
334
|
+
|
335
|
+
def __init__(self) -> 'None':
|
336
|
+
"""Generate new constant files."""
|
337
|
+
#: Name of constant enumeration.
|
338
|
+
self.NAME = type(self).__name__
|
339
|
+
#: Docstring of constant enumeration.
|
340
|
+
self.DOCS = type(self).__doc__ # type: ignore[assignment]
|
341
|
+
|
342
|
+
data = self._request()
|
343
|
+
self.record = self.count(data)
|
344
|
+
|
345
|
+
temp_ctx = [] # type: list[str]
|
346
|
+
orig_ctx = self.context(data)
|
347
|
+
for line in orig_ctx.splitlines():
|
348
|
+
if line:
|
349
|
+
if line.strip():
|
350
|
+
temp_ctx.append(line.rstrip())
|
351
|
+
else:
|
352
|
+
temp_ctx.append(line)
|
353
|
+
context = '\n'.join(temp_ctx)
|
354
|
+
|
355
|
+
temp, FILE = os.path.split(os.path.abspath(inspect.getfile(type(self))))
|
356
|
+
ROOT, STEM = os.path.split(temp)
|
357
|
+
|
358
|
+
os.makedirs(os.path.join(ROOT, '..', 'const', STEM), exist_ok=True)
|
359
|
+
with open(os.path.join(ROOT, '..', 'const', STEM, FILE), 'w') as file: # pylint: disable=unspecified-encoding
|
360
|
+
print(context, file=file)
|
361
|
+
|
362
|
+
def _request(self) -> 'list[str]':
|
363
|
+
"""Fetch CSV data from :attr:`~Vendor.LINK`.
|
364
|
+
|
365
|
+
This is the low-level call of :meth:`~Vendor.request`.
|
366
|
+
|
367
|
+
If :attr:`~Vendor.LINK` is ``None``, it will directly
|
368
|
+
call the upper method :meth:`~Vendor.request` with **NO**
|
369
|
+
arguments.
|
370
|
+
|
371
|
+
The method will first try to *GET* the content of :attr:`~Vendor.LINK`.
|
372
|
+
Should any exception raised, it will first try with proxy settings from
|
373
|
+
:func:`~pcapkit.vendor.default.get_proxies`.
|
374
|
+
|
375
|
+
.. note::
|
376
|
+
|
377
|
+
Since some :attr:`~Vendor.LINK` links are from Wikipedia, etc., they
|
378
|
+
might not be available in certain areas, e.g. the amazing PRC :)
|
379
|
+
|
380
|
+
Would proxies failed again, it will prompt for user intervention, i.e.
|
381
|
+
it will use :func:`webbrowser.open` to open the page in browser for you, and
|
382
|
+
you can manually load that page and save the HTML source at the location
|
383
|
+
it provides.
|
384
|
+
|
385
|
+
Returns:
|
386
|
+
CSV data.
|
387
|
+
|
388
|
+
Warns:
|
389
|
+
VendorRequestWarning: If connection failed with and/or without proxies.
|
390
|
+
|
391
|
+
See Also:
|
392
|
+
:meth:`~Vendor.request`
|
393
|
+
|
394
|
+
"""
|
395
|
+
if self.LINK is None:
|
396
|
+
return self.request() # type: ignore[unreachable]
|
397
|
+
|
398
|
+
try:
|
399
|
+
counter = 1
|
400
|
+
while True:
|
401
|
+
if counter > MAX_RETRY:
|
402
|
+
raise requests.exceptions.RequestException
|
403
|
+
|
404
|
+
page = requests.get(self.LINK) # nosec: B113
|
405
|
+
if not page.ok or not page.text:
|
406
|
+
warn(f'Connection failed; retry for {counter}/{MAX_RETRY}...',
|
407
|
+
VendorRequestWarning, stacklevel=2)
|
408
|
+
|
409
|
+
counter += 1
|
410
|
+
continue
|
411
|
+
break
|
412
|
+
except requests.RequestException:
|
413
|
+
warn('Connection failed; retry with proxies (if any)...',
|
414
|
+
VendorRequestWarning, stacklevel=2)
|
415
|
+
|
416
|
+
try:
|
417
|
+
proxies = get_proxies() or None
|
418
|
+
if proxies is None:
|
419
|
+
raise
|
420
|
+
|
421
|
+
counter = 1
|
422
|
+
while True:
|
423
|
+
if counter > MAX_RETRY:
|
424
|
+
raise
|
425
|
+
|
426
|
+
page = requests.get(self.LINK, proxies=proxies) # nosec: B113
|
427
|
+
if not page.ok or not page.text:
|
428
|
+
warn(f'Connection failed; retry with proxy for {counter}/{MAX_RETRY}...',
|
429
|
+
VendorRequestWarning, stacklevel=2)
|
430
|
+
|
431
|
+
counter += 1
|
432
|
+
continue
|
433
|
+
break
|
434
|
+
except requests.RequestException:
|
435
|
+
if CI_MODE:
|
436
|
+
warn('Connection failed; exit on CI mode...',
|
437
|
+
VendorRequestWarning, stacklevel=2)
|
438
|
+
raise
|
439
|
+
|
440
|
+
warn('Connection failed; retry with manual intervene...',
|
441
|
+
VendorRequestWarning, stacklevel=2)
|
442
|
+
with tempfile.TemporaryDirectory(suffix='-tempdir',
|
443
|
+
prefix='pcapkit-',
|
444
|
+
dir=os.path.abspath(os.curdir)) as tempdir:
|
445
|
+
temp_file = os.path.join(tempdir, f'{self.NAME}.html')
|
446
|
+
|
447
|
+
flag = False
|
448
|
+
with contextlib.suppress(Exception):
|
449
|
+
flag = webbrowser.open(self.LINK)
|
450
|
+
|
451
|
+
if flag:
|
452
|
+
print('Please save the page source at')
|
453
|
+
print(f' {temp_file}')
|
454
|
+
else:
|
455
|
+
print('Please navigate to the following address')
|
456
|
+
print(f' {self.LINK}')
|
457
|
+
print('and save the page source at')
|
458
|
+
print(f' {temp_file}')
|
459
|
+
|
460
|
+
while True:
|
461
|
+
with contextlib.suppress(Exception):
|
462
|
+
input('Press ENTER to continue...') # nosec
|
463
|
+
if os.path.isfile(temp_file):
|
464
|
+
break
|
465
|
+
print('File not found; please save the page source at')
|
466
|
+
print(f' {temp_file}')
|
467
|
+
|
468
|
+
with open(temp_file) as file: # pylint: disable=unspecified-encoding
|
469
|
+
text = file.read()
|
470
|
+
else:
|
471
|
+
text = page.text
|
472
|
+
else:
|
473
|
+
text = page.text
|
474
|
+
return self.request(text)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# pylint: disable=unused-import
|
3
|
+
""":class:`~pcapkit.protocols.application.ftp.FTP` Vendor Crawler
|
4
|
+
====================================================================
|
5
|
+
|
6
|
+
.. module:: pcapkit.vendor.ftp
|
7
|
+
|
8
|
+
This module contains all vendor crawlers of
|
9
|
+
:class:`~pcapkit.protocols.application.ftp.FTP` implementations. Available
|
10
|
+
crawlers include:
|
11
|
+
|
12
|
+
.. list-table::
|
13
|
+
|
14
|
+
* - :class:`FTP_Command <pcapkit.vendor.ftp.command.Command>`
|
15
|
+
- FTP Commands [*]_
|
16
|
+
* - :class:`FTP_ReturnCode <pcapkit.vendor.ftp.return_code.ReturnCode>`
|
17
|
+
- FTP Return Codes [*]_
|
18
|
+
|
19
|
+
.. [*] https://www.iana.org/assignments/ftp-commands-extensions/ftp-commands-extensions.xhtml#ftp-commands-extensions-2
|
20
|
+
.. [*] https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes
|
21
|
+
|
22
|
+
"""
|
23
|
+
|
24
|
+
from pcapkit.vendor.ftp.command import Command as FTP_Command
|
25
|
+
from pcapkit.vendor.ftp.return_code import ReturnCode as FTP_ReturnCode
|
26
|
+
|
27
|
+
__all__ = ['FTP_Command', 'FTP_ReturnCode']
|