summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOhad Levy <ohadlevy@gmail.com>2011-03-22 23:04:23 +0200
committerJames Turnbull <james@lovedthanlost.net>2011-04-06 04:03:33 +1000
commit53cd946685fe5790dbbe5b2a3964e6d861bbfdde (patch)
tree7f7a92997478512842e5010af22a15d73d5842a3
parent76f544b261ec1c9712105773946fec7e6d76b4e9 (diff)
downloadfacter-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.rb12
-rw-r--r--lib/facter/ec2.rb16
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)