summaryrefslogtreecommitdiff
blob: 9fe571a8b72885f3d577137e85414de128fff244 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
require_relative 'glsav1.rb'
require 'date'

class GLSARepository
  include Singleton

  CACHE_SECONDS = 3600
  DATA_PATH     = File.join(File.dirname(__FILE__), '../data/glsa/')

  def initialize
    update!
  end

  def update!
    advisories = {}

    Dir.glob(DATA_PATH + '*.xml').each do |glsa_file|
      f = File.open(glsa_file)
      glsa = Nokogiri::XML(f)
      f.close

      if glsa.root.key? 'version'
        # Future extension: GLSAv2
      else
        begin
          advisories[glsa.root['id']] = GLSAv1.new.parse(glsa)
        rescue
          next
        end
      end
    end

    @load_date = DateTime.now
    @advisories = advisories.freeze
    @latest = advisories.keys.sort.reverse.freeze
  end

  def get
    @advisories
  end

  def latest_ids
    @latest
  end

  def latest(n = 10)
    @latest[0...n].map {|id| @advisories[id] }
  end

  def[](id)
    @advisories[id]
  end

  def has?(id)
    @advisories.has_key? id
  end

  private
  def update?
    if ((DateTime.now - @load_date) * 60 * 60 * 24).to_i > CACHE_SECONDS
      update!
    end
  end
end