openscap_parser 0.1.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Dockerfile +15 -0
- data/README.md +32 -10
- data/Rakefile +2 -0
- data/lib/openscap_parser.rb +14 -35
- data/lib/openscap_parser/benchmark.rb +38 -0
- data/lib/openscap_parser/benchmarks.rb +21 -0
- data/lib/openscap_parser/datastream_file.rb +15 -0
- data/lib/openscap_parser/fix.rb +55 -0
- data/lib/openscap_parser/fixes.rb +21 -0
- data/lib/openscap_parser/oval_report.rb +24 -0
- data/lib/openscap_parser/profile.rb +31 -0
- data/lib/openscap_parser/profiles.rb +7 -12
- data/lib/openscap_parser/rule.rb +51 -10
- data/lib/openscap_parser/rule_identifier.rb +21 -0
- data/lib/openscap_parser/rule_reference.rb +14 -0
- data/lib/openscap_parser/rule_references.rb +32 -0
- data/lib/openscap_parser/rule_result.rb +31 -2
- data/lib/openscap_parser/rule_results.rb +21 -0
- data/lib/openscap_parser/rules.rb +9 -8
- data/lib/openscap_parser/selectors.rb +9 -0
- data/lib/openscap_parser/set_value.rb +18 -0
- data/lib/openscap_parser/set_values.rb +21 -0
- data/lib/openscap_parser/sub.rb +18 -0
- data/lib/openscap_parser/subs.rb +38 -0
- data/lib/openscap_parser/tailoring.rb +27 -0
- data/lib/openscap_parser/tailoring_file.rb +15 -0
- data/lib/openscap_parser/tailorings.rb +22 -0
- data/lib/openscap_parser/test_result.rb +62 -0
- data/lib/openscap_parser/test_result_file.rb +12 -0
- data/lib/openscap_parser/test_results.rb +19 -0
- data/lib/openscap_parser/util.rb +10 -0
- data/lib/openscap_parser/version.rb +1 -1
- data/lib/openscap_parser/xml_file.rb +13 -0
- data/lib/openscap_parser/xml_node.rb +36 -0
- data/lib/oval/definition.rb +47 -0
- data/lib/oval/definition_result.rb +17 -0
- data/lib/oval/reference.rb +21 -0
- data/lib/railtie.rb +15 -0
- data/lib/ssg.rb +5 -0
- data/lib/ssg/downloader.rb +94 -0
- data/lib/ssg/unarchiver.rb +34 -0
- data/lib/tasks/ssg.rake +33 -0
- data/openscap_parser.gemspec +13 -10
- metadata +94 -14
- data/lib/openscap_parser/xml_report.rb +0 -25
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RuleIdentifier interface as an object
|
4
|
+
module OpenscapParser
|
5
|
+
class RuleIdentifier < XmlNode
|
6
|
+
def label
|
7
|
+
@label ||= @parsed_xml && @parsed_xml.text
|
8
|
+
end
|
9
|
+
|
10
|
+
def system
|
11
|
+
@system ||= @parsed_xml && @parsed_xml['system']
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_h
|
15
|
+
{
|
16
|
+
:label => label,
|
17
|
+
:system => system
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RuleReference interface as an object
|
4
|
+
module OpenscapParser
|
5
|
+
class RuleReference < XmlNode
|
6
|
+
def href
|
7
|
+
@href ||= @parsed_xml && @parsed_xml['href']
|
8
|
+
end
|
9
|
+
|
10
|
+
def label
|
11
|
+
@label ||= @parsed_xml && @parsed_xml.text
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openscap_parser/xml_file'
|
4
|
+
require 'openscap_parser/rule_reference'
|
5
|
+
|
6
|
+
module OpenscapParser
|
7
|
+
# Methods related to finding and saving rule references
|
8
|
+
module RuleReferences
|
9
|
+
def self.included(base)
|
10
|
+
base.class_eval do
|
11
|
+
def rule_reference_strings
|
12
|
+
@rule_reference_strings ||= rule_references.map do |rr|
|
13
|
+
"#{rr.label}#{rr.href}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def rule_references
|
18
|
+
@rule_references ||= rule_reference_nodes.map do |node|
|
19
|
+
OpenscapParser::RuleReference.new(parsed_xml: node)
|
20
|
+
end.uniq do |reference|
|
21
|
+
[reference.label, reference.href]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
alias :references :rule_references
|
25
|
+
|
26
|
+
def rule_reference_nodes(xpath = ".//Rule/reference")
|
27
|
+
xpath_nodes(xpath)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,8 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module OpenscapParser
|
4
|
-
class RuleResult
|
5
|
-
|
4
|
+
class RuleResult < XmlNode
|
5
|
+
def id
|
6
|
+
@id ||= parsed_xml['idref']
|
7
|
+
end
|
8
|
+
|
9
|
+
def time
|
10
|
+
@time ||= parsed_xml['time']
|
11
|
+
end
|
12
|
+
|
13
|
+
def severity
|
14
|
+
@severity ||= parsed_xml['severity']
|
15
|
+
end
|
16
|
+
|
17
|
+
def weight
|
18
|
+
@weight ||= parsed_xml['weight']
|
19
|
+
end
|
20
|
+
|
21
|
+
def result
|
22
|
+
@result ||= parsed_xml.at_xpath('result') &&
|
23
|
+
parsed_xml.at_xpath('result').text || ''
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_h
|
27
|
+
{
|
28
|
+
:id => id,
|
29
|
+
:time => time,
|
30
|
+
:severity => severity,
|
31
|
+
:weight => weight,
|
32
|
+
:result => result
|
33
|
+
}
|
34
|
+
end
|
6
35
|
end
|
7
36
|
end
|
8
37
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openscap_parser/rule_result'
|
4
|
+
|
5
|
+
module OpenscapParser
|
6
|
+
module RuleResults
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
def rule_result_nodes
|
10
|
+
@rule_result_nodes ||= parsed_xml.xpath('rule-result')
|
11
|
+
end
|
12
|
+
|
13
|
+
def rule_results
|
14
|
+
rule_result_nodes.map do |node|
|
15
|
+
RuleResult.new(parsed_xml: node)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,21 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'openscap_parser/rule'
|
4
|
+
|
3
5
|
module OpenscapParser
|
4
6
|
# Methods related to parsing rules
|
5
7
|
module Rules
|
6
8
|
def self.included(base)
|
7
9
|
base.class_eval do
|
8
|
-
def rule_ids
|
9
|
-
test_result_node.xpath('.//xmlns:rule-result/@idref').map(&:value)
|
10
|
-
end
|
11
|
-
|
12
10
|
def rule_objects
|
13
|
-
|
14
|
-
|
15
|
-
@rule_objects ||= @report_xml.search('Rule').map do |rule|
|
16
|
-
Rule.new(rule_xml: rule)
|
11
|
+
@rule_objects ||= rule_nodes.map do |rule_node|
|
12
|
+
Rule.new(parsed_xml: rule_node)
|
17
13
|
end
|
18
14
|
end
|
15
|
+
alias :rules :rule_objects
|
16
|
+
|
17
|
+
def rule_nodes(xpath = ".//Rule")
|
18
|
+
xpath_nodes(xpath)
|
19
|
+
end
|
19
20
|
end
|
20
21
|
end
|
21
22
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'openscap_parser/xml_node'
|
3
|
+
|
4
|
+
module OpenscapParser
|
5
|
+
class SetValue < XmlNode
|
6
|
+
def id
|
7
|
+
@id ||= @parsed_xml['idref']
|
8
|
+
end
|
9
|
+
|
10
|
+
def text
|
11
|
+
@text ||= @parsed_xml.text
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_h
|
15
|
+
{ :id => id, :text => text }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openscap_parser/set_value'
|
4
|
+
|
5
|
+
module OpenscapParser
|
6
|
+
module SetValues
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
def set_values
|
10
|
+
@set_values ||= set_value_nodes.map do |set_value_node|
|
11
|
+
OpenscapParser::SetValue.new(parsed_xml: set_value_node)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def set_value_nodes(xpath = ".//set-value")
|
16
|
+
xpath_nodes(xpath)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'openscap_parser/xml_node'
|
3
|
+
|
4
|
+
module OpenscapParser
|
5
|
+
class Sub < XmlNode
|
6
|
+
def id
|
7
|
+
@id ||= @parsed_xml['idref']
|
8
|
+
end
|
9
|
+
|
10
|
+
def use
|
11
|
+
@use ||= @parsed_xml['use']
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_h
|
15
|
+
{ :id => id, :text => text, :use => use }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openscap_parser/sub'
|
4
|
+
|
5
|
+
module OpenscapParser
|
6
|
+
module Subs
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
def subs
|
10
|
+
return [] unless sub_nodes
|
11
|
+
@subs ||= sub_nodes.map do |xml|
|
12
|
+
Sub.new(parsed_xml: xml)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def sub_nodes(xpath = './/sub')
|
17
|
+
@sub_nodes ||= xpath_nodes(xpath)
|
18
|
+
end
|
19
|
+
|
20
|
+
def map_sub_nodes(children, set_values)
|
21
|
+
children.map do |child|
|
22
|
+
next child if child.name == 'text'
|
23
|
+
next replace_sub(Sub.new(parsed_xml: child), set_values) if child.name == 'sub'
|
24
|
+
child
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def replace_sub(sub, set_values)
|
31
|
+
set_value = set_values.find { |set_value| set_value.id == sub.id }
|
32
|
+
return unless set_value
|
33
|
+
set_value.parsed_xml.children.first
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Mimics openscap-ruby Rule interface
|
4
|
+
module OpenscapParser
|
5
|
+
class Tailoring < XmlNode
|
6
|
+
include OpenscapParser::Profiles
|
7
|
+
|
8
|
+
def id
|
9
|
+
@id ||= @parsed_xml['id']
|
10
|
+
end
|
11
|
+
|
12
|
+
def benchmark
|
13
|
+
@benchmark ||= @parsed_xml.at_xpath('benchmark/@href') &&
|
14
|
+
@parsed_xml.at_xpath('benchmark/@href').text
|
15
|
+
end
|
16
|
+
|
17
|
+
def version
|
18
|
+
@version ||= @parsed_xml.at_xpath('version') &&
|
19
|
+
@parsed_xml.at_xpath('version').text
|
20
|
+
end
|
21
|
+
|
22
|
+
def version_time
|
23
|
+
@version_time ||= @parsed_xml.at_xpath('version/@time') &&
|
24
|
+
@parsed_xml.at_xpath('version/@time').text
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openscap_parser/tailorings'
|
4
|
+
|
5
|
+
module OpenscapParser
|
6
|
+
# A class to represent a tailoring XmlFile
|
7
|
+
class TailoringFile < XmlFile
|
8
|
+
include OpenscapParser::Tailorings
|
9
|
+
|
10
|
+
def valid?
|
11
|
+
return true if @parsed_xml.root.name == 'Tailoring' && namespaces.keys.include?('xmlns:xccdf')
|
12
|
+
false
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openscap_parser/tailoring'
|
4
|
+
|
5
|
+
module OpenscapParser
|
6
|
+
# Methods related to parsing Xccdf Tailoring types
|
7
|
+
module Tailorings
|
8
|
+
def self.included(base)
|
9
|
+
base.class_eval do
|
10
|
+
def tailoring
|
11
|
+
@tailoring ||= OpenscapParser::Tailoring.new(
|
12
|
+
parsed_xml: tailoring_node
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def tailoring_node(xpath = ".//Tailoring")
|
17
|
+
xpath_node(xpath)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openscap_parser/rule_results'
|
4
|
+
require 'openscap_parser/selectors'
|
5
|
+
|
6
|
+
module OpenscapParser
|
7
|
+
class TestResult < XmlNode
|
8
|
+
include OpenscapParser::RuleResults
|
9
|
+
include OpenscapParser::Selectors
|
10
|
+
|
11
|
+
def target
|
12
|
+
@target ||= parsed_xml.at_xpath('target') &&
|
13
|
+
parsed_xml.at_xpath('target').text || ''
|
14
|
+
end
|
15
|
+
alias :host :target
|
16
|
+
|
17
|
+
def target_fact_nodes
|
18
|
+
@target_fact_nodes ||= parsed_xml.xpath('target-facts/fact')
|
19
|
+
end
|
20
|
+
|
21
|
+
def platform_nodes
|
22
|
+
@platform_nodes ||= parsed_xml.xpath('platform')
|
23
|
+
end
|
24
|
+
|
25
|
+
def title
|
26
|
+
@title ||= parsed_xml.at_xpath('title') &&
|
27
|
+
parsed_xml.at_xpath('title').text || ''
|
28
|
+
end
|
29
|
+
|
30
|
+
def identity
|
31
|
+
@identity ||= parsed_xml.at_xpath('identity') &&
|
32
|
+
parsed_xml.at_xpath('identity').text || ''
|
33
|
+
end
|
34
|
+
|
35
|
+
def profile_id
|
36
|
+
@profile_id ||= parsed_xml.at_xpath('profile') &&
|
37
|
+
parsed_xml.at_xpath('profile')['idref'] || ''
|
38
|
+
end
|
39
|
+
|
40
|
+
def benchmark_id
|
41
|
+
@benchmark_id ||= parsed_xml.at_xpath('benchmark') &&
|
42
|
+
parsed_xml.at_xpath('benchmark')['id'] || ''
|
43
|
+
end
|
44
|
+
|
45
|
+
def set_value_nodes
|
46
|
+
@set_value_nodes ||= parsed_xml.xpath('set-value')
|
47
|
+
end
|
48
|
+
|
49
|
+
def score
|
50
|
+
@score ||= parsed_xml.at_xpath('score') &&
|
51
|
+
parsed_xml.at_xpath('score').text.to_f
|
52
|
+
end
|
53
|
+
|
54
|
+
def start_time
|
55
|
+
@start_time ||= DateTime.parse(parsed_xml['start-time'])
|
56
|
+
end
|
57
|
+
|
58
|
+
def end_time
|
59
|
+
@end_time ||= DateTime.parse(parsed_xml['end-time'])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'openscap_parser/xml_file'
|
3
|
+
require 'openscap_parser/benchmarks'
|
4
|
+
require 'openscap_parser/test_results'
|
5
|
+
|
6
|
+
module OpenscapParser
|
7
|
+
# A class to represent an XmlFile which contains a <TestResult /> Xccdf type
|
8
|
+
class TestResultFile < XmlFile
|
9
|
+
include ::OpenscapParser::Benchmarks
|
10
|
+
include ::OpenscapParser::TestResults
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openscap_parser/test_result'
|
4
|
+
|
5
|
+
module OpenscapParser
|
6
|
+
module TestResults
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
def test_result
|
10
|
+
TestResult.new(parsed_xml: test_result_node)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_result_node
|
14
|
+
@test_result_node ||= xpath_node('.//TestResult')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|