summaryrefslogtreecommitdiff
path: root/lib/ipaddress.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ipaddress.rb')
-rw-r--r--lib/ipaddress.rb74
1 files changed, 70 insertions, 4 deletions
diff --git a/lib/ipaddress.rb b/lib/ipaddress.rb
index 4f8c71f..99591d7 100644
--- a/lib/ipaddress.rb
+++ b/lib/ipaddress.rb
@@ -102,22 +102,88 @@ module IPAddress
self.kind_of? IPAddress::IPv6
end
+
+ #
+ # Checks if the given string is either a valid IP, either a valid IPv4 subnet
+ #
+ # Example:
+ #
+ # IPAddress::valid? "10.0.0.0/24"
+ # #=> true
+ #
+ # IPAddress::valid? "2002::1"
+ # #=> true
+ #
+ # IPAddress::valid? "10.0.0.256"
+ # #=> false
+ #
+ # IPAddress::valid? "10.0.0.0/999"
+ # #=> false
+ #
+ def self.valid?(addr)
+ valid_ip?(addr) || valid_ipv4_subnet?(addr) || valid_ipv6_subnet?(addr)
+ end
+
#
# Checks if the given string is a valid IP address,
# either IPv4 or IPv6
#
# Example:
#
- # IPAddress::valid? "2002::1"
+ # IPAddress::valid_ip? "2002::1"
# #=> true
#
- # IPAddress::valid? "10.0.0.256"
+ # IPAddress::valid_ip? "10.0.0.256"
# #=> false
#
- def self.valid?(addr)
+ def self.valid_ip?(addr)
valid_ipv4?(addr) || valid_ipv6?(addr)
end
-
+
+ #
+ # Checks if the given string is a valid IPv4 subnet
+ #
+ # Example:
+ #
+ # IPAdress::valid_ipv4_subnet? "10.0.0.0/24"
+ # #=> true
+ #
+ # IPAdress::valid_ipv4_subnet? "10.0.0.0/255.255.255.0"
+ # #=> true
+ #
+ # IPAdress::valid_ipv4_subnet? "10.0.0.0/64"
+ # #=> false
+ #
+ def self.valid_ipv4_subnet?(addr)
+ ip, netmask = addr.split("/")
+
+ valid_ipv4?(ip) && (!(netmask =~ /\A([12]?\d|3[0-2])\z/).nil? || valid_ipv4_netmask?(netmask))
+ end
+
+ #
+ # Checks if the given string is a valid IPv6 subnet
+ #
+ # Example:
+ #
+ # IPAdress::valid_ipv6_subnet? "::/0"
+ # #=> true
+ #
+ # IPAdress::valid_ipv6_subnet? "dead:beef:cafe:babe::/64"
+ # #=> true
+ #
+ # IPAdress::valid_ipv6_subnet? "2001::1/129"
+ # #=> false
+ #
+ def self.valid_ipv6_subnet?(addr)
+ ip, netmask = addr.split("/")
+
+ netmask = Integer(netmask, 10)
+
+ valid_ipv6?(ip) && netmask >= 0 && netmask <= 128
+ rescue ArgumentError
+ false
+ end
+
#
# Checks if the given string is a valid IPv4 address
#