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.

Reply via email to