Added an option -S, --source-download to download a kernel source tarball from kernel.org to the appropriate loadsource directory. Acceptable strings for the kernel version are 'linux-5.18.1.tar.xz;, 'linux-5.18.1.tar.gz', 'linux-5.18.1', '5.18.1', 'linux-5.19-rc5'. Conditions have been added to check for default kernel packaged with rteval-loads and backing up the tarball if it already exists. This enhancement simplifies the manual downloading of kernel to the loadsource directory. Signed-off-by: Manasi Godse <magodse@xxxxxxxxxx> --- rteval-cmd | 61 ++++++++++++++++++++++++++++++++++++++++++ rteval/rtevalConfig.py | 1 + 2 files changed, 62 insertions(+) diff --git a/rteval-cmd b/rteval-cmd index 4598ba514ddc..dcd06dc30ba4 100755 --- a/rteval-cmd +++ b/rteval-cmd @@ -37,8 +37,11 @@ import sys import os import time +import re +import shutil import optparse import tempfile +import requests import lxml.etree from rteval.Log import Log from rteval import RtEval, rtevalConfig @@ -46,6 +49,7 @@ from rteval.modules.loads import LoadModules from rteval.modules.measurement import MeasurementModules from rteval.version import RTEVAL_VERSION from rteval.misc import invert_cpulist, compress_cpulist +from rteval.modules.loads.kcompile import ModuleParameters def summarize(repfile, xslt): """ Summarize an already existing XML report """ @@ -158,6 +162,10 @@ def parse_options(cfg, parser, cmdargs): parser.add_option("-V", "--version", dest="rteval___version", action='store_true', default=False, help='print rteval version and exit') + parser.add_option("-S", "--source-download", dest="rteval___srcdownload", + type="string", default=None, metavar="KERNEL_VERSION", + help='download a source kernel from kernel.org') + if not cmdargs: cmdargs = ["--help"] @@ -254,6 +262,59 @@ if __name__ == '__main__': measuremods.SetupModuleOptions(parser) cmd_args = parse_options(config, parser, sys.argv[1:]) + # download kernel tarball + if rtevcfg.srcdownload: + logger.log(Log.DEBUG, f"Kernel Version to download = {rtevcfg.srcdownload}") + + # handle a kernel version like linux-5.19-rc5 + if 'rc' in rtevcfg.srcdownload: + kernel_prefix = re.search(r"\d{1,2}\.\d{1,3}\-[a-z]*\d{1,2}", rtevcfg.srcdownload).group(0) + url = "https://git.kernel.org/torvalds/t/" + else: + kernel_prefix = re.search(r"\d{1,2}\.\d{1,3}\.*\d{1,2}", rtevcfg.srcdownload).group(0) + major_version = re.search(r"\d{1,2}", kernel_prefix).group(0) + url = "https://kernel.org/pub/linux/kernel/v" + major_version + ".x/" + + + if rtevcfg.srcdownload.endswith(".gz") or 'rc' in rtevcfg.srcdownload: + rtevcfg.srcdownload = "linux-" + kernel_prefix + ".tar.gz" + else: + rtevcfg.srcdownload = "linux-" + kernel_prefix + ".tar.xz" + tarfl = os.path.join(rtevcfg.srcdir, rtevcfg.srcdownload) + + # if default kernel packages with rteval-loads exists, do not download/overwrite + default_kernel_file = ModuleParameters().get('source').get('default') + if os.path.exists(tarfl): + if rtevcfg.srcdownload == default_kernel_file: + sys.exit("Default kernel already exists, will not download") + prompt = input("Kernel already exists, download and overwrite anyways? (y/n) ") + prompt = prompt.lower() + if prompt in ('no', 'n'): + sys.exit("Exiting") + elif prompt in ('yes','y'): + # backup the existing kernel in case it needs to be restored later + shutil.move(tarfl, tarfl + ".bkup") + else: + sys.exit("Invalid option. Exiting") + + url = url + rtevcfg.srcdownload + print(f"Downloading kernel {url}") + downloaded_file = requests.get(url) + if downloaded_file.status_code != 200: + # restore the kernel file if it exists + if os.path.exists(tarfl + ".bkup"): + shutil.move(tarfl + ".bkup", tarfl) + sys.exit(f"Could not download tar file {rtevcfg.srcdownload}, status code {downloaded_file.status_code}") + with open(tarfl, 'wb') as fd: + fd.write(downloaded_file.content) + logger.log(Log.DEBUG, f"Kernel source {rtevcfg.srcdownload} downloaded successfully") + logger.log(Log.DEBUG, f"Downloaded to directory location: {rtevcfg.srcdir}") + # download was successful, delete the backup file if it exists + if os.path.exists(tarfl + ".bkup"): + os.remove(tarfl + ".bkup") + sys.exit(0) + + # if we only specified one set of cpus (loads or measurement) # default the other to the inverse of the specified list ldcfg = config.GetSection('loads') diff --git a/rteval/rtevalConfig.py b/rteval/rtevalConfig.py index 56bbc9ee0de6..decd36ed18ab 100644 --- a/rteval/rtevalConfig.py +++ b/rteval/rtevalConfig.py @@ -97,6 +97,7 @@ default_config = { 'xslt_histogram': default_config_search(['rteval_histogram_raw.xsl'], os.path.isfile), 'report_interval': '600', 'logging' : False, + 'srcdownload': None, } } -- 2.31.1