Copyright (c) 2006 Dustin Spinhirne
Licensed under the same terms as Ruby, No Warranty is provided.
Comments are welcome. Please include 'IPAdmin' in the title of
any emails.
Dustin Spinhirne
Examples:
require 'rubygems'
require_gem 'ipadmin'
puts "IPAdmin::CIDR"
print "\n"
cidr4 = IPAdmin::CIDR.new(:CIDR => '192.168.1.0/24')
cidr4 = IPAdmin::CIDR.new(:CIDR => '192.168.1.1',
:Netmask => '255.255.255.0',
:Tag => {'test' => 'cidr4 tag'})
cidr6 = IPAdmin::CIDR.new(:CIDR => 'fec0::1/64')
cidr4_2 = IPAdmin::CIDR.new(:CIDR => '192.168.1.0/26')
cidr6_2 = IPAdmin::CIDR.new(:CIDR => 'fec0::0/96')
puts "reader/writer"
puts "cidr4 tag '#{cidr4.tag['test']}'"
cidr4.tag['test'] = 'modified cidr4 tag'
puts "updated cidr4 tag '#{cidr4.tag['test']}'"
puts "cidr4 version #{cidr4.version}"
print "\n"
puts "bits"
puts "cidr4 netmask in bits #{cidr4.bits()}"
puts "cidr6 netmask in bits #{cidr6.bits()}"
print "\n"
puts "contains"
puts "#{cidr4.desc} contains #{cidr4_2.desc}" if ( cidr4.contains?(cidr4_2) )
puts "#{cidr6.desc} contains #{cidr6_2.desc}" if ( cidr6.contains?(cidr6_2) )
print "\n"
puts "desc"
puts "cidr4 description #{cidr4.desc()}"
puts "cidr6 description #{cidr6.desc()}"
puts "cidr6 short-hand description #{cidr6.desc(:Short => true)}"
print "\n"
puts "enumerate"
puts "first 4 cidr4 addresses (bitstep 32)"
cidr4.enumerate(:Limit => 4, :Bitstep => 32).each {|x| puts " #{x}"}
puts "first 4 cidr6 addresses (bitstep 32)"
cidr6.enumerate(:Limit => 4, :Bitstep => 32, :Objectify => true).each {|x| puts " #{x.desc}"}
print "\n"
puts "hostmask_ext"
puts "cidr4 extended hostmask #{cidr4.hostmask_ext()}"
print "\n"
puts "ip"
puts "cidr4 ip #{cidr4.ip()}"
puts "cidr6 short-hand ip #{cidr6.ip(:Short => true)}"
print "\n"
puts "last"
puts "cidr4 last ip #{cidr4.last()}"
puts "cidr6 last ip #{cidr6.last(:Short => true)}"
print "\n"
puts "netmask"
puts "cidr4 netmask in CIDR format #{cidr4.netmask()}"
puts "cidr6 netmask in CIDR format #{cidr6.netmask()}"
print "\n"
puts "netmask_ext"
puts "cidr4 extended netmask #{cidr4.netmask_ext()}"
print "\n"
puts "network"
puts "cidr4 network address #{cidr4.network()}"
puts "cidr6 network address #{cidr6.network(:Short => true)}"
print "\n"
puts "next_ip"
puts "cidr4 next ip #{cidr4.next_ip()}"
puts "cidr6 next ip #{cidr6.next_ip(:Short => true)}"
print "\n"
puts "next_subnet"
puts "cidr4 next subnet #{cidr4.next_subnet()}"
puts "cidr6 next subnet #{cidr6.next_subnet(:Short => true)}"
print "\n"
puts "nth"
puts "cidr4 1st ip is #{cidr4.nth(:Index => 1)}"
puts "cidr6 1st ip is #{(cidr6.nth(:Index => 1, :Objectify => true)).base}"
print "\n"
puts "packed_hostmask"
puts "cidr4 packed_hostmask is #{cidr4.packed_hostmask.to_s(16)}"
puts "cidr6 packed_hostmask is #{cidr6.packed_hostmask.to_s(16)}"
print "\n"
puts "packed_netmask"
puts "cidr4 packed_netmask is #{cidr4.packed_netmask.to_s(16)}"
puts "cidr6 packed_netmask is #{cidr6.packed_netmask.to_s(16)}"
print "\n"
puts "packed_network"
puts "cidr4 packed_network is #{cidr4.packed_network.to_s(16)}"
puts "cidr6 packed_network is #{cidr6.packed_network.to_s(16)}"
print "\n"
puts "range"
cidr4.range(:Indexes => [20,0], :Bitstep => 5).each {|x| puts x}
cidr6.range(:Indexes => [20,0], :Bitstep => 5).each {|x| puts x}
print "\n"
puts "remainder"
cidr4_2 = IPAdmin::CIDR.new(:CIDR => '192.168.1.64/26')
cidr4.remainder(:Exclude => cidr4_2).each {|x| puts x}
print "\n"
puts "resize!"
cidr4.resize!(:Subnet => 25)
cidr6.resize!(:Subnet => 65)
puts "cidr4 resized is #{cidr4.desc}"
puts "cidr6 resized is #{cidr6.desc}"
print "\n"
puts "size"
puts "cidr4 size is #{cidr4.size()}"
puts "cidr6 size is #{cidr6.size()}"
print "\n"
puts "subnet"
puts "#{cidr4.desc} subnetted into at least 3 /28 ranges"
cidr4.subnet(:Subnet => 28, :MinCount => 3).each {|x| puts " #{x}"}
puts "#{cidr6.desc(:Short => true)} subnetted into at least 4 /67 ranges"
cidr6.subnet(:Subnet => 67, :MinCount => 4, :Short => true).each {|x| puts " #{x}"}
print "\n\n\n"
puts "IPAdmin::Tree"
print "\n"
cidr4 = [IPAdmin::CIDR.new(:CIDR => '192.168.1.0/24'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.0/26'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.64/26'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.128/26'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.192/26'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.0/27'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.0/28'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.16/28'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.16/29'),
IPAdmin::CIDR.new(:CIDR => '192.168.1.32/27')]
cidr6 = [IPAdmin::CIDR.new(:CIDR => 'fec0::/64'),
IPAdmin::CIDR.new(:CIDR => 'fec0::/66'),
IPAdmin::CIDR.new(:CIDR => 'fec0::4000:0:0:0/66'),
IPAdmin::CIDR.new(:CIDR => 'fec0::8000:0:0:0/66'),
IPAdmin::CIDR.new(:CIDR => 'fec0::c000:0:0:0/66'),
IPAdmin::CIDR.new(:CIDR => 'fec0::c000:0:0:0/67'),
IPAdmin::CIDR.new(:CIDR => 'fec0::/67'),
IPAdmin::CIDR.new(:CIDR => 'fec0::2000:0:0:0/67')]
tree4 = IPAdmin::Tree.new(:Version => 4)
tree6 = IPAdmin::Tree.new(:Version => 6)
puts "add"
cidr4.each do |x|
puts "adding #{x.desc}..."
tree4.add(x)
end
cidr6.each do |x|
puts "adding #{x.desc}..."
tree6.add(x)
end
print "\n"
puts "dump"
puts "dumping & printing tree4"
dumped = tree4.dump()
dumped.each do |val|
obj = val[:Object]
depth = val[:Depth]
if (depth > 0)
indent = " " * (depth*3)
puts indent << obj.desc()
else
puts obj.desc()
end
end
print "\n"
puts "dumping & printing tree6"
dumped = tree6.dump()
dumped.each do |val|
obj = val[:Object]
depth = val[:Depth]
if (depth > 0)
indent = " " * (depth*3)
puts indent << obj.desc()
else
puts obj.desc()
end
end
print "\n"
puts "find_space with at least 28 IP's in it"
puts "available space with at least 28 IPs"
space = tree4.find_space(:IPCount => 28)
space.each do |obj|
puts " #{obj.desc}"
end
print "\n"
puts "available /67 space"
space = tree6.find_space(:Subnet => 67)
space.each do |obj|
puts " #{obj.desc}"
end
print "\n"
puts "remove"
puts "removing #{cidr4[8].desc}"
tree4.remove(cidr4[8])
puts tree4.show()
print "\n"
puts "removing #{cidr6[5].desc}"
tree6.remove(cidr6[5])
puts tree6.show()
print "\n"
puts "prune"
puts "pruning #{cidr4[4].desc}"
tree4.prune(cidr4[4])
puts tree4.show()
print "\n"
puts "pruning #{cidr6[1].desc}"
tree6.prune(cidr6[1])
puts tree6.show()
print "\n"
puts "collapse"
puts "collapsed tree4 is..."
new_tree4 = tree4.collapse()
puts new_tree4.show()
print "\n"
puts "collapsed tree6 is..."
new_tree6 = tree6.collapse()
puts new_tree6.show()
print "\n\n\n"
puts "IPAdmin Methods"
print "\n"
puts "validate ip"
puts "192.168.1.0 is valid" if ( IPAdmin.validate_ipv4_addr('192.168.1.0') )
puts "fec0::0 is valid" if ( IPAdmin.validate_ipv6_addr('fec0::0') )
print "\n"
puts "validate netmask"
puts "255.255.255.0 is valid" if (IPAdmin.validate_ipv4_netmask('255.255.255.0') )
puts "/24 is valid" if ( IPAdmin.validate_ipv4_netmask(24) )
puts "/64 is valid" if ( IPAdmin.validate_ipv6_netmask(64) )
cidr4_1 = IPAdmin::CIDR.new(:CIDR => '192.168.1.0/24')
cidr4_2 = IPAdmin::CIDR.new(:CIDR => '192.168.1.0/25')
cidr4_3 = IPAdmin::CIDR.new(:CIDR => '192.168.1.50')
cidr6_1 = IPAdmin::CIDR.new(:CIDR => 'fec0::0/10')
cidr6_2 = IPAdmin::CIDR.new(:CIDR => 'fec0::0/64')
print "\n"
puts "compare"
comp1 = IPAdmin.compare(cidr4_1,cidr4_2)
comp2 = IPAdmin.compare(cidr6_1,cidr6_2)
puts "#{(comp1[0]).desc} is the supernet of #{(comp1[1]).desc}"
puts "#{(comp2[0]).desc} is the supernet of #{(comp2[1]).desc}"
cidr4_1 = IPAdmin::CIDR.new(:CIDR => '192.168.1.0/24')
cidr4_2 = IPAdmin::CIDR.new(:CIDR => '192.168.0.0/24')
cidr6_1 = IPAdmin::CIDR.new(:CIDR => 'fec0::0/128')
cidr6_2 = IPAdmin::CIDR.new(:CIDR => 'fec0::1/128')
print "\n"
puts "range"
list = IPAdmin.range(:Boundaries => [cidr4_1,cidr4_3], :Bitstep => 20 )
puts "ip's between #{cidr4_1.base} and #{cidr4_3.base} (bitstep of 20)"
list.each do |x|
puts " #{x}"
end
print "\n"
puts "arpa"
puts "arpa for #{cidr4_1.desc()} is #{IPAdmin.arpa(cidr4_1)}"
puts "arpa for #{cidr6_1.desc()} is #{IPAdmin.arpa(cidr6_1)}"
print "\n"
puts "shorten"
puts "shorthand notation for #{cidr6_1.network()} is #{IPAdmin.shorten(cidr6_1.network)}"
print "\n"
puts "unshorten"
puts "expanded notation for fec0:: is #{IPAdmin.unshorten('fec0::')}"