inspec-core 4.21.3 → 4.23.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/inspec-core.gemspec +3 -5
  4. data/lib/bundles/inspec-supermarket/cli.rb +1 -1
  5. data/lib/inspec/base_cli.rb +5 -1
  6. data/lib/inspec/config.rb +19 -1
  7. data/lib/inspec/exceptions.rb +1 -0
  8. data/lib/inspec/input.rb +4 -3
  9. data/lib/inspec/input_registry.rb +9 -2
  10. data/lib/inspec/metadata.rb +6 -1
  11. data/lib/inspec/plugin/v2/plugin_types/reporter.rb +4 -25
  12. data/lib/inspec/profile.rb +30 -9
  13. data/lib/inspec/reporters.rb +0 -3
  14. data/lib/inspec/reporters/automate.rb +3 -3
  15. data/lib/inspec/reporters/base.rb +7 -23
  16. data/lib/inspec/reporters/cli.rb +1 -0
  17. data/lib/inspec/reporters/json.rb +9 -4
  18. data/lib/inspec/resources/apt.rb +2 -0
  19. data/lib/inspec/resources/bridge.rb +1 -1
  20. data/lib/inspec/resources/host.rb +1 -1
  21. data/lib/inspec/resources/mount.rb +1 -1
  22. data/lib/inspec/resources/mysql_session.rb +31 -8
  23. data/lib/inspec/resources/postgres.rb +1 -1
  24. data/lib/inspec/resources/postgres_session.rb +6 -4
  25. data/lib/inspec/resources/processes.rb +1 -1
  26. data/lib/inspec/resources/service.rb +2 -2
  27. data/lib/inspec/resources/users.rb +1 -1
  28. data/lib/inspec/resources/windows_firewall.rb +110 -0
  29. data/lib/inspec/resources/windows_firewall_rule.rb +137 -0
  30. data/lib/inspec/run_data.rb +1 -1
  31. data/lib/inspec/run_data/profile.rb +7 -6
  32. data/lib/inspec/runner.rb +8 -2
  33. data/lib/inspec/runner_rspec.rb +4 -1
  34. data/lib/inspec/schema.rb +2 -0
  35. data/lib/inspec/schema/exec_json.rb +4 -3
  36. data/lib/inspec/schema/primitives.rb +1 -1
  37. data/lib/inspec/utils/parser.rb +1 -1
  38. data/lib/inspec/utils/run_data_filters.rb +104 -0
  39. data/lib/inspec/version.rb +1 -1
  40. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api.rb +4 -4
  41. data/lib/plugins/inspec-compliance/lib/inspec-compliance/cli.rb +1 -1
  42. data/lib/plugins/inspec-reporter-html2/templates/profile.html.erb +5 -2
  43. data/lib/plugins/inspec-reporter-junit/README.md +15 -0
  44. data/lib/plugins/inspec-reporter-junit/lib/inspec-reporter-junit.rb +12 -0
  45. data/lib/{inspec/reporters/junit.rb → plugins/inspec-reporter-junit/lib/inspec-reporter-junit/reporter.rb} +22 -26
  46. data/lib/plugins/inspec-reporter-junit/lib/inspec-reporter-junit/version.rb +5 -0
  47. metadata +19 -36
  48. data/README.md +0 -474
@@ -47,7 +47,7 @@ module Inspec
47
47
  # core reporters have been migrated to plugins. It is probable that new data elements
48
48
  # and new Hash compatibility behavior will be added during the core reporter plugin
49
49
  # conversion process.
50
- SCHEMA_VERSION = "0.1.0".freeze
50
+ SCHEMA_VERSION = "0.2.0".freeze
51
51
 
52
52
  def self.compatible_schema?(constraints)
53
53
  reqs = Gem::Requirement.create(constraints)
@@ -15,7 +15,7 @@ module Inspec
15
15
  :summary,
16
16
  :supports, # complex local
17
17
  :parent_profile,
18
- :skip_message,
18
+ :status_message,
19
19
  :waiver_data, # Undocumented but used in JSON reporter - should not be?
20
20
  :title,
21
21
  :version
@@ -40,7 +40,7 @@ module Inspec
40
40
  title
41
41
  version
42
42
  parent_profile
43
- skip_message
43
+ status_message
44
44
  waiver_data
45
45
  }.each do |field|
46
46
  self[field] = raw_prof_data[field]
@@ -51,11 +51,11 @@ module Inspec
51
51
  class Profile
52
52
  # Good candidate for keyword_init, but that is not in 2.4
53
53
  Dependency = Struct.new(
54
- :name, :path, :status, :skip_message, :git, :url, :compliance, :supermarket, :branch, :tag, :commit, :version, :relative_path
54
+ :name, :path, :status, :status_message, :git, :url, :compliance, :supermarket, :branch, :tag, :commit, :version, :relative_path
55
55
  ) do
56
56
  include HashLikeStruct
57
57
  def initialize(raw_dep_data)
58
- %i{name path status skip_message git url supermarket compliance branch tag commit version relative_path}.each { |f| self[f] = raw_dep_data[f] }
58
+ %i{name path status status_message git url supermarket compliance branch tag commit version relative_path}.each { |f| self[f] = raw_dep_data[f] }
59
59
  end
60
60
  end
61
61
 
@@ -96,11 +96,12 @@ module Inspec
96
96
  # There are probably others
97
97
  :value,
98
98
  :type,
99
- :required
99
+ :required,
100
+ :sensitive
100
101
  ) do
101
102
  include HashLikeStruct
102
103
  def initialize(raw_opts_data)
103
- %i{value type required}.each { |f| self[f] = raw_opts_data[f] }
104
+ %i{value type required sensitive}.each { |f| self[f] = raw_opts_data[f] }
104
105
  end
105
106
  end
106
107
  end
@@ -115,8 +115,14 @@ module Inspec
115
115
  @test_collector.add_profile(requirement.profile)
116
116
  end
117
117
 
118
- tests = profile.collect_tests
119
- all_controls += tests unless tests.nil?
118
+ begin
119
+ tests = profile.collect_tests
120
+ all_controls += tests unless tests.nil?
121
+ rescue Inspec::Exceptions::ProfileLoadFailed => e
122
+ Inspec::Log.error "Failed to load profile #{profile.name}: #{e}"
123
+ profile.set_status_message e.to_s
124
+ next
125
+ end
120
126
  end
121
127
 
122
128
  all_controls.each do |rule|
@@ -90,9 +90,12 @@ module Inspec
90
90
  return @rspec_exit_code if @formatter.results.empty?
91
91
 
92
92
  stats = @formatter.results[:statistics][:controls]
93
+ load_failures = @formatter.results[:profiles]&.select { |p| p[:status] == "failed" }&.any?
93
94
  skipped = @formatter.results.dig(:profiles, 0, :status) == "skipped"
94
- if stats[:failed][:total] == 0 && stats[:skipped][:total] == 0 && !skipped
95
+ if stats[:failed][:total] == 0 && stats[:skipped][:total] == 0 && !skipped && !load_failures
95
96
  0
97
+ elsif load_failures
98
+ @conf["distinct_exit"] ? 102 : 1
96
99
  elsif stats[:failed][:total] > 0
97
100
  @conf["distinct_exit"] ? 100 : 1
98
101
  elsif stats[:skipped][:total] > 0 || skipped
@@ -147,6 +147,8 @@ module Inspec
147
147
  "license" => { "type" => "string", "optional" => true },
148
148
  "summary" => { "type" => "string", "optional" => true },
149
149
  "status" => { "type" => "string", "optional" => false },
150
+ "status_message" => { "type" => "string", "optional" => true },
151
+ # skip_message is deprecated, status_message should be used to store the reason for skipping
150
152
  "skip_message" => { "type" => "string", "optional" => true },
151
153
 
152
154
  "supports" => {
@@ -83,7 +83,7 @@ module Inspec
83
83
  "required" => %w{name sha256 supports attributes groups controls},
84
84
  # Name is mandatory in inspec.yml.
85
85
  # supports, controls, groups, and attributes are always present, even if empty
86
- # sha256, status, skip_message
86
+ # sha256, status, status_message
87
87
  "properties" => {
88
88
  # These are provided in inspec.yml
89
89
  "name" => Primitives::STRING,
@@ -100,10 +100,11 @@ module Inspec
100
100
  "description" => Primitives::STRING,
101
101
  "inspec_version" => Primitives::STRING,
102
102
 
103
- # These are generated at runtime, and all except skip_message are guaranteed
103
+ # These are generated at runtime, and all except status_message and skip_message are guaranteed
104
104
  "sha256" => Primitives::STRING,
105
105
  "status" => Primitives::STRING,
106
- "skip_message" => Primitives::STRING, # If skipped, why
106
+ "status_message" => Primitives::STRING, # If skipped or failed to load, why
107
+ "skip_message" => Primitives::STRING, # Deprecated field storing reason for skipping. status_message should be used instead.
107
108
  "controls" => Primitives.array(CONTROL.ref),
108
109
  "groups" => Primitives.array(Primitives::CONTROL_GROUP.ref),
109
110
  "attributes" => Primitives.array(Primitives::INPUT),
@@ -160,7 +160,7 @@ module Inspec
160
160
  "url" => URL,
161
161
  "branch" => STRING,
162
162
  "path" => STRING,
163
- "skip_message" => STRING,
163
+ "status_message" => STRING,
164
164
  "status" => STRING,
165
165
  "git" => URL,
166
166
  "supermarket" => STRING,
@@ -84,7 +84,7 @@ module Inspec
84
84
  end
85
85
 
86
86
  # parse device and type
87
- mount_options = { device: mount[0], type: mount[4] }
87
+ mount_options = { device: mount[0], type: mount[4] }
88
88
 
89
89
  if compatibility == false
90
90
  # parse options as array
@@ -0,0 +1,104 @@
1
+ module Inspec
2
+ module Utils
3
+ # RunDataFilters is a mixin for core Reporters and plugin reporters.
4
+ # The methods operate on the run_data Hash (prior to any conversion to a
5
+ # full RunData object).
6
+ # All methods here operate using the run_data accessor and modify
7
+ # its contents in place (if needed).
8
+ module RunDataFilters
9
+
10
+ # Long name, but we want to be clear this operates on the Hash
11
+ # This is the only method that client libraries need to call; any future
12
+ # feature growth should be handled internally here.
13
+ def apply_run_data_filters_to_hash
14
+ @config[:runtime_config] = Inspec::Config.cached || {}
15
+ apply_report_resize_options
16
+ redact_sensitive_inputs
17
+ suppress_diff_output
18
+ sort_controls
19
+ end
20
+
21
+ # Apply options such as message truncation and removal of backtraces
22
+ def apply_report_resize_options
23
+ runtime_config = @config[:runtime_config]
24
+
25
+ message_truncation = runtime_config[:reporter_message_truncation] || "ALL"
26
+ @trunc = message_truncation == "ALL" ? -1 : message_truncation.to_i
27
+ include_backtrace = runtime_config[:reporter_backtrace_inclusion].nil? ? true : runtime_config[:reporter_backtrace_inclusion]
28
+
29
+ @run_data[:profiles]&.each do |p|
30
+ p[:controls].each do |c|
31
+ c[:results]&.map! do |r|
32
+ r.delete(:backtrace) unless include_backtrace
33
+ process_message_truncation(r)
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ # Find any inputs with :sensitive = true and replace their values with "***"
40
+ def redact_sensitive_inputs
41
+ @run_data[:profiles]&.each do |p|
42
+ p[:inputs]&.each do |i|
43
+ next unless i[:options][:sensitive]
44
+
45
+ i[:options][:value] = "***"
46
+ end
47
+ end
48
+ end
49
+
50
+ # Optionally suppress diff output in the message field
51
+ def suppress_diff_output
52
+ return if @config[:runtime_config][:diff]
53
+
54
+ @run_data[:profiles]&.each do |p|
55
+ p[:controls]&.each do |c|
56
+ c[:results]&.each do |r|
57
+ next unless r[:message] # :message only set on failure
58
+
59
+ pos = r[:message].index("\n\nDiff:")
60
+ next unless pos # Only textual tests get Diffs
61
+
62
+ r[:message] = r[:message].slice(0, pos)
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ # Optionally sort controls within each profile in report
69
+ def sort_controls
70
+ sort_type = @config[:runtime_config][:sort_results_by]
71
+ return unless sort_type
72
+ return if sort_type == "none"
73
+
74
+ @run_data[:profiles]&.each do |p|
75
+ p[:controls] ||= []
76
+ p[:groups] ||= []
77
+
78
+ case sort_type
79
+ when "control"
80
+ p[:controls].sort_by! { |c| c[:id] }
81
+ when "random"
82
+ p[:controls].shuffle!
83
+ when "file"
84
+ # Sort the controls by file, but preserve order within the file.
85
+ # Files are called "groups" in the run_data, and the filename is in the id.
86
+ sorted_control_ids = p[:groups].sort_by { |g| g[:id] }.map { |g| g[:controls] }.flatten
87
+ controls_by_id = {}
88
+ p[:controls].each { |c| controls_by_id[c[:id]] = c }
89
+ p[:controls] = sorted_control_ids.map { |cid| controls_by_id[cid] }
90
+ end
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def process_message_truncation(result)
97
+ if result.key?(:message) && result[:message] != "" && @trunc > -1 && result[:message].length > @trunc
98
+ result[:message] = result[:message][0...@trunc] + "[Truncated to #{@trunc} characters]"
99
+ end
100
+ result
101
+ end
102
+ end
103
+ end
104
+ end
@@ -1,3 +1,3 @@
1
1
  module Inspec
2
- VERSION = "4.21.3".freeze
2
+ VERSION = "4.23.4".freeze
3
3
  end
@@ -22,7 +22,7 @@ module InspecPlugins
22
22
  # return all compliance profiles available for the user
23
23
  # the user is either specified in the options hash or by default
24
24
  # the username of the account is used that is logged in
25
- def self.profiles(config, profile_filter = nil) # rubocop:disable PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
25
+ def self.profiles(config, profile_filter = nil) # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
26
26
  owner = config["owner"] || config["user"]
27
27
 
28
28
  # Chef Compliance
@@ -81,13 +81,13 @@ module InspecPlugins
81
81
  mapped_profiles.select! do |p|
82
82
  (!ver || p["version"] == ver) && (!id || p["name"] == id)
83
83
  end
84
- return msg, mapped_profiles
84
+ [msg, mapped_profiles]
85
85
  when "401"
86
86
  msg = "401 Unauthorized. Please check your token."
87
- return msg, []
87
+ [msg, []]
88
88
  else
89
89
  msg = "An unexpected error occurred (HTTP #{response_code}): #{response.message}"
90
- return msg, []
90
+ [msg, []]
91
91
  end
92
92
  end
93
93
 
@@ -126,7 +126,7 @@ module InspecPlugins
126
126
  desc: "Overwrite existing profile on Server."
127
127
  option :owner, type: :string, required: false,
128
128
  desc: "Owner that should own the profile"
129
- def upload(path) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, PerceivedComplexity, Metrics/CyclomaticComplexity
129
+ def upload(path) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
130
130
  config = InspecPlugins::Compliance::Configuration.new
131
131
  return unless loggedin(config)
132
132
 
@@ -7,8 +7,11 @@
7
7
  <% if profile.summary %>
8
8
  <tr class="profile-summary"><th>Summary:</th><td><%= profile.summary %></td></tr>
9
9
  <% end %>
10
- <% if profile.skip_message %>
11
- <tr class="profile-skip-message"><th>Skip Message:</th><td><%= profile.skip_message %></td></tr>
10
+ <% if profile.status != "loaded" %>
11
+ <tr class="profile-status"><th>Status:</th><td><%= profile.status %></td></tr>
12
+ <% end %>
13
+ <% if profile.status_message && !profile.status_message.empty? %>
14
+ <tr class="profile-status-message"><th>Status Message:</th><td><%= profile.status_message %></td></tr>
12
15
  <% end %>
13
16
  </table>
14
17
 
@@ -0,0 +1,15 @@
1
+ # junit reporter
2
+
3
+ This is the implementation of the junit XML reporter.
4
+
5
+ ## To Install This Plugin
6
+
7
+ This plugin is included with inspec. There is no need to install it separately.
8
+
9
+ ## What This Plugin Does
10
+
11
+ This reporter generates an XML report in Apache Ant JUnit format.
12
+
13
+ ## Implementation Note
14
+
15
+ This reporter uses the REXML XML generator, but may use more advanced XML systems for testing. This is to keep packaging requirements for CHef InSpec lightweight and free of compiled dependencies.
@@ -0,0 +1,12 @@
1
+ require_relative "inspec-reporter-junit/version"
2
+ module InspecPlugins
3
+ module JUnitReporter
4
+ class Plugin < ::Inspec.plugin(2)
5
+ plugin_name :'inspec-reporter-junit'
6
+ reporter :junit do
7
+ require_relative "inspec-reporter-junit/reporter"
8
+ InspecPlugins::JUnitReporter::Reporter
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,9 @@
1
- module Inspec::Reporters
2
- class Junit < Base
1
+ module InspecPlugins::JUnitReporter
2
+ class Reporter < Inspec.plugin(2, :reporter)
3
+ def self.run_data_schema_constraints
4
+ "~> 0.0"
5
+ end
6
+
3
7
  def render
4
8
  require "rexml/document"
5
9
  xml_output = REXML::Document.new
@@ -8,7 +12,7 @@ module Inspec::Reporters
8
12
  testsuites = REXML::Element.new("testsuites")
9
13
  xml_output.add(testsuites)
10
14
 
11
- run_data[:profiles].each do |profile|
15
+ run_data.profiles.each do |profile|
12
16
  testsuites.add(build_profile_xml(profile))
13
17
  end
14
18
 
@@ -18,20 +22,16 @@ module Inspec::Reporters
18
22
  output(formatter.write(xml_output.root, ""))
19
23
  end
20
24
 
21
- private
22
-
23
25
  def build_profile_xml(profile)
24
26
  profile_xml = REXML::Element.new("testsuite")
25
- profile_xml.add_attribute("name", profile[:name])
27
+ profile_xml.add_attribute("name", profile.name)
26
28
  profile_xml.add_attribute("tests", count_profile_tests(profile))
27
29
  profile_xml.add_attribute("failed", count_profile_failed_tests(profile))
28
30
  profile_xml.add_attribute("failures", count_profile_failed_tests(profile))
29
31
 
30
- profile[:controls].each do |control|
31
- next if control[:results].nil?
32
-
33
- control[:results].each do |result|
34
- profile_xml.add(build_result_xml(profile[:name], control, result))
32
+ profile.controls.each do |control|
33
+ control.results.each do |result|
34
+ profile_xml.add(build_result_xml(profile.name, control, result))
35
35
  end
36
36
  end
37
37
 
@@ -40,16 +40,16 @@ module Inspec::Reporters
40
40
 
41
41
  def build_result_xml(profile_name, control, result)
42
42
  result_xml = REXML::Element.new("testcase")
43
- result_xml.add_attribute("name", result[:code_desc])
44
- result_xml.add_attribute("classname", control[:title].nil? ? "#{profile_name}.Anonymous" : "#{profile_name}.#{control[:id]}")
45
- result_xml.add_attribute("target", run_data[:platform][:target].nil? ? "" : run_data[:platform][:target].to_s)
46
- result_xml.add_attribute("time", result[:run_time])
43
+ result_xml.add_attribute("name", result.code_desc)
44
+ result_xml.add_attribute("classname", control.title.nil? ? "#{profile_name}.Anonymous" : "#{profile_name}.#{control.id}")
45
+ result_xml.add_attribute("target", run_data.platform.target.nil? ? "" : run_data.platform.target.to_s)
46
+ result_xml.add_attribute("time", result.run_time)
47
47
 
48
- if result[:status] == "failed"
48
+ if result.status == "failed"
49
49
  failure_element = REXML::Element.new("failure")
50
50
  failure_element.add_attribute("message", result[:message])
51
51
  result_xml.add(failure_element)
52
- elsif result[:status] == "skipped"
52
+ elsif result.status == "skipped"
53
53
  result_xml.add_element("skipped")
54
54
  end
55
55
 
@@ -57,19 +57,15 @@ module Inspec::Reporters
57
57
  end
58
58
 
59
59
  def count_profile_tests(profile)
60
- profile[:controls].reduce(0) do |acc, elem|
61
- acc + (elem[:results].nil? ? 0 : elem[:results].count)
60
+ profile.controls.reduce(0) do |acc, elem|
61
+ acc + elem.results.count
62
62
  end
63
63
  end
64
64
 
65
65
  def count_profile_failed_tests(profile)
66
- profile[:controls].reduce(0) do |acc, elem|
67
- if elem[:results].nil?
68
- acc
69
- else
70
- acc + elem[:results].reduce(0) do |fail_test_total, test_case|
71
- test_case[:status] == "failed" ? fail_test_total + 1 : fail_test_total
72
- end
66
+ profile.controls.reduce(0) do |acc, elem|
67
+ acc + elem.results.reduce(0) do |fail_test_total, test_case|
68
+ test_case.status == "failed" ? fail_test_total + 1 : fail_test_total
73
69
  end
74
70
  end
75
71
  end
@@ -0,0 +1,5 @@
1
+ module InspecPlugins
2
+ module JUnitReporter
3
+ VERSION = "0.1.0".freeze
4
+ end
5
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inspec-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.21.3
4
+ version: 4.23.4
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: 2020-06-30 00:00:00.000000000 Z
11
+ date: 2020-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-telemetry
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 0.2.13
34
34
  - - "<"
35
35
  - !ruby/object:Gem::Version
36
- version: '2.0'
36
+ version: '3.0'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 0.2.13
44
44
  - - "<"
45
45
  - !ruby/object:Gem::Version
46
- version: '2.0'
46
+ version: '3.0'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: thor
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -68,16 +68,22 @@ dependencies:
68
68
  name: json_schemer
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
- - - "~>"
71
+ - - ">="
72
72
  - !ruby/object:Gem::Version
73
73
  version: 0.2.1
74
+ - - "<"
75
+ - !ruby/object:Gem::Version
76
+ version: 0.2.12
74
77
  type: :runtime
75
78
  prerelease: false
76
79
  version_requirements: !ruby/object:Gem::Requirement
77
80
  requirements:
78
- - - "~>"
81
+ - - ">="
79
82
  - !ruby/object:Gem::Version
80
83
  version: 0.2.1
84
+ - - "<"
85
+ - !ruby/object:Gem::Version
86
+ version: 0.2.12
81
87
  - !ruby/object:Gem::Dependency
82
88
  name: method_source
83
89
  requirement: !ruby/object:Gem::Requirement
@@ -314,20 +320,6 @@ dependencies:
314
320
  - - "~>"
315
321
  - !ruby/object:Gem::Version
316
322
  version: '3.0'
317
- - !ruby/object:Gem::Dependency
318
- name: htmlentities
319
- requirement: !ruby/object:Gem::Requirement
320
- requirements:
321
- - - "~>"
322
- - !ruby/object:Gem::Version
323
- version: '4.3'
324
- type: :runtime
325
- prerelease: false
326
- version_requirements: !ruby/object:Gem::Requirement
327
- requirements:
328
- - - "~>"
329
- - !ruby/object:Gem::Version
330
- version: '4.3'
331
323
  - !ruby/object:Gem::Dependency
332
324
  name: multipart-post
333
325
  requirement: !ruby/object:Gem::Requirement
@@ -342,20 +334,6 @@ dependencies:
342
334
  - - "~>"
343
335
  - !ruby/object:Gem::Version
344
336
  version: '2.0'
345
- - !ruby/object:Gem::Dependency
346
- name: term-ansicolor
347
- requirement: !ruby/object:Gem::Requirement
348
- requirements:
349
- - - "~>"
350
- - !ruby/object:Gem::Version
351
- version: '1.7'
352
- type: :runtime
353
- prerelease: false
354
- version_requirements: !ruby/object:Gem::Requirement
355
- requirements:
356
- - - "~>"
357
- - !ruby/object:Gem::Version
358
- version: '1.7'
359
337
  - !ruby/object:Gem::Dependency
360
338
  name: train-core
361
339
  requirement: !ruby/object:Gem::Requirement
@@ -383,7 +361,6 @@ extra_rdoc_files: []
383
361
  files:
384
362
  - Gemfile
385
363
  - LICENSE
386
- - README.md
387
364
  - etc/deprecations.json
388
365
  - etc/plugin_filters.json
389
366
  - inspec-core.gemspec
@@ -483,7 +460,6 @@ files:
483
460
  - lib/inspec/reporters/cli.rb
484
461
  - lib/inspec/reporters/json.rb
485
462
  - lib/inspec/reporters/json_automate.rb
486
- - lib/inspec/reporters/junit.rb
487
463
  - lib/inspec/reporters/yaml.rb
488
464
  - lib/inspec/require_loader.rb
489
465
  - lib/inspec/resource.rb
@@ -601,6 +577,8 @@ files:
601
577
  - lib/inspec/resources/vbscript.rb
602
578
  - lib/inspec/resources/virtualization.rb
603
579
  - lib/inspec/resources/windows_feature.rb
580
+ - lib/inspec/resources/windows_firewall.rb
581
+ - lib/inspec/resources/windows_firewall_rule.rb
604
582
  - lib/inspec/resources/windows_hotfix.rb
605
583
  - lib/inspec/resources/windows_registry_key.rb
606
584
  - lib/inspec/resources/windows_task.rb
@@ -660,6 +638,7 @@ files:
660
638
  - lib/inspec/utils/object_traversal.rb
661
639
  - lib/inspec/utils/parser.rb
662
640
  - lib/inspec/utils/pkey_reader.rb
641
+ - lib/inspec/utils/run_data_filters.rb
663
642
  - lib/inspec/utils/simpleconfig.rb
664
643
  - lib/inspec/utils/spdx.rb
665
644
  - lib/inspec/utils/spdx.txt
@@ -740,6 +719,10 @@ files:
740
719
  - lib/plugins/inspec-reporter-json-min/lib/inspec-reporter-json-min.rb
741
720
  - lib/plugins/inspec-reporter-json-min/lib/inspec-reporter-json-min/reporter.rb
742
721
  - lib/plugins/inspec-reporter-json-min/lib/inspec-reporter-json-min/version.rb
722
+ - lib/plugins/inspec-reporter-junit/README.md
723
+ - lib/plugins/inspec-reporter-junit/lib/inspec-reporter-junit.rb
724
+ - lib/plugins/inspec-reporter-junit/lib/inspec-reporter-junit/reporter.rb
725
+ - lib/plugins/inspec-reporter-junit/lib/inspec-reporter-junit/version.rb
743
726
  - lib/plugins/shared/core_plugin_test_helper.rb
744
727
  - lib/plugins/things-for-train-integration.rb
745
728
  - lib/source_readers/flat.rb