packetgen 2.5.0 → 2.5.1

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 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