1#!/usr/bin/env python3 2 3# Copyright (c) 2019 Intel Corporation 4# SPDX-License-Identifier: Apache-2.0 5 6import csv 7import os 8 9from kconfiglib import standard_kconfig 10 11 12def hardenconfig(kconf): 13 kconf.load_config() 14 15 hardened_kconf_filename = os.path.join(os.environ['ZEPHYR_BASE'], 16 'scripts', 'kconfig', 'hardened.csv') 17 18 options = compare_with_hardened_conf(kconf, hardened_kconf_filename) 19 20 display_results(options) 21 22 23class Option: 24 25 def __init__(self, name, recommended, current=None, symbol=None): 26 self.name = name 27 self.recommended = recommended 28 self.current = current 29 self.symbol = symbol 30 31 if current is None: 32 self.result = 'NA' 33 elif recommended == current: 34 self.result = 'PASS' 35 else: 36 self.result = 'FAIL' 37 38 39def compare_with_hardened_conf(kconf, hardened_kconf_filename): 40 options = [] 41 42 with open(hardened_kconf_filename) as csvfile: 43 csvreader = csv.reader(csvfile) 44 for row in csvreader: 45 if len(row) > 1: 46 name = row[0] 47 recommended = row[1] 48 try: 49 symbol = kconf.syms[name] 50 current = symbol.str_value 51 except KeyError: 52 symbol = None 53 current = None 54 options.append(Option(name=name, current=current, 55 recommended=recommended, symbol=symbol)) 56 return options 57 58 59def display_results(options): 60 # header 61 print('{:^50}|{:^13}|{:^20}'.format('name', 'current', 'recommended'), end='') 62 print('||{:^28}\n'.format('check result'), end='') 63 print('=' * 116) 64 65 # results, only printing options that have failed for now. It simplify the readability. 66 # TODO: add command line option to show all results 67 for opt in options: 68 if opt.result == 'FAIL' and opt.symbol.visibility != 0: 69 print('CONFIG_{:<43}|{:^13}|{:^20}'.format( 70 opt.name, opt.current, opt.recommended), end='') 71 print('||{:^28}\n'.format(opt.result), end='') 72 print() 73 74 75def main(): 76 hardenconfig(standard_kconfig()) 77 78 79if __name__ == '__main__': 80 main() 81