Skip to content

Commit b135db4

Browse files
author
Glenn Snyder
authored
Merge pull request #168 from blackducksoftware/gsnyder/client-sample-for-retrieving-bom-component-vuln-info
adding Client sample for retrieving BOM component vulnerability info
2 parents 74e4f76 + 9604e2f commit b135db4

File tree

1 file changed

+64
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)