abide_dev_utils 0.5.0 → 0.8.1
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 +30 -0
- data/abide_dev_utils.gemspec +10 -7
- data/itests.rb +138 -0
- data/lib/abide_dev_utils/cli/comply.rb +38 -20
- 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/comply.rb +446 -78
- 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/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 +66 -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.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: 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
|
|
@@ -94,6 +94,34 @@ dependencies:
|
|
|
94
94
|
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
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'
|
|
97
125
|
- !ruby/object:Gem::Dependency
|
|
98
126
|
name: bundler
|
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -164,6 +192,20 @@ dependencies:
|
|
|
164
192
|
- - ">="
|
|
165
193
|
- !ruby/object:Gem::Version
|
|
166
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'
|
|
167
209
|
- !ruby/object:Gem::Dependency
|
|
168
210
|
name: rspec
|
|
169
211
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -262,9 +304,10 @@ dependencies:
|
|
|
262
304
|
- - "~>"
|
|
263
305
|
- !ruby/object:Gem::Version
|
|
264
306
|
version: '1.8'
|
|
265
|
-
description: Provides a CLI with helpful utilities for developing
|
|
307
|
+
description: Provides a CLI with helpful utilities for developing compliance Puppet
|
|
308
|
+
code
|
|
266
309
|
email:
|
|
267
|
-
-
|
|
310
|
+
- abide-team@puppet.com
|
|
268
311
|
executables:
|
|
269
312
|
- abide
|
|
270
313
|
extensions: []
|
|
@@ -276,6 +319,7 @@ files:
|
|
|
276
319
|
- ".rubocop.yml"
|
|
277
320
|
- ".rubocop_todo.yml"
|
|
278
321
|
- CHANGELOG.md
|
|
322
|
+
- CODEOWNERS
|
|
279
323
|
- Dockerfile
|
|
280
324
|
- Gemfile
|
|
281
325
|
- LICENSE.txt
|
|
@@ -286,6 +330,7 @@ files:
|
|
|
286
330
|
- bin/console
|
|
287
331
|
- bin/setup
|
|
288
332
|
- exe/abide
|
|
333
|
+
- itests.rb
|
|
289
334
|
- lib/abide_dev_utils.rb
|
|
290
335
|
- lib/abide_dev_utils/cli.rb
|
|
291
336
|
- lib/abide_dev_utils/cli/abstract.rb
|
|
@@ -299,31 +344,35 @@ files:
|
|
|
299
344
|
- lib/abide_dev_utils/constants.rb
|
|
300
345
|
- lib/abide_dev_utils/errors.rb
|
|
301
346
|
- lib/abide_dev_utils/errors/base.rb
|
|
347
|
+
- lib/abide_dev_utils/errors/comply.rb
|
|
348
|
+
- lib/abide_dev_utils/errors/gcloud.rb
|
|
302
349
|
- lib/abide_dev_utils/errors/general.rb
|
|
303
350
|
- lib/abide_dev_utils/errors/jira.rb
|
|
304
351
|
- lib/abide_dev_utils/errors/ppt.rb
|
|
305
352
|
- lib/abide_dev_utils/errors/xccdf.rb
|
|
306
353
|
- lib/abide_dev_utils/files.rb
|
|
354
|
+
- lib/abide_dev_utils/gcloud.rb
|
|
307
355
|
- lib/abide_dev_utils/jira.rb
|
|
356
|
+
- lib/abide_dev_utils/mixins.rb
|
|
308
357
|
- lib/abide_dev_utils/output.rb
|
|
309
358
|
- lib/abide_dev_utils/ppt.rb
|
|
359
|
+
- lib/abide_dev_utils/ppt/api.rb
|
|
360
|
+
- lib/abide_dev_utils/ppt/class_utils.rb
|
|
310
361
|
- lib/abide_dev_utils/ppt/coverage.rb
|
|
311
362
|
- lib/abide_dev_utils/ppt/new_obj.rb
|
|
363
|
+
- lib/abide_dev_utils/ppt/score_module.rb
|
|
312
364
|
- lib/abide_dev_utils/prompt.rb
|
|
313
365
|
- lib/abide_dev_utils/resources/generic_spec.erb
|
|
314
|
-
- lib/abide_dev_utils/utils/general.rb
|
|
315
366
|
- lib/abide_dev_utils/validate.rb
|
|
316
367
|
- lib/abide_dev_utils/version.rb
|
|
317
368
|
- lib/abide_dev_utils/xccdf.rb
|
|
318
|
-
|
|
319
|
-
- lib/abide_dev_utils/xccdf/cis/hiera.rb
|
|
320
|
-
homepage: https://github.com/hsnodgrass/abide_dev_utils
|
|
369
|
+
homepage: https://github.com/puppetlabs/abide_dev_utils
|
|
321
370
|
licenses:
|
|
322
371
|
- MIT
|
|
323
372
|
metadata:
|
|
324
|
-
homepage_uri: https://github.com/
|
|
325
|
-
source_code_uri: https://github.com/
|
|
326
|
-
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
|
|
327
376
|
post_install_message:
|
|
328
377
|
rdoc_options: []
|
|
329
378
|
require_paths:
|
|
@@ -332,15 +381,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
332
381
|
requirements:
|
|
333
382
|
- - ">="
|
|
334
383
|
- !ruby/object:Gem::Version
|
|
335
|
-
version: 2.
|
|
384
|
+
version: 2.7.0
|
|
336
385
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
337
386
|
requirements:
|
|
338
387
|
- - ">="
|
|
339
388
|
- !ruby/object:Gem::Version
|
|
340
389
|
version: '0'
|
|
341
390
|
requirements: []
|
|
342
|
-
rubygems_version: 3.
|
|
391
|
+
rubygems_version: 3.1.4
|
|
343
392
|
signing_key:
|
|
344
393
|
specification_version: 4
|
|
345
|
-
summary: Helper utilities for developing
|
|
394
|
+
summary: Helper utilities for developing compliance Puppet code
|
|
346
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
|