lib/ipaddress.rb in ipaddress-0.5.0 vs lib/ipaddress.rb in ipaddress-0.6.0

- old
+ new

@@ -1,12 +1,139 @@ -$LOAD_PATH.unshift(File.dirname(__FILE__)) -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) +# +# = IPAddress +# +# A ruby library to manipulate IPv4 and IPv6 addresses +# +# +# Package:: IPAddress +# Author:: Marco Ceresa <ceresa@ieee.org> +# License:: Ruby License +# +#-- +# +#++ -require 'ipaddress/ipbase' require 'ipaddress/ipv4' require 'ipaddress/ipv6' +require 'ipaddress/extensions/extensions' + +module IPAddress + + NAME = "IPAddress" + GEM = "ipaddress" + AUTHORS = ["Marco Ceresa <ceresa@ieee.org>"] + + # + # Parse the argument string to create a new + # IPv4, IPv6 or Mapped IP object + # + # ip = IPAddress.parse "172.16.10.1/24" + # ip6 = IPAddress.parse "2001:db8::8:800:200c:417a/64" + # ip_mapped = IPAddress.parse "::ffff:172.16.10.1/128" + # + # All the object created will be instances of the + # correct class: + # + # ip.class + # #=> IPAddress::IPv4 + # ip6.class + # #=> IPAddress::IPv6 + # ip_mapped.class + # #=> IPAddress::IPv6::Mapped + # + def IPAddress::parse(str) + case str + when /:.+\./ + IPAddress::IPv6::Mapped.new(str) + else + begin + IPAddress::IPv4.new(str) + rescue ArgumentError + IPAddress::IPv6.new(str) + end + end + end + + # + # Checks if the given string is a valid IP address, + # either IPv4 or IPv6 + # + # Example: + # + # IPAddress::valid? "2002::1" + # #=> true + # + # IPAddress::valid? "10.0.0.256" + # #=> false + # + def self.valid?(addr) + valid_ipv4?(addr) || valid_ipv6?(addr) + end + + # + # Checks if the given string is a valid IPv4 address + # + # Example: + # + # IPAddress::valid_ipv4? "2002::1" + # #=> false + # + # IPAddress::valid_ipv4? "172.16.10.1" + # #=> true + # + def self.valid_ipv4?(addr) + if /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ =~ addr + return $~.captures.all? {|i| i.to_i < 256} + end + false + end + + # + # Checks if the argument is a valid IPv4 netmask + # expressed in dotted decimal format. + # + # IPAddress.valid_ipv4_netmask? "255.255.0.0" + # #=> true + # + def self.valid_ipv4_netmask?(addr) + arr = addr.split(".").map{|i| i.to_i}.pack("CCCC").unpack("B*").first.scan(/01/) + arr.empty? && valid_ipv4?(addr) + rescue + return false + end + + # + # Checks if the given string is a valid IPv6 address + # + # Example: + # + # IPAddress::valid_ipv6? "2002::1" + # #=> true + # + # IPAddress::valid_ipv6? "2002::DEAD::BEEF" + # #=> false + # + def self.valid_ipv6?(addr) + # IPv6 (normal) + return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*\Z/ =~ addr + return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr + return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr + # IPv6 (IPv4 compat) + return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:/ =~ addr && valid_ipv4?($') + return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_ipv4?($') + return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_ipv4?($') + false + end + + def self.deprecate(message = nil) # :nodoc: + message ||= "You are using deprecated behavior which will be removed from the next major or minor release." + warn("DEPRECATION WARNING: #{message}") + end + +end # module IPAddress + # # IPAddress is a wrapper method built around # IPAddress's library classes. Its purpouse is to # make you indipendent from the type of IP address # you're going to use. @@ -33,20 +160,9 @@ # #=> IPAddress::IPv6 # ip_mapped.class # #=> IPAddress::IPv6::Mapped # def IPAddress(str) - case str - when /:.+\./ - IPAddress::IPv6::Mapped.new(str) - else - begin - IPAddress::IPv4.new(str) - rescue ArgumentError - IPAddress::IPv6.new(str) - end - end + IPAddress::parse str end - -