[PATCH] rteval: Don't attempt to get DMIinfo if there are dmi warnings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If the python module dmidecode is available, but produces warnings,
you can get a traceback. This happens on some arm boxes,
as shown in the traceback below.

Fix this by treating any warnings that are not listed in the
ignorable warnings as if dmi info is not available.

Also add logging to dmi.ProcessWarnings()

./rteval-cmd -d10s
** DMI WARNING ** /sys/firmware/efi/systab: SMBIOS entry point missing
got system topology: 1 node system (4 cores per node)
rteval run on 5.19.16-200.fc36.aarch64 started at Fri Oct 21 16:11:51 2022
started 3 loads on 4 cores
started measurement threads on 4 cores
Run duration: 10.0 seconds
stopping run at Fri Oct 21 16:13:26 2022
Traceback (most recent call last):
  File "/root/src/rteval/./rteval-cmd", line 402, in <module>
    ec = rteval.Measure()
  File "/root/src/rteval/rteval/__init__.py", line 286, in Measure
    self._report(measure_start, self.__rtevcfg.xslt_report)
  File "/root/src/rteval/rteval/rtevalReport.py", line 76, in _report
    self.__xmlreport.AppendXMLnodes(self._sysinfo.MakeReport())
  File "/root/src/rteval/rteval/sysinfo/__init__.py", line 69, in MakeReport
    report_n.addChild(dmi.DMIinfo.MakeReport(self))
  File "/root/src/rteval/rteval/sysinfo/dmi.py", line 111, in MakeReport
    dmiqry = xmlout.convert_libxml2_to_lxml_doc(self.__dmixml.QuerySection('all'))
  File "/usr/lib64/python3.10/site-packages/dmidecode.py", line 64, in QuerySection
    ret = libxml2.xmlDoc( _obj = xmlapi(query_type='s',
RuntimeError: [src/dmidecodemodule.c:331] Error decoding DMI data

** COLLECTED WARNINGS **
/sys/firmware/efi/systab: SMBIOS entry point missing
** END OF WARNINGS **

Signed-off-by: John Kacur <jkacur@xxxxxxxxxx>
---
 rteval-cmd                 |  4 ++--
 rteval/sysinfo/__init__.py |  2 +-
 rteval/sysinfo/dmi.py      | 34 +++++++++++++++++++++-------------
 3 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/rteval-cmd b/rteval-cmd
index 6a928362828f..1e6a7fc86baa 100755
--- a/rteval-cmd
+++ b/rteval-cmd
@@ -210,8 +210,6 @@ def remove_offline(cpulist):
 if __name__ == '__main__':
     from rteval.sysinfo import dmi
 
-    dmi.ProcessWarnings()
-
     # set LD_BIND_NOW to resolve shared library symbols
     # note: any string will do, nothing significant about 'rteval'
 
@@ -261,6 +259,8 @@ if __name__ == '__main__':
                 | (rtevcfg.debugging and Log.DEBUG)
         logger.SetLogVerbosity(loglev)
 
+        dmi.ProcessWarnings(logger=logger)
+
         # Load modules
         loadmods = LoadModules(config, logger=logger)
         measuremods = MeasurementModules(config, logger=logger)
diff --git a/rteval/sysinfo/__init__.py b/rteval/sysinfo/__init__.py
index bb1d00810856..5767e5b7f6fe 100644
--- a/rteval/sysinfo/__init__.py
+++ b/rteval/sysinfo/__init__.py
@@ -49,7 +49,7 @@ class SystemInfo(KernelInfo, SystemServices, dmi.DMIinfo, CPUtopology,
         NetworkInfo.__init__(self, logger=logger)
 
         # Parse initial DMI decoding errors
-        dmi.ProcessWarnings()
+        dmi.ProcessWarnings(logger=logger)
 
         # Parse CPU info
         CPUtopology._parse(self)
diff --git a/rteval/sysinfo/dmi.py b/rteval/sysinfo/dmi.py
index 5965c128c093..83f347623b58 100644
--- a/rteval/sysinfo/dmi.py
+++ b/rteval/sysinfo/dmi.py
@@ -1,6 +1,7 @@
 #
 #   Copyright 2009 - 2013   Clark Williams <williams@xxxxxxxxxx>
 #   Copyright 2009 - 2013   David Sommerseth <davids@xxxxxxxxxx>
+#   Copyright 2022          John Kacur <jkacur@xxxxxxxxxx>
 #
 #   This program is free software; you can redistribute it and/or modify
 #   it under the terms of the GNU General Public License as published by
@@ -34,14 +35,19 @@ from rteval import rtevalConfig
 
 try:
     import dmidecode
-    dmidecode_loaded = True
+    dmidecode_avail = True
 except ModuleNotFoundError:
-    dmidecode_loaded = False
+    dmidecode_avail = False
 
-def ProcessWarnings():
+def set_dmidecode_avail(val):
+    """ Used to set global variable dmidecode_avail from a function """
+    global dmidecode_avail
+    dmidecode_avail = val
+
+def ProcessWarnings(logger=None):
     """ Process Warnings from dmidecode """
 
-    if not dmidecode_loaded:
+    if not dmidecode_avail:
         return
 
     if not hasattr(dmidecode, 'get_warnings'):
@@ -62,7 +68,8 @@ def ProcessWarnings():
 
         # All other warnings will be printed
         if len(warnline) > 0:
-            print(f"** DMI WARNING ** {warnline}")
+            logger.log(Log.DEBUG, f"** DMI WARNING ** {warnline}")
+            set_dmidecode_avail(False)
 
     dmidecode.clear_warnings()
 
@@ -70,11 +77,11 @@ def ProcessWarnings():
 class DMIinfo:
     '''class used to obtain DMI info via python-dmidecode'''
 
-    def __init__(self, logger):
-        self.__version = '0.5'
+    def __init__(self, logger=None):
+        self.__version = '0.6'
 
-        if not dmidecode_loaded:
-            logger.log(Log.DEBUG|Log.WARN, "No dmidecode module found, ignoring DMI tables")
+        if not dmidecode_avail:
+            logger.log(Log.DEBUG, "DMI info unavailable, ignoring DMI tables")
             self.__fake = True
             return
 
@@ -127,14 +134,15 @@ def unit_test(rootdir):
                 self.__dict__[k] = self.config[k]
 
     try:
-        ProcessWarnings()
+        log = Log()
+        log.SetLogVerbosity(Log.DEBUG|Log.INFO)
+
+        ProcessWarnings(logger=log)
         if os.getuid() != 0:
             print("** ERROR **  Must be root to run this unit_test()")
             return 1
 
-        log = Log()
-        log.SetLogVerbosity(Log.DEBUG|Log.INFO)
-        d = DMIinfo(log)
+        d = DMIinfo(logger=log)
         dx = d.MakeReport()
         x = libxml2.newDoc("1.0")
         x.setRootElement(dx)
-- 
2.37.3




[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux