redhound 1.0.1 → 2.0.0.rc2

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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -0
  3. data/README.md +97 -31
  4. data/docs/API.md +104 -0
  5. data/docs/FILTERS.md +37 -0
  6. data/docs/MIGRATION.md +23 -0
  7. data/docs/PROTOCOLS.md +54 -0
  8. data/docs/USAGE.md +86 -0
  9. data/docs/VALIDATION.md +175 -0
  10. data/docs/json-schema.json +64 -0
  11. data/exe/redhound +2 -1
  12. data/lib/redhound/analysis/flow_key.rb +59 -0
  13. data/lib/redhound/analysis/flow_table.rb +124 -0
  14. data/lib/redhound/analysis/ip_reassembler.rb +209 -0
  15. data/lib/redhound/analysis/stats.rb +150 -0
  16. data/lib/redhound/analysis/tcp_analysis.rb +43 -0
  17. data/lib/redhound/analysis/tcp_reassembler.rb +176 -0
  18. data/lib/redhound/analysis/tcp_stream.rb +156 -0
  19. data/lib/redhound/analysis.rb +157 -0
  20. data/lib/redhound/capture/bsd/bpf_device.rb +155 -0
  21. data/lib/redhound/capture/bsd/constants.rb +29 -0
  22. data/lib/redhound/capture/bsd/ifreq.rb +41 -0
  23. data/lib/redhound/capture/file_source.rb +214 -0
  24. data/lib/redhound/capture/interface.rb +70 -0
  25. data/lib/redhound/capture/linktype.rb +30 -0
  26. data/lib/redhound/capture/linux/constants.rb +37 -0
  27. data/lib/redhound/capture/linux/cooked.rb +18 -0
  28. data/lib/redhound/capture/linux/ifreq.rb +42 -0
  29. data/lib/redhound/capture/linux/packet_socket.rb +224 -0
  30. data/lib/redhound/capture/linux/sockaddr_ll.rb +33 -0
  31. data/lib/redhound/capture/linux/tpacket_v3.rb +137 -0
  32. data/lib/redhound/capture/source.rb +79 -0
  33. data/lib/redhound/capture/stats.rb +22 -0
  34. data/lib/redhound/capture.rb +70 -0
  35. data/lib/redhound/cli/command.rb +42 -0
  36. data/lib/redhound/cli/options.rb +133 -0
  37. data/lib/redhound/cli/privileges.rb +29 -0
  38. data/lib/redhound/cli/runner.rb +129 -0
  39. data/lib/redhound/context.rb +20 -0
  40. data/lib/redhound/cursor.rb +69 -0
  41. data/lib/redhound/diagnostic.rb +7 -0
  42. data/lib/redhound/dissector.rb +152 -0
  43. data/lib/redhound/engine.rb +69 -0
  44. data/lib/redhound/errors.rb +38 -0
  45. data/lib/redhound/field.rb +62 -0
  46. data/lib/redhound/file/format.rb +63 -0
  47. data/lib/redhound/file/pcap_reader.rb +43 -0
  48. data/lib/redhound/file/pcap_writer.rb +79 -0
  49. data/lib/redhound/file/pcapng_reader.rb +221 -0
  50. data/lib/redhound/file/pcapng_writer.rb +151 -0
  51. data/lib/redhound/file/rotating_writer.rb +98 -0
  52. data/lib/redhound/filter/analyzer.rb +197 -0
  53. data/lib/redhound/filter/bpf/assembler.rb +121 -0
  54. data/lib/redhound/filter/bpf/disassembler.rb +58 -0
  55. data/lib/redhound/filter/bpf/validator.rb +77 -0
  56. data/lib/redhound/filter/bpf/vm.rb +109 -0
  57. data/lib/redhound/filter/codegen.rb +413 -0
  58. data/lib/redhound/filter/lexer.rb +46 -0
  59. data/lib/redhound/filter/parser.rb +206 -0
  60. data/lib/redhound/filter/program.rb +55 -0
  61. data/lib/redhound/filter.rb +30 -0
  62. data/lib/redhound/layer.rb +75 -0
  63. data/lib/redhound/output/fields.rb +20 -0
  64. data/lib/redhound/output/follow.rb +64 -0
  65. data/lib/redhound/output/hexdump.rb +29 -0
  66. data/lib/redhound/output/json.rb +32 -0
  67. data/lib/redhound/output/summary.rb +84 -0
  68. data/lib/redhound/output/timestamp.rb +34 -0
  69. data/lib/redhound/output/tree.rb +25 -0
  70. data/lib/redhound/packet.rb +77 -0
  71. data/lib/redhound/protocols/arp.rb +39 -0
  72. data/lib/redhound/protocols/checksum.rb +38 -0
  73. data/lib/redhound/protocols/data.rb +23 -0
  74. data/lib/redhound/protocols/dhcp.rb +140 -0
  75. data/lib/redhound/protocols/dns.rb +268 -0
  76. data/lib/redhound/protocols/ethernet.rb +24 -0
  77. data/lib/redhound/protocols/http.rb +185 -0
  78. data/lib/redhound/protocols/icmp.rb +205 -0
  79. data/lib/redhound/protocols/ipv4.rb +56 -0
  80. data/lib/redhound/protocols/ipv6.rb +68 -0
  81. data/lib/redhound/protocols/link.rb +70 -0
  82. data/lib/redhound/protocols/llc.rb +37 -0
  83. data/lib/redhound/protocols/ntp.rb +45 -0
  84. data/lib/redhound/protocols/tcp.rb +88 -0
  85. data/lib/redhound/protocols/tls.rb +218 -0
  86. data/lib/redhound/protocols/tunnel.rb +48 -0
  87. data/lib/redhound/protocols/udp.rb +32 -0
  88. data/lib/redhound/protocols/vlan.rb +23 -0
  89. data/lib/redhound/reader.rb +8 -0
  90. data/lib/redhound/registry.rb +64 -0
  91. data/lib/redhound/stream_dissector.rb +168 -0
  92. data/lib/redhound/util/seq.rb +21 -0
  93. data/lib/redhound/version.rb +2 -1
  94. data/lib/redhound/writer.rb +25 -43
  95. data/lib/redhound.rb +81 -9
  96. data/sig/generated/redhound/analysis/flow_key.rbs +15 -0
  97. data/sig/generated/redhound/analysis/flow_table.rbs +102 -0
  98. data/sig/generated/redhound/analysis/ip_reassembler.rbs +52 -0
  99. data/sig/generated/redhound/analysis/stats.rbs +80 -0
  100. data/sig/generated/redhound/analysis/tcp_analysis.rbs +15 -0
  101. data/sig/generated/redhound/analysis/tcp_reassembler.rbs +39 -0
  102. data/sig/generated/redhound/analysis/tcp_stream.rbs +60 -0
  103. data/sig/generated/redhound/analysis.rbs +38 -0
  104. data/sig/generated/redhound/capture/bsd/bpf_device.rbs +39 -0
  105. data/sig/generated/redhound/capture/bsd/constants.rbs +40 -0
  106. data/sig/generated/redhound/capture/bsd/ifreq.rbs +15 -0
  107. data/sig/generated/redhound/capture/file_source.rbs +67 -0
  108. data/sig/generated/redhound/capture/interface.rbs +53 -0
  109. data/sig/generated/redhound/capture/linktype.rbs +20 -0
  110. data/sig/generated/redhound/capture/linux/constants.rbs +58 -0
  111. data/sig/generated/redhound/capture/linux/cooked.rbs +15 -0
  112. data/sig/generated/redhound/capture/linux/ifreq.rbs +18 -0
  113. data/sig/generated/redhound/capture/linux/packet_socket.rbs +64 -0
  114. data/sig/generated/redhound/capture/linux/sockaddr_ll.rbs +31 -0
  115. data/sig/generated/redhound/capture/linux/tpacket_v3.rbs +35 -0
  116. data/sig/generated/redhound/capture/source.rbs +44 -0
  117. data/sig/generated/redhound/capture/stats.rbs +25 -0
  118. data/sig/generated/redhound/capture.rbs +14 -0
  119. data/sig/generated/redhound/cli/command.rbs +12 -0
  120. data/sig/generated/redhound/cli/options.rbs +25 -0
  121. data/sig/generated/redhound/cli/privileges.rbs +12 -0
  122. data/sig/generated/redhound/cli/runner.rbs +27 -0
  123. data/sig/generated/redhound/context.rbs +27 -0
  124. data/sig/generated/redhound/cursor.rbs +59 -0
  125. data/sig/generated/redhound/diagnostic.rbs +21 -0
  126. data/sig/generated/redhound/dissector.rbs +117 -0
  127. data/sig/generated/redhound/engine.rbs +23 -0
  128. data/sig/generated/redhound/errors.rbs +56 -0
  129. data/sig/generated/redhound/field.rbs +74 -0
  130. data/sig/generated/redhound/file/format.rbs +39 -0
  131. data/sig/generated/redhound/file/pcap_reader.rbs +19 -0
  132. data/sig/generated/redhound/file/pcap_writer.rbs +38 -0
  133. data/sig/generated/redhound/file/pcapng_reader.rbs +54 -0
  134. data/sig/generated/redhound/file/pcapng_writer.rbs +50 -0
  135. data/sig/generated/redhound/file/rotating_writer.rbs +42 -0
  136. data/sig/generated/redhound/filter/analyzer.rbs +42 -0
  137. data/sig/generated/redhound/filter/bpf/assembler.rbs +39 -0
  138. data/sig/generated/redhound/filter/bpf/disassembler.rbs +18 -0
  139. data/sig/generated/redhound/filter/bpf/validator.rbs +30 -0
  140. data/sig/generated/redhound/filter/bpf/vm.rbs +28 -0
  141. data/sig/generated/redhound/filter/codegen.rbs +101 -0
  142. data/sig/generated/redhound/filter/lexer.rbs +15 -0
  143. data/sig/generated/redhound/filter/parser.rbs +65 -0
  144. data/sig/generated/redhound/filter/program.rbs +48 -0
  145. data/sig/generated/redhound/filter.rbs +10 -0
  146. data/sig/generated/redhound/layer.rbs +81 -0
  147. data/sig/generated/redhound/output/fields.rbs +15 -0
  148. data/sig/generated/redhound/output/follow.rbs +21 -0
  149. data/sig/generated/redhound/output/hexdump.rbs +15 -0
  150. data/sig/generated/redhound/output/json.rbs +18 -0
  151. data/sig/generated/redhound/output/summary.rbs +21 -0
  152. data/sig/generated/redhound/output/timestamp.rbs +21 -0
  153. data/sig/generated/redhound/output/tree.rbs +15 -0
  154. data/sig/generated/redhound/packet.rbs +82 -0
  155. data/sig/generated/redhound/protocols/arp.rbs +15 -0
  156. data/sig/generated/redhound/protocols/checksum.rbs +15 -0
  157. data/sig/generated/redhound/protocols/data.rbs +17 -0
  158. data/sig/generated/redhound/protocols/dhcp.rbs +31 -0
  159. data/sig/generated/redhound/protocols/dns.rbs +42 -0
  160. data/sig/generated/redhound/protocols/ethernet.rbs +15 -0
  161. data/sig/generated/redhound/protocols/http.rbs +36 -0
  162. data/sig/generated/redhound/protocols/icmp.rbs +41 -0
  163. data/sig/generated/redhound/protocols/ipv4.rbs +15 -0
  164. data/sig/generated/redhound/protocols/ipv6.rbs +24 -0
  165. data/sig/generated/redhound/protocols/link.rbs +33 -0
  166. data/sig/generated/redhound/protocols/llc.rbs +15 -0
  167. data/sig/generated/redhound/protocols/ntp.rbs +17 -0
  168. data/sig/generated/redhound/protocols/tcp.rbs +25 -0
  169. data/sig/generated/redhound/protocols/tls.rbs +51 -0
  170. data/sig/generated/redhound/protocols/tunnel.rbs +24 -0
  171. data/sig/generated/redhound/protocols/udp.rbs +18 -0
  172. data/sig/generated/redhound/protocols/vlan.rbs +12 -0
  173. data/sig/generated/redhound/reader.rbs +7 -0
  174. data/sig/generated/redhound/registry.rbs +45 -0
  175. data/sig/generated/redhound/stream_dissector.rbs +44 -0
  176. data/sig/generated/redhound/util/seq.rbs +20 -0
  177. data/sig/generated/redhound/version.rbs +1 -0
  178. data/sig/generated/redhound/writer.rbs +6 -19
  179. data/sig/generated/redhound.rbs +18 -0
  180. data/sig/shims/io.rbs +7 -0
  181. data/sig/shims/process.rbs +3 -0
  182. metadata +177 -55
  183. data/CODE_OF_CONDUCT.md +0 -132
  184. data/Dockerfile +0 -7
  185. data/Rakefile +0 -15
  186. data/Steepfile +0 -4
  187. data/docker-compose.yml +0 -9
  188. data/lib/redhound/analyzer.rb +0 -34
  189. data/lib/redhound/builder/packet_mreq.rb +0 -56
  190. data/lib/redhound/builder/socket.rb +0 -35
  191. data/lib/redhound/builder.rb +0 -4
  192. data/lib/redhound/command.rb +0 -67
  193. data/lib/redhound/l2/ether.rb +0 -68
  194. data/lib/redhound/l2/protocol.rb +0 -33
  195. data/lib/redhound/l2.rb +0 -4
  196. data/lib/redhound/l3/arp.rb +0 -114
  197. data/lib/redhound/l3/base.rb +0 -49
  198. data/lib/redhound/l3/ipv4.rb +0 -95
  199. data/lib/redhound/l3/ipv6.rb +0 -69
  200. data/lib/redhound/l3/protocol.rb +0 -173
  201. data/lib/redhound/l3/resolver.rb +0 -30
  202. data/lib/redhound/l3.rb +0 -9
  203. data/lib/redhound/l4/base.rb +0 -31
  204. data/lib/redhound/l4/icmp.rb +0 -71
  205. data/lib/redhound/l4/resolver.rb +0 -28
  206. data/lib/redhound/l4/udp.rb +0 -63
  207. data/lib/redhound/l4.rb +0 -6
  208. data/lib/redhound/receiver.rb +0 -45
  209. data/lib/redhound/resolver.rb +0 -22
  210. data/lib/redhound/source/socket.rb +0 -18
  211. data/lib/redhound/source.rb +0 -3
  212. data/rbs_collection.lock.yaml +0 -20
  213. data/rbs_collection.yaml +0 -17
  214. data/sig/generated/redhound/analyzer.rbs +0 -14
  215. data/sig/generated/redhound/builder/packet_mreq.rbs +0 -39
  216. data/sig/generated/redhound/builder/socket.rbs +0 -24
  217. data/sig/generated/redhound/command.rbs +0 -19
  218. data/sig/generated/redhound/l2/ether.rbs +0 -41
  219. data/sig/generated/redhound/l2/protocol.rbs +0 -15
  220. data/sig/generated/redhound/l3/arp.rbs +0 -57
  221. data/sig/generated/redhound/l3/base.rbs +0 -28
  222. data/sig/generated/redhound/l3/ipv4.rbs +0 -53
  223. data/sig/generated/redhound/l3/ipv6.rbs +0 -38
  224. data/sig/generated/redhound/l3/protocol.rbs +0 -16
  225. data/sig/generated/redhound/l3/resolver.rbs +0 -16
  226. data/sig/generated/redhound/l4/base.rbs +0 -19
  227. data/sig/generated/redhound/l4/icmp.rbs +0 -33
  228. data/sig/generated/redhound/l4/resolver.rbs +0 -16
  229. data/sig/generated/redhound/l4/udp.rbs +0 -36
  230. data/sig/generated/redhound/receiver.rbs +0 -19
  231. data/sig/generated/redhound/resolver.rbs +0 -11
  232. data/sig/generated/redhound/source/socket.rbs +0 -13
@@ -2,52 +2,34 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Redhound
5
+ # Open pcap/pcapng outputs, optionally with bounded rotation.
5
6
  class Writer
6
- # @rbs (filename: String) -> void
7
- def initialize(filename:)
8
- @filename = filename
9
- end
10
-
11
- # @rbs () -> void
12
- def start
13
- @file = File.open(@filename, 'wb')
14
- @file.write(file_header)
15
- end
16
-
17
- # @rbs (msg: String) -> void
18
- def write(msg:)
19
- @file.write(packet_record(Time.now, msg.bytesize, msg.bytesize))
20
- @file.write(msg)
21
- end
7
+ # @rbs (untyped output, ?linktype: Integer | Symbol | String, ?format: Symbol | String | nil, ?snaplen: Integer, ?precision: Symbol, ?packet_buffered: bool, ?forbidden_input: String?, **untyped options) -> untyped
8
+ # @rbs [T] (untyped output, ?linktype: Integer | Symbol | String, ?format: Symbol | String | nil, ?snaplen: Integer, ?precision: Symbol, ?packet_buffered: bool, ?forbidden_input: String?, **untyped options) { (untyped) -> T } -> T
9
+ # Open a path or binary IO; close automatically with a block. See docs/API.md for options.
10
+ def self.open(output, linktype: :ethernet, format: nil, snaplen: 262_144, precision: :nano, packet_buffered: false, forbidden_input: nil, **options)
11
+ if forbidden_input && forbidden_input != '-' && output.is_a?(String) && output != '-'
12
+ same_path = ::File.expand_path(forbidden_input) == ::File.expand_path(output)
13
+ same_file = ::File.exist?(forbidden_input) && ::File.exist?(output) && ::File.identical?(forbidden_input, output)
14
+ raise ConfigurationError, 'input and output must be different files' if same_path || same_file
15
+ end
16
+ format ||= output.is_a?(String) && ::File.extname(output) == '.pcapng' ? :pcapng : :pcap
17
+ raise ArgumentError, "unknown capture file format: #{format}" unless %i[pcap pcapng].include?(format.to_sym)
22
18
 
23
- # @rbs () -> void
24
- def stop
25
- @file.close
26
- end
27
-
28
- private
29
-
30
- # @rbs () -> String
31
- def file_header
32
- [
33
- 0xa1b2c3d4, # Magic Number (little-endian)
34
- 2, # Version Major
35
- 4, # Version Minor
36
- 0, # Timezone offset (GMT)
37
- 0, # Timestamp accuracy
38
- 65535, # Snapshot length
39
- 1 # Link-layer header type (Ethernet)
40
- ].pack('VvvVVVV')
41
- end
19
+ options = options.merge(linktype:, format:, snaplen:, precision:, packet_buffered:, forbidden_input:)
20
+ writer = if options[:max_bytes] || options[:interval]
21
+ File::RotatingWriter.new(output, **options)
22
+ else
23
+ klass = format.to_sym == :pcapng ? File::PcapngWriter : File::PcapWriter
24
+ klass.new(output, **options)
25
+ end
26
+ return writer unless block_given?
42
27
 
43
- # @rbs (Time timestamp, Integer captured_length, Integer original_length) -> String
44
- def packet_record(timestamp, captured_length, original_length)
45
- [
46
- timestamp.to_i, # Timestamp seconds
47
- timestamp.usec || 0, # Timestamp microseconds
48
- captured_length, # Captured packet length
49
- original_length # Original packet length
50
- ].pack('VVVV')
28
+ begin
29
+ yield writer
30
+ ensure
31
+ writer.close
32
+ end
51
33
  end
52
34
  end
53
35
  end
data/lib/redhound.rb CHANGED
@@ -1,13 +1,85 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
- require_relative 'redhound/analyzer'
4
- require_relative 'redhound/builder'
5
- require_relative 'redhound/command'
6
- require_relative 'redhound/l2'
7
- require_relative 'redhound/l3'
8
- require_relative 'redhound/l4'
9
- require_relative 'redhound/receiver'
10
- require_relative 'redhound/resolver'
11
- require_relative 'redhound/source'
12
4
  require_relative 'redhound/version'
5
+
6
+ require_relative 'redhound/errors'
7
+ require_relative 'redhound/cursor'
8
+ require_relative 'redhound/diagnostic'
9
+ require_relative 'redhound/field'
10
+ require_relative 'redhound/layer'
11
+ require_relative 'redhound/registry'
12
+ require_relative 'redhound/dissector'
13
+ require_relative 'redhound/stream_dissector'
14
+ require_relative 'redhound/context'
15
+ require_relative 'redhound/engine'
16
+ require_relative 'redhound/capture/linktype'
17
+ require_relative 'redhound/packet'
18
+ require_relative 'redhound/protocols/checksum'
19
+ require_relative 'redhound/protocols/data'
20
+ require_relative 'redhound/protocols/ethernet'
21
+ require_relative 'redhound/protocols/vlan'
22
+ require_relative 'redhound/protocols/llc'
23
+ require_relative 'redhound/protocols/link'
24
+ require_relative 'redhound/protocols/arp'
25
+ require_relative 'redhound/protocols/ipv4'
26
+ require_relative 'redhound/protocols/ipv6'
27
+ require_relative 'redhound/protocols/udp'
28
+ require_relative 'redhound/protocols/tcp'
29
+ require_relative 'redhound/protocols/icmp'
30
+ require_relative 'redhound/protocols/tunnel'
31
+ require_relative 'redhound/protocols/dns'
32
+ require_relative 'redhound/protocols/dhcp'
33
+ require_relative 'redhound/protocols/ntp'
34
+ require_relative 'redhound/protocols/http'
35
+ require_relative 'redhound/protocols/tls'
36
+ require_relative 'redhound/output/timestamp'
37
+ require_relative 'redhound/output/summary'
38
+ require_relative 'redhound/output/tree'
39
+ require_relative 'redhound/output/hexdump'
40
+ require_relative 'redhound/output/json'
41
+ require_relative 'redhound/output/fields'
42
+ require_relative 'redhound/filter'
43
+ require_relative 'redhound/capture'
13
44
  require_relative 'redhound/writer'
45
+ require_relative 'redhound/analysis'
46
+ require_relative 'redhound/cli/options'
47
+ require_relative 'redhound/cli/privileges'
48
+ require_relative 'redhound/cli/runner'
49
+ require_relative 'redhound/cli/command'
50
+
51
+ # Capture, inspect and save network packets using Ruby standard libraries.
52
+ module Redhound
53
+ # @rbs (String bytes, ?linktype: (Integer | Symbol), **untyped metadata) -> Packet
54
+ # Create a packet with lazy, bounded protocol dissection. See docs/API.md.
55
+ def self.dissect(bytes, linktype: :ethernet, **metadata)
56
+ Packet.new(bytes, linktype: linktype, **metadata)
57
+ end
58
+
59
+ # @rbs (untyped input, ?filter: String?) -> Reader
60
+ # @rbs [T] (untyped input, ?filter: String?) { (Reader) -> T } -> T
61
+ # Read a pcap/pcapng path or binary IO; a block closes the reader automatically.
62
+ def self.open(input, filter: nil)
63
+ reader = Reader.new(input, filter: filter)
64
+ return reader unless block_given?
65
+ begin
66
+ yield reader
67
+ ensure
68
+ reader.close
69
+ end
70
+ end
71
+
72
+ # @rbs (interface: String | Integer, ?count: Integer?, **untyped options) { (Packet) -> void } -> void
73
+ # Yield live packets until count is reached or capture stops; always close the source.
74
+ def self.capture(interface:, count: nil, **options)
75
+ raise ConfigurationError, 'count must be positive' if count && count <= 0
76
+ Capture.open(interface: interface, **options) do |source|
77
+ captured = 0
78
+ source.each_packet do |packet|
79
+ yield packet
80
+ captured += 1
81
+ break if count && captured >= count
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,15 @@
1
+ # Generated from lib/redhound/analysis/flow_key.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Analysis
6
+ # @api private
7
+ module FlowKey
8
+ # @rbs (Packet packet, ?Symbol? type) -> untyped
9
+ def self.from: (Packet packet, ?Symbol? type) -> untyped
10
+
11
+ # @rbs (Symbol proto, untyped src, untyped dst) -> untyped
12
+ def self.normalize: (Symbol proto, untyped src, untyped dst) -> untyped
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,102 @@
1
+ # Generated from lib/redhound/analysis/flow_table.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Analysis
6
+ # @api private
7
+ class Flow
8
+ BASE_BYTES: ::Integer
9
+
10
+ attr_reader key: untyped
11
+
12
+ attr_reader id: untyped
13
+
14
+ attr_reader first_ns: untyped
15
+
16
+ attr_reader packets: untyped
17
+
18
+ attr_reader bytes: untyped
19
+
20
+ attr_reader streams: untyped
21
+
22
+ attr_reader applications: untyped
23
+
24
+ attr_reader acks: untyped
25
+
26
+ attr_reader keep_alives: untyped
27
+
28
+ attr_reader http_methods: untyped
29
+
30
+ attr_reader probes: untyped
31
+
32
+ attr_reader probe_disabled: untyped
33
+
34
+ attr_accessor last_ns: untyped
35
+
36
+ attr_accessor closed_ns: untyped
37
+
38
+ attr_accessor syn_ns: untyped
39
+
40
+ attr_accessor syn_direction: untyped
41
+
42
+ attr_accessor synack_ns: untyped
43
+
44
+ attr_accessor synack_seq: untyped
45
+
46
+ attr_accessor initial_rtt: untyped
47
+
48
+ attr_accessor accounted_bytes: untyped
49
+
50
+ # @rbs (untyped key, Integer id, Integer timestamp_ns) -> void
51
+ def initialize: (untyped key, Integer id, Integer timestamp_ns) -> void
52
+
53
+ # @rbs () -> bool
54
+ def closed?: () -> bool
55
+
56
+ # @rbs () -> Integer
57
+ def bytesize: () -> Integer
58
+ end
59
+
60
+ # @api private
61
+ class FlowTable
62
+ attr_reader evicted: untyped
63
+
64
+ attr_reader expired: untyped
65
+
66
+ attr_accessor on_remove: untyped
67
+
68
+ # @rbs (?max_flows: Integer) -> void
69
+ def initialize: (?max_flows: Integer) -> void
70
+
71
+ # @rbs (Packet packet) -> untyped
72
+ def update: (Packet packet) -> untyped
73
+
74
+ # @rbs (Integer now_ns) -> void
75
+ def advance: (Integer now_ns) -> void
76
+
77
+ # @rbs (Integer now_ns) -> void
78
+ def expire: (Integer now_ns) -> void
79
+
80
+ # @rbs (?Symbol? type) -> Flow?
81
+ def evict: (?Symbol? type) -> Flow?
82
+
83
+ # @rbs (Flow flow) -> void
84
+ def discard: (Flow flow) -> void
85
+
86
+ # @rbs (Flow flow) -> void
87
+ def account: (Flow flow) -> void
88
+
89
+ # @rbs () -> Integer
90
+ def size: () -> Integer
91
+
92
+ # @rbs () -> Array[Flow]
93
+ def values: () -> Array[Flow]
94
+
95
+ # @rbs () -> Integer
96
+ def bytesize: () -> Integer
97
+
98
+ # @rbs () -> Integer
99
+ def tcp_bytesize: () -> Integer
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,52 @@
1
+ # Generated from lib/redhound/analysis/ip_reassembler.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Analysis
6
+ # @api private
7
+ class IpReassembler
8
+ attr_reader evicted: untyped
9
+
10
+ attr_reader expired: untyped
11
+
12
+ # @rbs (?max_bytes: Integer, ?timeout_ns: Integer) -> void
13
+ def initialize: (?max_bytes: Integer, ?timeout_ns: Integer) -> void
14
+
15
+ # @rbs (Packet packet) -> untyped
16
+ def descriptor: (Packet packet) -> untyped
17
+
18
+ # @rbs (Packet packet) -> Packet?
19
+ def update: (Packet packet) -> Packet?
20
+
21
+ # @rbs (untyped state) -> bool
22
+ def complete?: (untyped state) -> bool
23
+
24
+ # @rbs (Packet packet, untyped state, Integer version) -> Packet?
25
+ def virtual_packet: (Packet packet, untyped state, Integer version) -> Packet?
26
+
27
+ # @rbs (Integer now_ns) -> void
28
+ def advance: (Integer now_ns) -> void
29
+
30
+ # @rbs (Integer now_ns) -> void
31
+ def expire: (Integer now_ns) -> void
32
+
33
+ # @rbs () -> Integer
34
+ def bytesize: () -> Integer
35
+
36
+ # @rbs (untyped state) -> Integer
37
+ def state_bytesize: (untyped state) -> Integer
38
+
39
+ # @rbs (untyped key) -> untyped
40
+ def remove: (untyped key) -> untyped
41
+
42
+ # @rbs () -> untyped
43
+ def remove_oldest: () -> untyped
44
+
45
+ # @rbs () -> Integer
46
+ def finish: () -> Integer
47
+
48
+ # @rbs () -> Integer
49
+ def size: () -> Integer
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,80 @@
1
+ # Generated from lib/redhound/analysis/stats.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Analysis
6
+ # @api private
7
+ module Stats
8
+ # @api private
9
+ class Table
10
+ attr_reader evicted: untyped
11
+
12
+ # @rbs (?max_rows: Integer) -> void
13
+ def initialize: (?max_rows: Integer) -> void
14
+
15
+ # @rbs (untyped key) { () -> untyped } -> untyped
16
+ def row: (untyped key) { () -> untyped } -> untyped
17
+
18
+ # @rbs () -> Integer
19
+ def bytesize: () -> Integer
20
+
21
+ # @rbs () -> void
22
+ def evict: () -> void
23
+
24
+ # @rbs (untyped io) -> void
25
+ def format: (untyped io) -> void
26
+
27
+ # @rbs () -> Hash[Symbol, untyped]
28
+ def to_h: () -> Hash[Symbol, untyped]
29
+ end
30
+
31
+ # @api private
32
+ class Io < Table
33
+ # @rbs ((Integer | Float) seconds, ?max_rows: Integer) -> void
34
+ def initialize: (Integer | Float seconds, ?max_rows: Integer) -> void
35
+
36
+ # @rbs (Packet packet) -> void
37
+ def update: (Packet packet) -> void
38
+
39
+ # @rbs () -> Hash[Symbol, untyped]
40
+ def to_h: () -> Hash[Symbol, untyped]
41
+
42
+ # @rbs (Integer interval) -> Hash[Symbol, Integer]
43
+ def interval_row: (Integer interval) -> Hash[Symbol, Integer]
44
+ end
45
+
46
+ # @api private
47
+ class Conversations < Table
48
+ # @rbs (Symbol type, ?max_rows: Integer) -> void
49
+ def initialize: (Symbol type, ?max_rows: Integer) -> void
50
+
51
+ # @rbs (Packet packet) -> void
52
+ def update: (Packet packet) -> void
53
+
54
+ # @rbs () -> Hash[Symbol, untyped]
55
+ def to_h: () -> Hash[Symbol, untyped]
56
+ end
57
+
58
+ # @api private
59
+ class Endpoints < Table
60
+ # @rbs (Symbol type, ?max_rows: Integer) -> void
61
+ def initialize: (Symbol type, ?max_rows: Integer) -> void
62
+
63
+ # @rbs (Packet packet) -> void
64
+ def update: (Packet packet) -> void
65
+
66
+ # @rbs () -> Hash[Symbol, untyped]
67
+ def to_h: () -> Hash[Symbol, untyped]
68
+ end
69
+
70
+ # @api private
71
+ class Hierarchy < Table
72
+ # @rbs (Packet packet) -> void
73
+ def update: (Packet packet) -> void
74
+
75
+ # @rbs () -> Hash[Symbol, untyped]
76
+ def to_h: () -> Hash[Symbol, untyped]
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,15 @@
1
+ # Generated from lib/redhound/analysis/tcp_analysis.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Analysis
6
+ # @api private
7
+ module TcpAnalysis
8
+ # @rbs (Flow flow, Integer direction, TcpStream stream, Layer layer, Integer timestamp_ns) -> void
9
+ def self.update: (Flow flow, Integer direction, TcpStream stream, Layer layer, Integer timestamp_ns) -> void
10
+
11
+ # @rbs (Layer layer, Symbol name) -> void
12
+ def self.flag: (Layer layer, Symbol name) -> void
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,39 @@
1
+ # Generated from lib/redhound/analysis/tcp_reassembler.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Analysis
6
+ # @api private
7
+ class TcpReassembler
8
+ # @rbs (?registry: Registry, ?max_bytes: Integer, ?stream_bytes: Integer, ?protocol_streams: bool, ?follow: untyped) -> void
9
+ def initialize: (?registry: Registry, ?max_bytes: Integer, ?stream_bytes: Integer, ?protocol_streams: bool, ?follow: untyped) -> void
10
+
11
+ # @rbs (Packet packet, Flow flow, Integer direction) -> void
12
+ def update: (Packet packet, Flow flow, Integer direction) -> void
13
+
14
+ # @rbs (Flow flow, Integer direction, TcpStream stream, untyped application, Packet? packet) -> Array[Layer]
15
+ def deliver: (Flow flow, Integer direction, TcpStream stream, untyped application, Packet? packet) -> Array[Layer]
16
+
17
+ # @rbs (Flow flow, Integer direction, String data, Integer origin, Packet? packet) -> Array[Layer]
18
+ def application_data: (Flow flow, Integer direction, String data, Integer origin, Packet? packet) -> Array[Layer]
19
+
20
+ # @rbs (untyped klass, Flow flow, Integer direction, Layer layer) -> untyped
21
+ def create_application: (untyped klass, Flow flow, Integer direction, Layer layer) -> untyped
22
+
23
+ # @rbs (Flow flow, Integer direction, untyped application, Symbol method, *untyped arguments) -> Array[Layer]
24
+ def invoke: (Flow flow, Integer direction, untyped application, Symbol method, *untyped arguments) -> Array[Layer]
25
+
26
+ # @rbs (Flow flow, Integer direction, Symbol protocol, StandardError error) -> Layer
27
+ def application_error: (Flow flow, Integer direction, Symbol protocol, StandardError error) -> Layer
28
+
29
+ # @rbs (Packet packet, Array[Layer] layers) -> void
30
+ def attach: (Packet packet, Array[Layer] layers) -> void
31
+
32
+ # @rbs (Flow flow, ?Packet? packet) -> Array[Layer]
33
+ def finish_flow: (Flow flow, ?Packet? packet) -> Array[Layer]
34
+
35
+ # @rbs (FlowTable flows, Packet packet) -> void
36
+ def enforce_limit: (FlowTable flows, Packet packet) -> void
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,60 @@
1
+ # Generated from lib/redhound/analysis/tcp_stream.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Analysis
6
+ # @api private
7
+ class TcpStream
8
+ attr_reader base_seq: untyped
9
+
10
+ attr_reader expected: untyped
11
+
12
+ attr_reader diagnostics: untyped
13
+
14
+ attr_reader deliveries: untyped
15
+
16
+ attr_reader gap_lengths: untyped
17
+
18
+ attr_reader fin: untyped
19
+
20
+ # @rbs (?max_bytes: Integer) -> void
21
+ def initialize: (?max_bytes: Integer) -> void
22
+
23
+ # @rbs (Integer sequence, String data, ?syn: bool, ?fin: bool, ?frame: Integer) -> Array[String]
24
+ def push: (Integer sequence, String data, ?syn: bool, ?fin: bool, ?frame: Integer) -> Array[String]
25
+
26
+ # @rbs (Integer start, String data, Integer old_start, String old_data) -> void
27
+ def compare_overlap: (Integer start, String data, Integer old_start, String old_data) -> void
28
+
29
+ # @rbs () -> void
30
+ def drain: () -> void
31
+
32
+ # @rbs (?bool clear) -> Array[String]
33
+ def flush_gap: (?bool clear) -> Array[String]
34
+
35
+ # @rbs () -> void
36
+ def trim_history: () -> void
37
+
38
+ # @rbs () -> Integer
39
+ def bytesize: () -> Integer
40
+
41
+ # @rbs () -> bool
42
+ def pending?: () -> bool
43
+
44
+ # @rbs () -> bool
45
+ def fin_seen?: () -> bool
46
+
47
+ # @rbs () -> void
48
+ def consume_fin: () -> void
49
+
50
+ # @rbs () -> Integer
51
+ def next_sequence: () -> Integer
52
+
53
+ # @rbs () -> void
54
+ def clear_deliveries: () -> void
55
+
56
+ # @rbs () -> void
57
+ def release: () -> void
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,38 @@
1
+ # Generated from lib/redhound/analysis.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Analysis
6
+ # @api private
7
+ class Session
8
+ attr_reader flows: untyped
9
+
10
+ attr_reader ip_reassembler: untyped
11
+
12
+ attr_reader tcp_reassembler: untyped
13
+
14
+ attr_reader statistics: untyped
15
+
16
+ # @rbs (?stats: Array[String], ?follow: String?, ?registry: Registry, ?max_state_bytes: Integer, ?max_flows: Integer, ?ip_bytes: Integer, ?tcp_bytes: Integer, ?stream_bytes: Integer, ?protocol_streams: bool) -> void
17
+ def initialize: (?stats: Array[String], ?follow: String?, ?registry: Registry, ?max_state_bytes: Integer, ?max_flows: Integer, ?ip_bytes: Integer, ?tcp_bytes: Integer, ?stream_bytes: Integer, ?protocol_streams: bool) -> void
18
+
19
+ # @rbs (String specification, Integer max_rows) -> untyped
20
+ def statistic: (String specification, Integer max_rows) -> untyped
21
+
22
+ # @rbs (Packet packet) -> void
23
+ def update: (Packet packet) -> void
24
+
25
+ # @rbs (Packet packet) -> void
26
+ def enforce_limit: (Packet packet) -> void
27
+
28
+ # @rbs () -> Integer
29
+ def bytesize: () -> Integer
30
+
31
+ # @rbs (untyped err) -> void
32
+ def snapshot: (untyped err) -> void
33
+
34
+ # @rbs (untyped out, untyped err) -> void
35
+ def finish: (untyped out, untyped err) -> void
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ # Generated from lib/redhound/capture/bsd/bpf_device.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Capture
6
+ # @api private
7
+ module Bsd
8
+ # @api private
9
+ class BpfDevice < Source
10
+ attr_reader linktype: untyped
11
+
12
+ attr_reader interfaces: untyped
13
+
14
+ # @rbs (interface: String | Integer | Interface, ?snaplen: Integer, ?promiscuous: bool, ?buffer_size: Integer?, ?direction: Symbol, ?filter: String?) -> void
15
+ def initialize: (interface: String | Integer | Interface, ?snaplen: Integer, ?promiscuous: bool, ?buffer_size: Integer?, ?direction: Symbol, ?filter: String?) -> void
16
+
17
+ # @rbs (?timeout: Numeric?) -> Packet?
18
+ def next_packet: (?timeout: Numeric?) -> Packet?
19
+
20
+ # @rbs (untyped program) -> void
21
+ def attach_filter: (untyped program) -> void
22
+
23
+ # @rbs () -> Stats
24
+ def stats: () -> Stats
25
+
26
+ # @rbs () -> void
27
+ def close: () -> void
28
+
29
+ private
30
+
31
+ # @rbs () -> ::File
32
+ def open_device: () -> ::File
33
+
34
+ # @rbs () -> void
35
+ def configure_direction: () -> void
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ # Generated from lib/redhound/capture/bsd/constants.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ # @api private
5
+ module Capture
6
+ # @api private
7
+ module Bsd
8
+ # @api private
9
+ module Constants
10
+ # Verified against the macOS SDK's net/bpf.h on arm64 and 64-bit ioctl layout.
11
+ BIOCSBLEN: ::Integer
12
+
13
+ BIOCGBLEN: ::Integer
14
+
15
+ BIOCSETF: ::Integer
16
+
17
+ BIOCFLUSH: ::Integer
18
+
19
+ BIOCPROMISC: ::Integer
20
+
21
+ BIOCGDLT: ::Integer
22
+
23
+ BIOCSETIF: ::Integer
24
+
25
+ BIOCGSTATS: ::Integer
26
+
27
+ BIOCIMMEDIATE: ::Integer
28
+
29
+ BIOCSSEESENT: ::Integer
30
+
31
+ # Apple XNU bsd/net/bpf_private.h: extended headers expose direction at byte 19.
32
+ BIOCSEXTHDR: ::Integer
33
+
34
+ BIOCSDIRECTION: ::Integer
35
+
36
+ BPF_ALIGNMENT: ::Integer
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ # Generated from lib/redhound/capture/bsd/ifreq.rb with RBS::Inline
2
+
3
+ module Redhound
4
+ module Capture
5
+ module Bsd
6
+ # macOS interface metadata can be queried without opening a BPF device.
7
+ module Ifreq
8
+ SIOCGIFMTU: ::Integer
9
+
10
+ # @rbs (String name, index: Integer, flags: Integer, link_address: String?) -> Interface
11
+ def self.interface: (String name, index: Integer, flags: Integer, link_address: String?) -> Interface
12
+ end
13
+ end
14
+ end
15
+ end