ipadmin 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +13 -2
- data/lib/ip_admin.rb +137 -4
- data/tests/cidr_test.rb +2 -2
- data/tests/functions_test.rb +23 -3
- metadata +2 -2
data/README
CHANGED
@@ -103,8 +103,8 @@
|
|
103
103
|
puts "cidr4 size is #{cidr4.size()}"
|
104
104
|
puts "cidr6 size is #{cidr6.size()}"
|
105
105
|
|
106
|
-
cidr4.enumerate(:Limit => 4, :
|
107
|
-
cidr6.enumerate(:Limit => 4, :
|
106
|
+
cidr4.enumerate(:Limit => 4, :Bitstep => 32) {|addr| puts addr}
|
107
|
+
cidr6.enumerate(:Limit => 4, :Bitstep => 32, :Objectify => 1) {|addr| puts addr.desc()}
|
108
108
|
|
109
109
|
cidr4.subnet(:Subnet => 28, :MinCount => 3) {|cidr| puts cidr.desc()}
|
110
110
|
cidr6.subnet(:Subnet => 66, :MinCount => 4) {|cidr| puts cidr.desc()}
|
@@ -216,6 +216,17 @@
|
|
216
216
|
|
217
217
|
puts "192.168.1.0/24 and 192.168.0.0/24 merge into #{IPAdmin.merge_cidr([cidr4_1,cidr4_2]).desc}"
|
218
218
|
puts "fec0::0/128 and fec0::1/128 merge into #{IPAdmin.merge_cidr([cidr6_1,cidr6_2]).desc}"
|
219
|
+
|
220
|
+
ip1 = IPAdmin::IPAddr.new(:IPAddr => '192.168.1.0')
|
221
|
+
ip2 = IPAdmin::IPAddr.new(:IPAddr => '192.168.1.50')
|
222
|
+
|
223
|
+
|
224
|
+
list = IPAdmin.range(:Boundaries => [ip1,ip2], :Bitstep => 20 )
|
225
|
+
puts "ip's between #{ip1.desc} and #{ip2.desc}"
|
226
|
+
list.each do |x|
|
227
|
+
puts " #{x}"
|
228
|
+
end
|
229
|
+
|
219
230
|
|
220
231
|
print "\n\n\n"
|
221
232
|
#=====================================#
|
data/lib/ip_admin.rb
CHANGED
@@ -392,6 +392,139 @@ module_function :pack_ipv6_netmask
|
|
392
392
|
|
393
393
|
|
394
394
|
|
395
|
+
#============================================================================#
|
396
|
+
# range()
|
397
|
+
#============================================================================#
|
398
|
+
|
399
|
+
# Given two IPAdmin::IPAddr objects of the same version, return all IP
|
400
|
+
# addresses between them (non-inclusive).
|
401
|
+
#
|
402
|
+
# - Arguments:
|
403
|
+
# * Hash with the following fields
|
404
|
+
# - :Bitstep -- enumerate in X sized steps
|
405
|
+
# - :Boundaries -- array of (2) IPAdmin::IPAddr objects
|
406
|
+
# - :Limit -- limit returned list to X number of items
|
407
|
+
# - :Objectify -- return IPAdmin::IPAddr objects
|
408
|
+
#
|
409
|
+
# - Returns:
|
410
|
+
# * array of IP addresses or IPAdmin::IPAddr objects
|
411
|
+
#
|
412
|
+
def range(options)
|
413
|
+
list = []
|
414
|
+
bitstep = 1
|
415
|
+
objectify = nil
|
416
|
+
limit = nil
|
417
|
+
v4_all_f = (2**32)-1
|
418
|
+
v6_all_f = (2**128)-1
|
419
|
+
|
420
|
+
# check options
|
421
|
+
if (options)
|
422
|
+
unless ( options.has_key?(:Boundaries) )
|
423
|
+
raise ArgumentError, "Missing arguments: Boundaries."
|
424
|
+
end
|
425
|
+
|
426
|
+
if (options[:Boundaries].length == 2)
|
427
|
+
(ip1,ip2) = options[:Boundaries]
|
428
|
+
else
|
429
|
+
raise ArgumentError, "Two IPAdmin::IPAddr ojects are required. " +
|
430
|
+
"as Boundaries."
|
431
|
+
end
|
432
|
+
|
433
|
+
if( options.has_key?(:Bitstep) )
|
434
|
+
bitstep = options[:Bitstep]
|
435
|
+
end
|
436
|
+
|
437
|
+
if( options.has_key?(:Objectify) )
|
438
|
+
objectify = 1
|
439
|
+
end
|
440
|
+
|
441
|
+
if( options.has_key?(:Limit) )
|
442
|
+
limit = options[:Limit]
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
446
|
+
|
447
|
+
|
448
|
+
# check our ipaddr objects
|
449
|
+
unless ((ip1.kind_of? IPAdmin::IPAddr) && (ip2.kind_of? IPAdmin::IPAddr))
|
450
|
+
raise "One or more values provided under :Boundaries "+
|
451
|
+
"is not a valid IPAdmin::IPAddr object."
|
452
|
+
end
|
453
|
+
|
454
|
+
if (ip1.version == ip2.version)
|
455
|
+
version = ip1.version
|
456
|
+
boundaries = [ip1.packed_ip, ip2.packed_ip]
|
457
|
+
boundaries.sort
|
458
|
+
else
|
459
|
+
raise "Provided IPAdmin::IPAddr objects are of different versions."
|
460
|
+
end
|
461
|
+
|
462
|
+
|
463
|
+
|
464
|
+
# dump our range
|
465
|
+
if ( (version == 4) && !objectify)
|
466
|
+
my_ip = boundaries[0] + 1
|
467
|
+
|
468
|
+
until (my_ip >= boundaries[1])
|
469
|
+
list.push( IPAdmin.unpack_ipv4_addr(my_ip) )
|
470
|
+
my_ip = my_ip + bitstep
|
471
|
+
if (limit)
|
472
|
+
limit = limit -1
|
473
|
+
break if (limit == 0)
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
elsif ( (version == 4) && objectify)
|
478
|
+
my_ip = boundaries[0] + 1
|
479
|
+
|
480
|
+
until (my_ip >= boundaries[1])
|
481
|
+
my_ip_s = IPAdmin.unpack_ipv4_addr(my_ip)
|
482
|
+
list.push( IPAdmin::IPAddr.new(:IPAddr => my_ip_s) )
|
483
|
+
my_ip = my_ip + bitstep
|
484
|
+
if (limit)
|
485
|
+
limit = limit -1
|
486
|
+
break if (limit == 0)
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
elsif ( (version >= 6) && !objectify)
|
491
|
+
my_ip = boundaries[0] + 1
|
492
|
+
|
493
|
+
until (my_ip == boundaries[1])
|
494
|
+
list.push( IPAdmin.unpack_ipv6_addr(my_ip) )
|
495
|
+
my_ip = my_ip + bitstep
|
496
|
+
if (limit)
|
497
|
+
limit = limit -1
|
498
|
+
break if (limit == 0)
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
elsif ( (version >= 6) && objectify)
|
503
|
+
my_ip = boundaries[0] + 1
|
504
|
+
|
505
|
+
until (my_ip == boundaries[1])
|
506
|
+
my_ip_s = IPAdmin.unpack_ipv6_addr(my_ip)
|
507
|
+
list.push( IPAdmin::IPAddr.new(:IPAddr => my_ip_s) )
|
508
|
+
my_ip = my_ip + bitstep
|
509
|
+
if (limit)
|
510
|
+
limit = limit -1
|
511
|
+
break if (limit == 0)
|
512
|
+
end
|
513
|
+
end
|
514
|
+
|
515
|
+
end
|
516
|
+
|
517
|
+
|
518
|
+
return(list)
|
519
|
+
end
|
520
|
+
module_function :range
|
521
|
+
|
522
|
+
#=====================================#
|
523
|
+
#
|
524
|
+
#=====================================#
|
525
|
+
|
526
|
+
|
527
|
+
|
395
528
|
#============================================================================#
|
396
529
|
# unpack_ipv4_addr()
|
397
530
|
#============================================================================#
|
@@ -1014,7 +1147,7 @@ class CIDR
|
|
1014
1147
|
#
|
1015
1148
|
# - Arguments:
|
1016
1149
|
# * Hash with the following fields
|
1017
|
-
# - :
|
1150
|
+
# - :Bitstep -- enumerate in X sized steps
|
1018
1151
|
# - :Objectify -- return IPAdmin::IPAddr objects
|
1019
1152
|
# - :Limit -- limit returned list to X number of items
|
1020
1153
|
#
|
@@ -1029,8 +1162,8 @@ class CIDR
|
|
1029
1162
|
v6_all_f = (2**128)-1
|
1030
1163
|
|
1031
1164
|
if (options)
|
1032
|
-
if( options.has_key?(:
|
1033
|
-
bitstep = options[:
|
1165
|
+
if( options.has_key?(:Bitstep) )
|
1166
|
+
bitstep = options[:Bitstep]
|
1034
1167
|
end
|
1035
1168
|
|
1036
1169
|
if( options.has_key?(:Objectify) )
|
@@ -1455,7 +1588,7 @@ class CIDR
|
|
1455
1588
|
|
1456
1589
|
# list all 'subnet' sized subnets of this cidr block
|
1457
1590
|
bitstep = 2**(max_bits - subnet)
|
1458
|
-
subs = self.enumerate(:
|
1591
|
+
subs = self.enumerate(:Bitstep => bitstep)
|
1459
1592
|
subs.each do |sub|
|
1460
1593
|
cidr = "#{sub}/#{subnet}"
|
1461
1594
|
new_subnets.push(IPAdmin::CIDR.new(:CIDR => cidr))
|
data/tests/cidr_test.rb
CHANGED
@@ -54,8 +54,8 @@ class TestCIDR < Test::Unit::TestCase
|
|
54
54
|
assert_equal(['fec0:0000:0000:0000:0000:0000:0000:0000'],cidr6.enumerate(:Limit => 1) )
|
55
55
|
|
56
56
|
|
57
|
-
enums4 = cidr4.enumerate(:Limit => 2, :
|
58
|
-
enums6 = cidr6.enumerate(:Limit => 2, :
|
57
|
+
enums4 = cidr4.enumerate(:Limit => 2, :Bitstep => 5)
|
58
|
+
enums6 = cidr6.enumerate(:Limit => 2, :Bitstep => 5)
|
59
59
|
assert_equal('192.168.1.5', enums4[1] )
|
60
60
|
assert_equal('fec0:0000:0000:0000:0000:0000:0000:0005', enums6[1] )
|
61
61
|
|
data/tests/functions_test.rb
CHANGED
@@ -105,6 +105,7 @@ class TestIPAdmin < Test::Unit::TestCase
|
|
105
105
|
cidr4_2 = IPAdmin::CIDR.new(:CIDR => '192.168.1.0/25')
|
106
106
|
cidr4_3 = IPAdmin::CIDR.new(:CIDR => '192.168.2.0/24')
|
107
107
|
cidr4_4 = IPAdmin::CIDR.new(:CIDR => '192.168.2.64/26')
|
108
|
+
cidr4_5 = IPAdmin::CIDR.new(:CIDR => '192.168.1.128/25')
|
108
109
|
|
109
110
|
cidr6_1 = IPAdmin::CIDR.new(:CIDR => 'fec0::0/10')
|
110
111
|
cidr6_2 = IPAdmin::CIDR.new(:CIDR => 'fec0::0/64')
|
@@ -114,12 +115,12 @@ class TestIPAdmin < Test::Unit::TestCase
|
|
114
115
|
comp1 = IPAdmin.compare_cidr(cidr4_1,cidr4_2)
|
115
116
|
comp2 = IPAdmin.compare_cidr(cidr4_4,cidr4_3)
|
116
117
|
comp3 = IPAdmin.compare_cidr(cidr4_1,cidr4_1)
|
117
|
-
comp4 = IPAdmin.compare_cidr(cidr4_1,cidr4_3)
|
118
|
-
|
118
|
+
comp4 = IPAdmin.compare_cidr(cidr4_1,cidr4_3)
|
119
119
|
comp5 = IPAdmin.compare_cidr(cidr6_1,cidr6_2)
|
120
120
|
comp6 = IPAdmin.compare_cidr(cidr6_4,cidr6_3)
|
121
121
|
comp7 = IPAdmin.compare_cidr(cidr6_1,cidr6_1)
|
122
|
-
comp8 = IPAdmin.compare_cidr(cidr6_1,cidr6_3)
|
122
|
+
comp8 = IPAdmin.compare_cidr(cidr6_1,cidr6_3)
|
123
|
+
comp9 = IPAdmin.compare_cidr(cidr4_2,cidr4_5)
|
123
124
|
|
124
125
|
assert_equal([cidr4_1,cidr4_2],comp1)
|
125
126
|
assert_equal([cidr4_3,cidr4_4],comp2)
|
@@ -129,6 +130,7 @@ class TestIPAdmin < Test::Unit::TestCase
|
|
129
130
|
assert_equal([cidr6_3,cidr6_4],comp6)
|
130
131
|
assert_equal(1,comp7)
|
131
132
|
assert_nil(comp8)
|
133
|
+
assert_nil(comp9)
|
132
134
|
end
|
133
135
|
|
134
136
|
|
@@ -147,6 +149,24 @@ class TestIPAdmin < Test::Unit::TestCase
|
|
147
149
|
assert_raise(RuntimeError){ IPAdmin.merge_cidr([cidr6_1,cidr6_3]) }
|
148
150
|
end
|
149
151
|
|
152
|
+
def test_range
|
153
|
+
ip4_1 = IPAdmin::IPAddr.new(:IPAddr => '192.168.1.0')
|
154
|
+
ip4_2 = IPAdmin::IPAddr.new(:IPAddr => '192.168.1.50')
|
155
|
+
ip6_1 = IPAdmin::IPAddr.new(:IPAddr => 'fec0::0')
|
156
|
+
ip6_2 = IPAdmin::IPAddr.new(:IPAddr => 'fec0::32')
|
157
|
+
|
158
|
+
assert_equal(['192.168.1.1'], IPAdmin.range(:Boundaries => [ip4_1,ip4_2], :Limit => 1) )
|
159
|
+
assert_equal(['fec0:0000:0000:0000:0000:0000:0000:0001'], IPAdmin.range(:Boundaries => [ip6_1,ip6_2], :Limit => 1) )
|
160
|
+
|
161
|
+
list = IPAdmin.range(:Boundaries => [ip4_1,ip4_2], :Bitstep => 2)
|
162
|
+
|
163
|
+
assert_equal(25, list.length)
|
164
|
+
assert_equal('192.168.1.49', list[24])
|
165
|
+
|
166
|
+
assert_raise(ArgumentError){ IPAdmin.range(:Limit => 1) }
|
167
|
+
assert_raise(RuntimeError){ IPAdmin.range(:Boundaries => [1,2]) }
|
168
|
+
end
|
169
|
+
|
150
170
|
end
|
151
171
|
|
152
172
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ipadmin
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2006-01-
|
6
|
+
version: 0.1.1
|
7
|
+
date: 2006-01-22 00:00:00 -06:00
|
8
8
|
summary: A package for manipulating IPv4/IPv6 address space.
|
9
9
|
require_paths:
|
10
10
|
- lib
|