Module Ohai::Mixin::Ec2Metadata
In: lib/ohai/mixin/ec2_metadata.rb
Mixlib::CLI Application System RuntimeError Exec Config Log lib/ohai/config.rb lib/ohai/log.rb lib/ohai/system.rb lib/ohai/application.rb Command Ec2Metadata FromFile Mixin lib/ohai/exception.rb Exceptions Ohai dot/m_140_0.png

Methods

Constants

EC2_METADATA_ADDR = "169.254.169.254" unless defined?(EC2_METADATA_ADDR)
EC2_METADATA_URL = "/2012-01-12/meta-data" unless defined?(EC2_METADATA_URL)
EC2_USERDATA_URL = "/2012-01-12/user-data" unless defined?(EC2_USERDATA_URL)
EC2_ARRAY_VALUES = %w(security-groups)
EC2_ARRAY_DIR = %w(network/interfaces/macs)
EC2_JSON_DIR = %w(iam)

Public Instance methods

[Source]

    # File lib/ohai/mixin/ec2_metadata.rb, line 34
34:       def can_metadata_connect?(addr, port, timeout=2)
35:         t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
36:         saddr = Socket.pack_sockaddr_in(port, addr)
37:         connected = false
38: 
39:         begin
40:           t.connect_nonblock(saddr)
41:         rescue Errno::EINPROGRESS
42:           r,w,e = IO::select(nil,[t],nil,timeout)
43:           if !w.nil?
44:             connected = true
45:           else
46:             begin
47:               t.connect_nonblock(saddr)
48:             rescue Errno::EISCONN
49:               t.close
50:               connected = true
51:             rescue SystemCallError
52:             end
53:           end
54:         rescue SystemCallError
55:         end
56:         Ohai::Log.debug("can_metadata_connect? == #{connected}")
57:         connected
58:       end

[Source]

     # File lib/ohai/mixin/ec2_metadata.rb, line 90
 90:       def fetch_dir_metadata(id)
 91:         metadata = Hash.new
 92:         http_client.get("#{EC2_METADATA_URL}/#{id}").body.split("\n").each do |o|
 93:           key = expand_path(o)
 94:           if key[-1..-1] != '/'
 95:             metadata[metadata_key(key)] = http_client.get("#{EC2_METADATA_URL}/#{id}#{key}").body
 96:           elsif not key.eql?('/')
 97:             metadata[key[0..-2]] = fetch_dir_metadata("#{id}#{key}")
 98:           end
 99:         end
100:         metadata
101:       end

[Source]

     # File lib/ohai/mixin/ec2_metadata.rb, line 103
103:       def fetch_json_dir_metadata(id)
104:         metadata = Hash.new
105:         http_client.get("#{EC2_METADATA_URL}/#{id}").body.split("\n").each do |o|
106:           key = expand_path(o)
107:           if key[-1..-1] != '/'
108:             data = http_client.get("#{EC2_METADATA_URL}/#{id}#{key}").body
109:             json = StringIO.new(data)
110:             parser = Yajl::Parser.new
111:             metadata[metadata_key(key)] = parser.parse(json)
112:           elsif not key.eql?('/')
113:             metadata[key[0..-2]] = fetch_json_dir_metadata("#{id}#{key}")
114:           end
115:         end
116:         metadata
117:       end

[Source]

    # File lib/ohai/mixin/ec2_metadata.rb, line 64
64:       def fetch_metadata(id='')
65:         metadata = Hash.new
66:         http_client.get("#{EC2_METADATA_URL}/#{id}").body.split("\n").each do |o|
67:           key = expand_path("#{id}#{o}")
68:           if key[-1..-1] != '/'
69:             metadata[metadata_key(key)] =
70:               if EC2_ARRAY_VALUES.include? key
71:                 http_client.get("#{EC2_METADATA_URL}/#{key}").body.split("\n")
72:               else
73:                 http_client.get("#{EC2_METADATA_URL}/#{key}").body
74:               end
75:           elsif not key.eql?(id) and not key.eql?('/')
76:             name = key[0..-2]
77:             sym = metadata_key(name)
78:             if EC2_ARRAY_DIR.include?(name)
79:               metadata[sym] = fetch_dir_metadata(key)
80:             elsif EC2_JSON_DIR.include?(name)
81:               metadata[sym] = fetch_json_dir_metadata(key)
82:             else
83:               fetch_metadata(key).each{|k,v| metadata[k] = v}
84:             end
85:           end
86:         end
87:         metadata
88:       end

[Source]

     # File lib/ohai/mixin/ec2_metadata.rb, line 119
119:       def fetch_userdata()
120:         response = http_client.get("#{EC2_USERDATA_URL}/")
121:         response.code == "200" ? response.body : nil
122:       end

[Source]

    # File lib/ohai/mixin/ec2_metadata.rb, line 60
60:       def http_client
61:         Net::HTTP.start(EC2_METADATA_ADDR).tap {|h| h.read_timeout = 600}
62:       end

Private Instance methods

[Source]

     # File lib/ohai/mixin/ec2_metadata.rb, line 126
126:       def expand_path(file_name)
127:         path = file_name.gsub(/\=.*$/, '/')
128:         # ignore "./" and "../"
129:         path.gsub(%r{/\.\.?(?:/|$)}, '/').
130:           sub(%r{^\.\.?(?:/|$)}, '').
131:           sub(%r{^$}, '/')
132:       end

[Source]

     # File lib/ohai/mixin/ec2_metadata.rb, line 134
134:       def metadata_key(key)
135:         key.gsub(/\-|\//, '_')
136:       end

[Validate]