Write-Host "=================================================================================================" Write-Host "Creating Software Bill Of Materials." Write-Host "=================================================================================================" class CSVItem { [string] $FileName = "" [string] $id = "" [string] $name = "" [string] $version = "" [string] $type = "" [string] $issuesCritical = "" [string] $issuesHigh = "" [string] $issuesMedium = "" [string] $issuesLow = "" [string] $dependenciesWithIssues = "" [string] $licenses = "" [string] $projects = "" [string] $license_urls = "" [string] $latestVersion = "" [string] $latestVersionUrl = "" [string] $latestVersionPublishedDate = "" [string] $firstPublishedDate = "" [string] $versionUrl = "" [string] $isDeprecated = "" } function PropagatePackage { param ( [CSVItem[]] $allItems, [string] $name, [string] $version, [string] $type, [string] $progress ) $foundItems = $allItems | Where-Object { ($_.name -eq $name) -and ($_.version -eq $version) -and ($_.type -eq $type)} write-Host "[$progress] - Find $type package info for $name ($version) [$($foundItems.Length)]" if ($type -ne "nuget") { return } $nuget = Find-Package $name -RequiredVersion $version -ProviderName Nuget if ($null -eq $nuget) { return } try { $lastNuget = Find-Package $name -ProviderName Nuget } catch {} foreach ($propagateItem in $foundItems) { $propagateItem.firstPublishedDate = $nuget.metadata["published"] $propagateItem.versionUrl = "https://www.nuget.org/packages/$name/$version" if ($null -ne $lastNuget) { $propagateItem.latestVersion = $lastNuget.Version; $propagateItem.latestVersionPublishedDate = $lastNuget.metadata["published"] $propagateItem.latestVersionUrl = "https://www.nuget.org/packages/$name/$($lastNuget.Version)" } $propagateItem.isDeprecated = ($null -eq $lastNuget) -or ($nuget.metadata["summary"] -like "*Deprecated*") -or ($nuget.metadata["title"] -like "*Deprecated*") -or ($nuget.metadata["tags"] -like "*Deprecated*")-or ($nuget.metadata["description"] -like "*Deprecated*") } return } [string] $date = Get-Date -Format "yyyy-MM-dd HHmm" $fileName = ".\$date snyk_npm_nuget_sbom.csv" Write-Host "-------------------------------------------------------------------------------------------------" Write-Host "Parsing CSV Files.." Write-Host "-------------------------------------------------------------------------------------------------" $csvDependenciesExportPath = "c:\temp\snyk\*.csv" $files = Get-ChildItem $csvDependenciesExportPath [CSVItem[]]$CSVItems = @() foreach($file in $files) { Write-Host $file.FullName $csv = Import-Csv -Path $file.FullName foreach ($csvLine in $csv) { [CSVItem] $CSVItem = [CSVItem]::new() $CSVItem.FileName = $file.Name $CSVItem.id = $csvLine.id $CSVItem.name = $csvLine.name $CSVItem.version = $csvLine.version $CSVItem.type = $csvLine.type $CSVItem.issuesCritical = $csvLine.issuesCritical $CSVItem.issuesHigh = $csvLine.issuesHigh $CSVItem.issuesMedium = $csvLine.issuesMedium $CSVItem.issuesLow = $csvLine.issuesLow $CSVItem.dependenciesWithIssues = $csvLine.dependenciesWithIssues $CSVItem.licenses = $csvLine.licenses $CSVItem.projects = $csvLine.projects $CSVItem.license_urls = $csvLine."license urls" $CSVItem.latestVersion = $csvLine.latestVersion $CSVItem.latestVersionPublishedDate = $csvLine.latestVersionPublishedDate $CSVItem.firstPublishedDate = $csvLine.firstPublishedDate $CSVItem.isDeprecated = $csvLine.isDeprecated $CSVItems += $CSVItem } } Write-Host "-------------------------------------------------------------------------------------------------" Write-Host "Determine objects.." Write-Host "-------------------------------------------------------------------------------------------------" $toDo = $CSVItems | Where-Object { $_.type -eq "nuget" } | Sort-Object -Property version| Sort-Object -Property name $counter = 0 $length = $toDo.Length foreach ($package in $toDo) { $counter = $counter + 1 if ($package.latestVersion -eq "") { PropagatePackage -allItems $CSVItems -name $package.name -type $package.type -version $package.version -progress ("{0:D4}/{1:D4}" -f $counter, $length) } } Write-Host "-------------------------------------------------------------------------------------------------" Write-Host "Saving overview.." Write-Host "-------------------------------------------------------------------------------------------------" $CSVItems | Export-Csv -Path $fileName -NoTypeInformation Write-Host "Done."