= ruby-ip library This is a library for manipulating IP addresses. == Installation Gem:: gem install ruby-ip Source:: git clone git://github.com/deploy2/ruby-ip.git Docs:: http://deploy2.github.com/ruby-ip/ == Feature overview * Create from string and to string require 'ip' ip = IP.new("192.0.2.53/24") ip.to_s # "192.0.2.53/24" ip.to_i # 3221226037 ip.to_hex # "c0000235" ip.to_addr # "192.0.2.53" ip.pfxlen # 24 * Qualify IP address with "routing context" (VRF) ip = IP.new("192.0.2.53/24@cust1") ip.to_s # "192.0.2.53/24@cust1" ip.to_addrlen # "192.0.2.53/24" ip.ctx # "cust1" * Clean implementation of IP::V4 and IP::V6 as subclasses of IP ip1 = IP.new("192.0.2.53/24") # ip2 = IP.new("2001:db8:be00::/48") # ip1.is_a?(IP::V4) # true * Create directly from integers or hex ip = IP::V4.new(3221226037, 24, "cust1") ip = IP::V4.new("c0000235", 24, "cust1") * Netmask manipulation ip = IP.new("192.0.2.53/24") ip.network # ip.network(1) # ip.broadcast # ip.broadcast(-1) # ip.mask # 255 ip.size # 256 ip.netmask.to_s # "255.255.255.0" ip.wildmask.to_s # "0.0.0.255" * Address masking ip = IP.new("192.0.2.53/24") ip.offset? # true ip.offset # 53 ip.mask! ip.to_s # "192.0.2.0/24" ip.offset? # false * Simple IP arithmetic ip = IP.new("192.0.2.53/24") ip + 4 # ip | 7 # ip ^ 7 # ~ip # * Convert to and from a compact Array representation ip1 = IP.new("192.0.2.53/24@cust1") ip1.to_a # ["v4", 3221226037, 24, "cust1"] ip2 = IP.new(["v4", 3221226037, 24, "cust1"]) ip1 == ip2 # true * Hex array representation, useful when talking to languages which don't have Bignum support ip1 = IP.new("2001:db8:be00::/48@cust1") ip1.to_ah # ["v6", "20010db8be0000000000000000000000", 48, "cust1"] ip2 = IP.new(["v6", "20010db8be0000000000000000000000", 48, "cust1"]) ip1 == ip2 # true * Addresses are Comparable, sortable, and can be used as Hash keys == Why not IPAddr? Ruby bundles an IPAddr class (ipaddr.rb). However there are a number of serious problems with this library. 1. Given an IP address with a netmask or prefix (e.g. 192.0.2.0/24) it's very hard to get access to the netmask part. It involves digging around instance variables. 2. It's impossible to deal with an off-base address with prefix, because IPAddr forcibly masks it to the base. e.g. 192.0.2.53/24 is stored as 192.0.2.0/24 3. IPAddr uses calls to the socket library to validate IP addresses, and this can trigger spurious DNS lookups when given an invalid IP address. ruby-ip does not depend on the socket library at all, unless you require 'ip/socket' to have access to the Socket::AF_INET and Socket::AF_INET6 constants. == Copying You may use, distribute and modify this software under the same terms as ruby itself (see LICENSE.txt and COPYING.txt)