diff options
author | Scott Moser <smoser@ubuntu.com> | 2016-03-10 16:56:44 -0500 |
---|---|---|
committer | Scott Moser <smoser@ubuntu.com> | 2016-03-10 16:56:44 -0500 |
commit | 41470d29f5888baf7ec78e170cc0d6d981dcf63e (patch) | |
tree | fa9777e5efcaddd21d8c0127dcd617ef7e2fac0a | |
parent | 0865e5179f2a803f727e83b5e36681613e63fe8a (diff) | |
parent | be38478cd8e11b0e29c70bb881a676628e9f74d5 (diff) | |
download | vyos-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-- | ChangeLog | 1 | ||||
-rw-r--r-- | cloudinit/util.py | 12 | ||||
-rw-r--r-- | tests/unittests/test_util.py | 10 |
3 files changed, 20 insertions, 3 deletions
@@ -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): |