abide_dev_utils 0.4.2 → 0.8.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rubocop.yml +1 -1
- data/CODEOWNERS +1 -0
- data/README.md +34 -0
- data/abide_dev_utils.gemspec +11 -7
- data/itests.rb +138 -0
- data/lib/abide_dev_utils/cli/abstract.rb +2 -0
- data/lib/abide_dev_utils/cli/comply.rb +115 -0
- data/lib/abide_dev_utils/cli/jira.rb +2 -2
- data/lib/abide_dev_utils/cli/puppet.rb +136 -11
- data/lib/abide_dev_utils/cli/xccdf.rb +26 -7
- data/lib/abide_dev_utils/cli.rb +2 -0
- data/lib/abide_dev_utils/comply.rb +498 -0
- data/lib/abide_dev_utils/config.rb +19 -0
- data/lib/abide_dev_utils/errors/comply.rb +17 -0
- data/lib/abide_dev_utils/errors/gcloud.rb +27 -0
- data/lib/abide_dev_utils/errors/general.rb +5 -0
- data/lib/abide_dev_utils/errors/ppt.rb +12 -0
- data/lib/abide_dev_utils/errors/xccdf.rb +8 -0
- data/lib/abide_dev_utils/errors.rb +2 -0
- data/lib/abide_dev_utils/gcloud.rb +22 -0
- data/lib/abide_dev_utils/jira.rb +15 -0
- data/lib/abide_dev_utils/mixins.rb +16 -0
- data/lib/abide_dev_utils/output.rb +7 -3
- data/lib/abide_dev_utils/ppt/api.rb +219 -0
- data/lib/abide_dev_utils/ppt/class_utils.rb +184 -0
- data/lib/abide_dev_utils/ppt/coverage.rb +2 -3
- data/lib/abide_dev_utils/ppt/score_module.rb +162 -0
- data/lib/abide_dev_utils/ppt.rb +138 -49
- data/lib/abide_dev_utils/validate.rb +5 -1
- data/lib/abide_dev_utils/version.rb +1 -1
- data/lib/abide_dev_utils/xccdf.rb +567 -9
- data/lib/abide_dev_utils.rb +1 -0
- metadata +82 -17
- data/lib/abide_dev_utils/utils/general.rb +0 -9
- data/lib/abide_dev_utils/xccdf/cis/hiera.rb +0 -161
- data/lib/abide_dev_utils/xccdf/cis.rb +0 -3
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.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- abide-team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '6.
|
47
|
+
version: '6.23'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '6.
|
54
|
+
version: '6.23'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: jira-ruby
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,48 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.11'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: selenium-webdriver
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 4.0.0.beta4
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 4.0.0.beta4
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: google-cloud-storage
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.34'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.34'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: hashdiff
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.0'
|
83
125
|
- !ruby/object:Gem::Dependency
|
84
126
|
name: bundler
|
85
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +192,20 @@ dependencies:
|
|
150
192
|
- - ">="
|
151
193
|
- !ruby/object:Gem::Version
|
152
194
|
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: pry
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
153
209
|
- !ruby/object:Gem::Dependency
|
154
210
|
name: rspec
|
155
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -248,9 +304,10 @@ dependencies:
|
|
248
304
|
- - "~>"
|
249
305
|
- !ruby/object:Gem::Version
|
250
306
|
version: '1.8'
|
251
|
-
description: Provides a CLI with helpful utilities for developing
|
307
|
+
description: Provides a CLI with helpful utilities for developing compliance Puppet
|
308
|
+
code
|
252
309
|
email:
|
253
|
-
-
|
310
|
+
- abide-team@puppet.com
|
254
311
|
executables:
|
255
312
|
- abide
|
256
313
|
extensions: []
|
@@ -262,6 +319,7 @@ files:
|
|
262
319
|
- ".rubocop.yml"
|
263
320
|
- ".rubocop_todo.yml"
|
264
321
|
- CHANGELOG.md
|
322
|
+
- CODEOWNERS
|
265
323
|
- Dockerfile
|
266
324
|
- Gemfile
|
267
325
|
- LICENSE.txt
|
@@ -272,42 +330,49 @@ files:
|
|
272
330
|
- bin/console
|
273
331
|
- bin/setup
|
274
332
|
- exe/abide
|
333
|
+
- itests.rb
|
275
334
|
- lib/abide_dev_utils.rb
|
276
335
|
- lib/abide_dev_utils/cli.rb
|
277
336
|
- lib/abide_dev_utils/cli/abstract.rb
|
337
|
+
- lib/abide_dev_utils/cli/comply.rb
|
278
338
|
- lib/abide_dev_utils/cli/jira.rb
|
279
339
|
- lib/abide_dev_utils/cli/puppet.rb
|
280
340
|
- lib/abide_dev_utils/cli/test.rb
|
281
341
|
- lib/abide_dev_utils/cli/xccdf.rb
|
342
|
+
- lib/abide_dev_utils/comply.rb
|
282
343
|
- lib/abide_dev_utils/config.rb
|
283
344
|
- lib/abide_dev_utils/constants.rb
|
284
345
|
- lib/abide_dev_utils/errors.rb
|
285
346
|
- lib/abide_dev_utils/errors/base.rb
|
347
|
+
- lib/abide_dev_utils/errors/comply.rb
|
348
|
+
- lib/abide_dev_utils/errors/gcloud.rb
|
286
349
|
- lib/abide_dev_utils/errors/general.rb
|
287
350
|
- lib/abide_dev_utils/errors/jira.rb
|
288
351
|
- lib/abide_dev_utils/errors/ppt.rb
|
289
352
|
- lib/abide_dev_utils/errors/xccdf.rb
|
290
353
|
- lib/abide_dev_utils/files.rb
|
354
|
+
- lib/abide_dev_utils/gcloud.rb
|
291
355
|
- lib/abide_dev_utils/jira.rb
|
356
|
+
- lib/abide_dev_utils/mixins.rb
|
292
357
|
- lib/abide_dev_utils/output.rb
|
293
358
|
- lib/abide_dev_utils/ppt.rb
|
359
|
+
- lib/abide_dev_utils/ppt/api.rb
|
360
|
+
- lib/abide_dev_utils/ppt/class_utils.rb
|
294
361
|
- lib/abide_dev_utils/ppt/coverage.rb
|
295
362
|
- lib/abide_dev_utils/ppt/new_obj.rb
|
363
|
+
- lib/abide_dev_utils/ppt/score_module.rb
|
296
364
|
- lib/abide_dev_utils/prompt.rb
|
297
365
|
- lib/abide_dev_utils/resources/generic_spec.erb
|
298
|
-
- lib/abide_dev_utils/utils/general.rb
|
299
366
|
- lib/abide_dev_utils/validate.rb
|
300
367
|
- lib/abide_dev_utils/version.rb
|
301
368
|
- lib/abide_dev_utils/xccdf.rb
|
302
|
-
|
303
|
-
- lib/abide_dev_utils/xccdf/cis/hiera.rb
|
304
|
-
homepage: https://github.com/hsnodgrass/abide_dev_utils
|
369
|
+
homepage: https://github.com/puppetlabs/abide_dev_utils
|
305
370
|
licenses:
|
306
371
|
- MIT
|
307
372
|
metadata:
|
308
|
-
homepage_uri: https://github.com/
|
309
|
-
source_code_uri: https://github.com/
|
310
|
-
changelog_uri: https://github.com/
|
373
|
+
homepage_uri: https://github.com/puppetlabs/abide_dev_utils
|
374
|
+
source_code_uri: https://github.com/puppetlabs/abide_dev_utils
|
375
|
+
changelog_uri: https://github.com/puppetlabs/abide_dev_utils
|
311
376
|
post_install_message:
|
312
377
|
rdoc_options: []
|
313
378
|
require_paths:
|
@@ -316,15 +381,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
316
381
|
requirements:
|
317
382
|
- - ">="
|
318
383
|
- !ruby/object:Gem::Version
|
319
|
-
version: 2.
|
384
|
+
version: 2.7.0
|
320
385
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
321
386
|
requirements:
|
322
387
|
- - ">="
|
323
388
|
- !ruby/object:Gem::Version
|
324
389
|
version: '0'
|
325
390
|
requirements: []
|
326
|
-
rubygems_version: 3.
|
391
|
+
rubygems_version: 3.1.4
|
327
392
|
signing_key:
|
328
393
|
specification_version: 4
|
329
|
-
summary: Helper utilities for developing
|
394
|
+
summary: Helper utilities for developing compliance Puppet code
|
330
395
|
test_files: []
|
@@ -1,161 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'yaml'
|
4
|
-
require 'nokogiri'
|
5
|
-
require 'abide_dev_utils/errors'
|
6
|
-
|
7
|
-
module AbideDevUtils
|
8
|
-
module XCCDF
|
9
|
-
module CIS
|
10
|
-
# Creates a Hiera structure by parsing a CIS XCCDF benchmark
|
11
|
-
# @!attribute [r] title
|
12
|
-
# @!attribute [r] version
|
13
|
-
# @!attribute [r] yaml_title
|
14
|
-
class Hiera
|
15
|
-
CONTROL_PREFIX = /^[\d.]+_/.freeze
|
16
|
-
UNDERSCORED = /(\s|\(|\)|-|\.)/.freeze
|
17
|
-
XPATHS = {
|
18
|
-
benchmark: {
|
19
|
-
all: 'xccdf:Benchmark',
|
20
|
-
title: 'xccdf:Benchmark/xccdf:title',
|
21
|
-
version: 'xccdf:Benchmark/xccdf:version'
|
22
|
-
},
|
23
|
-
profiles: {
|
24
|
-
all: 'xccdf:Benchmark/xccdf:Profile',
|
25
|
-
relative_title: './xccdf:title',
|
26
|
-
relative_select: './xccdf:select'
|
27
|
-
}
|
28
|
-
}.freeze
|
29
|
-
NEXT_GEN_WINDOWS = /(next_generation_windows_security)/.freeze
|
30
|
-
|
31
|
-
attr_reader :title, :version
|
32
|
-
|
33
|
-
# Creates a new Hiera object
|
34
|
-
# @param xccdf_file [String] path to an XCCDF file
|
35
|
-
# @param parent_key_prefix [String] a string to be prepended to the
|
36
|
-
# top-level key in the Hiera structure. Useful for namespacing
|
37
|
-
# the top-level key.
|
38
|
-
def initialize(xccdf_file, parent_key_prefix: nil, num: false)
|
39
|
-
@doc = parse(xccdf_file)
|
40
|
-
@title = xpath(XPATHS[:benchmark][:title]).children.to_s
|
41
|
-
@version = xpath(XPATHS[:benchmark][:version]).children.to_s
|
42
|
-
@profiles = xpath(XPATHS[:profiles][:all])
|
43
|
-
@parent_key = make_parent_key(@doc, parent_key_prefix)
|
44
|
-
@hash = make_hash(@doc, @parent_key, num)
|
45
|
-
end
|
46
|
-
|
47
|
-
def yaml_title
|
48
|
-
normalize_str(@title)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Convert the Hiera object to a hash
|
52
|
-
# @return [Hash]
|
53
|
-
def to_h
|
54
|
-
@hash
|
55
|
-
end
|
56
|
-
|
57
|
-
# Convert the Hiera object to a string
|
58
|
-
# @return [String]
|
59
|
-
def to_s
|
60
|
-
@hash.inspect
|
61
|
-
end
|
62
|
-
|
63
|
-
# Convert the Hiera object to YAML string
|
64
|
-
# @return [String] YAML-formatted string
|
65
|
-
def to_yaml
|
66
|
-
yh = @hash[@parent_key.to_sym].transform_keys do |k|
|
67
|
-
"#{@parent_key}::#{k}"
|
68
|
-
end
|
69
|
-
yh.to_yaml
|
70
|
-
end
|
71
|
-
|
72
|
-
# If a method gets called on the Hiera object which is not defined,
|
73
|
-
# this sends that method call to hash, then doc, then super.
|
74
|
-
def method_missing(method, *args, &block)
|
75
|
-
return true if ['exist?', 'exists?'].include?(method.to_s)
|
76
|
-
|
77
|
-
return @hash.send(method, *args, &block) if @hash.respond_to?(method)
|
78
|
-
|
79
|
-
return @doc.send(method, *args, &block) if @doc.respond_to?(method)
|
80
|
-
|
81
|
-
super(method, *args, &block)
|
82
|
-
end
|
83
|
-
|
84
|
-
# Checks the respond_to? of hash, doc, or super
|
85
|
-
def respond_to_missing?(method_name, include_private = false)
|
86
|
-
return true if ['exist?', 'exists?'].include?(method_name.to_s)
|
87
|
-
|
88
|
-
@hash || @doc || super
|
89
|
-
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
attr_accessor :doc, :hash, :parent_key, :profiles
|
94
|
-
|
95
|
-
# Accepts a path to an xccdf xml file and returns a parsed Nokogiri object of the file
|
96
|
-
# @param xccdf_file [String] path to an xccdf xml file
|
97
|
-
# @return [Nokogiri::Node] A Nokogiri node object of the XML document
|
98
|
-
def parse(xccdf_file)
|
99
|
-
raise AbideDevUtils::Errors::FileNotFoundError, xccdf_file unless File.file?(xccdf_file)
|
100
|
-
|
101
|
-
Nokogiri.XML(File.open(xccdf_file))
|
102
|
-
end
|
103
|
-
|
104
|
-
def make_hash(doc, parent_key, num)
|
105
|
-
hash = { parent_key.to_sym => { title: @title, version: @version } }
|
106
|
-
profiles = doc.xpath('xccdf:Benchmark/xccdf:Profile')
|
107
|
-
profiles.each do |p|
|
108
|
-
title = normalize_profile_name(p.xpath('./xccdf:title').children.to_s)
|
109
|
-
hash[parent_key.to_sym][title.to_sym] = []
|
110
|
-
selects = p.xpath('./xccdf:select')
|
111
|
-
selects.each do |s|
|
112
|
-
hash[parent_key.to_sym][title.to_sym] << normalize_ctrl_name(s['idref'].to_s, num)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
hash
|
116
|
-
end
|
117
|
-
|
118
|
-
def normalize_str(str)
|
119
|
-
nstr = str.downcase
|
120
|
-
nstr.gsub!(/[^a-z0-9]$/, '')
|
121
|
-
nstr.gsub!(/^[^a-z]/, '')
|
122
|
-
nstr.gsub!(/^(l1_|l2_|ng_)/, '')
|
123
|
-
nstr.delete!('(/|\\)')
|
124
|
-
nstr.gsub!(UNDERSCORED, '_')
|
125
|
-
nstr
|
126
|
-
end
|
127
|
-
|
128
|
-
def normalize_profile_name(prof)
|
129
|
-
prof_name = normalize_str("profile_#{prof}")
|
130
|
-
prof_name.gsub!(NEXT_GEN_WINDOWS, 'ngws')
|
131
|
-
prof_name
|
132
|
-
end
|
133
|
-
|
134
|
-
def normalize_ctrl_name(ctrl, num)
|
135
|
-
return num_normalize_ctrl(ctrl) if num
|
136
|
-
|
137
|
-
name_normalize_ctrl(ctrl)
|
138
|
-
end
|
139
|
-
|
140
|
-
def name_normalize_ctrl(ctrl)
|
141
|
-
new_ctrl = ctrl.split('benchmarks_rule_')[-1].gsub(CONTROL_PREFIX, '')
|
142
|
-
normalize_str(new_ctrl)
|
143
|
-
end
|
144
|
-
|
145
|
-
def num_normalize_ctrl(ctrl)
|
146
|
-
part = ctrl.split('benchmarks_rule_')[-1]
|
147
|
-
numpart = CONTROL_PREFIX.match(part).to_s.chop.gsub(UNDERSCORED, '_')
|
148
|
-
"c#{numpart}"
|
149
|
-
end
|
150
|
-
|
151
|
-
def make_parent_key(doc, prefix)
|
152
|
-
doc_title = normalize_str(doc.xpath(XPATHS[:benchmark][:title]).children.to_s)
|
153
|
-
return doc_title if prefix.nil?
|
154
|
-
|
155
|
-
sepped_prefix = prefix.end_with?('::') ? prefix : "#{prefix}::"
|
156
|
-
"#{sepped_prefix.chomp}#{doc_title}"
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|