inspec_tools 2.0.7 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,116 @@
1
+ module Utils
2
+ # Perform scoring calculations for the different types that is used in a TestResult score.
3
+ class XCCDFScore
4
+ # @param groups [Array[HappyMapperTools::Benchmark::Group]]
5
+ # @param rule_results [Array[RuleResultType]]
6
+ def initialize(groups, rule_results)
7
+ @groups = groups
8
+ @rule_results = rule_results
9
+ end
10
+
11
+ # Calculate and return the urn:xccdf:scoring:default score for the entire benchmark.
12
+ # @return ScoreType
13
+ def default_score
14
+ HappyMapperTools::Benchmark::ScoreType.new('urn:xccdf:scoring:default', 100, score_benchmark_default)
15
+ end
16
+
17
+ # urn:xccdf:scoring:flat
18
+ # @return ScoreType
19
+ def flat_score
20
+ results = score_benchmark_with_weights(true)
21
+ HappyMapperTools::Benchmark::ScoreType.new('urn:xccdf:scoring:flat', results[:max], results[:score])
22
+ end
23
+
24
+ # urn:xccdf:scoring:flat-unweighted
25
+ # @return ScoreType
26
+ def flat_unweighted_score
27
+ results = score_benchmark_with_weights(false)
28
+ HappyMapperTools::Benchmark::ScoreType.new('urn:xccdf:scoring:flat-unweighted', results[:max], results[:score])
29
+ end
30
+
31
+ # urn:xccdf:scoring:absolute
32
+ # @return ScoreType
33
+ def absolute_score
34
+ results = score_benchmark_with_weights(true)
35
+ HappyMapperTools::Benchmark::ScoreType.new('urn:xccdf:scoring:absolute', 1, (results[:max] == results[:score] && results[:max].positive? ? 1 : 0))
36
+ end
37
+
38
+ private
39
+
40
+ # Return the overall score for the default model
41
+ def score_benchmark_default
42
+ return 0.0 unless @groups
43
+
44
+ count = 0
45
+ cumulative_score = 0.0
46
+
47
+ @groups.each do |group|
48
+ # Default weighted scoring only provides value when more than one rule exists per group. This implementation
49
+ # is not currently supporting more than one rule per group so weight need not apply.
50
+ rule_score = score_default_rule(test_results(group.rule.id))
51
+
52
+ if rule_score[:rule_count].positive?
53
+ count += 1
54
+ cumulative_score += rule_score[:rule_score]
55
+ end
56
+ end
57
+
58
+ return 0.0 unless count.positive?
59
+
60
+ (cumulative_score / count).round(2)
61
+ end
62
+
63
+ # @param weighted [Boolean] Indicate to apply with weights.
64
+ def score_benchmark_with_weights(weighted)
65
+ score = 0.0
66
+ max_score = 0.0
67
+
68
+ return { score: score, max: max_score } unless @groups
69
+
70
+ @groups.each do |group|
71
+ # Default weighted scoring only provides value when more than one rule exists per group. This implementation
72
+ # is not currently supporting more than one rule per group so weight need not apply.
73
+ rule_score = rule_counts_and_score(test_results(group.rule.id))
74
+
75
+ next unless rule_score[:rule_count].positive?
76
+
77
+ weight =
78
+ if weighted
79
+ group.rule.weight.nil? ? 1.0 : group.rule.weight.to_f
80
+ else
81
+ group.rule.weight.nil? || group.rule.weight.to_f != 0.0 ? 1.0 : 0.0
82
+ end
83
+
84
+ max_score += weight
85
+ score += (weight * rule_score[:rule_score]) / rule_score[:rule_count]
86
+ end
87
+
88
+ { score: score.round(2), max: max_score }
89
+ end
90
+
91
+ def score_default_rule(results)
92
+ sum = rule_counts_and_score(results)
93
+ return sum if sum[:rule_count].zero?
94
+
95
+ sum[:rule_score] = (100 * sum[:rule_score]) / sum[:rule_count]
96
+ sum
97
+ end
98
+
99
+ # Perform basic summation of rule results and passing tests
100
+ def rule_counts_and_score(results)
101
+ excluded_results = %w{notapplicable notchecked informational notselected}
102
+ rule_count = results.count { |r| !excluded_results.include?(r.result) }
103
+ rule_score = results.count { |r| r.result == 'pass' }
104
+
105
+ { rule_count: rule_count, rule_score: rule_score }
106
+ end
107
+
108
+ # Get all test results with the matching rule id
109
+ # @return [Array]
110
+ def test_results(id)
111
+ return [] unless @rule_results
112
+
113
+ @rule_results.select { |r| r.idref == id }
114
+ end
115
+ end
116
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inspec_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Thew
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2020-07-21 00:00:00.000000000 Z
14
+ date: 2020-08-11 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: colorize
@@ -27,6 +27,20 @@ dependencies:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: git-lite-version-bump
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 0.17.3
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.17.3
30
44
  - !ruby/object:Gem::Dependency
31
45
  name: inspec
32
46
  requirement: !ruby/object:Gem::Requirement
@@ -132,41 +146,41 @@ dependencies:
132
146
  - !ruby/object:Gem::Version
133
147
  version: '2.8'
134
148
  - !ruby/object:Gem::Dependency
135
- name: word_wrap
149
+ name: rubocop
136
150
  requirement: !ruby/object:Gem::Requirement
137
151
  requirements:
138
- - - "~>"
152
+ - - ">="
139
153
  - !ruby/object:Gem::Version
140
- version: '1.0'
154
+ version: '0'
141
155
  type: :runtime
142
156
  prerelease: false
143
157
  version_requirements: !ruby/object:Gem::Requirement
144
158
  requirements:
145
- - - "~>"
159
+ - - ">="
146
160
  - !ruby/object:Gem::Version
147
- version: '1.0'
161
+ version: '0'
148
162
  - !ruby/object:Gem::Dependency
149
- name: git-lite-version-bump
163
+ name: word_wrap
150
164
  requirement: !ruby/object:Gem::Requirement
151
165
  requirements:
152
- - - ">="
166
+ - - "~>"
153
167
  - !ruby/object:Gem::Version
154
- version: 0.17.3
168
+ version: '1.0'
155
169
  type: :runtime
156
170
  prerelease: false
157
171
  version_requirements: !ruby/object:Gem::Requirement
158
172
  requirements:
159
- - - ">="
173
+ - - "~>"
160
174
  - !ruby/object:Gem::Version
161
- version: 0.17.3
175
+ version: '1.0'
162
176
  - !ruby/object:Gem::Dependency
163
- name: rubocop
177
+ name: bundler
164
178
  requirement: !ruby/object:Gem::Requirement
165
179
  requirements:
166
180
  - - ">="
167
181
  - !ruby/object:Gem::Version
168
182
  version: '0'
169
- type: :runtime
183
+ type: :development
170
184
  prerelease: false
171
185
  version_requirements: !ruby/object:Gem::Requirement
172
186
  requirements:
@@ -174,7 +188,7 @@ dependencies:
174
188
  - !ruby/object:Gem::Version
175
189
  version: '0'
176
190
  - !ruby/object:Gem::Dependency
177
- name: bundler
191
+ name: bundler-audit
178
192
  requirement: !ruby/object:Gem::Requirement
179
193
  requirements:
180
194
  - - ">="
@@ -188,7 +202,7 @@ dependencies:
188
202
  - !ruby/object:Gem::Version
189
203
  version: '0'
190
204
  - !ruby/object:Gem::Dependency
191
- name: minitest
205
+ name: codeclimate-test-reporter
192
206
  requirement: !ruby/object:Gem::Requirement
193
207
  requirements:
194
208
  - - ">="
@@ -202,7 +216,7 @@ dependencies:
202
216
  - !ruby/object:Gem::Version
203
217
  version: '0'
204
218
  - !ruby/object:Gem::Dependency
205
- name: pry
219
+ name: minitest
206
220
  requirement: !ruby/object:Gem::Requirement
207
221
  requirements:
208
222
  - - ">="
@@ -216,21 +230,21 @@ dependencies:
216
230
  - !ruby/object:Gem::Version
217
231
  version: '0'
218
232
  - !ruby/object:Gem::Dependency
219
- name: rake
233
+ name: minitest-reporters
220
234
  requirement: !ruby/object:Gem::Requirement
221
235
  requirements:
222
- - - ">="
236
+ - - "~>"
223
237
  - !ruby/object:Gem::Version
224
- version: '0'
238
+ version: '1.4'
225
239
  type: :development
226
240
  prerelease: false
227
241
  version_requirements: !ruby/object:Gem::Requirement
228
242
  requirements:
229
- - - ">="
243
+ - - "~>"
230
244
  - !ruby/object:Gem::Version
231
- version: '0'
245
+ version: '1.4'
232
246
  - !ruby/object:Gem::Dependency
233
- name: codeclimate-test-reporter
247
+ name: pry
234
248
  requirement: !ruby/object:Gem::Requirement
235
249
  requirements:
236
250
  - - ">="
@@ -244,7 +258,7 @@ dependencies:
244
258
  - !ruby/object:Gem::Version
245
259
  version: '0'
246
260
  - !ruby/object:Gem::Dependency
247
- name: simplecov
261
+ name: rake
248
262
  requirement: !ruby/object:Gem::Requirement
249
263
  requirements:
250
264
  - - ">="
@@ -258,7 +272,7 @@ dependencies:
258
272
  - !ruby/object:Gem::Version
259
273
  version: '0'
260
274
  - !ruby/object:Gem::Dependency
261
- name: bundler-audit
275
+ name: simplecov
262
276
  requirement: !ruby/object:Gem::Requirement
263
277
  requirements:
264
278
  - - ">="
@@ -304,6 +318,7 @@ files:
304
318
  - lib/inspec_tools/ckl.rb
305
319
  - lib/inspec_tools/cli.rb
306
320
  - lib/inspec_tools/csv.rb
321
+ - lib/inspec_tools/generate_map.rb
307
322
  - lib/inspec_tools/help.rb
308
323
  - lib/inspec_tools/help/compliance.md
309
324
  - lib/inspec_tools/help/csv2inspec.md
@@ -327,12 +342,17 @@ files:
327
342
  - lib/overrides/object.rb
328
343
  - lib/overrides/string.rb
329
344
  - lib/overrides/true_class.rb
345
+ - lib/utilities/cci_xml.rb
330
346
  - lib/utilities/cis_to_nist.rb
331
347
  - lib/utilities/csv_util.rb
332
348
  - lib/utilities/extract_pdf_text.rb
333
349
  - lib/utilities/inspec_util.rb
350
+ - lib/utilities/mapping_validator.rb
334
351
  - lib/utilities/parser.rb
335
352
  - lib/utilities/text_cleaner.rb
353
+ - lib/utilities/xccdf/from_inspec.rb
354
+ - lib/utilities/xccdf/to_xccdf.rb
355
+ - lib/utilities/xccdf/xccdf_score.rb
336
356
  homepage: https://inspec-tools.mitre.org/
337
357
  licenses:
338
358
  - Apache-2.0