Module | Ohai::Mixin::Ec2Metadata |
In: |
lib/ohai/mixin/ec2_metadata.rb
|
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) |
# 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
# 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
# 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
# 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
# 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
# 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
# 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