abide_dev_utils 0.14.1 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +24 -38
- data/abide_dev_utils.gemspec +0 -1
- data/lib/abide_dev_utils/cem/benchmark.rb +0 -2
- data/lib/abide_dev_utils/cli/cem.rb +9 -8
- data/lib/abide_dev_utils/cli/jira.rb +48 -4
- data/lib/abide_dev_utils/cli/xccdf.rb +7 -13
- data/lib/abide_dev_utils/config.rb +3 -6
- data/lib/abide_dev_utils/files.rb +16 -6
- data/lib/abide_dev_utils/jira.rb +69 -1
- data/lib/abide_dev_utils/ppt/hiera.rb +7 -24
- data/lib/abide_dev_utils/prompt.rb +3 -1
- data/lib/abide_dev_utils/version.rb +1 -1
- data/lib/abide_dev_utils/xccdf/diff.rb +64 -200
- data/lib/abide_dev_utils/xccdf/parser/helpers.rb +0 -93
- data/lib/abide_dev_utils/xccdf/parser/objects/diffable_object.rb +347 -0
- data/lib/abide_dev_utils/xccdf/parser/objects.rb +413 -89
- data/lib/abide_dev_utils/xccdf/parser.rb +8 -9
- data/lib/abide_dev_utils/xccdf.rb +1 -10
- metadata +4 -24
- data/lib/abide_dev_utils/xccdf/diff/benchmark/number_title.rb +0 -270
- data/lib/abide_dev_utils/xccdf/diff/benchmark/profile.rb +0 -104
- data/lib/abide_dev_utils/xccdf/diff/benchmark/property.rb +0 -127
- data/lib/abide_dev_utils/xccdf/diff/benchmark/property_existence.rb +0 -47
- data/lib/abide_dev_utils/xccdf/diff/benchmark.rb +0 -267
- data/lib/abide_dev_utils/xccdf/diff/utils.rb +0 -30
- data/lib/abide_dev_utils/xccdf/parser/objects/digest_object.rb +0 -118
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8f5dc40bfe8e447b1440435f020db1fb63decccaa405d52301251d9b5786af9
|
4
|
+
data.tar.gz: 414c7c96cfb731b65ff942cac68cf078ac2d7e4bac01da3a567f0ace10599243
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bee0317d5e0c9b745537771c5c9425fb74d8c3a1a745dbaf2b694d9e258730608bf1616404efb59380a6178e51308385f1c4d6bb120fc9f35dd953432569c518
|
7
|
+
data.tar.gz: 47b08b70d6e148804606222ecd9a5d53740483f57c87613bead2fb8292d6f668a4a2507a046c5edb452a353d27ca6193d04f4736d347ac8c6f04291a1dbd61d0
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
abide_dev_utils (0.
|
5
|
-
amatch (~> 0.4)
|
4
|
+
abide_dev_utils (0.15.0)
|
6
5
|
cmdparse (~> 3.0)
|
7
6
|
facterdb (>= 1.21)
|
8
7
|
google-cloud-storage (~> 1.34)
|
@@ -18,16 +17,13 @@ GEM
|
|
18
17
|
remote: https://rubygems.org/
|
19
18
|
specs:
|
20
19
|
CFPropertyList (2.3.6)
|
21
|
-
activesupport (7.0.4.
|
20
|
+
activesupport (7.0.4.3)
|
22
21
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
23
22
|
i18n (>= 1.6, < 2)
|
24
23
|
minitest (>= 5.1)
|
25
24
|
tzinfo (~> 2.0)
|
26
25
|
addressable (2.8.0)
|
27
26
|
public_suffix (>= 2.0.2, < 5.0)
|
28
|
-
amatch (0.4.1)
|
29
|
-
mize
|
30
|
-
tins (~> 1.0)
|
31
27
|
ast (2.4.2)
|
32
28
|
async (1.30.2)
|
33
29
|
console (~> 1.10)
|
@@ -61,7 +57,7 @@ GEM
|
|
61
57
|
diff-lcs (1.5.0)
|
62
58
|
digest-crc (0.6.4)
|
63
59
|
rake (>= 12.0.0, < 14.0.0)
|
64
|
-
facter (4.
|
60
|
+
facter (4.4.1)
|
65
61
|
hocon (~> 1.3)
|
66
62
|
thor (>= 1.0.1, < 2.0)
|
67
63
|
facterdb (1.21.0)
|
@@ -85,7 +81,7 @@ GEM
|
|
85
81
|
octokit (~> 4.6)
|
86
82
|
rainbow (>= 2.2.1)
|
87
83
|
rake (>= 10.0)
|
88
|
-
google-apis-core (0.
|
84
|
+
google-apis-core (0.11.0)
|
89
85
|
addressable (~> 2.5, >= 2.5.1)
|
90
86
|
googleauth (>= 0.16.2, < 2.a)
|
91
87
|
httpclient (>= 2.8.1, < 3.a)
|
@@ -94,8 +90,8 @@ GEM
|
|
94
90
|
retriable (>= 2.0, < 4.a)
|
95
91
|
rexml
|
96
92
|
webrick
|
97
|
-
google-apis-iamcredentials_v1 (0.
|
98
|
-
google-apis-core (>= 0.
|
93
|
+
google-apis-iamcredentials_v1 (0.17.0)
|
94
|
+
google-apis-core (>= 0.11.0, < 2.a)
|
99
95
|
google-apis-storage_v1 (0.19.0)
|
100
96
|
google-apis-core (>= 0.9.0, < 2.a)
|
101
97
|
google-cloud-core (1.6.0)
|
@@ -103,7 +99,7 @@ GEM
|
|
103
99
|
google-cloud-errors (~> 1.0)
|
104
100
|
google-cloud-env (1.6.0)
|
105
101
|
faraday (>= 0.17.3, < 3.0)
|
106
|
-
google-cloud-errors (1.3.
|
102
|
+
google-cloud-errors (1.3.1)
|
107
103
|
google-cloud-storage (1.44.0)
|
108
104
|
addressable (~> 2.8)
|
109
105
|
digest-crc (~> 0.4)
|
@@ -112,7 +108,7 @@ GEM
|
|
112
108
|
google-cloud-core (~> 1.6)
|
113
109
|
googleauth (>= 0.16.2, < 2.a)
|
114
110
|
mini_mime (~> 1.0)
|
115
|
-
googleauth (1.
|
111
|
+
googleauth (1.5.2)
|
116
112
|
faraday (>= 0.17.3, < 3.a)
|
117
113
|
jwt (>= 1.4, < 3.0)
|
118
114
|
memoist (~> 0.16)
|
@@ -121,8 +117,8 @@ GEM
|
|
121
117
|
signet (>= 0.16, < 2.a)
|
122
118
|
hashdiff (1.0.1)
|
123
119
|
hashie (5.0.0)
|
124
|
-
hiera (3.
|
125
|
-
hocon (1.
|
120
|
+
hiera (3.12.0)
|
121
|
+
hocon (1.4.0)
|
126
122
|
httpclient (2.8.3)
|
127
123
|
i18n (1.12.0)
|
128
124
|
concurrent-ruby (~> 1.0)
|
@@ -132,18 +128,16 @@ GEM
|
|
132
128
|
atlassian-jwt
|
133
129
|
multipart-post
|
134
130
|
oauth (~> 0.5, >= 0.5.0)
|
135
|
-
jwt (2.7.
|
131
|
+
jwt (2.7.1)
|
136
132
|
locale (2.1.3)
|
137
133
|
memoist (0.16.2)
|
138
134
|
method_source (1.0.0)
|
139
135
|
mini_mime (1.1.2)
|
140
|
-
minitest (5.
|
141
|
-
mize (0.4.1)
|
142
|
-
protocol (~> 2.0)
|
136
|
+
minitest (5.18.0)
|
143
137
|
multi_json (1.15.0)
|
144
138
|
multipart-post (2.3.0)
|
145
139
|
nio4r (2.5.8)
|
146
|
-
nokogiri (1.
|
140
|
+
nokogiri (1.15.2-x86_64-darwin)
|
147
141
|
racc (~> 1.4)
|
148
142
|
oauth (0.6.2)
|
149
143
|
snaky_hash (~> 2.0)
|
@@ -155,8 +149,6 @@ GEM
|
|
155
149
|
parallel (1.22.1)
|
156
150
|
parser (3.1.2.0)
|
157
151
|
ast (~> 2.4.1)
|
158
|
-
protocol (2.0.0)
|
159
|
-
ruby_parser (~> 3.0)
|
160
152
|
protocol-hpack (1.4.2)
|
161
153
|
protocol-http (0.22.6)
|
162
154
|
protocol-http1 (0.14.4)
|
@@ -168,7 +160,7 @@ GEM
|
|
168
160
|
coderay (~> 1.1)
|
169
161
|
method_source (~> 1.0)
|
170
162
|
public_suffix (4.0.7)
|
171
|
-
puppet (7.
|
163
|
+
puppet (7.24.0-universal-darwin)
|
172
164
|
CFPropertyList (~> 2.2)
|
173
165
|
concurrent-ruby (~> 1.0, < 1.2.0)
|
174
166
|
deep_merge (~> 1.0)
|
@@ -182,9 +174,9 @@ GEM
|
|
182
174
|
semantic_puppet (~> 1.0)
|
183
175
|
puppet-resource_api (1.8.14)
|
184
176
|
hocon (>= 1.0)
|
185
|
-
puppet-strings (
|
186
|
-
rgen
|
187
|
-
yard (~> 0.9
|
177
|
+
puppet-strings (4.0.0)
|
178
|
+
rgen (~> 0.9)
|
179
|
+
yard (~> 0.9)
|
188
180
|
racc (1.6.2)
|
189
181
|
rainbow (3.1.1)
|
190
182
|
rake (13.0.6)
|
@@ -229,8 +221,6 @@ GEM
|
|
229
221
|
rubocop (~> 1.19)
|
230
222
|
ruby-progressbar (1.11.0)
|
231
223
|
ruby2_keywords (0.0.5)
|
232
|
-
ruby_parser (3.19.2)
|
233
|
-
sexp_processor (~> 4.16)
|
234
224
|
rubyzip (2.3.2)
|
235
225
|
sawyer (0.9.2)
|
236
226
|
addressable (>= 2.3.5)
|
@@ -240,8 +230,7 @@ GEM
|
|
240
230
|
childprocess (>= 0.5, < 5.0)
|
241
231
|
rexml (~> 3.2, >= 3.2.5)
|
242
232
|
rubyzip (>= 1.2.2)
|
243
|
-
semantic_puppet (1.0
|
244
|
-
sexp_processor (4.16.1)
|
233
|
+
semantic_puppet (1.1.0)
|
245
234
|
signet (0.17.0)
|
246
235
|
addressable (~> 2.8)
|
247
236
|
faraday (>= 0.17.5, < 3.a)
|
@@ -250,24 +239,21 @@ GEM
|
|
250
239
|
snaky_hash (2.0.1)
|
251
240
|
hashie
|
252
241
|
version_gem (~> 1.1, >= 1.1.1)
|
253
|
-
|
254
|
-
thor (1.2.1)
|
242
|
+
thor (1.2.2)
|
255
243
|
timers (4.3.3)
|
256
|
-
tins (1.32.1)
|
257
|
-
sync
|
258
244
|
traces (0.4.1)
|
259
245
|
trailblazer-option (0.1.2)
|
260
|
-
tzinfo (2.0.
|
246
|
+
tzinfo (2.0.6)
|
261
247
|
concurrent-ruby (~> 1.0)
|
262
248
|
uber (0.1.0)
|
263
249
|
unicode-display_width (2.1.0)
|
264
|
-
version_gem (1.1.
|
265
|
-
webrick (1.
|
266
|
-
yard (0.9.
|
267
|
-
webrick (~> 1.7.0)
|
250
|
+
version_gem (1.1.2)
|
251
|
+
webrick (1.8.1)
|
252
|
+
yard (0.9.34)
|
268
253
|
|
269
254
|
PLATFORMS
|
270
255
|
x86_64-darwin-19
|
256
|
+
x86_64-darwin-20
|
271
257
|
x86_64-linux
|
272
258
|
|
273
259
|
DEPENDENCIES
|
data/abide_dev_utils.gemspec
CHANGED
@@ -41,7 +41,6 @@ Gem::Specification.new do |spec|
|
|
41
41
|
spec.add_dependency 'selenium-webdriver', '~> 4.0.0.beta4'
|
42
42
|
spec.add_dependency 'google-cloud-storage', '~> 1.34'
|
43
43
|
spec.add_dependency 'hashdiff', '~> 1.0'
|
44
|
-
spec.add_dependency 'amatch', '~> 0.4'
|
45
44
|
spec.add_dependency 'facterdb', '>= 1.21'
|
46
45
|
|
47
46
|
# Dev dependencies
|
@@ -485,8 +485,6 @@ module AbideDevUtils
|
|
485
485
|
raise AbideDevUtils::Errors::ResourceDataNotFoundError, facts if rdata_files.nil? || rdata_files.empty?
|
486
486
|
|
487
487
|
YAML.load_file(rdata_files[0].path)
|
488
|
-
rescue StandardError => e
|
489
|
-
require 'pry'; binding.pry
|
490
488
|
end
|
491
489
|
end
|
492
490
|
end
|
@@ -4,7 +4,7 @@ require 'abide_dev_utils/cem'
|
|
4
4
|
require 'abide_dev_utils/files'
|
5
5
|
require 'abide_dev_utils/output'
|
6
6
|
require 'abide_dev_utils/validate'
|
7
|
-
require 'abide_dev_utils/xccdf/diff
|
7
|
+
require 'abide_dev_utils/xccdf/diff'
|
8
8
|
require 'abide_dev_utils/cli/abstract'
|
9
9
|
|
10
10
|
module Abide
|
@@ -162,13 +162,14 @@ module Abide
|
|
162
162
|
end
|
163
163
|
|
164
164
|
def execute(config_file, cur_xccdf, new_xccdf)
|
165
|
-
|
166
|
-
AbideDevUtils::Validate.file(
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
AbideDevUtils::
|
171
|
-
AbideDevUtils::Output.
|
165
|
+
warn 'This command is currently non-functional'
|
166
|
+
# AbideDevUtils::Validate.file(config_file, extension: 'yaml')
|
167
|
+
# AbideDevUtils::Validate.file(cur_xccdf, extension: 'xml')
|
168
|
+
# config_hiera = AbideDevUtils::Files::Reader.read(config_file, safe: true)
|
169
|
+
# diff = AbideDevUtils::XCCDF::Diff::BenchmarkDiff.new(cur_xccdf, new_xccdf).diff[:diff][:number_title]
|
170
|
+
# new_config_hiera, change_report = AbideDevUtils::CEM.update_legacy_config_from_diff(config_hiera, diff)
|
171
|
+
# AbideDevUtils::Output.yaml(new_config_hiera, console: @data[:verbose], file: @data[:out_file])
|
172
|
+
# AbideDevUtils::Output.simple(change_report) unless @data[:quiet]
|
172
173
|
end
|
173
174
|
end
|
174
175
|
|
@@ -23,6 +23,7 @@ module Abide
|
|
23
23
|
add_command(JiraNewIssueCommand.new)
|
24
24
|
add_command(JiraFromCoverageCommand.new)
|
25
25
|
add_command(JiraFromXccdfCommand.new)
|
26
|
+
add_command(JiraFromXccdfDiffCommand.new)
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
@@ -46,7 +47,7 @@ module Abide
|
|
46
47
|
end
|
47
48
|
|
48
49
|
class JiraGetIssueCommand < CmdParse::Command
|
49
|
-
CMD_NAME = '
|
50
|
+
CMD_NAME = 'get-issue'
|
50
51
|
CMD_SHORT = 'Gets a specific issue'
|
51
52
|
CMD_LONG = 'Returns JSON of a specific issue from key (<project>-<num>)'
|
52
53
|
def initialize
|
@@ -67,7 +68,7 @@ module Abide
|
|
67
68
|
end
|
68
69
|
|
69
70
|
class JiraNewIssueCommand < CmdParse::Command
|
70
|
-
CMD_NAME = '
|
71
|
+
CMD_NAME = 'new-issue'
|
71
72
|
CMD_SHORT = 'Creates a new issue in a project'
|
72
73
|
CMD_LONG = 'Allows you to create a new issue in a project'
|
73
74
|
def initialize
|
@@ -93,7 +94,7 @@ module Abide
|
|
93
94
|
end
|
94
95
|
|
95
96
|
class JiraFromCoverageCommand < CmdParse::Command
|
96
|
-
CMD_NAME = '
|
97
|
+
CMD_NAME = 'from-coverage'
|
97
98
|
CMD_SHORT = 'Creates a parent issue with subtasks from a coverage report'
|
98
99
|
CMD_LONG = 'Creates a parent issue with subtasks for a benchmark and any uncovered controls'
|
99
100
|
def initialize
|
@@ -116,7 +117,7 @@ module Abide
|
|
116
117
|
end
|
117
118
|
|
118
119
|
class JiraFromXccdfCommand < CmdParse::Command
|
119
|
-
CMD_NAME = '
|
120
|
+
CMD_NAME = 'from-xccdf'
|
120
121
|
CMD_SHORT = 'Creates a parent issue with subtasks from a xccdf file'
|
121
122
|
CMD_LONG = 'Creates a parent issue with subtasks for a benchmark and any uncovered controls'
|
122
123
|
def initialize
|
@@ -136,5 +137,48 @@ module Abide
|
|
136
137
|
JIRA.new_issues_from_xccdf(client, proj, path, epic: @data[:epic], dry_run: @data[:dry_run])
|
137
138
|
end
|
138
139
|
end
|
140
|
+
|
141
|
+
class JiraFromXccdfDiffCommand < CmdParse::Command
|
142
|
+
CMD_NAME = 'from-xccdf-diff'
|
143
|
+
CMD_SHORT = 'Creates an Epic with tasks from a xccdf diff'
|
144
|
+
CMD_LONG = 'Creates an Epic with tasks for changes in a diff of two XCCDF files'
|
145
|
+
def initialize
|
146
|
+
super(CMD_NAME, takes_commands: false)
|
147
|
+
short_desc(CMD_SHORT)
|
148
|
+
long_desc(CMD_LONG)
|
149
|
+
argument_desc(PATH1: 'An XCCDF file', PATH2: 'An XCCDF file', PROJECT: 'A Jira project')
|
150
|
+
options.on('-d', '--dry-run', 'Print to console instead of saving objects') { |_| @data[:dry_run] = true }
|
151
|
+
options.on('-y', '--yes', 'Automatically approve all yes / no prompts') { |_| @data[:auto_approve] = true }
|
152
|
+
options.on('-e [EPIC]', '--epic [EPIC]', 'If given, tasks will be created and assigned to this epic. Takes form <PROJECT>-<NUM>') { |e| @data[:epic] = e }
|
153
|
+
options.on('-p [PROFILE]', '--profile', 'Only diff rules belonging to the matching profile. Takes a string that is treated as RegExp') do |x|
|
154
|
+
@data[:diff_opts] ||= {}
|
155
|
+
@data[:diff_opts][:profile] = x
|
156
|
+
end
|
157
|
+
options.on('-l [LEVEL]', '--level', 'Only diff rules belonging to the matching level. Takes a string that is treated as RegExp') do |x|
|
158
|
+
@data[:diff_opts] ||= {}
|
159
|
+
@data[:diff_opts][:level] = x
|
160
|
+
end
|
161
|
+
options.on('-i [PROPS]', '--ignore-changed-properties', 'Ignore changes to specified properties. Takes a comma-separated list.') do |x|
|
162
|
+
@data[:diff_opts] ||= {}
|
163
|
+
@data[:diff_opts][:ignore_changed_properties] = x.split(',')
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def execute(path1, path2, project)
|
168
|
+
Abide::CLI::VALIDATE.file(path1)
|
169
|
+
Abide::CLI::VALIDATE.file(path2)
|
170
|
+
@data[:dry_run] = false if @data[:dry_run].nil?
|
171
|
+
client = JIRA.client(options: {})
|
172
|
+
proj = JIRA.project(client, project)
|
173
|
+
JIRA.new_issues_from_xccdf_diff(client,
|
174
|
+
proj,
|
175
|
+
path1,
|
176
|
+
path2,
|
177
|
+
epic: @data[:epic],
|
178
|
+
dry_run: @data[:dry_run],
|
179
|
+
auto_approve: @data[:auto_approve],
|
180
|
+
diff_opts: @data[:diff_opts])
|
181
|
+
end
|
182
|
+
end
|
139
183
|
end
|
140
184
|
end
|
@@ -104,27 +104,21 @@ module Abide
|
|
104
104
|
super(CMD_NAME, CMD_SHORT, CMD_LONG, takes_commands: false)
|
105
105
|
argument_desc(FILE1: CMD_FILE1_ARG, FILE2: CMD_FILE2_ARG)
|
106
106
|
options.on('-o [PATH]', '--out-file', 'Save the report as a yaml file') { |x| @data[:outfile] = x }
|
107
|
-
options.on('-p [PROFILE]', '--profile', 'Only diff
|
107
|
+
options.on('-p [PROFILE]', '--profile', 'Only diff rules belonging to the matching profile. Takes a string that is treated as RegExp') do |x|
|
108
108
|
@data[:profile] = x
|
109
109
|
end
|
110
|
-
options.on('-l [LEVEL]', '--level', 'Only diff the
|
110
|
+
options.on('-l [LEVEL]', '--level', 'Only diff rules belonging to the matching level. Takes a string that is treated as RegExp') do |x|
|
111
111
|
@data[:level] = x
|
112
112
|
end
|
113
|
-
options.on('-
|
113
|
+
options.on('-i [PROPS]', '--ignore-changed-properties', 'Ignore changes to specified properties. Takes a comma-separated list.') do |x|
|
114
|
+
@data[:ignore_changed_properties] = x.split(',')
|
115
|
+
end
|
116
|
+
options.on('-r', '--raw', 'Output the diff in raw format') { @data[:raw] = true }
|
114
117
|
options.on('-q', '--quiet', 'Show no output in the terminal') { @data[:quiet] = false }
|
115
|
-
options.on('--no-diff-profiles', 'Do not diff the profiles in the XCCDF files') { @data[:diff_profiles] = false }
|
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 }
|
118
118
|
end
|
119
119
|
|
120
120
|
def execute(file1, file2)
|
121
|
-
diffreport =
|
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
|
121
|
+
diffreport = AbideDevUtils::XCCDF.diff(file1, file2, @data)
|
128
122
|
AbideDevUtils::Output.yaml(diffreport, console: @data.fetch(:quiet, true), file: @data.fetch(:outfile, nil))
|
129
123
|
end
|
130
124
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative 'files'
|
4
4
|
|
5
5
|
module AbideDevUtils
|
6
6
|
module Config
|
@@ -9,15 +9,12 @@ module AbideDevUtils
|
|
9
9
|
def self.to_h(path = DEFAULT_PATH)
|
10
10
|
return {} unless File.file?(path)
|
11
11
|
|
12
|
-
h =
|
12
|
+
h = AbideDevUtils::Files::Reader.read(path)
|
13
13
|
h.transform_keys(&:to_sym)
|
14
14
|
end
|
15
15
|
|
16
16
|
def to_h(path = DEFAULT_PATH)
|
17
|
-
|
18
|
-
|
19
|
-
h = YAML.safe_load(File.open(path), [Symbol])
|
20
|
-
h.transform_keys(&:to_sym)
|
17
|
+
self.class.to_h(path)
|
21
18
|
end
|
22
19
|
|
23
20
|
def self.config_section(section, path = DEFAULT_PATH)
|
@@ -12,12 +12,7 @@ module AbideDevUtils
|
|
12
12
|
extension = File.extname(path)
|
13
13
|
case extension
|
14
14
|
when /\.yaml|\.yml/
|
15
|
-
|
16
|
-
if safe
|
17
|
-
YAML.safe_load(File.read(path))
|
18
|
-
else
|
19
|
-
YAML.load_file(path)
|
20
|
-
end
|
15
|
+
read_yaml(path, safe: safe, opts: opts)
|
21
16
|
when '.json'
|
22
17
|
require 'json'
|
23
18
|
return JSON.parse(File.read(path), opts) if safe
|
@@ -34,6 +29,21 @@ module AbideDevUtils
|
|
34
29
|
File.read(path)
|
35
30
|
end
|
36
31
|
end
|
32
|
+
|
33
|
+
def self.read_yaml(path, safe: true, opts: { permitted_classes: [Symbol] })
|
34
|
+
permitted_classes = opts[:permitted_classes] || [Symbol]
|
35
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0')
|
36
|
+
require 'psych'
|
37
|
+
return Psych.safe_load_file(path, permitted_classes: permitted_classes) if safe
|
38
|
+
|
39
|
+
Psych.load_file(path)
|
40
|
+
else
|
41
|
+
require 'yaml'
|
42
|
+
return YAML.safe_load(File.read(path), permitted_classes) if safe
|
43
|
+
|
44
|
+
YAML.load(File.read(path)) # rubocop:disable Security/YAMLLoad
|
45
|
+
end
|
46
|
+
end
|
37
47
|
end
|
38
48
|
|
39
49
|
class Writer
|
data/lib/abide_dev_utils/jira.rb
CHANGED
@@ -11,6 +11,7 @@ module AbideDevUtils
|
|
11
11
|
ERRORS = AbideDevUtils::Errors::Jira
|
12
12
|
COV_PARENT_SUMMARY_PREFIX = '::BENCHMARK:: '
|
13
13
|
COV_CHILD_SUMMARY_PREFIX = '::CONTROL:: '
|
14
|
+
UPD_EPIC_SUMMARY_PREFIX = '::BENCHMARK UPDATE::'
|
14
15
|
PROGRESS_BAR_FORMAT = '%a %e %P% Created: %c of %C'
|
15
16
|
|
16
17
|
def self.project(client, project)
|
@@ -58,7 +59,7 @@ module AbideDevUtils
|
|
58
59
|
iss.save
|
59
60
|
end
|
60
61
|
|
61
|
-
def self.new_issue(client, project, summary, labels: ['abide_dev_utils'], epic: nil, dry_run: false)
|
62
|
+
def self.new_issue(client, project, summary, description: nil, labels: ['abide_dev_utils'], epic: nil, dry_run: false)
|
62
63
|
if dry_run
|
63
64
|
sleep(0.2)
|
64
65
|
return Dummy.new(summary)
|
@@ -69,6 +70,7 @@ module AbideDevUtils
|
|
69
70
|
fields['reporter'] = myself(client)
|
70
71
|
fields['issuetype'] = issuetype(client, 'Task')
|
71
72
|
fields['priority'] = priority(client, '6')
|
73
|
+
fields['description'] = description if description
|
72
74
|
fields['labels'] = labels
|
73
75
|
epic = issue(client, epic) if epic && !epic.is_a?(JIRA::Resource::Issue)
|
74
76
|
fields['customfield_10006'] = epic.key if epic # Epic_Link
|
@@ -227,6 +229,72 @@ module AbideDevUtils
|
|
227
229
|
AbideDevUtils::Output.simple("#{dr_prefix(dry_run)}Done creating tasks in Epic '#{epic.summary}'")
|
228
230
|
end
|
229
231
|
|
232
|
+
def self.new_issues_from_xccdf_diff(client, project, xccdf1_path, xccdf2_path, epic: nil, dry_run: false, auto_approve: false, diff_opts: {})
|
233
|
+
require 'abide_dev_utils/xccdf/diff'
|
234
|
+
diff = AbideDevUtils::XCCDF::Diff::BenchmarkDiff.new(xccdf1_path, xccdf2_path, diff_opts)
|
235
|
+
i_attrs = all_project_issues_attrs(project)
|
236
|
+
# We need to get the actual epic Issue object, or create it if it doesn't exist
|
237
|
+
epic = if epic.nil?
|
238
|
+
new_epic_summary = "#{UPD_EPIC_SUMMARY_PREFIX}#{diff.this.title}: v#{diff.this.version} -> #{diff.other.version}"
|
239
|
+
if summary_exist?(new_epic_summary, i_attrs)
|
240
|
+
issue(client, new_epic_summary)
|
241
|
+
else
|
242
|
+
unless AbideDevUtils::Prompt.yes_no("#{dr_prefix(dry_run)}Create new epic '#{new_epic_summary}'?", auto_approve: auto_approve)
|
243
|
+
AbideDevUtils::Output.simple("#{dr_prefix(dry_run)}Aborting")
|
244
|
+
exit(0)
|
245
|
+
end
|
246
|
+
new_epic(client, project.key, new_epic_summary, dry_run: dry_run)
|
247
|
+
end
|
248
|
+
else
|
249
|
+
issue(client, epic)
|
250
|
+
end
|
251
|
+
to_create = {}
|
252
|
+
diff.diff[:rules].each do |key, val|
|
253
|
+
next if val.empty?
|
254
|
+
|
255
|
+
val.each do |v|
|
256
|
+
case key
|
257
|
+
when :added
|
258
|
+
sum = "Add rule #{v[:number]} - #{v[:title]}"
|
259
|
+
sum = "#{sum[0..60]}..." if sum.length > 60
|
260
|
+
to_create[sum] = <<~DESC
|
261
|
+
Rule #{v[:number]} - #{v[:title]} is added with #{diff.other.title} #{diff.other.version}
|
262
|
+
DESC
|
263
|
+
when :removed
|
264
|
+
sum = "Remove rule #{v[:number]} - #{v[:title]}"
|
265
|
+
sum = "#{sum[0..60]}..." if sum.length > 60
|
266
|
+
to_create[sum] = <<~DESC
|
267
|
+
Rule #{v[:number]} - #{v[:title]} is removed from #{diff.this.title} #{diff.this.version}
|
268
|
+
DESC
|
269
|
+
else
|
270
|
+
sum = "Update rule \"#{v[:from]}\""
|
271
|
+
sum = "#{sum[0..60]}..." if sum.length > 60
|
272
|
+
to_create[sum] = <<~DESC
|
273
|
+
Rule #{v[:from]} is updated in #{diff.other.title} #{diff.other.version}:
|
274
|
+
#{v[:changes].collect { |k, v| "#{k}: #{v}" }.join("\n")}
|
275
|
+
DESC
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
approved_create = {}
|
280
|
+
to_create.each do |summary, description|
|
281
|
+
if AbideDevUtils::Prompt.yes_no("#{dr_prefix(dry_run)}Create new issue '#{summary}' with description:\n#{description}", auto_approve: auto_approve)
|
282
|
+
approved_create[summary] = description
|
283
|
+
end
|
284
|
+
end
|
285
|
+
AbideDevUtils::Output.simple("#{dr_prefix(dry_run)}Creating #{approved_create.keys.count} new Jira issues")
|
286
|
+
progress = AbideDevUtils::Output.progress(title: "#{dr_prefix(dry_run)}Creating issues",
|
287
|
+
total: approved_create.keys.count,
|
288
|
+
format: PROGRESS_BAR_FORMAT)
|
289
|
+
approved_create.each do |summary, description|
|
290
|
+
progress.log("#{dr_prefix(dry_run)}Creating #{summary}...")
|
291
|
+
new_issue(client, project.key, summary, description: description, labels: [], epic: epic, dry_run: dry_run)
|
292
|
+
progress.increment
|
293
|
+
end
|
294
|
+
progress.finish
|
295
|
+
AbideDevUtils::Output.simple("#{dr_prefix(dry_run)}Done creating tasks in Epic '#{epic.summary}'")
|
296
|
+
end
|
297
|
+
|
230
298
|
def self.merge_options(options)
|
231
299
|
config.merge(options)
|
232
300
|
end
|
@@ -236,12 +236,14 @@ module AbideDevUtils
|
|
236
236
|
new_paths = []
|
237
237
|
possible_fact_values.each do |pfv|
|
238
238
|
new_path = path.dup
|
239
|
+
values = []
|
239
240
|
pfv.each do |v|
|
240
241
|
next unless v
|
241
242
|
|
243
|
+
values << v if v
|
242
244
|
new_path.sub!(FACT_PATTERN, v)
|
243
245
|
end
|
244
|
-
new_paths << EntryPathLocalFile.new(new_path, facts,
|
246
|
+
new_paths << EntryPathLocalFile.new(new_path, facts, values)
|
245
247
|
end
|
246
248
|
new_paths.uniq(&:path).select(&:exist?)
|
247
249
|
end
|
@@ -249,16 +251,13 @@ module AbideDevUtils
|
|
249
251
|
|
250
252
|
# Represents a local file derived from a Hiera path
|
251
253
|
class EntryPathLocalFile
|
252
|
-
attr_reader :path, :facts
|
254
|
+
attr_reader :path, :facts, :values, :fact_values
|
253
255
|
|
254
|
-
def initialize(path, facts,
|
256
|
+
def initialize(path, facts, values)
|
255
257
|
@path = File.expand_path(File.join(AbideDevUtils::Ppt::Hiera.default_datadir, path))
|
256
258
|
@facts = facts
|
257
|
-
@
|
258
|
-
|
259
|
-
|
260
|
-
def fact_values
|
261
|
-
@fact_values ||= fact_values_for_path
|
259
|
+
@values = values
|
260
|
+
@fact_values = @facts.zip(@values).to_h
|
262
261
|
end
|
263
262
|
|
264
263
|
def path_parts
|
@@ -279,22 +278,6 @@ module AbideDevUtils
|
|
279
278
|
facts: facts
|
280
279
|
}
|
281
280
|
end
|
282
|
-
|
283
|
-
private
|
284
|
-
|
285
|
-
def fact_values_for_path
|
286
|
-
no_fext_path_parts = path_parts.map { |part| File.basename(part, '.yaml') }
|
287
|
-
valid_fact_values = @possible_fact_values.select do |pfv|
|
288
|
-
pfv.all? { |v| no_fext_path_parts.include?(v) }
|
289
|
-
end
|
290
|
-
valid_fact_values.uniq! # Removes duplicate arrays, not duplicate fact values
|
291
|
-
valid_fact_values.flatten!
|
292
|
-
return {} if valid_fact_values.empty?
|
293
|
-
|
294
|
-
fact_vals = {}
|
295
|
-
facts.each_index { |idx| fact_vals[facts[idx]] = valid_fact_values[idx] }
|
296
|
-
fact_vals
|
297
|
-
end
|
298
281
|
end
|
299
282
|
end
|
300
283
|
end
|