Class: Resolv::IPv6
- Inherits:
-
Object
- Object
- Resolv::IPv6
- Defined in:
- lib/resolv.rb
Overview
A Resolv::DNS IPv6 address.
Constant Summary collapse
- Regex_8Hex =
IPv6 address format a:b:c:d:e:f:g:h
/\A (?:[0-9A-Fa-f]{1,4}:){7} [0-9A-Fa-f]{1,4} \z/x
- Regex_CompressedHex =
Compressed IPv6 address format a::b
/\A ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) :: ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) \z/x
- Regex_6Hex4Dec =
IPv4 mapped IPv6 address format a:b:c:d:e:f:w.x.y.z
/\A ((?:[0-9A-Fa-f]{1,4}:){6,6}) (\d+)\.(\d+)\.(\d+)\.(\d+) \z/x
- Regex_CompressedHex4Dec =
Compressed IPv4 mapped IPv6 address format a::b:w.x.y.z
/\A ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) :: ((?:[0-9A-Fa-f]{1,4}:)*) (\d+)\.(\d+)\.(\d+)\.(\d+) \z/x
- Regex =
A composite IPv6 address Regexp.
/ (?:#{Regex_8Hex}) | (?:#{Regex_CompressedHex}) | (?:#{Regex_6Hex4Dec}) | (?:#{Regex_CompressedHex4Dec})/x
Instance Attribute Summary collapse
-
#address ⇒ Object
readonly
The raw IPv6 address as a String.
Class Method Summary collapse
-
.create(arg) ⇒ Object
Creates a new IPv6 address from
arg
which may be:.
Instance Method Summary collapse
-
#==(other) ⇒ Object
:nodoc:.
-
#eql?(other) ⇒ Boolean
:nodoc:.
-
#hash ⇒ Object
:nodoc:.
-
#initialize(address) ⇒ IPv6
constructor
:nodoc:.
-
#inspect ⇒ Object
:nodoc:.
-
#to_name ⇒ Object
Turns this IPv6 address into a Resolv::DNS::Name.
-
#to_s ⇒ Object
:nodoc:.
Constructor Details
#initialize(address) ⇒ IPv6
:nodoc:
2459 2460 2461 2462 2463 2464 |
# File 'lib/resolv.rb', line 2459 def initialize(address) # :nodoc: unless address.kind_of?(String) && address.length == 16 raise ArgumentError.new('IPv6 address must be 16 bytes') end @address = address end |
Instance Attribute Details
#address ⇒ Object (readonly)
The raw IPv6 address as a String.
2469 2470 2471 |
# File 'lib/resolv.rb', line 2469 def address @address end |
Class Method Details
.create(arg) ⇒ Object
Creates a new IPv6 address from arg
which may be:
- IPv6
-
returns
arg
. - String
-
arg
must match one of the IPv6::Regex* constants
2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 |
# File 'lib/resolv.rb', line 2413 def self.create(arg) case arg when IPv6 return arg when String address = '' if Regex_8Hex =~ arg arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')} elsif Regex_CompressedHex =~ arg prefix = $1 suffix = $2 a1 = '' a2 = '' prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')} suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')} omitlen = 16 - a1.length - a2.length address << a1 << "\0" * omitlen << a2 elsif Regex_6Hex4Dec =~ arg prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')} address << [a, b, c, d].pack('CCCC') else raise ArgumentError.new("not numeric IPv6 address: " + arg) end elsif Regex_CompressedHex4Dec =~ arg prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d a1 = '' a2 = '' prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')} suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')} omitlen = 12 - a1.length - a2.length address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC') else raise ArgumentError.new("not numeric IPv6 address: " + arg) end else raise ArgumentError.new("not numeric IPv6 address: " + arg) end return IPv6.new(address) else raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}") end end |
Instance Method Details
#==(other) ⇒ Object
:nodoc:
2493 2494 2495 |
# File 'lib/resolv.rb', line 2493 def ==(other) # :nodoc: return @address == other.address end |
#eql?(other) ⇒ Boolean
:nodoc:
2497 2498 2499 |
# File 'lib/resolv.rb', line 2497 def eql?(other) # :nodoc: return self == other end |
#hash ⇒ Object
:nodoc:
2501 2502 2503 |
# File 'lib/resolv.rb', line 2501 def hash # :nodoc: return @address.hash end |
#inspect ⇒ Object
:nodoc:
2479 2480 2481 |
# File 'lib/resolv.rb', line 2479 def inspect # :nodoc: return "#<#{self.class} #{self.to_s}>" end |
#to_name ⇒ Object
Turns this IPv6 address into a Resolv::DNS::Name. – ip6.arpa should be searched too. [RFC3152]
2488 2489 2490 2491 |
# File 'lib/resolv.rb', line 2488 def to_name return DNS::Name.new( @address.unpack("H32")[0].split(//).reverse + ['ip6', 'arpa']) end |
#to_s ⇒ Object
:nodoc:
2471 2472 2473 2474 2475 2476 2477 |
# File 'lib/resolv.rb', line 2471 def to_s # :nodoc: address = sprintf("%X:%X:%X:%X:%X:%X:%X:%X", *@address.unpack("nnnnnnnn")) unless address.sub!(/(^|:)0(:0)+(:|$)/, '::') address.sub!(/(^|:)0(:|$)/, '::') end return address end |