openscap_parser 0.1.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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