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
|
3 | 4 |
|
4 | 5 |
require 'open-uri'
|
5 | |
require 'timeout'
|
|
6 |
require 'socket'
|
6 | 7 |
|
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
|
12 | 35 |
end
|
13 | 36 |
|
14 | |
|
15 | 37 |
def metadata(id = "")
|
16 | |
open("http://169.254.169.254/2008-02-01/meta-data/#{id||=''}").read.
|
|
38 |
open("#{EC2_METADATA_URL}/#{id||=''}").read.
|
17 | 39 |
split("\n").each do |o|
|
18 | 40 |
key = "#{id}#{o.gsub(/\=.*$/, '/')}"
|
19 | 41 |
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.
|
21 | 43 |
split("\n")
|
22 | 44 |
value = value.size>1 ? value : value.first
|
23 | 45 |
symbol = "ec2_#{key.gsub(/\-|\//, '_')}".to_sym
|
|
28 | 50 |
end
|
29 | 51 |
end
|
30 | 52 |
|
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
|
33 | 60 |
end
|
34 | 61 |
|
|
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
|