summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2016-03-10 16:56:44 -0500
committerScott Moser <smoser@ubuntu.com>2016-03-10 16:56:44 -0500
commit41470d29f5888baf7ec78e170cc0d6d981dcf63e (patch)
treefa9777e5efcaddd21d8c0127dcd617ef7e2fac0a
parent0865e5179f2a803f727e83b5e36681613e63fe8a (diff)
parentbe38478cd8e11b0e29c70bb881a676628e9f74d5 (diff)
downloadvyos-cloud-init-41470d29f5888baf7ec78e170cc0d6d981dcf63e.tar.gz
vyos-cloud-init-41470d29f5888baf7ec78e170cc0d6d981dcf63e.zip
dmi data: fix failure of reading dmi data for unset dmi values
it is not uncommon to find dmi data in /sys full of 'ff'. utf-8 decoding of those would fail, causing warning and stacktrace. Return '.' instead of \xff. This is what dmidecode would return. $ dmidecode --string system-product-name
-rw-r--r--ChangeLog1
-rw-r--r--cloudinit/util.py12
-rw-r--r--tests/unittests/test_util.py10
3 files changed, 20 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index da1ca9ee..ebaacf6a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -88,6 +88,7 @@
- No longer run pollinate in seed_random (LP: #1554152)
- groups: add defalt user to 'lxd' group. Create groups listed
for a user if they do not exist. (LP: #1539317)
+ - dmi data: fix failure of reading dmi data for unset dmi values
0.7.6:
- open 0.7.6
diff --git a/cloudinit/util.py b/cloudinit/util.py
index e7407ea4..01dc7751 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -2140,13 +2140,19 @@ def _read_dmi_syspath(key):
LOG.debug("did not find %s", dmi_key_path)
return None
- key_data = load_file(dmi_key_path)
+ key_data = load_file(dmi_key_path, decode=False)
if not key_data:
LOG.debug("%s did not return any data", dmi_key_path)
return None
- LOG.debug("dmi data %s returned %s", dmi_key_path, key_data)
- return key_data.strip()
+ # uninitialized dmi values show as all \xff and /sys appends a '\n'.
+ # in that event, return a string of '.' in the same length.
+ if key_data == b'\xff' * (len(key_data) - 1) + b'\n':
+ key_data = b'.' * (len(key_data) - 1) + b'\n'
+
+ str_data = key_data.decode('utf8').strip()
+ LOG.debug("dmi data %s returned %s", dmi_key_path, str_data)
+ return str_data
except Exception:
logexc(LOG, "failed read of %s", dmi_key_path)
diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py
index 95990165..0a986fec 100644
--- a/tests/unittests/test_util.py
+++ b/tests/unittests/test_util.py
@@ -385,6 +385,16 @@ class TestReadDMIData(helpers.FilesystemMockingTestCase):
self.patch_mapping({})
self.assertEqual(None, util.read_dmi_data('expect-fail'))
+ def test_dots_returned_instead_of_foxfox(self):
+ # uninitialized dmi values show as \xff, return those as .
+ my_len = 32
+ dmi_value = b'\xff' * my_len + b'\n'
+ expected = '.' * my_len
+ dmi_key = 'system-product-name'
+ sysfs_key = 'product_name'
+ self._create_sysfs_file(sysfs_key, dmi_value)
+ self.assertEqual(expected, util.read_dmi_data(dmi_key))
+
class TestMultiLog(helpers.FilesystemMockingTestCase):