inspec_tools 0.0.0.1.ENOTAG

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +662 -0
  3. data/LICENSE.md +15 -0
  4. data/README.md +329 -0
  5. data/Rakefile +30 -0
  6. data/exe/inspec_tools +14 -0
  7. data/lib/data/NIST_Map_02052020_CIS_Controls_Version_7.1_Implementation_Groups_1.2.xlsx +0 -0
  8. data/lib/data/NIST_Map_09212017B_CSC-CIS_Critical_Security_Controls_VER_6.1_Excel_9.1.2016.xlsx +0 -0
  9. data/lib/data/README.TXT +25 -0
  10. data/lib/data/U_CCI_List.xml +38403 -0
  11. data/lib/data/attributes.yml +23 -0
  12. data/lib/data/cci2html.xsl +136 -0
  13. data/lib/data/mapping.yml +17 -0
  14. data/lib/data/stig.csv +1 -0
  15. data/lib/data/threshold.yaml +83 -0
  16. data/lib/exceptions/impact_input_error.rb +6 -0
  17. data/lib/exceptions/severity_input_error.rb +6 -0
  18. data/lib/happy_mapper_tools/benchmark.rb +161 -0
  19. data/lib/happy_mapper_tools/cci_attributes.rb +66 -0
  20. data/lib/happy_mapper_tools/stig_attributes.rb +196 -0
  21. data/lib/happy_mapper_tools/stig_checklist.rb +99 -0
  22. data/lib/inspec_tools.rb +17 -0
  23. data/lib/inspec_tools/ckl.rb +20 -0
  24. data/lib/inspec_tools/cli.rb +31 -0
  25. data/lib/inspec_tools/csv.rb +101 -0
  26. data/lib/inspec_tools/help.rb +9 -0
  27. data/lib/inspec_tools/help/compliance.md +7 -0
  28. data/lib/inspec_tools/help/csv2inspec.md +5 -0
  29. data/lib/inspec_tools/help/inspec2ckl.md +5 -0
  30. data/lib/inspec_tools/help/inspec2csv.md +5 -0
  31. data/lib/inspec_tools/help/inspec2xccdf.md +5 -0
  32. data/lib/inspec_tools/help/pdf2inspec.md +6 -0
  33. data/lib/inspec_tools/help/summary.md +5 -0
  34. data/lib/inspec_tools/help/xccdf2inspec.md +5 -0
  35. data/lib/inspec_tools/inspec.rb +331 -0
  36. data/lib/inspec_tools/pdf.rb +136 -0
  37. data/lib/inspec_tools/plugin.rb +15 -0
  38. data/lib/inspec_tools/plugin_cli.rb +278 -0
  39. data/lib/inspec_tools/summary.rb +126 -0
  40. data/lib/inspec_tools/version.rb +8 -0
  41. data/lib/inspec_tools/xccdf.rb +155 -0
  42. data/lib/inspec_tools/xlsx_tool.rb +148 -0
  43. data/lib/inspec_tools_plugin.rb +7 -0
  44. data/lib/overrides/false_class.rb +5 -0
  45. data/lib/overrides/nil_class.rb +5 -0
  46. data/lib/overrides/object.rb +5 -0
  47. data/lib/overrides/string.rb +5 -0
  48. data/lib/overrides/true_class.rb +5 -0
  49. data/lib/utilities/csv_util.rb +14 -0
  50. data/lib/utilities/extract_nist_cis_mapping.rb +57 -0
  51. data/lib/utilities/extract_pdf_text.rb +20 -0
  52. data/lib/utilities/inspec_util.rb +435 -0
  53. data/lib/utilities/parser.rb +373 -0
  54. data/lib/utilities/text_cleaner.rb +69 -0
  55. metadata +359 -0
@@ -0,0 +1,373 @@
1
+ # encoding: utf-8
2
+
3
+ require 'parslet'
4
+ require 'parslet/convenience'
5
+ require 'pp'
6
+
7
+ # rubocop:disable Metrics/ClassLength
8
+ module Util
9
+ class ControlParser < Parslet::Parser
10
+ root :controls
11
+
12
+ rule :controls do
13
+ control.repeat(1)
14
+ end
15
+
16
+ rule :control do
17
+ header >>
18
+ applicability >>
19
+ description.maybe >>
20
+ rationale.maybe >>
21
+ audit.maybe >>
22
+ remediation.maybe >>
23
+ impact.maybe >>
24
+ default_value.maybe >>
25
+ references.maybe >>
26
+ cis_controls.maybe
27
+ end
28
+
29
+ rule :attribute_absent do
30
+ str('Description:').absent? >>
31
+ str('Rationale:').absent? >>
32
+ str('Audit:').absent? >>
33
+ str('Remediation:').absent? >>
34
+ str('Impact:').absent? >>
35
+ str('Default Value:').absent? >>
36
+ str('References:').absent? >>
37
+ str('CIS Controls:').absent? >>
38
+ str('Profile Applicability::').absent? >>
39
+ header.absent?
40
+ end
41
+
42
+ rule(:header) do
43
+ newline.maybe >>
44
+ spaces.maybe >>
45
+ (section_num.as(:section_num) >>
46
+ title.as(:title) >>
47
+ score.as(:score)).as(:header) >>
48
+ newline
49
+ end
50
+
51
+ rule(:title) do
52
+ (str('(Scored)').absent? >> str('(Not Scored)').absent? >> str('(Not').absent? >> str('(Not ').absent? >> (anyChar | lparn | rparn | newline) | space).repeat(1)
53
+ end
54
+
55
+ rule :applicability do
56
+ str('Profile Applicability:') >>
57
+ newline.maybe >>
58
+ lines('Description:').as(:applicability)
59
+ end
60
+
61
+ rule :section_num do
62
+ (integer.repeat(1) >>
63
+ dot).repeat(1) >>
64
+ integer.repeat(1) >>
65
+ space
66
+ end
67
+
68
+ rule :description do
69
+ str('Description:') >>
70
+ newline.maybe >>
71
+ lines('Rationale:').as(:description)
72
+ end
73
+
74
+ rule :rationale do
75
+ str('Rationale:') >>
76
+ newline.maybe >>
77
+ lines('Audit:').as(:rationale)
78
+ end
79
+
80
+ rule :audit do
81
+ str('Audit:') >>
82
+ newline.maybe >>
83
+ lines('Remediation:').as(:audit)
84
+ end
85
+
86
+ rule :remediation do
87
+ str('Remediation:') >>
88
+ newline.maybe >>
89
+ lines('Impact:').as(:remediation)
90
+ end
91
+
92
+ rule :impact do
93
+ str('Impact:') >>
94
+ newline.maybe >>
95
+ lines('Default Value:').as(:impact)
96
+ end
97
+
98
+ rule :default_value do
99
+ str('Default Value:') >>
100
+ newline.maybe >>
101
+ lines('References:').as(:default_value)
102
+ end
103
+
104
+ rule :references do
105
+ str('References:') >>
106
+ newline.maybe >>
107
+ lines('CIS Controls:').as(:references)
108
+ end
109
+
110
+ rule :cis_controls do
111
+ str('CIS Controls:') >>
112
+ newline.maybe >>
113
+ lines("\n").as(:cis_controls)
114
+ end
115
+
116
+ rule :blank_line do
117
+ spaces >> newline >> spaces
118
+ end
119
+
120
+ rule :newline do
121
+ str("\r").maybe >> str("\n")
122
+ end
123
+
124
+ rule :semicolon do
125
+ str(';')
126
+ end
127
+
128
+ rule :spaces do
129
+ space.repeat(0)
130
+ end
131
+
132
+ rule :space do
133
+ match(/\s/)
134
+ end
135
+
136
+ rule :space? do
137
+ space.maybe
138
+ end
139
+
140
+ rule :hyphen do
141
+ str('-')
142
+ end
143
+
144
+ # @FIXME doesn't the parslet `any` function alreayd take care of this?
145
+ rule :anyChar do
146
+ match('.')
147
+ end
148
+
149
+ rule :integer do
150
+ match('[0-9]').repeat(1)
151
+ end
152
+
153
+ rule :word do
154
+ match('[a-zA-Z0-9/,\.:\'$-_\"*]').repeat(1)
155
+ end
156
+
157
+ rule :words do
158
+ (space? >> word >> (space | dot | hyphen).maybe).repeat(1) >> (newline >> (word >> space).repeat(1)).maybe
159
+ end
160
+
161
+ def line_body(_ending)
162
+ (attribute_absent >> any).repeat(1)
163
+ end
164
+
165
+ def line(ending)
166
+ line_body(ending)
167
+ end
168
+
169
+ def lines(ending)
170
+ line(ending).as(:line).repeat
171
+ end
172
+
173
+ rule(:eol?) { str("\n").maybe }
174
+ rule(:eof?) { any.absent? }
175
+
176
+ rule :dot do
177
+ str('.')
178
+ end
179
+
180
+ rule :real do
181
+ integer.repeat(1) >>
182
+ dot >>
183
+ integer.repeat(1) >>
184
+ dot.absent?
185
+ end
186
+
187
+ rule(:score) { lparn >> scored >> rparn }
188
+
189
+ rule :lparn do
190
+ str('(')
191
+ end
192
+
193
+ rule :rparn do
194
+ str(')')
195
+ end
196
+
197
+ rule :scored do
198
+ (str(' Scored') | str('Scored') | str('Not Scored') | (str('Not ') >> newline.maybe) | (str('Not') >> newline.maybe)).repeat
199
+ end
200
+ end
201
+
202
+ class Trans < Parslet::Transform
203
+ rule(line: simple(:text)) { text }
204
+ rule(section_num: simple(:section), title: simple(:title), score: simple(:score)) { section + title + score }
205
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
206
+ audit: sequence(:audit), remediation: sequence(:remediation), impact: sequence(:impact), default_value: sequence(:default_value),
207
+ references: sequence(:references), cis_controls: sequence(:cis_controls)) do
208
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
209
+ fix: remediation[0].to_s, impact: impact[0].to_s, default: default_value[0].to_s, ref: references[0].to_s, cis: cis_controls[0].to_s }
210
+ end
211
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
212
+ audit: sequence(:audit), remediation: sequence(:remediation),
213
+ references: sequence(:references)) do
214
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
215
+ fix: remediation[0].to_s, ref: references[0].to_s }
216
+ end
217
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
218
+ audit: sequence(:audit), remediation: sequence(:remediation), impact: sequence(:impact),
219
+ references: sequence(:references)) do
220
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
221
+ fix: remediation[0].to_s, impact: impact[0].to_s, ref: references[0].to_s }
222
+ end
223
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
224
+ audit: sequence(:audit), remediation: sequence(:remediation), impact: sequence(:impact)) do
225
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
226
+ fix: remediation[0].to_s, impact: impact[0].to_s }
227
+ end
228
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
229
+ audit: sequence(:audit), remediation: sequence(:remediation), default_value: sequence(:default_value),
230
+ references: sequence(:references)) do
231
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
232
+ fix: remediation[0].to_s, default: default_value[0].to_s, ref: references[0].to_s }
233
+ end
234
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
235
+ audit: sequence(:audit), remediation: sequence(:remediation), impact: sequence(:impact), default_value: sequence(:default_value),
236
+ references: sequence(:references)) do
237
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
238
+ fix: remediation[0].to_s, impact: impact[0].to_s, default: default_value[0].to_s, ref: references[0].to_s }
239
+ end
240
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
241
+ audit: sequence(:audit), remediation: sequence(:remediation)) do
242
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s, fix: remediation[0].to_s }
243
+ end
244
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
245
+ audit: sequence(:audit), remediation: sequence(:remediation), default_value: sequence(:default_value)) do
246
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
247
+ fix: remediation[0].to_s, default: default_value[0].to_s }
248
+ end
249
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
250
+ audit: sequence(:audit), remediation: sequence(:remediation)) do
251
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s, fix: remediation[0].to_s }
252
+ end
253
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
254
+ audit: sequence(:audit), references: sequence(:references)) do
255
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s, ref: references[0].to_s }
256
+ end
257
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
258
+ remediation: sequence(:remediation), impact: sequence(:impact)) do
259
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", fix: remediation[0].to_s, impact: impact[0].to_s }
260
+ end
261
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
262
+ remediation: sequence(:remediation), impact: sequence(:impact), references: sequence(:references)) do
263
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", fix: remediation[0].to_s,
264
+ impact: impact[0].to_s, ref: references[0].to_s }
265
+ end
266
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description),
267
+ audit: sequence(:audit), remediation: sequence(:remediation), default_value: sequence(:default_value),
268
+ references: sequence(:references)) do
269
+ { title: header.to_s, level: applicability[0].to_s, descr: description[0].to_s, check: audit[0].to_s, fix: remediation[0].to_s,
270
+ default: default_value[0].to_s, ref: references[0].to_s }
271
+ end
272
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
273
+ audit: sequence(:audit), impact: sequence(:impact), default_value: sequence(:default_value)) do
274
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
275
+ impact: impact[0].to_s, default: default_value[0].to_s }
276
+ end
277
+ rule(header: simple(:header), applicability: sequence(:applicability), rationale: sequence(:rationale),
278
+ audit: sequence(:audit), remediation: sequence(:remediation), references: sequence(:references)) do
279
+ { title: header.to_s, level: applicability[0].to_s, descr: rationale[0].to_s, check: audit[0].to_s, fix: remediation[0].to_s, ref: references[0].to_s }
280
+ end
281
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
282
+ remediation: sequence(:remediation), references: sequence(:references)) do
283
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", fix: remediation[0].to_s, ref: references[0].to_s }
284
+ end
285
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
286
+ audit: sequence(:audit), default_value: sequence(:default_value), references: sequence(:references)) do
287
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
288
+ default: default_value[0].to_s, ref: references[0].to_s }
289
+ end
290
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
291
+ audit: sequence(:audit), remediation: sequence(:remediation), impact: sequence(:impact), default_value: sequence(:default_value)) do
292
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s, fix: remediation[0].to_s,
293
+ impact: impact[0].to_s, default: default_value[0].to_s }
294
+ end
295
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
296
+ audit: sequence(:audit), impact: sequence(:impact), references: sequence(:references)) do
297
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s, impact: impact[0].to_s, ref: references[0].to_s }
298
+ end
299
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
300
+ audit: sequence(:audit), impact: sequence(:impact)) do
301
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s, impact: impact[0].to_s }
302
+ end
303
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
304
+ audit: sequence(:audit)) do
305
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s }
306
+ end
307
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
308
+ audit: sequence(:audit), remediation: sequence(:remediation), default_value: sequence(:default_value),
309
+ references: sequence(:references),
310
+ cis_controls: sequence(:cis_controls)) do
311
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s, fix: remediation[0].to_s,
312
+ default: default_value[0].to_s, ref: references[0].to_s, cis: cis_controls[0].to_s }
313
+ end
314
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
315
+ audit: sequence(:audit), remediation: sequence(:remediation), impact: sequence(:impact),
316
+ references: sequence(:references),
317
+ cis_controls: sequence(:cis_controls)) do
318
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s, fix: remediation[0].to_s,
319
+ impact: impact[0].to_s, ref: references[0].to_s, cis: cis_controls[0].to_s }
320
+ end
321
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description), rationale: sequence(:rationale),
322
+ audit: sequence(:audit), remediation: sequence(:remediation), references: sequence(:references),
323
+ cis_controls: sequence(:cis_controls)) do
324
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}", check: audit[0].to_s,
325
+ fix: remediation[0].to_s, ref: references[0].to_s, cis: cis_controls[0].to_s }
326
+ end
327
+ rule(header: simple(:header), applicability: sequence(:applicability), description: sequence(:description),
328
+ rationale: sequence(:rationale)) do
329
+ { title: header.to_s, level: applicability[0].to_s, descr: "#{description[0]}#{rationale[0]}" }
330
+ end
331
+ end
332
+
333
+ class PrepareData
334
+ def initialize(clean_text)
335
+ @parser = ControlParser.new
336
+ @attributes = []
337
+
338
+ data = parse(clean_text)
339
+
340
+ @transformed_data = Trans.new.apply(data)
341
+ add_cis
342
+ end
343
+
344
+ attr_reader :transformed_data
345
+
346
+ def parse(clean_text)
347
+ @parser.parse(clean_text)
348
+ rescue Parslet::ParseFailed => error
349
+ puts error.parse_failure_cause.ascii_tree
350
+ end
351
+
352
+ def convert_str(value)
353
+ value.to_s
354
+ end
355
+
356
+ def add_cis
357
+ @transformed_data&.map do |ctrl|
358
+ if !ctrl[:cis] && ctrl[:ref]
359
+ references = ctrl[:ref].split("\n")
360
+ references.each do |ref|
361
+ match = ref.scan(/(?<=#)\d+\.\d+/).map(&:inspect).join(',').delete('"').tr(',', ' ')
362
+ ctrl[:cis] = match.split(' ') unless match.empty?
363
+ end
364
+ ctrl[:cis] = 'No CIS Control' unless ctrl[:cis]
365
+ elsif !ctrl[:cis] && !ctrl[:ref]
366
+ ctrl[:cis] = 'No CIS Control'
367
+ elsif ctrl[:cis] && ctrl[:ref]
368
+ ctrl[:cis] = ctrl[:cis].scan(/^\d+[\.\d+]*/)
369
+ end
370
+ end
371
+ end
372
+ end
373
+ end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+
3
+ module Util
4
+ class TextCleaner
5
+ # Takes in text file, cleans data and writes to new text file.
6
+ def clean_data(data)
7
+ clean_controls(data)
8
+ end
9
+
10
+ # Cleans control information from passed in file
11
+ def clean_controls(extracted_data)
12
+ controls_data = isolate_controls_data(extracted_data)
13
+ clean_section_header = remove_section_header(controls_data)
14
+ clean_whitespace = remove_newline_in_controls(clean_section_header)
15
+ clean_special = remove_special(clean_whitespace)
16
+ clean_no_space = remove_extra_space(clean_special)
17
+ clean_pagenum = remove_pagenum(clean_no_space)
18
+ clean_data = separate_controls(clean_pagenum)
19
+ clean_data
20
+ end
21
+
22
+ # Removes everything before and after the controls
23
+ def isolate_controls_data(extracted_data)
24
+ extracted_data = extracted_data.gsub(/\| P a g e+/, "| P a g e\n")
25
+ extracted_data = extracted_data.split("\n").map{ |line| line.strip}.reject { |e| e.to_s.empty? }.join("\n")
26
+ extracted_data = extracted_data.gsub('???', '')
27
+ controls_data = /^1\.1\s*[^\)]*?(?=\)$)(.*\n)*?(?=\s*Appendix:)/.match(extracted_data).to_s
28
+ controls_data
29
+ end
30
+
31
+ # Removes all pagenumbers between the controls
32
+ def remove_pagenum(extracted_data)
33
+ clean_pagenum = extracted_data.gsub(/(\d{1,3}\|Page|\d{1,3} \| P a g e)/, '').to_s
34
+ clean_pagenum = clean_pagenum.gsub(/(\d{1,3} \| Page)/, '').to_s
35
+ clean_pagenum
36
+ end
37
+
38
+ # Removes section headers for each control
39
+ def remove_section_header(extracted_data)
40
+ clean_section_header = extracted_data.gsub(/(?<!•)\s\n\d{1}\s.*(?:.*\n)*?(?=\d\.\d)/, "\n\n").to_s
41
+ clean_section_header
42
+ end
43
+
44
+ # removes newlines between a control
45
+ def remove_newline_in_controls(extracted_data)
46
+ clean_whitespace = extracted_data.gsub(/\s\n.*?(?!d\.)/, "\n").to_s
47
+ clean_whitespace
48
+ end
49
+
50
+ # adds whitespace between different controls
51
+ def separate_controls(extracted_data)
52
+ extracted_data.gsub(/((?=^\s*?\d\.\d{1,}.*\n?.*?(?<=\)$)))/, "\n").to_s
53
+ end
54
+
55
+ def remove_special(extracted_data)
56
+ extracted_data = extracted_data.gsub(/[]/, '')
57
+ extracted_data.gsub(/[•]/, '')
58
+ end
59
+
60
+ def remove_extra_space(extracted_data)
61
+ clean_data = extracted_data.gsub(/\n\n\n/, "\n")
62
+ clean_data = clean_data.gsub(/\t\n/, "\n")
63
+ clean_data = clean_data.delete("\t")
64
+ clean_data = clean_data.delete("\r")
65
+ clean_data = clean_data.gsub(/\s\s/, ' ')
66
+ clean_data.gsub(/(\n\n(?!^\d\.\d{1,}.*\n?.*?))/, '')
67
+ end
68
+ end
69
+ end
metadata ADDED
@@ -0,0 +1,359 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: inspec_tools
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0.1.ENOTAG
5
+ platform: ruby
6
+ authors:
7
+ - Robert Thew
8
+ - Matthew Dromazos
9
+ - Rony Xavier
10
+ - Aaron Lippold
11
+ autorequire:
12
+ bindir: exe
13
+ cert_chain: []
14
+ date: 2020-05-13 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: colorize
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: inspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 4.18.100
37
+ - - "<"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 4.18.100
47
+ - - "<"
48
+ - !ruby/object:Gem::Version
49
+ version: '5.0'
50
+ - !ruby/object:Gem::Dependency
51
+ name: inspec_objects
52
+ requirement: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '0.1'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.1'
64
+ - !ruby/object:Gem::Dependency
65
+ name: nokogiri
66
+ requirement: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.8'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.8'
78
+ - !ruby/object:Gem::Dependency
79
+ name: nokogiri-happymapper
80
+ requirement: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ type: :runtime
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ - !ruby/object:Gem::Dependency
93
+ name: OptionParser
94
+ requirement: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ - !ruby/object:Gem::Dependency
107
+ name: pdf-reader
108
+ requirement: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '2.1'
113
+ type: :runtime
114
+ prerelease: false
115
+ version_requirements: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '2.1'
120
+ - !ruby/object:Gem::Dependency
121
+ name: roo
122
+ requirement: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '2.8'
127
+ type: :runtime
128
+ prerelease: false
129
+ version_requirements: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '2.8'
134
+ - !ruby/object:Gem::Dependency
135
+ name: word_wrap
136
+ requirement: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '1.0'
141
+ type: :runtime
142
+ prerelease: false
143
+ version_requirements: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '1.0'
148
+ - !ruby/object:Gem::Dependency
149
+ name: git-lite-version-bump
150
+ requirement: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: 0.17.2
155
+ type: :runtime
156
+ prerelease: false
157
+ version_requirements: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: 0.17.2
162
+ - !ruby/object:Gem::Dependency
163
+ name: bundler
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ - !ruby/object:Gem::Dependency
177
+ name: minitest
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: pry
192
+ requirement: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ type: :development
198
+ prerelease: false
199
+ version_requirements: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ - !ruby/object:Gem::Dependency
205
+ name: rake
206
+ requirement: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ type: :development
212
+ prerelease: false
213
+ version_requirements: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ - !ruby/object:Gem::Dependency
219
+ name: codeclimate-test-reporter
220
+ requirement: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ type: :development
226
+ prerelease: false
227
+ version_requirements: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ - !ruby/object:Gem::Dependency
233
+ name: simplecov
234
+ requirement: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
239
+ type: :development
240
+ prerelease: false
241
+ version_requirements: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ - !ruby/object:Gem::Dependency
247
+ name: rubocop
248
+ requirement: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ type: :development
254
+ prerelease: false
255
+ version_requirements: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - ">="
258
+ - !ruby/object:Gem::Version
259
+ version: '0'
260
+ - !ruby/object:Gem::Dependency
261
+ name: bundler-audit
262
+ requirement: !ruby/object:Gem::Requirement
263
+ requirements:
264
+ - - ">="
265
+ - !ruby/object:Gem::Version
266
+ version: '0'
267
+ type: :development
268
+ prerelease: false
269
+ version_requirements: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - ">="
272
+ - !ruby/object:Gem::Version
273
+ version: '0'
274
+ description: Converter utils for Inspec that can be included as a gem or used from
275
+ the command line
276
+ email:
277
+ - rthew@mitre.org
278
+ executables:
279
+ - inspec_tools
280
+ extensions: []
281
+ extra_rdoc_files: []
282
+ files:
283
+ - CHANGELOG.md
284
+ - LICENSE.md
285
+ - README.md
286
+ - Rakefile
287
+ - exe/inspec_tools
288
+ - lib/data/NIST_Map_02052020_CIS_Controls_Version_7.1_Implementation_Groups_1.2.xlsx
289
+ - lib/data/NIST_Map_09212017B_CSC-CIS_Critical_Security_Controls_VER_6.1_Excel_9.1.2016.xlsx
290
+ - lib/data/README.TXT
291
+ - lib/data/U_CCI_List.xml
292
+ - lib/data/attributes.yml
293
+ - lib/data/cci2html.xsl
294
+ - lib/data/mapping.yml
295
+ - lib/data/stig.csv
296
+ - lib/data/threshold.yaml
297
+ - lib/exceptions/impact_input_error.rb
298
+ - lib/exceptions/severity_input_error.rb
299
+ - lib/happy_mapper_tools/benchmark.rb
300
+ - lib/happy_mapper_tools/cci_attributes.rb
301
+ - lib/happy_mapper_tools/stig_attributes.rb
302
+ - lib/happy_mapper_tools/stig_checklist.rb
303
+ - lib/inspec_tools.rb
304
+ - lib/inspec_tools/ckl.rb
305
+ - lib/inspec_tools/cli.rb
306
+ - lib/inspec_tools/csv.rb
307
+ - lib/inspec_tools/help.rb
308
+ - lib/inspec_tools/help/compliance.md
309
+ - lib/inspec_tools/help/csv2inspec.md
310
+ - lib/inspec_tools/help/inspec2ckl.md
311
+ - lib/inspec_tools/help/inspec2csv.md
312
+ - lib/inspec_tools/help/inspec2xccdf.md
313
+ - lib/inspec_tools/help/pdf2inspec.md
314
+ - lib/inspec_tools/help/summary.md
315
+ - lib/inspec_tools/help/xccdf2inspec.md
316
+ - lib/inspec_tools/inspec.rb
317
+ - lib/inspec_tools/pdf.rb
318
+ - lib/inspec_tools/plugin.rb
319
+ - lib/inspec_tools/plugin_cli.rb
320
+ - lib/inspec_tools/summary.rb
321
+ - lib/inspec_tools/version.rb
322
+ - lib/inspec_tools/xccdf.rb
323
+ - lib/inspec_tools/xlsx_tool.rb
324
+ - lib/inspec_tools_plugin.rb
325
+ - lib/overrides/false_class.rb
326
+ - lib/overrides/nil_class.rb
327
+ - lib/overrides/object.rb
328
+ - lib/overrides/string.rb
329
+ - lib/overrides/true_class.rb
330
+ - lib/utilities/csv_util.rb
331
+ - lib/utilities/extract_nist_cis_mapping.rb
332
+ - lib/utilities/extract_pdf_text.rb
333
+ - lib/utilities/inspec_util.rb
334
+ - lib/utilities/parser.rb
335
+ - lib/utilities/text_cleaner.rb
336
+ homepage: https://inspec-tools.mitre.org/
337
+ licenses:
338
+ - Apache-2.0
339
+ metadata: {}
340
+ post_install_message:
341
+ rdoc_options: []
342
+ require_paths:
343
+ - lib
344
+ required_ruby_version: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - "~>"
347
+ - !ruby/object:Gem::Version
348
+ version: '2.5'
349
+ required_rubygems_version: !ruby/object:Gem::Requirement
350
+ requirements:
351
+ - - ">"
352
+ - !ruby/object:Gem::Version
353
+ version: 1.3.1
354
+ requirements: []
355
+ rubygems_version: 3.1.2
356
+ signing_key:
357
+ specification_version: 4
358
+ summary: Converter utils for Inspec
359
+ test_files: []