2019-05-11 17:33:04 -05:00
|
|
|
require 'rest-client'
|
2019-05-11 18:07:09 -05:00
|
|
|
require 'zlib'
|
|
|
|
require 'json'
|
2019-05-11 17:33:04 -05:00
|
|
|
|
|
|
|
class NvdDownloader
|
|
|
|
attr_accessor :base_url, :years
|
|
|
|
|
|
|
|
MIN_YEAR = '2002'
|
|
|
|
MAX_YEAR = '2019'
|
|
|
|
AVAILABLE_YEARS = (MIN_YEAR..MAX_YEAR).to_a
|
|
|
|
|
|
|
|
def initialize
|
|
|
|
@base_url = "https://nvd.nist.gov/feeds/json/cve/1.0/"
|
|
|
|
@years = self.years
|
|
|
|
end
|
|
|
|
|
|
|
|
def years
|
|
|
|
year = NvdDownloader::AVAILABLE_YEARS.map do |year|
|
|
|
|
[year.to_i, year]
|
|
|
|
end.to_h
|
|
|
|
end
|
|
|
|
|
|
|
|
def year(year)
|
|
|
|
years[year]
|
|
|
|
end
|
|
|
|
|
|
|
|
def get(url)
|
2019-05-11 18:07:09 -05:00
|
|
|
r = RestClient.get "#{base_url}#{url}"
|
|
|
|
r.body if r.code == 200
|
|
|
|
end
|
2019-05-11 17:33:04 -05:00
|
|
|
|
2019-05-11 18:07:09 -05:00
|
|
|
def read_gzip_stream(gzip_stream)
|
|
|
|
io_stream = StringIO.new(gzip_stream)
|
|
|
|
gz = Zlib::GzipReader.new(io_stream)
|
|
|
|
gz.read
|
2019-05-11 17:33:04 -05:00
|
|
|
end
|
|
|
|
|
2019-05-11 18:07:09 -05:00
|
|
|
def parse_json(json_string)
|
|
|
|
JSON.parse(json_string)
|
|
|
|
end
|
2019-05-11 17:33:04 -05:00
|
|
|
end
|