inspec 4.7.24 → 4.10.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,6 @@ class ProfileCli < Minitest::Test
5
5
  include CorePluginFunctionalHelper
6
6
 
7
7
  def setup
8
- skip_windows!
9
8
  @tmpdir = Dir.mktmpdir
10
9
  @habitat_profile = File.join(@tmpdir, "habitat-profile")
11
10
  run_inspec_process("init profile " + @habitat_profile)
@@ -18,22 +17,18 @@ class ProfileCli < Minitest::Test
18
17
  def test_setup_subcommand
19
18
  result = run_inspec_process("habitat profile setup " + @habitat_profile + " --log-level debug")
20
19
 
21
- # Command runs without error
22
- assert_empty result.stderr
23
- assert_equal 0, result.exit_status
24
-
25
20
  # Command creates only expected files
26
21
  base_dir = File.join(@tmpdir, "habitat-profile", "habitat")
27
22
  files = %w{
28
- default.toml
29
23
  plan.sh
30
- config
31
- config/inspec_exec_config.json
32
- hooks
33
- hooks/run
34
24
  }
35
25
  actual_files = Dir.glob(File.join(base_dir, "**/*"))
36
26
  expected_files = files.map { |x| File.join(base_dir, x) }
37
27
  assert_equal actual_files.sort, expected_files.sort
28
+
29
+ # Command runs without error
30
+ assert_empty result.stderr
31
+
32
+ assert_exit_code 0, result
38
33
  end
39
34
  end
@@ -35,7 +35,7 @@ describe 'inspec list-resources core' do
35
35
  # Some tests through here use minitest Expectations, which attach to all
36
36
  # Objects, and begin with 'must' (positive) or 'wont' (negative)
37
37
  # See http://docs.seattlerb.org/minitest/Minitest/Expectations.html
38
- it("should exit successfully") { outcome.exit_status.must_equal(0) }
38
+ it("should exit successfully") { assert_exit_code 0, outcome }
39
39
  it("should be silent on stderr") { outcome.stderr.must_be_empty }
40
40
 
41
41
  # A selection of core resources, just spot checking.
@@ -59,7 +59,7 @@ describe 'inspec list-resources core' do
59
59
  let(:outcome) { run_inspec_process_with_this_plugin("listresources core user") }
60
60
 
61
61
  # Should be well-behaved...
62
- it("should exit successfully") { outcome.exit_status.must_equal(0) }
62
+ it("should exit successfully") { assert_exit_code 0, outcome }
63
63
  it("should be silent on stderr") { outcome.stderr.must_be_empty }
64
64
 
65
65
  # Here, we want to know it DID match some things, and NOT some others.
@@ -79,7 +79,7 @@ describe 'inspec list-resources core' do
79
79
  let(:outcome) { run_inspec_process_with_this_plugin("listresources core autogyro") }
80
80
 
81
81
  # Should be well-behaved...
82
- it("should exit successfully") { outcome.exit_status.must_equal(0) }
82
+ it("should exit successfully") { assert_exit_code 0, outcome }
83
83
  it("should be silent on stderr") { outcome.stderr.must_be_empty }
84
84
 
85
85
  # Output lines should be just two, for the summary.
@@ -99,7 +99,7 @@ describe 'inspec list-resources core' do
99
99
  let(:outcome) { run_inspec_process_with_this_plugin('listresources core --no-summary') }
100
100
 
101
101
  # Should be well-behaved...
102
- it("should exit successfully") { outcome.exit_status.must_equal(0) }
102
+ it("should exit successfully") { assert_exit_code 0, outcome }
103
103
  it("should be silent on stderr") { outcome.stderr.must_be_empty }
104
104
 
105
105
  # Check for the summary
@@ -3,18 +3,18 @@ require_relative "../../../shared/core_plugin_test_helper.rb"
3
3
  class InitPluginCli < Minitest::Test
4
4
  include CorePluginFunctionalHelper
5
5
 
6
- def setup
7
- skip_windows!
8
- end
9
-
10
6
  def test_generating_inspec_plugin_correct_prefix_required
11
7
  Dir.mktmpdir do |dir|
12
8
  plugin = "wacky-name"
13
9
  run_result = run_inspec_process("init plugin --no-prompt #{plugin} ", prefix: "cd #{dir} &&")
14
- assert_equal 1, run_result.exit_status
15
- assert_empty run_result.stderr
10
+
11
+ skip_windows!
16
12
  assert_includes run_result.stdout, "ERROR"
17
13
  assert_includes run_result.stdout, "Plugin names must begin with"
14
+
15
+ assert_empty run_result.stderr
16
+
17
+ assert_exit_code 1, run_result
18
18
  end
19
19
  end
20
20
 
@@ -25,12 +25,15 @@ class InitPluginCli < Minitest::Test
25
25
  module_name = plugin.sub(/^inspec\-/, "").split("-").map(&:capitalize).join("")
26
26
 
27
27
  run_result = run_inspec_process("init plugin --no-prompt #{plugin}", prefix: "cd #{dir} &&")
28
- assert_empty run_result.stderr
29
28
 
30
- assert_equal 0, run_result.exit_status
29
+ skip_windows!
31
30
  assert_includes run_result.stdout, "Creating new inspec plugin at"
32
31
  assert_includes run_result.stdout, plugin
33
32
 
33
+ assert_empty run_result.stderr
34
+
35
+ assert_exit_code 0, run_result
36
+
34
37
  # Check generated files and contents.
35
38
  # Each file must exist, and its contents must match each of the regexen given.
36
39
  {
@@ -128,11 +131,15 @@ class InitPluginCli < Minitest::Test
128
131
  opts += " --module_name FunPlugin"
129
132
 
130
133
  run_result = run_inspec_process("init plugin #{plugin} --no-prompt #{opts}", prefix: "cd #{dir} &&")
131
- assert_empty run_result.stderr
132
- assert_equal 0, run_result.exit_status
134
+
135
+ skip_windows!
133
136
  assert_includes run_result.stdout, "Creating new inspec plugin at"
134
137
  assert_includes run_result.stdout, plugin
135
138
 
139
+ assert_empty run_result.stderr
140
+
141
+ assert_exit_code 0, run_result
142
+
136
143
  # Check generated files and contents.
137
144
  # Each file must exist, and its contents must match each of the regexen given.
138
145
  {
@@ -4,19 +4,18 @@ require_relative "../../../shared/core_plugin_test_helper.rb"
4
4
  class InitCli < Minitest::Test
5
5
  include CorePluginFunctionalHelper
6
6
 
7
- def setup
8
- skip_windows!
9
- end
10
-
11
7
  def test_generating_inspec_profile
12
8
  Dir.mktmpdir do |dir|
13
9
  profile = File.join(dir, "test-profile")
14
10
  out = run_inspec_process("init profile test-profile", prefix: "cd #{dir} &&")
15
- assert_equal 0, out.exit_status
11
+
12
+ skip_windows!
16
13
  assert_includes out.stdout, "Creating new profile at"
17
14
  assert_includes out.stdout, profile
18
15
  assert_includes Dir.entries(profile).join, "inspec.yml"
19
16
  assert_includes Dir.entries(profile).join, "README.md"
17
+
18
+ assert_exit_code 0, out
20
19
  end
21
20
  end
22
21
 
@@ -24,20 +23,26 @@ class InitCli < Minitest::Test
24
23
  Dir.mktmpdir do |dir|
25
24
  profile = File.join(dir, "test-profile")
26
25
  out = run_inspec_process("init profile --platform os test-profile", prefix: "cd #{dir} &&")
27
- assert_equal 0, out.exit_status
26
+
27
+ skip_windows!
28
28
  assert_includes out.stdout, "Creating new profile at"
29
29
  assert_includes out.stdout, profile
30
30
  assert_includes Dir.entries(profile).join, "inspec.yml"
31
31
  assert_includes Dir.entries(profile).join, "README.md"
32
+
33
+ assert_exit_code 0, out
32
34
  end
33
35
  end
34
36
 
35
37
  def test_generating_inspec_profile_with_bad_platform
36
38
  Dir.mktmpdir do |dir|
37
39
  out = run_inspec_process("init profile --platform nonesuch test-profile", prefix: "cd #{dir} &&")
38
- assert_equal 1, out.exit_status
40
+
41
+ skip_windows!
39
42
  assert_includes out.stdout, "Unable to generate profile"
40
43
  assert_includes out.stdout, "No template available for platform 'nonesuch'"
44
+
45
+ assert_exit_code 1, out
41
46
  end
42
47
  end
43
48
 
@@ -45,10 +50,12 @@ class InitCli < Minitest::Test
45
50
  Dir.mktmpdir do |dir|
46
51
  profile = dir + "/test/deeper/profile"
47
52
  out = run_inspec_process("init profile test/deeper/profile", prefix: "cd #{dir} &&")
48
- assert_equal 0, out.exit_status
53
+ skip_windows!
49
54
  assert_equal true, File.exist?(profile)
50
55
  profile = YAML.load_file("#{profile}/inspec.yml")
51
56
  assert_equal "profile", profile["name"]
57
+
58
+ assert_exit_code 0, out
52
59
  end
53
60
  end
54
61
 
@@ -56,11 +63,14 @@ class InitCli < Minitest::Test
56
63
  Dir.mktmpdir do |dir|
57
64
  profile = File.join(dir, "test-gcp-profile")
58
65
  out = run_inspec_process("init profile --platform gcp test-gcp-profile", prefix: "cd #{dir} &&")
59
- assert_equal 0, out.exit_status
66
+
67
+ skip_windows!
60
68
  assert_includes out.stdout, "Creating new profile at"
61
69
  assert_includes out.stdout, profile
62
70
  assert_includes Dir.entries(profile).join, "inspec.yml"
63
71
  assert_includes Dir.entries(profile).join, "README.md"
72
+
73
+ assert_exit_code 0, out
64
74
  end
65
75
  end
66
76
 
@@ -68,11 +78,14 @@ class InitCli < Minitest::Test
68
78
  Dir.mktmpdir do |dir|
69
79
  profile = File.join(dir, "test-aws-profile")
70
80
  out = run_inspec_process("init profile --platform aws test-aws-profile", prefix: "cd #{dir} &&")
71
- assert_equal 0, out.exit_status
81
+
82
+ skip_windows!
72
83
  assert_includes out.stdout, "Creating new profile at"
73
84
  assert_includes out.stdout, profile
74
85
  assert_includes Dir.entries(profile).join, "inspec.yml"
75
86
  assert_includes Dir.entries(profile).join, "README.md"
87
+
88
+ assert_exit_code 0, out
76
89
  end
77
90
  end
78
91
 
@@ -80,11 +93,14 @@ class InitCli < Minitest::Test
80
93
  Dir.mktmpdir do |dir|
81
94
  profile = File.join(dir, "test-azure-profile")
82
95
  out = run_inspec_process("init profile --platform azure test-azure-profile", prefix: "cd #{dir} &&")
83
- assert_equal 0, out.exit_status
96
+
97
+ skip_windows!
84
98
  assert_includes out.stdout, "Creating new profile at"
85
99
  assert_includes out.stdout, profile
86
100
  assert_includes Dir.entries(profile).join, "inspec.yml"
87
101
  assert_includes Dir.entries(profile).join, "README.md"
102
+
103
+ assert_exit_code 0, out
88
104
  end
89
105
  end
90
106
 
@@ -92,11 +108,14 @@ class InitCli < Minitest::Test
92
108
  Dir.mktmpdir do |dir|
93
109
  profile = File.join(dir, "test-os-profile")
94
110
  out = run_inspec_process("init profile --platform os test-os-profile", prefix: "cd #{dir} &&")
95
- assert_equal 0, out.exit_status
111
+
112
+ skip_windows!
96
113
  assert_includes out.stdout, "Creating new profile at"
97
114
  assert_includes out.stdout, profile
98
115
  assert_includes Dir.entries(profile).join, "inspec.yml"
99
116
  assert_includes Dir.entries(profile).join, "README.md"
117
+
118
+ assert_exit_code 0, out
100
119
  end
101
120
  end
102
121
  end
@@ -1,4 +1,3 @@
1
- require "term/ansicolor"
2
1
  require "pathname"
3
2
  require "inspec/plugin/v2"
4
3
  require "inspec/plugin/v2/installer"
@@ -7,7 +6,6 @@ require "inspec/dist"
7
6
  module InspecPlugins
8
7
  module PluginManager
9
8
  class CliCommand < Inspec.plugin(2, :cli_command)
10
- include Term::ANSIColor
11
9
  include Inspec::Dist
12
10
 
13
11
  subcommand_desc "plugin SUBCOMMAND", "Manage #{PRODUCT_NAME} and Train plugins"
@@ -22,15 +20,17 @@ module InspecPlugins
22
20
  plugin_statuses = Inspec::Plugin::V2::Registry.instance.plugin_statuses
23
21
  plugin_statuses.reject! { |s| %i{core bundle}.include?(s.installation_type) } unless options[:all]
24
22
 
25
- # TODO: ui object support
26
23
  puts
27
- puts(bold { format(" %-30s%-10s%-8s%-6s", "Plugin Name", "Version", "Via", "ApiVer") })
28
- puts "-" * 55
24
+ ui.bold(format(" %-30s%-10s%-8s%-6s", "Plugin Name", "Version", "Via", "ApiVer"))
25
+ ui.line
29
26
  plugin_statuses.sort_by(&:name).each do |status|
30
- puts(format(" %-30s%-10s%-8s%-6s", status.name, make_pretty_version(status), status.installation_type, status.api_generation.to_s))
27
+ ui.plain(format(" %-30s%-10s%-8s%-6s", status.name,
28
+ make_pretty_version(status),
29
+ status.installation_type,
30
+ status.api_generation.to_s))
31
31
  end
32
- puts "-" * 55
33
- puts(" #{plugin_statuses.count} plugin(s) total")
32
+ ui.line
33
+ ui.plain(" #{plugin_statuses.count} plugin(s) total")
34
34
  puts
35
35
  end
36
36
 
@@ -59,23 +59,22 @@ module InspecPlugins
59
59
  search_results.delete("train-test-fixture")
60
60
  end
61
61
 
62
- # TODO: ui object support
63
62
  puts
64
- puts(bold { format(" %-30s%-50s", "Plugin Name", "Versions Available") })
65
- puts "-" * 55
63
+ ui.bold(format(" %-30s%-50s", "Plugin Name", "Versions Available"))
64
+ ui.line
66
65
  search_results.keys.sort.each do |plugin_name|
67
66
  versions = options[:all] ? search_results[plugin_name] : [search_results[plugin_name].first]
68
67
  versions = "(" + versions.join(", ") + ")"
69
- puts(format(" %-30s%-50s", plugin_name, versions))
68
+ ui.plain(format(" %-30s%-50s", plugin_name, versions))
70
69
  end
71
- puts "-" * 55
72
- puts(" #{search_results.count} plugin(s) found")
70
+ ui.line
71
+ ui.plain(" #{search_results.count} plugin(s) found")
73
72
  puts
74
73
 
75
- exit 2 if search_results.empty?
74
+ ui.exit Inspec::UI::EXIT_PLUGIN_ERROR if search_results.empty?
76
75
  rescue Inspec::Plugin::V2::SearchError => ex
77
76
  Inspec::Log.error ex.message
78
- exit 1
77
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
79
78
  end
80
79
 
81
80
  #==================================================================#
@@ -119,13 +118,14 @@ module InspecPlugins
119
118
  begin
120
119
  installer.update(plugin_name)
121
120
  rescue Inspec::Plugin::V2::UpdateError => ex
122
- puts(red { "Update error: " } + ex.message + " - update failed")
123
- exit 1
121
+ ui.plain("#{ui.red('Update error:')} #{ex.message} - update failed")
122
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
124
123
  end
125
124
  post_update_versions = installer.list_installed_plugin_gems.select { |spec| spec.name == plugin_name }.map { |spec| spec.version.to_s }
126
125
  new_version = (post_update_versions - pre_update_versions).first
127
126
 
128
- puts(bold { plugin_name } + " plugin, version #{old_version} -> #{new_version}, updated from rubygems.org")
127
+ ui.bold(plugin_name + " plugin, version #{old_version} -> " \
128
+ "#{new_version}, updated from rubygems.org")
129
129
  end
130
130
 
131
131
  #--------------------------
@@ -144,9 +144,9 @@ module InspecPlugins
144
144
  def uninstall(plugin_name)
145
145
  status = Inspec::Plugin::V2::Registry.instance[plugin_name.to_sym]
146
146
  unless status
147
- puts(red { "No such plugin installed: " } + "#{plugin_name} is not installed - uninstall failed")
148
-
149
- exit 1
147
+ ui.plain("#{ui.red('No such plugin installed:')} #{plugin_name} is not " \
148
+ "installed - uninstall failed")
149
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
150
150
  end
151
151
  installer = Inspec::Plugin::V2::Installer.instance
152
152
 
@@ -156,11 +156,13 @@ module InspecPlugins
156
156
  installer.uninstall(plugin_name)
157
157
 
158
158
  if status.installation_type == :path
159
- puts(bold { plugin_name } + " path-based plugin install has been uninstalled")
159
+ ui.bold(plugin_name + " path-based plugin install has been " \
160
+ "uninstalled")
160
161
  else
161
- puts(bold { plugin_name } + " plugin, version #{old_version}, has been uninstalled")
162
+ ui.bold(plugin_name + " plugin, version #{old_version}, has " \
163
+ "been uninstalled")
162
164
  end
163
- exit 0
165
+ ui.exit Inspec::UI::EXIT_NORMAL
164
166
  end
165
167
 
166
168
  private
@@ -172,8 +174,8 @@ module InspecPlugins
172
174
 
173
175
  def install_from_gemfile(gem_file)
174
176
  unless File.exist? gem_file
175
- puts(red { "No such plugin gem file " } + gem_file + " - installation failed.")
176
- exit 1
177
+ ui.red("No such plugin gem file #{gem_file} - installation failed.")
178
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
177
179
  end
178
180
 
179
181
  plugin_name_parts = File.basename(gem_file, ".gem").split("-")
@@ -183,14 +185,15 @@ module InspecPlugins
183
185
 
184
186
  installer.install(plugin_name, gem_file: gem_file)
185
187
 
186
- puts(bold { plugin_name } + " plugin, version #{version}, installed from local .gem file")
187
- exit 0
188
+ ui.bold("#{plugin_name} plugin, version #{version}, installed from " \
189
+ "local .gem file")
190
+ ui.exit Inspec::UI::EXIT_NORMAL
188
191
  end
189
192
 
190
193
  def install_from_path(path)
191
194
  unless File.exist? path
192
- puts(red { "No such source code path " } + path + " - installation failed.")
193
- exit 1
195
+ ui.red("No such source code path #{path} - installation failed.")
196
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
194
197
  end
195
198
 
196
199
  plugin_name = File.basename(path, ".rb")
@@ -204,8 +207,10 @@ module InspecPlugins
204
207
 
205
208
  # Already installed?
206
209
  if registry.known_plugin?(plugin_name.to_sym)
207
- puts(red { "Plugin already installed" } + " - #{plugin_name} - Use '#{EXEC_NAME} plugin list' to see previously installed plugin - installation failed.")
208
- exit 2
210
+ ui.red("Plugin already installed - #{plugin_name} - Use '#{EXEC_NAME} " \
211
+ "plugin list' to see previously installed plugin - " \
212
+ "installation failed.")
213
+ ui.exit Inspec::UI::EXIT_PLUGIN_ERROR
209
214
  end
210
215
 
211
216
  # Can we figure out how to load it?
@@ -217,8 +222,9 @@ module InspecPlugins
217
222
  # OK, install it!
218
223
  installer.install(plugin_name, path: entry_point)
219
224
 
220
- puts(bold { plugin_name } + " plugin installed via source path reference, resolved to entry point " + entry_point)
221
- exit 0
225
+ ui.bold("#{plugin_name} plugin installed via source path reference, " \
226
+ "resolved to entry point #{entry_point}")
227
+ ui.exit Inspec::UI::EXIT_NORMAL
222
228
  end
223
229
 
224
230
  # Rationale for rubocop variances: It's a heuristics method, and will be full of
@@ -229,6 +235,7 @@ module InspecPlugins
229
235
  given = given.expand_path # Resolve any relative paths
230
236
  name_regex = /^(inspec|train)-/
231
237
  versioned_regex = /^(inspec|train)-[a-z0-9\-\_]+-\d+\.\d+\.\d+$/
238
+ sha_ref_regex = /^(inspec|train)-[a-z0-9\-\_]+-[0-9a-f]{5,40}$/
232
239
 
233
240
  # What are the last four things like?
234
241
  parts = [
@@ -257,14 +264,14 @@ module InspecPlugins
257
264
  # In that case, we'll have a version on the plugin name in part 0
258
265
  # /home/you/.gems/2.4.0/gems/inspec-something-3.45.1/lib/inspec-something.rb
259
266
  # parts index: ^0^ ^1^ ^2^ ^3^
260
- if parts[0] =~ versioned_regex && parts[1] == "lib" && parts[0].start_with?(parts[2]) && parts[3] == ".rb"
267
+ if (parts[0] =~ versioned_regex || parts[0] =~ sha_ref_regex) && parts[1] == "lib" && parts[0].start_with?(parts[2]) && parts[3] == ".rb"
261
268
  return given.to_s
262
269
  end
263
270
 
264
271
  # Case 4: Like case 3, but missing the .rb
265
272
  # /home/you/.gems/2.4.0/gems/inspec-something-3.45.1/lib/inspec-something
266
273
  # parts index: ^0^ ^1^ ^2^ ^3^ (empty)
267
- if parts[0] =~ versioned_regex && parts[1] == "lib" && parts[0].start_with?(parts[2]) && parts[3].empty?
274
+ if (parts[0] =~ versioned_regex || parts[0] =~ sha_ref_regex) && parts[1] == "lib" && parts[0].start_with?(parts[2]) && parts[3].empty?
268
275
  return given.to_s + ".rb"
269
276
  end
270
277
 
@@ -279,8 +286,10 @@ module InspecPlugins
279
286
 
280
287
  # Well, if we got here, parts[2] matches an inspec/train prefix, but we have no idea about anything.
281
288
  # Give up.
282
- puts(red { "Unrecognizable plugin structure" } + " - #{parts[2]} - When installing from a path, please provide the path of the entry point file - installation failed.")
283
- exit 1
289
+ ui.red("Unrecognizable plugin structure - #{parts[2]} - When " \
290
+ "installing from a path, please provide the path of the " \
291
+ "entry point file - installation failed.")
292
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
284
293
  end
285
294
 
286
295
  def install_from_path__probe_load(entry_point, plugin_name)
@@ -288,9 +297,11 @@ module InspecPlugins
288
297
  begin
289
298
  require entry_point
290
299
  rescue LoadError => ex
291
- puts(red { "Plugin contains errors" } + " - #{plugin_name} - Encountered errors while trying to test load the plugin entry point, resolved to #{entry_point} - installation failed")
292
- puts ex.message
293
- exit 1
300
+ ui.red("Plugin contains errors - #{plugin_name} - Encountered " \
301
+ "errors while trying to test load the plugin entry point, " \
302
+ "resolved to #{entry_point} - installation failed")
303
+ ui.plain ex.message
304
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
294
305
  end
295
306
 
296
307
  # OK, the wheels didn't fall off. But is it a plugin?
@@ -299,13 +310,19 @@ module InspecPlugins
299
310
  # And the registry is keyed on Strings
300
311
  registry_key = plugin_name.to_s.sub(/^train-/, "")
301
312
  unless Train::Plugins.registry.key?(registry_key)
302
- puts(red { "Does not appear to be a plugin" } + " - #{plugin_name} - After probe-loading the supposed plugin, it did not register itself to Train. Ensure something inherits from 'Train.plugin(1)' - installation failed.")
303
- exit 1
313
+ ui.red("Does not appear to be a plugin - #{plugin_name} - After " \
314
+ "probe-loading the supposed plugin, it did not register " \
315
+ "itself to Train. Ensure something inherits from " \
316
+ "'Train.plugin(1)' - installation failed.")
317
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
304
318
  end
305
319
  else
306
320
  unless registry.known_plugin?(plugin_name.to_sym)
307
- puts(red { "Does not appear to be a plugin" } + " - #{plugin_name} - After probe-loading the supposed plugin, it did not register itself to InSpec. Ensure something inherits from 'Inspec.plugin(2)' - installation failed.")
308
- exit 1
321
+ ui.red("Does not appear to be a plugin - #{plugin_name} - After " \
322
+ "probe-loading the supposed plugin, it did not register " \
323
+ "itself to InSpec. Ensure something inherits from " \
324
+ "'Inspec.plugin(2)' - installation failed.")
325
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
309
326
  end
310
327
  end
311
328
  end
@@ -325,8 +342,9 @@ module InspecPlugins
325
342
  post_installed_versions = installer.list_installed_plugin_gems.select { |spec| spec.name == plugin_name }.map { |spec| spec.version.to_s }
326
343
  new_version = (post_installed_versions - pre_installed_versions).first
327
344
 
328
- puts(bold { plugin_name } + " plugin, version #{new_version}, installed from rubygems.org")
329
- exit 0
345
+ ui.bold("#{plugin_name} plugin, version #{new_version}, installed " \
346
+ "from rubygems.org")
347
+ ui.exit Inspec::UI::EXIT_NORMAL
330
348
  end
331
349
 
332
350
  def install_from_remote_gem_verson_preflight_check(plugin_name, requested_version, pre_installed_versions)
@@ -348,38 +366,50 @@ module InspecPlugins
348
366
  they_explicitly_asked_for_a_version = !options[:version].nil?
349
367
  what_we_would_install_is_already_installed = pre_installed_versions.include?(requested_version)
350
368
  if what_we_would_install_is_already_installed && they_explicitly_asked_for_a_version
351
- puts(red { "Plugin already installed at requested version" } + " - plugin #{plugin_name} #{requested_version} - refusing to install.")
369
+ ui.red("Plugin already installed at requested version - plugin " \
370
+ "#{plugin_name} #{requested_version} - refusing to install.")
352
371
  elsif what_we_would_install_is_already_installed && !they_explicitly_asked_for_a_version
353
- puts(red { "Plugin already installed at latest version" } + " - plugin #{plugin_name} #{requested_version} - refusing to install.")
372
+ ui.red("Plugin already installed at latest version - plugin " \
373
+ "#{plugin_name} #{requested_version} - refusing to install.")
354
374
  else
355
375
  # There are existing versions installed, but none of them are what was requested
356
- puts(red { "Update required" } + " - plugin #{plugin_name}, requested #{requested_version}, have #{pre_installed_versions.join(", ")}; use `inspec plugin update` - refusing to install.")
376
+ ui.red("Update required - plugin #{plugin_name}, requested " \
377
+ "#{requested_version}, have " \
378
+ "#{pre_installed_versions.join(', ')}; use `inspec " \
379
+ "plugin update` - refusing to install.")
357
380
  end
358
381
 
359
- exit 2
382
+ ui.exit Inspec::UI::EXIT_PLUGIN_ERROR
360
383
  end
361
384
 
362
385
  # Rationale for RuboCop variance: This is a one-line method with heavy UX-focused error handling.
363
386
  def install_attempt_install(plugin_name) # rubocop: disable Metrics/AbcSize
364
387
  installer.install(plugin_name, version: options[:version])
365
388
  rescue Inspec::Plugin::V2::PluginExcludedError => ex
366
- puts(red { "Plugin on Exclusion List" } + " - #{plugin_name} is listed as an incompatible gem - refusing to install.")
367
- puts "Rationale: #{ex.details.rationale}"
368
- puts "Exclusion list location: " + File.join(Inspec.src_root, "etc", "plugin_filters.json")
369
- puts "If you disagree with this determination, please accept our apologies for the misunderstanding, and open an issue at https://github.com/inspec/inspec/issues/new"
370
- exit 2
389
+ ui.red("Plugin on Exclusion List - #{plugin_name} is listed as an " \
390
+ "incompatible gem - refusing to install.")
391
+ ui.plain("Rationale: #{ex.details.rationale}")
392
+ ui.plain("Exclusion list location: " +
393
+ File.join(Inspec.src_root, "etc", "plugin_filters.json"))
394
+ ui.plain("If you disagree with this determination, please accept " \
395
+ "our apologies for the misunderstanding, and open an issue " \
396
+ "at https://github.com/inspec/inspec/issues/new")
397
+ ui.exit Inspec::UI::EXIT_PLUGIN_ERROR
371
398
  rescue Inspec::Plugin::V2::InstallError
372
399
  raise if Inspec::Log.level == :debug
373
400
 
374
401
  results = installer.search(plugin_name, exact: true)
375
402
  if results.empty?
376
- puts(red { "No such plugin gem " } + plugin_name + " could be found on rubygems.org - installation failed.")
403
+ ui.red("No such plugin gem #{plugin_name} could be found on " \
404
+ "rubygems.org - installation failed.")
377
405
  elsif options[:version] && !results[plugin_name].include?(options[:version])
378
- puts(red { "No such version" } + " - " + plugin_name + " exists, but no such version #{options[:version]} found on rubygems.org - installation failed.")
406
+ ui.red("No such version - #{plugin_name} exists, but no such " \
407
+ "version #{options[:version]} found on rubygems.org - " \
408
+ "installation failed.")
379
409
  else
380
- puts(red { "Unknown error occured " } + " - installation failed.")
410
+ ui.red("Unknown error occured - installation failed.")
381
411
  end
382
- exit 1
412
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
383
413
  end
384
414
 
385
415
  #==================================================================#
@@ -390,11 +420,14 @@ module InspecPlugins
390
420
  # Check for path install
391
421
  status = Inspec::Plugin::V2::Registry.instance[plugin_name.to_sym]
392
422
  if !status
393
- puts(red { "No such plugin installed: " } + "#{plugin_name} - update failed")
394
- exit 1
423
+ ui.plain("#{ui.red('No such plugin installed:')} #{plugin_name} - update failed")
424
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
395
425
  elsif status.installation_type == :path
396
- puts(red { "Cannot update path-based install: " } + "#{plugin_name} is installed via path reference; use `inspec plugin uninstall` to remove - refusing to update")
397
- exit 2
426
+ ui.plain("#{ui.red('Cannot update path-based install:')} " \
427
+ "#{plugin_name} is installed via path reference; " \
428
+ "use `inspec plugin uninstall` to remove - refusing to" \
429
+ "update")
430
+ ui.exit Inspec::UI::EXIT_PLUGIN_ERROR
398
431
  end
399
432
  end
400
433
 
@@ -403,8 +436,10 @@ module InspecPlugins
403
436
  latest_version = latest_version[plugin_name]&.last
404
437
 
405
438
  if pre_update_versions.include?(latest_version)
406
- puts(red { "Already installed at latest version: " } + "#{plugin_name} is at #{latest_version}, which the latest - refusing to update")
407
- exit 2
439
+ ui.plain("#{ui.red('Already installed at latest version:')} " \
440
+ "#{plugin_name} is at #{latest_version}, which the " \
441
+ "latest - refusing to update")
442
+ ui.exit Inspec::UI::EXIT_PLUGIN_ERROR
408
443
  end
409
444
  end
410
445
 
@@ -421,8 +456,10 @@ module InspecPlugins
421
456
 
422
457
  def check_plugin_name(plugin_name, action)
423
458
  unless plugin_name =~ /^(inspec|train)-/
424
- puts(red { "Invalid plugin name" } + " - #{plugin_name} - All inspec plugins must begin with either 'inspec-' or 'train-' - #{action} failed.")
425
- exit 1
459
+ ui.red("Invalid plugin name - #{plugin_name} - All inspec " \
460
+ "plugins must begin with either 'inspec-' or 'train-' " \
461
+ "- #{action} failed.")
462
+ ui.exit Inspec::UI::EXIT_USAGE_ERROR
426
463
  end
427
464
  end
428
465