gen_sbom.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import argparse
  2. import json
  3. import os
  4. def deduce_name(path):
  5. name = os.path.basename(path)
  6. for prefix in ['contrib/libs/', 'contrib/python/py2/', 'contrib/python/py3/', 'contrib/python/']:
  7. if path.startswith(prefix):
  8. name = path[len(prefix):].replace('/', '-')
  9. break
  10. return name
  11. def main():
  12. parser = argparse.ArgumentParser(description='Generate single SBOM component JSON object for current third-party library')
  13. parser.add_argument('-o', '--output', type=argparse.FileType('w', encoding='UTF-8'), help='resulting SBOM component file', required=True)
  14. parser.add_argument('--type', choices=['library', 'toolchain'], required=True)
  15. parser.add_argument('--path', type=str, help='Path to module in arcadia', required=True)
  16. parser.add_argument('--ver', type=str, help='Version of the contrib module', required=True)
  17. parser.add_argument('--lang', type=str, help='Language of the library')
  18. parser.add_argument('--toolchain-name', type=str, help='Public name of the toolchain')
  19. args = parser.parse_args()
  20. res = {}
  21. res['version'] = args.ver
  22. res["properties"] = [
  23. {'name': 'arcadia_module_subdir', 'value': args.path},
  24. ]
  25. if args.type == 'library':
  26. res['name'] = deduce_name(args.path)
  27. res['type'] = 'library'
  28. res["properties"].append({'name': 'language', 'value': args.lang})
  29. elif args.type == 'toolchain':
  30. res['name'] = args.toolchain_name
  31. res['type'] = 'application'
  32. res["tags"] = ['toolchain']
  33. json.dump(res, args.output)
  34. args.output.close()
  35. if __name__ == '__main__':
  36. main()