Module: Ohai::Mixin::Ec2Metadata

Defined in:
lib/ohai/mixin/ec2_metadata.rb

Constant Summary collapse

EC2_METADATA_ADDR =
"169.254.169.254"
EC2_METADATA_URL =
"/2008-02-01/meta-data"
EC2_USERDATA_URL =
"/2008-02-01/user-data"
EC2_ARRAY_VALUES =
%w(security-groups)

Instance Method Summary collapse

Instance Method Details

#can_metadata_connect?(addr, port, timeout = 2) ⇒ Boolean

Returns:

  • (Boolean)


32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/ohai/mixin/ec2_metadata.rb', line 32

def (addr, port, timeout=2)
  t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
  saddr = Socket.pack_sockaddr_in(port, addr)
  connected = false

  begin
    t.connect_nonblock(saddr)
  rescue Errno::EINPROGRESS
    r,w,e = IO::select(nil,[t],nil,timeout)
    if !w.nil?
      connected = true
    else
      begin
        t.connect_nonblock(saddr)
      rescue Errno::EISCONN
        t.close
        connected = true
      rescue SystemCallError
      end
    end
  rescue SystemCallError
  end
  Ohai::Log.debug("can_metadata_connect? == #{connected}")
  connected
end

#fetch_metadata(id = '') ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/ohai/mixin/ec2_metadata.rb', line 62

def (id='')
   = Hash.new
  http_client.get("#{EC2_METADATA_URL}/#{id}").body.split("\n").each do |o|
    key = "#{id}#{o.gsub(/\=.*$/, '/')}"
    if key[-1..-1] != '/'
      [key.gsub(/\-|\//, '_').to_sym] =
        if EC2_ARRAY_VALUES.include? key
          http_client.get("#{EC2_METADATA_URL}/#{key}").body.split("\n")
        else
          http_client.get("#{EC2_METADATA_URL}/#{key}").body
        end
    else
      (key).each{|k,v| [k] = v}
    end
  end
  
end

#fetch_userdataObject



80
81
82
83
# File 'lib/ohai/mixin/ec2_metadata.rb', line 80

def fetch_userdata()
  response = http_client.get("#{EC2_USERDATA_URL}/")
  response.code == "200" ? response.body : nil
end

#http_clientObject



58
59
60
# File 'lib/ohai/mixin/ec2_metadata.rb', line 58

def http_client
  Net::HTTP.start(EC2_METADATA_ADDR).tap {|h| h.read_timeout = 600}
end