hardenconfig.py 2.2 KB

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