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.
Files changed (466) hide show
  1. pcapkit/__init__.py +126 -0
  2. pcapkit/__main__.py +138 -0
  3. pcapkit/all.py +136 -0
  4. pcapkit/const/__init__.py +81 -0
  5. pcapkit/const/arp/__init__.py +25 -0
  6. pcapkit/const/arp/hardware.py +181 -0
  7. pcapkit/const/arp/operation.py +131 -0
  8. pcapkit/const/ftp/__init__.py +25 -0
  9. pcapkit/const/ftp/command.py +309 -0
  10. pcapkit/const/ftp/return_code.py +304 -0
  11. pcapkit/const/hip/__init__.py +94 -0
  12. pcapkit/const/hip/certificate.py +77 -0
  13. pcapkit/const/hip/cipher.py +65 -0
  14. pcapkit/const/hip/di.py +59 -0
  15. pcapkit/const/hip/ecdsa_curve.py +59 -0
  16. pcapkit/const/hip/ecdsa_low_curve.py +56 -0
  17. pcapkit/const/hip/eddsa_curve.py +65 -0
  18. pcapkit/const/hip/esp_transform_suite.py +98 -0
  19. pcapkit/const/hip/group.py +86 -0
  20. pcapkit/const/hip/hi_algorithm.py +86 -0
  21. pcapkit/const/hip/hit_suite.py +68 -0
  22. pcapkit/const/hip/nat_traversal.py +62 -0
  23. pcapkit/const/hip/notify_message.py +200 -0
  24. pcapkit/const/hip/packet.py +89 -0
  25. pcapkit/const/hip/parameter.py +377 -0
  26. pcapkit/const/hip/registration.py +68 -0
  27. pcapkit/const/hip/registration_failure.py +84 -0
  28. pcapkit/const/hip/suite.py +71 -0
  29. pcapkit/const/hip/transport.py +59 -0
  30. pcapkit/const/http/__init__.py +39 -0
  31. pcapkit/const/http/error_code.py +95 -0
  32. pcapkit/const/http/frame.py +95 -0
  33. pcapkit/const/http/method.py +184 -0
  34. pcapkit/const/http/setting.py +96 -0
  35. pcapkit/const/http/status_code.py +294 -0
  36. pcapkit/const/ipv4/__init__.py +57 -0
  37. pcapkit/const/ipv4/classification_level.py +64 -0
  38. pcapkit/const/ipv4/option_class.py +55 -0
  39. pcapkit/const/ipv4/option_number.py +137 -0
  40. pcapkit/const/ipv4/protection_authority.py +63 -0
  41. pcapkit/const/ipv4/qs_function.py +51 -0
  42. pcapkit/const/ipv4/router_alert.py +251 -0
  43. pcapkit/const/ipv4/tos_del.py +51 -0
  44. pcapkit/const/ipv4/tos_ecn.py +55 -0
  45. pcapkit/const/ipv4/tos_pre.py +63 -0
  46. pcapkit/const/ipv4/tos_rel.py +51 -0
  47. pcapkit/const/ipv4/tos_thr.py +51 -0
  48. pcapkit/const/ipv4/ts_flag.py +53 -0
  49. pcapkit/const/ipv6/__init__.py +53 -0
  50. pcapkit/const/ipv6/extension_header.py +66 -0
  51. pcapkit/const/ipv6/option.py +137 -0
  52. pcapkit/const/ipv6/option_action.py +55 -0
  53. pcapkit/const/ipv6/qs_function.py +51 -0
  54. pcapkit/const/ipv6/router_alert.py +266 -0
  55. pcapkit/const/ipv6/routing.py +80 -0
  56. pcapkit/const/ipv6/seed_id.py +55 -0
  57. pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
  58. pcapkit/const/ipv6/tagger_id.py +62 -0
  59. pcapkit/const/ipx/__init__.py +27 -0
  60. pcapkit/const/ipx/packet.py +72 -0
  61. pcapkit/const/ipx/socket.py +104 -0
  62. pcapkit/const/l2tp/__init__.py +21 -0
  63. pcapkit/const/l2tp/type.py +51 -0
  64. pcapkit/const/mh/__init__.py +204 -0
  65. pcapkit/const/mh/access_type.py +92 -0
  66. pcapkit/const/mh/ack_status_code.py +71 -0
  67. pcapkit/const/mh/ani_suboption.py +74 -0
  68. pcapkit/const/mh/auth_subtype.py +53 -0
  69. pcapkit/const/mh/binding_ack_flag.py +66 -0
  70. pcapkit/const/mh/binding_error.py +51 -0
  71. pcapkit/const/mh/binding_revocation.py +59 -0
  72. pcapkit/const/mh/binding_update_flag.py +81 -0
  73. pcapkit/const/mh/cga_extension.py +66 -0
  74. pcapkit/const/mh/cga_sec.py +57 -0
  75. pcapkit/const/mh/cga_type.py +68 -0
  76. pcapkit/const/mh/dhcp_support_mode.py +53 -0
  77. pcapkit/const/mh/dns_status_code.py +65 -0
  78. pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
  79. pcapkit/const/mh/dsmipv6_home_address.py +74 -0
  80. pcapkit/const/mh/enumerating_algorithm.py +56 -0
  81. pcapkit/const/mh/fb_ack_status.py +62 -0
  82. pcapkit/const/mh/fb_action.py +71 -0
  83. pcapkit/const/mh/fb_indication_trigger.py +65 -0
  84. pcapkit/const/mh/fb_type.py +59 -0
  85. pcapkit/const/mh/flow_id_status.py +77 -0
  86. pcapkit/const/mh/flow_id_suboption.py +71 -0
  87. pcapkit/const/mh/handoff_type.py +71 -0
  88. pcapkit/const/mh/handover_ack_flag.py +54 -0
  89. pcapkit/const/mh/handover_ack_status.py +92 -0
  90. pcapkit/const/mh/handover_initiate_flag.py +57 -0
  91. pcapkit/const/mh/handover_initiate_status.py +62 -0
  92. pcapkit/const/mh/home_address_reply.py +71 -0
  93. pcapkit/const/mh/lla_code.py +63 -0
  94. pcapkit/const/mh/lma_mag_suboption.py +59 -0
  95. pcapkit/const/mh/mn_group_id.py +59 -0
  96. pcapkit/const/mh/mn_id_subtype.py +77 -0
  97. pcapkit/const/mh/operator_id.py +63 -0
  98. pcapkit/const/mh/option.py +260 -0
  99. pcapkit/const/mh/packet.py +119 -0
  100. pcapkit/const/mh/qos_attribute.py +89 -0
  101. pcapkit/const/mh/revocation_status_code.py +83 -0
  102. pcapkit/const/mh/revocation_trigger.py +86 -0
  103. pcapkit/const/mh/status_code.py +232 -0
  104. pcapkit/const/mh/traffic_selector.py +62 -0
  105. pcapkit/const/mh/upa_status.py +71 -0
  106. pcapkit/const/mh/upn_reason.py +80 -0
  107. pcapkit/const/ospf/__init__.py +27 -0
  108. pcapkit/const/ospf/authentication.py +65 -0
  109. pcapkit/const/ospf/packet.py +71 -0
  110. pcapkit/const/pcapng/__init__.py +51 -0
  111. pcapkit/const/pcapng/block_type.py +152 -0
  112. pcapkit/const/pcapng/filter_type.py +48 -0
  113. pcapkit/const/pcapng/hash_algorithm.py +59 -0
  114. pcapkit/const/pcapng/option_type.py +233 -0
  115. pcapkit/const/pcapng/record_type.py +57 -0
  116. pcapkit/const/pcapng/secrets_type.py +56 -0
  117. pcapkit/const/pcapng/verdict_type.py +53 -0
  118. pcapkit/const/reg/__init__.py +34 -0
  119. pcapkit/const/reg/apptype.py +32702 -0
  120. pcapkit/const/reg/ethertype.py +714 -0
  121. pcapkit/const/reg/linktype.py +902 -0
  122. pcapkit/const/reg/transtype.py +523 -0
  123. pcapkit/const/tcp/__init__.py +35 -0
  124. pcapkit/const/tcp/checksum.py +55 -0
  125. pcapkit/const/tcp/flags.py +73 -0
  126. pcapkit/const/tcp/mp_tcp_option.py +80 -0
  127. pcapkit/const/tcp/option.py +198 -0
  128. pcapkit/const/vlan/__init__.py +23 -0
  129. pcapkit/const/vlan/priority_level.py +71 -0
  130. pcapkit/corekit/__init__.py +59 -0
  131. pcapkit/corekit/fields/__init__.py +45 -0
  132. pcapkit/corekit/fields/collections.py +282 -0
  133. pcapkit/corekit/fields/field.py +269 -0
  134. pcapkit/corekit/fields/ipaddress.py +274 -0
  135. pcapkit/corekit/fields/misc.py +722 -0
  136. pcapkit/corekit/fields/numbers.py +375 -0
  137. pcapkit/corekit/fields/strings.py +245 -0
  138. pcapkit/corekit/infoclass.py +394 -0
  139. pcapkit/corekit/io.py +506 -0
  140. pcapkit/corekit/module.py +39 -0
  141. pcapkit/corekit/multidict.py +626 -0
  142. pcapkit/corekit/protochain.py +263 -0
  143. pcapkit/corekit/version.py +33 -0
  144. pcapkit/dumpkit/__init__.py +15 -0
  145. pcapkit/dumpkit/common.py +199 -0
  146. pcapkit/dumpkit/null.py +77 -0
  147. pcapkit/dumpkit/pcap.py +144 -0
  148. pcapkit/foundation/__init__.py +45 -0
  149. pcapkit/foundation/engines/__init__.py +36 -0
  150. pcapkit/foundation/engines/dpkt.py +230 -0
  151. pcapkit/foundation/engines/engine.py +194 -0
  152. pcapkit/foundation/engines/pcap.py +188 -0
  153. pcapkit/foundation/engines/pcapng.py +310 -0
  154. pcapkit/foundation/engines/pyshark.py +166 -0
  155. pcapkit/foundation/engines/scapy.py +161 -0
  156. pcapkit/foundation/extraction.py +915 -0
  157. pcapkit/foundation/reassembly/__init__.py +49 -0
  158. pcapkit/foundation/reassembly/data/__init__.py +48 -0
  159. pcapkit/foundation/reassembly/data/ip.py +117 -0
  160. pcapkit/foundation/reassembly/data/tcp.py +145 -0
  161. pcapkit/foundation/reassembly/ip.py +192 -0
  162. pcapkit/foundation/reassembly/ipv4.py +50 -0
  163. pcapkit/foundation/reassembly/ipv6.py +50 -0
  164. pcapkit/foundation/reassembly/reassembly.py +389 -0
  165. pcapkit/foundation/reassembly/tcp.py +249 -0
  166. pcapkit/foundation/registry/__init__.py +41 -0
  167. pcapkit/foundation/registry/foundation.py +327 -0
  168. pcapkit/foundation/registry/protocols.py +885 -0
  169. pcapkit/foundation/traceflow/__init__.py +44 -0
  170. pcapkit/foundation/traceflow/data/__init__.py +30 -0
  171. pcapkit/foundation/traceflow/data/tcp.py +105 -0
  172. pcapkit/foundation/traceflow/tcp.py +159 -0
  173. pcapkit/foundation/traceflow/traceflow.py +390 -0
  174. pcapkit/interface/__init__.py +22 -0
  175. pcapkit/interface/core.py +185 -0
  176. pcapkit/interface/misc.py +120 -0
  177. pcapkit/protocols/__init__.py +85 -0
  178. pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
  179. pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
  180. pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
  181. pcapkit/protocols/application/NotImplemented/dns.py +0 -0
  182. pcapkit/protocols/application/NotImplemented/imap.py +0 -0
  183. pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
  184. pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
  185. pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
  186. pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
  187. pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
  188. pcapkit/protocols/application/NotImplemented/pop.py +0 -0
  189. pcapkit/protocols/application/NotImplemented/rip.py +0 -0
  190. pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
  191. pcapkit/protocols/application/NotImplemented/sip.py +0 -0
  192. pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
  193. pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
  194. pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
  195. pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
  196. pcapkit/protocols/application/NotImplemented/tls.py +0 -0
  197. pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
  198. pcapkit/protocols/application/__init__.py +34 -0
  199. pcapkit/protocols/application/application.py +114 -0
  200. pcapkit/protocols/application/ftp.py +206 -0
  201. pcapkit/protocols/application/http.py +176 -0
  202. pcapkit/protocols/application/httpv1.py +320 -0
  203. pcapkit/protocols/application/httpv2.py +1255 -0
  204. pcapkit/protocols/data/__init__.py +192 -0
  205. pcapkit/protocols/data/application/__init__.py +57 -0
  206. pcapkit/protocols/data/application/ftp.py +59 -0
  207. pcapkit/protocols/data/application/httpv1.py +79 -0
  208. pcapkit/protocols/data/application/httpv2.py +293 -0
  209. pcapkit/protocols/data/data.py +25 -0
  210. pcapkit/protocols/data/internet/__init__.py +298 -0
  211. pcapkit/protocols/data/internet/ah.py +31 -0
  212. pcapkit/protocols/data/internet/hip.py +804 -0
  213. pcapkit/protocols/data/internet/hopopt.py +351 -0
  214. pcapkit/protocols/data/internet/ipv4.py +369 -0
  215. pcapkit/protocols/data/internet/ipv6.py +67 -0
  216. pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
  217. pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
  218. pcapkit/protocols/data/internet/ipv6_route.py +86 -0
  219. pcapkit/protocols/data/internet/ipx.py +56 -0
  220. pcapkit/protocols/data/internet/mh.py +509 -0
  221. pcapkit/protocols/data/link/__init__.py +33 -0
  222. pcapkit/protocols/data/link/arp.py +74 -0
  223. pcapkit/protocols/data/link/ethernet.py +28 -0
  224. pcapkit/protocols/data/link/l2tp.py +63 -0
  225. pcapkit/protocols/data/link/ospf.py +58 -0
  226. pcapkit/protocols/data/link/vlan.py +42 -0
  227. pcapkit/protocols/data/misc/__init__.py +109 -0
  228. pcapkit/protocols/data/misc/null.py +18 -0
  229. pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
  230. pcapkit/protocols/data/misc/pcap/frame.py +56 -0
  231. pcapkit/protocols/data/misc/pcap/header.py +53 -0
  232. pcapkit/protocols/data/misc/pcapng.py +925 -0
  233. pcapkit/protocols/data/misc/raw.py +25 -0
  234. pcapkit/protocols/data/protocol.py +32 -0
  235. pcapkit/protocols/data/transport/__init__.py +71 -0
  236. pcapkit/protocols/data/transport/tcp.py +555 -0
  237. pcapkit/protocols/data/transport/udp.py +29 -0
  238. pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
  239. pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
  240. pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
  241. pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
  242. pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
  243. pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
  244. pcapkit/protocols/internet/__init__.py +43 -0
  245. pcapkit/protocols/internet/ah.py +275 -0
  246. pcapkit/protocols/internet/hip.py +4727 -0
  247. pcapkit/protocols/internet/hopopt.py +1879 -0
  248. pcapkit/protocols/internet/internet.py +240 -0
  249. pcapkit/protocols/internet/ip.py +51 -0
  250. pcapkit/protocols/internet/ipsec.py +50 -0
  251. pcapkit/protocols/internet/ipv4.py +1782 -0
  252. pcapkit/protocols/internet/ipv6.py +361 -0
  253. pcapkit/protocols/internet/ipv6_frag.py +258 -0
  254. pcapkit/protocols/internet/ipv6_opts.py +1890 -0
  255. pcapkit/protocols/internet/ipv6_route.py +710 -0
  256. pcapkit/protocols/internet/ipx.py +230 -0
  257. pcapkit/protocols/internet/mh.py +2764 -0
  258. pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
  259. pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
  260. pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
  261. pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
  262. pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
  263. pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
  264. pcapkit/protocols/link/__init__.py +35 -0
  265. pcapkit/protocols/link/arp.py +421 -0
  266. pcapkit/protocols/link/ethernet.py +248 -0
  267. pcapkit/protocols/link/l2tp.py +267 -0
  268. pcapkit/protocols/link/link.py +140 -0
  269. pcapkit/protocols/link/ospf.py +342 -0
  270. pcapkit/protocols/link/rarp.py +82 -0
  271. pcapkit/protocols/link/vlan.py +225 -0
  272. pcapkit/protocols/misc/__init__.py +37 -0
  273. pcapkit/protocols/misc/null.py +129 -0
  274. pcapkit/protocols/misc/pcap/__init__.py +17 -0
  275. pcapkit/protocols/misc/pcap/frame.py +478 -0
  276. pcapkit/protocols/misc/pcap/header.py +358 -0
  277. pcapkit/protocols/misc/pcapng.py +5520 -0
  278. pcapkit/protocols/misc/raw.py +180 -0
  279. pcapkit/protocols/protocol.py +1216 -0
  280. pcapkit/protocols/schema/__init__.py +140 -0
  281. pcapkit/protocols/schema/application/__init__.py +40 -0
  282. pcapkit/protocols/schema/application/ftp.py +21 -0
  283. pcapkit/protocols/schema/application/httpv1.py +21 -0
  284. pcapkit/protocols/schema/application/httpv2.py +384 -0
  285. pcapkit/protocols/schema/internet/__init__.py +294 -0
  286. pcapkit/protocols/schema/internet/ah.py +40 -0
  287. pcapkit/protocols/schema/internet/hip.py +1184 -0
  288. pcapkit/protocols/schema/internet/hopopt.py +679 -0
  289. pcapkit/protocols/schema/internet/ipv4.py +576 -0
  290. pcapkit/protocols/schema/internet/ipv6.py +63 -0
  291. pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
  292. pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
  293. pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
  294. pcapkit/protocols/schema/internet/ipx.py +40 -0
  295. pcapkit/protocols/schema/internet/mh.py +718 -0
  296. pcapkit/protocols/schema/link/__init__.py +19 -0
  297. pcapkit/protocols/schema/link/arp.py +39 -0
  298. pcapkit/protocols/schema/link/ethernet.py +51 -0
  299. pcapkit/protocols/schema/link/l2tp.py +88 -0
  300. pcapkit/protocols/schema/link/ospf.py +90 -0
  301. pcapkit/protocols/schema/link/vlan.py +69 -0
  302. pcapkit/protocols/schema/misc/__init__.py +108 -0
  303. pcapkit/protocols/schema/misc/null.py +18 -0
  304. pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
  305. pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
  306. pcapkit/protocols/schema/misc/pcap/header.py +63 -0
  307. pcapkit/protocols/schema/misc/pcapng.py +1689 -0
  308. pcapkit/protocols/schema/misc/raw.py +24 -0
  309. pcapkit/protocols/schema/schema.py +809 -0
  310. pcapkit/protocols/schema/transport/__init__.py +69 -0
  311. pcapkit/protocols/schema/transport/tcp.py +928 -0
  312. pcapkit/protocols/schema/transport/udp.py +90 -0
  313. pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
  314. pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
  315. pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
  316. pcapkit/protocols/transport/__init__.py +27 -0
  317. pcapkit/protocols/transport/tcp.py +3025 -0
  318. pcapkit/protocols/transport/transport.py +158 -0
  319. pcapkit/protocols/transport/udp.py +214 -0
  320. pcapkit/py.typed +0 -0
  321. pcapkit/toolkit/__init__.py +57 -0
  322. pcapkit/toolkit/dpkt.py +306 -0
  323. pcapkit/toolkit/pcap.py +212 -0
  324. pcapkit/toolkit/pcapng.py +251 -0
  325. pcapkit/toolkit/pyshark.py +99 -0
  326. pcapkit/toolkit/scapy.py +297 -0
  327. pcapkit/utilities/__init__.py +20 -0
  328. pcapkit/utilities/compat.py +196 -0
  329. pcapkit/utilities/decorators.py +192 -0
  330. pcapkit/utilities/exceptions.py +365 -0
  331. pcapkit/utilities/logging.py +55 -0
  332. pcapkit/utilities/warnings.py +185 -0
  333. pcapkit/vendor/__init__.py +105 -0
  334. pcapkit/vendor/__main__.py +92 -0
  335. pcapkit/vendor/arp/__init__.py +27 -0
  336. pcapkit/vendor/arp/hardware.py +29 -0
  337. pcapkit/vendor/arp/operation.py +29 -0
  338. pcapkit/vendor/default.py +474 -0
  339. pcapkit/vendor/ftp/__init__.py +27 -0
  340. pcapkit/vendor/ftp/command.py +244 -0
  341. pcapkit/vendor/ftp/return_code.py +256 -0
  342. pcapkit/vendor/hip/__init__.py +94 -0
  343. pcapkit/vendor/hip/certificate.py +29 -0
  344. pcapkit/vendor/hip/cipher.py +29 -0
  345. pcapkit/vendor/hip/di.py +29 -0
  346. pcapkit/vendor/hip/ecdsa_curve.py +29 -0
  347. pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
  348. pcapkit/vendor/hip/eddsa_curve.py +85 -0
  349. pcapkit/vendor/hip/esp_transform_suite.py +29 -0
  350. pcapkit/vendor/hip/group.py +87 -0
  351. pcapkit/vendor/hip/hi_algorithm.py +29 -0
  352. pcapkit/vendor/hip/hit_suite.py +29 -0
  353. pcapkit/vendor/hip/nat_traversal.py +29 -0
  354. pcapkit/vendor/hip/notify_message.py +29 -0
  355. pcapkit/vendor/hip/packet.py +88 -0
  356. pcapkit/vendor/hip/parameter.py +88 -0
  357. pcapkit/vendor/hip/registration.py +29 -0
  358. pcapkit/vendor/hip/registration_failure.py +29 -0
  359. pcapkit/vendor/hip/suite.py +29 -0
  360. pcapkit/vendor/hip/transport.py +29 -0
  361. pcapkit/vendor/http/__init__.py +39 -0
  362. pcapkit/vendor/http/error_code.py +95 -0
  363. pcapkit/vendor/http/frame.py +91 -0
  364. pcapkit/vendor/http/method.py +167 -0
  365. pcapkit/vendor/http/setting.py +93 -0
  366. pcapkit/vendor/http/status_code.py +185 -0
  367. pcapkit/vendor/ipv4/__init__.py +57 -0
  368. pcapkit/vendor/ipv4/classification_level.py +91 -0
  369. pcapkit/vendor/ipv4/option_class.py +80 -0
  370. pcapkit/vendor/ipv4/option_number.py +105 -0
  371. pcapkit/vendor/ipv4/protection_authority.py +84 -0
  372. pcapkit/vendor/ipv4/qs_function.py +78 -0
  373. pcapkit/vendor/ipv4/router_alert.py +93 -0
  374. pcapkit/vendor/ipv4/tos_del.py +78 -0
  375. pcapkit/vendor/ipv4/tos_ecn.py +95 -0
  376. pcapkit/vendor/ipv4/tos_pre.py +84 -0
  377. pcapkit/vendor/ipv4/tos_rel.py +78 -0
  378. pcapkit/vendor/ipv4/tos_thr.py +77 -0
  379. pcapkit/vendor/ipv4/ts_flag.py +79 -0
  380. pcapkit/vendor/ipv6/__init__.py +53 -0
  381. pcapkit/vendor/ipv6/extension_header.py +171 -0
  382. pcapkit/vendor/ipv6/option.py +104 -0
  383. pcapkit/vendor/ipv6/option_action.py +90 -0
  384. pcapkit/vendor/ipv6/qs_function.py +78 -0
  385. pcapkit/vendor/ipv6/router_alert.py +93 -0
  386. pcapkit/vendor/ipv6/routing.py +87 -0
  387. pcapkit/vendor/ipv6/seed_id.py +81 -0
  388. pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
  389. pcapkit/vendor/ipv6/tagger_id.py +81 -0
  390. pcapkit/vendor/ipx/__init__.py +37 -0
  391. pcapkit/vendor/ipx/packet.py +123 -0
  392. pcapkit/vendor/ipx/socket.py +125 -0
  393. pcapkit/vendor/l2tp/__init__.py +21 -0
  394. pcapkit/vendor/l2tp/type.py +78 -0
  395. pcapkit/vendor/mh/__init__.py +204 -0
  396. pcapkit/vendor/mh/access_type.py +87 -0
  397. pcapkit/vendor/mh/ack_status_code.py +88 -0
  398. pcapkit/vendor/mh/ani_suboption.py +88 -0
  399. pcapkit/vendor/mh/auth_subtype.py +83 -0
  400. pcapkit/vendor/mh/binding_ack_flag.py +148 -0
  401. pcapkit/vendor/mh/binding_error.py +78 -0
  402. pcapkit/vendor/mh/binding_revocation.py +87 -0
  403. pcapkit/vendor/mh/binding_update_flag.py +147 -0
  404. pcapkit/vendor/mh/cga_extension.py +91 -0
  405. pcapkit/vendor/mh/cga_sec.py +91 -0
  406. pcapkit/vendor/mh/cga_type.py +74 -0
  407. pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
  408. pcapkit/vendor/mh/dns_status_code.py +87 -0
  409. pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
  410. pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
  411. pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
  412. pcapkit/vendor/mh/fb_ack_status.py +87 -0
  413. pcapkit/vendor/mh/fb_action.py +88 -0
  414. pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
  415. pcapkit/vendor/mh/fb_type.py +88 -0
  416. pcapkit/vendor/mh/flow_id_status.py +87 -0
  417. pcapkit/vendor/mh/flow_id_suboption.py +87 -0
  418. pcapkit/vendor/mh/handoff_type.py +87 -0
  419. pcapkit/vendor/mh/handover_ack_flag.py +143 -0
  420. pcapkit/vendor/mh/handover_ack_status.py +87 -0
  421. pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
  422. pcapkit/vendor/mh/handover_initiate_status.py +87 -0
  423. pcapkit/vendor/mh/home_address_reply.py +87 -0
  424. pcapkit/vendor/mh/lla_code.py +97 -0
  425. pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
  426. pcapkit/vendor/mh/mn_group_id.py +87 -0
  427. pcapkit/vendor/mh/mn_id_subtype.py +87 -0
  428. pcapkit/vendor/mh/operator_id.py +87 -0
  429. pcapkit/vendor/mh/option.py +83 -0
  430. pcapkit/vendor/mh/packet.py +82 -0
  431. pcapkit/vendor/mh/qos_attribute.py +87 -0
  432. pcapkit/vendor/mh/revocation_status_code.py +87 -0
  433. pcapkit/vendor/mh/revocation_trigger.py +87 -0
  434. pcapkit/vendor/mh/status_code.py +91 -0
  435. pcapkit/vendor/mh/traffic_selector.py +87 -0
  436. pcapkit/vendor/mh/upa_status.py +87 -0
  437. pcapkit/vendor/mh/upn_reason.py +87 -0
  438. pcapkit/vendor/ospf/__init__.py +27 -0
  439. pcapkit/vendor/ospf/authentication.py +29 -0
  440. pcapkit/vendor/ospf/packet.py +29 -0
  441. pcapkit/vendor/pcapng/__init__.py +51 -0
  442. pcapkit/vendor/pcapng/block_type.py +94 -0
  443. pcapkit/vendor/pcapng/filter_type.py +77 -0
  444. pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
  445. pcapkit/vendor/pcapng/option_type.py +287 -0
  446. pcapkit/vendor/pcapng/record_type.py +81 -0
  447. pcapkit/vendor/pcapng/secrets_type.py +81 -0
  448. pcapkit/vendor/pcapng/verdict_type.py +79 -0
  449. pcapkit/vendor/reg/__init__.py +34 -0
  450. pcapkit/vendor/reg/apptype.py +338 -0
  451. pcapkit/vendor/reg/ethertype.py +121 -0
  452. pcapkit/vendor/reg/linktype.py +110 -0
  453. pcapkit/vendor/reg/transtype.py +111 -0
  454. pcapkit/vendor/tcp/__init__.py +35 -0
  455. pcapkit/vendor/tcp/checksum.py +80 -0
  456. pcapkit/vendor/tcp/flags.py +149 -0
  457. pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
  458. pcapkit/vendor/tcp/option.py +103 -0
  459. pcapkit/vendor/vlan/__init__.py +23 -0
  460. pcapkit/vendor/vlan/priority_level.py +97 -0
  461. pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
  462. pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
  463. pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
  464. pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
  465. pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
  466. 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']