net-dhcp 1.1.1 → 1.2.0
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 +7 -0
- data/CHANGELOG +7 -1
- data/bin/net-dhcp +0 -0
- data/lib/net-dhcp/version.rb +1 -1
- data/lib/net/dhcp/core.rb +48 -14
- data/lib/net/dhcp/options.rb +3 -2
- data/net-dhcp.gemspec +3 -2
- metadata +58 -34
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 084b32f482d254159e2d66d8d5baa30ffb925fd9
|
4
|
+
data.tar.gz: 1d3a98623bd9bc5f9e45f460b25e3c476c56459f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d110ea9681c2cadb72948fe3178d1b6e270e6335c972139433e5460f3a9d368a47fab20bab591fb1c8f5db310f33c546afbec054e58d11735d96d2a0e734c467
|
7
|
+
data.tar.gz: fc80df66795f01a9e5c855a3fac7f20d43799b92c1a9120f8a3ea52dc45dc7417e617a56888f33a95a2cbed4099f0fea5020c9ca57c153d1c73ec5adae8179bc
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
*1.2.0
|
2
|
+
|
3
|
+
* Fix Array handling for message payloads [presto53]
|
4
|
+
* Use a raise syntax that isn't archaic [presto53]
|
5
|
+
* Depend on simplecov rather than rcov for Ruby 1.9+ compat [mjtko]
|
6
|
+
|
1
7
|
*1.1.1
|
2
8
|
|
3
9
|
* Replace incorrect equality check with assignment in Message#from_udp_payload to correct behaviour when an unrecognised option or message is encountered [mjtko]
|
@@ -20,4 +26,4 @@
|
|
20
26
|
|
21
27
|
*1.0.0
|
22
28
|
|
23
|
-
* Initial release to rubygems - originally authored by etd, migrated to github by syonbori, gemified by mjtko. [mjtko]
|
29
|
+
* Initial release to rubygems - originally authored by etd, migrated to github by syonbori, gemified by mjtko. [mjtko]
|
data/bin/net-dhcp
CHANGED
File without changes
|
data/lib/net-dhcp/version.rb
CHANGED
data/lib/net/dhcp/core.rb
CHANGED
@@ -29,6 +29,7 @@ module DHCP
|
|
29
29
|
attr_accessor :xid
|
30
30
|
attr_accessor :secs, :flags
|
31
31
|
attr_accessor :ciaddr, :yiaddr, :siaddr, :giaddr, :chaddr
|
32
|
+
attr_accessor :sname, :fname
|
32
33
|
attr_accessor :options
|
33
34
|
|
34
35
|
alias == eql?
|
@@ -50,11 +51,13 @@ module DHCP
|
|
50
51
|
:yiaddr => values.shift,
|
51
52
|
:siaddr => values.shift,
|
52
53
|
:giaddr => values.shift,
|
53
|
-
:chaddr => values.slice!(0..15)
|
54
|
+
:chaddr => values.slice!(0..15),
|
55
|
+
:sname => values.slice!(0..63),
|
56
|
+
:fname => values.slice!(0..127),
|
54
57
|
}
|
55
58
|
|
56
|
-
# sname and file
|
57
|
-
not_used = values.slice!(0..191)
|
59
|
+
# sname and file are now used
|
60
|
+
#not_used = values.slice!(0..191) 127+63 190
|
58
61
|
|
59
62
|
return nil unless ($DHCP_MAGIC == values.shift)
|
60
63
|
|
@@ -64,7 +67,6 @@ module DHCP
|
|
64
67
|
opt_class = Option
|
65
68
|
|
66
69
|
params[:options] = []
|
67
|
-
|
68
70
|
next_opt = values.shift
|
69
71
|
while(next_opt != $DHCP_END)
|
70
72
|
p = {
|
@@ -106,7 +108,7 @@ module DHCP
|
|
106
108
|
# message operation and options. We need at least an operation and a
|
107
109
|
# MessageTypeOption to create a DHCP message!!
|
108
110
|
if (([:op, :options] & params.keys).size != 2)
|
109
|
-
raise ArgumentError
|
111
|
+
raise ArgumentError, 'you need to specify at least values for :op and :options'
|
110
112
|
end
|
111
113
|
|
112
114
|
self.op = params[:op]
|
@@ -117,7 +119,7 @@ module DHCP
|
|
117
119
|
next unless opt.class == MessageTypeOption
|
118
120
|
found = true
|
119
121
|
end
|
120
|
-
raise ArgumentError
|
122
|
+
raise ArgumentError, ':options must include a MessageTypeOption' unless found
|
121
123
|
|
122
124
|
#hardware type and length of the hardware address
|
123
125
|
self.htype = params.fetch(:htype, $DHCP_HTYPE_ETHERNET)
|
@@ -148,7 +150,34 @@ module DHCP
|
|
148
150
|
self.chaddr = [mac].pack('H*').unpack('CCCCCC')
|
149
151
|
self.chaddr += [0x00]*(16-self.chaddr.size)
|
150
152
|
end
|
151
|
-
|
153
|
+
|
154
|
+
if (params.key?(:sname))
|
155
|
+
sname = params[:sname]
|
156
|
+
case
|
157
|
+
when sname.size == 64
|
158
|
+
self.sname = sname
|
159
|
+
when sname.size < 64 && sname.class == String
|
160
|
+
self.sname = sname.unpack('C64').map {|x| x ? x : 0}
|
161
|
+
else
|
162
|
+
raise 'sname field should be of 64 bytes or a string of less'
|
163
|
+
end
|
164
|
+
else
|
165
|
+
self.sname = [0x00]*64
|
166
|
+
end
|
167
|
+
|
168
|
+
if (params.key?(:fname))
|
169
|
+
fname = params[:fname]
|
170
|
+
case
|
171
|
+
when fname.size == 128
|
172
|
+
self.fname = fname
|
173
|
+
when fname.size < 128 && fname.class == String
|
174
|
+
self.fname = fname.unpack('C128').map {|x| x ? x : 0}
|
175
|
+
else
|
176
|
+
raise 'fname field should be of 128 bytes or a string of less'
|
177
|
+
end
|
178
|
+
else
|
179
|
+
self.fname = [0x00]*128
|
180
|
+
end
|
152
181
|
|
153
182
|
end
|
154
183
|
|
@@ -168,9 +197,12 @@ module DHCP
|
|
168
197
|
else
|
169
198
|
out << (self.chaddr + [0x00]*(16-self.chaddr.size)).pack('C16')
|
170
199
|
end
|
171
|
-
|
200
|
+
# file_name/server_name for pxe
|
201
|
+
out << self.sname.pack('C64')
|
202
|
+
out << self.fname.pack('C128')
|
203
|
+
|
172
204
|
# sname and file
|
173
|
-
out << ([0x00]*192).pack('C192')
|
205
|
+
# out << ([0x00]*192).pack('C192')
|
174
206
|
|
175
207
|
out << [$DHCP_MAGIC].pack('N')
|
176
208
|
self.options.each do |option|
|
@@ -217,6 +249,8 @@ module DHCP
|
|
217
249
|
out << "\t\tNext server IP address = #{[self.siaddr].pack('N').unpack('C4').join('.')}\r\n"
|
218
250
|
out << "\t\tRelay agent IP address = #{[self.giaddr].pack('N').unpack('C4').join('.')}\r\n"
|
219
251
|
out << "\t\tHardware address = #{self.chaddr.slice(0..(self.hlen-1)).collect do |b| b.to_s(16).upcase.rjust(2,'0') end.join(':')}\r\n"
|
252
|
+
out << "\t\tServer Name = #{self.sname.pack('n*').unpack('A*')}\r\n"
|
253
|
+
out << "\t\tFile Name = #{self.fname.pack('n*').unpack('A*')}\r\n"
|
220
254
|
out << "\tOPT:\r\n"
|
221
255
|
self.options.each do |opt|
|
222
256
|
out << "\t\t #{opt.to_s}\r\n"
|
@@ -244,7 +278,7 @@ module DHCP
|
|
244
278
|
def initialize(params={})
|
245
279
|
params[:op] = $DHCP_OP_REPLY
|
246
280
|
params[:options] = params.fetch(:options, [
|
247
|
-
MessageTypeOption.new({:payload
|
281
|
+
MessageTypeOption.new({:payload=>[$DHCP_MSG_OFFER]}),
|
248
282
|
ServerIdentifierOption.new,
|
249
283
|
DomainNameOption.new
|
250
284
|
])
|
@@ -259,7 +293,7 @@ module DHCP
|
|
259
293
|
class Request < Message
|
260
294
|
def initialize(params={})
|
261
295
|
params[:op] = $DHCP_OP_REQUEST
|
262
|
-
params[:options] = params.fetch(:options, [MessageTypeOption.new({:payload
|
296
|
+
params[:options] = params.fetch(:options, [MessageTypeOption.new({:payload=>[$DHCP_MSG_REQUEST]}), ParameterRequestListOption.new])
|
263
297
|
super(params)
|
264
298
|
end
|
265
299
|
end
|
@@ -277,7 +311,7 @@ module DHCP
|
|
277
311
|
def initialize(params={})
|
278
312
|
params[:op] = $DHCP_OP_REPLY
|
279
313
|
params[:options] = params.fetch(:options, [
|
280
|
-
MessageTypeOption.new({:payload
|
314
|
+
MessageTypeOption.new({:payload=>[$DHCP_MSG_ACK]}),
|
281
315
|
ServerIdentifierOption.new,
|
282
316
|
DomainNameOption.new
|
283
317
|
])
|
@@ -297,7 +331,7 @@ module DHCP
|
|
297
331
|
def initialize(params={})
|
298
332
|
params[:op] = $DHCP_OP_REQUEST
|
299
333
|
params[:options] = params.fetch(:options, [
|
300
|
-
MessageTypeOption.new({:payload
|
334
|
+
MessageTypeOption.new({:payload=>[$DHCP_MSG_RELEASE]}),
|
301
335
|
ServerIdentifierOption.new
|
302
336
|
])
|
303
337
|
super(params)
|
@@ -309,7 +343,7 @@ module DHCP
|
|
309
343
|
class Inform < Message
|
310
344
|
def initialize(params={})
|
311
345
|
params[:op] = $DHCP_OP_REQUEST
|
312
|
-
params[:options] = params.fetch(:options, [MessageTypeOption.new({:payload
|
346
|
+
params[:options] = params.fetch(:options, [MessageTypeOption.new({:payload=>[$DHCP_MSG_INFORM]}), ParameterRequestListOption.new])
|
313
347
|
super(params)
|
314
348
|
end
|
315
349
|
end
|
data/lib/net/dhcp/options.rb
CHANGED
@@ -33,7 +33,7 @@ module DHCP
|
|
33
33
|
def initialize(params = {})
|
34
34
|
# We need a type, and a payload
|
35
35
|
if (([:type, :payload] & params.keys).size != 2)
|
36
|
-
raise ArgumentError
|
36
|
+
raise ArgumentError, 'you need to specify values for :type and :payload'
|
37
37
|
end
|
38
38
|
|
39
39
|
self.type = params[:type]
|
@@ -252,6 +252,7 @@ module DHCP
|
|
252
252
|
#
|
253
253
|
# The default value is 1 (DHCPDISCOVER)
|
254
254
|
class MessageTypeOption < Option
|
255
|
+
#DEBUG
|
255
256
|
def initialize(params={})
|
256
257
|
params[:type] = $DHCP_MESSAGETYPE
|
257
258
|
params[:payload] = params.fetch(:payload, [$DHCP_MSG_DISCOVER])
|
@@ -509,7 +510,7 @@ module DHCP
|
|
509
510
|
end
|
510
511
|
|
511
512
|
def to_s
|
512
|
-
"UserClassInformation = #{self.payload}"
|
513
|
+
"UserClassInformation = #{self.payload.pack('C*')}"
|
513
514
|
end
|
514
515
|
end
|
515
516
|
|
data/net-dhcp.gemspec
CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.name = 'net-dhcp'
|
6
6
|
s.version = Net::Dhcp::VERSION
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
|
-
s.date = "
|
8
|
+
s.date = "2014-01-02"
|
9
9
|
s.authors = ['daniel martin gomez (etd)', 'syonbori', 'Mark J. Titorenko']
|
10
10
|
s.email = 'mark.titorenko@alces-software.com'
|
11
11
|
s.homepage = 'http://github.com/mjtko/net-dhcp-ruby'
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.add_development_dependency 'bundler'
|
31
31
|
s.add_development_dependency 'bueller'
|
32
32
|
s.add_development_dependency 'rake'
|
33
|
-
s.add_development_dependency '
|
33
|
+
s.add_development_dependency 'simplecov'
|
34
|
+
s.add_development_dependency 'rdoc'
|
34
35
|
end
|
35
36
|
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-dhcp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- daniel martin gomez (etd)
|
@@ -11,63 +10,92 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date:
|
13
|
+
date: 2014-01-02 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: rspec
|
18
|
-
requirement:
|
19
|
-
none: false
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
20
18
|
requirements:
|
21
|
-
- -
|
19
|
+
- - ">="
|
22
20
|
- !ruby/object:Gem::Version
|
23
21
|
version: '0'
|
24
22
|
type: :development
|
25
23
|
prerelease: false
|
26
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '0'
|
27
29
|
- !ruby/object:Gem::Dependency
|
28
30
|
name: bundler
|
29
|
-
requirement:
|
30
|
-
none: false
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
31
32
|
requirements:
|
32
|
-
- -
|
33
|
+
- - ">="
|
33
34
|
- !ruby/object:Gem::Version
|
34
35
|
version: '0'
|
35
36
|
type: :development
|
36
37
|
prerelease: false
|
37
|
-
version_requirements:
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
38
43
|
- !ruby/object:Gem::Dependency
|
39
44
|
name: bueller
|
40
|
-
requirement:
|
41
|
-
none: false
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
42
46
|
requirements:
|
43
|
-
- -
|
47
|
+
- - ">="
|
44
48
|
- !ruby/object:Gem::Version
|
45
49
|
version: '0'
|
46
50
|
type: :development
|
47
51
|
prerelease: false
|
48
|
-
version_requirements:
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
49
57
|
- !ruby/object:Gem::Dependency
|
50
58
|
name: rake
|
51
|
-
requirement:
|
52
|
-
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: simplecov
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
53
74
|
requirements:
|
54
|
-
- -
|
75
|
+
- - ">="
|
55
76
|
- !ruby/object:Gem::Version
|
56
77
|
version: '0'
|
57
78
|
type: :development
|
58
79
|
prerelease: false
|
59
|
-
version_requirements:
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
60
85
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
62
|
-
requirement:
|
63
|
-
none: false
|
86
|
+
name: rdoc
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
64
88
|
requirements:
|
65
|
-
- -
|
89
|
+
- - ">="
|
66
90
|
- !ruby/object:Gem::Version
|
67
91
|
version: '0'
|
68
92
|
type: :development
|
69
93
|
prerelease: false
|
70
|
-
version_requirements:
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
71
99
|
description: The aim of Net::DHCP is to provide a set of classes to low level handle
|
72
100
|
the DHCP protocol (rfc2131, rfc2132, etc.). With Net::DHCP you will be able to craft
|
73
101
|
custom DHCP packages and have access to all the fields defined for the protocol.
|
@@ -80,8 +108,8 @@ extra_rdoc_files:
|
|
80
108
|
- README
|
81
109
|
- CHANGELOG
|
82
110
|
files:
|
83
|
-
- .document
|
84
|
-
- .gitignore
|
111
|
+
- ".document"
|
112
|
+
- ".gitignore"
|
85
113
|
- CHANGELOG
|
86
114
|
- Gemfile
|
87
115
|
- LICENSE
|
@@ -102,28 +130,24 @@ files:
|
|
102
130
|
- test/test_dhcp.rb
|
103
131
|
homepage: http://github.com/mjtko/net-dhcp-ruby
|
104
132
|
licenses: []
|
133
|
+
metadata: {}
|
105
134
|
post_install_message:
|
106
135
|
rdoc_options: []
|
107
136
|
require_paths:
|
108
137
|
- lib
|
109
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
-
none: false
|
111
139
|
requirements:
|
112
|
-
- -
|
140
|
+
- - ">="
|
113
141
|
- !ruby/object:Gem::Version
|
114
142
|
version: '0'
|
115
|
-
segments:
|
116
|
-
- 0
|
117
|
-
hash: -2659112004771839654
|
118
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
144
|
requirements:
|
121
|
-
- -
|
145
|
+
- - ">="
|
122
146
|
- !ruby/object:Gem::Version
|
123
147
|
version: 1.3.7
|
124
148
|
requirements: []
|
125
149
|
rubyforge_project:
|
126
|
-
rubygems_version:
|
150
|
+
rubygems_version: 2.2.0.rc.1
|
127
151
|
signing_key:
|
128
152
|
specification_version: 3
|
129
153
|
summary: set of classes to low level handle the DHCP protocol
|