Skip to content

Commit a5ed061

Browse files
author
Glenn Snyder
committed
adding Client sample for retrieving BOM component vulnerability info
1 parent 74e4f76 commit a5ed061

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from blackduck import Client
2+
3+
import argparse
4+
5+
import logging
6+
from pprint import pprint
7+
8+
logging.basicConfig(
9+
level=logging.DEBUG,
10+
format="[%(asctime)s] {%(module)s:%(lineno)d} %(levelname)s - %(message)s"
11+
)
12+
13+
parser = argparse.ArgumentParser("Get a specific component and list its vulnerabilities")
14+
parser.add_argument("--base-url", required=True, help="Hub server URL e.g. https://your.blackduck.url")
15+
parser.add_argument("--token-file", dest='token_file', required=True, help="containing access token")
16+
parser.add_argument("--project", dest='project_name', required=True, help="Project that contains the BOM components")
17+
parser.add_argument("--version", dest='version_name', required=True, help="Version that contains the BOM components")
18+
parser.add_argument("--no-verify", dest='verify', action='store_false', help="disable TLS certificate verification")
19+
args = parser.parse_args()
20+
21+
with open(args.token_file, 'r') as tf:
22+
access_token = tf.readline().strip()
23+
24+
bd = Client(base_url=args.base_url, token=access_token, verify=args.verify)
25+
26+
params = {
27+
'q': [f"name:{args.project_name}"]
28+
}
29+
projects = [p for p in bd.get_resource('projects', params=params)]
30+
assert len(projects) == 1, f"There should be one, and only one project named {args.project_name}. We found {len(projects)}"
31+
project = projects[0]
32+
33+
params = {
34+
'q': [f"versionName:{args.version_name}"]
35+
}
36+
versions = [v for v in bd.get_resource('versions', project, params=params) if v['versionName'] == args.version_name]
37+
assert len(versions) == 1, f"There should be one, and only one version named {args.version_name}. We found {len(versions)}"
38+
version = versions[0]
39+
40+
logging.debug(f"Found {project['name']}:{version['versionName']}")
41+
42+
all_bom_component_vulns = []
43+
44+
for bom_component_vuln in bd.get_resource('vulnerable-components', version):
45+
vuln_name = bom_component_vuln['vulnerabilityWithRemediation']['vulnerabilityName']
46+
vuln_source = bom_component_vuln['vulnerabilityWithRemediation']['source']
47+
upgrade_guidance = bd.get_json(f"{bom_component_vuln['componentVersion']}/upgrade-guidance")
48+
bom_component_vuln['upgrade_guidance'] = upgrade_guidance
49+
50+
vuln_details = bd.get_json(f"/api/vulnerabilities/{vuln_name}")
51+
52+
pprint(bd.list_resources(vuln_details))
53+
if 'related-vulnerability' in bd.list_resources(vuln_details):
54+
related_vuln = bd.get_resource("related-vulnerability", vuln_details, items=False)
55+
else:
56+
related_vuln = None
57+
bom_component_vuln['related_vulnerability'] = related_vuln
58+
all_bom_component_vulns.append(bom_component_vuln)
59+
60+
pprint(bom_component_vuln)

0 commit comments

Comments
 (0)