From: Ohad Levy <ohadl...@gmail.com> ARP facts on large network might lead to inconstant values as we are always using the first ARP entry from the output of the ARP command
Signed-off-by: Ohad Levy <ohadl...@gmail.com> --- lib/facter/arp.rb | 12 ++++++++---- lib/facter/ec2.rb | 16 +++++----------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/facter/arp.rb b/lib/facter/arp.rb index 5035ad0..0a7cf67 100644 --- a/lib/facter/arp.rb +++ b/lib/facter/arp.rb @@ -3,14 +3,17 @@ require 'facter/util/ip' Facter.add(:arp) do confine :kernel => :linux setcode do - arp = [] output = Facter::Util::Resolution.exec('arp -a') if not output.nil? + arp = "" output.each_line do |s| - arp.push($1) if s =~ /^\S+\s\S+\s\S+\s(\S+)\s\S+\s\S+\s\S+$/ + if s =~ /^\S+\s\S+\s\S+\s(\S+)\s\S+\s\S+\s\S+$/ + arp = $1 + break # stops on the first match + end end end - arp[0] + EC2_ARP == arp ? arp : nil end end @@ -18,7 +21,8 @@ Facter::Util::IP.get_interfaces.each do |interface| Facter.add("arp_" + Facter::Util::IP.alphafy(interface)) do confine :kernel => :linux setcode do - Facter::Util::IP.get_arp_value(interface) + arp = Facter::Util::IP.get_arp_value(interface) + EC2_ARP == arp ? arp : nil end end end diff --git a/lib/facter/ec2.rb b/lib/facter/ec2.rb index 29b2a1c..b36790b 100644 --- a/lib/facter/ec2.rb +++ b/lib/facter/ec2.rb @@ -6,9 +6,11 @@ require 'open-uri' require 'socket' -EC2_ADDR = "169.254.169.254" +EC2_ADDR = "169.254.169.254" EC2_METADATA_URL = "http://#{EC2_ADDR}/2008-02-01/meta-data" EC2_USERDATA_URL = "http://#{EC2_ADDR}/2008-02-01/user-data" +EC2_ARP = "fe:ff:ff:ff:ff:ff" +EC2_EUCA_MAC = %r{^[dD]0:0[dD]:} def can_metadata_connect?(addr, port, timeout=2) t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0) @@ -61,19 +63,11 @@ def userdata() end def has_euca_mac? - if Facter.value(:macaddress) =~ /^[dD]0:0[dD]:/ - return true - else - return false - end + Facter.value(:macaddress) =~ EC2_EUCA_MAC end def has_ec2_arp? - if Facter.value(:arp) == 'fe:ff:ff:ff:ff:ff' - return true - else - return false - end + Facter.value(:arp) == EC2_ARP end if (has_euca_mac? || has_ec2_arp?) && can_metadata_connect?(EC2_ADDR,80) -- 1.7.4 -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to puppet-dev@googlegroups.com. To unsubscribe from this group, send email to puppet-dev+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.