packetgen 2.5.0 → 2.5.1

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
2
  SHA256:
3
- metadata.gz: 1fde6bab111f7f367b7811089be8b96a9845dad53b7205d25db0931303654189
4
- data.tar.gz: 06c46f06148846640ccfd123a21198c003ef2763c9ff78797fe27d9df4d25555
3
+ metadata.gz: 1db3896f30ec86544f468386feb20fcc301e39d5451383543e2ccabb7ca33585
4
+ data.tar.gz: 21e62d53f3915d9d19fbcf2475e4c9fd60dfe58c1427b7bd65ead51a298141ac
5
5
  SHA512:
6
- metadata.gz: 8b0283250922dcaa606652e96f6f159d4fa2a4ce895b5539234e01da155bb5e50aa6286aba7cbc33246650e6739ec98de65676423c5f4c36aa1050024966f6bf
7
- data.tar.gz: 179e87a341e6ae7a95e0a9a408fbde3b82601e21c37d49bd64d6dee3bb4debf82f77898e6e9e93b3763b3695feec19eb87396b0c6adb956bcbac13a293df2aa3
6
+ metadata.gz: f5dbe26467d9000d411a810e3a4165e842064a1ad4550b407013ef0b6dee98903a840ad228831a3b292c43d1c5d78e7a418d419eea777d00cab4f411d7d1e5dc
7
+ data.tar.gz: 66986fab978377b8cf10a1b9a48b2f7d4d4344cec74339db371e690bcd0c98c931699c41812f24998cf403c775feae2b4f53a99082daaced371244de332d7ce4
data/.travis.yml CHANGED
@@ -6,15 +6,6 @@ rvm:
6
6
  - 2.4
7
7
  - 2.5
8
8
 
9
- matrix:
10
- # allow 2.5 to fail until Travis CI is fixed.
11
- # See travis-ci/travis-ci#8969
12
- allow_failures:
13
- - rvm: 2.5
14
-
15
- before_install:
16
- # work around https://github.com/travis-ci/travis-ci/issues/8969
17
- - travis_retry gem update --system
18
9
  install:
19
10
  - sudo apt-get update -qq
20
11
  - sudo apt-get install libpcap-dev -qq
@@ -6,7 +6,7 @@
6
6
  # frozen_string_literal: true
7
7
  require 'socket'
8
8
  require 'singleton'
9
- require 'network_interface'
9
+ require 'interfacez'
10
10
 
11
11
  module PacketGen
12
12
 
@@ -23,47 +23,34 @@ module PacketGen
23
23
  attr_reader :default_iface
24
24
 
25
25
  def initialize
26
- begin
27
- default_iface = Pcap.lookupdev
28
- rescue PCAPRUB::BindingError
29
- default_iface = NetworkInterface.interfaces.select { |i| i =~ /lo/ }.first
30
- end
31
- @default_iface = default_iface
26
+ @default_iface = Interfacez.default || Interfacez.loopback
32
27
  @hwaddr = {}
33
28
  @ipaddr = {}
34
29
  @ip6addr = {}
35
30
 
36
- NetworkInterface.interfaces.each do |iface|
37
- addresses = NetworkInterface.addresses(iface)
38
- @hwaddr[iface] = case RbConfig::CONFIG['target_os']
39
- when /darwin/
40
- addresses[Socket::AF_LINK][0]['addr'] if addresses[Socket::AF_LINK]
41
- else
42
- addresses[Socket::AF_PACKET][0]['addr'] if addresses[Socket::AF_PACKET]
43
- end
44
- @ipaddr[iface] = addresses[Socket::AF_INET][0]['addr'] if addresses[Socket::AF_INET]
45
- if addresses[Socket::AF_INET6]
46
- @ip6addr[iface] = addresses[Socket::AF_INET6].map { |hsh| hsh['addr'] }
47
- end
31
+ Interfacez.all do |iface_name|
32
+ @hwaddr[iface_name] = Interfacez.mac_address_of(iface_name)
33
+ @ipaddr[iface_name] = Interfacez.ipv4_address_of(iface_name)
34
+ @ip6addr[iface_name] = Interfacez.ipv6_addresses_of(iface_name)
48
35
  end
49
36
  end
50
37
 
51
38
  # Get MAC address for given network interface
52
- # @param [String,nil] iface network interface. Il +nil+, use default one.
39
+ # @param [String,nil] iface network interface. If +nil+, use default one.
53
40
  # @return [String]
54
41
  def hwaddr(iface=nil)
55
42
  @hwaddr[iface || @default_iface]
56
43
  end
57
44
 
58
45
  # Get IP address for given network interface
59
- # @param [String,nil] iface network interface. Il +nil+, use default one.
46
+ # @param [String,nil] iface network interface. If +nil+, use default one.
60
47
  # @return [String]
61
48
  def ipaddr(iface=nil)
62
49
  @ipaddr[iface || @default_iface]
63
50
  end
64
51
 
65
52
  # Get IPv6 addresses for given network interface
66
- # @param [String,nil] iface network interface. Il +nil+, use default one.
53
+ # @param [String,nil] iface network interface. If +nil+, use default one.
67
54
  # @return [Array<String>]
68
55
  def ip6addr(iface=nil)
69
56
  @ip6addr[iface || @default_iface]
@@ -112,3 +112,4 @@ require_relative 'header/mld'
112
112
  require_relative 'header/mldv2'
113
113
  require_relative 'header/ospfv2'
114
114
  require_relative 'header/ospfv3'
115
+ require_relative 'header/netbios'
@@ -151,7 +151,8 @@ module PacketGen
151
151
  # Header1.bind_header Header3, field1: 43, field2: 43
152
152
  # Header1.bind_header Header4, op: :and, field1: 43, field2: 43
153
153
  # Header1.bind_header Header5, field1: ->(v) { v.nil? ? 128 : v > 127 }
154
- # Header1.bind_header Header6, proc: ->(pkt) { pkt.header1.field1 == 1 && pkt.header1.body[0..1] == "\x00\x00" }
154
+ # Header1.bind_header Header6, procs: [->(hdr) { hdr.field1 = 1 }
155
+ # ->(hdr) { hdr.field1 == 1 && hdr.body[0..1] == "\x00\x00" }]
155
156
  # @param [Class] header_klass header class to bind to current class
156
157
  # @param [Hash] args current class fields and their value when +header_klass+
157
158
  # is embedded in current class. Given value may be a lambda, whose alone argument
@@ -162,6 +163,10 @@ module PacketGen
162
163
  # operation on this binding. By default, +:op+ is +:or+ (at least one binding
163
164
  # must match to parse it). It also may be set to +:and+ (all bindings must match
164
165
  # to parse it).
166
+ #
167
+ # Special key +procs+ may be used to set 2 lambdas, the former to set
168
+ # fields, the former to check bindings. This may be used when multiple and
169
+ # non-trivial checks should be made.
165
170
  # @return [void]
166
171
  def self.bind_header(header_klass, args={})
167
172
  op = args.delete(:op) || :or
@@ -138,7 +138,7 @@ module PacketGen
138
138
  Transform::PRF_HMAC_SHA2_256, Transform::PRF_HMAC_SHA2_384,
139
139
  Transform::PRF_HMAC_SHA2_512
140
140
  digestname = Transform.constants.grep(/PRF_/).
141
- select { |c| Transform.const_get(c) == type }.first.
141
+ detect { |c| Transform.const_get(c) == type }.
142
142
  to_s.sub(/^PRF_HMAC_/, '').sub(/2_/, '')
143
143
  digest = OpenSSL::Digest.const_get(digestname).new
144
144
  else
@@ -149,8 +149,7 @@ module PacketGen
149
149
  # @return [String]
150
150
  def human_protocol
151
151
  name = IKE.constants.grep(/PROTO/).
152
- select { |c| IKE.const_get(c) == protocol }.
153
- first || "proto #{protocol}"
152
+ detect { |c| IKE.const_get(c) == protocol } || "proto #{protocol}"
154
153
  name.to_s.sub(/PROTO_/, '')
155
154
  end
156
155
 
@@ -83,8 +83,7 @@ module PacketGen
83
83
  # @return [String]
84
84
  def to_human
85
85
  name = self.class.constants.grep(/TYPE_/).
86
- select { |c| self.class.const_get(c) == (type & 0x7fff) }.
87
- first || "attr[#{type & 0x7fff}]"
86
+ detect { |c| self.class.const_get(c) == (type & 0x7fff) } || "attr[#{type & 0x7fff}]"
88
87
  name = name.to_s.sub(/TYPE_/, '')
89
88
  "#{name}=#{value}"
90
89
  end
@@ -300,8 +299,7 @@ module PacketGen
300
299
  # @return [String]
301
300
  def human_id
302
301
  name = self.class.constants.grep(/#{human_type}_/).
303
- select { |c| self.class.const_get(c) == id }.
304
- first || "ID=#{id}"
302
+ detect { |c| self.class.const_get(c) == id } || "ID=#{id}"
305
303
  name.to_s.sub(/#{human_type}_/, '')
306
304
  end
307
305
 
@@ -470,8 +468,7 @@ module PacketGen
470
468
  # @return [String]
471
469
  def human_protocol
472
470
  name = IKE.constants.grep(/PROTO/).
473
- select { |c| IKE.const_get(c) == protocol }.
474
- first || "proto #{protocol}"
471
+ detect { |c| IKE.const_get(c) == protocol } || "proto #{protocol}"
475
472
  name.to_s.sub(/PROTO_/, '')
476
473
  end
477
474
 
@@ -0,0 +1,51 @@
1
+ # This file is part of PacketGen
2
+ # See https://github.com/sdaubert/packetgen for more informations
3
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen
9
+ module Header
10
+ # Module to group all NetBIOS headers
11
+ # @author Sylvain Daubert
12
+ module NetBIOS
13
+ # NetBIOS Session Service messages.
14
+ # @author Sylvain Daubert
15
+ class Session < Base
16
+ # Port number for NetBIOS Session Service over TCP
17
+ TCP_PORT = 139
18
+
19
+ # Session packet types
20
+ TYPES = {
21
+ 'message' => 0,
22
+ 'request' => 0x81,
23
+ 'positive_response' => 0x82,
24
+ 'negative_response' => 0x83,
25
+ 'retarget_response' => 0x84,
26
+ 'keep_alive' => 0x85,
27
+ }
28
+
29
+ # @!attribute type
30
+ # 8-bit session packet type
31
+ # @return [Integer]
32
+ define_field :type, Types::Int8Enum, enum: TYPES
33
+ # @!attribute length
34
+ # 17-bit session packet length
35
+ # @return [Integer]
36
+ define_field :length, Types::Int24
37
+ # @!attribute body
38
+ # @return [String]
39
+ define_field :body, Types::String
40
+
41
+ # Compute and set {#length} field
42
+ # @return [Integer] calculated length
43
+ def calc_length
44
+ Base.calculate_and_set_length(self, header_in_size: false)
45
+ end
46
+ end
47
+ end
48
+ self.add_class NetBIOS::Session
49
+ TCP.bind_header NetBIOS::Session, sport: NetBIOS::Session::TCP_PORT, dport: NetBIOS::Session::TCP_PORT
50
+ end
51
+ end
@@ -179,7 +179,7 @@ module PacketGen
179
179
  # Recalculate all packet checksums
180
180
  # @return [void]
181
181
  def calc_checksum
182
- @headers.reverse.each do |header|
182
+ @headers.reverse_each do |header|
183
183
  header.calc_checksum if header.respond_to? :calc_checksum
184
184
  end
185
185
  end
@@ -10,5 +10,5 @@
10
10
  # @author Sylvain Daubert
11
11
  module PacketGen
12
12
  # PacketGen version
13
- VERSION = '2.5.0'
13
+ VERSION = '2.5.1'
14
14
  end
data/packetgen.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.required_ruby_version = '>= 2.2.0'
25
25
 
26
26
  spec.add_dependency 'pcaprub', '~>0.12.4'
27
- spec.add_dependency 'network_interface'
27
+ spec.add_dependency 'interfacez', '~>1.0'
28
28
  spec.add_dependency 'rasn1', '~>0.5', '>= 0.6.0'
29
29
 
30
30
  spec.add_development_dependency 'bundler', '~> 1.7'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packetgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.0
4
+ version: 2.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Daubert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-02 00:00:00.000000000 Z
11
+ date: 2018-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pcaprub
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.12.4
27
27
  - !ruby/object:Gem::Dependency
28
- name: network_interface
28
+ name: interfacez
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '1.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rasn1
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -222,6 +222,7 @@ files:
222
222
  - lib/packetgen/header/mldv2/mcast_address_record.rb
223
223
  - lib/packetgen/header/mldv2/mlq.rb
224
224
  - lib/packetgen/header/mldv2/mlr.rb
225
+ - lib/packetgen/header/netbios.rb
225
226
  - lib/packetgen/header/ospfv2.rb
226
227
  - lib/packetgen/header/ospfv2/db_description.rb
227
228
  - lib/packetgen/header/ospfv2/hello.rb