packetman 0.1.2 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a30c3ba57b035cf5927580b722a5651aefc55317
4
- data.tar.gz: 68c4aa0507610985b538da8e6b8b432ffbd6aa49
2
+ SHA256:
3
+ metadata.gz: d3b1cf3885dcdce498b69eb568a10f6bb728a9af2ca0d0bd9f50510137416f9e
4
+ data.tar.gz: e4af77b424e0074748bb7c034a191a475e68c5f5daaf545b0c23910b01447dc0
5
5
  SHA512:
6
- metadata.gz: 976a934d36e13ceb1593728d7067198bbbe78d036da0a600ffa58703483709ca35c813feb3198aa3575ed9f6c9ca680a96572c31a05358ee542438c5d248fec3
7
- data.tar.gz: 727bf261f5a87940af9abd8e636272dce8d1e2de7746976b2079b2b6dff2717da849fbd780b0da17df47ee2fed1a981f48ae0e7ce7cdb52ad7e61cd532f8354f
6
+ metadata.gz: 188bb0f019470028ccabc251bbe195038728c81be5dcbdec98f121d153ca273b19e51390613600a99b0eadca571f20fb33530e4f9a3d871a2d49a5dc1e8deee4
7
+ data.tar.gz: 794018ddb9156cfcfcb174163877fb4518cebc57df9d1cf22fe021a54899b71c94e9fb73c70f62ee236a2c3518df35c300aa7b00d70b46da8fcf0e090cf2e879
data/.bundle/config ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_PATH: "vendor/bundle"
@@ -0,0 +1,55 @@
1
+ version: 2.1
2
+ jobs:
3
+ build:
4
+ parameters:
5
+ ruby_version:
6
+ description: Version of ruby to test
7
+ type: string
8
+ environment:
9
+ GEM_HOME: vendor/bundle
10
+ docker:
11
+ - image: circleci/ruby:<< parameters.ruby_version >>
12
+ working_directory: /tmp/project
13
+ steps:
14
+ - checkout
15
+ - restore_cache:
16
+ keys:
17
+ - v1-bundle-{{ .Environment.CIRCLE_JOB }}-{{ .Environment.CIRCLE_SHA1 }}
18
+ - v1-bundle-{{ .Environment.CIRCLE_JOB }}-
19
+ - run:
20
+ name: Bundle install
21
+ command: >
22
+ gem install bundler -i vendor/bundle
23
+ && bundle install --path vendor/bundle
24
+ - run:
25
+ name: Prepare CodeClimate
26
+ command: >
27
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
28
+ && chmod +x ./cc-test-reporter
29
+ - save_cache:
30
+ key: v1-bundle-{{ .Environment.CIRCLE_JOB }}-{{ .Environment.CIRCLE_SHA1 }}
31
+ paths:
32
+ - /tmp/project/vendor
33
+ - run:
34
+ name: Run Tests
35
+ command: >
36
+ ./cc-test-reporter before-build
37
+ bundle exec rake spec
38
+ ./cc-test-reporter after-build
39
+
40
+ workflows:
41
+ version: 2
42
+ build:
43
+ jobs:
44
+ - build:
45
+ name: ruby_2_3_8
46
+ ruby_version: 2.3.8
47
+ - build:
48
+ name: ruby_2_4_10
49
+ ruby_version: 2.4.10
50
+ - build:
51
+ name: ruby_2_5_8
52
+ ruby_version: 2.5.8
53
+ - build:
54
+ name: ruby_2_6_6
55
+ ruby_version: 2.6.6
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /vendor/
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Packetman
2
2
 
3
- Advanced tcpdump and Wireshark capture generator.
3
+ Advanced tcpdump and Wireshark filter string generator.
4
4
 
5
5
  [![Gem Version](https://badge.fury.io/rb/packetman.svg)](http://badge.fury.io/rb/packetman)
6
6
  [![Test Coverage](https://codeclimate.com/github/jescholl/packetman/badges/coverage.svg)](https://codeclimate.com/github/jescholl/packetman/coverage)
@@ -38,7 +38,40 @@ Or install it yourself as:
38
38
 
39
39
  ## Usage
40
40
 
41
- TODO: Write usage instructions here
41
+ $ packetman -h
42
+
43
+ Usage: packetman [OPTIONS] FILTER_STRING
44
+ -p, --protocol PROTO Transport Protocol (tcp,udp,icmp)
45
+ -t, --transport OFFSET starts at transport header instead of data payload
46
+ -r, --radix RADIX Treat FILTER_STRING as RADIX instead of String
47
+ -o, --offset OFFSET Offset in bits
48
+ -b, --byte-offset Use 8-bit bytes instead of bits for offset
49
+ -w, --wildcard [CHARACTER=?] Treat CHARACTER as single-character wildcard
50
+ -v, --version Show version
51
+
52
+ Create and use a filter string to capture all HTTP GET requests to `/foo/bar`
53
+
54
+ $ sudo tcpdump -nA `packetman GET /foo/bar`
55
+ tcpdump: data link type PKTAP
56
+ tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
57
+ listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes
58
+ 16:49:04.516409 IP 127.0.0.1.54662 > 127.0.0.1.80: Flags [P.], seq 1488105913:1488105994, ack 1397163988, win 4121, options [nop,nop,TS val 875380202 ecr 2751916352], length 81: HTTP: GET /foo/bar HTTP/1.1
59
+ .....b....j...E.....@.@..S..
60
+ ..:.....PX...SG......75.....
61
+ 4-=....@GET /foo/bar HTTP/1.1
62
+ Host: localhost
63
+ User-Agent: curl/7.43.0
64
+ Accept: */*
65
+
66
+ Hexadecimal string with wildcards
67
+
68
+ $ packetman -r 16 -w '?' "A8C401???C200A"
69
+ tcp[((tcp[12:1] & 0xf0) >> 2) + 0:4] & 0xffffff00 = 0xa8c40100 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:2] & 0x0fff = 0x0c20 && tcp[((tcp[12:1] & 0xf0) >> 2) + 6:1] & 0xff = 0x0a
70
+
71
+ Base 4 string with wildcards and offset beginning at start of the TCP header
72
+
73
+ $ packetman -t -o 3 -r 4 -w i 1223iiii2212
74
+ tcp[0:4] & 0x1fe01fe0 = 0x0d6014c0
42
75
 
43
76
  ## Development
44
77
 
@@ -0,0 +1,14 @@
1
+ ---
2
+ dns: # packetman -bo 13 -p udp -w '.' 'google.com'
3
+ :offset: 13
4
+ :start_with_transport: false
5
+ :offset_type: :bytes
6
+ :wildcard: .
7
+ :transport: udp
8
+
9
+ dns_tcp: # packetman -bo 15 -p tcp -w '.' 'google.com'
10
+ :offset: 15 # DNS over TCP adds a 2 byte length field to the beginning of the standard DNS protocol
11
+ :start_with_transport: false
12
+ :offset_type: :bytes
13
+ :wildcard: .
14
+ :transport: tcp
data/config/protocols.yml CHANGED
@@ -1,29 +1,56 @@
1
1
  ---
2
2
  tcp:
3
3
  table:
4
- Source Port: 16
5
- Destination Port: 16
6
- Sequence Number: 32
7
- Acknowledgement Number: 32
8
- Data Offset: 4
9
- RESERVED: 3
10
- ECN: 3
11
- Control Bits: 6
12
- Window: 16
13
- Checksum: 16
14
- Urgent Pointer: 16
15
- Options and Padding: 32
4
+ - - :value: Source Port
5
+ :colspan: 16
6
+ - :value: Destination Port
7
+ :colspan: 16
8
+ - :separator
9
+ - - :value: Sequence Number
10
+ :colspan: 32
11
+ - :separator
12
+ - - :value: Acknowledgement Number
13
+ :colspan: 32
14
+ - :separator
15
+ - - :value: Data Offset
16
+ :colspan: 4
17
+ - :value: RESERVED
18
+ :colspan: 3
19
+ - :value: ECN
20
+ :colspan: 3
21
+ - :value: Control Bits
22
+ :colspan: 6
23
+ - :value: Window
24
+ :colspan: 16
25
+ - :separator
26
+ - - :value: Checksum
27
+ :colspan: 16
28
+ - :value: Urgent Pointer
29
+ :colspan: 16
30
+ - :separator
31
+ - - :value: Options and Padding
32
+ :colspan: 32
16
33
  payload_query: '((tcp[12:1] & 0xf0) >> 2)'
17
34
  udp:
18
35
  table:
19
- Source Port: 16
20
- Destination Port: 16
21
- Length: 16
22
- Checksum: 16
36
+ - - :value: Source Port
37
+ :colspan: 16
38
+ - :value: Destination Port
39
+ :colspan: 16
40
+ - :separator
41
+ - - :value: Length
42
+ :colspan: 16
43
+ - :value: Checksum
44
+ :colspan: 16
23
45
  payload_query: 8
24
46
  icmp:
25
47
  table:
26
- Type: 8
27
- Code: 8
28
- Checksum: 16
29
- Type Specific Options: 32
48
+ - - :value: Type
49
+ :colspan: 8
50
+ - :value: Code
51
+ :colspan: 8
52
+ - :value: Checksum
53
+ :colspan: 16
54
+ - :separator
55
+ - - :value: Type Specific Options
56
+ :colspan: 32
data/exe/packetman CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'packetman'
3
3
 
4
- search_str = Packetman.config.parse_opts
4
+ catch :exit do
5
+ search_str = Packetman.config.parse_opts
5
6
 
6
- puts Packetman::Filter.new(search_str)
7
+ puts Packetman::Filter.new(search_str)
8
+ end
@@ -2,24 +2,31 @@ module Packetman
2
2
  class Clause
3
3
  include ConfigMethods
4
4
 
5
- attr_accessor :search, :mask, :offset
5
+ attr_accessor :search, :mask, :start_bit
6
6
 
7
- def initialize(search, mask, offset)
7
+ def initialize(search, mask, start_bit)
8
8
  self.search = search
9
9
  self.mask = mask
10
- self.offset = offset
10
+ self.start_bit = start_bit
11
11
  end
12
12
 
13
- def start_byte(start_bit)
14
- "#{config.payload_query} + #{(config.offset_bits + start_bit)/8}"
13
+ # Address of first byte
14
+ def start_byte
15
+ [config.payload_query, (config.offset_bits + start_bit)/8].compact.join(' + ')
15
16
  end
16
17
 
17
- def data_address(start_bit, data_bits)
18
- "#{config.transport}[#{start_byte(start_bit)}:#{data_bits/8}]"
18
+ def num_bytes
19
+ Filter.bit_length(search)/8
19
20
  end
20
21
 
22
+ # Full address of the query data (eg. `tcp[0:4]`)
23
+ def data_address
24
+ "#{config.transport}[#{start_byte}:#{num_bytes}]"
25
+ end
26
+
27
+ # The whole filter clause fully assembled
21
28
  def to_s
22
- "#{data_address(offset, Filter.bit_length(search))} & #{mask} = #{search}"
29
+ "#{data_address} & #{mask} = #{search}"
23
30
  end
24
31
 
25
32
  end
@@ -2,48 +2,63 @@ require 'optparse'
2
2
 
3
3
  module Packetman
4
4
  class Config
5
- attr_accessor :transport, :application, :use_bytes, :radix, :start_with_transport, :offset, :wildcard
5
+ attr_accessor :transport, :application, :offset_type, :radix, :start_with_transport, :offset, :wildcard
6
6
 
7
7
  def initialize
8
- @transport = "tcp"
9
- @offset = 0
8
+ self.transport = "tcp"
9
+ self.offset = 0
10
+ self.offset_type = :bits
10
11
  end
11
12
 
12
13
  def protocols
13
14
  @protocols ||= YAML.load(File.read(File.expand_path('../../../config/protocols.yml', __FILE__)))
14
15
  end
15
16
 
17
+ def applications
18
+ @applications ||= YAML.load(File.read(File.expand_path('../../../config/applications.yml', __FILE__)))
19
+ end
20
+
16
21
  def payload_query
17
22
  protocols[transport]['payload_query'] unless start_with_transport
18
23
  end
19
24
 
20
25
  def offset_bits
21
- if use_bytes
26
+ if offset_type == :bytes
22
27
  offset*8
23
28
  else
24
29
  offset
25
30
  end
26
31
  end
27
32
 
33
+ # FIXME figure out a way to do defaults so this can just set defaults
34
+ def application_override(app_name)
35
+ applications[app_name].each do |key, value|
36
+ __send__("#{key}=", value)
37
+ end
38
+ end
39
+
28
40
  def opts
29
41
  @opts ||= OptionParser.new do |opt|
30
42
  opt.banner = "Usage: #{File.basename($PROGRAM_NAME)} [OPTIONS] FILTER_STRING"
31
- opt.on("-p", "--protocol PROTO", protocols.keys, "Transport Protocol ( #{protocols.keys.join(',')})") { |v| self.transport = v }
43
+ opt.on("-p", "--protocol PROTO", protocols.keys, "Transport Protocol (#{protocols.keys.join(',')})") { |v| self.transport = v }
44
+ opt.on("-a", "--application APPLICATION", applications.keys, "Application Protocol (#{applications.keys.join(',')}) OVERRIDES ALL OTHER SETTINGS") { |v| application_override(v) }
32
45
  opt.on("-t", "--transport", "OFFSET starts at transport header instead of data payload") { |v| self.start_with_transport = v }
33
46
  opt.on("-r", "--radix RADIX", Integer, "Treat FILTER_STRING as RADIX instead of String") { |v| self.radix = v }
34
47
  opt.on("-o", "--offset OFFSET", Integer, "Offset in bits") { |v| self.offset = v }
35
- opt.on("-b", "--byte-offset", "Use 8-bit bytes instead of bits for offset") { |v| self.use_bytes = v }
36
- opt.on("-w", "--wildcard [CHARACTER=?]", "Treat CHARACTER as single-character wildcard") { |v| raise "invalid wildcard" if v.to_s.length > 1; self.wildcard = v || '?' }
37
- opt.on("-v", "--version", "Show version") { puts Packetman::VERSION; exit }
48
+ opt.on("-b", "--byte-offset", "Use 8-bit bytes instead of bits for offset") { |v| self.offset_type = :bytes if v }
49
+ opt.on("-w", "--wildcard CHARACTER", "Treat CHARACTER as single-character wildcard") { |v| raise "invalid wildcard" if v.to_s.length > 1; self.wildcard = v }
50
+ opt.on("--table", "Show transport header table") { puts Packetman::Table.new; throw :exit }
51
+ opt.on("-v", "--version", "Show version") { puts Packetman::VERSION; throw :exit }
38
52
  end
39
53
  end
40
54
 
41
-
42
55
  def parse_opts
43
- filter_str = ARGV.pop
44
- raise "Invalid command line arguments" unless filter_str
45
- opts.parse!
46
- filter_str
56
+ unparsed_opts = opts.parse!
57
+ if unparsed_opts.length < 1
58
+ puts opts
59
+ throw :exit
60
+ end
61
+ unparsed_opts.join(" ")
47
62
  end
48
63
 
49
64
  end
@@ -13,33 +13,36 @@ module Packetman
13
13
  case num
14
14
  when /^0x/
15
15
  $'.length * bit_density(16)
16
- when /^0b/
17
- $'.length * bit_density(2)
18
16
  else
19
17
  nil
20
18
  end
21
19
  end
22
20
 
23
21
  def self.bit_density(radix=config.radix)
24
- (radix.nil?) ? 8 : Math.log2(radix).to_i
22
+ (radix.nil?) ? 8 : Math.log2(radix).ceil
25
23
  end
26
24
 
27
25
  def map_chr
28
- pad_right(input.scan(/./).map{ |chr| yield chr }.join)
26
+ shift_and_pad(input.scan(/./).map{ |chr| yield chr }.join)
29
27
  end
30
28
 
31
- def pad_right(bin_str)
32
- bin_str.ljust(desired_length, '0')
29
+ def shift_and_pad(bin_str)
30
+ #shift
31
+ bin_str.ljust(target_bit_length, '0').
32
+ #pad
33
+ rjust(target_bit_length + config.offset_bits % 8, '0')
33
34
  end
34
35
 
35
- def desired_length
36
- ((input.length + config.offset_bits)/8.to_f).ceil*8 - config.offset_bits
36
+ def target_bit_length
37
+ ((input.length*self.class.bit_density + config.offset_bits)/8.to_f).ceil*8 - config.offset_bits
37
38
  end
38
39
 
40
+ # Mask for 1 character of current radix
39
41
  def radix_mask
40
42
  ("1"*self.class.bit_density).to_i(2)
41
43
  end
42
44
 
45
+ # Mask string for _chr_ substituting wildcards as necessary
43
46
  def mask_chr(chr)
44
47
  if chr == config.wildcard
45
48
  0
@@ -48,14 +51,21 @@ module Packetman
48
51
  end.to_s(2).rjust(self.class.bit_density, '0')
49
52
  end
50
53
 
54
+ # Converts the `chr` from `config.radix` to binary, substituting wildcards as necessary
55
+ #
56
+ # @param chr [String] character to convert to binary
57
+ # @return [String] binary string
51
58
  def bin_chr(chr)
52
- chr = '0' if chr == config.wildcard
53
-
54
59
  if config.radix
60
+ chr = '0' if chr == config.wildcard
55
61
  raise "invalid character '#{chr}' for radix=#{config.radix}" if chr.downcase != chr.to_i(config.radix).to_s(config.radix).downcase
56
62
  chr.to_i(config.radix)
57
63
  else
58
- chr.ord
64
+ if chr == config.wildcard
65
+ 0
66
+ else
67
+ chr.ord
68
+ end
59
69
  end.to_s(2).rjust(self.class.bit_density, '0')
60
70
  end
61
71
 
@@ -67,6 +77,7 @@ module Packetman
67
77
  hex_encode(map_chr{ |c| bin_chr(c) })
68
78
  end
69
79
 
80
+ # Transform _bin_str_ to array of 32, 16, and 8 bit hex encoded strings
70
81
  def hex_encode(bin_str)
71
82
  bin_str.reverse.scan(/.{1,4}/).map{ |chunk|
72
83
  chunk.reverse.to_i(2).to_s(16)
@@ -75,14 +86,18 @@ module Packetman
75
86
  }
76
87
  end
77
88
 
78
- def to_s
79
- offset = 0
89
+ def clauses
90
+ start_bit = 0
80
91
  [].tap do |filter|
81
92
  search_hex.zip(mask_hex).each do |search, mask|
82
- filter << Packetman::Clause.new(search, mask, offset)
83
- offset += self.class.bit_length(search)
93
+ filter << Packetman::Clause.new(search, mask, start_bit)
94
+ start_bit += self.class.bit_length(search)
84
95
  end
85
- end.map{ |b| b.to_s }.join(' && ')
96
+ end
97
+ end
98
+
99
+ def to_s
100
+ clauses.map{ |clause| clause.to_s }.join(' && ')
86
101
  end
87
102
 
88
103
  end
@@ -1,57 +1,28 @@
1
+ require 'terminal-table'
2
+
1
3
  module Packetman
2
4
  class Table
3
5
  include ConfigMethods
4
6
 
5
- attr_reader :line_h, :line_v
6
- attr_accessor :columns
7
-
8
- def initialize(cols = 32)
9
- @line_v = '|'
10
- @line_h = '-'
11
- @columns = cols
12
- end
13
-
14
- def line_h=(value)
15
- raise "Invalid character" if value.length != 1
16
- @line_h = value
17
- end
18
-
19
- def line_v=(value)
20
- raise "Invalid character" if value.length != 1
21
- @line_v = value
22
- end
23
-
24
- def column_width
25
- (columns-1).to_s.length
26
- end
7
+ def initialize
27
8
 
28
- def horizontal_bar
29
- line_v + line_h*(table_width - 2) + line_v + "\n"
9
+ @term_table = Terminal::Table.new(headings: headings, rows: rows, style: style)
30
10
  end
31
11
 
32
- def table_width
33
- columns*(column_width + 1) + 1
12
+ def headings
13
+ [*0..31].map{ |c| "%02d" % c }
34
14
  end
35
15
 
36
- def cell_size(field_size)
37
- field_size*(column_width + 1) - 1
16
+ def rows
17
+ protocols[config.transport]['table']
38
18
  end
39
19
 
40
- def header_row
41
- line_v + columns.times.map{ |n| sprintf "%0#{column_width}d", n }.join(line_v) + line_v + "\n"
20
+ def style
21
+ { alignment: :center, padding_left: 0, padding_right: 0}
42
22
  end
43
23
 
44
24
  def to_s
45
- output = horizontal_bar + header_row + horizontal_bar
46
-
47
- protocols[config.transport]['table'].each do |label, size|
48
- output += sprintf "%s%.#{cell_size(size)}s", line_v, label.center(cell_size(size))
49
- if output.split("\n").last.length == (table_width - 1)
50
- output += line_v + "\n"
51
- output += horizontal_bar
52
- end
53
- end
54
- output
25
+ @term_table.to_s
55
26
  end
56
27
 
57
28
  end
@@ -1,3 +1,3 @@
1
1
  module Packetman
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.6"
3
3
  end
data/packetman.gemspec CHANGED
@@ -19,9 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "rspec", "~> 3.3"
25
- spec.add_development_dependency "pry", "~> 0.10"
26
- spec.add_development_dependency "codeclimate-test-reporter"
22
+ spec.add_dependency "terminal-table", "~> 1.8"
23
+ spec.add_development_dependency "bundler", "~> 2.0"
24
+ spec.add_development_dependency "rake", "~> 13.0"
25
+ spec.add_development_dependency "rspec", "~> 3.9"
26
+ spec.add_development_dependency "simplecov", "~> 0.17"
27
+ spec.add_development_dependency "pry", "~> 0.12"
27
28
  end
metadata CHANGED
@@ -1,85 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packetman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Scholl
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-28 00:00:00.000000000 Z
11
+ date: 2021-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: terminal-table
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '1'
33
+ version: '2.0'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '1'
40
+ version: '2.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '10.0'
47
+ version: '13.0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '10.0'
54
+ version: '13.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '3.3'
61
+ version: '3.9'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '3.3'
68
+ version: '3.9'
55
69
  - !ruby/object:Gem::Dependency
56
- name: pry
70
+ name: simplecov
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0.10'
75
+ version: '0.17'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0.10'
82
+ version: '0.17'
69
83
  - !ruby/object:Gem::Dependency
70
- name: codeclimate-test-reporter
84
+ name: pry
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ">="
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '0'
89
+ version: '0.12'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ">="
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '0'
96
+ version: '0.12'
83
97
  description: Simple tool for creating advanced tcpdump queries, because manually writing
84
98
  `tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420` is no fun.
85
99
  email:
@@ -89,9 +103,10 @@ executables:
89
103
  extensions: []
90
104
  extra_rdoc_files: []
91
105
  files:
106
+ - ".bundle/config"
107
+ - ".circleci/config.yml"
92
108
  - ".gitignore"
93
109
  - ".rspec"
94
- - ".travis.yml"
95
110
  - Gemfile
96
111
  - LICENSE.txt
97
112
  - NOTES.md
@@ -100,7 +115,7 @@ files:
100
115
  - TODO.md
101
116
  - bin/console
102
117
  - bin/setup
103
- - circle.yml
118
+ - config/applications.yml
104
119
  - config/protocols.yml
105
120
  - exe/packetman
106
121
  - lib/packetman.rb
@@ -115,7 +130,7 @@ homepage: https://github.com/jescholl/packetman
115
130
  licenses:
116
131
  - MIT
117
132
  metadata: {}
118
- post_install_message:
133
+ post_install_message:
119
134
  rdoc_options: []
120
135
  require_paths:
121
136
  - lib
@@ -130,9 +145,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
145
  - !ruby/object:Gem::Version
131
146
  version: '0'
132
147
  requirements: []
133
- rubyforge_project:
134
- rubygems_version: 2.4.5.1
135
- signing_key:
148
+ rubyforge_project:
149
+ rubygems_version: 2.7.6.2
150
+ signing_key:
136
151
  specification_version: 4
137
152
  summary: Advanced tcpdump and Wiresharp filter generator.
138
153
  test_files: []
data/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.2.2
4
- before_install: gem install bundler -v 1.10.5
data/circle.yml DELETED
@@ -1,3 +0,0 @@
1
- machine:
2
- ruby:
3
- version: 2.1.6