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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Dockerfile +15 -0
  4. data/README.md +32 -10
  5. data/Rakefile +2 -0
  6. data/lib/openscap_parser.rb +14 -35
  7. data/lib/openscap_parser/benchmark.rb +38 -0
  8. data/lib/openscap_parser/benchmarks.rb +21 -0
  9. data/lib/openscap_parser/datastream_file.rb +15 -0
  10. data/lib/openscap_parser/fix.rb +55 -0
  11. data/lib/openscap_parser/fixes.rb +21 -0
  12. data/lib/openscap_parser/oval_report.rb +24 -0
  13. data/lib/openscap_parser/profile.rb +31 -0
  14. data/lib/openscap_parser/profiles.rb +7 -12
  15. data/lib/openscap_parser/rule.rb +51 -10
  16. data/lib/openscap_parser/rule_identifier.rb +21 -0
  17. data/lib/openscap_parser/rule_reference.rb +14 -0
  18. data/lib/openscap_parser/rule_references.rb +32 -0
  19. data/lib/openscap_parser/rule_result.rb +31 -2
  20. data/lib/openscap_parser/rule_results.rb +21 -0
  21. data/lib/openscap_parser/rules.rb +9 -8
  22. data/lib/openscap_parser/selectors.rb +9 -0
  23. data/lib/openscap_parser/set_value.rb +18 -0
  24. data/lib/openscap_parser/set_values.rb +21 -0
  25. data/lib/openscap_parser/sub.rb +18 -0
  26. data/lib/openscap_parser/subs.rb +38 -0
  27. data/lib/openscap_parser/tailoring.rb +27 -0
  28. data/lib/openscap_parser/tailoring_file.rb +15 -0
  29. data/lib/openscap_parser/tailorings.rb +22 -0
  30. data/lib/openscap_parser/test_result.rb +62 -0
  31. data/lib/openscap_parser/test_result_file.rb +12 -0
  32. data/lib/openscap_parser/test_results.rb +19 -0
  33. data/lib/openscap_parser/util.rb +10 -0
  34. data/lib/openscap_parser/version.rb +1 -1
  35. data/lib/openscap_parser/xml_file.rb +13 -0
  36. data/lib/openscap_parser/xml_node.rb +36 -0
  37. data/lib/oval/definition.rb +47 -0
  38. data/lib/oval/definition_result.rb +17 -0
  39. data/lib/oval/reference.rb +21 -0
  40. data/lib/railtie.rb +15 -0
  41. data/lib/ssg.rb +5 -0
  42. data/lib/ssg/downloader.rb +94 -0
  43. data/lib/ssg/unarchiver.rb +34 -0
  44. data/lib/tasks/ssg.rake +33 -0
  45. data/openscap_parser.gemspec +13 -10
  46. metadata +94 -14
  47. 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
- attr_accessor :id, :result
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
- return @rule_objects unless @rule_objects.nil?
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,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openscap_parser/set_values'
4
+
5
+ module OpenscapParser
6
+ module Selectors
7
+ include OpenscapParser::SetValues
8
+ end
9
+ 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
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Utility functions for OpenscapParser
4
+ module OpenscapParser
5
+ module Util
6
+ def newline_to_whitespace(string)
7
+ string.gsub(/ *\n+/, " ").strip
8
+ end
9
+ end
10
+ end