#!/usr/bin/env python3 # Copyright (c) 2019-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 import csv import os from kconfiglib import standard_kconfig def hardenconfig(kconf): kconf.load_config() hardened_kconf_filename = os.path.join(os.environ['ZEPHYR_BASE'], 'scripts', 'kconfig', 'hardened.csv') options = compare_with_hardened_conf(kconf, hardened_kconf_filename) display_results(options) class Option: def __init__(self, name, recommended, current=None, symbol=None): self.name = name self.recommended = recommended self.current = current self.symbol = symbol if current is None: self.result = 'NA' elif recommended == current: self.result = 'PASS' else: self.result = 'FAIL' def compare_with_hardened_conf(kconf, hardened_kconf_filename): options = [] with open(hardened_kconf_filename) as csvfile: csvreader = csv.reader(csvfile) for row in csvreader: if len(row) > 1: name = row[0] recommended = row[1] try: symbol = kconf.syms[name] current = symbol.str_value except KeyError: symbol = None current = None options.append(Option(name=name, current=current, recommended=recommended, symbol=symbol)) for node in kconf.node_iter(): for select in node.selects: if kconf.syms["EXPERIMENTAL"] in select or kconf.syms["DEPRECATED"] in select: options.append(Option(name=node.item.name, current=node.item.str_value, recommended='n', symbol=node.item)) return options def display_results(options): # header print('{:^50}|{:^13}|{:^20}'.format('name', 'current', 'recommended'), end='') print('||{:^28}\n'.format('check result'), end='') print('=' * 116) # results, only printing options that have failed for now. It simplify the readability. # TODO: add command line option to show all results for opt in options: if opt.result == 'FAIL' and opt.symbol.visibility != 0: print('CONFIG_{:<43}|{:^13}|{:^20}'.format( opt.name, opt.current, opt.recommended), end='') print('||{:^28}\n'.format(opt.result), end='') print() def main(): hardenconfig(standard_kconfig()) if __name__ == '__main__': main()