@@ -185,20 +185,38 @@ def scan_stackablectl(secobserve_api_token: str) -> None:
185185 f"https://github.com/stackabletech/stackable-cockpit/releases/download"
186186 f"/{ version } /{ sbom_name } "
187187 )
188- sbom_path = f"/tmp/stackable/{ sbom_name } "
188+ xml_path = f"/tmp/stackable/{ sbom_name } "
189189
190190 request = urllib .request .Request (download_url )
191191 request .add_header ("User-Agent" , "stack-scanner" )
192192 try :
193193 with urllib .request .urlopen (request ) as response :
194- with open (sbom_path , "wb" ) as f :
194+ with open (xml_path , "wb" ) as f :
195195 f .write (response .read ())
196- print (f"Downloaded SBOM to { sbom_path } " )
196+ print (f"Downloaded SBOM to { xml_path } " )
197197 except urllib .error .URLError as error :
198198 print (f"Failed to download SBOM { sbom_name } : { error } " )
199199 continue
200200
201- scan_sbom (secobserve_api_token , sbom_name , "stackablectl" , version )
201+ # Trivy does not support CycloneDX XML, so convert to JSON first.
202+ json_name = sbom_name .replace (".cdx.xml" , ".cdx.json" )
203+ json_path = f"/tmp/stackable/{ json_name } "
204+ result = subprocess .run (
205+ [
206+ "cyclonedx" , "convert" ,
207+ "--input-file" , xml_path ,
208+ "--input-format" , "xml" ,
209+ "--output-file" , json_path ,
210+ "--output-format" , "json" ,
211+ "--output-version" , "v1_5" ,
212+ ],
213+ )
214+ if result .returncode != 0 :
215+ print (f"Failed to convert { sbom_name } from XML to JSON" )
216+ continue
217+ print (f"Converted { xml_path } to { json_path } " )
218+
219+ scan_sbom (secobserve_api_token , json_name , "stackablectl" , version )
202220
203221
204222def _build_base_env (secobserve_api_token : str , product_name : str , branch_name : str ) -> dict :
0 commit comments