wic: make engine.py:get_partitions() resilient to parted/dmidecode stderr output
PATCH v2 1/1 wic: make engine.py:get_partitions() resilient to parted/dmidecode stderr output
From: Geoff Parker <[email protected]>
Running wic commands on Debian 10 systems fail in scripts/lib/wic/engine.py:get_partitions() due to new stderr output captured when trying to parse the output from /sbin/parted as a non-root user.
The parted command calls the dmidecode utility, which produces this error as a non-root user:
/sys/firmware/dmi/tables/smbios_entry_point: Permission denied /dev/mem: Permission denied
scripts/lib/wic/engine.py:get_partitions() calls misc.py:exec_cmd(), a subprocess wrapper which returns a combined stderr and sdtdout. These messages to stderr confuse the partition table parser in get_partitions().
This patch has the partition table parser ignore lines before the expected "BYT;" header string.
Running wic in Debian 9 does not have this issue.
--- scripts/lib/wic/engine.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
scripts/lib/wic/engine.py +7 -2
@@ -266,10 +266,15 @@ class Disk: out = exec_cmd("%s -sm %s unit B print" % (self.parted, self.imagepath)) parttype = namedtuple("Part", "pnum start end size fstype") splitted = out.splitlines() - lsector_size, psector_size, self._ptable_format = splitted[1].split(":")[3:6] + # skip over possible errors in exec_cmd output + try: + idx =splitted.index("BYT;") + except ValueError: + raise WicError("Error getting partition information from %s" % (self.parted)) + lsector_size, psector_size, self._ptable_format = splitted[idx + 1].split(":")[3:6] self._lsector_size = int(lsector_size) self._psector_size = int(psector_size) - for line in splitted[2:]: + for line in splitted[idx + 2:]: pnum, start, end, size, fstype = line.split(':')[:5] partition = parttype(int(pnum), int(start[:-1]), int(end[:-1]), int(size[:-1]), fstype)
Signature · 1 line
2.19.1