Codebase list facter / 8bb503e
Merge branch 'tickets/master/2346' into next James Turnbull 13 years ago
4 changed file(s) with 99 addition(s) and 14 deletion(s). Raw diff Collapse all Expand all
0 require 'facter/util/ip'
1
2 Facter.add(:arp) do
3 confine :kernel => :linux
4 setcode do
5 arp = []
6 output = %x{/usr/sbin/arp -a}
7 output.each_line do |s|
8 arp.push($1) if s =~ /^\S+\s\S+\s\S+\s(\S+)\s\S+\s\S+\s\S+$/
9 end
10 arp[0]
11 end
12 end
13
14 Facter::Util::IP.get_interfaces.each do |interface|
15 Facter.add("arp_" + Facter::Util::IP.alphafy(interface)) do
16 confine :kernel => :linux
17 setcode do
18 Facter::Util::IP.get_arp_value(interface)
19 end
20 end
21 end
0 # Changelog:
1 # Original facts - Tim Dysinger
2 # Updated and added can_connect? function - KurtBe
0 # Original fact Tim Dysinger
1 # Additional work from KurtBe
2 # Additional work for Paul Nasrat
3 # Additional work modelled on Ohai EC2 fact
34
45 require 'open-uri'
5 require 'timeout'
6 require 'socket'
67
7 def can_connect?(ip,port,wait_sec=2)
8 Timeout::timeout(wait_sec) {open(ip, port)}
9 return true
10 rescue
11 return false
8 EC2_ADDR = "169.254.169.254"
9 EC2_METADATA_URL = "http://#{EC2_ADDR}/2008-02-01/meta-data"
10 EC2_USERDATA_URL = "http://#{EC2_ADDR}/2008-02-01/user-data"
11
12 def can_metadata_connect?(addr, port, timeout=2)
13 t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
14 saddr = Socket.pack_sockaddr_in(port, addr)
15 connected = false
16
17 begin
18 t.connect_nonblock(saddr)
19 rescue Errno::EINPROGRESS
20 r,w,e = IO::select(nil,[t],nil,timeout)
21 if !w.nil?
22 connected = true
23 else
24 begin
25 t.connect_nonblock(saddr)
26 rescue Errno::EISCONN
27 t.close
28 connected = true
29 rescue SystemCallError
30 end
31 end
32 rescue SystemCallError
33 end
34 connected
1235 end
1336
14
1537 def metadata(id = "")
16 open("http://169.254.169.254/2008-02-01/meta-data/#{id||=''}").read.
38 open("#{EC2_METADATA_URL}/#{id||=''}").read.
1739 split("\n").each do |o|
1840 key = "#{id}#{o.gsub(/\=.*$/, '/')}"
1941 if key[-1..-1] != '/'
20 value = open("http://169.254.169.254/2008-02-01/meta-data/#{key}").read.
42 value = open("#{EC2_METADATA_URL}/#{key}").read.
2143 split("\n")
2244 value = value.size>1 ? value : value.first
2345 symbol = "ec2_#{key.gsub(/\-|\//, '_')}".to_sym
2850 end
2951 end
3052
31 if can_connect?("169.254.169.254","80")
32 metadata
53 def userdata()
54 # assumes the only expected error is the 404 if there's no user-data
55 begin
56 value = OpenURI.open_uri("#{EC2_USERDATA_URL}/").read.split
57 Facter.add(:ec2_userdata) { setcode { value } }
58 rescue OpenURI::HTTPError
59 end
3360 end
3461
62 def has_euca_mac?
63 if Facter.value(:macaddress) =~ /^[dD]0:0[dD]:/
64 return true
65 else
66 return false
67 end
68 end
69
70 def has_ec2_arp?
71 if Facter.value(:arp) == 'fe:ff:ff:ff:ff:ff'
72 return true
73 else
74 return false
75 end
76 end
77
78 if (has_euca_mac? || has_ec2_arp?) && can_metadata_connect?(EC2_ADDR,80)
79 metadata
80 userdata
81 else
82 Facter.debug "Not an EC2 host"
83 end
168168 network = ip.mask(subnet.to_s).to_s
169169 end
170170 end
171
172 def self.get_arp_value(interface)
173 arp = Facter::Util::Resolution.exec("arp -en -i #{interface} | sed -e 1d")
174 if arp =~ /^\S+\s+\w+\s+(\S+)\s+\w\s+\S+$/
175 return $1
176 end
177 end
171178 end
226226 Facter::Util::IP.convert_from_hex?(platform).should == true
227227 end
228228 end
229
230 it "should return an arp address on Linux" do
231 Facter.stubs(:value).with(:kernel).returns("Linux")
232
233 Facter::Util::IP.expects(:get_arp_value).with("eth0").returns("00:00:0c:9f:f0:04")
234 Facter::Util::IP.get_arp_value("eth0").should == "00:00:0c:9f:f0:04"
235 end
229236 end