diff options
Diffstat (limited to 'lib/facter/ipaddress6.rb')
-rw-r--r-- | lib/facter/ipaddress6.rb | 75 |
1 files changed, 35 insertions, 40 deletions
diff --git a/lib/facter/ipaddress6.rb b/lib/facter/ipaddress6.rb index 547d636..db3805b 100644 --- a/lib/facter/ipaddress6.rb +++ b/lib/facter/ipaddress6.rb @@ -1,32 +1,46 @@ +# Fact: ipaddress6 +# +# Purpose: Returns the "main" IPv6 IP address of a system. +# +# Resolution: +# OS dependant code that parses the output of various networking +# tools and currently not very intelligent. Returns the first +# non-loopback and non-linklocal address found in the ouput unless +# a default route can be mapped to a routeable interface. Guessing +# an interface is currently only possible with BSD type systems +# to many assumptions have to be made on other platforms to make +# this work with the current code. Most code ported or modeled +# after the ipaddress fact for the sake of similar functionality +# and familiar mechanics. +# +# Caveats: +# + # Cody Herriges <c.a.herriges@gmail.com> # # Used the ipaddress fact that is already part of # Facter as a template. -# OS dependant code that parses the output of various networking -# tools and currently not very intelligent. Returns the first -# non-loopback and non-linklocal address found in the ouput unless -# a default route can be mapped to a routeable interface. Guessing -# an interface is currently only possible with BSD type systems -# to many assumptions have to be made on other platforms to make -# this work with the current code. Most code ported or modeled -# after the ipaddress fact for the sake of similar functionality -# and familiar mechanics. +def get_address_after_token(output, token, return_first=false) + ip = nil + + output.scan(/#{token} ((?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/).each do |match| + match = match.first + unless match =~ /fe80.*/ or match == "::1" + ip = match + break if return_first + end + end + + ip +end + Facter.add(:ipaddress6) do confine :kernel => :linux setcode do - ip = nil output = Facter::Util::Resolution.exec('/sbin/ifconfig') - output.scan(/inet6 addr: ((?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/).each { |str| - str = str.to_s - unless str =~ /fe80.*/ or str == "::1" - ip = str - end - } - - ip - + get_address_after_token(output, 'inet6 addr:') end end @@ -34,17 +48,8 @@ Facter.add(:ipaddress6) do confine :kernel => %w{SunOS} setcode do output = Facter::Util::Resolution.exec('/usr/sbin/ifconfig -a') - ip = nil - - output.scan(/inet6 ((?>[0-9,a-f,A-F]*\:{0,2})+[0-9,a-f,A-F]{0,4})/).each { |str| - str = str.to_s - unless str =~ /fe80.*/ or str == "::1" - ip = str - end - } - - ip + get_address_after_token(output, 'inet6') end end @@ -52,17 +57,7 @@ Facter.add(:ipaddress6) do confine :kernel => %w{Darwin FreeBSD OpenBSD} setcode do output = Facter::Util::Resolution.exec('/sbin/ifconfig -a') - ip = nil - - output.scan(/inet6 ((?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/).each do |str| - str = str.to_s - unless str =~ /fe80.*/ or str == "::1" - ip = str - break - end - end - ip + get_address_after_token(output, 'inet6', true) end end - |