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 +5 -5
- data/.bundle/config +2 -0
- data/.circleci/config.yml +55 -0
- data/.gitignore +1 -0
- data/README.md +35 -2
- data/config/applications.yml +14 -0
- data/config/protocols.yml +47 -20
- data/exe/packetman +4 -2
- data/lib/packetman/clause.rb +15 -8
- data/lib/packetman/config.rb +28 -13
- data/lib/packetman/filter.rb +31 -16
- data/lib/packetman/table.rb +11 -40
- data/lib/packetman/version.rb +1 -1
- data/packetman.gemspec +6 -5
- metadata +38 -23
- data/.travis.yml +0 -4
- data/circle.yml +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d3b1cf3885dcdce498b69eb568a10f6bb728a9af2ca0d0bd9f50510137416f9e
|
4
|
+
data.tar.gz: e4af77b424e0074748bb7c034a191a475e68c5f5daaf545b0c23910b01447dc0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 188bb0f019470028ccabc251bbe195038728c81be5dcbdec98f121d153ca273b19e51390613600a99b0eadca571f20fb33530e4f9a3d871a2d49a5dc1e8deee4
|
7
|
+
data.tar.gz: 794018ddb9156cfcfcb174163877fb4518cebc57df9d1cf22fe021a54899b71c94e9fb73c70f62ee236a2c3518df35c300aa7b00d70b46da8fcf0e090cf2e879
|
data/.bundle/config
ADDED
@@ -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
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Packetman
|
2
2
|
|
3
|
-
Advanced tcpdump and Wireshark
|
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
|
-
|
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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
data/lib/packetman/clause.rb
CHANGED
@@ -2,24 +2,31 @@ module Packetman
|
|
2
2
|
class Clause
|
3
3
|
include ConfigMethods
|
4
4
|
|
5
|
-
attr_accessor :search, :mask, :
|
5
|
+
attr_accessor :search, :mask, :start_bit
|
6
6
|
|
7
|
-
def initialize(search, mask,
|
7
|
+
def initialize(search, mask, start_bit)
|
8
8
|
self.search = search
|
9
9
|
self.mask = mask
|
10
|
-
self.
|
10
|
+
self.start_bit = start_bit
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
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
|
18
|
-
|
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
|
29
|
+
"#{data_address} & #{mask} = #{search}"
|
23
30
|
end
|
24
31
|
|
25
32
|
end
|
data/lib/packetman/config.rb
CHANGED
@@ -2,48 +2,63 @@ require 'optparse'
|
|
2
2
|
|
3
3
|
module Packetman
|
4
4
|
class Config
|
5
|
-
attr_accessor :transport, :application, :
|
5
|
+
attr_accessor :transport, :application, :offset_type, :radix, :start_with_transport, :offset, :wildcard
|
6
6
|
|
7
7
|
def initialize
|
8
|
-
|
9
|
-
|
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
|
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 (
|
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.
|
36
|
-
opt.on("-w", "--wildcard
|
37
|
-
opt.on("
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
data/lib/packetman/filter.rb
CHANGED
@@ -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).
|
22
|
+
(radix.nil?) ? 8 : Math.log2(radix).ceil
|
25
23
|
end
|
26
24
|
|
27
25
|
def map_chr
|
28
|
-
|
26
|
+
shift_and_pad(input.scan(/./).map{ |chr| yield chr }.join)
|
29
27
|
end
|
30
28
|
|
31
|
-
def
|
32
|
-
|
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
|
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.
|
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
|
79
|
-
|
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,
|
83
|
-
|
93
|
+
filter << Packetman::Clause.new(search, mask, start_bit)
|
94
|
+
start_bit += self.class.bit_length(search)
|
84
95
|
end
|
85
|
-
end
|
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
|
data/lib/packetman/table.rb
CHANGED
@@ -1,57 +1,28 @@
|
|
1
|
+
require 'terminal-table'
|
2
|
+
|
1
3
|
module Packetman
|
2
4
|
class Table
|
3
5
|
include ConfigMethods
|
4
6
|
|
5
|
-
|
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
|
-
|
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
|
33
|
-
|
12
|
+
def headings
|
13
|
+
[*0..31].map{ |c| "%02d" % c }
|
34
14
|
end
|
35
15
|
|
36
|
-
def
|
37
|
-
|
16
|
+
def rows
|
17
|
+
protocols[config.transport]['table']
|
38
18
|
end
|
39
19
|
|
40
|
-
def
|
41
|
-
|
20
|
+
def style
|
21
|
+
{ alignment: :center, padding_left: 0, padding_right: 0}
|
42
22
|
end
|
43
23
|
|
44
24
|
def to_s
|
45
|
-
|
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
|
data/lib/packetman/version.rb
CHANGED
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.
|
23
|
-
spec.add_development_dependency "
|
24
|
-
spec.add_development_dependency "
|
25
|
-
spec.add_development_dependency "
|
26
|
-
spec.add_development_dependency "
|
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.
|
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:
|
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: '
|
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: '
|
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: '
|
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: '
|
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.
|
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.
|
68
|
+
version: '3.9'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: simplecov
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
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.
|
82
|
+
version: '0.17'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
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
|
-
-
|
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.
|
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
data/circle.yml
DELETED