diff --git a/SOURCES/Added-code-to-check-if-the-proc-net-if_inet6-file-ex.patch b/SOURCES/Added-code-to-check-if-the-proc-net-if_inet6-file-ex.patch new file mode 100644 index 0000000..ca1c33e --- /dev/null +++ b/SOURCES/Added-code-to-check-if-the-proc-net-if_inet6-file-ex.patch @@ -0,0 +1,57 @@ +From 0ba98b12775b5394aab2205df29d93439d625cc3 Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:35 -0400 +Subject: [PATCH] Added code to check if the proc/net/if_inet6 file exists + while loading IPv6 addresses in the IPv6Addresses class + +Added code to check if the proc/net/if_inet6 file exists while loading IPv6 addresses in the IPv6Addresses class. If it doesn't, then the system has IPv6 disabled, and that chunk of code is passed. + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/sysinfo/newnet.py | 28 ++++++++++++++++------------ + 1 file changed, 16 insertions(+), 12 deletions(-) + +diff --git a/rteval/sysinfo/newnet.py b/rteval/sysinfo/newnet.py +index 63417d9e59f1..2911400ceb6c 100644 +--- a/rteval/sysinfo/newnet.py ++++ b/rteval/sysinfo/newnet.py +@@ -72,19 +72,23 @@ class IPv6Addresses(): + 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) ++ try: ++ 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() ++ # if IPv6 is disabled, the if_net6 files does not exist, so we can pass ++ except FileNotFoundError: ++ pass + + class IPv4Addresses(): + ''' Obtains a list of IPv4 addresses from the proc file system ''' +-- +2.31.1 + diff --git a/SOURCES/rteval-Log.py-Convert-to-f-strings.patch b/SOURCES/rteval-Log.py-Convert-to-f-strings.patch new file mode 100644 index 0000000..3b12c82 --- /dev/null +++ b/SOURCES/rteval-Log.py-Convert-to-f-strings.patch @@ -0,0 +1,42 @@ +From 78bd089e89e15b09db8e1d2bdcc0d9620d4da03c Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Tue, 6 Dec 2022 14:44:44 -0500 +Subject: rteval: Log.py: Convert to f-strings + +Convert Log.py to f-strings + +Signed-off-by: John Kacur +--- + rteval/Log.py | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/rteval/Log.py b/rteval/Log.py +index 63ca3b8681f8..8d08ab3e210a 100644 +--- a/rteval/Log.py ++++ b/rteval/Log.py +@@ -60,10 +60,7 @@ class Log: + + def log(self, logtype, msg): + if (logtype & self.__logverb) or logtype == self.ALWAYS: +- self.__logfile.write("%s%s\n" % +- (self.__logtype_str(logtype), +- msg) +- ) ++ self.__logfile.write(f"{self.__logtype_str(logtype)}{msg}\n") + + + +@@ -80,8 +77,8 @@ def unit_test(rootdir): + def run_log_test(l): + for lt in range(min(logtypes), max(logtypes)*2): + test = ", ".join([logtypes_s[logtypes.index(i)] for i in [p for p in takewhile(lambda x: x <= lt, (2**i for i in count())) if p & lt]]) +- print("Testing verbosity flags set to: (%i) %s" % (lt, test)) +- msg = "Log entry when verbosity is set to %i [%s]" % (lt, test) ++ print(f"Testing verbosity flags set to: ({lt}) {test}") ++ msg = f"Log entry when verbosity is set to {lt} [{test}]" + l.SetLogVerbosity(lt) + test_log(l, msg) + print("-"*20) +-- +2.40.1 + diff --git a/SOURCES/rteval-Use-f-strings-in-cputopology.patch b/SOURCES/rteval-Use-f-strings-in-cputopology.patch new file mode 100644 index 0000000..64c7999 --- /dev/null +++ b/SOURCES/rteval-Use-f-strings-in-cputopology.patch @@ -0,0 +1,31 @@ +From c8f7457cfb23b595bdd3f500dc1c9790c7302dd3 Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:29 -0400 +Subject: rteval: Use f-strings in cputopology + +Use f-strings in cputopology + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/sysinfo/cputopology.py | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/rteval/sysinfo/cputopology.py b/rteval/sysinfo/cputopology.py +index ced7e1f295b7..2bb632312320 100644 +--- a/rteval/sysinfo/cputopology.py ++++ b/rteval/sysinfo/cputopology.py +@@ -124,9 +124,7 @@ def unit_test(rootdir): + x.saveFormatFileEnc('-', 'UTF-8', 1) + + print(" ---- getCPUcores() / getCPUscokets() ---- ") +- print("CPU cores: %i (online: %i) - CPU sockets: %i" % (cputop.cpu_getCores(False), +- cputop.cpu_getCores(True), +- cputop.cpu_getSockets())) ++ print(f"CPU cores: {cputop.cpu_getCores(False)} (online: {cputop.cpu_getCores(True)}) - CPU sockets: {cputop.cpu_getSockets()}") + return 0 + except Exception as e: + # import traceback +-- +2.40.1 + diff --git a/SOURCES/rteval-Use-f-strings-in-kernel.py.patch b/SOURCES/rteval-Use-f-strings-in-kernel.py.patch new file mode 100644 index 0000000..928c0c3 --- /dev/null +++ b/SOURCES/rteval-Use-f-strings-in-kernel.py.patch @@ -0,0 +1,31 @@ +From a4acd156917024303f326dd5e66a7c9e2d12fda3 Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:30 -0400 +Subject: rteval: Use f-strings in kernel.py + +Use f-strings in kernel.py + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/sysinfo/kernel.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/rteval/sysinfo/kernel.py b/rteval/sysinfo/kernel.py +index f2e9d72ac2ef..ba5cadda40c5 100644 +--- a/rteval/sysinfo/kernel.py ++++ b/rteval/sysinfo/kernel.py +@@ -47,8 +47,8 @@ class KernelInfo: + policies = {'DLN': 'deadline', 'FF':'fifo', 'RR':'rrobin', 'TS':'other', '?':'unknown'} + ret_kthreads = {} + self.__log(Log.DEBUG, "getting kthread status") +- cmd = '%s -eocommand,pid,policy,rtprio,comm' % getcmdpath('ps') +- self.__log(Log.DEBUG, "cmd: %s" % cmd) ++ cmd = f"{getcmdpath('ps')} -eocommand,pid,policy,rtprio,comm" ++ self.__log(Log.DEBUG, f"cmd: {cmd}") + c = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) + for p in c.stdout: + v = p.strip().split() +-- +2.40.1 + diff --git a/SOURCES/rteval-Use-f-strings-in-memory.py.patch b/SOURCES/rteval-Use-f-strings-in-memory.py.patch new file mode 100644 index 0000000..98aca44 --- /dev/null +++ b/SOURCES/rteval-Use-f-strings-in-memory.py.patch @@ -0,0 +1,49 @@ +From 6e063353072b73e43a732bb5dfa265767ac0dbd7 Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:31 -0400 +Subject: rteval: Use f-strings in memory.py + +Use f-strings in memory.py + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/sysinfo/memory.py | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/rteval/sysinfo/memory.py b/rteval/sysinfo/memory.py +index 7c5fd6f315cf..cc2fa2cfa4be 100644 +--- a/rteval/sysinfo/memory.py ++++ b/rteval/sysinfo/memory.py +@@ -49,7 +49,7 @@ class MemoryInfo: + if l.startswith('MemTotal:'): + parts = l.split() + if parts[2].lower() != 'kb': +- raise RuntimeError("Units changed from kB! (%s)" % parts[2]) ++ raise RuntimeError(f"Units changed from kB! ({parts[2]})") + rawsize = int(parts[1]) + f.close() + break +@@ -76,7 +76,7 @@ class MemoryInfo: + + memsize = self.mem_get_size() + mem_n = libxml2.newNode("memory_size") +- mem_n.addContent("%.3f" % memsize[0]) ++ mem_n.addContent(f"{memsize[0]:.3f}") + mem_n.newProp("unit", memsize[1]) + rep_n.addChild(mem_n) + +@@ -88,8 +88,8 @@ def unit_test(rootdir): + import sys + try: + mi = MemoryInfo() +- print("Numa nodes: %i" % mi.mem_get_numa_nodes()) +- print("Memory: %i %s" % mi.mem_get_size()) ++ print(f"Numa nodes: {mi.mem_get_numa_nodes()}") ++ print(f"Memory: {int(mi.mem_get_size()[0])} {mi.mem_get_size()[1]}") + except Exception as e: + import traceback + traceback.print_exc(file=sys.stdout) +-- +2.40.1 + diff --git a/SOURCES/rteval-Use-f-strings-in-osinfo.patch b/SOURCES/rteval-Use-f-strings-in-osinfo.patch new file mode 100644 index 0000000..3897897 --- /dev/null +++ b/SOURCES/rteval-Use-f-strings-in-osinfo.patch @@ -0,0 +1,61 @@ +From f821e5f2daf595838395d80ba89ee5699076daf1 Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:32 -0400 +Subject: rteval: Use f-strings in osinfo + +Use f-strings in osinfo.py + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/sysinfo/osinfo.py | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/rteval/sysinfo/osinfo.py b/rteval/sysinfo/osinfo.py +index ead5e3939cfa..83dc78b96fdd 100644 +--- a/rteval/sysinfo/osinfo.py ++++ b/rteval/sysinfo/osinfo.py +@@ -55,9 +55,9 @@ class OSInfo: + shutil.copyfile(dpath, os.path.join(repdir, "dmesg")) + return + if os.path.exists('/usr/bin/dmesg'): +- subprocess.call('/usr/bin/dmesg > %s' % os.path.join(repdir, "dmesg"), shell=True) ++ subprocess.call(f'/usr/bin/dmesg > {os.path.join(repdir, "dmesg")}', shell=True) + return +- print("dmesg file not found at %s and no dmesg exe found!" % dpath) ++ print(f"dmesg file not found at {dpath} and no dmesg exe found!") + + + +@@ -69,16 +69,16 @@ class OSInfo: + else: + raise RuntimeError("Can't find sosreport/sysreport") + +- self.__logger.log(Log.DEBUG, "report tool: %s" % exe) ++ self.__logger.log(Log.DEBUG, f"report tool: {exe}") + options = ['-k', 'rpm.rpmva=off', + '--name=rteval', + '--batch'] + + self.__logger.log(Log.INFO, "Generating SOS report") +- self.__logger.log(Log.INFO, "using command %s" % " ".join([exe]+options)) ++ self.__logger.log(Log.INFO, f"using command {' '.join([exe]+options)}") + subprocess.call([exe] + options) + for s in glob('/tmp/s?sreport-rteval-*'): +- self.__logger.log(Log.DEBUG, "moving %s to %s" % (s, repdir)) ++ self.__logger.log(Log.DEBUG, f"moving {s} to {repdir}") + shutil.move(s, repdir) + + +@@ -118,7 +118,7 @@ def unit_test(rootdir): + log = Log() + log.SetLogVerbosity(Log.DEBUG|Log.INFO) + osi = OSInfo(logger=log) +- print("Base OS: %s" % osi.get_base_os()) ++ print(f"Base OS: {osi.get_base_os()}") + + print("Testing OSInfo::copy_dmesg('/tmp'): ", end=' ') + osi.copy_dmesg('/tmp') +-- +2.40.1 + diff --git a/SOURCES/rteval-Use-f-strings-in-rtevalConfig.patch b/SOURCES/rteval-Use-f-strings-in-rtevalConfig.patch new file mode 100644 index 0000000..8c02fb1 --- /dev/null +++ b/SOURCES/rteval-Use-f-strings-in-rtevalConfig.patch @@ -0,0 +1,29 @@ +From 2de834b44c2a731bc25449d84456396c0d519198 Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:28 -0400 +Subject: rteval: Use f-strings in rtevalConfig + +Use f-strings in rtevalConfig.py + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/rtevalConfig.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/rteval/rtevalConfig.py b/rteval/rtevalConfig.py +index de88924642ca..41f1a567720f 100644 +--- a/rteval/rtevalConfig.py ++++ b/rteval/rtevalConfig.py +@@ -115,7 +115,7 @@ class rtevalCfgSection: + "Simple method for dumping config when object is used as a string" + if not self.__cfgdata: + return "# empty" +- return "\n".join(["%s: %s" % (k, v) for k, v in list(self.__cfgdata.items())]) + "\n" ++ return "\n".join([f"{k}: {v}" for k, v in list(self.__cfgdata.items())]) + "\n" + + + def __setattr__(self, key, val): +-- +2.40.1 + diff --git a/SOURCES/rteval-Use-f-strings-in-rtevalclient.py.patch b/SOURCES/rteval-Use-f-strings-in-rtevalclient.py.patch new file mode 100644 index 0000000..43a0989 --- /dev/null +++ b/SOURCES/rteval-Use-f-strings-in-rtevalclient.py.patch @@ -0,0 +1,29 @@ +From 5e4fed8a745f70f9be1199f047069e144e9b8fd5 Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:27 -0400 +Subject: rteval: Use f-strings in rtevalclient.py + +Use f-strings in rtevalclient.py + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/rtevalclient.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/rteval/rtevalclient.py b/rteval/rtevalclient.py +index 26c953005326..7ff7d2700cfc 100644 +--- a/rteval/rtevalclient.py ++++ b/rteval/rtevalclient.py +@@ -61,7 +61,7 @@ class rtevalclient: + cmpr = compr.compress(fbuf.getvalue()) + data = base64.b64encode(cmpr + compr.flush()) + ret = self.srv.SendReport(self.hostname, data) +- print("rtevalclient::SendReport() - Sent %i bytes (XML document length: %i bytes, compression ratio: %.02f%%)" % (len(data), doclen, (1-(float(len(data)) / float(doclen)))*100 )) ++ print(f"rtevalclient::SendReport() - Sent {len(data)} bytes (XML document length: {doclen} bytes, compression ratio: {(1-(float(len(data)) / float(doclen)))*100}:.2f)") + return ret + + def SendDataAsFile(self, fname, data, decompr = False): +-- +2.40.1 + diff --git a/SOURCES/rteval-Use-f-strings-in-services.py.patch b/SOURCES/rteval-Use-f-strings-in-services.py.patch new file mode 100644 index 0000000..9950cb9 --- /dev/null +++ b/SOURCES/rteval-Use-f-strings-in-services.py.patch @@ -0,0 +1,61 @@ +From d83a8eb7f0b830408659483922eca25b51bd7b5e Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:33 -0400 +Subject: rteval: Use f-strings in services.py + +Use f-strings in services.py + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/sysinfo/services.py | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/rteval/sysinfo/services.py b/rteval/sysinfo/services.py +index c85980e19165..a87b4abeea76 100644 +--- a/rteval/sysinfo/services.py ++++ b/rteval/sysinfo/services.py +@@ -55,17 +55,17 @@ class SystemServices: + break + if not servicesdir: + raise RuntimeError("No services dir (init.d) found on your system") +- self.__log(Log.DEBUG, "Services located in %s, going through each service file to check status" % servicesdir) ++ self.__log(Log.DEBUG, f"Services located in {servicesdir}, going through each service file to check status") + ret_services = {} + for service in glob.glob(os.path.join(servicesdir, '*')): + servicename = os.path.basename(service) + if not [1 for p in reject if fnmatch.fnmatch(servicename, p)] \ + and os.access(service, os.X_OK): +- cmd = '%s -qs "\(^\|\W\)status)" %s' % (getcmdpath('grep'), service) ++ cmd = f'{getcmdpath("grep")} -qs "\(^\|\W\)status)" {service}' + c = subprocess.Popen(cmd, shell=True, encoding='utf-8') + c.wait() + if c.returncode == 0: +- cmd = ['env', '-i', 'LANG="%s"' % os.environ['LANG'], 'PATH="%s"' % os.environ['PATH'], 'TERM="%s"' % os.environ['TERM'], service, 'status'] ++ cmd = ['env', '-i', f'LANG="{os.environ["LANG"]}"', f'PATH="{os.environ["PATH"]}"', f'TERM="{os.environ["TERM"]}"', service, 'status'] + c = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8') + c.wait() + if c.returncode == 0 and (c.stdout.read() or c.stderr.read()): +@@ -79,8 +79,8 @@ class SystemServices: + + def __get_services_systemd(self): + ret_services = {} +- cmd = '%s list-unit-files -t service --no-legend' % getcmdpath('systemctl') +- self.__log(Log.DEBUG, "cmd: %s" % cmd) ++ cmd = f'{getcmdpath("systemctl")} list-unit-files -t service --no-legend' ++ self.__log(Log.DEBUG, f"cmd: {cmd}") + c = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8') + for p in c.stdout: + # p are lines like b'servicename.service status' +@@ -133,7 +133,7 @@ def unit_test(rootdir): + + return 0 + except Exception as err: +- print("** EXCEPTION: %s" % str(err)) ++ print(f"** EXCEPTION: {str(err)}") + return 1 + + +-- +2.40.1 + diff --git a/SOURCES/rteval-Use-f-strings-in-tools.py.patch b/SOURCES/rteval-Use-f-strings-in-tools.py.patch new file mode 100644 index 0000000..d521adf --- /dev/null +++ b/SOURCES/rteval-Use-f-strings-in-tools.py.patch @@ -0,0 +1,27 @@ +From adc41fa998fc15dff2c5edf3f57e6cd0970e17e5 Mon Sep 17 00:00:00 2001 +From: Anubhav Shelat +Date: Thu, 1 Jun 2023 16:27:34 -0400 +Subject: rteval: Use f-strings in tools.py + +Use f-strings in tools.py + +Signed-off-by: Anubhav Shelat +Signed-off-by: John Kacur +--- + rteval/sysinfo/tools.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/rteval/sysinfo/tools.py b/rteval/sysinfo/tools.py +index 3993da413d8a..aa00b3d3eafc 100644 +--- a/rteval/sysinfo/tools.py ++++ b/rteval/sysinfo/tools.py +@@ -40,5 +40,5 @@ def getcmdpath(which): + pathSave[which] = cmdfile + break + if not pathSave[which]: +- raise RuntimeError("Command '%s' is unknown on this system" % which) ++ raise RuntimeError(f"Command '{which}' is unknown on this system") + return pathSave[which] +-- +2.40.1 + diff --git a/SOURCES/rteval-rteval-__init__.py-Convert-regular-strings-to.patch b/SOURCES/rteval-rteval-__init__.py-Convert-regular-strings-to.patch new file mode 100644 index 0000000..9a37a61 --- /dev/null +++ b/SOURCES/rteval-rteval-__init__.py-Convert-regular-strings-to.patch @@ -0,0 +1,119 @@ +From 0f44bad0f6d95448425903c4ec3a3fa8093ae6e7 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Wed, 9 Nov 2022 12:28:38 -0500 +Subject: rteval: rteval/__init__.py: Convert regular strings to f-strings + +Convert regular strings to f-strings in __init__.py + +Signed-off-by: John Kacur +--- + rteval/__init__.py | 32 +++++++++++++++----------------- + 1 file changed, 15 insertions(+), 17 deletions(-) + +diff --git a/rteval/__init__.py b/rteval/__init__.py +index 22af8e85d5aa..d8127425febe 100644 +--- a/rteval/__init__.py ++++ b/rteval/__init__.py +@@ -59,7 +59,7 @@ def sig_handler(signum, frame): + stopsig_received = True + print("*** stop signal received - stopping rteval run ***") + else: +- raise RuntimeError("SIGNAL received! (%d)" % signum) ++ raise RuntimeError(f"SIGNAL received! ({signum})") + + class RtEval(rtevalReport): + def __init__(self, config, loadmods, measuremods, logger): +@@ -96,10 +96,10 @@ class RtEval(rtevalReport): + self.__mailer = None + + if not os.path.exists(self.__rtevcfg.xslt_report): +- raise RuntimeError("can't find XSL template (%s)!" % self.__rtevcfg.xslt_report) ++ raise RuntimeError(f"can't find XSL template ({self.__rtevcfg.xslt_report})!") + + # Add rteval directory into module search path +- sys.path.insert(0, '%s/rteval' % sysconfig.get_python_lib()) ++ sys.path.insert(0, f'{sysconfig.get_python_lib()}/rteval') + + # Initialise the report module + rtevalReport.__init__(self, self.__version, +@@ -110,8 +110,7 @@ class RtEval(rtevalReport): + self.__xmlrpc = rtevalXMLRPC(self.__rtevcfg.xmlrpc, self.__logger, self.__mailer) + if not self.__xmlrpc.Ping(): + if not self.__rtevcfg.xmlrpc_noabort: +- print("ERROR: Could not reach XML-RPC server '%s'. Aborting." % \ +- self.__rtevcfg.xmlrpc) ++ print(f"ERROR: Could not reach XML-RPC server '{self.__rtevcfg.xmlrpc}'. Aborting.") + sys.exit(2) + else: + print("WARNING: Could not ping the XML-RPC server. Will continue anyway.") +@@ -174,8 +173,7 @@ class RtEval(rtevalReport): + + measure_start = None + (with_loads, run_parallel) = measure_profile.GetProfile() +- self.__logger.log(Log.INFO, "Using measurement profile [loads: %s parallel: %s]" % ( +- with_loads, run_parallel)) ++ self.__logger.log(Log.INFO, f"Using measurement profile [loads: {with_loads} parallel: {run_parallel}]") + try: + nthreads = 0 + +@@ -183,23 +181,23 @@ class RtEval(rtevalReport): + if with_loads: + self._loadmods.Start() + +- print("rteval run on %s started at %s" % (os.uname()[2], time.asctime())) ++ print(f"rteval run on {os.uname()[2]} started at {time.asctime()}") + onlinecpus = self._sysinfo.cpu_getCores(True) + cpulist = self._loadmods._cfg.GetSection("loads").cpulist + if cpulist: +- print("started %d loads on cores %s" % (self._loadmods.ModulesLoaded(), cpulist), end=' ') ++ print(f"started {self._loadmods.ModulesLoaded()} loads on cores {cpulist}", end=' ') + else: +- print("started %d loads on %d cores" % (self._loadmods.ModulesLoaded(), onlinecpus), end=' ') ++ print(f"started {self._loadmods.ModulesLoaded()} loads on {onlinecpus} cores", end=' ') + if self._sysinfo.mem_get_numa_nodes() > 1: +- print(" with %d numa nodes" % self._sysinfo.mem_get_numa_nodes()) ++ print(f" with {self._sysinfo.mem_get_numa_nodes()} numa nodes") + else: + print("") + cpulist = self._measuremods._MeasurementModules__cfg.GetSection("measurement").cpulist + if cpulist: +- print("started measurement threads on cores %s" % cpulist) ++ print(f"started measurement threads on cores {cpulist}") + else: +- print("started measurement threads on %d cores" % onlinecpus) +- print("Run duration: %s seconds" % str(self.__rtevcfg.duration)) ++ print(f"started measurement threads on {onlinecpus} cores") ++ print(f"Run duration: {str(self.__rtevcfg.duration)} seconds") + + # start the cyclictest thread + measure_profile.Start() +@@ -219,7 +217,7 @@ class RtEval(rtevalReport): + # wait for time to expire or thread to die + signal.signal(signal.SIGINT, sig_handler) + signal.signal(signal.SIGTERM, sig_handler) +- self.__logger.log(Log.INFO, "waiting for duration (%s)" % str(self.__rtevcfg.duration)) ++ self.__logger.log(Log.INFO, f"waiting for duration ({str(self.__rtevcfg.duration)})") + stoptime = (time.time() + float(self.__rtevcfg.duration)) + currtime = time.time() + rpttime = currtime + report_interval +@@ -246,7 +244,7 @@ class RtEval(rtevalReport): + left_to_run = stoptime - currtime + self.__show_remaining_time(left_to_run) + rpttime = currtime + report_interval +- print("load average: %.2f" % self._loadmods.GetLoadAvg()) ++ print(f"load average: {self._loadmods.GetLoadAvg():.2f}") + currtime = time.time() + + self.__logger.log(Log.DEBUG, "out of measurement loop") +@@ -265,7 +263,7 @@ class RtEval(rtevalReport): + if with_loads: + self._loadmods.Stop() + +- print("stopping run at %s" % time.asctime()) ++ print(f"stopping run at {time.asctime()}") + + # wait for measurement modules to finish calculating stats + measure_profile.WaitForCompletion() +-- +2.40.1 + diff --git a/SOURCES/rteval-rtevalConfig.py-Convert-regular-strings-to-f-.patch b/SOURCES/rteval-rtevalConfig.py-Convert-regular-strings-to-f-.patch new file mode 100644 index 0000000..e30b73c --- /dev/null +++ b/SOURCES/rteval-rtevalConfig.py-Convert-regular-strings-to-f-.patch @@ -0,0 +1,64 @@ +From 0945147e2c459dfff400fe8bfdebd11e6464eab4 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Wed, 9 Nov 2022 14:14:50 -0500 +Subject: rteval: rtevalConfig.py: Convert regular strings to f-strings + +Convert regular strings to f-strings in rtevalConfig.py + +Signed-off-by: John Kacur +--- + rteval/rtevalConfig.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/rteval/rtevalConfig.py b/rteval/rtevalConfig.py +index decd36ed18ab..de88924642ca 100644 +--- a/rteval/rtevalConfig.py ++++ b/rteval/rtevalConfig.py +@@ -196,7 +196,7 @@ class rtevalConfig: + + # get our system topology info + self.__systopology = SysTopology() +- print(("got system topology: %s" % self.__systopology)) ++ print(f"got system topology: {self.__systopology}") + + # Import the default config first + for sect, vals in list(default_config.items()): +@@ -225,7 +225,7 @@ class rtevalConfig: + "Simple method for dumping config when object is used as a string" + ret = "" + for sect in list(self.__config_data.keys()): +- ret += "[%s]\n%s\n" % (sect, str(self.__config_data[sect])) ++ ret += f"[{sect}]\n{str(self.__config_data[sect])}\n" + return ret + + +@@ -240,7 +240,7 @@ class rtevalConfig: + for f in ('rteval.conf', '/etc/rteval.conf'): + p = os.path.abspath(f) + if os.path.exists(p): +- self.__info("found config file %s" % p) ++ self.__info(f"found config file {p}") + return p + raise RuntimeError("Unable to find configfile") + +@@ -258,7 +258,7 @@ class rtevalConfig: + # Don't try to reread this file if it's already been parsed + return + +- self.__info("reading config file %s" % cfgfile) ++ self.__info(f"reading config file {cfgfile}") + ini = configparser.ConfigParser() + ini.optionxform = str + ini.read(cfgfile) +@@ -321,7 +321,7 @@ class rtevalConfig: + # Return a new object with config settings of a given section + return self.__config_data[section] + except KeyError: +- raise KeyError("The section '%s' does not exist in the config file" % section) ++ raise KeyError(f"The section '{section}' does not exist in the config file") + + + def unit_test(rootdir): +-- +2.40.1 + diff --git a/SOURCES/rteval-rtevalReport.py-Convert-regular-strings-to-f-.patch b/SOURCES/rteval-rtevalReport.py-Convert-regular-strings-to-f-.patch new file mode 100644 index 0000000..aa29ba0 --- /dev/null +++ b/SOURCES/rteval-rtevalReport.py-Convert-regular-strings-to-f-.patch @@ -0,0 +1,42 @@ +From 96ce02046afedfac27c69c30d6ee6b9511238131 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Wed, 9 Nov 2022 12:47:09 -0500 +Subject: rteval: rtevalReport.py: Convert regular strings to f-strings + +Convert regular strings to f-strings in rtevalReport.py + +Signed-off-by: John Kacur +--- + rteval/rtevalReport.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/rteval/rtevalReport.py b/rteval/rtevalReport.py +index fdfaed560cfa..af3e6c9a703b 100644 +--- a/rteval/rtevalReport.py ++++ b/rteval/rtevalReport.py +@@ -100,11 +100,11 @@ class rtevalReport: + + def _show_report(self, xmlfile, xsltfile): + '''summarize a previously generated xml file''' +- print("Loading %s for summarizing" % xmlfile) ++ print(f"Loading {xmlfile} for summarizing") + + xsltfullpath = os.path.join(self.__installdir, xsltfile) + if not os.path.exists(xsltfullpath): +- raise RuntimeError("can't find XSL template (%s)!" % xsltfullpath) ++ raise RuntimeError(f"can't find XSL template ({xsltfullpath})!") + + xmlreport = xmlout.XMLOut('rteval', self.__version) + xmlreport.LoadReport(xmlfile) +@@ -131,7 +131,7 @@ class rtevalReport: + + def _tar_results(self): + if not os.path.isdir(self.__reportdir): +- raise RuntimeError("no such directory: %s" % self.__reportdir) ++ raise RuntimeError(f"no such directory: {self.__reportdir}") + + dirname = os.path.dirname(self.__reportdir) + rptdir = os.path.basename(self.__reportdir) +-- +2.40.1 + diff --git a/SOURCES/rteval-rtevalXMLRPC.py-Convert-regular-strings-to-f-.patch b/SOURCES/rteval-rtevalXMLRPC.py-Convert-regular-strings-to-f-.patch new file mode 100644 index 0000000..e466996 --- /dev/null +++ b/SOURCES/rteval-rtevalXMLRPC.py-Convert-regular-strings-to-f-.patch @@ -0,0 +1,114 @@ +From eceb9de2d2a0bcf3394ca257d42f91bdcac71caf Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Wed, 9 Nov 2022 13:42:59 -0500 +Subject: rteval: rtevalXMLRPC.py: Convert regular strings to f-strings + +Convert regular strings to f-strings in rtevalXMLRPC.py + +Signed-off-by: John Kacur +--- + rteval/rtevalXMLRPC.py | 34 ++++++++++++++-------------------- + 1 file changed, 14 insertions(+), 20 deletions(-) + +diff --git a/rteval/rtevalXMLRPC.py b/rteval/rtevalXMLRPC.py +index f24e21a8ed2f..6dce12ad78bb 100644 +--- a/rteval/rtevalXMLRPC.py ++++ b/rteval/rtevalXMLRPC.py +@@ -33,7 +33,7 @@ from .Log import Log + class rtevalXMLRPC: + def __init__(self, host, logger, mailer=None): + self.__host = host +- self.__url = "http://%s/rteval/API1/" % self.__host ++ self.__url = f"http://{self.__host}/rteval/API1/" + self.__logger = logger + self.__mailer = mailer + self.__client = rtevalclient.rtevalclient(self.__url) +@@ -41,7 +41,7 @@ class rtevalXMLRPC: + + def Ping(self): + res = None +- self.__logger.log(Log.DEBUG, "Checking if XML-RPC server '%s' is reachable" % self.__host) ++ self.__logger.log(Log.DEBUG, f"Checking if XML-RPC server '{self.__host}' is reachable") + attempt = 0 + ping_success = False + warning_sent = False +@@ -52,10 +52,10 @@ class rtevalXMLRPC: + ping_success = True + except xmlrpc.client.ProtocolError: + # Server do not support Hello(), but is reachable +- self.__logger.log(Log.INFO, "Got XML-RPC connection with %s but it did not support Hello()" % self.__host) ++ self.__logger.log(Log.INFO, f"Got XML-RPC connection with {self.__host} but it did not support Hello()") + res = None + except socket.error as err: +- self.__logger.log(Log.INFO, "Could not establish XML-RPC contact with %s\n%s" % (self.__host, str(err))) ++ self.__logger.log(Log.INFO, f"Could not establish XML-RPC contact with {self.__host}\n{str(err)}") + + # Do attempts handling + attempt += 1 +@@ -63,17 +63,16 @@ class rtevalXMLRPC: + break # To avoid sleeping before we abort + + if (self.__mailer is not None) and (not warning_sent): +- self.__mailer.SendMessage("[RTEVAL:WARNING] Failed to ping XML-RPC server", "Server %s did not respond." % self.__host) ++ self.__mailer.SendMessage("[RTEVAL:WARNING] Failed to ping XML-RPC server", f"Server {self.__host} did not respond.") + warning_sent = True + +- print("Failed pinging XML-RPC server. Doing another attempt(%i) " % attempt) ++ print(f"Failed pinging XML-RPC server. Doing another attempt({attempt}) ") + time.sleep(attempt) #*15) # Incremental sleep - sleep attempts*15 seconds + ping_success = False + + if res: +- self.__logger.log(Log.INFO, "Verified XML-RPC connection with %s (XML-RPC API version: %i)" % (res["server"], res["APIversion"])) +- self.__logger.log(Log.DEBUG, "Recieved greeting: %s" % res["greeting"]) +- ++ self.__logger.log(Log.INFO, f'Verified XML-RPC connection with {res["server"]} (XML-RPC API version: {res["APIversion"]})') ++ self.__logger.log(Log.DEBUG, f"Recieved greeting: {res['greeting']}") + return ping_success + + +@@ -85,9 +84,9 @@ class rtevalXMLRPC: + warning_sent = False + while attempt < 6: + try: +- print("Submitting report to %s" % self.__url) ++ print(f"Submitting report to {self.__url}") + rterid = self.__client.SendReport(xmlreport) +- print("Report registered with submission id %i" % rterid) ++ print(f"Report registered with submission id {rterid}") + attempt = 10 + exitcode = 0 # Success + except socket.error: +@@ -96,12 +95,10 @@ class rtevalXMLRPC: + break # To avoid sleeping before we abort + + if (self.__mailer is not None) and (not warning_sent): +- self.__mailer.SendMessage("[RTEVAL:WARNING] Failed to submit report to XML-RPC server", +- "Server %s did not respond. Not giving up yet." +- % self.__host) ++ self.__mailer.SendMessage("[RTEVAL:WARNING] Failed to submit report to XML-RPC server", f"Server {self.__host} did not respond. Not giving up yet.") + warning_sent = True + +- print("Failed sending report. Doing another attempt(%i) " % attempt) ++ print(f"Failed sending report. Making another attempt({attempt}) ") + time.sleep(attempt) #*5*60) # Incremental sleep - sleep attempts*5 minutes + + except Exception as err: +@@ -111,12 +108,9 @@ class rtevalXMLRPC: + if self.__mailer is not None: + # Send final result messages + if exitcode == 2: +- self.__mailer.SendMessage("[RTEVAL:FAILURE] Failed to submit report to XML-RPC server", +- "Server %s did not respond at all after %i attempts." +- % (self.__host, attempt - 1)) ++ self.__mailer.SendMessage("[RTEVAL:FAILURE] Failed to submit report to XML-RPC server", f"Server {self.__host} did not respond at all after {attempt - 1} attempts.") + elif (exitcode == 0) and warning_sent: + self.__mailer.SendMessage("[RTEVAL:SUCCESS] XML-RPC server available again", +- "Succeeded to submit the report to %s" +- % self.__host) ++ f"Succeeded to submit the report to {self.__host}") + + return exitcode +-- +2.40.1 + diff --git a/SOURCES/rteval-xmlout.py-Convert-to-f-strings-where-possible.patch b/SOURCES/rteval-xmlout.py-Convert-to-f-strings-where-possible.patch new file mode 100644 index 0000000..cb69092 --- /dev/null +++ b/SOURCES/rteval-xmlout.py-Convert-to-f-strings-where-possible.patch @@ -0,0 +1,64 @@ +From ecd21eff1601e0ef666b80e0709eacbd4754250c Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Tue, 6 Dec 2022 14:35:49 -0500 +Subject: rteval: xmlout.py: Convert to f-strings where possible + +Convert xmlout.py to f-strings where possible + +Signed-off-by: John Kacur +--- + rteval/xmlout.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/rteval/xmlout.py b/rteval/xmlout.py +index a955fb11c77a..b549cc87a2cc 100644 +--- a/rteval/xmlout.py ++++ b/rteval/xmlout.py +@@ -67,7 +67,7 @@ class XMLOut: + + def __del__(self): + if self.level > 0: +- raise RuntimeError("XMLOut: open blocks at __del__ (last opened '%s')" % self.currtag.name) ++ raise RuntimeError(f"XMLOut: open blocks at __del__ (last opened '{self.currtag.name}')") + if self.xmldoc is not None: + self.xmldoc.freeDoc() + +@@ -131,7 +131,7 @@ class XMLOut: + self.__parseToXML(n, v) + node.addChild(n) + else: +- raise TypeError("unhandled type (%s) for value '%s'" % (type(data), str(data))) ++ raise TypeError(f"unhandled type ({str(type(data))}) for value '{str(data)}'") + + def close(self): + if self.status == 0: +@@ -139,7 +139,7 @@ class XMLOut: + if self.status == 3: + raise RuntimeError("XMLOut: XML document already closed") + if self.level > 0: +- raise RuntimeError("XMLOut: open blocks at close() (last opened '%s')" % self.currtag.name) ++ raise RuntimeError(f"XMLOut: open blocks at close() (last opened '{self.currtag.name}')") + + if self.status == 1: # Only set the root node in the doc on created reports (NewReport called) + self.xmldoc.setRootElement(self.xmlroot) +@@ -172,7 +172,7 @@ class XMLOut: + root = self.xmldoc.children + if root.name != self.roottag: + self.status = 3 +- raise RuntimeError("XMLOut: Loaded report is not a valid %s XML file" % self.roottag) ++ raise RuntimeError(f"XMLOut: Loaded report is not a valid {self.roottag} XML file") + + if validate_version is True: + ver = root.hasProp('version') +@@ -183,7 +183,7 @@ class XMLOut: + + if ver.getContent() != self.version: + self.status = 3 +- raise RuntimeError("XMLOut: Loaded report is not of version %s" % self.version) ++ raise RuntimeError(f"XMLOut: Loaded report is not of version {self.version}") + + self.status = 2 # Confirm that we have loaded a report from file + +-- +2.40.1 + diff --git a/SPECS/rteval.spec b/SPECS/rteval.spec index d18df7e..7f679df 100644 --- a/SPECS/rteval.spec +++ b/SPECS/rteval.spec @@ -1,6 +1,6 @@ Name: rteval Version: 3.5 -Release: 7%{?dist} +Release: 9%{?dist} Summary: Utility to evaluate system suitability for RT Linux Group: Development/Tools @@ -36,6 +36,22 @@ 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 Patch5: rteval-Change-the-default-kernel-to-compile-to-linux.patch +Patch6: Added-code-to-check-if-the-proc-net-if_inet6-file-ex.patch +Patch7: rteval-rteval-__init__.py-Convert-regular-strings-to.patch +Patch8: rteval-rtevalReport.py-Convert-regular-strings-to-f-.patch +Patch9: rteval-rtevalXMLRPC.py-Convert-regular-strings-to-f-.patch +Patch10: rteval-rtevalConfig.py-Convert-regular-strings-to-f-.patch +Patch11: rteval-xmlout.py-Convert-to-f-strings-where-possible.patch +Patch12: rteval-Log.py-Convert-to-f-strings.patch +Patch13: rteval-Use-f-strings-in-rtevalclient.py.patch +Patch14: rteval-Use-f-strings-in-rtevalConfig.patch +Patch15: rteval-Use-f-strings-in-kernel.py.patch +Patch16: rteval-Use-f-strings-in-memory.py.patch +Patch17: rteval-Use-f-strings-in-osinfo.patch +Patch18: rteval-Use-f-strings-in-services.py.patch +Patch19: rteval-Use-f-strings-in-tools.py.patch +Patch20: rteval-Use-f-strings-in-cputopology.patch + %description The rteval script is a utility for measuring various aspects of @@ -53,6 +69,21 @@ to the screen. %patch3 -p1 %patch4 -p1 %patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 %build %{__python3} setup.py build @@ -74,6 +105,16 @@ to the screen. %{_bindir}/rteval %changelog +* Fri Aug 11 2023 John Kacur - 3.5-9 +- Added patches to use f-strings where possible, no functional change +jiraProject== RHEL-798 + +* Mon Jun 05 2023 Anubhav Shelat - 3.5-8 +- Added code to check if the proc/net/if_inet6 file exists while + loading IPv6 addresses in the IPv6Addresses class. +Resolves: rhbz#2210103 +jiraProject == RHELPLAN-158238 + * Mon Feb 06 2023 John Kacur - 3.5-7 - Remove Requires python3-sphinx, as this is only needed for compiling documentation, and is causing problems in testing