summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXabier de Zuazo <xabier@zuazo.org>2012-09-02 22:05:04 +0200
committerBryan McLellan <btm@opscode.com>2012-11-13 10:40:02 -0800
commit4d6e480123729c7dc47ce56571a6b0728662b265 (patch)
tree7e129a315ab514e80a11a41388229bbc73ea4778
parentfa85f82da168e959c1d516b7c2fbff97bfd110b6 (diff)
downloadohai-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.rb65
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