ipadmin 0.3.0 → 0.4.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.
- data/README +190 -151
- data/lib/cidr.rb +412 -210
- data/lib/eui.rb +92 -115
- data/lib/methods.rb +409 -438
- data/lib/tree.rb +609 -367
- data/tests/cidr_test.rb +56 -43
- data/tests/eui_test.rb +16 -14
- data/tests/methods_test.rb +191 -185
- data/tests/tree_test.rb +191 -231
- metadata +3 -3
data/lib/eui.rb
CHANGED
@@ -1,14 +1,10 @@
|
|
1
|
-
=begin rdoc
|
2
|
-
Copyright (c) 2006 Dustin Spinhirne -
|
3
|
-
Licensed under the same terms as Ruby, No Warranty is provided.
|
4
|
-
=end
|
5
|
-
|
6
|
-
|
7
1
|
module IPAdmin
|
2
|
+
|
3
|
+
# Generic EUI address. By default, it will act as an EUI48 address.
|
4
|
+
# As a general rule, it is probably better to use the EUI48 and EUI64 classes.
|
8
5
|
class EUI
|
9
6
|
|
10
7
|
# instance variables
|
11
|
-
# @type - eui-48 or eui-64
|
12
8
|
# @oui - Organizationally Unique Identifier
|
13
9
|
# @ei - Extention Identifier
|
14
10
|
|
@@ -17,82 +13,65 @@ class EUI
|
|
17
13
|
#==============================================================================#
|
18
14
|
|
19
15
|
# - Arguments:
|
20
|
-
# * Hash with the following fields:
|
21
|
-
# - :EUI -- Extended Unique Identifier - String
|
16
|
+
# * EUI as a string, or a Hash with the following fields:
|
17
|
+
# - :EUI -- Extended Unique Identifier - String
|
22
18
|
# - :PackedEUI -- Integer representing an Extended Unique Identifier (optional)
|
23
|
-
# - :Length -- bit length of PackedEUI - Integer (optional)
|
24
19
|
#
|
25
20
|
# - Note:
|
26
|
-
# * At a minimum, EUI or PackedEUI must be provided.
|
27
21
|
# * PackedEUI takes precedence over EUI.
|
28
|
-
# * Length is only needed when using PackedEUI
|
29
22
|
#
|
30
|
-
#
|
31
|
-
# addr = IPAdmin::
|
32
|
-
# addr = IPAdmin::
|
33
|
-
# addr = IPAdmin::
|
34
|
-
# addr = IPAdmin::
|
23
|
+
# Examples:
|
24
|
+
# addr = IPAdmin::EUI48.new('aa-bb-cc-dd-ee-ff')
|
25
|
+
# addr = IPAdmin::EUI48.new('aa:bb:cc:dd:ee:ff')
|
26
|
+
# addr = IPAdmin::EUI48.new('aabb.ccdd.eeff')
|
27
|
+
# addr = IPAdmin::EUI64.new('aa-bb-cc-dd-ee-ff-00-01')
|
35
28
|
#
|
36
29
|
def initialize(options)
|
37
|
-
if (
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
if (options.has_key?(:Length) && options[:Length].kind_of?(Integer))
|
45
|
-
@type = options[:Length]
|
46
|
-
@type = 48 if (@type != 48 && @type != 64)
|
30
|
+
if (options.kind_of? String)
|
31
|
+
eui = options
|
32
|
+
elsif (options.kind_of? Hash)
|
33
|
+
if (options.has_key?(:PackedEUI))
|
34
|
+
packed_eui = options[:PackedEUI]
|
35
|
+
elsif(options.has_key?(:EUI))
|
36
|
+
eui = options[:EUI]
|
47
37
|
else
|
48
|
-
|
38
|
+
raise ArgumentError, "Missing argument: [EUI|PackedEUI]."
|
49
39
|
end
|
50
|
-
|
40
|
+
else
|
41
|
+
raise ArgumentError, "Expected Hash or String, but #{options.class} provided."
|
42
|
+
end
|
43
|
+
|
44
|
+
if (packed_eui)
|
51
45
|
if (packed_eui.kind_of?(Integer))
|
52
|
-
if (
|
53
|
-
@oui = packed_eui >> 24
|
54
|
-
@ei = packed_eui & 0xffffff
|
55
|
-
else
|
46
|
+
if (self.kind_of?(IPAdmin::EUI64))
|
56
47
|
@oui = packed_eui >> 40
|
57
48
|
@ei = packed_eui & 0xffffffffff
|
49
|
+
else
|
50
|
+
@oui = packed_eui >> 24
|
51
|
+
@ei = packed_eui & 0xffffff
|
58
52
|
end
|
59
53
|
else
|
60
54
|
raise ArgumentError, "Expected Integer, but #{eui.class} " +
|
61
55
|
"provided for argument :PackedEUI."
|
62
56
|
end
|
63
|
-
|
64
|
-
elsif(
|
65
|
-
eui = options[:EUI]
|
66
|
-
|
57
|
+
|
58
|
+
elsif(eui)
|
67
59
|
if (eui.kind_of?(String))
|
68
60
|
# validate
|
69
61
|
IPAdmin.validate_eui(:EUI => eui)
|
70
|
-
|
62
|
+
|
71
63
|
# remove formatting characters
|
72
|
-
eui.gsub!(/[\.\:\-]/, '')
|
73
|
-
|
74
|
-
# check if eui-48 or eui-64
|
75
|
-
if (eui.length == 12)
|
76
|
-
@type = 48
|
77
|
-
elsif (eui.length == 16)
|
78
|
-
@type = 64
|
79
|
-
else
|
80
|
-
raise "#{eui} is invalid (address is neither EUI-48 nor EUI-64)."
|
81
|
-
end
|
82
|
-
|
64
|
+
eui.gsub!(/[\.\:\-]/, '')
|
65
|
+
|
83
66
|
# split into oui & ei, pack, and store
|
84
67
|
@oui = eui.slice!(0..5).to_i(16)
|
85
68
|
@ei = eui.to_i(16)
|
86
|
-
|
69
|
+
|
87
70
|
else
|
88
71
|
raise ArgumentError, "Expected String, but #{eui.class} " +
|
89
72
|
"provided for argument :EUI."
|
90
73
|
end
|
91
|
-
|
92
|
-
else
|
93
|
-
raise ArgumentError, "Missing argument: [EUI|PackedEUI]."
|
94
74
|
end
|
95
|
-
|
96
75
|
end
|
97
76
|
|
98
77
|
#======================================#
|
@@ -113,30 +92,33 @@ class EUI
|
|
113
92
|
# - Returns:
|
114
93
|
# * String
|
115
94
|
#
|
116
|
-
#
|
95
|
+
# - Notes:
|
96
|
+
# * The default address format is xxxx.xxxx.xxxx
|
97
|
+
#
|
98
|
+
# Examples:
|
117
99
|
# puts addr.address(:Delimiter => '.') --> 'aabb.ccdd.eeff'
|
118
100
|
#
|
119
101
|
def address(options=nil)
|
120
102
|
delimiter = '-'
|
121
|
-
|
103
|
+
|
122
104
|
octets = []
|
123
105
|
octets.concat(unpack_oui)
|
124
106
|
octets.concat(unpack_ei)
|
125
|
-
|
107
|
+
|
126
108
|
if (options)
|
127
109
|
if (!options.kind_of? Hash)
|
128
110
|
raise ArgumentError, "Expected Hash, but #{options.class} provided."
|
129
111
|
end
|
130
|
-
|
112
|
+
|
131
113
|
if (options.has_key?(:Delimiter))
|
132
114
|
delimiter = options[:Delimiter]
|
133
115
|
delimiter = '-' if (delimiter != '-' && delimiter != ':' && delimiter != '.' )
|
134
116
|
end
|
135
117
|
end
|
136
|
-
|
118
|
+
|
137
119
|
if (delimiter == '-' || delimiter == ':')
|
138
120
|
address = octets.join(delimiter)
|
139
|
-
elsif (delimiter == '.')
|
121
|
+
elsif (delimiter == '.')
|
140
122
|
toggle = 0
|
141
123
|
octets.each do |x|
|
142
124
|
if (!address)
|
@@ -152,8 +134,8 @@ class EUI
|
|
152
134
|
end
|
153
135
|
|
154
136
|
end
|
155
|
-
|
156
|
-
return(address)
|
137
|
+
|
138
|
+
return(address)
|
157
139
|
end
|
158
140
|
|
159
141
|
#======================================#
|
@@ -174,18 +156,21 @@ class EUI
|
|
174
156
|
# - Returns:
|
175
157
|
# * String
|
176
158
|
#
|
177
|
-
#
|
178
|
-
#
|
159
|
+
# - Notes:
|
160
|
+
# * The default address format is xx-xx-xx
|
161
|
+
#
|
162
|
+
# Examples:
|
163
|
+
# puts addr.ei(:Delimiter => '-')
|
179
164
|
#
|
180
165
|
def ei(options=nil)
|
181
166
|
octets = unpack_ei()
|
182
167
|
delimiter = '-'
|
183
|
-
|
168
|
+
|
184
169
|
if (options)
|
185
170
|
if (!options.kind_of? Hash)
|
186
171
|
raise ArgumentError, "Expected Hash, but #{options.class} provided."
|
187
172
|
end
|
188
|
-
|
173
|
+
|
189
174
|
if (options.has_key?(:Delimiter))
|
190
175
|
if (options[:Delimiter] == ':')
|
191
176
|
delimiter = options[:Delimiter]
|
@@ -193,8 +178,8 @@ class EUI
|
|
193
178
|
end
|
194
179
|
end
|
195
180
|
ei = octets.join(delimiter)
|
196
|
-
|
197
|
-
return(ei)
|
181
|
+
|
182
|
+
return(ei)
|
198
183
|
end
|
199
184
|
|
200
185
|
#======================================#
|
@@ -214,36 +199,36 @@ class EUI
|
|
214
199
|
# - :Objectify -- if true, return CIDR objects (optional)
|
215
200
|
#
|
216
201
|
# - Returns:
|
217
|
-
# * String
|
202
|
+
# * CIDR address String or an IPAdmin::CIDR object
|
218
203
|
#
|
219
|
-
#
|
220
|
-
# puts addr.link_local()
|
204
|
+
# Examples:
|
205
|
+
# puts addr.link_local()
|
221
206
|
#
|
222
|
-
def link_local(options=nil)
|
207
|
+
def link_local(options=nil)
|
223
208
|
objectify = false
|
224
209
|
short = false
|
225
|
-
|
210
|
+
|
226
211
|
if (options)
|
227
212
|
if (!options.kind_of? Hash)
|
228
213
|
raise ArgumentError, "Expected Hash, but #{options.class} provided."
|
229
214
|
end
|
230
|
-
|
215
|
+
|
231
216
|
if (options.has_key?(:Objectify) && options[:Objectify] == true)
|
232
217
|
objectify = true
|
233
218
|
end
|
234
|
-
|
219
|
+
|
235
220
|
if (options.has_key?(:Short) && options[:Short] == true)
|
236
221
|
short = true
|
237
222
|
end
|
238
223
|
end
|
239
|
-
|
240
|
-
if (
|
241
|
-
link_local = @ei | 0xfffe000000 | (@oui << 40)
|
242
|
-
else
|
224
|
+
|
225
|
+
if (self.kind_of?(IPAdmin::EUI64))
|
243
226
|
link_local = @ei | (@oui << 40)
|
227
|
+
else
|
228
|
+
link_local = @ei | 0xfffe000000 | (@oui << 40)
|
244
229
|
end
|
245
230
|
link_local = link_local | (0xfe80 << 112)
|
246
|
-
|
231
|
+
|
247
232
|
if (!objectify)
|
248
233
|
link_local = IPAdmin.unpack_ip_addr(:Integer => link_local, :Version => 6)
|
249
234
|
link_local = IPAdmin.shorten(link_local) if (short)
|
@@ -251,7 +236,7 @@ class EUI
|
|
251
236
|
link_local = IPAdmin::CIDR.new(:PackedIP => link_local,
|
252
237
|
:Version => 6)
|
253
238
|
end
|
254
|
-
|
239
|
+
|
255
240
|
return(link_local)
|
256
241
|
end
|
257
242
|
|
@@ -273,18 +258,21 @@ class EUI
|
|
273
258
|
# - Returns:
|
274
259
|
# * String
|
275
260
|
#
|
276
|
-
#
|
277
|
-
#
|
261
|
+
# - Notes:
|
262
|
+
# * The default address format is xx-xx-xx
|
263
|
+
#
|
264
|
+
# Examples:
|
265
|
+
# puts addr.oui(:Delimiter => '-')
|
278
266
|
#
|
279
267
|
def oui(options=nil)
|
280
268
|
octets = unpack_oui()
|
281
269
|
delimiter = '-'
|
282
|
-
|
270
|
+
|
283
271
|
if (options)
|
284
272
|
if (!options.kind_of? Hash)
|
285
273
|
raise ArgumentError, "Expected Hash, but #{options.class} provided."
|
286
274
|
end
|
287
|
-
|
275
|
+
|
288
276
|
if (options.has_key?(:Delimiter))
|
289
277
|
if (options[:Delimiter] == ':')
|
290
278
|
delimiter = options[:Delimiter]
|
@@ -292,36 +280,8 @@ class EUI
|
|
292
280
|
end
|
293
281
|
end
|
294
282
|
oui = octets.join(delimiter)
|
295
|
-
|
296
|
-
return(oui)
|
297
|
-
end
|
298
|
-
|
299
|
-
#======================================#
|
300
|
-
#
|
301
|
-
#======================================#
|
302
|
-
|
303
|
-
|
304
|
-
#==============================================================================#
|
305
|
-
# type()
|
306
|
-
#==============================================================================#
|
307
283
|
|
308
|
-
|
309
|
-
#
|
310
|
-
# - Arguments:
|
311
|
-
# * none
|
312
|
-
#
|
313
|
-
# - Returns:
|
314
|
-
# * String
|
315
|
-
#
|
316
|
-
# Example:
|
317
|
-
# puts addr.type --> EUI-48
|
318
|
-
#
|
319
|
-
def type()
|
320
|
-
if (@type == 48)
|
321
|
-
return('EUI-48')
|
322
|
-
else
|
323
|
-
return('EUI-64')
|
324
|
-
end
|
284
|
+
return(oui)
|
325
285
|
end
|
326
286
|
|
327
287
|
#======================================#
|
@@ -340,7 +300,14 @@ private
|
|
340
300
|
def unpack_ei()
|
341
301
|
hex = @ei
|
342
302
|
octets = []
|
343
|
-
|
303
|
+
|
304
|
+
if (self.kind_of?(IPAdmin::EUI64))
|
305
|
+
length = 64
|
306
|
+
else
|
307
|
+
length = 48
|
308
|
+
end
|
309
|
+
|
310
|
+
loop_count = (length - 24)/8
|
344
311
|
loop_count.times do
|
345
312
|
octet = (hex & 0xff).to_s(16)
|
346
313
|
octet = '0' << octet if (octet.length != 2)
|
@@ -377,5 +344,15 @@ private
|
|
377
344
|
|
378
345
|
end
|
379
346
|
|
347
|
+
# EUI-48 Address - Inherits all methods from IPAdmin::EUI.
|
348
|
+
# Addresses of this type have a 24-bit OUI and a 24-bit EI.
|
349
|
+
class EUI48 < EUI
|
350
|
+
end
|
351
|
+
|
352
|
+
# EUI-64 Address - Inherits all methods from IPAdmin::EUI.
|
353
|
+
# Addresses of this type have a 24-bit OUI and a 40-bit EI.
|
354
|
+
class EUI64 < EUI
|
355
|
+
end
|
356
|
+
|
380
357
|
end # module IPAdmin
|
381
358
|
__END__
|