class YAVDB::Database
Public Class Methods
save(database_path, vulns)
click to toggle source
# File lib/yavdb/database.rb, line 23 def self.save(database_path, vulns) vulns_grouped_by_package_manager = group_by_package_manager(vulns) save_to_file(database_path, vulns_grouped_by_package_manager) end
search(database_path, package_manager, package_name)
click to toggle source
# File lib/yavdb/database.rb, line 28 def self.search(database_path, package_manager, package_name) package_file_path = package_path(database_path, package_manager, package_name) if File.exist?(package_file_path) YAVDB::Advisory.load(package_file_path) else [] end end
Private Class Methods
group_by_package_manager(vulns)
click to toggle source
# File lib/yavdb/database.rb, line 42 def group_by_package_manager(vulns) vulns .group_by(&:package_manager) .map do |package_manager, vunerabilities_by_pm| puts "#{package_manager}: #{vunerabilities_by_pm.length}" vunerabilities_by_pm = vunerabilities_by_pm .group_by(&:affected_package) .map do |package, vunerabilities_by_p| [package, vunerabilities_by_p] end.to_h [package_manager, vunerabilities_by_pm] end.to_h end
package_path(database_path, package_manager, package_name)
click to toggle source
# File lib/yavdb/database.rb, line 94 def package_path(database_path, package_manager, package_name) File.expand_path(File.join(database_path, package_manager, "#{package_name}.yml")) end
save_to_file(database_path, vulns)
click to toggle source
# File lib/yavdb/database.rb, line 59 def save_to_file(database_path, vulns) vulns.map do |package_manager, vunerabilities_by_pm| vunerabilities_by_pm.map do |package, vunerabilities_by_p| previous_vulnerabilities = search(database_path, package_manager, package) package_path = package_path(database_path, package_manager, package) package_path_directory = File.dirname(package_path) FileUtils.mkdir_p(package_path_directory) unless File.exist?(package_path_directory) uniq_vunerabilities_by_p = Hash[previous_vulnerabilities.concat(vunerabilities_by_p).map { |vuln| [vuln.id, vuln] }].values next unless uniq_vunerabilities_by_p.any? File.open(package_path, 'wb') do |file| package_vulns_yml_str = uniq_vunerabilities_by_p .sort_by(&:id) .map(&:to_map) .to_yaml( :Indent => 4, :SortKeys => true, :UseHeader => true, :UseVersion => true, :ExplicitTypes => true, :BestWidth => 80, :UseFold => true, :UseBlock => true, :Encoding => :Utf8 ) file.puts(package_vulns_yml_str) end end end end