packetman 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d179b4712440f17879c705887caeec69fd857517
4
+ data.tar.gz: 7879478eab7e6ecca5d75bff051a5dcad4006465
5
+ SHA512:
6
+ metadata.gz: 59f189ec8d961cc829938163d21daffea43b4ce14f5b0487d49339ad59abf6cbefabfbb5254e2b949132987ee06df4b584664d9e0d1f7973c33835c1328cd59a
7
+ data.tar.gz: 4e6b9134085f93800d07dd8a5e218c48d1c25260832b837c4f2e4fc365545234589232e0af344b8e1687eb90f6aa93d91875a341cfcf1165c1bec3d2341fd3a5
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ before_install: gem install bundler -v 1.10.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in packetman.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Jason Scholl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,5 @@
1
+ ## ICMP
2
+
3
+ ICMP is technically layer 3, but due to the fact that it behaves a lot like layer
4
+ 4 protocols and tcpdump has built-in handling for it just like TCP and UDP, I
5
+ chose to treat it as layer 4.
@@ -0,0 +1,53 @@
1
+ # Packetman
2
+
3
+ Advanced tcpdump and Wireshark capture generator.
4
+
5
+ [![Code Climate](https://codeclimate.com/github/jescholl/packetman/badges/gpa.svg)](https://codeclimate.com/github/jescholl/packetman) [![Test Coverage](https://codeclimate.com/github/jescholl/packetman/badges/coverage.svg)](https://codeclimate.com/github/jescholl/packetman/coverage) [![Circle CI](https://circleci.com/gh/jescholl/packetman.svg?style=svg)](https://circleci.com/gh/jescholl/packetman)
6
+
7
+ Packetman is a packet capture filter generator modeled after [Wireshark's String-Matching Capture Filter Generator](https://www.wireshark.org/tools/string-cf.html) but with a lot more features allowing much finer control over the packets you see.
8
+
9
+ Features:
10
+ * String-matching (just like Wireshark's tool)
11
+ * bit-string matching
12
+ * hex-string matching
13
+ * easy masking through `?` wildcard characters
14
+ * offsets in bits or bytes
15
+ * use header field name instead of manual offsets
16
+ * application specific queries
17
+ * built-in header reference tables
18
+
19
+ ## Installation
20
+
21
+ Add this line to your application's Gemfile:
22
+
23
+ ```ruby
24
+ gem 'packetman'
25
+ ```
26
+
27
+ And then execute:
28
+
29
+ $ bundle
30
+
31
+ Or install it yourself as:
32
+
33
+ $ gem install packetman
34
+
35
+ ## Usage
36
+
37
+ TODO: Write usage instructions here
38
+
39
+ ## Development
40
+
41
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
42
+
43
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
44
+
45
+ ## Contributing
46
+
47
+ Bug reports and pull requests are welcome on GitHub at https://github.com/jescholl/packetman.
48
+
49
+
50
+ ## License
51
+
52
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
53
+
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/TODO.md ADDED
@@ -0,0 +1,3 @@
1
+ ##Config
2
+
3
+ * add handling for ICMP's lack of payload query
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "packetman"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ require "pry"
10
+ Pry.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,3 @@
1
+ machine:
2
+ ruby:
3
+ version: 2.1.6
@@ -0,0 +1,35 @@
1
+ ---
2
+ transport:
3
+ tcp:
4
+ table:
5
+ Source Port: 16
6
+ Destination Port: 16
7
+ Sequence Number: 32
8
+ Acknowledgement Number: 32
9
+ Data Offset: 4
10
+ RESERVED: 3
11
+ ECN: 3
12
+ Control Bits: 6
13
+ Window: 16
14
+ Checksum: 16
15
+ Urgent Pointer: 16
16
+ Options and Padding: 32
17
+ payload_query: '((tcp[12:1] & 0xf0) >> 2)'
18
+ udp:
19
+ table:
20
+ Source Port: 16
21
+ Destination Port: 16
22
+ Length: 16
23
+ Checksum: 16
24
+ payload_query: 8
25
+ icmp:
26
+ table:
27
+ Type: 8
28
+ Code: 8
29
+ Checksum: 16
30
+ Type Specific Options: 32
31
+ application:
32
+ http:
33
+ transport_protocol: tcp
34
+ dns:
35
+ transport_protocol: tcp
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require 'packetman'
3
+
4
+ search_str = Packetman.config.parse_opts
5
+
6
+ puts Packetman::Compose.new(search_str)
@@ -0,0 +1,24 @@
1
+ require 'yaml'
2
+ require "packetman/version"
3
+ require "packetman/config"
4
+ require "packetman/config_methods"
5
+ require "packetman/table"
6
+ require "packetman/compose"
7
+
8
+ module Packetman
9
+ class << self
10
+
11
+ def config
12
+ @config ||= Config.new
13
+ end
14
+
15
+ def config!
16
+ @config = Config.new
17
+ end
18
+
19
+ def user_input(prompt)
20
+ puts prompt
21
+ gets
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,97 @@
1
+ module Packetman
2
+ class Compose
3
+ include ConfigMethods
4
+
5
+ def initialize(input, radix=config.radix)
6
+ @input = input
7
+ @radix = radix
8
+ end
9
+
10
+ def desired_length
11
+ ((@input.length + config.offset)/8.to_f).ceil*8 - config.offset
12
+ end
13
+
14
+ def bit_density(radix=@radix)
15
+ (radix.nil?) ? 8 : Math.log2(radix).to_i
16
+ end
17
+
18
+ def mask
19
+ shift(@input.scan(/./).map{ |c| mask_chr(c) }.join)
20
+ end
21
+
22
+ def radix_mask
23
+ ("1"*bit_density).to_i(2)
24
+ end
25
+
26
+ def shift(input)
27
+ input.ljust(desired_length, '0')
28
+ end
29
+
30
+ def search
31
+ shift(@input.scan(/./).map{ |c| bin_chr(c) }.join)
32
+ end
33
+
34
+ def mask_chr(chr)
35
+ if chr == '?'
36
+ raise "wildcards not allowed" unless config.allow_wildcards
37
+ 0
38
+ else
39
+ radix_mask
40
+ end.to_s(2).rjust(bit_density, '0')
41
+ end
42
+
43
+ def bin_chr(chr)
44
+ if chr == '?'
45
+ raise "wildcards not allowed" unless config.allow_wildcards
46
+ chr = '0'
47
+ end
48
+
49
+ if @radix
50
+ chr.to_i(@radix)
51
+ else
52
+ chr.ord
53
+ end.to_s(2).rjust(bit_density, '0')
54
+ end
55
+
56
+ def mask_hex
57
+ hex_encode(mask)
58
+ end
59
+
60
+ def search_hex
61
+ hex_encode(search)
62
+ end
63
+
64
+ def hex_encode(bin_str)
65
+ bin_str.reverse.scan(/.{1,4}/).map{ |chunk| chunk.reverse.to_i(2).to_s(16) }.reverse.join.scan(/.{1,8}/).map{ |hex| hex.prepend('0x') }
66
+ end
67
+
68
+ def full_bit_length(num, radix=nil)
69
+ return num.to_i(radix).to_s(radix).length * bit_density(radix) if radix
70
+
71
+ case num
72
+ when /^0x/
73
+ $'.length * bit_density(16)
74
+ when /^0b/
75
+ $'.length * bit_density(2)
76
+ else
77
+ nil
78
+ end
79
+ end
80
+
81
+ def start_byte(position)
82
+ "#{config.payload_query} + #{(config.offset + position)/8}"
83
+ end
84
+
85
+ def to_s
86
+ clauses = []
87
+ position = 0
88
+ search_hex.zip(mask_hex).each_with_index do |(hex_search, hex_mask),i|
89
+ search_bit_length = full_bit_length(hex_search)
90
+ clauses << "#{config.transport}[#{start_byte(position)}:#{search_bit_length/8}] & #{hex_mask} = #{hex_search}"
91
+ position += search_bit_length
92
+ end
93
+
94
+ clauses.join(' && ')
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,71 @@
1
+ require 'optparse'
2
+
3
+ module Packetman
4
+ class Config
5
+ attr_accessor :transport, :application, :offset_units, :offset_type, :allow_wildcards, :radix
6
+ attr_writer :offset
7
+
8
+ def initialize
9
+ @transport = "tcp"
10
+ @application = "http"
11
+ @offset = 0
12
+ @offset_units = "bits"
13
+ @offset_type = "application"
14
+ @allow_wildcards = true
15
+ end
16
+
17
+ def protocols
18
+ @protocols ||= YAML.load(File.read(File.expand_path('../../../config/protocols.yml', __FILE__)))
19
+ end
20
+
21
+ def payload_query
22
+ case offset_type
23
+ when "application"
24
+ protocols['transport'][transport.to_s]['payload_query']
25
+ else
26
+ "0"
27
+ end
28
+ end
29
+
30
+ def offset
31
+ case offset_units
32
+ when "bytes"
33
+ @offset*8
34
+ else
35
+ @offset
36
+ end
37
+ end
38
+
39
+ def parse_opts
40
+ @opts ||= OptionParser.new do |opt|
41
+ opt.banner = "Usage: #{File.basename($PROGRAM_NAME)} [OPTIONS] FILTER_STRING"
42
+ opt.on("-t", "--transport [PROTO]", protocols['transport'].keys, "Transport Protocol (#{protocols['transport'].keys.join(',')})") {|v| self.transport = v }
43
+ opt.on("-a", "--application [PROTO]", protocols['application'].keys, "Application protocol (#{protocols['application'].keys.join(',')})") { |v| self.application = v }
44
+ #opt.on("-a", "--application [PROTO]", String, "Application Protocol (http|dns|icmp)") {|v| self.application = v }
45
+ opt.on("-r", "--radix [RADIX]", Integer, "Treat FILTER_STRING as RADIX instead of String") {|v| self.radix = v; }
46
+ opt.on("-o", "--offset [OFFSET]", Integer, "Offset in bits") {|v| self.offset = v; }
47
+ opt.on("-b", "--byte-offset", "Use 8-bit bytes instead of bits for offset") { |v| self.offset_units = "bytes" }
48
+ opt.on("-O", "--offset-type [TYPE]", ["application", "transport"], "Begin offset at the application/transport header.") { |v| self.offset_type = v }
49
+ opt.on("--[no-]wildcards", "Allow '?' wildcards") { |v| self.allow_wildcards = v }
50
+ end
51
+
52
+ @opts.parse!
53
+
54
+ raise "Invalid command line arguments" if ARGV.size != 1
55
+
56
+ ARGV.pop
57
+
58
+
59
+ # if transport !~ /tcp|udp/i ||
60
+ # application !~ /http|dns|icmp/i
61
+ # raise "invalid options"
62
+ # end
63
+ #
64
+ # if offset_units == :bits
65
+ # offset /= 8.to_f
66
+ # offset_units = :octets
67
+ # end
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,11 @@
1
+ module Packetman
2
+ module ConfigMethods
3
+ def self.included(base)
4
+ base.extend(self)
5
+ end
6
+
7
+ def config
8
+ Packetman.config
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,58 @@
1
+ module Packetman
2
+ class Table
3
+ include ConfigMethods
4
+
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
27
+
28
+ def horizontal_bar
29
+ line_v + line_h*(table_width - 2) + line_v + "\n"
30
+ end
31
+
32
+ def table_width
33
+ columns*(column_width + 1) + 1
34
+ end
35
+
36
+ def cell_size(field_size)
37
+ field_size*(column_width + 1) - 1
38
+ end
39
+
40
+ def header_row
41
+ line_v + columns.times.map{ |n| sprintf "%0#{column_width}d", n }.join(line_v) + line_v + "\n"
42
+ end
43
+
44
+ def to_s
45
+ output = horizontal_bar + header_row + horizontal_bar
46
+
47
+ config.protocols['transport'][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
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,3 @@
1
+ module Packetman
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'packetman/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "packetman"
8
+ spec.version = Packetman::VERSION
9
+ spec.authors = ["Jason Scholl"]
10
+ spec.email = ["jason.e.scholl@gmail.com"]
11
+
12
+ spec.summary = %q{Advanced tcpdump and Wiresharp filter generator.}
13
+ spec.description = %q{Simple tool for creating advanced tcpdump queries, because manually writing `tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420` is no fun.}
14
+ spec.homepage = "https://github.com/jescholl/packetman"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
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"
27
+ end
@@ -0,0 +1,156 @@
1
+ 7a
2
+ 1111010
3
+
4
+ #NOTE: I think this is wrong
5
+ # also, maybe I don't need to worry about the bits bing aligned on the byte, just on the bit, as long as it's what the user asked for
6
+
7
+ hex and string need to be 0 padded on the left
8
+ binary needs to fill to the right to hex encode, starting at the offset bit
9
+
10
+ Packetman.compose3("0b1111", 3)
11
+ 1111
12
+ (fill right to ((4+3)/8.to_f).ceil*8 = 8 )
13
+ 11110000
14
+ (shift mask and search >> 3)
15
+ 00011110
16
+ 00011110
17
+ (sample byte sequence)
18
+ 00011111
19
+
20
+ Packetman.compose3("0b1111010", 3)
21
+ 1111010
22
+ (fill right to ((7+3)/8.to_f).ceil*8 = 16)
23
+ 11110100 00000000
24
+ (shift mask and search >> 3)
25
+ 00011111 11000000
26
+ 00011110 10000000
27
+ (sample byte sequence)
28
+ 00011110 10101010
29
+
30
+
31
+ Packetman.compose3("0b1111010????????", 3)
32
+ 1111010? ???????
33
+ (fill right to ((15+3)/8.to_f).ceil*8 = 24)
34
+ 1111010? ???????0 00000000
35
+ (shift mask and search >> 3)
36
+ 00011111 11000000 00000000
37
+ 00011110 10000000 00000000
38
+ (sample byte sequence)
39
+ 00011110 10101010 10101010
40
+
41
+ Packetman.compose3("0x123",3)
42
+ 100100011
43
+ (left fill to 12 first, or manual right fill with 16-12)
44
+ (fill right to ((3*4)+3)/8.to_f).ceil*8 = 16)
45
+ 00010010 00110000
46
+ (shift mask and search >> 3)
47
+ 00000011 11111110
48
+ 00000010 01000110
49
+ (sample byte sequence)
50
+ 00000010 01000111
51
+
52
+
53
+
54
+
55
+ Packetman.compose3("0xa",3)
56
+ "((tcp[0:1] & 0xa) >> 1) = 0xa"
57
+ 1010
58
+ (generate shifted mask)
59
+ 00011110
60
+ (generate shifted search)
61
+ 00010100
62
+ (sample byte sequence)
63
+ 10010101
64
+
65
+ 0b00011110 & 0b10010101 == 0x14
66
+
67
+
68
+
69
+
70
+
71
+
72
+ Packetman.compose3("0b001010010", 3)
73
+ "((tcp[0:2] & 0x1ff0) >> 4 = 0x52"
74
+ 001010010
75
+ (generate shifted mask)
76
+ (turn preceding 0s to 1s)
77
+ (left shift (((binlen)+3)/8.to_f).ceil*8 - binlen - 3)
78
+ 1111111110000
79
+ (generate shifted search - same as above)
80
+ 0010100100000
81
+ (sample byte sequence)
82
+ 0010100101010
83
+
84
+ 0b0010100101010 & 1111111110000 == 0b0010100100000
85
+
86
+
87
+ Packetman.compose3("0b00??1010?111?00010101??10101010?????1010111110???111110101001111010101??????????10100101010100011???????", 5)
88
+ 00??1010?111?00010101??10101010?????1010111110???111110101001111010101??????????10100101010100011???????
89
+ (generate search str - replace ?s with 0s)
90
+ 00001010011100001010100101010100000010101111100001111101010011110101010000000000101001010101000110000000
91
+ (generate shifted mask)
92
+ (turn preceding 0s to 1s)
93
+ (left shift (((binlen)+5)/8.to_f).ceil*8 - binlen - 5)
94
+ 11001111011101111111100111111110000011111111110001111111111111111111110000000000111111111111111110000000000
95
+ 11001111011101111111100111111110000011111111110001111111111111111111110000000000111111111111111110000000
96
+ (generate shifted search - same as above)
97
+ 00001010011100001010100101010100000010101111100001111101010011110101010000000000101001010101000110000000000
98
+ (sample byte sequence)
99
+ 00011010011100001010111101010101100110101111100101111101010011110101010010101001101001010101000110110100101
100
+
101
+ 00011010011100001010111101010101100110101111100101111101010011110101010010101001101001010101000110110100101 &
102
+ 11001111011101111111100111111110000011111111110001111111111111111111110000000000111111111111111110000000000 ==
103
+ 00001010011100001010100101010100000010101111100001111101010011110101010000000000101001010101000110000000000
104
+
105
+
106
+ # NOTE
107
+
108
+ instead of shifting the product of (mask & input), shift search
109
+ this makes the form
110
+ "tcp[0:1] & mask = shifted_search"
111
+
112
+
113
+ Packetman.compose3("0xa",1)
114
+ "((tcp[0:1] & 0x78) >> 3) = 0xa"
115
+ 1010
116
+ (generate shifted mask)
117
+ (left shift (((hexlen*4)+1)/8.to_f).ceil*8 - hexlen*4 - 1)
118
+ (use length of mask to determine how much data to take)
119
+ 01111000
120
+ (sample byte sequence)
121
+ 11010101
122
+
123
+ (0b01111000 & 0b11010101) >> 3 == 0xa
124
+
125
+
126
+ Packetman.compose3("0x123", 3)
127
+ "((tcp[0:2] & 0x1ffe) >> 1) = 0x123"
128
+ 100100011
129
+ (hex: left fill with 1s to hexlen*4)
130
+ 111100100011
131
+ (generate shifted mask)
132
+ (left shift (((hexlen*4)+3)/8.to_f).ceil*8 - hexlen*4 - 3)
133
+ (use length of mask to determine how much data to take)
134
+ 0001111111111110
135
+ (sample byte sequence)
136
+ 1000001001000111
137
+
138
+ (0b1000001001000111 & 0b0001111111111110) >> 1 == 0x123
139
+
140
+ Packetman.compose3("abc", 3)
141
+ "((tcp[0:4] & 0x1fffffe0 >> 5) = 0x616263"
142
+ 11000010110001001100011
143
+ (str: left fill with 1s to len*8)
144
+ 111000010110001001100011
145
+ (generate shifted mask)
146
+ (left shift (((strlen*8)+3)/8.to_f).ceil*8 - strlen*8 - 3)
147
+ (use length of mask to determine how much data to take)
148
+ 00011111 11111111 11111111 11100000
149
+ (sample byte sequence)
150
+ 10101100 00101100 01001100 01110101
151
+
152
+ (0b10101100001011000100110001110101 & 0b00011111111111111111111111100000) >> 5 == 0b11000010110001001100011
153
+
154
+
155
+
156
+
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: packetman
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jason Scholl
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-09-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: codeclimate-test-reporter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Simple tool for creating advanced tcpdump queries, because manually writing
84
+ `tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420` is no fun.
85
+ email:
86
+ - jason.e.scholl@gmail.com
87
+ executables:
88
+ - packetman
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".gitignore"
93
+ - ".rspec"
94
+ - ".travis.yml"
95
+ - Gemfile
96
+ - LICENSE.txt
97
+ - NOTES.md
98
+ - README.md
99
+ - Rakefile
100
+ - TODO.md
101
+ - bin/console
102
+ - bin/setup
103
+ - circle.yml
104
+ - config/protocols.yml
105
+ - exe/packetman
106
+ - lib/packetman.rb
107
+ - lib/packetman/compose.rb
108
+ - lib/packetman/config.rb
109
+ - lib/packetman/config_methods.rb
110
+ - lib/packetman/table.rb
111
+ - lib/packetman/version.rb
112
+ - packetman.gemspec
113
+ - packetman_notes
114
+ homepage: https://github.com/jescholl/packetman
115
+ licenses:
116
+ - MIT
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.4.5
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Advanced tcpdump and Wiresharp filter generator.
138
+ test_files: []