Skip to content

Commit 2528df7

Browse files
committed
Add a --fail-on-vulnerabilities in check-compliance command
Signed-off-by: tdruez <tdruez@nexb.com>
1 parent 6c07b78 commit 2528df7

1 file changed

Lines changed: 48 additions & 14 deletions

File tree

scanpipe/management/commands/check-compliance.py

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,21 @@ def add_arguments(self, parser):
4545
"non-zero status. Default is ERROR."
4646
),
4747
)
48+
parser.add_argument(
49+
"--fail-on-vulnerabilities",
50+
action="store_true",
51+
help=(
52+
"Exit with a non-zero status if known vulnerabilities are detected in "
53+
"discovered packages and dependencies. "
54+
"Requires the `find_vulnerabilities` pipeline to be executed "
55+
"beforehand."
56+
),
57+
)
4858

4959
def handle(self, *args, **options):
5060
super().handle(*args, **options)
61+
exit_code = 0
62+
5163
fail_level = options["fail_level"]
5264
compliance_alerts = get_project_compliance_alerts(self.project, fail_level)
5365

@@ -56,20 +68,42 @@ def handle(self, *args, **options):
5668
for model_alerts in compliance_alerts.values()
5769
for issues_by_severity in model_alerts.values()
5870
)
59-
if not compliance_alerts_count:
60-
sys.exit(0)
6171

62-
if self.verbosity > 0:
63-
msg = [
64-
f"{compliance_alerts_count} compliance issues detected on this project."
65-
]
66-
for label, issues in compliance_alerts.items():
67-
msg.append(f"[{label}]")
68-
for severity, entries in issues.items():
69-
msg.append(f" > {severity.upper()}: {len(entries)}")
70-
if self.verbosity > 1:
71-
msg.append(" " + "\n ".join(entries))
72+
if compliance_alerts_count:
73+
exit_code = 1
74+
if self.verbosity > 0:
75+
msg = [
76+
f"{compliance_alerts_count} compliance issues detected on this "
77+
f"project."
78+
]
79+
for label, issues in compliance_alerts.items():
80+
msg.append(f"[{label}]")
81+
for severity, entries in issues.items():
82+
msg.append(f" > {severity.upper()}: {len(entries)}")
83+
if self.verbosity > 1:
84+
msg.append(" " + "\n ".join(entries))
85+
86+
self.stderr.write("\n".join(msg))
87+
88+
if options["fail_on_vulnerabilities"]:
89+
if self.handle_vulnerabilities():
90+
exit_code = 1
91+
92+
sys.exit(exit_code)
93+
94+
def handle_vulnerabilities(self):
95+
packages_qs = self.project.discoveredpackages.vulnerable()
96+
dependencies_qs = self.project.discovereddependencies.vulnerable()
97+
vulnerability_count = packages_qs.count() + dependencies_qs.count()
7298

73-
self.stderr.write("\n".join(msg))
99+
if vulnerability_count:
100+
if self.verbosity > 0:
101+
self.stderr.write(f"{vulnerability_count} vulnerabilities found:")
102+
for entry in [*packages_qs, *dependencies_qs]:
103+
self.stderr.write(str(entry))
104+
return True
74105

75-
sys.exit(1)
106+
else:
107+
if self.verbosity > 0:
108+
self.stdout.write("No vulnerabilities found")
109+
return False

0 commit comments

Comments
 (0)