diff options
| -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): | 
