diff options
author | Barry Warsaw <barry@python.org> | 2015-01-26 14:48:23 -0500 |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2015-01-26 14:48:23 -0500 |
commit | 18b35de06432869a9d859e2978e7e9567eba66a2 (patch) | |
tree | 8627efd630cecb28e0a55a7953953e8c2673cadc | |
parent | de5974fe93dd717e0c7ba6de17db3192cc258cff (diff) | |
download | vyos-cloud-init-18b35de06432869a9d859e2978e7e9567eba66a2.tar.gz vyos-cloud-init-18b35de06432869a9d859e2978e7e9567eba66a2.zip |
Another handling of b64decode.
Also, restore Python 2 compatibility.
-rw-r--r-- | cloudinit/config/cc_seed_random.py | 8 | ||||
-rw-r--r-- | cloudinit/sources/DataSourceOpenNebula.py | 11 |
2 files changed, 17 insertions, 2 deletions
diff --git a/cloudinit/config/cc_seed_random.py b/cloudinit/config/cc_seed_random.py index 3b7235bf..981e1b08 100644 --- a/cloudinit/config/cc_seed_random.py +++ b/cloudinit/config/cc_seed_random.py @@ -38,7 +38,13 @@ def _decode(data, encoding=None): if not encoding or encoding.lower() in ['raw']: return data elif encoding.lower() in ['base64', 'b64']: - return base64.b64decode(data) + # Try to give us a native string in both Python 2 and 3, and remember + # that b64decode() returns bytes in Python 3. + decoded = base64.b64decode(data) + try: + return decoded.decode('utf-8') + except UnicodeDecodeError: + return decoded elif encoding.lower() in ['gzip', 'gz']: return util.decomp_gzip(data, quiet=False) else: diff --git a/cloudinit/sources/DataSourceOpenNebula.py b/cloudinit/sources/DataSourceOpenNebula.py index 691b39f8..6da569ec 100644 --- a/cloudinit/sources/DataSourceOpenNebula.py +++ b/cloudinit/sources/DataSourceOpenNebula.py @@ -25,6 +25,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import base64 +import codecs import os import pwd import re @@ -34,6 +35,8 @@ from cloudinit import log as logging from cloudinit import sources from cloudinit import util +import six + LOG = logging.getLogger(__name__) DEFAULT_IID = "iid-dsopennebula" @@ -43,6 +46,12 @@ CONTEXT_DISK_FILES = ["context.sh"] VALID_DSMODES = ("local", "net", "disabled") +def utf8_open(path): + if six.PY3: + return open(path, 'r', encoding='utf-8') + return codecs.open(path, 'r', encoding='utf-8') + + class DataSourceOpenNebula(sources.DataSource): def __init__(self, sys_cfg, distro, paths): sources.DataSource.__init__(self, sys_cfg, distro, paths) @@ -380,7 +389,7 @@ def read_context_disk_dir(source_dir, asuser=None): "does not exist", asuser) try: path = os.path.join(source_dir, 'context.sh') - with open(path, 'r', encoding='utf-8') as f: + with utf8_open(path) as f: content = f.read().strip() context = parse_shell_config(content, asuser=asuser) |