class Proxy::OpenSCAP::ArfParser

Public Class Methods

new(cname, policy_id, date) click to toggle source
# File lib/smart_proxy_openscap/arf_parser.rb, line 9
def initialize(cname, policy_id, date)
  @cname = cname
  @policy_id = policy_id
  @date = date
end

Public Instance Methods

as_json(arf_data) click to toggle source
# File lib/smart_proxy_openscap/arf_parser.rb, line 15
def as_json(arf_data)
  decompressed = Tempfile.create do |file|
    file.write(arf_data)
    file.flush
    Proxy::OpenSCAP.execute!('bunzip2', '-dc', file.path).first
  rescue => e
    logger.error e
    raise Proxy::OpenSCAP::ReportDecompressError, "Failed to decompress received report bzip, cause: #{e.message}"
  end
  arf_file = ::OpenscapParser::TestResultFile.new(decompressed)
  rules = arf_file.benchmark.rules.to_h { |rule| [rule.id, rule] }

  arf_digest = Digest::SHA256.hexdigest(arf_data)
  report = parse_results(rules, arf_file.test_result, arf_digest)
  report[:openscap_proxy_name] = Proxy::OpenSCAP::Plugin.settings.registered_proxy_name
  report[:openscap_proxy_url] = Proxy::OpenSCAP::Plugin.settings.registered_proxy_url
  report.to_json
end

Private Instance Methods

parse_results(rules, test_result, arf_digest) click to toggle source
# File lib/smart_proxy_openscap/arf_parser.rb, line 36
def parse_results(rules, test_result, arf_digest)
  set_values = test_result.set_values
  passed = 0
  failed = 0
  othered = 0

  logs = test_result.rule_results.filter_map do |result|
    next if result.result == 'notapplicable' || result.result == 'notselected'

    # get rules and their results
    rule_data = rules[result.id]
    # create metrics for the results
    case result.result
      when 'pass', 'fixed'
        passed += 1
      when 'fail'
        failed += 1
      else
        othered += 1
    end

    populate_result_data(result.id, result.result, rule_data, set_values)
  end

  {
    logs: logs,
    digest: arf_digest,
    metrics: { :passed => passed, :failed => failed, :othered => othered },
    score: test_result.score,
  }
end
populate_fixes(fixes, set_values) click to toggle source
# File lib/smart_proxy_openscap/arf_parser.rb, line 81
def populate_fixes(fixes, set_values)
  fixes.map do |fix|
    {
      :id => fix.id,
      :system => fix.system,
      :full_text => fix.full_text(set_values),
      :reboot => fix.instance_variable_get('@parsed_xml')['reboot'] # TODO: add this to openscap_parser lib
    }
  end
end
populate_result_data(result_id, rule_result, rule_data, set_values) click to toggle source
# File lib/smart_proxy_openscap/arf_parser.rb, line 68
def populate_result_data(result_id, rule_result, rule_data, set_values)
  {
    source: result_id,
    result: rule_result,
    title: rule_data.title,
    description: rule_data.description,
    rationale: rule_data.rationale,
    references: rule_data.references.map { |ref| { :href => ref.href, :title => ref.label }},
    fixes: populate_fixes(rule_data.fixes, set_values),
    severity: rule_data.severity,
  }
end