diff options
author | Xabier de Zuazo <xabier@zuazo.org> | 2012-09-02 22:05:04 +0200 |
---|---|---|
committer | Bryan McLellan <btm@opscode.com> | 2012-11-13 10:40:02 -0800 |
commit | 4d6e480123729c7dc47ce56571a6b0728662b265 (patch) | |
tree | 7e129a315ab514e80a11a41388229bbc73ea4778 | |
parent | fa85f82da168e959c1d516b7c2fbff97bfd110b6 (diff) | |
download | ohai-4d6e480123729c7dc47ce56571a6b0728662b265.tar.gz |
EC2 instance data version updated to 2012-01-12: added support for IAM role credentials and network/interfaces/macs
-rw-r--r-- | lib/ohai/mixin/ec2_metadata.rb | 65 |
1 files changed, 59 insertions, 6 deletions
diff --git a/lib/ohai/mixin/ec2_metadata.rb b/lib/ohai/mixin/ec2_metadata.rb index c2d87095..118d63d8 100644 --- a/lib/ohai/mixin/ec2_metadata.rb +++ b/lib/ohai/mixin/ec2_metadata.rb @@ -25,9 +25,11 @@ module Ohai module Ec2Metadata EC2_METADATA_ADDR = "169.254.169.254" unless defined?(EC2_METADATA_ADDR) - EC2_METADATA_URL = "/2008-02-01/meta-data" unless defined?(EC2_METADATA_URL) - EC2_USERDATA_URL = "/2008-02-01/user-data" unless defined?(EC2_USERDATA_URL) + 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) def can_metadata_connect?(addr, port, timeout=2) t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0) @@ -62,16 +64,53 @@ module Ohai def fetch_metadata(id='') metadata = Hash.new http_client.get("#{EC2_METADATA_URL}/#{id}").body.split("\n").each do |o| - key = "#{id}#{o.gsub(/\=.*$/, '/')}" + key = _pv_expand_path("#{id}#{o}") if key[-1..-1] != '/' - metadata[key.gsub(/\-|\//, '_').to_sym] = + metadata[_pv_metadata_key(key)] = 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 - fetch_metadata(key).each{|k,v| metadata[k] = v} + elsif not key.eql?(id) and not key.eql?("/") + name = key[0..-2] + sym = _pv_metadata_key(name) + if EC2_ARRAY_DIR.include?(name) + metadata[sym] = fetch_dir_metadata(key) + elsif EC2_JSON_DIR.include?(name) + metadata[sym] = fetch_json_dir_metadata(key) + else + fetch_metadata(key).each{|k,v| metadata[k] = v} + end + end + end + metadata + end + + def fetch_dir_metadata(id) + metadata = Hash.new + http_client.get("#{EC2_METADATA_URL}/#{id}").body.split("\n").each do |o| + key = _pv_expand_path(o) + if key[-1..-1] != '/' + metadata[_pv_metadata_key(key)] = http_client.get("#{EC2_METADATA_URL}/#{id}#{key}").body + elsif not key.eql?('/') + metadata[key[0..-2]] = fetch_dir_metadata("#{id}#{key}") + end + end + metadata + end + + def fetch_json_dir_metadata(id) + metadata = Hash.new + http_client.get("#{EC2_METADATA_URL}/#{id}").body.split("\n").each do |o| + key = _pv_expand_path(o) + if key[-1..-1] != '/' + data = http_client.get("#{EC2_METADATA_URL}/#{id}#{key}").body + json = StringIO.new(data) + parser = Yajl::Parser.new + metadata[_pv_metadata_key(key)] = parser.parse(json) + elsif not key.eql?('/') + metadata[key[0..-2]] = fetch_json_dir_metadata("#{id}#{key}") end end metadata @@ -81,6 +120,20 @@ module Ohai response = http_client.get("#{EC2_USERDATA_URL}/") response.code == "200" ? response.body : nil end + + private + + def _pv_expand_path(file_name) + path = File.expand_path(file_name.gsub(/\=.*$/, '/'), '/') + path[0] = '' # remove the initial "/" + path << '/' if file_name[-1..-1].eql?('/') # it was a directory + path + end + + def _pv_metadata_key(key) + key.gsub(/\-|\//, '_').to_sym + end + end end end |