summaryrefslogtreecommitdiff
path: root/cloudinit/user_data.py
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2015-04-16 17:00:19 -0400
committerScott Moser <smoser@ubuntu.com>2015-04-16 17:00:19 -0400
commit341a805fca9a06ce12e9f4bbbe15b3dded9eb6a4 (patch)
tree71fce1c6c426f75c7126522a3a6efb57e4a9b26e /cloudinit/user_data.py
parentdcd4b2b371059bd6249b4e43af371ee1162273e8 (diff)
downloadvyos-cloud-init-341a805fca9a06ce12e9f4bbbe15b3dded9eb6a4.tar.gz
vyos-cloud-init-341a805fca9a06ce12e9f4bbbe15b3dded9eb6a4.zip
fix cloud-config-archive handling
handling of cloud-config-archive input would fail in fully_decoded_payload. part.get_charset() would return a Charset object, but get_charset.input_codec is a string suitable for passing to decode. This handles that correctly, and is more careful about binary data inside input. The test added verifies that cloud-config inside a cloud-config-archive is handled correctly and also that binary data there is ignored without exceptions raised. LP: #1445143
Diffstat (limited to 'cloudinit/user_data.py')
-rw-r--r--cloudinit/user_data.py9
1 files changed, 7 insertions, 2 deletions
diff --git a/cloudinit/user_data.py b/cloudinit/user_data.py
index eb3c7336..f7c5787c 100644
--- a/cloudinit/user_data.py
+++ b/cloudinit/user_data.py
@@ -49,6 +49,7 @@ INCLUDE_TYPES = ['text/x-include-url', 'text/x-include-once-url']
ARCHIVE_TYPES = ["text/cloud-config-archive"]
UNDEF_TYPE = "text/plain"
ARCHIVE_UNDEF_TYPE = "text/cloud-config"
+ARCHIVE_UNDEF_BINARY_TYPE = "application/octet-stream"
# This seems to hit most of the gzip possible content types.
DECOMP_TYPES = [
@@ -265,11 +266,15 @@ class UserDataProcessor(object):
content = ent.get('content', '')
mtype = ent.get('type')
if not mtype:
- mtype = handlers.type_from_starts_with(content,
- ARCHIVE_UNDEF_TYPE)
+ default = ARCHIVE_UNDEF_TYPE
+ if isinstance(content, six.binary_type):
+ default = ARCHIVE_UNDEF_BINARY_TYPE
+ mtype = handlers.type_from_starts_with(content, default)
maintype, subtype = mtype.split('/', 1)
if maintype == "text":
+ if isinstance(content, six.binary_type):
+ content = content.decode()
msg = MIMEText(content, _subtype=subtype)
else:
msg = MIMEBase(maintype, subtype)