From 4c73c0882b34d0383ff417e2d66c127f848cfe06 Mon Sep 17 00:00:00 2001 From: Andrew Donnellan Date: Tue, 5 Jul 2016 17:47:37 +1000 Subject: checkkconfigsymbols.py: add --no-color option, don't print color to non-TTY Only print the ANSI colour escape codes if stdout is a TTY. Useful if redirecting output to a file or piping to another script. Also add a new option, --no-color, if the user wants to disable colour output for whatever reason. Signed-off-by: Andrew Donnellan Acked-by: Valentin Rothberg Signed-off-by: Greg Kroah-Hartman --- scripts/checkkconfigsymbols.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'scripts') diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py index df643f6..b140fc9 100755 --- a/scripts/checkkconfigsymbols.py +++ b/scripts/checkkconfigsymbols.py @@ -82,6 +82,11 @@ def parse_options(): default=False, help="Reset current Git tree even when it's dirty.") + parser.add_option('', '--no-color', dest='color', action='store_false', + default=True, + help="Don't print colored output. Default when not " + "outputting to a terminal.") + (opts, _) = parser.parse_args() if opts.commit and opts.diff: @@ -116,6 +121,9 @@ def main(): """Main function of this module.""" opts = parse_options() + global color + color = opts.color and sys.stdout.isatty() + if opts.sim and not opts.commit and not opts.diff: sims = find_sims(opts.sim, opts.ignore) if sims: @@ -202,14 +210,14 @@ def yel(string): """ Color %string yellow. """ - return "\033[33m%s\033[0m" % string + return "\033[33m%s\033[0m" % string if color else string def red(string): """ Color %string red. """ - return "\033[31m%s\033[0m" % string + return "\033[31m%s\033[0m" % string if color else string def execute(cmd): -- cgit v1.1 From f175ba174ef3cb8c26e828c710e4e3b0f2bbbf55 Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Sat, 27 Aug 2016 10:59:07 +0200 Subject: checkkconfigsymbols.py: avoid shell injection Use subprocess and set shell to False to avoid potential shell injections. Reported-by: Bernd Dietzel Signed-off-by: Valentin Rothberg Signed-off-by: Greg Kroah-Hartman --- scripts/checkkconfigsymbols.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'scripts') diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py index b140fc9..0cae73b 100755 --- a/scripts/checkkconfigsymbols.py +++ b/scripts/checkkconfigsymbols.py @@ -2,7 +2,7 @@ """Find Kconfig symbols that are referenced but not defined.""" -# (c) 2014-2015 Valentin Rothberg +# (c) 2014-2016 Valentin Rothberg # (c) 2014 Stefan Hengelein # # Licensed under the terms of the GNU GPL License version 2 @@ -12,6 +12,7 @@ import difflib import os import re import signal +import subprocess import sys from multiprocessing import Pool, cpu_count from optparse import OptionParser @@ -222,10 +223,11 @@ def red(string): def execute(cmd): """Execute %cmd and return stdout. Exit in case of error.""" - pop = Popen(cmd, stdout=PIPE, stderr=STDOUT, shell=True) - (stdout, _) = pop.communicate() # wait until finished - if pop.returncode != 0: - sys.exit(stdout) + try: + cmdlist = cmd.split(" ") + stdout = subprocess.check_output(cmdlist, stderr=STDOUT, shell=False) + except subprocess.CalledProcessError as fail: + exit("Failed to execute %s\n%s" % (cmd, fail)) return stdout -- cgit v1.1 From 7c5227af25a1bee7c577162bd55600dae8023f5a Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Sun, 28 Aug 2016 08:51:28 +0200 Subject: checkkconfigsymbols.py: port to Python 3 Python 2 is slowly dying, so port the script to Python 3. Signed-off-by: Valentin Rothberg Signed-off-by: Greg Kroah-Hartman --- scripts/checkkconfigsymbols.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'scripts') diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py index 0cae73b..2b13d8a 100755 --- a/scripts/checkkconfigsymbols.py +++ b/scripts/checkkconfigsymbols.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """Find Kconfig symbols that are referenced but not defined.""" @@ -128,9 +128,9 @@ def main(): if opts.sim and not opts.commit and not opts.diff: sims = find_sims(opts.sim, opts.ignore) if sims: - print "%s: %s" % (yel("Similar symbols"), ', '.join(sims)) + print("%s: %s" % (yel("Similar symbols"), ', '.join(sims))) else: - print "%s: no similar symbols found" % yel("Similar symbols") + print("%s: no similar symbols found" % yel("Similar symbols")) sys.exit(0) # dictionary of (un)defined symbols @@ -183,28 +183,28 @@ def main(): # now print the output for feature in sorted(undefined): - print red(feature) + print(red(feature)) files = sorted(undefined.get(feature)) - print "%s: %s" % (yel("Referencing files"), ", ".join(files)) + print("%s: %s" % (yel("Referencing files"), ", ".join(files))) sims = find_sims(feature, opts.ignore, defined) sims_out = yel("Similar symbols") if sims: - print "%s: %s" % (sims_out, ', '.join(sims)) + print("%s: %s" % (sims_out, ', '.join(sims))) else: - print "%s: %s" % (sims_out, "no similar symbols found") + print("%s: %s" % (sims_out, "no similar symbols found")) if opts.find: - print "%s:" % yel("Commits changing symbol") + print("%s:" % yel("Commits changing symbol")) commits = find_commits(feature, opts.diff) if commits: for commit in commits: commit = commit.split(" ", 1) - print "\t- %s (\"%s\")" % (yel(commit[0]), commit[1]) + print("\t- %s (\"%s\")" % (yel(commit[0]), commit[1])) else: - print "\t- no commit found" - print # new line + print("\t- no commit found") + print() # new line def yel(string): @@ -225,7 +225,8 @@ def execute(cmd): """Execute %cmd and return stdout. Exit in case of error.""" try: cmdlist = cmd.split(" ") - stdout = subprocess.check_output(cmdlist, stderr=STDOUT, shell=False) + stdout = subprocess.check_output(cmdlist, stderr=subprocess.STDOUT, shell=False) + stdout = stdout.decode(errors='replace') except subprocess.CalledProcessError as fail: exit("Failed to execute %s\n%s" % (cmd, fail)) return stdout @@ -256,7 +257,7 @@ def get_head(): def partition(lst, size): """Partition list @lst into eveni-sized lists of size @size.""" - return [lst[i::size] for i in xrange(size)] + return [lst[i::size] for i in range(size)] def init_worker(): @@ -350,7 +351,7 @@ def check_symbols_helper(pool, ignore): # inverse mapping of referenced_features to dict(feature: [files]) inv_map = dict() - for _file, features in referenced_features.iteritems(): + for _file, features in referenced_features.items(): for feature in features: inv_map[feature] = inv_map.get(feature, set()) inv_map[feature].add(_file) @@ -388,7 +389,7 @@ def parse_source_file(sfile): if not os.path.exists(sfile): return references - with open(sfile, "r") as stream: + with open(sfile, "r", encoding='utf-8', errors='replace') as stream: lines = stream.readlines() for line in lines: @@ -437,7 +438,7 @@ def parse_kconfig_file(kfile): if not os.path.exists(kfile): return defined, references - with open(kfile, "r") as stream: + with open(kfile, "r", encoding='utf-8', errors='replace') as stream: lines = stream.readlines() for i in range(len(lines)): -- cgit v1.1 From 14390e31641e6fb482ad75b7f46bc54d798f8b87 Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Sun, 28 Aug 2016 08:51:29 +0200 Subject: checkkconfigsymbols: use ArgumentParser Replace the deprecated OptionParser with ArgumentParser, as recommended by pylint. Signed-off-by: Valentin Rothberg Signed-off-by: Greg Kroah-Hartman --- scripts/checkkconfigsymbols.py | 142 ++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 73 deletions(-) (limited to 'scripts') diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py index 2b13d8a..322c5e8 100755 --- a/scripts/checkkconfigsymbols.py +++ b/scripts/checkkconfigsymbols.py @@ -8,6 +8,7 @@ # Licensed under the terms of the GNU GPL License version 2 +import argparse import difflib import os import re @@ -15,7 +16,6 @@ import signal import subprocess import sys from multiprocessing import Pool, cpu_count -from optparse import OptionParser from subprocess import Popen, PIPE, STDOUT @@ -43,62 +43,58 @@ REGEX_QUOTES = re.compile("(\"(.*?)\")") def parse_options(): """The user interface of this module.""" - usage = "%prog [options]\n\n" \ - "Run this tool to detect Kconfig symbols that are referenced but " \ - "not defined in\nKconfig. The output of this tool has the " \ - "format \'Undefined symbol\\tFile list\'\n\n" \ - "If no option is specified, %prog will default to check your\n" \ - "current tree. Please note that specifying commits will " \ - "\'git reset --hard\'\nyour current tree! You may save " \ - "uncommitted changes to avoid losing data." - - parser = OptionParser(usage=usage) - - parser.add_option('-c', '--commit', dest='commit', action='store', - default="", - help="Check if the specified commit (hash) introduces " - "undefined Kconfig symbols.") - - parser.add_option('-d', '--diff', dest='diff', action='store', - default="", - help="Diff undefined symbols between two commits. The " - "input format bases on Git log's " - "\'commmit1..commit2\'.") - - parser.add_option('-f', '--find', dest='find', action='store_true', - default=False, - help="Find and show commits that may cause symbols to be " - "missing. Required to run with --diff.") - - parser.add_option('-i', '--ignore', dest='ignore', action='store', - default="", - help="Ignore files matching this pattern. Note that " - "the pattern needs to be a Python regex. To " - "ignore defconfigs, specify -i '.*defconfig'.") - - parser.add_option('-s', '--sim', dest='sim', action='store', default="", - help="Print a list of maximum 10 string-similar symbols.") - - parser.add_option('', '--force', dest='force', action='store_true', - default=False, - help="Reset current Git tree even when it's dirty.") - - parser.add_option('', '--no-color', dest='color', action='store_false', - default=True, - help="Don't print colored output. Default when not " - "outputting to a terminal.") - - (opts, _) = parser.parse_args() - - if opts.commit and opts.diff: + usage = "Run this tool to detect Kconfig symbols that are referenced but " \ + "not defined in Kconfig. If no option is specified, " \ + "checkkconfigsymbols defaults to check your current tree. " \ + "Please note that specifying commits will 'git reset --hard\' " \ + "your current tree! You may save uncommitted changes to avoid " \ + "losing data." + + parser = argparse.ArgumentParser(description=usage) + + parser.add_argument('-c', '--commit', dest='commit', action='store', + default="", + help="check if the specified commit (hash) introduces " + "undefined Kconfig symbols") + + parser.add_argument('-d', '--diff', dest='diff', action='store', + default="", + help="diff undefined symbols between two commits " + "(e.g., -d commmit1..commit2)") + + parser.add_argument('-f', '--find', dest='find', action='store_true', + default=False, + help="find and show commits that may cause symbols to be " + "missing (required to run with --diff)") + + parser.add_argument('-i', '--ignore', dest='ignore', action='store', + default="", + help="ignore files matching this Python regex " + "(e.g., -i '.*defconfig')") + + parser.add_argument('-s', '--sim', dest='sim', action='store', default="", + help="print a list of max. 10 string-similar symbols") + + parser.add_argument('--force', dest='force', action='store_true', + default=False, + help="reset current Git tree even when it's dirty") + + parser.add_argument('--no-color', dest='color', action='store_false', + default=True, + help="don't print colored output (default when not " + "outputting to a terminal)") + + args = parser.parse_args() + + if args.commit and args.diff: sys.exit("Please specify only one option at once.") - if opts.diff and not re.match(r"^[\w\-\.]+\.\.[\w\-\.]+$", opts.diff): + if args.diff and not re.match(r"^[\w\-\.]+\.\.[\w\-\.]+$", args.diff): sys.exit("Please specify valid input in the following format: " "\'commit1..commit2\'") - if opts.commit or opts.diff: - if not opts.force and tree_is_dirty(): + if args.commit or args.diff: + if not args.force and tree_is_dirty(): sys.exit("The current Git tree is dirty (see 'git status'). " "Running this script may\ndelete important data since it " "calls 'git reset --hard' for some performance\nreasons. " @@ -106,27 +102,27 @@ def parse_options(): "'--force' if you\nwant to ignore this warning and " "continue.") - if opts.commit: - opts.find = False + if args.commit: + args.find = False - if opts.ignore: + if args.ignore: try: - re.match(opts.ignore, "this/is/just/a/test.c") + re.match(args.ignore, "this/is/just/a/test.c") except: sys.exit("Please specify a valid Python regex.") - return opts + return args def main(): """Main function of this module.""" - opts = parse_options() + args = parse_options() global color - color = opts.color and sys.stdout.isatty() + color = args.color and sys.stdout.isatty() - if opts.sim and not opts.commit and not opts.diff: - sims = find_sims(opts.sim, opts.ignore) + if args.sim and not args.commit and not args.diff: + sims = find_sims(args.sim, args.ignore) if sims: print("%s: %s" % (yel("Similar symbols"), ', '.join(sims))) else: @@ -137,17 +133,17 @@ def main(): defined = {} undefined = {} - if opts.commit or opts.diff: + if args.commit or args.diff: head = get_head() # get commit range commit_a = None commit_b = None - if opts.commit: - commit_a = opts.commit + "~" - commit_b = opts.commit - elif opts.diff: - split = opts.diff.split("..") + if args.commit: + commit_a = args.commit + "~" + commit_b = args.commit + elif args.diff: + split = args.diff.split("..") commit_a = split[0] commit_b = split[1] undefined_a = {} @@ -155,11 +151,11 @@ def main(): # get undefined items before the commit execute("git reset --hard %s" % commit_a) - undefined_a, _ = check_symbols(opts.ignore) + undefined_a, _ = check_symbols(args.ignore) # get undefined items for the commit execute("git reset --hard %s" % commit_b) - undefined_b, defined = check_symbols(opts.ignore) + undefined_b, defined = check_symbols(args.ignore) # report cases that are present for the commit but not before for feature in sorted(undefined_b): @@ -179,7 +175,7 @@ def main(): # default to check the entire tree else: - undefined, defined = check_symbols(opts.ignore) + undefined, defined = check_symbols(args.ignore) # now print the output for feature in sorted(undefined): @@ -188,16 +184,16 @@ def main(): files = sorted(undefined.get(feature)) print("%s: %s" % (yel("Referencing files"), ", ".join(files))) - sims = find_sims(feature, opts.ignore, defined) + sims = find_sims(feature, args.ignore, defined) sims_out = yel("Similar symbols") if sims: print("%s: %s" % (sims_out, ', '.join(sims))) else: print("%s: %s" % (sims_out, "no similar symbols found")) - if opts.find: + if args.find: print("%s:" % yel("Commits changing symbol")) - commits = find_commits(feature, opts.diff) + commits = find_commits(feature, args.diff) if commits: for commit in commits: commit = commit.split(" ", 1) -- cgit v1.1 From 36c79c7face54ca10e2b57f42cfc956a53246c10 Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Sun, 28 Aug 2016 08:51:30 +0200 Subject: checkkconfigsymbols.py: fix pylint and pep8 warnings Fix pylint and pep8 warnings to have a consistent syntax and style. Signed-off-by: Valentin Rothberg Signed-off-by: Greg Kroah-Hartman --- scripts/checkkconfigsymbols.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'scripts') diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py index 322c5e8..4111746 100755 --- a/scripts/checkkconfigsymbols.py +++ b/scripts/checkkconfigsymbols.py @@ -16,7 +16,6 @@ import signal import subprocess import sys from multiprocessing import Pool, cpu_count -from subprocess import Popen, PIPE, STDOUT # regex expressions @@ -118,8 +117,8 @@ def main(): """Main function of this module.""" args = parse_options() - global color - color = args.color and sys.stdout.isatty() + global COLOR + COLOR = args.color and sys.stdout.isatty() if args.sim and not args.commit and not args.diff: sims = find_sims(args.sim, args.ignore) @@ -160,7 +159,7 @@ def main(): # report cases that are present for the commit but not before for feature in sorted(undefined_b): # feature has not been undefined before - if not feature in undefined_a: + if feature not in undefined_a: files = sorted(undefined_b.get(feature)) undefined[feature] = files # check if there are new files that reference the undefined feature @@ -200,21 +199,21 @@ def main(): print("\t- %s (\"%s\")" % (yel(commit[0]), commit[1])) else: print("\t- no commit found") - print() # new line + print() # new line def yel(string): """ Color %string yellow. """ - return "\033[33m%s\033[0m" % string if color else string + return "\033[33m%s\033[0m" % string if COLOR else string def red(string): """ Color %string red. """ - return "\033[31m%s\033[0m" % string if color else string + return "\033[31m%s\033[0m" % string if COLOR else string def execute(cmd): @@ -261,7 +260,7 @@ def init_worker(): signal.signal(signal.SIGINT, signal.SIG_IGN) -def find_sims(symbol, ignore, defined = []): +def find_sims(symbol, ignore, defined=[]): """Return a list of max. ten Kconfig symbols that are string-similar to @symbol.""" if defined: @@ -335,7 +334,6 @@ def check_symbols_helper(pool, ignore): for res in pool.map(parse_source_files, arglist): referenced_features.update(res) - # parse kconfig files arglist = [] for part in partition(kconfig_files, cpu_count()): @@ -389,7 +387,7 @@ def parse_source_file(sfile): lines = stream.readlines() for line in lines: - if not "CONFIG_" in line: + if "CONFIG_" not in line: continue features = REGEX_SOURCE_FEATURE.findall(line) for feature in features: -- cgit v1.1 From ef3f55438d95f0bfc5d4730db6e59058647832e2 Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Sun, 28 Aug 2016 08:51:31 +0200 Subject: checkkconfigsymblos: consistent symbol terminology 'symbol' and 'feature' are used synonymously to refer to Kconfig symbols (configs, menus, etc.). Use the term 'symbol' to have a consistent terminology and to make the code more comprehensible. Signed-off-by: Valentin Rothberg Signed-off-by: Greg Kroah-Hartman --- scripts/checkkconfigsymbols.py | 134 ++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 67 deletions(-) (limited to 'scripts') diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py index 4111746..4b54aa3 100755 --- a/scripts/checkkconfigsymbols.py +++ b/scripts/checkkconfigsymbols.py @@ -20,22 +20,22 @@ from multiprocessing import Pool, cpu_count # regex expressions OPERATORS = r"&|\(|\)|\||\!" -FEATURE = r"(?:\w*[A-Z0-9]\w*){2,}" -DEF = r"^\s*(?:menu){,1}config\s+(" + FEATURE + r")\s*" -EXPR = r"(?:" + OPERATORS + r"|\s|" + FEATURE + r")+" +SYMBOL = r"(?:\w*[A-Z0-9]\w*){2,}" +DEF = r"^\s*(?:menu){,1}config\s+(" + SYMBOL + r")\s*" +EXPR = r"(?:" + OPERATORS + r"|\s|" + SYMBOL + r")+" DEFAULT = r"default\s+.*?(?:if\s.+){,1}" STMT = r"^\s*(?:if|select|depends\s+on|(?:" + DEFAULT + r"))\s+" + EXPR -SOURCE_FEATURE = r"(?:\W|\b)+[D]{,1}CONFIG_(" + FEATURE + r")" +SOURCE_SYMBOL = r"(?:\W|\b)+[D]{,1}CONFIG_(" + SYMBOL + r")" # regex objects REGEX_FILE_KCONFIG = re.compile(r".*Kconfig[\.\w+\-]*$") -REGEX_FEATURE = re.compile(r'(?!\B)' + FEATURE + r'(?!\B)') -REGEX_SOURCE_FEATURE = re.compile(SOURCE_FEATURE) +REGEX_SYMBOL = re.compile(r'(?!\B)' + SYMBOL + r'(?!\B)') +REGEX_SOURCE_SYMBOL = re.compile(SOURCE_SYMBOL) REGEX_KCONFIG_DEF = re.compile(DEF) REGEX_KCONFIG_EXPR = re.compile(EXPR) REGEX_KCONFIG_STMT = re.compile(STMT) REGEX_KCONFIG_HELP = re.compile(r"^\s+(help|---help---)\s*$") -REGEX_FILTER_FEATURES = re.compile(r"[A-Za-z0-9]$") +REGEX_FILTER_SYMBOLS = re.compile(r"[A-Za-z0-9]$") REGEX_NUMERIC = re.compile(r"0[xX][0-9a-fA-F]+|[0-9]+") REGEX_QUOTES = re.compile("(\"(.*?)\")") @@ -157,17 +157,17 @@ def main(): undefined_b, defined = check_symbols(args.ignore) # report cases that are present for the commit but not before - for feature in sorted(undefined_b): - # feature has not been undefined before - if feature not in undefined_a: - files = sorted(undefined_b.get(feature)) - undefined[feature] = files - # check if there are new files that reference the undefined feature + for symbol in sorted(undefined_b): + # symbol has not been undefined before + if symbol not in undefined_a: + files = sorted(undefined_b.get(symbol)) + undefined[symbol] = files + # check if there are new files that reference the undefined symbol else: - files = sorted(undefined_b.get(feature) - - undefined_a.get(feature)) + files = sorted(undefined_b.get(symbol) - + undefined_a.get(symbol)) if files: - undefined[feature] = files + undefined[symbol] = files # reset to head execute("git reset --hard %s" % head) @@ -177,13 +177,13 @@ def main(): undefined, defined = check_symbols(args.ignore) # now print the output - for feature in sorted(undefined): - print(red(feature)) + for symbol in sorted(undefined): + print(red(symbol)) - files = sorted(undefined.get(feature)) + files = sorted(undefined.get(symbol)) print("%s: %s" % (yel("Referencing files"), ", ".join(files))) - sims = find_sims(feature, args.ignore, defined) + sims = find_sims(symbol, args.ignore, defined) sims_out = yel("Similar symbols") if sims: print("%s: %s" % (sims_out, ', '.join(sims))) @@ -192,7 +192,7 @@ def main(): if args.find: print("%s:" % yel("Commits changing symbol")) - commits = find_commits(feature, args.diff) + commits = find_commits(symbol, args.diff) if commits: for commit in commits: commit = commit.split(" ", 1) @@ -317,8 +317,8 @@ def check_symbols_helper(pool, ignore): check_symbols() in order to properly terminate running worker processes.""" source_files = [] kconfig_files = [] - defined_features = [] - referenced_features = dict() # {file: [features]} + defined_symbols = [] + referenced_symbols = dict() # {file: [symbols]} for gitfile in get_files(): if REGEX_FILE_KCONFIG.match(gitfile): @@ -332,51 +332,51 @@ def check_symbols_helper(pool, ignore): # parse source files arglist = partition(source_files, cpu_count()) for res in pool.map(parse_source_files, arglist): - referenced_features.update(res) + referenced_symbols.update(res) # parse kconfig files arglist = [] for part in partition(kconfig_files, cpu_count()): arglist.append((part, ignore)) for res in pool.map(parse_kconfig_files, arglist): - defined_features.extend(res[0]) - referenced_features.update(res[1]) - defined_features = set(defined_features) + defined_symbols.extend(res[0]) + referenced_symbols.update(res[1]) + defined_symbols = set(defined_symbols) - # inverse mapping of referenced_features to dict(feature: [files]) + # inverse mapping of referenced_symbols to dict(symbol: [files]) inv_map = dict() - for _file, features in referenced_features.items(): - for feature in features: - inv_map[feature] = inv_map.get(feature, set()) - inv_map[feature].add(_file) - referenced_features = inv_map - - undefined = {} # {feature: [files]} - for feature in sorted(referenced_features): + for _file, symbols in referenced_symbols.items(): + for symbol in symbols: + inv_map[symbol] = inv_map.get(symbol, set()) + inv_map[symbol].add(_file) + referenced_symbols = inv_map + + undefined = {} # {symbol: [files]} + for symbol in sorted(referenced_symbols): # filter some false positives - if feature == "FOO" or feature == "BAR" or \ - feature == "FOO_BAR" or feature == "XXX": + if symbol == "FOO" or symbol == "BAR" or \ + symbol == "FOO_BAR" or symbol == "XXX": continue - if feature not in defined_features: - if feature.endswith("_MODULE"): + if symbol not in defined_symbols: + if symbol.endswith("_MODULE"): # avoid false positives for kernel modules - if feature[:-len("_MODULE")] in defined_features: + if symbol[:-len("_MODULE")] in defined_symbols: continue - undefined[feature] = referenced_features.get(feature) - return undefined, defined_features + undefined[symbol] = referenced_symbols.get(symbol) + return undefined, defined_symbols def parse_source_files(source_files): """Parse each source file in @source_files and return dictionary with source files as keys and lists of references Kconfig symbols as values.""" - referenced_features = dict() + referenced_symbols = dict() for sfile in source_files: - referenced_features[sfile] = parse_source_file(sfile) - return referenced_features + referenced_symbols[sfile] = parse_source_file(sfile) + return referenced_symbols def parse_source_file(sfile): - """Parse @sfile and return a list of referenced Kconfig features.""" + """Parse @sfile and return a list of referenced Kconfig symbols.""" lines = [] references = [] @@ -389,18 +389,18 @@ def parse_source_file(sfile): for line in lines: if "CONFIG_" not in line: continue - features = REGEX_SOURCE_FEATURE.findall(line) - for feature in features: - if not REGEX_FILTER_FEATURES.search(feature): + symbols = REGEX_SOURCE_SYMBOL.findall(line) + for symbol in symbols: + if not REGEX_FILTER_SYMBOLS.search(symbol): continue - references.append(feature) + references.append(symbol) return references -def get_features_in_line(line): - """Return mentioned Kconfig features in @line.""" - return REGEX_FEATURE.findall(line) +def get_symbols_in_line(line): + """Return mentioned Kconfig symbols in @line.""" + return REGEX_SYMBOL.findall(line) def parse_kconfig_files(args): @@ -409,21 +409,21 @@ def parse_kconfig_files(args): pattern.""" kconfig_files = args[0] ignore = args[1] - defined_features = [] - referenced_features = dict() + defined_symbols = [] + referenced_symbols = dict() for kfile in kconfig_files: defined, references = parse_kconfig_file(kfile) - defined_features.extend(defined) + defined_symbols.extend(defined) if ignore and re.match(ignore, kfile): # do not collect references for files that match the ignore pattern continue - referenced_features[kfile] = references - return (defined_features, referenced_features) + referenced_symbols[kfile] = references + return (defined_symbols, referenced_symbols) def parse_kconfig_file(kfile): - """Parse @kfile and update feature definitions and references.""" + """Parse @kfile and update symbol definitions and references.""" lines = [] defined = [] references = [] @@ -441,8 +441,8 @@ def parse_kconfig_file(kfile): line = line.split("#")[0] # ignore comments if REGEX_KCONFIG_DEF.match(line): - feature_def = REGEX_KCONFIG_DEF.findall(line) - defined.append(feature_def[0]) + symbol_def = REGEX_KCONFIG_DEF.findall(line) + defined.append(symbol_def[0]) skip = False elif REGEX_KCONFIG_HELP.match(line): skip = True @@ -451,18 +451,18 @@ def parse_kconfig_file(kfile): pass elif REGEX_KCONFIG_STMT.match(line): line = REGEX_QUOTES.sub("", line) - features = get_features_in_line(line) + symbols = get_symbols_in_line(line) # multi-line statements while line.endswith("\\"): i += 1 line = lines[i] line = line.strip('\n') - features.extend(get_features_in_line(line)) - for feature in set(features): - if REGEX_NUMERIC.match(feature): + symbols.extend(get_symbols_in_line(line)) + for symbol in set(symbols): + if REGEX_NUMERIC.match(symbol): # ignore numeric values continue - references.append(feature) + references.append(symbol) return defined, references -- cgit v1.1 From 2f9cc12bb34a4a90f18839a5ce35e1e4d33d6413 Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Sun, 28 Aug 2016 08:51:32 +0200 Subject: checkkconfigsymbols: use arglist instead of cmd string Splitting a command string could lead to unintended arguments. Use an argument list in the execute() function instead. Signed-off-by: Valentin Rothberg Signed-off-by: Greg Kroah-Hartman --- scripts/checkkconfigsymbols.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'scripts') diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py index 4b54aa3..a32e4da 100755 --- a/scripts/checkkconfigsymbols.py +++ b/scripts/checkkconfigsymbols.py @@ -149,11 +149,11 @@ def main(): undefined_b = {} # get undefined items before the commit - execute("git reset --hard %s" % commit_a) + reset(commit_a) undefined_a, _ = check_symbols(args.ignore) # get undefined items for the commit - execute("git reset --hard %s" % commit_b) + reset(commit_b) undefined_b, defined = check_symbols(args.ignore) # report cases that are present for the commit but not before @@ -170,7 +170,7 @@ def main(): undefined[symbol] = files # reset to head - execute("git reset --hard %s" % head) + reset(head) # default to check the entire tree else: @@ -202,6 +202,11 @@ def main(): print() # new line +def reset(commit): + """Reset current git tree to %commit.""" + execute(["git", "reset", "--hard", commit]) + + def yel(string): """ Color %string yellow. @@ -219,25 +224,25 @@ def red(string): def execute(cmd): """Execute %cmd and return stdout. Exit in case of error.""" try: - cmdlist = cmd.split(" ") - stdout = subprocess.check_output(cmdlist, stderr=subprocess.STDOUT, shell=False) + stdout = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=False) stdout = stdout.decode(errors='replace') except subprocess.CalledProcessError as fail: - exit("Failed to execute %s\n%s" % (cmd, fail)) + exit(fail) return stdout def find_commits(symbol, diff): """Find commits changing %symbol in the given range of %diff.""" - commits = execute("git log --pretty=oneline --abbrev-commit -G %s %s" - % (symbol, diff)) + commits = execute(["git", "log", "--pretty=oneline", + "--abbrev-commit", "-G", + symbol, diff]) return [x for x in commits.split("\n") if x] def tree_is_dirty(): """Return true if the current working tree is dirty (i.e., if any file has been added, deleted, modified, renamed or copied but not committed).""" - stdout = execute("git status --porcelain") + stdout = execute(["git", "status", "--porcelain"]) for line in stdout: if re.findall(r"[URMADC]{1}", line[:2]): return True @@ -246,7 +251,7 @@ def tree_is_dirty(): def get_head(): """Return commit hash of current HEAD.""" - stdout = execute("git rev-parse HEAD") + stdout = execute(["git", "rev-parse", "HEAD"]) return stdout.strip('\n') @@ -285,7 +290,7 @@ def find_sims(symbol, ignore, defined=[]): def get_files(): """Return a list of all files in the current git directory.""" # use 'git ls-files' to get the worklist - stdout = execute("git ls-files") + stdout = execute(["git", "ls-files"]) if len(stdout) > 0 and stdout[-1] == "\n": stdout = stdout[:-1] -- cgit v1.1 From 2d187d58553becd61677a2db0181ff2c7b07c8a3 Mon Sep 17 00:00:00 2001 From: Alexander Kapshuk Date: Mon, 22 Aug 2016 21:19:17 +0300 Subject: ver_linux: complete awk implementation The algorithm that extracts the version number of the utility being queried, and prints the name of the utility and its version number is currently implemented in awk. The code is used throughout the script, making its use repetative. The proposed implementation confines the algorithm in question to a function, which makes the script easier to read overall, as well as considerably reduces the number of lines of code. Every attempt has been made to retain the look and the format generated by the current implementation. Signed-off-by: Alexander Kapshuk Signed-off-by: Greg Kroah-Hartman --- scripts/ver_linux.awk | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100755 scripts/ver_linux.awk (limited to 'scripts') diff --git a/scripts/ver_linux.awk b/scripts/ver_linux.awk new file mode 100755 index 0000000..430b201 --- /dev/null +++ b/scripts/ver_linux.awk @@ -0,0 +1,89 @@ +#!/bin/awk -f +# Before running this script please ensure that your PATH is +# typical as you use for compilation/installation. I use +# /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may +# differ on your system. + +BEGIN { + usage = "If some fields are empty or look unusual you may have an old version.\n" + usage = usage "Compare to the current minimal requirements in Documentation/Changes.\n" + print usage + + system("uname -a") + printf("\n") + + printversion("GNU C", version("gcc -dumpversion 2>&1")) + printversion("GNU Make", version("make --version 2>&1")) + printversion("Binutils", version("ld -v 2>&1")) + printversion("Util-linux", version("mount --version 2>&1")) + printversion("Mount", version("mount --version 2>&1")) + printversion("Module-init-tools", version("depmod -V 2>&1")) + printversion("E2fsprogs", version("tune2fs 2>&1")) + printversion("Jfsutils", version("fsck.jfs -V 2>&1")) + printversion("Reiserfsprogs", version("reiserfsck -V 2>&1")) + printversion("Reiser4fsprogs", version("fsck.reiser4 -V 2>&1")) + printversion("Xfsprogs", version("xfs_db -V 2>&1")) + printversion("Pcmciautils", version("pccardctl -V 2>&1")) + printversion("Pcmcia-cs", version("cardmgr -V 2>&1")) + printversion("Quota-tools", version("quota -V 2>&1")) + printversion("PPP", version("pppd --version 2>&1")) + printversion("Isdn4k-utils", version("isdnctrl 2>&1")) + printversion("Nfs-utils", version("showmount --version 2>&1")) + + if (system("test -r /proc/self/maps") == 0) { + while (getline <"/proc/self/maps" > 0) { + n = split($0, procmaps, "/") + if (/libc.*so$/ && match(procmaps[n], /[0-9]+([.]?[0-9]+)+/)) { + ver = substr(procmaps[n], RSTART, RLENGTH) + printversion("Linux C Library", ver) + break + } + } + } + + printversion("Dynamic linker (ldd)", version("ldd --version 2>&1")) + + while ("ldconfig -p 2>/dev/null" | getline > 0) { + if (/(libg|stdc)[+]+\.so/) { + libcpp = $NF + break + } + } + if (system("test -r " libcpp) == 0) + printversion("Linux C++ Library", version("readlink " libcpp)) + + printversion("Procps", version("ps --version 2>&1")) + printversion("Net-tools", version("ifconfig --version 2>&1")) + printversion("Kbd", version("loadkeys -V 2>&1")) + printversion("Console-tools", version("loadkeys -V 2>&1")) + printversion("Oprofile", version("oprofiled --version 2>&1")) + printversion("Sh-utils", version("expr --v 2>&1")) + printversion("Udev", version("udevadm --version 2>&1")) + printversion("Wireless-tools", version("iwconfig --version 2>&1")) + + if (system("test -r /proc/modules") == 0) { + while ("sort /proc/modules" | getline > 0) { + mods = mods sep $1 + sep = " " + } + printversion("Modules Loaded", mods) + } +} + +function version(cmd, ver) { + while (cmd | getline > 0) { + if (!/ver_linux/ && match($0, /[0-9]+([.]?[0-9]+)+/)) { + ver = substr($0, RSTART, RLENGTH) + break + } + } + close(cmd) + return ver +} + +function printversion(name, value, ofmt) { + if (value != "") { + ofmt = "%-20s\t%s\n" + printf(ofmt, name, value) + } +} -- cgit v1.1 From b88396e41794dc3873d9a819f374d369356a6cc6 Mon Sep 17 00:00:00 2001 From: Alexander Kapshuk Date: Mon, 22 Aug 2016 21:19:18 +0300 Subject: ver_linux: shell implementation removed The shell implementation removed. To be replaced with an all-awk implementation via consecutive patch. Signed-off-by: Alexander Kapshuk Signed-off-by: Greg Kroah-Hartman --- scripts/ver_linux | 193 ------------------------------------------------------ 1 file changed, 193 deletions(-) delete mode 100755 scripts/ver_linux (limited to 'scripts') diff --git a/scripts/ver_linux b/scripts/ver_linux deleted file mode 100755 index 0d8bd29..0000000 --- a/scripts/ver_linux +++ /dev/null @@ -1,193 +0,0 @@ -#!/bin/sh -# Before running this script please ensure that your PATH is -# typical as you use for compilation/installation. I use -# /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may -# differ on your system. -# -echo 'If some fields are empty or look unusual you may have an old version.' -echo 'Compare to the current minimal requirements in Documentation/Changes.' -echo ' ' - -uname -a -echo ' ' - -gcc -dumpversion 2>&1 | -awk '/[0-9]+([.]?[0-9]+)+/ && !/not found$/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("GNU C\t\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -make --version 2>&1 | -awk '/GNU Make/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("GNU Make\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -ld -v 2>&1 | -awk '/[0-9]+([.]?[0-9]+)+/ && !/not found$/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Binutils\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -mount --version 2>&1 | -awk '/[0-9]+([.]?[0-9]+)+/ && !/not found$/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - $0 = substr($0,RSTART,RLENGTH) - printf("Util-linux\t\t%s\nMount\t\t\t%s\n",$0,$0) -}' - -depmod -V 2>&1 | -awk '/[0-9]+([.]?[0-9]+)+/ && !/not found$/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Module-init-tools\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -tune2fs 2>&1 | -awk '/^tune2fs/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("E2fsprogs\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -fsck.jfs -V 2>&1 | -awk '/version/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Jfsutils\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -reiserfsck -V 2>&1 | -awk '/^reiserfsck/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Reiserfsprogs\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -fsck.reiser4 -V 2>&1 | grep ^fsck.reiser4 | awk \ -'NR==1{print "reiser4progs ", $2}' - -xfs_db -V 2>&1 | -awk '/version/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Xfsprogs\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -pccardctl -V 2>&1 | -awk '/pcmciautils/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Pcmciautils\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -cardmgr -V 2>&1| grep version | awk \ -'NR==1{print "pcmcia-cs ", $3}' - -quota -V 2>&1 | -awk '/version/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Quota-tools\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -pppd --version 2>&1 | -awk '/version/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("PPP\t\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -isdnctrl 2>&1 | grep version | awk \ -'NR==1{print "isdn4k-utils ", $NF}' - -showmount --version 2>&1 | grep nfs-utils | awk \ -'NR==1{print "nfs-utils ", $NF}' - -test -r /proc/self/maps && -sed ' - /.*libc-\(.*\)\.so$/!d - s//Linux C Library\t\t\1/ - q -' /proc/self/maps - -ldd --version 2>&1 | -awk '/^ldd/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Dynamic linker (ldd)\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -libcpp=`ldconfig -p 2>/dev/null | - awk '/(libg|stdc)[+]+\.so/ { - print $NF - exit - } -'` -test -r "$libcpp" && -ls -l $libcpp | -sed ' - s!.*so\.!! - s!^!Linux C++ Library\t! -' -ps --version 2>&1 | -awk '/version/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Procps\t\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -ifconfig --version 2>&1 | -awk '/tools/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Net-tools\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -loadkeys -V 2>&1 | -awk '/[0-9]+([.]?[0-9]+)+/ && !/not found$/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - $0 = substr($0,RSTART,RLENGTH) - printf("Kbd\t\t\t%s\nConsole-tools\t\t%s\n",$0,$0) -}' - -oprofiled --version 2>&1 | awk \ -'(NR==1 && ($2 == "oprofile")) {print "oprofile ", $3}' - -expr --v 2>&1 | -awk '/^expr/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Sh-utils\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -udevadm --version 2>&1 | -awk '/[0-9]+([.]?[0-9]+)+/ && !/not found$/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Udev\t\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -iwconfig --version 2>&1 | -awk '/version/{ - match($0, /[0-9]+([.]?[0-9]+)+/) - printf("Wireless-tools\t\t%s\n", - substr($0,RSTART,RLENGTH)) -}' - -test -e /proc/modules && -sort /proc/modules | -sed ' - s/ .*// - H -${ - g - s/^\n/Modules Loaded\t\t/ - y/\n/ / - q -} - d -' -- cgit v1.1 From 9b9e7d36bdeef2842fd53b2172e95a264c27d362 Mon Sep 17 00:00:00 2001 From: Alexander Kapshuk Date: Mon, 22 Aug 2016 21:19:19 +0300 Subject: ver_linux: rename ver_linux.awk to ver_linux ver_linux.awk renamed to ver_linux. Signed-off-by: Alexander Kapshuk Signed-off-by: Greg Kroah-Hartman --- scripts/ver_linux | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/ver_linux.awk | 89 --------------------------------------------------- 2 files changed, 89 insertions(+), 89 deletions(-) create mode 100755 scripts/ver_linux delete mode 100755 scripts/ver_linux.awk (limited to 'scripts') diff --git a/scripts/ver_linux b/scripts/ver_linux new file mode 100755 index 0000000..430b201 --- /dev/null +++ b/scripts/ver_linux @@ -0,0 +1,89 @@ +#!/bin/awk -f +# Before running this script please ensure that your PATH is +# typical as you use for compilation/installation. I use +# /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may +# differ on your system. + +BEGIN { + usage = "If some fields are empty or look unusual you may have an old version.\n" + usage = usage "Compare to the current minimal requirements in Documentation/Changes.\n" + print usage + + system("uname -a") + printf("\n") + + printversion("GNU C", version("gcc -dumpversion 2>&1")) + printversion("GNU Make", version("make --version 2>&1")) + printversion("Binutils", version("ld -v 2>&1")) + printversion("Util-linux", version("mount --version 2>&1")) + printversion("Mount", version("mount --version 2>&1")) + printversion("Module-init-tools", version("depmod -V 2>&1")) + printversion("E2fsprogs", version("tune2fs 2>&1")) + printversion("Jfsutils", version("fsck.jfs -V 2>&1")) + printversion("Reiserfsprogs", version("reiserfsck -V 2>&1")) + printversion("Reiser4fsprogs", version("fsck.reiser4 -V 2>&1")) + printversion("Xfsprogs", version("xfs_db -V 2>&1")) + printversion("Pcmciautils", version("pccardctl -V 2>&1")) + printversion("Pcmcia-cs", version("cardmgr -V 2>&1")) + printversion("Quota-tools", version("quota -V 2>&1")) + printversion("PPP", version("pppd --version 2>&1")) + printversion("Isdn4k-utils", version("isdnctrl 2>&1")) + printversion("Nfs-utils", version("showmount --version 2>&1")) + + if (system("test -r /proc/self/maps") == 0) { + while (getline <"/proc/self/maps" > 0) { + n = split($0, procmaps, "/") + if (/libc.*so$/ && match(procmaps[n], /[0-9]+([.]?[0-9]+)+/)) { + ver = substr(procmaps[n], RSTART, RLENGTH) + printversion("Linux C Library", ver) + break + } + } + } + + printversion("Dynamic linker (ldd)", version("ldd --version 2>&1")) + + while ("ldconfig -p 2>/dev/null" | getline > 0) { + if (/(libg|stdc)[+]+\.so/) { + libcpp = $NF + break + } + } + if (system("test -r " libcpp) == 0) + printversion("Linux C++ Library", version("readlink " libcpp)) + + printversion("Procps", version("ps --version 2>&1")) + printversion("Net-tools", version("ifconfig --version 2>&1")) + printversion("Kbd", version("loadkeys -V 2>&1")) + printversion("Console-tools", version("loadkeys -V 2>&1")) + printversion("Oprofile", version("oprofiled --version 2>&1")) + printversion("Sh-utils", version("expr --v 2>&1")) + printversion("Udev", version("udevadm --version 2>&1")) + printversion("Wireless-tools", version("iwconfig --version 2>&1")) + + if (system("test -r /proc/modules") == 0) { + while ("sort /proc/modules" | getline > 0) { + mods = mods sep $1 + sep = " " + } + printversion("Modules Loaded", mods) + } +} + +function version(cmd, ver) { + while (cmd | getline > 0) { + if (!/ver_linux/ && match($0, /[0-9]+([.]?[0-9]+)+/)) { + ver = substr($0, RSTART, RLENGTH) + break + } + } + close(cmd) + return ver +} + +function printversion(name, value, ofmt) { + if (value != "") { + ofmt = "%-20s\t%s\n" + printf(ofmt, name, value) + } +} diff --git a/scripts/ver_linux.awk b/scripts/ver_linux.awk deleted file mode 100755 index 430b201..0000000 --- a/scripts/ver_linux.awk +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/awk -f -# Before running this script please ensure that your PATH is -# typical as you use for compilation/installation. I use -# /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may -# differ on your system. - -BEGIN { - usage = "If some fields are empty or look unusual you may have an old version.\n" - usage = usage "Compare to the current minimal requirements in Documentation/Changes.\n" - print usage - - system("uname -a") - printf("\n") - - printversion("GNU C", version("gcc -dumpversion 2>&1")) - printversion("GNU Make", version("make --version 2>&1")) - printversion("Binutils", version("ld -v 2>&1")) - printversion("Util-linux", version("mount --version 2>&1")) - printversion("Mount", version("mount --version 2>&1")) - printversion("Module-init-tools", version("depmod -V 2>&1")) - printversion("E2fsprogs", version("tune2fs 2>&1")) - printversion("Jfsutils", version("fsck.jfs -V 2>&1")) - printversion("Reiserfsprogs", version("reiserfsck -V 2>&1")) - printversion("Reiser4fsprogs", version("fsck.reiser4 -V 2>&1")) - printversion("Xfsprogs", version("xfs_db -V 2>&1")) - printversion("Pcmciautils", version("pccardctl -V 2>&1")) - printversion("Pcmcia-cs", version("cardmgr -V 2>&1")) - printversion("Quota-tools", version("quota -V 2>&1")) - printversion("PPP", version("pppd --version 2>&1")) - printversion("Isdn4k-utils", version("isdnctrl 2>&1")) - printversion("Nfs-utils", version("showmount --version 2>&1")) - - if (system("test -r /proc/self/maps") == 0) { - while (getline <"/proc/self/maps" > 0) { - n = split($0, procmaps, "/") - if (/libc.*so$/ && match(procmaps[n], /[0-9]+([.]?[0-9]+)+/)) { - ver = substr(procmaps[n], RSTART, RLENGTH) - printversion("Linux C Library", ver) - break - } - } - } - - printversion("Dynamic linker (ldd)", version("ldd --version 2>&1")) - - while ("ldconfig -p 2>/dev/null" | getline > 0) { - if (/(libg|stdc)[+]+\.so/) { - libcpp = $NF - break - } - } - if (system("test -r " libcpp) == 0) - printversion("Linux C++ Library", version("readlink " libcpp)) - - printversion("Procps", version("ps --version 2>&1")) - printversion("Net-tools", version("ifconfig --version 2>&1")) - printversion("Kbd", version("loadkeys -V 2>&1")) - printversion("Console-tools", version("loadkeys -V 2>&1")) - printversion("Oprofile", version("oprofiled --version 2>&1")) - printversion("Sh-utils", version("expr --v 2>&1")) - printversion("Udev", version("udevadm --version 2>&1")) - printversion("Wireless-tools", version("iwconfig --version 2>&1")) - - if (system("test -r /proc/modules") == 0) { - while ("sort /proc/modules" | getline > 0) { - mods = mods sep $1 - sep = " " - } - printversion("Modules Loaded", mods) - } -} - -function version(cmd, ver) { - while (cmd | getline > 0) { - if (!/ver_linux/ && match($0, /[0-9]+([.]?[0-9]+)+/)) { - ver = substr($0, RSTART, RLENGTH) - break - } - } - close(cmd) - return ver -} - -function printversion(name, value, ofmt) { - if (value != "") { - ofmt = "%-20s\t%s\n" - printf(ofmt, name, value) - } -} -- cgit v1.1