inspec 4.18.0 → 4.18.24

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1383016cfa4899dc2457ba11f9f4a7e79e02b8cfa9c1fd9b2cba34e8b0a6aa4
4
- data.tar.gz: f80b35ba96ed8a3954240b5a43611bd4e7822589bf1a52e761b75e3a9e144ab6
3
+ metadata.gz: 6d18c5e5d562f59e26b4ddf2b757be945f349d5b09076acfae1468d058326497
4
+ data.tar.gz: d7290f25cd505d9014e80ff5b7a410d3dab495384c77c426602e60da2dc89356
5
5
  SHA512:
6
- metadata.gz: 1c2b2cc5aea6c768acb57bd40cfd414c66ac56926dd8243e947e74aa748877a45ae778001c89d7d8a2f03abcc3ee165b2f525ebb664d0732f2d634a91498fbfe
7
- data.tar.gz: cd5787223718099c19c4b3d4c85b726eee454305ea66ad7a0762674df7778efc64840d3f3db0debcaa4e1ec485202f9bebe8a2c9ad59c50361510133197efe7c
6
+ metadata.gz: 8cba31a9207fde92c5568746e5ec59a45f2f4cd0b1820964f9722d12424ec98a970d84bebed7f3ae6e9cd2f6f8ee22d5f625c615f8477d6f139b7a64d563811a
7
+ data.tar.gz: 898e03c84739355f05c720311d72a1b787499e26197bfc205d160830448e5870570affd649b1db67caa0eae6aeda61435ed9b4e77707636397778a35aac3802b
@@ -31,6 +31,7 @@ Gem::Specification.new do |spec|
31
31
 
32
32
  # Implementation dependencies
33
33
  spec.add_dependency "license-acceptance", ">= 0.2.13", "< 2.0"
34
+ spec.add_dependency "chef-core", "~> 0.0"
34
35
  spec.add_dependency "thor", "~> 0.20"
35
36
  spec.add_dependency "json-schema", "~> 2.8"
36
37
  spec.add_dependency "method_source", "~> 0.8"
@@ -19,6 +19,8 @@ module Inspec
19
19
  def initialize(path = nil)
20
20
  @path = path || File.join(Inspec.config_dir, "cache")
21
21
  FileUtils.mkdir_p(@path) unless File.directory?(@path)
22
+ rescue Errno::EACCES
23
+ # ignore
22
24
  end
23
25
 
24
26
  def prefered_entry_for(key)
@@ -171,7 +171,7 @@ module Inspec
171
171
  path = Pathname.new(name).relative_path_from(here).to_s
172
172
 
173
173
  @contents[path] = begin # not ||= in a tarball, last one wins
174
- res = entry.read
174
+ res = entry.read || ""
175
175
  try = res.dup
176
176
  try.force_encoding Encoding::UTF_8
177
177
  res = try if try.valid_encoding?
@@ -318,6 +318,17 @@ module Inspec
318
318
  !current_value.is_a? NO_VALUE_SET
319
319
  end
320
320
 
321
+ def to_hash
322
+ as_hash = { name: name, options: {} }
323
+ %i{description title identifier type required value}.each do |field|
324
+ val = send(field)
325
+ next if val.nil?
326
+
327
+ as_hash[:options][field] = val
328
+ end
329
+ as_hash
330
+ end
331
+
321
332
  #--------------------------------------------------------------------------#
322
333
  # Value Type Coercion
323
334
  #--------------------------------------------------------------------------#
@@ -16,7 +16,7 @@ module Inspec
16
16
 
17
17
  module ResourceDSL
18
18
  def name(name = nil)
19
- return if name.nil?
19
+ return @name if name.nil?
20
20
 
21
21
  @name = name
22
22
  __register(name, self)
@@ -3,12 +3,6 @@ require "inspec/version"
3
3
  require "inspec/plugin/v2/config_file"
4
4
  require "inspec/plugin/v2/filter"
5
5
 
6
- # Add the current directory of the process to the load path
7
- $LOAD_PATH.unshift(".") unless $LOAD_PATH.include?(".")
8
- # Add the InSpec source root directory to the load path
9
- folder = File.expand_path(File.join("..", "..", "..", ".."), __dir__)
10
- $LOAD_PATH.unshift(folder) unless $LOAD_PATH.include?("folder")
11
-
12
6
  module Inspec::Plugin::V2
13
7
  class Loader
14
8
  attr_reader :conf_file, :registry, :options
@@ -332,6 +332,7 @@ module Inspec
332
332
  # convert legacy os-* supports to their platform counterpart
333
333
  if res[:supports] && !res[:supports].empty?
334
334
  res[:supports].each do |support|
335
+ # TODO: deprecate
335
336
  support[:"platform-family"] = support.delete(:"os-family") if support.key?(:"os-family")
336
337
  support[:"platform-name"] = support.delete(:"os-name") if support.key?(:"os-name")
337
338
  end
@@ -10,10 +10,12 @@ module Inspec
10
10
  @default_registry ||= {}
11
11
  end
12
12
 
13
+ # TODO: these are keyed off of strings
13
14
  def self.registry
14
15
  @registry ||= default_registry
15
16
  end
16
17
 
18
+ # TODO: these are keyed off of symbols
17
19
  def self.supports
18
20
  @supports ||= {}
19
21
  end
@@ -22,6 +24,29 @@ module Inspec
22
24
  default_registry.dup
23
25
  end
24
26
 
27
+ def self.backfill_supports!
28
+ reg = registry.keys.map(&:to_sym).sort
29
+ sup = supports.keys.map(&:to_sym).sort
30
+
31
+ missings = reg - sup
32
+
33
+ supports[:platform] = [{ platform: "os" }] # patch the circular dep
34
+
35
+ missings.each do |missing|
36
+ klass = registry[missing.to_s].superclass
37
+ sklas = klass.superclass.name&.to_sym # might be resource = no name
38
+
39
+ klass = klass.name.to_sym
40
+
41
+ case
42
+ when klass != missing # an alias
43
+ supports[missing] = supports[klass]
44
+ when sklas
45
+ supports[klass] = supports[sklas]
46
+ end
47
+ end
48
+ end
49
+
25
50
  # Creates the inner DSL which includes all resources for
26
51
  # creating tests. It is always connected to one target,
27
52
  # which is specified via the backend argument.
@@ -33,6 +33,10 @@ module Inspec::Resources
33
33
 
34
34
  filter.install_filter_methods_on_resource(self, :params)
35
35
 
36
+ def to_s
37
+ "hosts.allow Configuration"
38
+ end
39
+
36
40
  private
37
41
 
38
42
  def read_content
@@ -95,7 +95,7 @@ module Inspec::Resources
95
95
 
96
96
  class LinuxFileSystemResource < FsManagement
97
97
  def info(partition)
98
- cmd = inspec.command("df #{partition} -T")
98
+ cmd = inspec.command("df #{partition} -PT")
99
99
  if cmd.stdout.nil? || cmd.stdout.empty? || cmd.exit_status != 0
100
100
  raise Inspec::Exceptions::ResourceFailed,
101
101
  "Unable to get available space for partition #{partition}"
@@ -22,10 +22,6 @@ module Inspec::Resources
22
22
  def initialize(pool_name)
23
23
  @pool_name = pool_name
24
24
  @pool_path = "IIS:\\AppPools\\#{@pool_name}"
25
- @cache = nil
26
-
27
- # verify that this resource is only supported on Windows
28
- return skip_resource "The `iis_app_pool` resource is not supported on your OS." unless inspec.os.windows?
29
25
  end
30
26
 
31
27
  def pool_name
@@ -77,7 +73,7 @@ module Inspec::Resources
77
73
  end
78
74
 
79
75
  def exists?
80
- !iis_app_pool[:pool_name].empty?
76
+ !!iis_app_pool[:pool_name]
81
77
  end
82
78
 
83
79
  def to_s
@@ -87,45 +83,45 @@ module Inspec::Resources
87
83
  private
88
84
 
89
85
  def iis_app_pool
90
- return @cache unless @cache.nil?
91
-
92
- # We use `-Compress` here to avoid a bug in PowerShell
93
- # It does not affect validity of the output, only the representation
94
- # See: https://github.com/inspec/inspec/pull/3842
95
- script = <<~EOH
96
- Import-Module WebAdministration
97
- If (Test-Path '#{@pool_path}') {
98
- Get-Item '#{@pool_path}' | Select-Object * | ConvertTo-Json -Compress
99
- } Else {
100
- Write-Host '{}'
86
+ @iis_app_pool ||= begin
87
+ # We use `-Compress` here to avoid a bug in PowerShell
88
+ # It does not affect validity of the output, only the representation
89
+ # See: https://github.com/inspec/inspec/pull/3842
90
+ script = <<~EOH
91
+ Import-Module WebAdministration
92
+ If (Test-Path '#{@pool_path}') {
93
+ Get-Item '#{@pool_path}' | Select-Object * | ConvertTo-Json -Compress
94
+ } Else {
95
+ Write-Host '{}'
96
+ }
97
+ EOH
98
+ cmd = inspec.powershell(script)
99
+
100
+ begin
101
+ pool = JSON.parse(cmd.stdout)
102
+ rescue JSON::ParserError => _e
103
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse app pool JSON"
104
+ end
105
+
106
+ process_model = pool.fetch("processModel", {})
107
+ idle_timeout = process_model.fetch("idleTimeout", {})
108
+
109
+ # map our values to a hash table
110
+ @cache = {
111
+ pool_name: pool["name"],
112
+ version: pool["managedRuntimeVersion"],
113
+ e32b: pool["enable32BitAppOnWin64"],
114
+ mode: pool["managedPipelineMode"],
115
+ processes: process_model["maxProcesses"],
116
+ timeout: "#{idle_timeout["Hours"]}:#{idle_timeout["Minutes"]}:#{idle_timeout["Seconds"]}",
117
+ timeout_days: idle_timeout["Days"],
118
+ timeout_hours: idle_timeout["Hours"],
119
+ timeout_minutes: idle_timeout["Minutes"],
120
+ timeout_seconds: idle_timeout["Seconds"],
121
+ user_identity_type: process_model["identityType"],
122
+ username: process_model["userName"],
101
123
  }
102
- EOH
103
- cmd = inspec.powershell(script)
104
-
105
- begin
106
- pool = JSON.parse(cmd.stdout)
107
- rescue JSON::ParserError => _e
108
- raise Inspec::Exceptions::ResourceFailed, "Unable to parse app pool JSON"
109
124
  end
110
-
111
- process_model = pool.fetch("processModel", {})
112
- idle_timeout = process_model.fetch("idleTimeout", {})
113
-
114
- # map our values to a hash table
115
- @cache = {
116
- pool_name: pool["name"],
117
- version: pool["managedRuntimeVersion"],
118
- e32b: pool["enable32BitAppOnWin64"],
119
- mode: pool["managedPipelineMode"],
120
- processes: process_model["maxProcesses"],
121
- timeout: "#{idle_timeout["Hours"]}:#{idle_timeout["Minutes"]}:#{idle_timeout["Seconds"]}",
122
- timeout_days: idle_timeout["Days"],
123
- timeout_hours: idle_timeout["Hours"],
124
- timeout_minutes: idle_timeout["Minutes"],
125
- timeout_seconds: idle_timeout["Seconds"],
126
- user_identity_type: process_model["identityType"],
127
- username: process_model["userName"],
128
- }
129
125
  end
130
126
  end
131
127
  end
@@ -5,6 +5,7 @@ require "inspec/utils/file_reader"
5
5
  module Inspec::Resources
6
6
  class JsonConfig < Inspec.resource(1)
7
7
  name "json"
8
+ supports platform: "os"
8
9
  desc "Use the json InSpec audit resource to test data in a JSON file."
9
10
  example <<~EXAMPLE
10
11
  describe json('policyfile.lock.json') do
@@ -11,6 +11,7 @@ module Inspec::Resources
11
11
  # @see https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-connect-and-query-sqlcmd
12
12
  class MssqlSession < Inspec.resource(1)
13
13
  name "mssql_session"
14
+ supports platform: "windows"
14
15
  desc "Use the mssql_session InSpec audit resource to test SQL commands run against a MS Sql Server database."
15
16
  example <<~EXAMPLE
16
17
  # Using SQL authentication
@@ -1,8 +1,8 @@
1
1
  require "inspec/resources/command"
2
- require "hashie/mash"
3
2
  require "inspec/utils/database_helpers"
4
3
  require "htmlentities"
5
4
  require "rexml/document"
5
+ require "hashie/mash"
6
6
  require "csv"
7
7
 
8
8
  module Inspec::Resources
@@ -21,8 +21,9 @@ module Inspec::Resources
21
21
  end
22
22
  EXAMPLE
23
23
 
24
- attr_reader :user, :password, :host, :service, :as_os_user, :as_db_role
25
- # rubocop:disable Metrics/PerceivedComplexity,Metrics/CyclomaticComplexity
24
+ attr_reader :bin, :db_role, :host, :password, :port, :service,
25
+ :su_user, :user
26
+
26
27
  def initialize(opts = {})
27
28
  @user = opts[:user]
28
29
  @password = opts[:password] || opts[:pass]
@@ -30,60 +31,35 @@ module Inspec::Resources
30
31
  Inspec.deprecate(:oracledb_session_pass_option, "The oracledb_session `pass` option is deprecated. Please use `password`.")
31
32
  end
32
33
 
34
+ @bin = "sqlplus"
33
35
  @host = opts[:host] || "localhost"
34
36
  @port = opts[:port] || "1521"
35
37
  @service = opts[:service]
36
-
37
- # connection as sysdba stuff
38
- return skip_resource "Option 'as_os_user' not available in Windows" if inspec.os.windows? && opts[:as_os_user]
39
-
40
38
  @su_user = opts[:as_os_user]
41
39
  @db_role = opts[:as_db_role]
42
-
43
- # we prefer sqlci although it is way slower than sqlplus, but it understands csv properly
44
- @sqlcl_bin = "sql" unless opts.key?(:sqlplus_bin) # don't use it if user specified sqlplus_bin option
40
+ @sqlcl_bin = opts[:sqlcl_bin] || nil
45
41
  @sqlplus_bin = opts[:sqlplus_bin] || "sqlplus"
46
-
47
- return fail_resource "Can't run Oracle checks without authentication" if @su_user.nil? && (@user.nil? || @password.nil?)
48
- return fail_resource "You must provide a service name for the session" if @service.nil?
42
+ skip_resource "Option 'as_os_user' not available in Windows" if inspec.os.windows? && su_user
43
+ fail_resource "Can't run Oracle checks without authentication" unless su_user && (user || password)
44
+ fail_resource "You must provide a service name for the session" unless service
49
45
  end
50
46
 
51
- def query(q)
52
- escaped_query = q.gsub(/\\/, '\\\\').gsub(/"/, '\\"')
53
- # escape tables with $
54
- escaped_query = escaped_query.gsub("$", '\\$')
55
-
56
- p = nil
57
- # use sqlplus if sqlcl is not available
47
+ def query(sql)
58
48
  if @sqlcl_bin && inspec.command(@sqlcl_bin).exist?
59
- bin = @sqlcl_bin
60
- opts = "set sqlformat csv\nSET FEEDBACK OFF"
61
- p = :parse_csv_result
49
+ @bin = @sqlcl_bin
50
+ format_options = "set sqlformat csv\nSET FEEDBACK OFF"
51
+ parser = :parse_csv_result
62
52
  else
63
- bin = @sqlplus_bin
64
- opts = "SET MARKUP HTML ON\nSET PAGESIZE 32000\nSET FEEDBACK OFF"
65
- p = :parse_html_result
53
+ @bin = "#{@sqlplus_bin} -S"
54
+ format_options = "SET MARKUP HTML ON\nSET PAGESIZE 32000\nSET FEEDBACK OFF"
55
+ parser = :parse_html_result
66
56
  end
67
57
 
68
- query = verify_query(escaped_query)
69
- query += ";" unless query.end_with?(";")
70
- if @db_role.nil?
71
- command = %{#{bin} "#{@user}"/"#{@password}"@#{@host}:#{@port}/#{@service} <<EOC\n#{opts}\n#{query}\nEXIT\nEOC}
72
- elsif @su_user.nil?
73
- command = %{#{bin} "#{@user}"/"#{@password}"@#{@host}:#{@port}/#{@service} as #{@db_role} <<EOC\n#{opts}\n#{query}\nEXIT\nEOC}
74
- else
75
- command = %{su - #{@su_user} -c "env ORACLE_SID=#{@service} #{bin} / as #{@db_role} <<EOC\n#{opts}\n#{query}\nEXIT\nEOC"}
76
- end
77
- cmd = inspec.command(command)
78
-
79
- out = cmd.stdout + "\n" + cmd.stderr
80
- if out.downcase =~ /^error/
81
- # TODO: we need to throw an exception here
82
- # change once https://github.com/chef/inspec/issues/1205 is in
83
- warn "Could not execute the sql query #{out}"
84
- DatabaseHelper::SQLQueryResult.new(cmd, Hashie::Mash.new({}))
85
- end
86
- DatabaseHelper::SQLQueryResult.new(cmd, send(p, cmd.stdout))
58
+ command = command_builder(format_options, sql)
59
+ inspec_cmd = inspec.command(command)
60
+
61
+ DatabaseHelper::SQLQueryResult.new(inspec_cmd, send(parser,
62
+ inspec_cmd.stdout))
87
63
  end
88
64
 
89
65
  def to_s
@@ -92,9 +68,30 @@ module Inspec::Resources
92
68
 
93
69
  private
94
70
 
71
+ # 3 commands
72
+ # regular user password
73
+ # using a db_role
74
+ # su, using a db_role
75
+ def command_builder(format_options, query)
76
+ verified_query = verify_query(query)
77
+ sql_prefix, sql_postfix = "", ""
78
+ if inspec.os.windows?
79
+ sql_prefix = %{@'\n#{format_options}\n#{verified_query}\nEXIT\n'@ | }
80
+ else
81
+ sql_postfix = %{ <<'EOC'\n#{format_options}\n#{verified_query}\nEXIT\nEOC}
82
+ end
83
+
84
+ if @db_role.nil?
85
+ %{#{sql_prefix}#{bin} "#{user}"/"#{password}"@#{host}:#{port}/#{@service}#{sql_postfix}}
86
+ elsif @su_user.nil?
87
+ %{#{sql_prefix}#{bin} "#{user}"/"#{password}"@#{host}:#{port}/#{@service} as #{@db_role}#{sql_postfix}}
88
+ else
89
+ %{su - #{@su_user} -c "env ORACLE_SID=#{@service} #{bin} / as #{@db_role}#{sql_postfix}}
90
+ end
91
+ end
92
+
95
93
  def verify_query(query)
96
- # ensure we have a ; at the end
97
- query + ";" unless query.strip.end_with?(";")
94
+ query += ";" unless query.strip.end_with?(";")
98
95
  query
99
96
  end
100
97
 
@@ -115,7 +112,7 @@ module Inspec::Resources
115
112
  results
116
113
  end
117
114
 
118
- def parse_html_result(stdout) # rubocop:disable Metrics/AbcSize
115
+ def parse_html_result(stdout)
119
116
  result = stdout
120
117
  # make oracle html valid html by removing the p tag, it does not include a closing tag
121
118
  result = result.gsub("<p>", "").gsub("</p>", "").gsub("<br>", "")
@@ -464,8 +464,9 @@ module Inspec::Resources
464
464
  multiple_values: false
465
465
  ).params
466
466
 
467
- dparse = Date.parse "#{params['Last password change']}"
468
- dayslastset = (Date.today - dparse).to_i
467
+ last_change = params["Last password change"]
468
+ dparse = Date.parse "#{last_change}" rescue nil
469
+ dayslastset = (Date.today - dparse).to_i if dparse
469
470
  cmd = inspec.command("lastb -w -a | grep #{username} | wc -l")
470
471
  badpasswordattempts = convert_to_i(cmd.stdout.chomp) if cmd.exit_status == 0
471
472
 
@@ -59,7 +59,7 @@ module Inspec::Resources
59
59
  # detect repo start
60
60
  in_repo = true if line =~ /^\s*Repo-id\s*:\s*(.*)\b/
61
61
  # detect repo end
62
- if line == "\n" && in_repo
62
+ if (line == "\n" || line =~ /\s*Total packages:/) && in_repo
63
63
  in_repo = false
64
64
  @cache.push(repo)
65
65
  repo = {}
@@ -70,6 +70,9 @@ module Inspec::Resources
70
70
  repo[repo_key(strip(val[1]))] = strip(val[2])
71
71
  end
72
72
  end
73
+
74
+ @cache.push(repo) if in_repo
75
+
73
76
  @cache
74
77
  end
75
78
 
@@ -50,8 +50,8 @@ module Inspec
50
50
  def method_missing(method_name, *arguments, &block)
51
51
  # see if it is a resource first
52
52
  begin
53
- inspec = inspec if respond_to?(:inspec) # backend not available??
54
- resource = Inspec::DSL.method_missing_resource(inspec, method_name, *arguments)
53
+ backend = inspec if respond_to?(:inspec) # backend not available??
54
+ resource = Inspec::DSL.method_missing_resource(backend, method_name, *arguments)
55
55
  return resource if resource
56
56
  rescue LoadError
57
57
  # pass through
@@ -2,7 +2,7 @@
2
2
 
3
3
  require "method_source"
4
4
  require "date"
5
- require "inspec/describe"
5
+ require "inspec/describe_base"
6
6
  require "inspec/expect"
7
7
  require "inspec/resource"
8
8
  require "inspec/resources/os"
@@ -60,7 +60,7 @@ module Inspec
60
60
  # waivers have higher precedence than only_if.
61
61
  __apply_waivers
62
62
 
63
- rescue StandardError => e
63
+ rescue SystemStackError, StandardError => e
64
64
  # We've encountered an exception while trying to eval the code inside the
65
65
  # control block. We need to prevent the exception from bubbling up, and
66
66
  # fail the control. Controls are failed by having a failed resource within
@@ -34,6 +34,8 @@ module Inspec
34
34
  attr_reader :backend, :rules
35
35
  attr_accessor :target_profiles
36
36
 
37
+ attr_accessor :test_collector
38
+
37
39
  def attributes
38
40
  Inspec.deprecate(:rename_attributes_to_inputs, "Don't call runner.attributes, call runner.inputs")
39
41
  inputs
@@ -18,7 +18,7 @@ class NginxParser < Parslet::Parser
18
18
  end
19
19
 
20
20
  rule(:standard_identifier) do
21
- (match("[a-zA-Z]") >> match('\S').repeat).as(:identifier) >> space >> space.repeat
21
+ (match("[a-zA-Z~*.]") >> match('\S').repeat).as(:identifier) >> space >> space.repeat
22
22
  end
23
23
 
24
24
  rule(:quoted_identifier) do
@@ -1,3 +1,3 @@
1
1
  module Inspec
2
- VERSION = "4.18.0".freeze
2
+ VERSION = "4.18.24".freeze
3
3
  end
@@ -152,7 +152,7 @@ $ inspec exec compliance://admin/profile
152
152
 
153
153
  Pending: (Failures listed here are expected and do not affect your suite's status)
154
154
 
155
- 1) gordon_config Can't find file "/tmp/gordon/config.yaml"
155
+ 1) example_config Can't find file "/tmp/example/config.yaml"
156
156
  # Not yet implemented
157
157
  # ./lib/inspec/runner.rb:157
158
158
 
@@ -72,10 +72,10 @@ module InspecPlugins
72
72
  desc "exec PROFILE", "executes a #{COMPLIANCE_PRODUCT_NAME} profile"
73
73
  exec_options
74
74
  def exec(*tests)
75
- config = InspecPlugins::Compliance::Configuration.new
76
- return unless loggedin(config)
75
+ compliance_config = InspecPlugins::Compliance::Configuration.new
76
+ return unless loggedin(compliance_config)
77
77
 
78
- o = opts(:exec).dup
78
+ o = config # o is an Inspec::Config object, provided by a helper method from Inspec::BaseCLI
79
79
  diagnose(o)
80
80
  configure_logger(o)
81
81
 
@@ -9,7 +9,7 @@ module PluginManagerHelpers
9
9
  let(:list_after_run) do
10
10
  Proc.new do |run_result, tmp_dir|
11
11
  # After installing/uninstalling/whatevering, run list with config in the same dir, and capture it.
12
- run_result.payload.list_result = parse_plugin_list_lines(
12
+ @list_result = parse_plugin_list_lines(
13
13
  run_inspec_process("plugin list", env: { INSPEC_CONFIG_DIR: tmp_dir }).stdout
14
14
  )
15
15
  end
@@ -54,12 +54,12 @@ class PluginManagerCliInstall < Minitest::Test
54
54
  assert_includes success_message, "plugin installed via source path reference"
55
55
 
56
56
  # Check round-trip UX via list
57
- itf_plugin = install_result.payload.list_result.detect { |p| p[:name] == fixture_info[:plugin_name] }
57
+ itf_plugin = @list_result.detect { |p| p[:name] == fixture_info[:plugin_name] }
58
58
  refute_nil itf_plugin, "plugin name should now appear in the output of inspec list"
59
59
  assert_equal "path", itf_plugin[:type], "list output should show that it is a path installation"
60
60
 
61
61
  # Check plugin statefile. Extra important in this case, since all should resolve to the same entry point.
62
- plugin_data = install_result.payload.plugin_data
62
+ plugin_data = @plugin_data
63
63
  entry = plugin_data["plugins"].detect { |e| e["name"] == fixture_info[:plugin_name] }
64
64
  assert_equal fixture_info[:resolved_path], entry["installation_path"], "Regardless of input, the entry point should be correct."
65
65
 
@@ -164,7 +164,7 @@ class PluginManagerCliInstall < Minitest::Test
164
164
  refute_nil success_message, "Should find a success message at the end"
165
165
  assert_includes success_message, "installed from local .gem file"
166
166
 
167
- itf_plugin = install_result.payload.list_result.detect { |p| p[:name] == "inspec-test-fixture" }
167
+ itf_plugin = @list_result.detect { |p| p[:name] == "inspec-test-fixture" }
168
168
  refute_nil itf_plugin, "plugin name should now appear in the output of inspec list"
169
169
  assert_equal "gem (user)", itf_plugin[:type]
170
170
  assert_equal "0.1.0", itf_plugin[:version]
@@ -195,7 +195,7 @@ class PluginManagerCliInstall < Minitest::Test
195
195
  assert_includes success_message, "0.2.0"
196
196
  assert_includes success_message, "installed from rubygems.org"
197
197
 
198
- itf_plugin = install_result.payload.list_result.detect { |p| p[:name] == "inspec-test-fixture" }
198
+ itf_plugin = @list_result.detect { |p| p[:name] == "inspec-test-fixture" }
199
199
  refute_nil itf_plugin, "plugin name should now appear in the output of inspec list"
200
200
  assert_equal "gem (user)", itf_plugin[:type]
201
201
  assert_equal "0.2.0", itf_plugin[:version]
@@ -225,7 +225,7 @@ class PluginManagerCliInstall < Minitest::Test
225
225
  assert_includes success_message, "0.1.0"
226
226
  assert_includes success_message, "installed from rubygems.org"
227
227
 
228
- itf_plugin = install_result.payload.list_result.detect { |p| p[:name] == "inspec-test-fixture" }
228
+ itf_plugin = @list_result.detect { |p| p[:name] == "inspec-test-fixture" }
229
229
  refute_nil itf_plugin, "plugin name should now appear in the output of inspec list"
230
230
  assert_equal "gem (user)", itf_plugin[:type]
231
231
  assert_equal "0.1.0", itf_plugin[:version]
@@ -317,7 +317,7 @@ class PluginManagerCliInstall < Minitest::Test
317
317
  assert_includes success_message, "0.1.0"
318
318
  assert_includes success_message, "installed from rubygems.org"
319
319
 
320
- ttf_plugin = install_result.payload.list_result.detect { |p| p[:name] == "train-test-fixture" }
320
+ ttf_plugin = @list_result.detect { |p| p[:name] == "train-test-fixture" }
321
321
  refute_nil ttf_plugin, "plugin name should now appear in the output of inspec list"
322
322
  assert_equal "gem (user)", ttf_plugin[:type]
323
323
  assert_equal "0.1.0", ttf_plugin[:version]
@@ -20,7 +20,7 @@ class PluginManagerCliUninstall < Minitest::Test
20
20
  assert_includes success_message, "0.1.0"
21
21
  assert_includes success_message, "has been uninstalled"
22
22
 
23
- itf_plugins = uninstall_result.payload.list_result.select { |p| p[:name] == "inspec-test-fixture" }
23
+ itf_plugins = @list_result.select { |p| p[:name] == "inspec-test-fixture" }
24
24
  assert_empty itf_plugins, "inspec-test-fixture should not appear in the output of inspec list"
25
25
 
26
26
  assert_empty uninstall_result.stderr
@@ -42,7 +42,7 @@ class PluginManagerCliUninstall < Minitest::Test
42
42
  assert_includes success_message, "path-based plugin install"
43
43
  assert_includes success_message, "has been uninstalled"
44
44
 
45
- itf_plugins = uninstall_result.payload.list_result.select { |p| p[:name] == "inspec-meaning-of-life" }
45
+ itf_plugins = @list_result.select { |p| p[:name] == "inspec-meaning-of-life" }
46
46
  assert_empty itf_plugins, "inspec-meaning-of-life should not appear in the output of inspec list"
47
47
 
48
48
  assert_empty uninstall_result.stderr
@@ -22,7 +22,7 @@ class PluginManagerCliUpdate < Minitest::Test
22
22
  assert_includes success_message, "0.2.0"
23
23
  assert_includes success_message, "updated from rubygems.org"
24
24
 
25
- itf_plugin = update_result.payload.list_result.detect { |p| p[:name] == "inspec-test-fixture" }
25
+ itf_plugin = @list_result.detect { |p| p[:name] == "inspec-test-fixture" }
26
26
  refute_nil itf_plugin, "plugin name should now appear in the output of inspec list"
27
27
  assert_equal "gem (user)", itf_plugin[:type]
28
28
  assert_equal "0.2.0", itf_plugin[:version]
@@ -65,7 +65,7 @@ module CorePluginFunctionalHelper
65
65
  elsif opts.key?(:env)
66
66
  prefix = opts[:env].to_a.map { |assignment| "#{assignment[0]}=#{assignment[1]}" }.join(" ")
67
67
  end
68
- Inspec::FuncTestRunResult.new(TRAIN_CONNECTION.run_command("#{prefix} #{exec_inspec} #{command_line}"))
68
+ TRAIN_CONNECTION.run_command("#{prefix} #{exec_inspec} #{command_line}")
69
69
  end
70
70
 
71
71
  # This helper does some fancy footwork to make InSpec think a plugin
@@ -76,8 +76,7 @@ module CorePluginFunctionalHelper
76
76
  # Modify plugin_statefile_data as needed; it will be written to a plugins.json
77
77
  # in tmp_dir_path. You may also copy in other things to the tmp_dir_path. Your PWD
78
78
  # will be in the tmp_dir, and it will exist and be empty.
79
- # :post_run: Proc(FuncTestRunResult, tmp_dir_path) - optional result capture block.
80
- # run_result will be populated, but you can add more to the ostruct .payload
79
+ # :post_run: Proc(CommandResult, tmp_dir_path) - optional result capture block.
81
80
  # Your PWD will be the tmp_dir, and it will still exist (for a moment!)
82
81
  def run_inspec_process_with_this_plugin(command_line, opts = {})
83
82
  plugin_path = __find_plugin_path_from_caller
@@ -101,7 +100,7 @@ module CorePluginFunctionalHelper
101
100
 
102
101
  # Read the resulting plugins.json into memory, if any
103
102
  if File.exist?(plugin_file_path)
104
- run_result.payload.plugin_data = JSON.parse(File.read(plugin_file_path))
103
+ @plugin_data = JSON.parse(File.read(plugin_file_path))
105
104
  end
106
105
 
107
106
  opts[:post_run]&.call(run_result, tmp_dir)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.18.0
4
+ version: 4.18.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef InSpec Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-10 00:00:00.000000000 Z
11
+ date: 2019-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: train
@@ -86,6 +86,20 @@ dependencies:
86
86
  - - "<"
87
87
  - !ruby/object:Gem::Version
88
88
  version: '2.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: chef-core
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.0'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.0'
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: thor
91
105
  requirement: !ruby/object:Gem::Requirement
@@ -454,7 +468,7 @@ files:
454
468
  - lib/inspec/dependencies/lockfile.rb
455
469
  - lib/inspec/dependencies/requirement.rb
456
470
  - lib/inspec/dependencies/resolver.rb
457
- - lib/inspec/describe.rb
471
+ - lib/inspec/describe_base.rb
458
472
  - lib/inspec/dist.rb
459
473
  - lib/inspec/dsl.rb
460
474
  - lib/inspec/dsl_shared.rb