abide_dev_utils 0.9.5 → 0.10.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/Gemfile.lock +80 -83
- data/abide_dev_utils.gemspec +2 -1
- data/lib/abide_dev_utils/cem.rb +72 -0
- data/lib/abide_dev_utils/cli/cem.rb +73 -0
- data/lib/abide_dev_utils/cli/jira.rb +1 -1
- data/lib/abide_dev_utils/cli/xccdf.rb +15 -1
- data/lib/abide_dev_utils/cli.rb +2 -0
- data/lib/abide_dev_utils/files.rb +34 -0
- data/lib/abide_dev_utils/version.rb +1 -1
- data/lib/abide_dev_utils/xccdf/diff/benchmark/number_title.rb +270 -0
- data/lib/abide_dev_utils/xccdf/diff/benchmark/profile.rb +104 -0
- data/lib/abide_dev_utils/xccdf/diff/benchmark/property.rb +127 -0
- data/lib/abide_dev_utils/xccdf/diff/benchmark/property_existence.rb +47 -0
- data/lib/abide_dev_utils/xccdf/diff/benchmark.rb +267 -0
- data/lib/abide_dev_utils/xccdf/diff/utils.rb +30 -0
- data/lib/abide_dev_utils/xccdf/diff.rb +233 -0
- data/lib/abide_dev_utils/xccdf/parser/objects/digest_object.rb +118 -0
- data/lib/abide_dev_utils/xccdf/parser/objects/numbered_object.rb +104 -0
- data/lib/abide_dev_utils/xccdf/parser/objects.rb +741 -0
- data/lib/abide_dev_utils/xccdf/parser.rb +52 -0
- data/lib/abide_dev_utils/xccdf.rb +24 -125
- data/new_diff.rb +48 -0
- metadata +33 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c47baf812f2bb3b64951dc87b3aa1886eca947f0bf3a57bbed12b7ed7fda97ab
|
4
|
+
data.tar.gz: 4488f609550b251474337f1574c5c216601035fc5bba1fc9acb76e278252b5b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4e517c44f1c728689d1de11d0e306f65352ecf1b0507671d588ac5eb21dc294ac7bca68e7c790f21b9a47fa565ed775c2a28ce45257395203a0fa296c6f4389
|
7
|
+
data.tar.gz: 2b5ff4f1ad40d4000bb93862902c1a89e4620632825d19a34cd118fa43cc15823132cb4e9d246a1655ad1f6bd9636581398651e9082e8b16129f0c79eba9a5df
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
abide_dev_utils (0.
|
4
|
+
abide_dev_utils (0.10.1)
|
5
|
+
amatch (~> 0.4)
|
5
6
|
cmdparse (~> 3.0)
|
6
7
|
google-cloud-storage (~> 1.34)
|
7
8
|
hashdiff (~> 1.0)
|
8
|
-
jira-ruby (~> 2.
|
9
|
-
nokogiri (~> 1.
|
9
|
+
jira-ruby (~> 2.2)
|
10
|
+
nokogiri (~> 1.13)
|
10
11
|
puppet (>= 6.23)
|
11
12
|
ruby-progressbar (~> 1.11)
|
12
13
|
selenium-webdriver (~> 4.0.0.beta4)
|
@@ -14,73 +15,59 @@ PATH
|
|
14
15
|
GEM
|
15
16
|
remote: https://rubygems.org/
|
16
17
|
specs:
|
17
|
-
|
18
|
+
CFPropertyList (2.3.6)
|
19
|
+
activesupport (7.0.3)
|
18
20
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
19
21
|
i18n (>= 1.6, < 2)
|
20
22
|
minitest (>= 5.1)
|
21
23
|
tzinfo (~> 2.0)
|
22
24
|
addressable (2.8.0)
|
23
25
|
public_suffix (>= 2.0.2, < 5.0)
|
26
|
+
amatch (0.4.1)
|
27
|
+
mize
|
28
|
+
tins (~> 1.0)
|
24
29
|
ast (2.4.2)
|
25
|
-
async (1.30.
|
30
|
+
async (1.30.2)
|
26
31
|
console (~> 1.10)
|
27
32
|
nio4r (~> 2.3)
|
28
33
|
timers (~> 4.1)
|
29
|
-
async-http (0.56.
|
34
|
+
async-http (0.56.6)
|
30
35
|
async (>= 1.25)
|
31
36
|
async-io (>= 1.28)
|
32
37
|
async-pool (>= 0.2)
|
33
38
|
protocol-http (~> 0.22.0)
|
34
39
|
protocol-http1 (~> 0.14.0)
|
35
40
|
protocol-http2 (~> 0.14.0)
|
41
|
+
traces (~> 0.4.0)
|
36
42
|
async-http-faraday (0.11.0)
|
37
43
|
async-http (~> 0.42)
|
38
44
|
faraday
|
39
|
-
async-io (1.
|
45
|
+
async-io (1.33.0)
|
40
46
|
async
|
41
|
-
async-pool (0.3.
|
47
|
+
async-pool (0.3.10)
|
42
48
|
async (>= 1.25)
|
43
49
|
atlassian-jwt (0.2.1)
|
44
50
|
jwt (~> 2.1)
|
45
51
|
childprocess (4.1.0)
|
46
52
|
cmdparse (3.0.7)
|
47
53
|
coderay (1.1.3)
|
48
|
-
concurrent-ruby (1.1.
|
49
|
-
console (1.
|
54
|
+
concurrent-ruby (1.1.10)
|
55
|
+
console (1.15.3)
|
50
56
|
fiber-local
|
51
57
|
declarative (0.0.20)
|
52
58
|
deep_merge (1.2.2)
|
53
59
|
diff-lcs (1.5.0)
|
54
60
|
digest-crc (0.6.4)
|
55
61
|
rake (>= 12.0.0, < 14.0.0)
|
56
|
-
facter (4.2.
|
62
|
+
facter (4.2.10)
|
57
63
|
hocon (~> 1.3)
|
58
64
|
thor (>= 1.0.1, < 2.0)
|
59
|
-
faraday (
|
60
|
-
faraday-
|
61
|
-
faraday-em_synchrony (~> 1.0)
|
62
|
-
faraday-excon (~> 1.1)
|
63
|
-
faraday-httpclient (~> 1.0)
|
64
|
-
faraday-multipart (~> 1.0)
|
65
|
-
faraday-net_http (~> 1.0)
|
66
|
-
faraday-net_http_persistent (~> 1.0)
|
67
|
-
faraday-patron (~> 1.0)
|
68
|
-
faraday-rack (~> 1.0)
|
69
|
-
faraday-retry (~> 1.0)
|
65
|
+
faraday (2.3.0)
|
66
|
+
faraday-net_http (~> 2.0)
|
70
67
|
ruby2_keywords (>= 0.0.4)
|
71
|
-
faraday-
|
72
|
-
faraday-em_synchrony (1.0.0)
|
73
|
-
faraday-excon (1.1.0)
|
74
|
-
faraday-http-cache (2.2.0)
|
68
|
+
faraday-http-cache (2.3.0)
|
75
69
|
faraday (>= 0.8)
|
76
|
-
faraday-
|
77
|
-
faraday-multipart (1.0.3)
|
78
|
-
multipart-post (>= 1.2, < 3)
|
79
|
-
faraday-net_http (1.0.1)
|
80
|
-
faraday-net_http_persistent (1.2.0)
|
81
|
-
faraday-patron (1.0.0)
|
82
|
-
faraday-rack (1.0.0)
|
83
|
-
faraday-retry (1.0.3)
|
70
|
+
faraday-net_http (2.0.3)
|
84
71
|
fast_gettext (1.8.0)
|
85
72
|
fiber-local (1.0.0)
|
86
73
|
gem-release (2.2.2)
|
@@ -93,7 +80,7 @@ GEM
|
|
93
80
|
octokit (~> 4.6)
|
94
81
|
rainbow (>= 2.2.1)
|
95
82
|
rake (>= 10.0)
|
96
|
-
google-apis-core (0.
|
83
|
+
google-apis-core (0.5.0)
|
97
84
|
addressable (~> 2.5, >= 2.5.1)
|
98
85
|
googleauth (>= 0.16.2, < 2.a)
|
99
86
|
httpclient (>= 2.8.1, < 3.a)
|
@@ -104,15 +91,15 @@ GEM
|
|
104
91
|
webrick
|
105
92
|
google-apis-iamcredentials_v1 (0.10.0)
|
106
93
|
google-apis-core (>= 0.4, < 2.a)
|
107
|
-
google-apis-storage_v1 (0.
|
94
|
+
google-apis-storage_v1 (0.14.0)
|
108
95
|
google-apis-core (>= 0.4, < 2.a)
|
109
96
|
google-cloud-core (1.6.0)
|
110
97
|
google-cloud-env (~> 1.0)
|
111
98
|
google-cloud-errors (~> 1.0)
|
112
|
-
google-cloud-env (1.
|
113
|
-
faraday (>= 0.17.3, <
|
99
|
+
google-cloud-env (1.6.0)
|
100
|
+
faraday (>= 0.17.3, < 3.0)
|
114
101
|
google-cloud-errors (1.2.0)
|
115
|
-
google-cloud-storage (1.36.
|
102
|
+
google-cloud-storage (1.36.2)
|
116
103
|
addressable (~> 2.8)
|
117
104
|
digest-crc (~> 0.4)
|
118
105
|
google-apis-iamcredentials_v1 (~> 0.1)
|
@@ -120,18 +107,18 @@ GEM
|
|
120
107
|
google-cloud-core (~> 1.6)
|
121
108
|
googleauth (>= 0.16.2, < 2.a)
|
122
109
|
mini_mime (~> 1.0)
|
123
|
-
googleauth (1.1.
|
124
|
-
faraday (>= 0.17.3, <
|
110
|
+
googleauth (1.1.3)
|
111
|
+
faraday (>= 0.17.3, < 3.a)
|
125
112
|
jwt (>= 1.4, < 3.0)
|
126
113
|
memoist (~> 0.16)
|
127
114
|
multi_json (~> 1.11)
|
128
115
|
os (>= 0.9, < 2.0)
|
129
116
|
signet (>= 0.16, < 2.a)
|
130
117
|
hashdiff (1.0.1)
|
131
|
-
hiera (3.
|
118
|
+
hiera (3.9.0)
|
132
119
|
hocon (1.3.1)
|
133
120
|
httpclient (2.8.3)
|
134
|
-
i18n (1.
|
121
|
+
i18n (1.10.0)
|
135
122
|
concurrent-ruby (~> 1.0)
|
136
123
|
jira-ruby (2.2.0)
|
137
124
|
activesupport
|
@@ -143,25 +130,27 @@ GEM
|
|
143
130
|
memoist (0.16.2)
|
144
131
|
method_source (1.0.0)
|
145
132
|
mini_mime (1.1.2)
|
146
|
-
mini_portile2 (2.7.1)
|
147
133
|
minitest (5.15.0)
|
134
|
+
mize (0.4.0)
|
135
|
+
protocol (~> 2.0)
|
148
136
|
multi_json (1.15.0)
|
149
137
|
multipart-post (2.1.1)
|
150
138
|
nio4r (2.5.8)
|
151
|
-
nokogiri (1.13.
|
152
|
-
mini_portile2 (~> 2.7.0)
|
139
|
+
nokogiri (1.13.6-x86_64-darwin)
|
153
140
|
racc (~> 1.4)
|
154
|
-
oauth (0.5.
|
155
|
-
octokit (4.
|
156
|
-
faraday (>=
|
157
|
-
sawyer (~> 0.
|
141
|
+
oauth (0.5.10)
|
142
|
+
octokit (4.23.0)
|
143
|
+
faraday (>= 1, < 3)
|
144
|
+
sawyer (~> 0.9)
|
158
145
|
os (1.1.4)
|
159
|
-
parallel (1.
|
160
|
-
parser (3.1.
|
146
|
+
parallel (1.22.1)
|
147
|
+
parser (3.1.2.0)
|
161
148
|
ast (~> 2.4.1)
|
149
|
+
protocol (2.0.0)
|
150
|
+
ruby_parser (~> 3.0)
|
162
151
|
protocol-hpack (1.4.2)
|
163
|
-
protocol-http (0.22.
|
164
|
-
protocol-http1 (0.14.
|
152
|
+
protocol-http (0.22.6)
|
153
|
+
protocol-http1 (0.14.4)
|
165
154
|
protocol-http (~> 0.22)
|
166
155
|
protocol-http2 (0.14.2)
|
167
156
|
protocol-hpack (~> 1.4)
|
@@ -169,8 +158,9 @@ GEM
|
|
169
158
|
pry (0.14.1)
|
170
159
|
coderay (~> 1.1)
|
171
160
|
method_source (~> 1.0)
|
172
|
-
public_suffix (4.0.
|
173
|
-
puppet (7.
|
161
|
+
public_suffix (4.0.7)
|
162
|
+
puppet (7.17.0-universal-darwin)
|
163
|
+
CFPropertyList (~> 2.2)
|
174
164
|
concurrent-ruby (~> 1.0)
|
175
165
|
deep_merge (~> 1.0)
|
176
166
|
facter (> 2.0.1, < 5)
|
@@ -186,63 +176,70 @@ GEM
|
|
186
176
|
racc (1.6.0)
|
187
177
|
rainbow (3.1.1)
|
188
178
|
rake (13.0.6)
|
189
|
-
regexp_parser (2.
|
190
|
-
representable (3.
|
179
|
+
regexp_parser (2.5.0)
|
180
|
+
representable (3.2.0)
|
191
181
|
declarative (< 0.1.0)
|
192
182
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
193
183
|
uber (< 0.2.0)
|
194
184
|
retriable (3.1.2)
|
195
185
|
rexml (3.2.5)
|
196
|
-
rspec (3.
|
197
|
-
rspec-core (~> 3.
|
198
|
-
rspec-expectations (~> 3.
|
199
|
-
rspec-mocks (~> 3.
|
200
|
-
rspec-core (3.
|
201
|
-
rspec-support (~> 3.
|
202
|
-
rspec-expectations (3.
|
186
|
+
rspec (3.11.0)
|
187
|
+
rspec-core (~> 3.11.0)
|
188
|
+
rspec-expectations (~> 3.11.0)
|
189
|
+
rspec-mocks (~> 3.11.0)
|
190
|
+
rspec-core (3.11.0)
|
191
|
+
rspec-support (~> 3.11.0)
|
192
|
+
rspec-expectations (3.11.0)
|
203
193
|
diff-lcs (>= 1.2.0, < 2.0)
|
204
|
-
rspec-support (~> 3.
|
205
|
-
rspec-mocks (3.
|
194
|
+
rspec-support (~> 3.11.0)
|
195
|
+
rspec-mocks (3.11.1)
|
206
196
|
diff-lcs (>= 1.2.0, < 2.0)
|
207
|
-
rspec-support (~> 3.
|
208
|
-
rspec-support (3.
|
209
|
-
rubocop (1.
|
197
|
+
rspec-support (~> 3.11.0)
|
198
|
+
rspec-support (3.11.0)
|
199
|
+
rubocop (1.30.0)
|
210
200
|
parallel (~> 1.10)
|
211
|
-
parser (>= 3.
|
201
|
+
parser (>= 3.1.0.0)
|
212
202
|
rainbow (>= 2.2.2, < 4.0)
|
213
203
|
regexp_parser (>= 1.8, < 3.0)
|
214
|
-
rexml
|
215
|
-
rubocop-ast (>= 1.
|
204
|
+
rexml (>= 3.2.5, < 4.0)
|
205
|
+
rubocop-ast (>= 1.18.0, < 2.0)
|
216
206
|
ruby-progressbar (~> 1.7)
|
217
207
|
unicode-display_width (>= 1.4.0, < 3.0)
|
218
|
-
rubocop-ast (1.
|
219
|
-
parser (>= 3.
|
208
|
+
rubocop-ast (1.18.0)
|
209
|
+
parser (>= 3.1.1.0)
|
220
210
|
rubocop-i18n (3.0.0)
|
221
211
|
rubocop (~> 1.0)
|
222
|
-
rubocop-performance (1.
|
212
|
+
rubocop-performance (1.14.0)
|
223
213
|
rubocop (>= 1.7.0, < 2.0)
|
224
214
|
rubocop-ast (>= 0.4.0)
|
225
|
-
rubocop-rspec (2.
|
215
|
+
rubocop-rspec (2.11.1)
|
226
216
|
rubocop (~> 1.19)
|
227
217
|
ruby-progressbar (1.11.0)
|
228
218
|
ruby2_keywords (0.0.5)
|
219
|
+
ruby_parser (3.19.1)
|
220
|
+
sexp_processor (~> 4.16)
|
229
221
|
rubyzip (2.3.2)
|
230
|
-
sawyer (0.
|
222
|
+
sawyer (0.9.1)
|
231
223
|
addressable (>= 2.3.5)
|
232
|
-
faraday (
|
224
|
+
faraday (>= 0.17.3, < 3)
|
233
225
|
scanf (1.0.0)
|
234
226
|
selenium-webdriver (4.0.3)
|
235
227
|
childprocess (>= 0.5, < 5.0)
|
236
228
|
rexml (~> 3.2, >= 3.2.5)
|
237
229
|
rubyzip (>= 1.2.2)
|
238
230
|
semantic_puppet (1.0.4)
|
239
|
-
|
231
|
+
sexp_processor (4.16.1)
|
232
|
+
signet (0.16.1)
|
240
233
|
addressable (~> 2.8)
|
241
|
-
faraday (>= 0.17.
|
234
|
+
faraday (>= 0.17.5, < 3.0)
|
242
235
|
jwt (>= 1.5, < 3.0)
|
243
236
|
multi_json (~> 1.10)
|
237
|
+
sync (0.5.0)
|
244
238
|
thor (1.2.1)
|
245
239
|
timers (4.3.3)
|
240
|
+
tins (1.31.1)
|
241
|
+
sync
|
242
|
+
traces (0.4.1)
|
246
243
|
trailblazer-option (0.1.2)
|
247
244
|
tzinfo (2.0.4)
|
248
245
|
concurrent-ruby (~> 1.0)
|
@@ -251,7 +248,7 @@ GEM
|
|
251
248
|
webrick (1.7.0)
|
252
249
|
|
253
250
|
PLATFORMS
|
254
|
-
|
251
|
+
x86_64-darwin-19
|
255
252
|
|
256
253
|
DEPENDENCIES
|
257
254
|
abide_dev_utils!
|
@@ -270,4 +267,4 @@ DEPENDENCIES
|
|
270
267
|
rubocop-rspec (~> 2.1)
|
271
268
|
|
272
269
|
BUNDLED WITH
|
273
|
-
2.
|
270
|
+
2.3.9
|
data/abide_dev_utils.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.require_paths = ['lib']
|
33
33
|
|
34
34
|
# Prod dependencies
|
35
|
-
spec.add_dependency 'nokogiri', '~> 1.
|
35
|
+
spec.add_dependency 'nokogiri', '~> 1.13'
|
36
36
|
spec.add_dependency 'cmdparse', '~> 3.0'
|
37
37
|
spec.add_dependency 'puppet', '>= 6.23'
|
38
38
|
spec.add_dependency 'jira-ruby', '~> 2.2'
|
@@ -40,6 +40,7 @@ Gem::Specification.new do |spec|
|
|
40
40
|
spec.add_dependency 'selenium-webdriver', '~> 4.0.0.beta4'
|
41
41
|
spec.add_dependency 'google-cloud-storage', '~> 1.34'
|
42
42
|
spec.add_dependency 'hashdiff', '~> 1.0'
|
43
|
+
spec.add_dependency 'amatch', '~> 0.4'
|
43
44
|
|
44
45
|
# Dev dependencies
|
45
46
|
spec.add_development_dependency 'bundler'
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'abide_dev_utils/xccdf'
|
4
|
+
|
5
|
+
module AbideDevUtils
|
6
|
+
# Methods for working with Compliance Enforcement Modules (CEM)
|
7
|
+
module CEM
|
8
|
+
def self.xccdf
|
9
|
+
return @xccdf if defined?(@xccdf)
|
10
|
+
|
11
|
+
xccdf = Object.new
|
12
|
+
xccdf.extend AbideDevUtils::XCCDF::Common
|
13
|
+
@xccdf = xccdf
|
14
|
+
@xccdf
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.rule_id_format(rule_id)
|
18
|
+
case rule_id
|
19
|
+
when /^c[0-9_]+$/
|
20
|
+
:hiera_title_num
|
21
|
+
when /^[a-z][a-z0-9_]+$/
|
22
|
+
:hiera_title
|
23
|
+
when /^[0-9.]+$/
|
24
|
+
:number
|
25
|
+
else
|
26
|
+
:title
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.rule_identifiers(rule_id)
|
31
|
+
{
|
32
|
+
number: xccdf.control_parts(rule_id).first,
|
33
|
+
hiera_title: xccdf.name_normalize_control(rule_id),
|
34
|
+
hiera_title_num: xccdf.number_normalize_control(rule_id),
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.update_legacy_config_from_diff(config_hiera, diff)
|
39
|
+
new_config_hiera = config_hiera.dup
|
40
|
+
new_control_configs = {}
|
41
|
+
change_report = []
|
42
|
+
changes = diff.select { |d| d[:type][0] == :number }
|
43
|
+
config_hiera['config']['control_configs'].each do |key, val_hash|
|
44
|
+
key_id_format = rule_id_format(key)
|
45
|
+
changed = false
|
46
|
+
changes.each do |change|
|
47
|
+
if key_id_format == :title
|
48
|
+
next unless change[:title] == key
|
49
|
+
else
|
50
|
+
next unless rule_identifiers(change[:self].id)[key_id_format] == key
|
51
|
+
end
|
52
|
+
|
53
|
+
changed = true
|
54
|
+
new_key = if key_id_format == :title
|
55
|
+
change[:other_title]
|
56
|
+
else
|
57
|
+
rule_identifiers(change[:other].id)[key_id_format]
|
58
|
+
end
|
59
|
+
new_control_configs[new_key] = val_hash
|
60
|
+
change_report << {
|
61
|
+
type: :identifier_update,
|
62
|
+
from: key,
|
63
|
+
to: new_key,
|
64
|
+
}
|
65
|
+
end
|
66
|
+
new_control_configs[key] = val_hash unless changed
|
67
|
+
end
|
68
|
+
new_config_hiera['config']['control_configs'] = new_control_configs
|
69
|
+
[new_config_hiera, change_report]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'abide_dev_utils/cem'
|
4
|
+
require 'abide_dev_utils/files'
|
5
|
+
require 'abide_dev_utils/output'
|
6
|
+
require 'abide_dev_utils/validate'
|
7
|
+
require 'abide_dev_utils/xccdf/diff/benchmark'
|
8
|
+
require 'abide_dev_utils/cli/abstract'
|
9
|
+
|
10
|
+
module Abide
|
11
|
+
module CLI
|
12
|
+
class CemCommand < AbideCommand
|
13
|
+
CMD_NAME = 'cem'
|
14
|
+
CMD_SHORT = 'Commands related to Puppet CEM'
|
15
|
+
CMD_LONG = 'Namespace for commands related to Puppet CEM'
|
16
|
+
def initialize
|
17
|
+
super(CMD_NAME, CMD_SHORT, CMD_LONG, takes_commands: true)
|
18
|
+
add_command(CemUpdateConfig.new)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class CemUpdateConfig < AbideCommand
|
23
|
+
CMD_NAME = 'update-config'
|
24
|
+
CMD_SHORT = 'Updates the Puppet CEM config'
|
25
|
+
CMD_LONG = 'Updates the Puppet CEM config'
|
26
|
+
def initialize
|
27
|
+
super(CMD_NAME, CMD_SHORT, CMD_LONG, takes_commands: true)
|
28
|
+
add_command(CemUpdateConfigFromDiff.new)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class CemUpdateConfigFromDiff < AbideCommand
|
33
|
+
CMD_NAME = 'from-diff'
|
34
|
+
CMD_SHORT = 'Update by diffing two XCCDF files'
|
35
|
+
CMD_LONG = 'Update by diffing two XCCDF files'
|
36
|
+
CMD_CONFIG_FILE = 'Path to the Puppet CEM config file'
|
37
|
+
CMD_CURRENT_XCCDF = 'Path to the current XCCDF file'
|
38
|
+
CMD_NEW_XCCDF = 'Path to the new XCCDF file'
|
39
|
+
def initialize
|
40
|
+
super(CMD_NAME, CMD_SHORT, CMD_LONG, takes_commands: false)
|
41
|
+
argument_desc(CONFIG_FILE: CMD_CONFIG_FILE, CURRENT_XCCDF: CMD_CURRENT_XCCDF, NEW_XCCDF: CMD_NEW_XCCDF)
|
42
|
+
options.on('-o [FILE]', '--out-file [FILE]', 'Path to save the updated config file') do |o|
|
43
|
+
@data[:out_file] = o
|
44
|
+
end
|
45
|
+
options.on('-v', '--verbose', 'Verbose output') do
|
46
|
+
@data[:verbose] = true
|
47
|
+
end
|
48
|
+
options.on('-q', '--quiet', 'Quiet output') do
|
49
|
+
@data[:quiet] = true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def help_arguments
|
54
|
+
<<~ARGHELP
|
55
|
+
Arguments:
|
56
|
+
CONFIG_FILE: #{CMD_CONFIG_FILE}
|
57
|
+
CURRENT_XCCDF: #{CMD_CURRENT_XCCDF}
|
58
|
+
NEW_XCCDF: #{CMD_NEW_XCCDF}
|
59
|
+
ARGHELP
|
60
|
+
end
|
61
|
+
|
62
|
+
def execute(config_file, cur_xccdf, new_xccdf)
|
63
|
+
AbideDevUtils::Validate.file(config_file, extension: 'yaml')
|
64
|
+
AbideDevUtils::Validate.file(cur_xccdf, extension: 'xml')
|
65
|
+
config_hiera = AbideDevUtils::Files::Reader.read(config_file, safe: true)
|
66
|
+
diff = AbideDevUtils::XCCDF::Diff::BenchmarkDiff.new(cur_xccdf, new_xccdf).diff[:diff][:number_title]
|
67
|
+
new_config_hiera, change_report = AbideDevUtils::CEM.update_legacy_config_from_diff(config_hiera, diff)
|
68
|
+
AbideDevUtils::Output.yaml(new_config_hiera, console: @data[:verbose], file: @data[:out_file])
|
69
|
+
AbideDevUtils::Output.simple(change_report) unless @data[:quiet]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -34,6 +34,9 @@ module Abide
|
|
34
34
|
options.on('-d [DIR]', '--files-output-directory [DIR]', 'Directory to save files data/mappings by default') do |d|
|
35
35
|
@data[:dir] = d
|
36
36
|
end
|
37
|
+
options.on('-V', '--version-output-dir', 'If saving to a directory, version the output directory') do
|
38
|
+
@data[:version_output_dir] = true
|
39
|
+
end
|
37
40
|
options.on('-q', '--quiet', 'Show no output in the terminal') { @data[:quiet] = true }
|
38
41
|
options.on('-p [PREFIX]', '--parent-key-prefix [PREFIX]', 'A prefix to append to the parent key') do |p|
|
39
42
|
@data[:parent_key_prefix] = p
|
@@ -104,13 +107,24 @@ module Abide
|
|
104
107
|
options.on('-p [PROFILE]', '--profile', 'Only diff and specific profile in the benchmarks') do |x|
|
105
108
|
@data[:profile] = x
|
106
109
|
end
|
110
|
+
options.on('-l [LEVEL]', '--level', 'Only diff the specific level in the benchmarks') do |x|
|
111
|
+
@data[:level] = x
|
112
|
+
end
|
113
|
+
options.on('-r', '--raw', 'Output the diff in raw hash format') { @data[:raw] = true }
|
107
114
|
options.on('-q', '--quiet', 'Show no output in the terminal') { @data[:quiet] = false }
|
108
115
|
options.on('--no-diff-profiles', 'Do not diff the profiles in the XCCDF files') { @data[:diff_profiles] = false }
|
109
116
|
options.on('--no-diff-controls', 'Do not diff the controls in the XCCDF files') { @data[:diff_controls] = false }
|
117
|
+
options.on('--old-style', 'Use old-style diffs') { @data[:old_style] = true }
|
110
118
|
end
|
111
119
|
|
112
120
|
def execute(file1, file2)
|
113
|
-
diffreport =
|
121
|
+
diffreport = if @data[:old_style]
|
122
|
+
AbideDevUtils::XCCDF.diff(file1, file2, @data)
|
123
|
+
else
|
124
|
+
dr = AbideDevUtils::XCCDF.new_style_diff(file1, file2, @data)
|
125
|
+
dr[:diff][:number_title].map! { |d| d[:text] }
|
126
|
+
dr
|
127
|
+
end
|
114
128
|
AbideDevUtils::Output.yaml(diffreport, console: @data.fetch(:quiet, true), file: @data.fetch(:outfile, nil))
|
115
129
|
end
|
116
130
|
end
|
data/lib/abide_dev_utils/cli.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'cmdparse'
|
4
4
|
require 'abide_dev_utils/version'
|
5
|
+
require 'abide_dev_utils/cli/cem'
|
5
6
|
require 'abide_dev_utils/constants'
|
6
7
|
require 'abide_dev_utils/cli/comply'
|
7
8
|
require 'abide_dev_utils/cli/puppet'
|
@@ -22,6 +23,7 @@ module Abide
|
|
22
23
|
parser.main_options.banner = ROOT_CMD_BANNER
|
23
24
|
parser.add_command(CmdParse::HelpCommand.new, default: true)
|
24
25
|
parser.add_command(CmdParse::VersionCommand.new(add_switches: true))
|
26
|
+
parser.add_command(CemCommand.new)
|
25
27
|
parser.add_command(ComplyCommand.new)
|
26
28
|
parser.add_command(PuppetCommand.new)
|
27
29
|
parser.add_command(XccdfCommand.new)
|
@@ -1,7 +1,41 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'abide_dev_utils/validate'
|
4
|
+
|
3
5
|
module AbideDevUtils
|
4
6
|
module Files
|
7
|
+
class Reader
|
8
|
+
def self.read(path, raw: false, safe: true, opts: {})
|
9
|
+
AbideDevUtils::Validate.file(path)
|
10
|
+
return File.read(path) if raw
|
11
|
+
|
12
|
+
extension = File.extname(path)
|
13
|
+
case extension
|
14
|
+
when /\.yaml|\.yml/
|
15
|
+
require 'yaml'
|
16
|
+
if safe
|
17
|
+
YAML.safe_load(File.read(path))
|
18
|
+
else
|
19
|
+
YAML.load_file(path)
|
20
|
+
end
|
21
|
+
when '.json'
|
22
|
+
require 'json'
|
23
|
+
return JSON.parse(File.read(path), opts) if safe
|
24
|
+
|
25
|
+
JSON.parse!(File.read(path), opts)
|
26
|
+
when '.xml'
|
27
|
+
require 'nokogiri'
|
28
|
+
File.open(path, 'r') do |file|
|
29
|
+
Nokogiri::XML.parse(file) do |config|
|
30
|
+
config.strict.noblanks.norecover
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
File.read(path)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
5
39
|
class Writer
|
6
40
|
MSG_EXT_APPEND = 'Appending %s extension to file'
|
7
41
|
|