diff options
author | Ohad Levy <ohadlevy@gmail.com> | 2011-03-22 23:04:23 +0200 |
---|---|---|
committer | James Turnbull <james@lovedthanlost.net> | 2011-04-06 04:03:33 +1000 |
commit | 53cd946685fe5790dbbe5b2a3964e6d861bbfdde (patch) | |
tree | 7f7a92997478512842e5010af22a15d73d5842a3 | |
parent | 76f544b261ec1c9712105773946fec7e6d76b4e9 (diff) | |
download | facter-53cd946685fe5790dbbe5b2a3964e6d861bbfdde.tar.gz facter-53cd946685fe5790dbbe5b2a3964e6d861bbfdde.tar.xz facter-53cd946685fe5790dbbe5b2a3964e6d861bbfdde.zip |
Ensures that ARP facts are returned only on EC2 hosts
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 <ohadlevy@gmail.com>
-rw-r--r-- | lib/facter/arp.rb | 12 | ||||
-rw-r--r-- | 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..693e78e 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) |