Skip to content

Commit 83fcbcd

Browse files
authored
Parse definitions from OVAL report (#32)
1 parent 34c5253 commit 83fcbcd

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

lib/openscap_parser/oval_report.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22
require 'openscap_parser/xml_file'
33
require 'oval/definition_result'
4+
require 'oval/definition'
45

56
module OpenscapParser
67
class OvalReport < XmlFile
@@ -11,5 +12,13 @@ def definition_results
1112
def definition_result_nodes(xpath = "./oval_results/results/system/definitions/definition")
1213
xpath_nodes(xpath)
1314
end
15+
16+
def definitions
17+
@definitions ||= definition_nodes.map { |node| Oval::Definition.new parsed_xml: node }
18+
end
19+
20+
def definition_nodes(xpath = "./oval_results/oval_definitions/definitions/definition")
21+
xpath_nodes(xpath)
22+
end
1423
end
1524
end

lib/oval/definition.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
require "openscap_parser/xml_node"
2+
require "oval/reference"
3+
4+
module Oval
5+
class Definition < ::OpenscapParser::XmlNode
6+
def id
7+
@id ||= @parsed_xml['id']
8+
end
9+
10+
def version
11+
@version ||= @parsed_xml['version']
12+
end
13+
14+
def klass
15+
@klass ||= @parsed_xml['class']
16+
end
17+
18+
def title
19+
xml = @parsed_xml.at_xpath("./metadata/title")
20+
@title ||= xml && xml.text
21+
end
22+
23+
def description
24+
xml = @parsed_xml.at_xpath("./metadata/description")
25+
@description ||= xml && xml.text
26+
end
27+
28+
def reference_nodes
29+
@reference_nodes ||= @parsed_xml.xpath("./metadata/reference")
30+
end
31+
32+
def references
33+
@references ||= reference_nodes.map { |node| Reference.new parsed_xml: node }
34+
end
35+
36+
def to_h
37+
{
38+
:id => id,
39+
:version => version,
40+
:klass => klass,
41+
:title => title,
42+
:description => description,
43+
:references => references.map(&:to_h)
44+
}
45+
end
46+
end
47+
end

lib/oval/reference.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
require "openscap_parser/xml_node"
2+
3+
module Oval
4+
class Reference < ::OpenscapParser::XmlNode
5+
def source
6+
@source ||= @parsed_xml['source']
7+
end
8+
9+
def ref_id
10+
@ref_id ||= @parsed_xml['ref_id']
11+
end
12+
13+
def ref_url
14+
@ref_url ||= @parsed_xml['ref_url']
15+
end
16+
17+
def to_h
18+
{ :source => source, :ref_id => ref_id, :ref_url => ref_url }
19+
end
20+
end
21+
end

test/openscap_parser/oval_report_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,18 @@ def setup
1818
results = OpenscapParser::OvalReport.new(@invalid_report).definition_results
1919
assert results.empty?
2020
end
21+
22+
test 'should parse definitions' do
23+
defs = OpenscapParser::OvalReport.new(@valid_report).definitions
24+
refute defs.empty?
25+
assert defs.last.id
26+
assert defs.last.title
27+
assert defs.last.description
28+
refute_empty defs.last.references
29+
end
30+
31+
test 'should return no definitions for invalid file' do
32+
defs = OpenscapParser::OvalReport.new(@invalid_report).definitions
33+
assert defs.empty?
34+
end
2135
end

0 commit comments

Comments
 (0)