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,79 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Verdict Types
3
+ ===================
4
+
5
+ .. module:: pcapkit.vendor.pcapng.verdict_type
6
+
7
+ This module contains the vendor crawler for **Verdict Types**,
8
+ which is automatically generating :class:`pcapkit.const.pcapng.verdict_type.VerdictType`.
9
+
10
+ """
11
+
12
+ import collections
13
+ import sys
14
+ from typing import TYPE_CHECKING
15
+
16
+ from pcapkit.vendor.default import Vendor
17
+
18
+ if TYPE_CHECKING:
19
+ from collections import Counter
20
+
21
+ __all__ = ['VerdictType']
22
+
23
+ #: Verdict type registry.
24
+ DATA = {
25
+ 0: 'Hardware',
26
+ 1: 'Linux_eBPF_TC',
27
+ 2: 'Linux_eBPF_XDP',
28
+ } # type: dict[int, str]
29
+
30
+
31
+ class VerdictType(Vendor):
32
+ """Verdict Types"""
33
+
34
+ #: Value limit checker.
35
+ FLAG = 'isinstance(value, int) and 0x00 <= value <= 0xFF'
36
+
37
+ def request(self) -> 'dict[int, str]': # type: ignore[override] # pylint: disable=arguments-differ
38
+ """Fetch registry data.
39
+
40
+ Returns:
41
+ Registry data (:data:`~pcapkit.vendor.pcapng.verdict_type.DATA`).
42
+
43
+ """
44
+ return DATA
45
+
46
+ def count(self, data: 'dict[int, str]') -> 'Counter[str]': # type: ignore[override]
47
+ """Count field records.
48
+
49
+ Args:
50
+ data: Registry data.
51
+
52
+ Returns:
53
+ Field recordings.
54
+
55
+ """
56
+ return collections.Counter(map(self.safe_name, data.values()))
57
+
58
+ def process(self, data: 'dict[int, str]') -> 'tuple[list[str], list[str]]': # type: ignore[override]
59
+ """Process registry data.
60
+
61
+ Args:
62
+ data: Registry data.
63
+
64
+ Returns:
65
+ Enumeration fields and missing fields.
66
+
67
+ """
68
+ enum = [] # type: list[str]
69
+ miss = [
70
+ "return extend_enum(cls, 'Unassigned_%d' % value, value)",
71
+ ]
72
+ for code, name in DATA.items():
73
+ renm = self.rename(name, code) # type: ignore[arg-type]
74
+ enum.append(f"{renm} = {code}".ljust(76))
75
+ return enum, miss
76
+
77
+
78
+ if __name__ == '__main__':
79
+ sys.exit(VerdictType()) # type: ignore[arg-type]
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+ # pylint: disable=unused-import
3
+ """Protocol Type Registry Vendor Crawlers
4
+ ============================================
5
+
6
+ .. module:: pcapkit.vendor.reg
7
+
8
+ This module contains all vendor crawlers of protocol type registry
9
+ implementations. Available enumerations include:
10
+
11
+ .. list-table::
12
+
13
+ * - :class:`LINKTYPE <pcapkit.vendor.reg.linktype.LinkType>`
14
+ - Link-Layer Header Type Values [*]_
15
+ * - :class:`ETHERTYPE <pcapkit.vendor.reg.ethertype.EtherType>`
16
+ - Ethertype IEEE 802 Numbers [*]_
17
+ * - :class:`TRANSTYPE <pcapkit.vendor.reg.transtype.TransType>`
18
+ - Transport Layer Protocol Numbers [*]_
19
+ * - :class:`APPTYPE <pcapkit.vendor.reg.apptype.AppType>`
20
+ - Application Layer Protocol Numbers (Service Name and Transport Protocol Port Number Registry) [*]_
21
+
22
+ .. [*] http://www.tcpdump.org/linktypes.html
23
+ .. [*] https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml#ieee-802-numbers-1
24
+ .. [*] https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml#protocol-numbers-1
25
+ .. [*] https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?
26
+
27
+ """
28
+
29
+ from pcapkit.vendor.reg.apptype import AppType
30
+ from pcapkit.vendor.reg.ethertype import EtherType
31
+ from pcapkit.vendor.reg.linktype import LinkType
32
+ from pcapkit.vendor.reg.transtype import TransType
33
+
34
+ __all__ = ['EtherType', 'LinkType', 'TransType', 'AppType']
@@ -0,0 +1,338 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Application Layer Protocol Numbers
3
+ ========================================
4
+
5
+ .. module:: pcapkit.vendor.reg.apptype
6
+
7
+ This module contains the vendor crawler for **Application Layer Protocol Numbers**,
8
+ which is automatically generating :class:`pcapkit.const.reg.apptype.AppType`.
9
+
10
+ """
11
+
12
+ import collections
13
+ import csv
14
+ import keyword
15
+ import re
16
+ import sys
17
+ import textwrap
18
+ from typing import TYPE_CHECKING, Callable
19
+
20
+ from pcapkit.vendor.default import Vendor
21
+
22
+ if TYPE_CHECKING:
23
+ from collections import Counter, OrderedDict
24
+ from typing import Callable
25
+
26
+ __all__ = ['AppType']
27
+
28
+ LINE = lambda NAME, DOCS, FLAG, ENUM, MISS, MODL: f'''\
29
+ # -*- coding: utf-8 -*-
30
+ # mypy: disable-error-code=assignment
31
+ # pylint: disable=line-too-long,consider-using-f-string
32
+ """{(name := DOCS.split(' [', maxsplit=1)[0])}
33
+ {'=' * (len(name) + 6)}
34
+
35
+ .. module:: {MODL.replace('vendor', 'const')}
36
+
37
+ This module contains the constant enumeration for **{name}**,
38
+ which is automatically generated from :class:`{MODL}.{NAME}`.
39
+
40
+ """
41
+ from collections import defaultdict
42
+ from typing import TYPE_CHECKING
43
+
44
+ from aenum import IntFlag, StrEnum, auto, extend_enum
45
+
46
+ from pcapkit.utilities.compat import show_flag_values
47
+
48
+ __all__ = ['{NAME}']
49
+
50
+ if TYPE_CHECKING:
51
+ from typing import Any, DefaultDict, Type
52
+
53
+
54
+ class TransportProtocol(IntFlag):
55
+ """Transport layer protocol."""
56
+
57
+ undefined = 0
58
+
59
+ #: Transmission Control Protocol.
60
+ tcp = auto()
61
+ #: User Datagram Protocol.
62
+ udp = auto()
63
+ #: Stream Control Transmission Protocol.
64
+ sctp = auto()
65
+ #: Datagram Congestion Control Protocol.
66
+ dccp = auto()
67
+
68
+ @staticmethod
69
+ def get(key: 'int | str') -> 'TransportProtocol':
70
+ """Backport support for original codes.
71
+
72
+ Args:
73
+ key: Key to get enum item.
74
+
75
+ :meta private:
76
+ """
77
+ if isinstance(key, int):
78
+ return TransportProtocol(key)
79
+ if key.lower() in TransportProtocol.__members__:
80
+ return TransportProtocol[key.lower()] # type: ignore[misc]
81
+ max_val = max(TransportProtocol.__members__.values())
82
+ return extend_enum(TransportProtocol, key.lower(), max_val * 2)
83
+
84
+
85
+ class {NAME}(StrEnum):
86
+ """[{NAME}] {DOCS}"""
87
+
88
+ if TYPE_CHECKING:
89
+ #: Service name.
90
+ svc: 'str'
91
+ #: Port number.
92
+ port: 'int'
93
+ #: Transport protocol.
94
+ proto: 'TransportProtocol'
95
+
96
+ #: Mapping of members based on transport protocol.
97
+ __members_proto__: 'DefaultDict[TransportProtocol, dict[int, {NAME}]]' = defaultdict(dict)
98
+
99
+ def __new__(cls, value: 'int', name: 'str' = '<null>',
100
+ proto: 'TransportProtocol' = TransportProtocol.undefined) -> 'Type[{NAME}]':
101
+ temp = '%s [%d - %s]' % (name, value, proto.name)
102
+
103
+ obj = str.__new__(cls, temp)
104
+ obj._value_ = temp
105
+
106
+ obj.svc = name
107
+ obj.port = value
108
+ obj.proto = proto
109
+
110
+ for namespace in show_flag_values(proto):
111
+ cls.__members_proto__[TransportProtocol(namespace)][value] = obj
112
+ if proto is TransportProtocol.undefined:
113
+ cls.__members_proto__[proto][value] = obj
114
+
115
+ return obj
116
+
117
+ def __repr__(self) -> 'str':
118
+ return "<%s.%s: %d [%s]>" % (self.__class__.__name__, self.svc, self.port, self.proto.name)
119
+
120
+ def __str__(self) -> 'str':
121
+ return '%s [%d - %s]' % (self.svc, self.port, self.proto.name)
122
+
123
+ def __int__(self) -> 'int':
124
+ return self.port
125
+
126
+ def __lt__(self, other: '{NAME}') -> 'bool':
127
+ return self.port < other
128
+
129
+ def __gt__(self, other: '{NAME}') -> 'bool':
130
+ return self.port > other
131
+
132
+ def __le__(self, other: '{NAME}') -> 'bool':
133
+ return self.port <= other
134
+
135
+ def __ge__(self, other: '{NAME}') -> 'bool':
136
+ return self.port >= other
137
+
138
+ def __eq__(self, other: 'Any') -> 'bool':
139
+ return self.port == other
140
+
141
+ def __ne__(self, other: 'Any') -> 'bool':
142
+ return self.port != other
143
+
144
+ def __hash__(self) -> 'int':
145
+ return hash(self.port)
146
+
147
+ {ENUM}
148
+
149
+ @staticmethod
150
+ def get(key: 'int | str', default: 'int' = -1, *,
151
+ proto: 'TransportProtocol | str' = TransportProtocol.undefined) -> '{NAME}':
152
+ """Backport support for original codes.
153
+
154
+ Args:
155
+ key: Key to get enum item.
156
+ default: Default value if not found.
157
+ proto: Transport protocol of the enum item.
158
+
159
+ :meta private:
160
+ """
161
+ if isinstance(key, int):
162
+ if isinstance(proto, str):
163
+ proto = TransportProtocol.get(proto.lower())
164
+ temp_ns = {NAME}.__members_proto__.get(proto, {{}})
165
+ if key in temp_ns:
166
+ return temp_ns[key]
167
+ try:
168
+ ret = {NAME}._missing_(key)
169
+ if ret is None:
170
+ raise ValueError
171
+ except ValueError:
172
+
173
+ ret = extend_enum({NAME}, 'PORT_%d_%s' % (key, proto.name), key, 'unknown', proto)
174
+ return ret
175
+ if key in {NAME}.__members_proto__:
176
+ return getattr({NAME}, key)
177
+ return extend_enum({NAME}, key, default, key)
178
+
179
+ @classmethod
180
+ def _missing_(cls, value: 'int') -> '{NAME}':
181
+ """Lookup function used when value is not found.
182
+
183
+ Args:
184
+ value: Value to get enum item.
185
+
186
+ """
187
+ if not ({FLAG}):
188
+ raise ValueError('%r is not a valid %s' % (value, cls.__name__))
189
+ if value in cls.__members_proto__.get(TransportProtocol.undefined, {{}}): # type: ignore[call-overload]
190
+ return cls.__members_proto__[TransportProtocol.undefined][value] # type: ignore[index]
191
+ {MISS}
192
+ {'' if ''.join(MISS.splitlines()[-1:]).startswith('return') else 'return super()._missing_(value)'}
193
+ '''.strip() # type: Callable[[str, str, str, str, str, str], str]
194
+
195
+
196
+ class AppType(Vendor):
197
+ """Application Layer Protocol Numbers"""
198
+
199
+ #: Value limit checker.
200
+ FLAG = 'isinstance(value, int) and 0 <= value <= 65535'
201
+ #: Link to registry.
202
+ LINK = 'https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv'
203
+
204
+ def count(self, data: 'list[str]') -> 'Counter[str]':
205
+ """Count field records."""
206
+ reader = csv.reader(data)
207
+ next(reader) # header
208
+ return collections.Counter(map(lambda item: '[%s] %s' % (item[2], item[0].strip() or self.safe_name(item[3].strip())),
209
+ filter(lambda item: len(item[1].split('-')) != 2, reader)))
210
+
211
+ @staticmethod
212
+ def wrap_comment(text: 'str') -> 'str':
213
+ """Wraps long-length text to shorter lines of comments.
214
+
215
+ Args:
216
+ text: Source text.
217
+
218
+ Returns:
219
+ Wrapped comments.
220
+
221
+ """
222
+ return '\n #: '.join(textwrap.wrap(text.strip(), 76))
223
+
224
+ def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
225
+ """Process registry data.
226
+
227
+ Args:
228
+ data: Registry data.
229
+
230
+ Returns:
231
+ Enumeration fields and missing fields.
232
+
233
+ """
234
+ reader = csv.reader(data)
235
+ next(reader) # header
236
+
237
+ enum = [] # type: list[str]
238
+ miss = [] # type: list[str]
239
+
240
+ line = collections.OrderedDict() # type: OrderedDict[str, list[str]]
241
+ for item in reader:
242
+ svc = item[0].strip().lower() or self.safe_name(item[3].strip()).lower()
243
+ port = item[1].strip() or '-1'
244
+ proto = 'TransportProtocol.get(%r)' % (item[2].strip().lower() or 'undefined')
245
+ desc = item[3].strip()
246
+
247
+ temp = [] # type: list[str]
248
+ #for rfc in filter(lambda s: 'RFC' in s, re.split(r'\[|\]', item[8])):
249
+ # temp.append(f'[{rfc[:3]} {rfc[3:]}]')
250
+ for rfc in filter(None, map(lambda s: s.strip(), re.split(r'\[|\]', item[8]))):
251
+ if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
252
+ match = re.fullmatch(r'RFC(?P<rfc>\d+)(, Section (?P<sec>.*?))?', rfc)
253
+ if match is None:
254
+ temp.append(f'[{rfc}]')
255
+ else:
256
+ if match.group('sec') is not None:
257
+ temp.append(f'[:rfc:`{match.group("rfc")}#{match.group("sec")}`]')
258
+ else:
259
+ temp.append(f'[:rfc:`{match.group("rfc")}`]')
260
+ else:
261
+ temp.append(f'[{rfc}]'.replace('_', ' '))
262
+ cmmt = self.wrap_comment(re.sub(r'\s+', r' ',
263
+ '[%s] %s %s' % (item[2].strip().upper() or 'N/A',
264
+ desc, ''.join(temp)))) # pylint: disable=consider-using-f-string
265
+
266
+ try:
267
+ code, _ = port, int(port)
268
+ if port == '-1':
269
+ code = 'null'
270
+ renm = self.rename(svc, code)
271
+
272
+ if f'{renm}_{code}' in line:
273
+ renm = f'{renm}_{code}'
274
+
275
+ if renm in line:
276
+ if port == line[renm][1]:
277
+ line[renm][2] = f'{line[renm][2]} | {proto}'
278
+ if line[renm][3].startswith('-'):
279
+ line[renm][3] = f'{line[renm][3]}\n #: - {cmmt}'
280
+ else:
281
+ line[renm][3] = f'- {line[renm][3]}\n #: - {cmmt}'
282
+ else:
283
+ line[f'{renm}_{line[renm][1]}'] = line[renm]
284
+ line[f'{renm}_{code}'] = [svc, port, proto, cmmt]
285
+ del line[renm]
286
+ else:
287
+ line[renm] = [svc, port, proto, cmmt]
288
+
289
+ # if port == '-1':
290
+ # continue
291
+ # proto_name = item[2].strip().lower()
292
+
293
+ # if proto_name:
294
+ # renm = f'PORT_{code}_{proto_name}'
295
+ # else:
296
+ # renm = f'PORT_{code}'
297
+ # line[renm] = [svc, code, proto, cmmt]
298
+ except ValueError:
299
+ start, stop = port.split('-')
300
+
301
+ miss.append(f'if {start} <= value <= {stop}:')
302
+ miss.append(f' #: {cmmt}')
303
+ miss.append(f" return extend_enum(cls, '{self.safe_name(svc)}_%d' % value, value, {svc!r}, {proto})")
304
+
305
+ for key, (svc, code, proto, cmmt) in line.items():
306
+ if keyword.iskeyword(key):
307
+ key = '%s_' % key
308
+
309
+ pres = f"{key}: 'AppType' = {code}, {svc!r}, {proto}"
310
+ if cmmt.startswith('-'):
311
+ sufs = f'#: {cmmt}'
312
+ else:
313
+ sufs = '#: %s' % cmmt.replace(' #: ', ' #: ')
314
+
315
+ enum.append(f'{sufs}\n {pres}')
316
+
317
+ return enum, miss
318
+
319
+ def context(self, data: 'list[str]') -> 'str':
320
+ """Generate constant context.
321
+
322
+ Args:
323
+ data: CSV data.
324
+
325
+ Returns:
326
+ Constant context.
327
+
328
+ """
329
+ enum, miss = self.process(data)
330
+
331
+ ENUM = '\n\n '.join(map(lambda s: s.rstrip(), enum)).strip()
332
+ MISS = '\n '.join(map(lambda s: s.rstrip(), miss)).strip()
333
+
334
+ return LINE(self.NAME, self.DOCS, self.FLAG, ENUM, MISS, self.__module__)
335
+
336
+
337
+ if __name__ == '__main__':
338
+ sys.exit(AppType()) # type: ignore[arg-type]
@@ -0,0 +1,121 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Ethertype IEEE 802 Numbers
3
+ ================================
4
+
5
+ .. module:: pcapkit.vendor.reg.ethertype
6
+
7
+ This module contains the vendor crawler for **Ethertype IEEE 802 Numbers**,
8
+ which is automatically generating :class:`pcapkit.const.reg.ethertype.EtherType`.
9
+
10
+ """
11
+
12
+ import collections
13
+ import csv
14
+ import re
15
+ import sys
16
+ from typing import TYPE_CHECKING
17
+
18
+ from pcapkit.vendor.default import Vendor
19
+
20
+ if TYPE_CHECKING:
21
+ from collections import Counter
22
+ from typing import Optional
23
+
24
+ __all__ = ['EtherType']
25
+
26
+
27
+ class EtherType(Vendor):
28
+ """Ethertype IEEE 802 Numbers"""
29
+
30
+ #: Value limit checker.
31
+ FLAG = 'isinstance(value, int) and 0x0000 <= value <= 0xFFFF'
32
+ #: Link to registry.
33
+ LINK = 'https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers-1.csv'
34
+
35
+ def count(self, data: 'list[str]') -> 'Counter[str]':
36
+ """Count field records.
37
+
38
+ Args:
39
+ data: CSV data.
40
+
41
+ Returns:
42
+ Field recordings.
43
+
44
+ """
45
+ reader = csv.reader(data)
46
+ next(reader) # header
47
+ return collections.Counter(map(lambda item: self.safe_name(item[4]),
48
+ filter(lambda item: len(item[1].split('-')) != 2, reader)))
49
+
50
+ def rename(self, name: 'str', code: 'str', *, original: 'Optional[str]' = None) -> 'str': # pylint: disable=redefined-outer-name
51
+ """Rename duplicated fields.
52
+
53
+ Args:
54
+ name: Field name.
55
+ code: Field code.
56
+
57
+ Keyword Args:
58
+ original: Original field name (extracted from CSV records).
59
+
60
+ Returns:
61
+ Revised field name.
62
+
63
+ """
64
+ if self.record[self.safe_name(name)] > 1:
65
+ name = f'{name}_0x{code}'
66
+ return self.safe_name(name)
67
+
68
+ def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
69
+ """Process CSV data.
70
+
71
+ Args:
72
+ data: CSV data.
73
+
74
+ Returns:
75
+ Enumeration fields and missing fields.
76
+
77
+ """
78
+ reader = csv.reader(data)
79
+ next(reader) # header
80
+
81
+ enum = [] # type: list[str]
82
+ miss = [] # type: list[str]
83
+ for item in reader:
84
+ name = item[4]
85
+ rfcs = item[5]
86
+
87
+ temp = [] # type: list[str]
88
+ for rfc in filter(None, re.split(r'\[|\]', rfcs)):
89
+ if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
90
+ #temp.append(f'[{rfc[:3]} {rfc[3:]}]')
91
+ temp.append(f'[:rfc:`{rfc[3:]}`]')
92
+ else:
93
+ temp.append(f'[{rfc}]'.replace('_', ' '))
94
+ tmp1 = re.sub(r'( )( )*', ' ', f"{''.join(temp)}".replace('\n', ' ')) if rfcs else ''
95
+ tmp2 = re.sub(r'\r*\n', ' ', tmp1, re.MULTILINE)
96
+ tmp3 = name.replace('\n', ' ')
97
+ desc = self.wrap_comment(f"{tmp3} {tmp2}")
98
+
99
+ try:
100
+ code, _ = item[1], int(item[1], base=16)
101
+ renm = re.sub(r'( )( )*', ' ', self.rename(name, code).replace('\n', ' '))
102
+
103
+ pres = f'{renm} = 0x{code}'
104
+ sufs = f'#: {desc}'
105
+
106
+ # if len(pres) > 74:
107
+ # sufs = f"\n{' '*80}{sufs}"
108
+
109
+ # enum.append(f'{pres.ljust(76)}{sufs}')
110
+ enum.append(f'{sufs}\n {pres}')
111
+ except ValueError:
112
+ start, stop = item[1].split('-')
113
+
114
+ miss.append(f'if 0x{start} <= value <= 0x{stop}:')
115
+ miss.append(f' #: {desc}')
116
+ miss.append(f" return extend_enum(cls, '{self.safe_name(name)}_0x%s' % hex(value)[2:].upper().zfill(4), value)") # pylint: disable=line-too-long
117
+ return enum, miss
118
+
119
+
120
+ if __name__ == '__main__':
121
+ sys.exit(EtherType()) # type: ignore[arg-type]
@@ -0,0 +1,110 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Link-Layer Header Type Values
3
+ ===================================
4
+
5
+ .. module:: pcapkit.vendor.reg.linktype
6
+
7
+ This module contains the vendor crawler for **Link-Layer Header Type Values**,
8
+ which is automatically generating :class:`pcapkit.const.reg.linktype.LinkType`.
9
+
10
+ """
11
+
12
+ import collections
13
+ import re
14
+ import sys
15
+ from typing import TYPE_CHECKING
16
+
17
+ import bs4
18
+
19
+ from pcapkit.vendor.default import Vendor
20
+
21
+ if TYPE_CHECKING:
22
+ from collections import Counter
23
+
24
+ from bs4.element import Tag
25
+
26
+ __all__ = ['LinkType']
27
+
28
+
29
+ class LinkType(Vendor):
30
+ """Link-Layer Header Type Values"""
31
+
32
+ #: Value limit checker.
33
+ FLAG = 'isinstance(value, int) and 0x00000000 <= value <= 0xFFFFFFFF'
34
+ #: Link to registry.
35
+ LINK = 'http://www.tcpdump.org/linktypes.html'
36
+
37
+ def count(self, data: 'list[str]') -> 'Counter[str]':
38
+ """Count field records."""
39
+ return collections.Counter()
40
+
41
+ def request(self, text: 'str') -> 'list[Tag]': # type: ignore[override] # pylint: disable=signature-differs
42
+ """Fetch registry table.
43
+
44
+ Args:
45
+ text: Context from :attr:`~LinkType.LINK`.
46
+
47
+ Returns:
48
+ Rows (``tr``) from registry table (``table``).
49
+
50
+ """
51
+ soup = bs4.BeautifulSoup(text, 'html5lib')
52
+ table = soup.select('table.linktypedlt')[0]
53
+ return table.select('tr')[1:]
54
+
55
+ def process(self, data: 'list[Tag]') -> 'tuple[list[str], list[str]]':
56
+ """Process registry data.
57
+
58
+ Args:
59
+ data: Registry data.
60
+
61
+ Returns:
62
+ Enumeration fields and missing fields.
63
+
64
+ """
65
+ enum = [] # type: list[str]
66
+ miss = [
67
+ "return extend_enum(cls, 'Unassigned_%d' % value, value)",
68
+ ]
69
+ for content in data:
70
+ name = content.select('td.symbol')[0].text.strip()[9:].strip()
71
+ temp = content.select('td.number')[0].text.strip()
72
+ desc = content.select('td.symbol')[1].text.strip()
73
+ cmmt = re.sub(r'\s+', ' ', content.select('td')[3].text.strip()).replace("''", '``').replace('_', r'\_')
74
+
75
+ if not name:
76
+ name = desc[4:]
77
+
78
+ try:
79
+ code, _ = temp, int(temp)
80
+
81
+ pres = f"{name} = {code}"
82
+ if desc:
83
+ sufs = "#: %s" % self.wrap_comment(f"[``{desc}``] {cmmt}") # pylint: disable=consider-using-f-string
84
+ else:
85
+ sufs = "#: %s" % self.wrap_comment(cmmt)
86
+
87
+ # if len(pres) > 74:
88
+ # sufs = f"\n{' '*80}{sufs}"
89
+
90
+ # enum.append(f'{pres.ljust(76)}{sufs}')
91
+ enum.append(f'{sufs}\n {pres}')
92
+ except ValueError:
93
+ start, stop = map(int, temp.split('–'))
94
+ for code in range(start, stop+1):
95
+ name = f'USER{code-start}'
96
+ desc = f'DLT_USER{code-start}'
97
+
98
+ pres = f"{name} = {code}"
99
+ sufs = "#: %s" % self.wrap_comment(f"[``{desc}``] {cmmt}") # pylint: disable=consider-using-f-string
100
+
101
+ # if len(pres) > 74:
102
+ # sufs = f"\n{' '*80}{sufs}"
103
+
104
+ # enum.append(f'{pres.ljust(76)}{sufs}')
105
+ enum.append(f'{sufs}\n {pres}')
106
+ return enum, miss
107
+
108
+
109
+ if __name__ == '__main__':
110
+ sys.exit(LinkType()) # type: ignore[arg-type]