import rpmUtils.miscutils as rpmutils
import subprocess
import sys
-
+from urllib2 import urlopen
+from urlparse import urlparse, urlunparse
def to_boolean(b):
val = b.lower().strip() if isinstance(b, basestring) else b
else:
self._monitor_services(handler, service_entries)
+class MetadataServerConnectionError(Exception):
+ pass
class Metadata(object):
_metadata = None
self._is_local_metadata = True
self._metadata = None
+
+ def metadata_server_url(self):
+ """
+ Return the url to the metadata server.
+ """
+ try:
+ f = open("/var/lib/cloud/data/cfn-metadata-server")
+ server_url = f.read()
+ f.close()
+ except IOError:
+ return None
+
+ url_parts = list(urlparse(server_url))
+ url_parts[2] = '/stacks/%s/resources/%s' % (self.stack, self.resource)
+ return urlunparse(url_parts)
+
+ def remote_metadata(self):
+ """
+ Connect to the metadata server and retreive the metadata from there.
+ """
+ server_url = self.metadata_server_url()
+ if not server_url:
+ raise MetadataServerConnectionError()
+
+ try:
+ return urlopen(server_url).read()
+ except:
+ raise MetadataServerConnectionError()
+
def retrieve(self, meta_str=None):
"""
Read the metadata from the given filename
if meta_str:
self._data = meta_str
else:
- f = open("/var/lib/cloud/data/cfn-init-data")
- self._data = f.read()
- f.close()
+ try:
+ self._data = self.remote_metadata()
+ except MetadataServerConnectionError:
+ f = open("/var/lib/cloud/data/cfn-init-data")
+ self._data = f.read()
+ f.close()
if isinstance(self._data, str):
self._metadata = json.loads(self._data)
filename='cfn-init-data')
mime_blob.attach(msg)
+ if self.stack.metadata_server:
+ msg = MIMEText(self.stack.metadata_server,
+ _subtype='x-cfninitdata')
+ msg.add_header('Content-Disposition', 'attachment',
+ filename='cfn-metadata-server')
+ mime_blob.attach(msg)
+
msg = MIMEText(userdata, _subtype='x-shellscript')
msg.add_header('Content-Disposition', 'attachment', filename='startup')
mime_blob.attach(msg)
self.mime_string = mime_blob.as_string()
-
- return self.mime_string
+ return self.mime_string
def create(self):
def _null_callback(p, n, out):
self.doc = None
self.name = stack_name
self.parsed_template_id = 0
- self.metadata_server = 'http://10.0.0.1'
+ # TODO(shadower) load this from a config file
+ #self.metadata_server = 'http://10.0.0.1'
self.parms['AWS::StackName'] = {"Description": "AWS StackName",
"Type": "String",