summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/user_data.py41
1 files changed, 33 insertions, 8 deletions
diff --git a/cloudinit/user_data.py b/cloudinit/user_data.py
index df069ff8..23c31fde 100644
--- a/cloudinit/user_data.py
+++ b/cloudinit/user_data.py
@@ -48,6 +48,18 @@ ARCHIVE_TYPES = ["text/cloud-config-archive"]
UNDEF_TYPE = "text/plain"
ARCHIVE_UNDEF_TYPE = "text/cloud-config"
+# This seems to hit most of the gzip possible content types.
+DECOMP_TYPES = [
+ 'application/gzip',
+ 'application/gzip-compressed',
+ 'application/gzipped',
+ 'application/x-compress',
+ 'application/x-compressed',
+ 'application/x-gunzip',
+ 'application/x-gzip',
+ 'application/x-gzip-compressed',
+]
+
# Msg header used to track attachments
ATTACHMENT_FIELD = 'Number-Attachments'
@@ -67,6 +79,13 @@ class UserDataProcessor(object):
return accumulating_msg
def _process_msg(self, base_msg, append_msg):
+
+ def replace_header(part, key, value):
+ if key in part:
+ part.replace_header(key, value)
+ else:
+ part[key] = value
+
for part in base_msg.walk():
if is_skippable(part):
continue
@@ -75,6 +94,18 @@ class UserDataProcessor(object):
ctype_orig = part.get_content_type()
payload = part.get_payload(decode=True)
+ # When the message states it is of a gzipped content type ensure
+ # that we attempt to decode said payload so that the decompressed
+ # data can be examined (instead of the compressed data).
+ if ctype_orig in DECOMP_TYPES:
+ try:
+ payload = util.decomp_gzip(payload, quiet=False)
+ ctype_orig = UNDEF_TYPE
+ # TODO(harlowja): should we also set the payload to the
+ # decompressed value??
+ except util.DecompressionError:
+ pass
+
if not ctype_orig:
ctype_orig = UNDEF_TYPE
@@ -85,10 +116,7 @@ class UserDataProcessor(object):
ctype = ctype_orig
if ctype != ctype_orig:
- if CONTENT_TYPE in part:
- part.replace_header(CONTENT_TYPE, ctype)
- else:
- part[CONTENT_TYPE] = ctype
+ replace_header(part, CONTENT_TYPE, ctype)
if ctype in INCLUDE_TYPES:
self._do_include(payload, append_msg)
@@ -100,10 +128,7 @@ class UserDataProcessor(object):
# Should this be happening, shouldn't
# the part header be modified and not the base?
- if CONTENT_TYPE in base_msg:
- base_msg.replace_header(CONTENT_TYPE, ctype)
- else:
- base_msg[CONTENT_TYPE] = ctype
+ replace_header(base_msg, CONTENT_TYPE, ctype)
self._attach_part(append_msg, part)