Skip to content

Commit 0cd8828

Browse files
RHICOMPL-2481 Adding Groups to openscap parser (#34)
1 parent 3987c65 commit 0cd8828

File tree

7 files changed

+232963
-1
lines changed

7 files changed

+232963
-1
lines changed

lib/openscap_parser.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
require 'openscap_parser/test_results'
77
require 'openscap_parser/profiles'
88
require 'openscap_parser/rules'
9+
require 'openscap_parser/groups'
910
require 'openscap_parser/rule_results'
1011
require 'openscap_parser/tailorings'
1112

lib/openscap_parser/benchmark.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
require 'openscap_parser/rules'
66
require 'openscap_parser/profiles'
77
require 'openscap_parser/rule_references'
8+
require 'openscap_parser/groups'
89

910
# Mimics openscap-ruby Benchmark interface
1011
module OpenscapParser
@@ -13,6 +14,7 @@ class Benchmark < XmlNode
1314
include OpenscapParser::Rules
1415
include OpenscapParser::RuleReferences
1516
include OpenscapParser::Profiles
17+
include OpenscapParser::Groups
1618

1719
def id
1820
@id ||= @parsed_xml['id']

lib/openscap_parser/group.rb

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# frozen_string_literal: true
2+
module OpenscapParser
3+
class Group < XmlNode
4+
include OpenscapParser::Util
5+
6+
def id
7+
@id ||= parsed_xml['id']
8+
end
9+
10+
def title
11+
@title ||= parsed_xml.at_css('title') &&
12+
parsed_xml.at_css('title').text
13+
end
14+
15+
def description
16+
@description ||= newline_to_whitespace(
17+
parsed_xml.at_css('description') &&
18+
parsed_xml.at_css('description').text || ''
19+
)
20+
end
21+
22+
def rationale
23+
@rationale ||= newline_to_whitespace(
24+
parsed_xml.at_css('rationale') &&
25+
parsed_xml.at_css('rationale').text || ''
26+
)
27+
end
28+
29+
def requires
30+
@requires ||= parsed_xml.xpath('./requires') &&
31+
parsed_xml.xpath('./requires/@idref').flat_map do |r|
32+
r.to_s&.split
33+
end
34+
end
35+
36+
def conflicts
37+
@conflicts ||= parsed_xml.xpath('./conflicts') &&
38+
parsed_xml.xpath('./conflicts/@idref').flat_map do |c|
39+
c.to_s&.split
40+
end
41+
end
42+
43+
def selected
44+
@selected ||= parsed_xml['selected']
45+
end
46+
47+
def parent_id
48+
@parent_id = parsed_xml.xpath('../@id').to_s
49+
end
50+
51+
def parent_type
52+
if parsed_xml.xpath("name(..)='Group'")
53+
@parent_type = 'Group'
54+
else
55+
@parent_type = 'Benchmark'
56+
end
57+
end
58+
59+
def to_h
60+
{
61+
:id => id,
62+
:title => title,
63+
:description => description,
64+
:requires => requires,
65+
:conflicts => conflicts,
66+
:rationale => rationale,
67+
:selected => selected,
68+
:parent_id => parent_id,
69+
:parent_type => parent_type
70+
}
71+
end
72+
end
73+
end

lib/openscap_parser/groups.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
require 'openscap_parser/group'
4+
5+
module OpenscapParser
6+
# Methods related to finding and saving rule references
7+
module Groups
8+
def self.included(base)
9+
base.class_eval do
10+
def groups
11+
@groups ||= group_nodes.map do |group_node|
12+
OpenscapParser::Group.new(parsed_xml: group_node)
13+
end
14+
end
15+
16+
def group_nodes(xpath = './/Group')
17+
xpath_nodes(xpath)
18+
end
19+
end
20+
end
21+
end
22+
end

lib/openscap_parser/rule.rb

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,20 @@ def title
2929
parsed_xml.at_css('title').text
3030
end
3131

32+
def requires
33+
@requires ||= parsed_xml.xpath('./requires') &&
34+
parsed_xml.xpath('./requires/@idref').flat_map do |r|
35+
r.to_s&.split
36+
end
37+
end
38+
39+
def conflicts
40+
@conflicts ||= parsed_xml.xpath('./conflicts') &&
41+
parsed_xml.xpath('./conflicts/@idref').flat_map do |c|
42+
c.to_s&.split
43+
end
44+
end
45+
3246
def description
3347
@description ||= newline_to_whitespace(
3448
parsed_xml.at_css('description') &&
@@ -57,15 +71,31 @@ def identifier_node
5771
@identifier_node ||= parsed_xml.at_xpath('ident')
5872
end
5973

74+
def parent_id
75+
parsed_xml.xpath('../@id').to_s
76+
end
77+
78+
def parent_type
79+
if parsed_xml.xpath("name(..)='Group'")
80+
@parent_type = 'Group'
81+
else
82+
@parent_type = 'Benchmark'
83+
end
84+
end
85+
6086
def to_h
6187
{
6288
:id => id,
6389
:selected => selected,
6490
:severity => severity,
6591
:title => title,
92+
:requires => requires,
93+
:conflicts => conflicts,
6694
:description => description,
6795
:rationale => rationale,
68-
:identifier => rule_identifier.to_h
96+
:identifier => rule_identifier.to_h,
97+
:parent_id => parent_id,
98+
:parent_type => parent_type
6999
}
70100
end
71101
end

0 commit comments

Comments
 (0)