Friday, April 13, 2007

Convert IP ranges to set of CIDR


#Ruby port of range2cidr. Convert IP ranges to set of CIDR.
#from DZone Snippets: ruby code by sevkin (Vsevolod Balashov)
#See rfc1878 for more detail about CIDR

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# $Hg: range_cidr.rb,v af9566d89389 2007-04-12 20:28 +0400 $
# (C) 2007 under terms of LGPL v2.1
# by Vsevolod S. Balashov
#
# backported from perl code
# http://www.irbs.net/internet/postfix/0401/att-3032/cidr_range.pl.gz

def range_cidr(first, last, &block)
if first < last
idx1 = 32
idx1 -= 1 while first[idx1] == last[idx1]
prefix = first >> idx1+1 << idx1+1

idx2 = 0
idx2 += 1 while idx2 <= idx1 and first[idx2] == 0 and last[idx2] == 1

if idx2 <= idx1
range_cidr(first, prefix | 2**idx1-1, &block)
range_cidr(prefix | 1 << idx1, last, &block)
else
yield prefix, 32-idx2
end
else
yield first, 32
end
end

#!/usr/bin/env ruby
# $Hg: range2cidr.rb,v 2142c33ada8b 2007-04-11 23:14 +0400 $
# (C) 2007 under terms of GPL v2
# by Vsevolod S. Balashov
#
# example usage of range_cidr.rb

#require 'lib/range_cidr'
require 'ipaddr'
require 'socket'

if __FILE__ == $0
if ARGV.size == 2
range_cidr(IPAddr.new(ARGV[0]).to_i, IPAddr.new(ARGV[1]).to_i) { |subnet, mask|
puts "#{IPAddr.new(subnet, Socket::AF_INET).to_s}/#{mask}" }
else
puts "usage: range2cidr "
puts "example: range2cidr 192.168.1.0 192.168.2.255"
end
end

另: http://rubyforge.org/projects/ip-address/

No comments :