Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 10 additions & 19 deletions lib/openscap_parser.rb
Original file line number Diff line number Diff line change
@@ -1,31 +1,22 @@
# frozen_string_literal: true

require 'openscap_parser/version'
require 'openscap_parser/util'
require 'openscap_parser/benchmarks'
require 'openscap_parser/test_results'
require 'openscap_parser/profiles'
require 'openscap_parser/profile'
require 'openscap_parser/rule'
require 'openscap_parser/rule_result'
require 'openscap_parser/rule_results'
require 'openscap_parser/rules'
require 'openscap_parser/version'
require 'openscap_parser/xml_report'
require 'openscap_parser/datastream'
require 'openscap_parser/rule_results'
require 'openscap_parser/tailorings'

require 'openscap_parser/xml_file'
require 'openscap_parser/datastream_file'
require 'openscap_parser/test_result_file'
require 'openscap_parser/tailoring_file'

require 'date'
require 'railtie' if defined?(Rails)

module OpenscapParser
class Error < StandardError; end

class Base
include OpenscapParser::XMLReport
include OpenscapParser::Profiles
include OpenscapParser::Rules
include OpenscapParser::RuleResults
include OpenscapParser::TestResult

def initialize(report)
parsed_xml(report)
end
end
end
7 changes: 1 addition & 6 deletions lib/openscap_parser/benchmark.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,12 @@

# Mimics openscap-ruby Benchmark interface
module OpenscapParser
class Benchmark
class Benchmark < XmlNode
include OpenscapParser::Util
include OpenscapParser::XmlFile
include OpenscapParser::Rules
include OpenscapParser::RuleReferences
include OpenscapParser::Profiles

def initialize(parsed_xml: nil)
@parsed_xml = parsed_xml
end

def id
@id ||= @parsed_xml['id']
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,12 @@
require 'openscap_parser/benchmarks'

module OpenscapParser
class Datastream
include OpenscapParser::XmlFile
# A class to represent a datastream (-ds.xml) XmlFile
class DatastreamFile < XmlFile
include OpenscapParser::Benchmarks

def initialize(report)
parsed_xml report
end

def valid?
return true if @parsed_xml.root.name == 'data-stream-collection' && namespaces.keys.include?('xmlns:ds')
return true if @parsed_xml.root.name == 'Tailoring' && namespaces.keys.include?('xmlns:xccdf')
false
end
end
Expand Down
30 changes: 19 additions & 11 deletions lib/openscap_parser/profile.rb
Original file line number Diff line number Diff line change
@@ -1,26 +1,34 @@
module OpenscapParser
class Profile
def initialize(profile_xml: nil)
@profile_xml = profile_xml
class Profile < XmlNode
def id
@id ||= @parsed_xml['id']
end

def id
@id ||= @profile_xml['id']
def extends_profile_id
@extends ||= @parsed_xml['extends']
end

def title
@title ||= @profile_xml.at_css('title') &&
@profile_xml.at_css('title').text
@title ||= @parsed_xml.at_css('title') &&
@parsed_xml.at_css('title').text
end
alias :name :title

def description
@description ||= @profile_xml.at_css('description') &&
@profile_xml.at_css('description').text
@description ||= @parsed_xml.at_css('description') &&
@parsed_xml.at_css('description').text
end

def selected_rule_ids
id_refs = @profile_xml.xpath("select[@selected='true']/@idref")
id_refs && id_refs.map(&:text)
@selected_rule_ids ||= @parsed_xml.xpath("select[@selected='true']/@idref") &&
@parsed_xml.xpath("select[@selected='true']/@idref").map(&:text)
end

def set_values
@set_values ||= @parsed_xml.xpath("set-value") &&
@parsed_xml.xpath("set-value").map do |set_value|
[set_value['idref'], set_value.text]
end.to_h
end

def to_h
Expand Down
4 changes: 3 additions & 1 deletion lib/openscap_parser/profiles.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# frozen_string_literal: true

require 'openscap_parser/profile'

module OpenscapParser
# Methods related to saving profiles and finding which hosts
# they belong to
Expand All @@ -8,7 +10,7 @@ def self.included(base)
base.class_eval do
def profiles
@profiles ||= profile_nodes.map do |profile_node|
OpenscapParser::Profile.new(profile_xml: profile_node)
OpenscapParser::Profile.new(parsed_xml: profile_node)
end
end

Expand Down
29 changes: 12 additions & 17 deletions lib/openscap_parser/rule.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,43 +6,38 @@

# Mimics openscap-ruby Rule interface
module OpenscapParser
class Rule
class Rule < XmlNode
include OpenscapParser::Util
include OpenscapParser::XmlFile
include OpenscapParser::RuleReferences

def initialize(parsed_xml: nil)
@parsed_xml = parsed_xml
end

def id
@id ||= @parsed_xml['id']
@id ||= parsed_xml['id']
end

def selected
@selected ||= @parsed_xml['selected']
@selected ||= parsed_xml['selected']
end

def severity
@severity ||= @parsed_xml['severity']
@severity ||= parsed_xml['severity']
end

def title
@title ||= @parsed_xml.at_css('title') &&
@parsed_xml.at_css('title').text
@title ||= parsed_xml.at_css('title') &&
parsed_xml.at_css('title').text
end

def description
@description ||= newline_to_whitespace(
@parsed_xml.at_css('description') &&
@parsed_xml.at_css('description').text || ''
parsed_xml.at_css('description') &&
parsed_xml.at_css('description').text || ''
)
end

def rationale
@rationale ||= newline_to_whitespace(
@parsed_xml.at_css('rationale') &&
@parsed_xml.at_css('rationale').text || ''
parsed_xml.at_css('rationale') &&
parsed_xml.at_css('rationale').text || ''
)
end

Expand All @@ -52,12 +47,12 @@ def rule_reference_nodes(xpath = "reference")
end

def rule_identifier
@identifier ||= RuleIdentifier.new(identifier_xml: identifier_node)
@identifier ||= RuleIdentifier.new(parsed_xml: identifier_node)
end
alias :identifier :rule_identifier

def identifier_node
@identifier_node ||= @parsed_xml.at_xpath('ident')
@identifier_node ||= parsed_xml.at_xpath('ident')
end
end
end
10 changes: 3 additions & 7 deletions lib/openscap_parser/rule_identifier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,13 @@

# RuleIdentifier interface as an object
module OpenscapParser
class RuleIdentifier
def initialize(identifier_xml: nil)
@identifier_xml = identifier_xml
end

class RuleIdentifier < XmlNode
def label
@label ||= @identifier_xml && @identifier_xml.text
@label ||= @parsed_xml && @parsed_xml.text
end

def system
@system ||= @identifier_xml && @identifier_xml['system']
@system ||= @parsed_xml && @parsed_xml['system']
end
end
end
10 changes: 3 additions & 7 deletions lib/openscap_parser/rule_reference.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,13 @@

# RuleReference interface as an object
module OpenscapParser
class RuleReference
def initialize(reference_xml: nil)
@reference_xml = reference_xml
end

class RuleReference < XmlNode
def href
@href ||= @reference_xml && @reference_xml['href']
@href ||= @parsed_xml && @parsed_xml['href']
end

def label
@label ||= @reference_xml && @reference_xml.text
@label ||= @parsed_xml && @parsed_xml.text
end
end
end
2 changes: 1 addition & 1 deletion lib/openscap_parser/rule_references.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def rule_reference_strings

def rule_references
@rule_references ||= rule_reference_nodes.map do |node|
OpenscapParser::RuleReference.new(reference_xml: node)
OpenscapParser::RuleReference.new(parsed_xml: node)
end.uniq do |reference|
[reference.label, reference.href]
end
Expand Down
23 changes: 21 additions & 2 deletions lib/openscap_parser/rule_result.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,27 @@
# frozen_string_literal: true

module OpenscapParser
class RuleResult
attr_accessor :id, :result
class RuleResult < XmlNode
def id
@id ||= parsed_xml['idref']
end

def time
@time ||= parsed_xml['time']
end

def severity
@severity ||= parsed_xml['severity']
end

def weight
@weight ||= parsed_xml['weight']
end

def result
@result ||= parsed_xml.at_xpath('result') &&
parsed_xml.at_xpath('result').text || ''
end
end
end

16 changes: 8 additions & 8 deletions lib/openscap_parser/rule_results.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
# frozen_string_literal: true
require 'openscap_parser/test_result'

require 'openscap_parser/rule_result'

module OpenscapParser
module RuleResults
include TestResult

def self.included(base)
base.class_eval do
def rule_result_nodes
@rule_result_nodes ||= parsed_xml.xpath('rule-result')
end

def rule_results
@rule_results ||= test_result_node.search('rule-result').map do |rr|
rule_result_oscap = RuleResult.new
rule_result_oscap.id = rr.attributes['idref'].value
rule_result_oscap.result = rr.search('result').first.text
rule_result_oscap
rule_result_nodes.map do |node|
RuleResult.new(parsed_xml: node)
end
end
end
Expand Down
6 changes: 2 additions & 4 deletions lib/openscap_parser/rules.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
# frozen_string_literal: true

require 'openscap_parser/rule'

module OpenscapParser
# Methods related to parsing rules
module Rules
def self.included(base)
base.class_eval do
def rule_ids
test_result_node.xpath('.//rule-result/@idref').map(&:value)
end

def rule_objects
@rule_objects ||= rule_nodes.map do |rule_node|
Rule.new(parsed_xml: rule_node)
Expand Down
27 changes: 27 additions & 0 deletions lib/openscap_parser/tailoring.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# frozen_string_literal: true

# Mimics openscap-ruby Rule interface
module OpenscapParser
class Tailoring < XmlNode
include OpenscapParser::Profiles

def id
@id ||= @parsed_xml['id']
end

def benchmark
@benchmark ||= @parsed_xml.at_xpath('benchmark/@href') &&
@parsed_xml.at_xpath('benchmark/@href').text
end

def version
@version ||= @parsed_xml.at_xpath('version') &&
@parsed_xml.at_xpath('version').text
end

def version_time
@version_time ||= @parsed_xml.at_xpath('version/@time') &&
@parsed_xml.at_xpath('version/@time').text
end
end
end
13 changes: 13 additions & 0 deletions lib/openscap_parser/tailoring_file.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

module OpenscapParser
# A class to represent a tailoring XmlFile
class TailoringFile < XmlFile
include OpenscapParser::Tailorings

def valid?
return true if @parsed_xml.root.name == 'Tailoring' && namespaces.keys.include?('xmlns:xccdf')
false
end
end
end
Loading