commit 2943519758f494c46ff0b130c355abb15e1cc47f Author: MSVSphere Packaging Team Date: Wed Dec 27 16:18:40 2023 +0300 import rteval-3.5-4.el8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ce47971 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/rteval-3.5.tar.xz diff --git a/.rteval.metadata b/.rteval.metadata new file mode 100644 index 0000000..476b584 --- /dev/null +++ b/.rteval.metadata @@ -0,0 +1 @@ +3aee70e8cca181b05b522acab8a44d45fb876e28 SOURCES/rteval-3.5.tar.xz diff --git a/SOURCES/Fix-DMI-WARNING-when-not-running-as-root.patch b/SOURCES/Fix-DMI-WARNING-when-not-running-as-root.patch new file mode 100644 index 0000000..e901b20 --- /dev/null +++ b/SOURCES/Fix-DMI-WARNING-when-not-running-as-root.patch @@ -0,0 +1,165 @@ +From 149c119df7c7a8ddfd1abc7a127d536cc0674230 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Tue, 23 Aug 2022 14:57:37 -0400 +Subject: [PATCH 1/3] rteval: Fix "DMI WARNING" when not running as root + +In some cases it is not necessary to run as root, for example when +running -Z (--summarize) to summarize an existing report. + +In such cases we do not want to see the message: +** DMI WARNING ** Failed to open memory buffer (/dev/mem): Permission denied + +The fix here is to surpresses that message. + +In addition: +- the unused "config" option to DMIinfo.__init__ is removed +- A few strings are converted to f-strings +- "with" is used to open the xsltfile + +Signed-off-by: John Kacur +--- + rteval/sysinfo/__init__.py | 6 ++--- + rteval/sysinfo/dmi.py | 45 +++++++++++++++++++------------------- + 2 files changed, 26 insertions(+), 25 deletions(-) + +diff --git a/rteval/sysinfo/__init__.py b/rteval/sysinfo/__init__.py +index 0436ebb350d9..a4359382f006 100644 +--- a/rteval/sysinfo/__init__.py ++++ b/rteval/sysinfo/__init__.py +@@ -42,7 +42,7 @@ class SystemInfo(KernelInfo, SystemServices, dmi.DMIinfo, CPUtopology, + self.__logger = logger + KernelInfo.__init__(self, logger=logger) + SystemServices.__init__(self, logger=logger) +- dmi.DMIinfo.__init__(self, config, logger=logger) ++ dmi.DMIinfo.__init__(self, logger=logger) + CPUtopology.__init__(self) + OSInfo.__init__(self, logger=logger) + cmdlineInfo.__init__(self, logger=logger) +@@ -80,8 +80,8 @@ if __name__ == "__main__": + cfg.installdir = "." + si = SystemInfo(cfg, logger=l) + +- print("\tRunning on %s" % si.get_base_os()) +- print("\tNUMA nodes: %d" % si.mem_get_numa_nodes()) ++ print(f"\tRunning on {si.get_base_os()}") ++ print(f"\tNUMA nodes: {si.mem_get_numa_nodes()}") + print("\tMemory available: %03.2f %s\n" % si.mem_get_size()) + + print("\tServices: ") +diff --git a/rteval/sysinfo/dmi.py b/rteval/sysinfo/dmi.py +index 80cf3c723b36..5965c128c093 100644 +--- a/rteval/sysinfo/dmi.py ++++ b/rteval/sysinfo/dmi.py +@@ -1,6 +1,4 @@ + # +-# dmi.py - class to wrap DMI Table information +-# + # Copyright 2009 - 2013 Clark Williams + # Copyright 2009 - 2013 David Sommerseth + # +@@ -24,6 +22,7 @@ + # including keys needed to generate an equivalently functional executable + # are deemed to be part of the source code. + # ++""" dmi.py class to wrap DMI Table Information """ + + import sys + import os +@@ -52,16 +51,18 @@ def ProcessWarnings(): + if warnings is None: + return + ++ ignore1 = '/dev/mem: Permission denied' ++ ignore2 = 'No SMBIOS nor DMI entry point found, sorry.' ++ ignore3 = 'Failed to open memory buffer (/dev/mem): Permission denied' ++ ignore = (ignore1, ignore2, ignore3) + for warnline in warnings.split('\n'): + # Ignore these warnings, as they are "valid" if not running as root +- if warnline == '/dev/mem: Permission denied': +- continue +- if warnline == 'No SMBIOS nor DMI entry point found, sorry.': ++ if warnline in ignore: + continue + + # All other warnings will be printed + if len(warnline) > 0: +- print("** DMI WARNING ** %s" % warnline) ++ print(f"** DMI WARNING ** {warnline}") + + dmidecode.clear_warnings() + +@@ -69,8 +70,7 @@ def ProcessWarnings(): + class DMIinfo: + '''class used to obtain DMI info via python-dmidecode''' + +- # TODO: Remove unnecessary config +- def __init__(self, config, logger): ++ def __init__(self, logger): + self.__version = '0.5' + + if not dmidecode_loaded: +@@ -83,22 +83,24 @@ class DMIinfo: + + self.__xsltparser = self.__load_xslt('rteval_dmi.xsl') + +- def __load_xslt(self, fname): +- xsltfile = None ++ @staticmethod ++ def __load_xslt(fname): ++ xsltf = None + if os.path.exists(fname): +- xsltfile = open(fname, "r") +- elif rtevalConfig.default_config_search([fname], os.path.isfile): +- xsltfile = open(rtevalConfig.default_config_search([fname], os.path.isfile), "r") +- +- if xsltfile: +- xsltdoc = lxml.etree.parse(xsltfile) +- ret = lxml.etree.XSLT(xsltdoc) +- xsltfile.close() ++ xsltf = fname ++ else: ++ xsltf = rtevalConfig.default_config_search([fname], os.path.isfile) ++ ++ if xsltf: ++ with open(xsltf, "r") as xsltfile: ++ xsltdoc = lxml.etree.parse(xsltfile) ++ ret = lxml.etree.XSLT(xsltdoc) + return ret + + raise RuntimeError(f'Could not locate XSLT template for DMI data ({fname})') + + def MakeReport(self): ++ """ Add DMI information to final report """ + rep_n = libxml2.newNode("DMIinfo") + rep_n.newProp("version", self.__version) + if self.__fake: +@@ -113,7 +115,7 @@ class DMIinfo: + return rep_n + + def unit_test(rootdir): +- """ unit_test for dmi.py, looks a little crufty! """ ++ """ unit_test for dmi.py """ + + class UnittestConfigDummy: + def __init__(self, rootdir): +@@ -132,15 +134,14 @@ def unit_test(rootdir): + + log = Log() + log.SetLogVerbosity(Log.DEBUG|Log.INFO) +- cfg = UnittestConfigDummy(rootdir) +- d = DMIinfo(cfg, log) ++ d = DMIinfo(log) + dx = d.MakeReport() + x = libxml2.newDoc("1.0") + x.setRootElement(dx) + x.saveFormatFileEnc("-", "UTF-8", 1) + return 0 + except Exception as e: +- print("** EXCEPTION: %s" % str(e)) ++ print(f"** EXCEPTION: {str(e)}") + return 1 + + if __name__ == '__main__': +-- +2.37.3 + diff --git a/SOURCES/rteval-Catch-failures-in-python-dmidecode.patch b/SOURCES/rteval-Catch-failures-in-python-dmidecode.patch new file mode 100644 index 0000000..04d2bb3 --- /dev/null +++ b/SOURCES/rteval-Catch-failures-in-python-dmidecode.patch @@ -0,0 +1,54 @@ +From eacf0f1e55fa0e7217133172808bfef2c59242fb Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Thu, 2 Feb 2023 00:47:31 -0500 +Subject: [PATCH] rteval: Catch failures in python-dmidecode + +python-dmidecode can generate incorrect xml, +namely Attribute unit redefined + +Although useful, the dmidecode is not critical to rteval reporting. + +Therefore catch this, and first see if we can at least query the bios. +If that works report the bios instead of all, and if that +doesn't work, just continue without the dmidecode report. + +Signed-off-by: John Kacur +--- + rteval/sysinfo/dmi.py | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/rteval/sysinfo/dmi.py b/rteval/sysinfo/dmi.py +index 83f347623b58..89a7faae06b1 100644 +--- a/rteval/sysinfo/dmi.py ++++ b/rteval/sysinfo/dmi.py +@@ -79,6 +79,7 @@ class DMIinfo: + + def __init__(self, logger=None): + self.__version = '0.6' ++ self._log = logger + + if not dmidecode_avail: + logger.log(Log.DEBUG, "DMI info unavailable, ignoring DMI tables") +@@ -115,7 +116,18 @@ class DMIinfo: + rep_n.newProp("not_available", "1") + else: + self.__dmixml.SetResultType(dmidecode.DMIXML_DOC) +- dmiqry = xmlout.convert_libxml2_to_lxml_doc(self.__dmixml.QuerySection('all')) ++ try: ++ dmiqry = xmlout.convert_libxml2_to_lxml_doc(self.__dmixml.QuerySection('all')) ++ except Exception as ex1: ++ self._log.log(Log.DEBUG, f'** EXCEPTION {str(ex1)}, will query BIOS only') ++ try: ++ # If we can't query 'all', at least query 'bios' ++ dmiqry = xmlout.convert_libxml2_to_lxml_doc(self.__dmixml.QuerySection('bios')) ++ except Exception as ex2: ++ rep_n.addContent("No DMI tables available") ++ rep_n.newProp("not_available", "1") ++ self._log.log(Log.DEBUG, f'** EXCEPTION {str(ex2)}, dmi info will not be reported') ++ return rep_n + resdoc = self.__xsltparser(dmiqry) + dmi_n = xmlout.convert_lxml_to_libxml2_nodes(resdoc.getroot()) + rep_n.addChild(dmi_n) +-- +2.39.0 + diff --git a/SOURCES/rteval-Don-t-attempt-to-get-DMIinfo-if-there-are-dmi.patch b/SOURCES/rteval-Don-t-attempt-to-get-DMIinfo-if-there-are-dmi.patch new file mode 100644 index 0000000..aaf95f8 --- /dev/null +++ b/SOURCES/rteval-Don-t-attempt-to-get-DMIinfo-if-there-are-dmi.patch @@ -0,0 +1,169 @@ +From bce23ecc5d8bb6cab86843f7a42164ee44ef091f Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Thu, 27 Oct 2022 11:14:27 -0400 +Subject: [PATCH 3/3] rteval: Don't attempt to get DMIinfo if there are dmi + warnings + +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 + 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 +--- + 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 + # Copyright 2009 - 2013 David Sommerseth ++# Copyright 2022 John Kacur + # + # 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 + diff --git a/SOURCES/rteval-Replace-python-ethtool-with-inline-code.patch b/SOURCES/rteval-Replace-python-ethtool-with-inline-code.patch new file mode 100644 index 0000000..59b4592 --- /dev/null +++ b/SOURCES/rteval-Replace-python-ethtool-with-inline-code.patch @@ -0,0 +1,399 @@ +From d0552193364d160252d117c5bf2e298a31550e3c Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Mon, 10 Oct 2022 09:49:47 -0400 +Subject: [PATCH] rteval: Replace python-ethtool with inline code + +This patch adds the file newnet.py to replace the use of python-ethtool +The information it generates will appear in the summary.xml +You can also test the functionality by running +python rteval/sysinfo/newnet.py + +Signed-off-by: John Kacur +- V2 Add SPDX license identifier +Signed-off-by: John Kacur +--- + rteval/sysinfo/__init__.py | 3 +- + rteval/sysinfo/network.py | 117 ------------------- + rteval/sysinfo/newnet.py | 225 +++++++++++++++++++++++++++++++++++++ + 3 files changed, 227 insertions(+), 118 deletions(-) + delete mode 100644 rteval/sysinfo/network.py + create mode 100644 rteval/sysinfo/newnet.py + +diff --git a/rteval/sysinfo/__init__.py b/rteval/sysinfo/__init__.py +index a4359382f006..bb1d00810856 100644 +--- a/rteval/sysinfo/__init__.py ++++ b/rteval/sysinfo/__init__.py +@@ -32,7 +32,7 @@ from rteval.sysinfo.services import SystemServices + from rteval.sysinfo.cputopology import CPUtopology + from rteval.sysinfo.memory import MemoryInfo + from rteval.sysinfo.osinfo import OSInfo +-from rteval.sysinfo.network import NetworkInfo ++from rteval.sysinfo.newnet import NetworkInfo + from rteval.sysinfo.cmdline import cmdlineInfo + from rteval.sysinfo import dmi + +@@ -46,6 +46,7 @@ class SystemInfo(KernelInfo, SystemServices, dmi.DMIinfo, CPUtopology, + CPUtopology.__init__(self) + OSInfo.__init__(self, logger=logger) + cmdlineInfo.__init__(self, logger=logger) ++ NetworkInfo.__init__(self, logger=logger) + + # Parse initial DMI decoding errors + dmi.ProcessWarnings() +diff --git a/rteval/sysinfo/network.py b/rteval/sysinfo/network.py +deleted file mode 100644 +index ce9989a1240b..000000000000 +--- a/rteval/sysinfo/network.py ++++ /dev/null +@@ -1,117 +0,0 @@ +-# -*- coding: utf-8 -*- +-# +-# Copyright 2009 - 2013 David Sommerseth +-# +-# 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 +-# the Free Software Foundation; either version 2 of the License, or +-# (at your option) any later version. +-# +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License along +-# with this program; if not, write to the Free Software Foundation, Inc., +-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +-# +-# For the avoidance of doubt the "preferred form" of this code is one which +-# is in an open unpatent encumbered format. Where cryptographic key signing +-# forms part of the process of creating an executable the information +-# including keys needed to generate an equivalently functional executable +-# are deemed to be part of the source code. +-# +- +-import ethtool, libxml2 +- +-class NetworkInfo(object): +- def __init__(self): +- pass +- +- def net_GetDefaultGW(self): +- # Get the interface name for the IPv4 default gw +- route = open('/proc/net/route') +- defgw4 = None +- if route: +- rl = route.readline() +- while rl != '' : +- rl = route.readline() +- splt = rl.split("\t") +- # Only catch default route +- if len(splt) > 2 and splt[2] != '00000000' and splt[1] == '00000000': +- defgw4 = splt[0] +- break +- route.close() +- return (defgw4, None) # IPv6 gw not yet implemented +- +- def MakeReport(self): +- ncfg_n = libxml2.newNode("NetworkConfig") +- (defgw4, defgw6) = self.net_GetDefaultGW() +- +- # Make an interface tag for each device found +- if hasattr(ethtool, 'get_interfaces_info'): +- # Using the newer python-ethtool API (version >= 0.4) +- for dev in ethtool.get_interfaces_info(ethtool.get_devices()): +- if dev.device == 'lo': +- continue +- +- intf_n = libxml2.newNode('interface') +- intf_n.newProp('device', dev.device) +- intf_n.newProp('hwaddr', dev.mac_address) +- ncfg_n.addChild(intf_n) +- +- # Protcol configurations +- if dev.ipv4_address: +- ipv4_n = libxml2.newNode('IPv4') +- ipv4_n.newProp('ipaddr', dev.ipv4_address) +- ipv4_n.newProp('netmask', str(dev.ipv4_netmask)) +- ipv4_n.newProp('broadcast', dev.ipv4_broadcast) +- ipv4_n.newProp('defaultgw', (defgw4 == dev.device) and '1' or '0') +- intf_n.addChild(ipv4_n) +- +- for ip6 in dev.get_ipv6_addresses(): +- ipv6_n = libxml2.newNode('IPv6') +- ipv6_n.newProp('ipaddr', ip6.address) +- ipv6_n.newProp('netmask', str(ip6.netmask)) +- ipv6_n.newProp('scope', ip6.scope) +- intf_n.addChild(ipv6_n) +- +- else: # Fall back to older python-ethtool API (version < 0.4) +- ifdevs = ethtool.get_active_devices() +- ifdevs.remove('lo') +- ifdevs.sort() +- +- for dev in ifdevs: +- intf_n = libxml2.newNode('interface') +- intf_n.newProp('device', dev.device) +- intf_n.newProp('hwaddr', dev.mac_address) +- ncfg_n.addChild(intf_n) +- +- ipv4_n = libxml2.newNode('IPv4') +- ipv4_n.newProp('ipaddr', ethtool.get_ipaddr(dev)) +- ipv4_n.newProp('netmask', str(ethtool.get_netmask(dev))) +- ipv4_n.newProp('defaultgw', (defgw4 == dev) and '1' or '0') +- intf_n.addChild(ipv4_n) +- +- return ncfg_n +- +- +-def unit_test(rootdir): +- import sys +- try: +- net = NetworkInfo() +- doc = libxml2.newDoc('1.0') +- cfg = net.MakeReport() +- doc.setRootElement(cfg) +- doc.saveFormatFileEnc('-', 'UTF-8', 1) +- +- except Exception as e: +- import traceback +- traceback.print_exc(file=sys.stdout) +- print("** EXCEPTION %s", str(e)) +- return 1 +- +-if __name__ == '__main__': +- unit_test(None) +- +diff --git a/rteval/sysinfo/newnet.py b/rteval/sysinfo/newnet.py +new file mode 100644 +index 000000000000..63417d9e59f1 +--- /dev/null ++++ b/rteval/sysinfo/newnet.py +@@ -0,0 +1,225 @@ ++''' Module to obtain network information for the rteval report ''' ++# ++# Copyright 2022 John Kacur 0: ++ (iface, dest, gateway, _, _, _, _, _, _, _, _) = line.split() ++ if iface == 'Iface': ++ line = f.readline().strip() ++ continue ++ if dest == '00000000' and gateway != '00000000': ++ addr = int(gateway, base=16) ++ defaultgw = str(ipaddress.IPv4Address(socket.ntohl(addr))) ++ return defaultgw ++ line = f.readline().strip() ++ return defaultgw ++ ++class IPv6Addresses(): ++ ''' Obtains a list of IPv6 addresses from the proc file system ''' ++ ++ def __init__(self): ++ self.data = {} ++ IPv6Addresses.load(self) ++ ++ def __contains__(self, dev): ++ return dev in self.data ++ ++ def __getitem__(self, dev): ++ return self.data.get(dev, None) ++ ++ def __iter__(self): ++ return iter(self.data) ++ ++ def load(self): ++ ''' ++ Called by init to load the self.data dictionary with device keys ++ and a list of ipv6addresses ++ ''' ++ MYP = '/proc/net/if_inet6' ++ with open(MYP, 'r') as f: ++ mystr = f.readline().strip() ++ while len(mystr) > 0: ++ ipv6addr , _, _, _, _, intf = mystr.split() ++ ipv6addr = compress_iv6(ipv6addr) ++ if intf == 'lo': ++ mystr = f.readline().strip() ++ continue ++ if intf not in self.data: ++ self.data[intf] = [ipv6addr] ++ else: ++ self.data[intf].append(ipv6addr) ++ mystr = f.readline().strip() ++ ++class IPv4Addresses(): ++ ''' Obtains a list of IPv4 addresses from the proc file system ''' ++ ++ def __init__(self): ++ self.data = {} ++ IPv4Addresses.load(self) ++ ++ def __contains__(self, dev): ++ return dev in self.data ++ ++ def __getitem__(self, dev): ++ return self.data[dev] ++ ++ def __iter__(self): ++ return iter(self.data) ++ ++ def load(self): ++ ''' ++ Called by init to load the self.data dictionary with ++ device keys, and value consisting of a list of ++ ipv4address, netmask and broadcast address ++ ''' ++ MYP = '/proc/net/route' ++ with open(MYP, 'r') as f: ++ mystr = f.readline().strip() ++ while len(mystr) > 0: ++ intf, dest, _, _, _, _, _, mask, _, _, _ = mystr.split() ++ # Skip over the head of the table an the gateway line ++ if intf == "Iface" or dest == '00000000': ++ mystr = f.readline().strip() ++ continue ++ d1 = int(dest, base=16) ++ m1 = int(mask, base=16) ++ addr = str(ipaddress.IPv4Address(socket.ntohl(d1))) ++ netmask = str(ipaddress.IPv4Address(socket.ntohl(m1))) ++ addr_with_mask = ipaddress.ip_network(addr + '/' + netmask) ++ broadcast = str(addr_with_mask.broadcast_address) ++ if intf not in self.data: ++ self.data[intf] = [(addr, netmask, broadcast)] ++ else: ++ self.data[intf].append((addr, netmask, broadcast)) ++ mystr = f.readline().strip() ++ ++ ++class MacAddresses(): ++ ''' Obtains a list of hardware addresses of network devices ''' ++ ++ def __init__(self): ++ self.mac_address = {} ++ self.path = None ++ MacAddresses.load(self) ++ ++ def load(self): ++ ''' ++ called by init to load self.mac_address as a dictionary of ++ device keys, and mac or hardware addresses as values ++ ''' ++ nics = get_active_devices() ++ for nic in nics: ++ self.path = f'/sys/class/net/{nic}' ++ hwaddr = MacAddresses.set_val(self, 'address') ++ self.mac_address[nic] = hwaddr ++ ++ def set_val(self, val): ++ ''' Return the result of reading self.path/val ''' ++ val_path = f'{self.path}/{val}' ++ if os.path.exists(val_path): ++ with open(val_path, 'r') as f: ++ return f.readline().strip() ++ return None ++ ++ def __contains__(self, dev): ++ return dev in self.mac_address ++ ++ def __getitem__(self, dev): ++ return self.mac_address[dev] ++ ++ def __iter__(self): ++ return iter(self.mac_address) ++ ++class NetworkInfo(): ++ ''' Creates an xml report of the network for rteval ''' ++ ++ def __init__(self, logger): ++ self.defgw4 = get_defaultgw() ++ self.__logger = logger ++ ++ def MakeReport(self): ++ ''' Make an xml report for rteval ''' ++ ncfg_n = libxml2.newNode("NetworkConfig") ++ defgw4 = self.defgw4 ++ ++ mads = MacAddresses() ++ for device in mads: ++ if device == 'lo': ++ continue ++ intf_n = libxml2.newNode('interface') ++ intf_n.newProp('device', device) ++ intf_n.newProp('hwaddr', mads[device]) ++ ncfg_n.addChild(intf_n) ++ ++ ipv4ads = IPv4Addresses() ++ ipv6ads = IPv6Addresses() ++ for dev in ipv4ads: ++ if dev != device: ++ continue ++ for lelem in ipv4ads[dev]: ++ ipv4_n = libxml2.newNode('IPv4') ++ (ipaddr, netmask, broadcast) = lelem ++ ipv4_n.newProp('ipaddr', ipaddr) ++ ipv4_n.newProp('netmask', netmask) ++ ipv4_n.newProp('broadcast', broadcast) ++ ipv4_n.newProp('defaultgw', (defgw4 == ipaddr) and '1' or '0') ++ intf_n.addChild(ipv4_n) ++ if ipv6ads[dev]: ++ for lelem in ipv6ads[dev]: ++ ipv6_n = libxml2.newNode('IPv6') ++ ipaddr = lelem ++ ipv6_n.newProp('ipaddr', ipaddr) ++ intf_n.addChild(ipv6_n) ++ return ncfg_n ++ ++if __name__ == "__main__": ++ ++ try: ++ log = Log() ++ log.SetLogVerbosity(Log.DEBUG|Log.INFO) ++ net = NetworkInfo(logger=log) ++ doc = libxml2.newDoc('1.0') ++ cfg = net.MakeReport() ++ doc.setRootElement(cfg) ++ doc.saveFormatFileEnc('-', 'UTF-8', 1) ++ ++ except Exception as e: ++ import traceback ++ traceback.print_exc(file=sys.stdout) ++ print(f"** EXCEPTION {str(e)}") +-- +2.37.3 + diff --git a/SPECS/rteval.spec b/SPECS/rteval.spec new file mode 100644 index 0000000..d798b89 --- /dev/null +++ b/SPECS/rteval.spec @@ -0,0 +1,761 @@ +Name: rteval +Version: 3.5 +Release: 4%{?dist} +Summary: Utility to evaluate system suitability for RT Linux + +Group: Development/Tools +License: GPLv2 +URL: https://git.kernel.org/pub/scm/utils/rteval/rteval.git +Source0: https://www.kernel.org/pub/linux/utils/rteval/rteval-%{version}.tar.xz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: python3-devel +Requires: platform-python +Requires: python3-lxml +Requires: python3-libxml2 +Requires: python3-dmidecode >= 3.10 +Requires: python3-requests +Requires: rt-tests >= 1.5-11 +Requires: rteval-loads >= 1.6-2 +Requires: sysstat +Requires: xz bzip2 tar gzip m4 make gawk +Requires: kernel-headers +Requires: sos +BuildArch: noarch +Obsoletes: rteval <= 2.14 +Requires: numactl +Requires: gcc binutils gcc-c++ flex bison bc make +Requires: elfutils elfutils-libelf-devel +Requires: openssl openssl-devel +Requires: stress-ng +Requires: perl-interpreter perl-devel perl-generators +Requires: libmpc libmpc-devel +Obsoletes: rteval-common <= 3.1 + +#Patches +Patch1: rteval-Replace-python-ethtool-with-inline-code.patch +Patch2: Fix-DMI-WARNING-when-not-running-as-root.patch +Patch3: rteval-Don-t-attempt-to-get-DMIinfo-if-there-are-dmi.patch +Patch4: rteval-Catch-failures-in-python-dmidecode.patch + +%description +The rteval script is a utility for measuring various aspects of +realtime behavior on a system under load. The script unpacks the +kernel source, and then goes into a loop, running hackbench and +compiling a kernel tree. During that loop the cyclictest program +is run to measure event response time. After the run time completes, +a statistical analysis of the event response times is done and printed +to the screen. + +%prep +%setup -q +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 + +%build +%{__python3} setup.py build + +%install +%{__python3} setup.py install --root=$RPM_BUILD_ROOT + +%files +%defattr(-,root,root,-) +%{python3_sitelib}/*.egg-info + +%doc COPYING README doc/rteval.txt +%dir %{_datadir}/%{name} +%{python3_sitelib}/rteval/rtevalclient.py* +%{python3_sitelib}/rteval/rtevalConfig.py* +%{python3_sitelib}/rteval/rtevalXMLRPC.py* +%{python3_sitelib}/rteval/version.py* +%{python3_sitelib}/rteval/Log.py* +%{python3_sitelib}/rteval/systopology.py* +%{_mandir}/man8/rteval.8.gz +%config(noreplace) %{_sysconfdir}/rteval.conf +%{_datadir}/%{name}/rteval_*.xsl +%{python3_sitelib}/rteval/__init__.py* +%{python3_sitelib}/rteval/rtevalMailer.py* +%{python3_sitelib}/rteval/rtevalReport.py* +%{python3_sitelib}/rteval/xmlout.py* +%{python3_sitelib}/rteval/modules +%{python3_sitelib}/rteval/sysinfo +/usr/bin/rteval + +%{python3_sitelib}/rteval/__pycache__/* + +%changelog +* Wed Dec 27 2023 MSVSphere Packaging Team - 3.5-4 +- Rebuilt for MSVSphere 8.9 + +* Wed Feb 08 2023 John Kacur - 3.5-4 +- Add check to catch python-dmidecode if it fails +Resolves: rhbz#2168373 +jiraProject == RHELPLAN-148048 + +* Thu Oct 27 2022 John Kacur - 3.5-3 +- Fix "DMI WARNING" when not running as root +- Don't attempt to get DMI info if dmidecode returns warnings +Resolves: rhbz#2136926 + +* Mon Oct 17 2022 John Kacur - 3.5-2 +- Remove dependency on python-ethtool by using inline code +- Add Requires of python-libxml2 +Resolves: rhbz#2131377 + +* Fri Sep 23 2022 John Kacur - 3.5-1 +- Rebase to rteval-3.5 upstream +Resolves: rhbz#2119172 + +* Thu Sep 22 2022 Leah Leshchinsky - 3.4-5 +- Add measurement and load location to run report +Resolves: rhbz#2082260 + +* Tue Sep 13 2022 John Kacur - 3.4-4 +- Make use of systopology instead of misc everywhere +- Allow user to enter compressed form of cpulist +Resolves: rhbz#2121535 + +* Mon Sep 12 2022 John Kacur - 3.4-3 +- Add option for downloading the kernel to compile as a load +- Add a manpage entry for the kernel download option +Resolves: rhbz#2107710 + +* Tue Jun 28 2022 John Kacur - 3.4-2 +- Add back __pycache__ to the rhel-8.7 spec file +Resolves: rhbz#2069354 + +* Tue Jun 28 2022 John Kacur - 3.4-1 +- Rebase to rteval-3.4 upstream +Resolves: rhbz#2069354 + +* Wed Jun 22 2022 John Kacur - 3.3-9 +- Add upstream kcompile patches +Resolves: rhbz#2093478 + +* Tue Jun 07 2022 John Kacur - 3.3-8 +- Updates the Requires for rteval-loads with the correct kernel version +Resolves: rhbz#2093478 + +* Tue Jun 07 2022 John Kacur - 3.3-7 +- Change the default kernel to compile to linux-5.18.1 +Resolves: rhbz#2093478 + +* Tue Feb 15 2022 John Kacur - 3.3-6 +- Use inherited cpumask if user doesn't specify a cpumask +Resolves: rhbz#2012284 + +* Mon Feb 07 2022 John Kacur - 3.3-5 +- Don't restrict threads to cpumask in environment if user specifies cpumask +Resolves: rhbz#2012284 + +* Thu Jan 27 2022 John Kacur - 3.3-4 +- Increase the default number of buckets from 2000 to 3500 +Resolves: rhbz#2046321 + +* Tue Jan 18 2022 John Kacur - 3.3-3 +- Fix Popen use of text=True not available in python3.6 +Resolves: rhbz#2041584 + +* Fri Jan 14 2022 John Kacur - 3.3-2 +- Fix test missing threshold assignment +Resolves: rhbz#2012285 + +* Thu Jan 13 2022 John Kacur - 3.3-1 +- Rebase to upstream rteval-3.3 +Resolves: rhbz#2012291 + +* Wed Jan 12 2022 John Kacur - 3.2-4 +- Do not pass obsolete notrace option to cyclictest +- Parse maximum latency even if outside configured buckets +- Sort the list of cpus +- Skip statistics generation if max latency outside of configured buckets +- Add --cyclictest-threshold=USEC feature +- Add libmpc and libmpc-devel to the Requires +Resolves: rhbz#2012285 + +* Thu Nov 04 2021 John Kacur - 3.2-3 +- allow hackbench to run with warning on low mem +- clean-ups to hackbench.py +- make donotrun work correctly in load modules +- Add the idea of an exclusive load module and make stress-ng one +Resolves: rhbz#1872776 + +* Thu Jul 15 2021 John Kacur - 3.2-2 +- Restrict measurement threads to cpus in cpumask +Resolves: rhbz#1942261 + +* Thu Jul 15 2021 John Kacur - 3.2-1 +- Rebase to latest upstream rteval-3.2 +Resolves: rhbz#1982718 + +* Wed Jan 13 2021 John Kacur - 3.1-4 +- Remove python-schedutils requirement +- Fix spec file to make Obsoletes rteval-common cover all necessary releases +Resolves: rhbz#1869340 + +* Wed Jan 13 2021 John Kacur - 3.1-3 +- Remove a stray line in the changelog +Resolves: rhbz#1890555 + +* Wed Jan 13 2021 John Kacur - 3.1-2 +- Fix incorrect import in rteval/sysinfo/__init__.py +Resolves: rhbz#1890555 + +* Mon Jan 11 2021 John Kacur - 3.1-1 +- Upgrade to rteval-3.1 +- Don't create a separate rteval-common package anymore +Resolves: rhbz#1890555 + +* Thu Aug 27 2020 John Kacur - 3.0-13 +- Parse cpuinfo correctly when the model name has a colon in it. +Resolves: rhbz#1873120 + +* Thu Jul 23 2020 John Kacur - 3.0-12 +- Use linux-5.7 in kcompile +Resolves: rhbz#1859762 + +* Thu Jun 25 2020 John Kacur - 3.0-11 +- Make sure "make" is available for the kcompile module +Resolves: rhbz#1850924 + +* Wed Jun 24 2020 John Kacur - 3.0-10 +- Ensure that a recent rteval-loads with stress-ng is required +Resolves: rhbz#1847233 + +* Wed Jun 24 2020 John Kacur - 3.0-9 +- Ensure the stressng command line is displayed in the final report +Resolves: rhbz#1850151 + +* Mon Jun 15 2020 John Kacur - 3.0-8 +- Add the stress-ng load module +Resolves: rhbz#1816360 + +* Mon May 04 2020 John Kacur - 3.0-7 +- Make sure openssl is available so that rteval can compile the kernel +Resolves: rhbz#1831272 + +* Tue Dec 10 2019 John Kacur - 3.0-6 +- Iterate over nodes and not sysTop +- Explictly add a few more software requires for compiling the kernel +Resolves: rhbz#1755603 + +* Tue Dec 03 2019 John Kacur - 3.0-5 +- Explicitly add some software requires for compiling the kernel +Resolves: rhbz#1766879 + +* Mon Dec 02 2019 John Kacur - 3.0-4 +- In hackbench.py node in args to Popen must be a string +Resolves: rhbz#1777048 + +* Tue Nov 19 2019 John Kacur - 3.0-3 +- Don't assume cpu0 cannot be offlined, test for it +- Drop patches that are no longer in the spec file +Resolves: rhbz#1773792 + +* Mon Nov 18 2019 John Kacur - 3.0-2 +- Check whether a cpu is online before adding to a list +- Change hackbench to use the systopology interface for online cpus +Resolves: rhbz#1715081 + +* Fri Nov 15 2019 John Kacur - 3.0-1 +- Sync rt-tests and rteval-loads versions in the specfile +- Upgrade to upstream rteval-3.0 +Resolves: rhbz#1748955 + +* Fri Nov 08 2019 John Kacur - 2.14-27 +- Update kcompile sources to linux-5.1 +Resolves: rhbz#1770215 + +* Fri Nov 08 2019 John Kacur - 2.14-26 +- Fix number of hackbench jobs wrt number of CPUs +- Don't run on nodes with no CPUs available +Resolves: rhbz#1770211 + +* Tue Apr 02 2019 Clark Williams - 2.14.25 +- fix incorrect test logic in gating tests +Resolves: rhbz#1682426 + +* Tue Apr 02 2019 Clark Williams - 2.14.24 +- add rteval-loads dependency to gating +- added second test (short_run) to gating +Resolves: rhbz#1682426 + +* Mon Apr 01 2019 Clark Williams - 2.14.23 +- add missing gating.yaml +Resolves: rhbz#1682426 + +* Mon Apr 01 2019 Clark Williams - 2.14.22 +- checkin OSCI gating framework +Resolves: rhbz#1682426 + +* Mon Dec 17 2018 John Kacur - 2.14-21 +- Fix typo in debug output +Resolves: rhbz#1659974 + +* Tue Oct 16 2018 John Kacur - 2.14-20 +- Disable options for the remote xmlrpc server, not currently supported +Resolves: rhbz#1628322 + +* Sat Oct 13 2018 John Kacur - 2.14-19 +- Fix Requires for python3 +Resolves: rhbz#1638135 + +* Fri Oct 12 2018 John Kacur - 2.14-18 +- Fix time format in report +Resolves: rhbz#1630733 + +* Fri Sep 28 2018 John Kacur - 2.14-17 +- Change python3 to platform-python +Resolves: rhbz#1633619 + +* Fri Aug 10 2018 John Kacur - 2.14-16 +- remove unnecssary encode that is causing problems +Resolves: rhbz#1614384 + +* Tue Aug 07 2018 John Kacur - 2.14-15 +- tar is required in kcompile.py. Make it a Require in the specfile +Resolves: rhbz#1612992 + +* Fri Aug 03 2018 John Kacur - 2.14-14 +- fix python3 division of integers +Resolves: rhbz#1611813 + +* Fri Aug 03 2018 John Kacur - 2.14-13 +-fix rtevalclient import +Resolves: rhbz#1608464 + +* Sat Jun 23 2018 John Kacur - 2.14-12 +- More python3 changes +- Changes for the new version of rt-tests that automates --numa +Resolves: rhbz#1594287 + +* Tue Jun 12 2018 John Kacur jkacur@redhat.com> - 2.14-11 +- More specfile changes for python3 build +Resolves: rhbz#1518699 + +* Wed May 30 2018 John Kacur - 2.14-10 +- Chnages for a python3 build +Resolves: rhbz#1518699 + +* Fri Oct 27 2017 John Kacur - 2.14-9 +- Remove redundant files for clarity. +Resolves: rhbz1504162 + +* Fri Oct 27 2017 John Kacur - 2.14-8 +- Don't fail if we don't know the init system +Resolves: rhbz1504168 + +* Fri Oct 20 2017 John Kacur - 2.14-7 +- Remove underscore from sysread function in systopology.py +Resolves: rhbz1504164 + +* Fri Oct 20 2017 John Kacur - 2.14-6 +- Improve error handling if cyclictest fails to run +Resolves: rhbz1504159 + +* Fri Oct 20 2017 John Kacur - 2.14-5 +- Remove trace-cmd from Requires, since it is not needed to run rteval +Resolves: rhbz1504173 + +* Mon Oct 16 2017 John Kacur - 2.14-4 +- Don't sleep if hackbench fails to launch due to out-of-memory +- Instead, exit gracefully +Resolves: rhbz1380144 + +* Wed Oct 11 2017 John Kacur - 2.14-3 +- Add sos as a requires since this package is needed to run sosreport +Resolves: rhbz1500722 + +* Wed Oct 11 2017 John Kacur - 2.14-2 +- Add the contents of the kernel boot command line to the summary report +Resolves: rhbz1452788 + +* Thu Mar 16 2017 Clark Williams - 2.14-1 +- removed leftover import of systopology from sysinfo + +* Wed Mar 15 2017 Clark Williams - 2.13-2 +- Updated specfile to correct version and bz [1382155] + +* Tue Sep 20 2016 Clark Williams - 2.12-1 +- handle empty environment variables SUDO_USER and USER [1312057] + +* Tue Aug 30 2016 Clark Williams - 2.11-1 +- make sure we return non-zero for early exit from tests + +* Wed Aug 3 2016 Clark Williams - 2.10-1 +- bumped version for RHEL 7.3 release + +* Mon May 9 2016 Clark Williams - 2.9.1 +- default cpulist for modules if only one specified [1333831] + +* Tue Apr 26 2016 Clark Williams - 2.8.1 +- add the --version option to print the rteval version +- made the --cyclictest-breaktrace option work properly [1209986] + +* Fri Apr 1 2016 Clark Williams - 2.7.1 +- treat SIGINT and SIGTERM as valid end-of-run events [1278757] +- added cpulist options to man page + +* Thu Feb 11 2016 Clark Williams - 2.6.1 +- update to make --loads-cpulist and --measurement-cpulist work [1306437] + +* Thu Dec 10 2015 Clark Williams - 2.5-1 +- stop using old numactl --cpubind argument + +* Wed Dec 9 2015 Clark Williams - 2.4.2 +- added Require of package numactl + +* Tue Nov 17 2015 Clark Williams - 2.4.1 +- rework hackbench load to not generate cross-node traffic [1282826] + +* Wed Aug 12 2015 Clark Williams - 2.3-1 +- comment out HWLatDetect module from default config [1245699] + +* Wed Jun 10 2015 Clark Williams - 2.2-1 +- add --loads-cpulist and --measurement-cpulist to allow cpu placement [1230401] + +* Thu Apr 23 2015 Luis Claudio R. Goncalves - 2.1-8 +- load default configs when no config file is specified (Jiri kastner) [1212452] + +* Wed Jan 14 2015 Clark Williams - 2.1-7 +- added requires of bzip2 to specfile [1151567] + +* Thu Jan 8 2015 Clark Williams - 2.1-6 +- cleaned up product documentation [1173315] + +* Mon Nov 10 2014 Luis Claudio R. Goncalves - 2.1-5 +- rebuild for RHEL-7.1 (1151567) + +* Thu Mar 27 2014 Clark Williams - 2.1-4 +- cherry-picked old commit to deal with installdir problem + +* Wed Mar 26 2014 Clark Williams - 2.1-3 +- added sysstat requires to specfile + +* Tue Mar 12 2013 David Sommerseth - 2.1-2 +- Migrated from libxslt-python to python-lxml + +* Fri Jan 18 2013 David Sommerseth - 2.1-1 +- Made some log lines clearer +- cyclictest: Added --cyclictest-breaktrace feature +- cyclictest: Removed --cyclictest-distance option +- cyclictest: Use a tempfile buffer for cyclictest's stdout data +- cyclictest: Report if breaktrace was triggered +- cyclictest: Make the unit test work again +- cyclictest: Only log and show statistic data when samples are collected +- Copyright updates + +* Thu Jan 17 2013 David Sommerseth - 2.0.1-1 +- Fix up type casting in the core module code +- hwlatdetect: Add some more useful debug info +- Reworked the run logic for modules - allow them to flag they won't run +- Fixed a few log messages in load modules +- Add a 30 seconds sleep before unleashing the measurement threads + +* Thu Jan 10 2013 David Sommerseth - 2.0-3 +- Separate out RTEVAL_VERSION into rteval.version, to avoid + massive BuildRequirements + +* Fri Dec 21 2012 David Sommerseth - 2.0-2 +- Split out common files into rteval-common + +* Fri Dec 21 2012 David Sommerseth - 2.0-1 +- Updated to rteval v2.0 and reworked spec file to use setup.py directly + +* Tue Oct 23 2012 Clark Williams - 1.36-1 +- deal with system not having dmidecode python module +- make sure to cast priority parameter to int +- from Raphaƫl Beamonte : + - Rewrite of the get_kthreads method to make it cross-distribution + - Adds getcmdpath method to use which to locate the used commands + - Rewrite of the get_services method to make it cross-distribution + +* Mon Apr 2 2012 Clark Williams - 1.35-1 +- fix thinko where SIGINT and SIGTERM handlers were commented out + +* Thu Jan 12 2012 Clark Williams - 1.34-1 +- fix missing config merge in rteval.py to pass parameters + down to cyclictest +- modify hackbench to use helper function to start process + +* Sat May 14 2011 Clark Williams - 1.33-1 +- modify hackbench cutoff to be 0.75GB/core + +* Mon Aug 23 2010 Clark Williams - 1.32-1 +- update docs +- refactor some RTEval methods to utility functions +- modify hackbench.py not to run under low memory conditions +- clean up XML generation to deal with new hackbench code +- clean up XSL code to deal with new XML 'run' attribute +- from David Sommerseth : + - improve CPU socket counting logic + - delay log directory creation until actually needed +- from Gowrishankar : + - check if the core id really exists (multithreading fix) + +* Mon Jul 26 2010 Clark Williams - 1.31-1 +- from David Sommerseth : + - Updated hackbench implementation to avoid overusing resources + - Don't show NUMA node information if it's missing in the summary.xml + - Show CPU cores properly + +* Wed Jul 21 2010 Clark Williams - 1.30-1 +- added code to hackbench to try to detect and ease memory pressure + +* Fri Jul 16 2010 Clark Williams - 1.29-1 +- fixed incorrect type value in kcompile.py + +* Fri Jul 16 2010 Clark Williams - 1.28-1 +- added logic to loads to adjust number of jobs based on ratio + of memory per core + +* Wed Jul 14 2010 Clark Williams - 1.27-1 +- modified hackbench to go back to using threads rather than + processes for units of work +- added memory size, number of numa nodes and run duration to the + parameter dictionary passed to all loads and cyclictest + +* Tue Jul 13 2010 Clark Williams - 1.26-1 +- modified hackbench parameters to reduce memory consumption + +* Mon Jul 12 2010 Clark Williams - 1.25-1 +- fixed cyclictest bug that caused everything to be uniprocessor +- updated source copyrights to 2010 + +* Fri Jul 9 2010 Clark Williams - 1.24-1 +- modified hackbench arguments and added new parameters for + hackbench in rteval.conf + +* Thu Jul 8 2010 Clark Williams - 1.23-1 +- version bump to deal with out-of-sync cvs issue + +* Thu Jul 8 2010 Clark Williams - 1.22-1 +- merged David Sommerseth changes to use + hackbench from rt-tests packages rather than carry local copy +- converted all loads and cyclictest to pass __init__ parameters + in a dictionary rather than as discrete parameters +- added logging for load output + + * Tue Apr 13 2010 Clark Williams - 1.21-1 +- from Luis Claudio Goncalves : + - remove unecessary wait() call in cyclictest.py + - close /dev/null after using it + - call subprocess.wait() when needed + - remove delayloop code in hackbench.py +- from David Sommerseth : + - add SIGINT handler + - handle non-root user case + - process DMI warnings before command line arguments + - added --annotate feature to rteval + - updates to xmlrpc code + + * Tue Apr 6 2010 Clark Williams - 1.20-1 +- code fixes from Luis Claudio Goncalves +- from David Sommerseth : + - xmlrpc server updates + - cputopology.py for recording topology in xml + - added NUMA node recording for run data + - rpmlint fixes +- added start of rteval whitepaper in docs dir + +* Tue Mar 16 2010 Clark Williams - 1.19-1 +- add ability for --summarize to read tarfiles +- from David Sommerseth + - gather info about loaded kernel modules for XML file + - added child tracking to hackbench to prevent zombies + +* Tue Feb 16 2010 Clark Williams - 1.18-1 +- fix usage of python 2.6 features on RHEL5 (python 2.4) + +* Tue Feb 16 2010 Clark Williams - 1.17-1 +- added logic to filter non-printables from service status output + so that we have legal XML output +- added logic to hackbench.py to cleanup properly at the end + of the test + +* Thu Feb 11 2010 Clark Williams - 1.16-1 +- fix errors in show_remaining_time() introduced because + time values are floats rather than ints + +* Thu Feb 11 2010 Clark Williams - 1.15-1 +- added logic to use --numa and --smp options of new cyclictest +- added countdown report for time remaining in a run + +* Tue Feb 9 2010 Clark Williams - 1.14-1 +- David Sommerseth : + merged XMLReport() changes for hwcert suite + +* Tue Dec 22 2009 Clark Williams - 1.13-1 +- added cyclictest default initializers +- added sanity checks to statistics reduction code +- updated release checklist to include origin push +- updated Makefile clean and help targets +- davids updates (mainly for v7 integration): + - Add explicit sys.path directory to the python sitelib+ + '/rteval' + - Send program arguments via RtEval() constructor + - Added more DMI data into the summary.xml report + - Fixed issue with not including all devices in the + OnBoardDeviceInfo tag + +* Thu Dec 3 2009 David Sommerseth - 1.12-2 +- fixed Makefile and specfile to include and install the + rteval/rteval_histogram_raw.py source file for gaining + raw access to histogram data +- Removed xmlrpc package during merge against master_ipv4 branch + +* Wed Nov 25 2009 Clark Williams - 1.12-1 +- fix incorrect reporting of measurement thread priorities + +* Mon Nov 16 2009 Clark Williams - 1.11-5 +- ensure that no double-slashes ("//") appear in the symlink + path for /usr/bin/rteval (problem with rpmdiff) + +* Tue Nov 10 2009 Clark Williams - 1.11-4 +- changed symlink back to install and tracked by %%files + +* Mon Nov 9 2009 Clark Williams - 1.11-3 +- changed symlink generation from %%post to %%posttrans + +* Mon Nov 9 2009 Clark Williams - 1.11-2 +- fixed incorrect dependency for libxslt + +* Fri Nov 6 2009 Clark Williams - 1.11-1 +- added base OS info to XML file and XSL report +- created new package rteval-loads for the load source code + +* Wed Nov 4 2009 Clark Williams - 1.10-1 +- added config file section for cyclictest and two settable + parameters, buckets and interval + +* Thu Oct 29 2009 Clark Williams - 1.9-1 +- merged davids updates: + -H option (raw histogram data) + cleaned up xsl files + fixed cpu sorting + +* Mon Oct 26 2009 David Sommerseth - 1.8-3 +- Fixed rpmlint complaints + +* Mon Oct 26 2009 David Sommerseth - 1.8-2 +- Added xmlrpc package, containing the XML-RPC mod_python modules + +* Tue Oct 20 2009 Clark Williams - 1.8-1 +- split kcompile and hackbench into sub-packages +- reworked Makefile (and specfile) install/uninstall logic +- fixed sysreport incorrect plugin option +- catch failure when running on root-squashed NFS + +* Tue Oct 13 2009 Clark Williams - 1.7-1 +- added kthread status to xml file +- merged davids changes for option processing and additions + to xml summary + +* Tue Oct 13 2009 Clark Williams - 1.6-1 +- changed stat calculation to loop less +- added methods to grab service and kthread status + +* Mon Oct 12 2009 Clark Williams - 1.5-1 +- changed cyclictest to use less memory when doing statisics + calculations +- updated debug output to use module name prefixes +- changed option processing to only process config file once + +* Fri Oct 9 2009 Clark Williams - 1.4-1 +- changed cyclictest to use histogram rather than sample array +- calcuated statistics directly from histogram +- changed sample interval to 100us +- added -a (affinity) argument to force cpu affinity for + measurement threads + +* Thu Sep 24 2009 David Sommerseth - 1.3-3 +- Cleaned up the spec file and made rpmlint happy + +* Wed Sep 23 2009 David Sommerseth - 1.3-2 +- Removed version number from /usr/share/rteval path + +* Tue Sep 22 2009 Clark Williams - 1.3-1 +- changes from davids: + * changed report code to sort by processor id + * added report submission retry logic + * added emailer class + +* Fri Sep 18 2009 Clark Williams - 1.2-1 +- added config file handling for modifying load behavior and + setting defaults +- added units in report per IBM request + +* Wed Aug 26 2009 Clark Williams - 1.1-2 +- missed a version change in rteval/rteval.py + +* Wed Aug 26 2009 Clark Williams - 1.1-1 +- modified cyclictest.py to start cyclictest threads with a + 'distance' of zero, meaning they all have the same measurement + interval + +* Tue Aug 25 2009 Clark Williams - 1.0-1 +- merged davids XMLRPC fixes +- fixed --workdir option +- verion bump to 1.0 + +* Thu Aug 13 2009 Clark Williams - 0.9-2 +- fixed problem with incorrect version in rteval.py + +* Tue Aug 4 2009 Clark Williams - 0.9-1 +- merged dsommers XMLRPC and database changes +- Specify minimum python-dmidecode version, which got native XML support +- Added rteval_dmi.xsl +- Fixed permission issues in /usr/share/rteval-x.xx + +* Wed Jul 22 2009 Clark Williams - 0.8-1 +- added code to capture clocksource info +- added code to copy dmesg info to report directory +- added code to display clocksource info in report +- added --summarize option to display summary of existing report +- added helpfile target to Makefile + +* Thu Mar 26 2009 Clark Williams - 0.7-1 +- added require for python-schedutils to specfile +- added default for cyclictest output file +- added help parameter to option parser data +- renamed xml output file to summary.xml +- added routine to create tarfile of result files + +* Wed Mar 18 2009 Clark Williams - 0.6-6 +- added code to handle binary data coming from DMI tables + +* Wed Mar 18 2009 Clark Williams - 0.6-5 +- fixed logic for locating XSL template (williams) +- fixed another stupid typo in specfile (williams) + +* Wed Mar 18 2009 Clark Williams - 0.6-4 +- fixed specfile to install rteval_text.xsl in /usr/share directory + +* Wed Mar 18 2009 Clark Williams - 0.6-3 +- added Requires for libxslt-python (williams) +- fixed race condition in xmlout constructor/destructor (williams) + +* Wed Mar 18 2009 Clark Williams - 0.6-2 +- added Requires for libxslt (williams) +- fixed stupid typo in rteval/rteval.py (williams) + +* Wed Mar 18 2009 Clark Williams - 0.6-1 +- added xml output logic (williams, dsommers) +- added xlst template for report generator (dsommers) +- added dmi/smbios output to report (williams) +- added __del__ method to hackbench to cleanup after run (williams) +- modified to always keep run data (williams) + +* Fri Feb 20 2009 Clark Williams - 0.5-1 +- fixed tab/space mix problem +- added report path line to report + +* Fri Feb 20 2009 Clark Williams - 0.4-1 +- reworked report output +- handle keyboard interrupt better +- removed duration mismatch between rteval and cyclictest + +* Mon Feb 2 2009 Clark Williams - 0.3-1 +- initial checkin