abide_dev_utils 0.11.0 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +18 -31
  3. data/lib/abide_dev_utils/cem/benchmark.rb +335 -136
  4. data/lib/abide_dev_utils/cem/generate/coverage_report.rb +380 -0
  5. data/lib/abide_dev_utils/cem/generate/reference.rb +238 -35
  6. data/lib/abide_dev_utils/cem/generate.rb +5 -4
  7. data/lib/abide_dev_utils/cem/hiera_data/mapping_data/map_data.rb +110 -0
  8. data/lib/abide_dev_utils/cem/hiera_data/mapping_data/mixins.rb +46 -0
  9. data/lib/abide_dev_utils/cem/hiera_data/mapping_data.rb +146 -0
  10. data/lib/abide_dev_utils/cem/hiera_data/resource_data/control.rb +127 -0
  11. data/lib/abide_dev_utils/cem/hiera_data/resource_data/parameters.rb +90 -0
  12. data/lib/abide_dev_utils/cem/hiera_data/resource_data/resource.rb +102 -0
  13. data/lib/abide_dev_utils/cem/hiera_data/resource_data.rb +310 -0
  14. data/lib/abide_dev_utils/cem/hiera_data.rb +7 -0
  15. data/lib/abide_dev_utils/cem/mapping/mapper.rb +161 -34
  16. data/lib/abide_dev_utils/cem/validate/resource_data.rb +33 -0
  17. data/lib/abide_dev_utils/cem/validate.rb +10 -0
  18. data/lib/abide_dev_utils/cem.rb +0 -1
  19. data/lib/abide_dev_utils/cli/cem.rb +20 -2
  20. data/lib/abide_dev_utils/dot_number_comparable.rb +75 -0
  21. data/lib/abide_dev_utils/errors/cem.rb +10 -0
  22. data/lib/abide_dev_utils/ppt/class_utils.rb +1 -1
  23. data/lib/abide_dev_utils/ppt/code_gen/data_types.rb +64 -0
  24. data/lib/abide_dev_utils/ppt/code_gen/generate.rb +15 -0
  25. data/lib/abide_dev_utils/ppt/code_gen/resource.rb +59 -0
  26. data/lib/abide_dev_utils/ppt/code_gen/resource_types/base.rb +93 -0
  27. data/lib/abide_dev_utils/ppt/code_gen/resource_types/class.rb +17 -0
  28. data/lib/abide_dev_utils/ppt/code_gen/resource_types/manifest.rb +16 -0
  29. data/lib/abide_dev_utils/ppt/code_gen/resource_types/parameter.rb +16 -0
  30. data/lib/abide_dev_utils/ppt/code_gen/resource_types/strings.rb +13 -0
  31. data/lib/abide_dev_utils/ppt/code_gen/resource_types.rb +6 -0
  32. data/lib/abide_dev_utils/ppt/code_gen.rb +15 -0
  33. data/lib/abide_dev_utils/ppt/code_introspection.rb +102 -0
  34. data/lib/abide_dev_utils/ppt/hiera.rb +4 -1
  35. data/lib/abide_dev_utils/ppt/puppet_module.rb +2 -1
  36. data/lib/abide_dev_utils/ppt.rb +3 -0
  37. data/lib/abide_dev_utils/version.rb +1 -1
  38. data/lib/abide_dev_utils/xccdf/parser/helpers.rb +146 -0
  39. data/lib/abide_dev_utils/xccdf/parser/objects.rb +87 -144
  40. data/lib/abide_dev_utils/xccdf/parser.rb +5 -0
  41. data/lib/abide_dev_utils/xccdf/utils.rb +89 -0
  42. data/lib/abide_dev_utils/xccdf.rb +193 -63
  43. metadata +27 -3
  44. data/lib/abide_dev_utils/cem/coverage_report.rb +0 -348
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'abide_dev_utils/validate'
4
+
5
+ module AbideDevUtils
6
+ module XCCDF
7
+ module Utils
8
+ # Class for working with directories that contain XCCDF files
9
+ class FileDir
10
+ CIS_FILE_NAME_PARTS_PATTERN = /^CIS_(?<subject>[A-Za-z0-9._()-]+)_Benchmark_v(?<version>[0-9.]+)-xccdf$/.freeze
11
+ def initialize(path)
12
+ @path = File.expand_path(path)
13
+ AbideDevUtils::Validate.directory(@path)
14
+ end
15
+
16
+ def files
17
+ @files ||= Dir.glob(File.join(@path, '*-xccdf.xml')).map { |f| FileNameData.new(f) }
18
+ end
19
+
20
+ def fuzzy_find(label, value)
21
+ files.find { |f| f.fuzzy_match?(label, value) }
22
+ end
23
+
24
+ def fuzzy_select(label, value)
25
+ files.select { |f| f.fuzzy_match?(label, value) }
26
+ end
27
+
28
+ def fuzzy_reject(label, value)
29
+ files.reject { |f| f.fuzzy_match?(label, value) }
30
+ end
31
+
32
+ def label?(label)
33
+ files.select { |f| f.has?(label) }
34
+ end
35
+
36
+ def no_label?(label)
37
+ files.reject { |f| f.has?(label) }
38
+ end
39
+ end
40
+
41
+ # Parses XCCDF file names into labeled parts
42
+ class FileNameData
43
+ CIS_PATTERN = /^CIS_(?<subject>[A-Za-z0-9._()-]+?)(?<stig>_STIG)?_Benchmark_v(?<version>[0-9.]+)-xccdf$/.freeze
44
+
45
+ attr_reader :path, :name, :labeled_parts
46
+
47
+ def initialize(path)
48
+ @path = path
49
+ @name = File.basename(path, '.xml')
50
+ @labeled_parts = File.basename(name, '.xml').match(CIS_PATTERN)&.named_captures
51
+ end
52
+
53
+ def subject
54
+ @subject ||= labeled_parts&.fetch('subject', nil)
55
+ end
56
+
57
+ def stig
58
+ @stig ||= labeled_parts&.fetch('subject', nil)
59
+ end
60
+
61
+ def version
62
+ @version ||= labeled_parts&.fetch('version', nil)
63
+ end
64
+
65
+ def has?(label)
66
+ val = send(label.to_sym)
67
+ !val.nil? && !val.empty?
68
+ end
69
+
70
+ def fuzzy_match?(label, value)
71
+ return false unless has?(label)
72
+
73
+ this_val = normalize_char_array(send(label.to_sym).chars)
74
+ other_val = normalize_char_array(value.chars)
75
+ other_val.each_with_index do |c, idx|
76
+ return false unless this_val[idx] == c
77
+ end
78
+ true
79
+ end
80
+
81
+ private
82
+
83
+ def normalize_char_array(char_array)
84
+ char_array.grep_v(/[^A-Za-z0-9]/).map(&:downcase)[3..]
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -16,6 +16,8 @@ module AbideDevUtils
16
16
  case type.downcase
17
17
  when 'cis'
18
18
  Benchmark.new(xccdf_file).gen_map(**opts)
19
+ when 'stig'
20
+ Benchmark.new(xccdf_file).gen_map(**opts)
19
21
  else
20
22
  raise AbideDevUtils::Errors::UnsupportedXCCDFError, "XCCDF type #{type} is unsupported!"
21
23
  end
@@ -51,25 +53,31 @@ module AbideDevUtils
51
53
  module Common
52
54
  XPATHS = {
53
55
  benchmark: {
54
- all: 'xccdf:Benchmark',
55
- title: 'xccdf:Benchmark/xccdf:title',
56
- version: 'xccdf:Benchmark/xccdf:version'
56
+ all: 'Benchmark',
57
+ title: 'Benchmark/title',
58
+ version: 'Benchmark/version'
57
59
  },
58
60
  cis: {
59
61
  profiles: {
60
- all: 'xccdf:Benchmark/xccdf:Profile',
61
- relative_title: './xccdf:title',
62
- relative_select: './xccdf:select'
62
+ all: 'Benchmark/Profile',
63
+ relative_title: './title',
64
+ relative_select: './select'
63
65
  }
64
66
  }
65
67
  }.freeze
66
68
  CONTROL_PREFIX = /^[\d.]+_/.freeze
67
69
  UNDERSCORED = /(\s|\(|\)|-|\.)/.freeze
70
+ CIS_TITLE_MARKER = 'CIS'
68
71
  CIS_NEXT_GEN_WINDOWS = /[Nn]ext_[Gg]eneration_[Ww]indows_[Ss]ecurity/.freeze
69
72
  CIS_CONTROL_NUMBER = /([0-9.]+[0-9]+)/.freeze
70
73
  CIS_LEVEL_CODE = /(?:_|^)([Ll]evel_[0-9]|[Ll]1|[Ll]2|[NnBb][GgLl]|#{CIS_NEXT_GEN_WINDOWS})/.freeze
71
74
  CIS_CONTROL_PARTS = /#{CIS_CONTROL_NUMBER}#{CIS_LEVEL_CODE}?_+([A-Za-z].*)/.freeze
72
75
  CIS_PROFILE_PARTS = /#{CIS_LEVEL_CODE}[_-]+([A-Za-z].*)/.freeze
76
+ STIG_TITLE_MARKER = 'Security Technical Implementation Guide'
77
+ STIG_CONTROL_PARTS = /(V-[0-9]+)/.freeze
78
+ STIG_PROFILE_PARTS = /(MAC-\d+)_([A-Za-z].+)/.freeze
79
+ PROFILE_PARTS = /#{CIS_PROFILE_PARTS}|#{STIG_PROFILE_PARTS}/.freeze
80
+ CONTROL_PARTS = /#{CIS_CONTROL_PARTS}|#{STIG_CONTROL_PARTS}/.freeze
73
81
 
74
82
  def xpath(path)
75
83
  @xml.xpath(path)
@@ -119,19 +127,40 @@ module AbideDevUtils
119
127
  end
120
128
 
121
129
  def profile_parts(profile)
122
- parts = control_profile_text(profile).match(CIS_PROFILE_PARTS)
130
+ parts = control_profile_text(profile).match(PROFILE_PARTS)
123
131
  raise AbideDevUtils::Errors::ProfilePartsError, profile if parts.nil?
124
132
 
125
- parts[1].gsub!(/[Ll]evel_/, 'L')
126
- parts[1..2]
133
+ if parts[1]
134
+ # CIS profile
135
+ parts[1].gsub!(/[Ll]evel_/, 'L')
136
+ parts[1..2]
137
+ elsif parts[3]
138
+ # STIG profile
139
+ parts[3..4]
140
+ else
141
+ raise AbideDevUtils::Errors::ProfilePartsError, profile
142
+ end
127
143
  end
128
144
 
129
- def control_parts(control, parent_level: nil)
130
- mdata = control_profile_text(control).match(CIS_CONTROL_PARTS)
145
+ def control_parts(control)
146
+ mdata = control_profile_text(control).match(CONTROL_PARTS)
131
147
  raise AbideDevUtils::Errors::ControlPartsError, control if mdata.nil?
132
148
 
133
- mdata[2] = parent_level unless parent_level.nil?
134
- mdata[1..3]
149
+ if mdata[1]
150
+ # CIS control
151
+ mdata[1..3]
152
+ elsif mdata[4]
153
+ # STIG control
154
+ vuln_id = mdata[4]
155
+ group = @benchmark.xpath("Group[@id='#{vuln_id}']")
156
+ if group.xpath('Rule').length != 1
157
+ raise AbideDevUtils::Errors::ControlPartsError, control
158
+ end
159
+ rule_id = group.xpath('Rule/@id').first.value
160
+ return [vuln_id, rule_id]
161
+ else
162
+ raise AbideDevUtils::Errors::ControlPartsError, control
163
+ end
135
164
  end
136
165
 
137
166
  def control_profile_text(item)
@@ -148,14 +177,6 @@ module AbideDevUtils
148
177
  end
149
178
  end
150
179
 
151
- def sorted_control_classes(raw_select_list, sort_key: :number)
152
- raw_select_list.map { |x| Control.new(x) }.sort_by(&sort_key)
153
- end
154
-
155
- def sorted_profile_classes(raw_profile_list, sort_key: :title)
156
- raw_profile_list.map { |x| Profile.new(x) }.sort_by(&sort_key)
157
- end
158
-
159
180
  def ==(other)
160
181
  diff_properties.map { |x| send(x) } == other.diff_properties.map { |x| other.send(x) }
161
182
  end
@@ -169,14 +190,17 @@ module AbideDevUtils
169
190
  class Benchmark
170
191
  include AbideDevUtils::XCCDF::Common
171
192
 
172
- MAP_INDICES = %w[title hiera_title hiera_title_num number].freeze
193
+ CIS_MAP_INDICES = %w[title hiera_title hiera_title_num number].freeze
194
+ STIG_MAP_INDICES = %w[vulnid ruleid].freeze
173
195
 
174
- attr_reader :xml, :title, :version, :diff_properties
196
+ attr_reader :xml, :title, :version, :diff_properties, :benchmark
175
197
 
176
198
  def initialize(path)
177
199
  @xml = parse(path)
178
- @title = xpath('xccdf:Benchmark/xccdf:title').text
179
- @version = xpath('xccdf:Benchmark/xccdf:version').text
200
+ @xml.remove_namespaces!
201
+ @benchmark = xpath('Benchmark')
202
+ @title = xpath('Benchmark/title').text
203
+ @version = xpath('Benchmark/version').text
180
204
  @diff_properties = %i[title version profiles]
181
205
  end
182
206
 
@@ -185,7 +209,7 @@ module AbideDevUtils
185
209
  end
186
210
 
187
211
  def profiles
188
- @profiles ||= Profiles.new(xpath('xccdf:Benchmark/xccdf:Profile'))
212
+ @profiles ||= Profiles.new(xpath('Benchmark/Profile'), @benchmark)
189
213
  end
190
214
 
191
215
  def profile_levels
@@ -197,7 +221,7 @@ module AbideDevUtils
197
221
  end
198
222
 
199
223
  def controls
200
- @controls ||= Controls.new(xpath('//xccdf:select'))
224
+ @controls ||= Controls.new(xpath('//select'))
201
225
  end
202
226
 
203
227
  def controls_by_profile_level(level_code)
@@ -209,15 +233,22 @@ module AbideDevUtils
209
233
  end
210
234
 
211
235
  def gen_map(dir: nil, type: 'cis', parent_key_prefix: '', version_output_dir: false, **_)
212
- os, ver = facter_platform
236
+ case type
237
+ when 'cis'
238
+ os, ver = facter_platform
239
+ indicies = CIS_MAP_INDICES
240
+ when 'stig'
241
+ os, ver = facter_benchmark
242
+ indicies = STIG_MAP_INDICES
243
+ end
213
244
  output_path = [type, os, ver]
214
245
  output_path.unshift(File.expand_path(dir)) if dir
215
246
  output_path << version if version_output_dir
216
247
  mapping_dir = File.expand_path(File.join(output_path))
217
248
  parent_key_prefix = '' if parent_key_prefix.nil?
218
- MAP_INDICES.each_with_object({}) do |idx, h|
249
+ indicies.each_with_object({}) do |idx, h|
219
250
  map_file_path = "#{mapping_dir}/#{idx}.yaml"
220
- h[map_file_path] = map_indexed(index: idx, framework: type, key_prefix: parent_key_prefix)
251
+ h[map_file_path] = map_indexed(indicies: indicies, index: idx, framework: type, key_prefix: parent_key_prefix)
221
252
  end
222
253
  end
223
254
 
@@ -237,10 +268,10 @@ module AbideDevUtils
237
268
  }
238
269
  end
239
270
 
240
- def map_indexed(index: 'title', framework: 'cis', key_prefix: '')
271
+ def map_indexed(indicies: [], index: 'title', framework: 'cis', key_prefix: '')
241
272
  c_map = profiles.each_with_object({}) do |profile, obj|
242
273
  obj[profile.level.downcase] = {} unless obj[profile.level.downcase].is_a?(Hash)
243
- obj[profile.level.downcase][profile.title.downcase] = map_controls_hash(profile, index).sort_by { |k, _| k }.to_h
274
+ obj[profile.level.downcase][profile.title.downcase] = map_controls_hash(profile, indicies, index).sort_by { |k, _| k }.to_h
244
275
  end
245
276
 
246
277
  c_map['benchmark'] = { 'title' => title, 'version' => version }
@@ -249,8 +280,13 @@ module AbideDevUtils
249
280
  { mappings.join('::') => c_map }.to_yaml
250
281
  end
251
282
 
283
+ def facter_benchmark
284
+ id = xpath('Benchmark/@id').text
285
+ id.split('_')[0..-2]
286
+ end
287
+
252
288
  def facter_platform
253
- cpe = xpath('xccdf:Benchmark/xccdf:platform')[0]['idref'].split(':')
289
+ cpe = xpath('Benchmark/platform')[0]['idref'].split(':')
254
290
  if cpe.length > 4
255
291
  product_name = cpe[4].split('_')
256
292
  product_version = cpe[5].split('.') unless cpe[5].nil?
@@ -280,8 +316,8 @@ module AbideDevUtils
280
316
  hash.to_yaml
281
317
  end
282
318
 
283
- def resolve_control_reference(control)
284
- xpath("//xccdf:Rule[@id='#{control.reference}']")
319
+ def resolve_cis_control_reference(control)
320
+ xpath("//Rule[@id='#{control.reference}']")
285
321
  end
286
322
 
287
323
  private
@@ -291,15 +327,15 @@ module AbideDevUtils
291
327
  when 'hiera_title_num'
292
328
  control.hiera_title(number_format: true)
293
329
  when 'title'
294
- resolve_control_reference(control).xpath('./xccdf:title').text
330
+ resolve_cis_control_reference(control).xpath('./title').text
295
331
  else
296
332
  control.send(index.to_sym)
297
333
  end
298
334
  end
299
335
 
300
- def map_controls_hash(profile, index)
336
+ def map_controls_hash(profile, indicies, index)
301
337
  profile.controls.each_with_object({}) do |ctrl, hsh|
302
- control_array = MAP_INDICES.each_with_object([]) do |idx_sym, ary|
338
+ control_array = indicies.each_with_object([]) do |idx_sym, ary|
303
339
  next if idx_sym == index
304
340
 
305
341
  item = format_map_control_index(idx_sym, ctrl)
@@ -316,13 +352,9 @@ module AbideDevUtils
316
352
  end
317
353
  end
318
354
 
319
- def sorted_profile_classes(raw_profile_list, sort_key: :level)
320
- raw_profile_list.map { |x| Profile.new(x) }.sort_by(&sort_key)
321
- end
322
-
323
355
  def find_profiles
324
356
  profs = {}
325
- xpath('xccdf:Benchmark/xccdf:Profile').each do |profile|
357
+ xpath('Benchmark/Profile').each do |profile|
326
358
  level_code, name = profile_parts(profile['id'])
327
359
  profs[name] = {} unless profs.key?(name)
328
360
  profs[name][level_code] = profile
@@ -349,11 +381,66 @@ module AbideDevUtils
349
381
  end
350
382
  end
351
383
 
352
- class ObjectContainer
384
+ class XccdfObject
353
385
  include AbideDevUtils::XCCDF::Common
354
386
 
355
- def initialize(list, object_creation_method, *args, **kwargs)
356
- @object_list = send(object_creation_method.to_sym, list, *args, **kwargs)
387
+ def initialize(benchmark)
388
+ @benchmark = benchmark
389
+ @benchmark_type = benchmark_type
390
+ end
391
+
392
+ def controls_class
393
+ case @benchmark_type
394
+ when :cis
395
+ CisControls
396
+ when :stig
397
+ StigControls
398
+ else
399
+ raise AbideDevUtils::Errors::UnsupportedXCCDFError
400
+ end
401
+ end
402
+
403
+ def control_sort_key
404
+ case @benchmark_type
405
+ when :cis
406
+ :number
407
+ when :stig
408
+ :vulnid
409
+ else
410
+ raise AbideDevUtils::Errors::UnsupportedXCCDFError
411
+ end
412
+ end
413
+
414
+ def control_class
415
+ case @benchmark_type
416
+ when :cis
417
+ CisControl
418
+ when :stig
419
+ StigControl
420
+ else
421
+ raise AbideDevUtils::Errors::UnsupportedXCCDFError
422
+ end
423
+ end
424
+
425
+ private
426
+
427
+ def benchmark_type
428
+ title = @benchmark.at_xpath('title').text
429
+ if title.include?(STIG_TITLE_MARKER)
430
+ return :stig
431
+ elsif title.include?(CIS_TITLE_MARKER)
432
+ return :cis
433
+ end
434
+ raise AbideDevUtils::Errors::UnsupportedXCCDFError, "XCCDF type is unsupported!"
435
+ end
436
+ end
437
+
438
+ class ObjectContainer < XccdfObject
439
+ include AbideDevUtils::XCCDF::Common
440
+
441
+ def initialize(list, object_creation_method, benchmark, *args, **kwargs)
442
+ super(benchmark)
443
+ @object_list = send(object_creation_method.to_sym, list, benchmark, *args, **kwargs)
357
444
  @searchable = []
358
445
  end
359
446
 
@@ -396,6 +483,14 @@ module AbideDevUtils
396
483
 
397
484
  private
398
485
 
486
+ def sorted_control_classes(raw_select_list, benchmark)
487
+ raw_select_list.map { |x| control_class.new(x, benchmark) }.sort_by(&control_sort_key)
488
+ end
489
+
490
+ def sorted_profile_classes(raw_profile_list, benchmark)
491
+ raw_profile_list.map { |x| Profile.new(x, benchmark) }.sort_by(&:title)
492
+ end
493
+
399
494
  def resolve_hash_key(obj)
400
495
  return obj.send(:raw_title) unless defined?(@hash_key)
401
496
 
@@ -416,8 +511,8 @@ module AbideDevUtils
416
511
  end
417
512
 
418
513
  class Profiles < ObjectContainer
419
- def initialize(list)
420
- super(list, :sorted_profile_classes)
514
+ def initialize(list, benchmark)
515
+ super(list, :sorted_profile_classes, benchmark)
421
516
  searchable! :level, :title
422
517
  index! :title
423
518
  hash_key! :level, :title
@@ -440,9 +535,34 @@ module AbideDevUtils
440
535
  end
441
536
  end
442
537
 
443
- class Controls < ObjectContainer
444
- def initialize(list)
445
- super(list, :sorted_control_classes)
538
+ class StigControls < ObjectContainer
539
+ def initialize(list, benchmark)
540
+ super(list, :sorted_control_classes, benchmark)
541
+ searchable! :vulnid, :ruleid
542
+ index! :vulnid
543
+ hash_key! :vulnid
544
+ end
545
+
546
+ def vulnids
547
+ @vulnids ||= @object_list.map(&:vulnid).sort
548
+ end
549
+
550
+ def ruleids
551
+ @ruleids ||= @object_list.map(&:ruleid).sort
552
+ end
553
+
554
+ def include_vulnid?(item)
555
+ @object_list.map(&:vulnid).include?(item)
556
+ end
557
+
558
+ def include_ruleid?(item)
559
+ @object_list.map(&:ruleid).include?(item)
560
+ end
561
+ end
562
+
563
+ class CisControls < ObjectContainer
564
+ def initialize(list, benchmark)
565
+ super(list, :sorted_control_classes, benchmark)
446
566
  searchable! :level, :title, :number
447
567
  index! :number
448
568
  hash_key! :number
@@ -473,10 +593,11 @@ module AbideDevUtils
473
593
  end
474
594
  end
475
595
 
476
- class XccdfElement
596
+ class XccdfElement < XccdfObject
477
597
  include AbideDevUtils::XCCDF::Common
478
598
 
479
- def initialize(element)
599
+ def initialize(element, benchmark)
600
+ super(benchmark)
480
601
  @xml = element
481
602
  @element_type = self.class.name.split('::').last.downcase
482
603
  @raw_title = control_profile_text(element)
@@ -498,11 +619,12 @@ module AbideDevUtils
498
619
  end
499
620
 
500
621
  def reference
501
- @reference ||= @element_type == 'control' ? @xml['idref'] : @xml['id']
622
+ @reference ||= @element_type.include?('control') ? @xml['idref'] : @xml['id']
502
623
  end
503
624
 
504
625
  def hiera_title(**opts)
505
- send("normalize_#{@element_type}_name".to_sym, @xml, **opts)
626
+ e_type = @element_type.include?('control') ? 'control' : 'profile'
627
+ send("normalize_#{e_type}_name".to_sym, @xml, **opts)
506
628
  end
507
629
 
508
630
  private
@@ -524,19 +646,27 @@ module AbideDevUtils
524
646
  end
525
647
 
526
648
  class Profile < XccdfElement
527
- def initialize(profile)
528
- super(profile)
649
+ def initialize(profile, benchmark)
650
+ super(profile, benchmark)
529
651
  @level, @title = profile_parts(control_profile_text(profile))
530
- @plain_text_title = @xml.xpath('./xccdf:title').text
531
- @controls = Controls.new(xpath('./xccdf:select'))
652
+ @plain_text_title = @xml.xpath('./title').text
653
+ @controls = controls_class.new(xpath('./select'), benchmark)
532
654
  properties :title, :level, :plain_text_title, controls: :to_h
533
655
  end
534
656
  end
535
657
 
536
- class Control < XccdfElement
537
- def initialize(control, parent_level: nil)
538
- super(control)
539
- @number, @level, @title = control_parts(control_profile_text(control), parent_level: parent_level)
658
+ class StigControl < XccdfElement
659
+ def initialize(control, benchmark)
660
+ super(control, benchmark)
661
+ @vulnid, @ruleid = control_parts(control_profile_text(control))
662
+ properties :vulnid, :ruleid
663
+ end
664
+ end
665
+
666
+ class CisControl < XccdfElement
667
+ def initialize(control, benchmark)
668
+ super(control, benchmark)
669
+ @number, @level, @title = control_parts(control_profile_text(control))
540
670
  properties :number, :level, :title
541
671
  end
542
672
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abide_dev_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - abide-team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-25 00:00:00.000000000 Z
11
+ date: 2022-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -360,10 +360,20 @@ files:
360
360
  - lib/abide_dev_utils.rb
361
361
  - lib/abide_dev_utils/cem.rb
362
362
  - lib/abide_dev_utils/cem/benchmark.rb
363
- - lib/abide_dev_utils/cem/coverage_report.rb
364
363
  - lib/abide_dev_utils/cem/generate.rb
364
+ - lib/abide_dev_utils/cem/generate/coverage_report.rb
365
365
  - lib/abide_dev_utils/cem/generate/reference.rb
366
+ - lib/abide_dev_utils/cem/hiera_data.rb
367
+ - lib/abide_dev_utils/cem/hiera_data/mapping_data.rb
368
+ - lib/abide_dev_utils/cem/hiera_data/mapping_data/map_data.rb
369
+ - lib/abide_dev_utils/cem/hiera_data/mapping_data/mixins.rb
370
+ - lib/abide_dev_utils/cem/hiera_data/resource_data.rb
371
+ - lib/abide_dev_utils/cem/hiera_data/resource_data/control.rb
372
+ - lib/abide_dev_utils/cem/hiera_data/resource_data/parameters.rb
373
+ - lib/abide_dev_utils/cem/hiera_data/resource_data/resource.rb
366
374
  - lib/abide_dev_utils/cem/mapping/mapper.rb
375
+ - lib/abide_dev_utils/cem/validate.rb
376
+ - lib/abide_dev_utils/cem/validate/resource_data.rb
367
377
  - lib/abide_dev_utils/cli.rb
368
378
  - lib/abide_dev_utils/cli/abstract.rb
369
379
  - lib/abide_dev_utils/cli/cem.rb
@@ -375,6 +385,7 @@ files:
375
385
  - lib/abide_dev_utils/comply.rb
376
386
  - lib/abide_dev_utils/config.rb
377
387
  - lib/abide_dev_utils/constants.rb
388
+ - lib/abide_dev_utils/dot_number_comparable.rb
378
389
  - lib/abide_dev_utils/errors.rb
379
390
  - lib/abide_dev_utils/errors/base.rb
380
391
  - lib/abide_dev_utils/errors/cem.rb
@@ -393,6 +404,17 @@ files:
393
404
  - lib/abide_dev_utils/ppt.rb
394
405
  - lib/abide_dev_utils/ppt/api.rb
395
406
  - lib/abide_dev_utils/ppt/class_utils.rb
407
+ - lib/abide_dev_utils/ppt/code_gen.rb
408
+ - lib/abide_dev_utils/ppt/code_gen/data_types.rb
409
+ - lib/abide_dev_utils/ppt/code_gen/generate.rb
410
+ - lib/abide_dev_utils/ppt/code_gen/resource.rb
411
+ - lib/abide_dev_utils/ppt/code_gen/resource_types.rb
412
+ - lib/abide_dev_utils/ppt/code_gen/resource_types/base.rb
413
+ - lib/abide_dev_utils/ppt/code_gen/resource_types/class.rb
414
+ - lib/abide_dev_utils/ppt/code_gen/resource_types/manifest.rb
415
+ - lib/abide_dev_utils/ppt/code_gen/resource_types/parameter.rb
416
+ - lib/abide_dev_utils/ppt/code_gen/resource_types/strings.rb
417
+ - lib/abide_dev_utils/ppt/code_introspection.rb
396
418
  - lib/abide_dev_utils/ppt/facter_utils.rb
397
419
  - lib/abide_dev_utils/ppt/hiera.rb
398
420
  - lib/abide_dev_utils/ppt/new_obj.rb
@@ -411,9 +433,11 @@ files:
411
433
  - lib/abide_dev_utils/xccdf/diff/benchmark/property_existence.rb
412
434
  - lib/abide_dev_utils/xccdf/diff/utils.rb
413
435
  - lib/abide_dev_utils/xccdf/parser.rb
436
+ - lib/abide_dev_utils/xccdf/parser/helpers.rb
414
437
  - lib/abide_dev_utils/xccdf/parser/objects.rb
415
438
  - lib/abide_dev_utils/xccdf/parser/objects/digest_object.rb
416
439
  - lib/abide_dev_utils/xccdf/parser/objects/numbered_object.rb
440
+ - lib/abide_dev_utils/xccdf/utils.rb
417
441
  - new_diff.rb
418
442
  homepage: https://github.com/puppetlabs/abide_dev_utils
419
443
  licenses: