@@ -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