packetman 0.1.2 → 0.1.6
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.
- 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
|
[](http://badge.fury.io/rb/packetman)
|
|
6
6
|
[](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