inspec-core 4.49.0 → 4.56.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -11
  3. data/inspec-core.gemspec +2 -2
  4. data/lib/bundles/inspec-supermarket/README.md +21 -2
  5. data/lib/bundles/inspec-supermarket/cli.rb +20 -3
  6. data/lib/bundles/inspec-supermarket/target.rb +3 -2
  7. data/lib/inspec/base_cli.rb +8 -0
  8. data/lib/inspec/cli.rb +12 -3
  9. data/lib/inspec/config.rb +5 -1
  10. data/lib/inspec/dependencies/requirement.rb +2 -1
  11. data/lib/inspec/formatters/base.rb +8 -6
  12. data/lib/inspec/globals.rb +5 -0
  13. data/lib/inspec/library_eval_context.rb +2 -0
  14. data/lib/inspec/plugin/v1/registry.rb +1 -1
  15. data/lib/inspec/plugin/v2/plugin_types/streaming_reporter.rb +10 -0
  16. data/lib/inspec/profile.rb +2 -0
  17. data/lib/inspec/profile_context.rb +1 -6
  18. data/lib/inspec/reporters/automate.rb +1 -1
  19. data/lib/inspec/reporters/json.rb +1 -1
  20. data/lib/inspec/resources/auditd.rb +5 -4
  21. data/lib/inspec/resources/bash.rb +2 -0
  22. data/lib/inspec/resources/file.rb +38 -0
  23. data/lib/inspec/resources/firewalld.rb +83 -9
  24. data/lib/inspec/resources/grub_conf.rb +1 -1
  25. data/lib/inspec/resources/http.rb +135 -54
  26. data/lib/inspec/resources/ibmdb2_session.rb +2 -2
  27. data/lib/inspec/resources/iptables.rb +18 -2
  28. data/lib/inspec/resources/kernel_parameters.rb +58 -0
  29. data/lib/inspec/resources/mssql_session.rb +11 -3
  30. data/lib/inspec/resources/oracledb_session.rb +3 -1
  31. data/lib/inspec/resources/package.rb +74 -1
  32. data/lib/inspec/resources/packages.rb +21 -0
  33. data/lib/inspec/resources/registry_key.rb +30 -0
  34. data/lib/inspec/resources/selinux.rb +6 -1
  35. data/lib/inspec/resources/service.rb +58 -9
  36. data/lib/inspec/resources/ssl.rb +7 -0
  37. data/lib/inspec/resources/timezone.rb +65 -0
  38. data/lib/inspec/resources.rb +2 -0
  39. data/lib/inspec/runner_rspec.rb +30 -0
  40. data/lib/inspec/utils/filter.rb +46 -2
  41. data/lib/inspec/utils/run_data_filters.rb +1 -1
  42. data/lib/inspec/version.rb +1 -1
  43. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api.rb +1 -1
  44. data/lib/plugins/inspec-compliance/lib/inspec-compliance/cli.rb +4 -3
  45. metadata +8 -5
@@ -84,8 +84,13 @@ module Inspec::Resources
84
84
 
85
85
  def initialize(selinux_path = "/etc/selinux/config")
86
86
  @path = selinux_path
87
- cmd = inspec.command("sestatus")
87
+ if inspec.os.redhat? && inspec.os.name == "amazon"
88
+ lcmd = "/usr/sbin/sestatus"
89
+ else
90
+ lcmd = "sestatus"
91
+ end
88
92
 
93
+ cmd = inspec.command(lcmd)
89
94
  if cmd.exit_status != 0
90
95
  # `sestatus` command not found error message comes in stdout so handling both here
91
96
  out = cmd.stdout + "\n" + cmd.stderr
@@ -163,7 +163,12 @@ module Inspec::Resources
163
163
  when "mac_os_x", "darwin"
164
164
  LaunchCtl.new(inspec, service_ctl)
165
165
  when "freebsd"
166
- BSDInit.new(inspec, service_ctl)
166
+ version = os[:release].to_f
167
+ if version < 10
168
+ BSDInit.new(inspec, service_ctl)
169
+ else
170
+ FreeBSD10Init.new(inspec, service_ctl)
171
+ end
167
172
  when "arch"
168
173
  Systemd.new(inspec, service_ctl)
169
174
  when "coreos"
@@ -186,6 +191,8 @@ module Inspec::Resources
186
191
  Svcs.new(inspec)
187
192
  when "yocto"
188
193
  Systemd.new(inspec, service_ctl)
194
+ when "alpine"
195
+ SysV.new(inspec, service_ctl)
189
196
  end
190
197
  end
191
198
 
@@ -478,6 +485,7 @@ module Inspec::Resources
478
485
 
479
486
  # @see: https://www.freebsd.org/doc/en/articles/linux-users/startup.html
480
487
  # @see: https://www.freebsd.org/cgi/man.cgi?query=rc.conf&sektion=5
488
+ # @see: https://www.freebsd.org/cgi/man.cgi?query=rc&apropos=0&sektion=8&manpath=FreeBSD+9.3-RELEASE&arch=default&format=html
481
489
  class BSDInit < ServiceManager
482
490
  def initialize(service_name, service_ctl = nil)
483
491
  @service_ctl = service_ctl || "service"
@@ -485,17 +493,20 @@ module Inspec::Resources
485
493
  end
486
494
 
487
495
  def info(service_name)
488
- # check if service is enabled
489
- # services are enabled in /etc/rc.conf and /etc/defaults/rc.conf
490
- # via #{service_name}_enable="YES"
491
- # service SERVICE status returns the following result if not activated:
492
- # Cannot 'status' sshd. Set sshd_enable to YES in /etc/rc.conf or use 'onestatus' instead of 'status'.
493
- # gather all enabled services
496
+ # `service -e` lists all enabled services. Output format:
497
+ # % service -e
498
+ # /etc/rc.d/hostid
499
+ # /etc/rc.d/hostid_save
500
+ # /etc/rc.d/cleanvar
501
+ # /etc/rc.d/ip6addrctl
502
+ # /etc/rc.d/devd
503
+
494
504
  cmd = inspec.command("#{service_ctl} -e")
495
505
  return nil if cmd.exit_status != 0
496
506
 
497
507
  # search for the service
498
- srv = /(^.*#{service_name}$)/.match(cmd.stdout)
508
+
509
+ srv = %r{^.*/(#{service_name}$)}.match(cmd.stdout)
499
510
  return nil if srv.nil? || srv[0].nil?
500
511
 
501
512
  enabled = true
@@ -516,6 +527,37 @@ module Inspec::Resources
516
527
  end
517
528
  end
518
529
 
530
+ # @see: https://www.freebsd.org/doc/en/articles/linux-users/startup.html
531
+ # @see: https://www.freebsd.org/cgi/man.cgi?query=rc.conf&sektion=5
532
+ # @see: https://www.freebsd.org/cgi/man.cgi?query=rc&apropos=0&sektion=8&manpath=FreeBSD+10.0-RELEASE&arch=default&format=html
533
+ class FreeBSD10Init < ServiceManager
534
+ def initialize(service_name, service_ctl = nil)
535
+ @service_ctl = service_ctl || "service"
536
+ super
537
+ end
538
+
539
+ def info(service_name)
540
+ # check if service is enabled
541
+ cmd = inspec.command("#{service_ctl} #{service_name} enabled")
542
+
543
+ enabled = cmd.exit_status == 0
544
+
545
+ # check if the service is running
546
+ # if the service is not available or not running, we always get an error code
547
+ cmd = inspec.command("#{service_ctl} #{service_name} onestatus")
548
+ running = cmd.exit_status == 0
549
+
550
+ {
551
+ name: service_name,
552
+ description: nil,
553
+ installed: true,
554
+ running: running,
555
+ enabled: enabled,
556
+ type: "bsd-init",
557
+ }
558
+ end
559
+ end
560
+
519
561
  class Runit < ServiceManager
520
562
  def initialize(service_name, service_ctl = nil)
521
563
  @service_ctl = service_ctl || "sv"
@@ -782,7 +824,14 @@ module Inspec::Resources
782
824
  EXAMPLE
783
825
 
784
826
  def select_service_mgmt
785
- BSDInit.new(inspec, service_ctl)
827
+ os = inspec.os
828
+ version = os[:release].to_f
829
+
830
+ if version >= 10
831
+ FreeBSD10Init.new(inspec, service_ctl)
832
+ else
833
+ BSDInit.new(inspec, service_ctl)
834
+ end
786
835
  end
787
836
  end
788
837
 
@@ -38,6 +38,7 @@ module Inspec::Resources
38
38
  "tls1.0",
39
39
  "tls1.1",
40
40
  "tls1.2",
41
+ "tls1.3",
41
42
  ].freeze
42
43
 
43
44
  attr_reader :host, :port, :timeout, :retries
@@ -72,6 +73,11 @@ module Inspec::Resources
72
73
  protocol: proto, ciphers: e.map(&:cipher),
73
74
  timeout: x.resource.timeout, retries: x.resource.retries, servername: x.resource.host)]
74
75
  end
76
+
77
+ if !res[0].empty? && res[0][1].key?("error") && res[0][1]["error"].include?("Connection error Errno::ECONNREFUSED")
78
+ raise "#{res[0][1]["error"]}"
79
+ end
80
+
75
81
  Hash[res]
76
82
  end
77
83
  .install_filter_methods_on_resource(self, :scan_config)
@@ -89,6 +95,7 @@ module Inspec::Resources
89
95
  { "protocol" => "tls1.0", "ciphers" => SSLShake::TLS::TLS10_CIPHERS.keys },
90
96
  { "protocol" => "tls1.1", "ciphers" => SSLShake::TLS::TLS10_CIPHERS.keys },
91
97
  { "protocol" => "tls1.2", "ciphers" => SSLShake::TLS::TLS_CIPHERS.keys },
98
+ { "protocol" => "tls1.3", "ciphers" => SSLShake::TLS::TLS13_CIPHERS.keys },
92
99
  ].map do |line|
93
100
  line["ciphers"].map do |cipher|
94
101
  { "protocol" => line["protocol"], "cipher" => cipher }
@@ -0,0 +1,65 @@
1
+ require "inspec/resources/command"
2
+
3
+ module Inspec::Resources
4
+ class TimeZone < Cmd
5
+ name "timezone"
6
+ supports platform: "unix"
7
+ supports platform: "windows"
8
+
9
+ desc "Check for timezone configurations"
10
+ example <<~EXAMPLE
11
+ describe timezone do
12
+ its('identifier') { should eq 'Asia/Kolkata' }
13
+ its('name') { should eq 'IST' }
14
+ its('time_offset') { should eq '+0530' }
15
+ end
16
+ EXAMPLE
17
+
18
+ def initialize
19
+ @output = {}
20
+ os = inspec.os
21
+ cmd = if os.windows?
22
+ inspec.command("Get-TimeZone")
23
+ else
24
+ inspec.command("timedatectl status | grep -i 'Time zone'")
25
+ end
26
+ if cmd.exit_status != 0
27
+ raise Inspec::Exceptions::ResourceFailed, "Time Zone resource with error: #{cmd.stderr}"
28
+ else
29
+ if os.windows?
30
+ splitted_output = cmd.stdout.strip.gsub(/\r/, "").split("\n").select { |out| (out.include? "Id") || (out.include? "DisplayName") || (out.include? "BaseUtcOffset") }
31
+ @output["identifier"] = split_and_fetch_last(splitted_output[1])
32
+ @output["name"] = split_and_fetch_last(splitted_output[0])
33
+ @output["time_offset"] = split_and_fetch_last(splitted_output[2])
34
+ else
35
+ splitted_output = cmd.stdout.split(":")[-1]&.strip&.gsub(/[(),^]*/, "")&.split(" ") || []
36
+ @output["identifier"] = splitted_output[0]
37
+ @output["name"] = splitted_output[1]
38
+ @output["time_offset"] = splitted_output[2]
39
+ end
40
+ end
41
+ end
42
+
43
+ def identifier
44
+ @output["identifier"]
45
+ end
46
+
47
+ def name
48
+ @output["name"]
49
+ end
50
+
51
+ def time_offset
52
+ @output["time_offset"]
53
+ end
54
+
55
+ def to_s
56
+ "Time Zone resource"
57
+ end
58
+
59
+ private
60
+
61
+ def split_and_fetch_last(string_value)
62
+ string_value.split(" :")[-1].strip
63
+ end
64
+ end
65
+ end
@@ -41,6 +41,7 @@ require "inspec/resources/cassandradb_session"
41
41
  require "inspec/resources/cassandradb_conf"
42
42
  require "inspec/resources/cassandra"
43
43
  require "inspec/resources/crontab"
44
+ require "inspec/resources/timezone"
44
45
  require "inspec/resources/dh_params"
45
46
  require "inspec/resources/directory"
46
47
  require "inspec/resources/docker"
@@ -72,6 +73,7 @@ require "inspec/resources/ip6tables"
72
73
  require "inspec/resources/iptables"
73
74
  require "inspec/resources/kernel_module"
74
75
  require "inspec/resources/kernel_parameter"
76
+ require "inspec/resources/kernel_parameters"
75
77
  require "inspec/resources/key_rsa"
76
78
  require "inspec/resources/ksh"
77
79
  require "inspec/resources/limits_conf"
@@ -123,6 +123,8 @@ module Inspec
123
123
  def set_optional_formatters
124
124
  return if @conf["reporter"].nil?
125
125
 
126
+ # This is a slightly modified version of the default RSpec JSON formatter
127
+ # No one in their right mind should be using this because we have a much better JSON reporter - named "json"
126
128
  if @conf["reporter"].key?("json-rspec")
127
129
  # We cannot pass in a nil output path. Rspec only accepts a valid string or a IO object.
128
130
  if @conf["reporter"]["json-rspec"]&.[]("file").nil?
@@ -133,6 +135,7 @@ module Inspec
133
135
  @conf["reporter"].delete("json-rspec")
134
136
  end
135
137
 
138
+ # These are built-in to rspec
136
139
  formats = @conf["reporter"].select { |k, _v| %w{documentation progress html}.include?(k) }
137
140
  formats.each do |k, v|
138
141
  # We cannot pass in a nil output path. Rspec only accepts a valid string or a IO object.
@@ -143,6 +146,33 @@ module Inspec
143
146
  end
144
147
  @conf["reporter"].delete(k)
145
148
  end
149
+
150
+ # Here we need to look for reporter names in the reporter option that
151
+ # are names of streaming reporter plugins. We load them, then tell RSpec to add them as formatters.
152
+ # They will have already been detected at this point (see v2_loader.load_all in cli.rb)
153
+ # but they will not be activated activated at this point.
154
+ # then list all plugins by type by name
155
+ reg = Inspec::Plugin::V2::Registry.instance
156
+ streaming_reporters = reg\
157
+ .find_activators(plugin_type: :streaming_reporter)\
158
+ .map(&:activator_name).map(&:to_s)
159
+
160
+ @conf["reporter"].each do |streaming_reporter_name, file_target|
161
+ # It could be a non-streaming reporter
162
+ next unless streaming_reporters.include? streaming_reporter_name
163
+
164
+ # Activate the plugin so the formatter ID gets registered with RSpec, presumably
165
+ activator = reg.find_activator(plugin_type: :streaming_reporter, activator_name: streaming_reporter_name.to_sym)
166
+ activator.activate!
167
+
168
+ # We cannot pass in a nil output path. Rspec only accepts a valid string or a IO object.
169
+ if file_target&.[]("file").nil?
170
+ RSpec.configuration.add_formatter(activator.implementation_class)
171
+ else
172
+ RSpec.configuration.add_formatter(activator.implementation_class, file_target["file"])
173
+ end
174
+ @conf["reporter"].delete(streaming_reporter_name)
175
+ end
146
176
  end
147
177
 
148
178
  # Configure the output formatter and stream to be used with RSpec.
@@ -114,6 +114,7 @@ module FilterTable
114
114
  raise(ArgumentError, "'#{decorate_symbols(raw_field_name)}' is not a recognized criterion - expected one of #{decorate_symbols(list_fields).join(", ")}'") unless field?(raw_field_name)
115
115
 
116
116
  populate_lazy_field(raw_field_name, desired_value) if is_field_lazy?(raw_field_name)
117
+ populate_lazy_instance_field(raw_field_name, desired_value) if is_field_lazy_instance?(raw_field_name)
117
118
  new_criteria_string += " #{raw_field_name} == #{desired_value.inspect}"
118
119
  filtered_raw_data = filter_raw_data(filtered_raw_data, raw_field_name, desired_value)
119
120
  end
@@ -188,6 +189,8 @@ module FilterTable
188
189
  is_field ||= list_fields.include?(proposed_field.to_sym)
189
190
  is_field ||= is_field_lazy?(proposed_field.to_s)
190
191
  is_field ||= is_field_lazy?(proposed_field.to_sym)
192
+ is_field ||= is_field_lazy_instance?(proposed_field.to_s)
193
+ is_field ||= is_field_lazy_instance?(proposed_field.to_sym)
191
194
 
192
195
  is_field
193
196
  end
@@ -210,6 +213,23 @@ module FilterTable
210
213
  mark_lazy_field_populated(field_name)
211
214
  end
212
215
 
216
+ def populate_lazy_instance_field(field_name, criterion)
217
+ return unless is_field_lazy_instance?(field_name)
218
+ return if field_populated?(field_name)
219
+
220
+ raw_data.each do |row|
221
+ next if row.key?(field_name) # skip row if pre-existing data is present
222
+
223
+ lazy_caller = callback_for_lazy_instance_field(field_name)
224
+ if lazy_caller.is_a?(Proc)
225
+ lazy_caller.call(row, criterion, resource_instance)
226
+ elsif lazy_caller.is_a?(Symbol)
227
+ resource_instance.send(lazy_caller, row, criterion, self)
228
+ end
229
+ end
230
+ mark_lazy_field_populated(field_name)
231
+ end
232
+
213
233
  def is_field_lazy?(sought_field_name)
214
234
  custom_properties_schema.values.any? do |property_struct|
215
235
  sought_field_name == property_struct.field_name && \
@@ -217,6 +237,13 @@ module FilterTable
217
237
  end
218
238
  end
219
239
 
240
+ def is_field_lazy_instance?(sought_field_name)
241
+ custom_properties_schema.values.any? do |property_struct|
242
+ sought_field_name == property_struct.field_name && \
243
+ property_struct.opts[:lazy_instance]
244
+ end
245
+ end
246
+
220
247
  def callback_for_lazy_field(field_name)
221
248
  return unless is_field_lazy?(field_name)
222
249
 
@@ -225,6 +252,14 @@ module FilterTable
225
252
  end.opts[:lazy]
226
253
  end
227
254
 
255
+ def callback_for_lazy_instance_field(field_name)
256
+ return unless is_field_lazy_instance?(field_name)
257
+
258
+ custom_properties_schema.values.find do |property_struct|
259
+ property_struct.field_name == field_name
260
+ end.opts[:lazy_instance]
261
+ end
262
+
228
263
  def field_populated?(field_name)
229
264
  @populated_lazy_columns[field_name]
230
265
  end
@@ -349,12 +384,18 @@ module FilterTable
349
384
  # args of the row struct; also the Struct class will already have provided
350
385
  # a setter for each field.
351
386
  @custom_properties.values.each do |property_info|
352
- next unless property_info.opts[:lazy]
387
+ next unless property_info.opts[:lazy] || property_info.opts[:lazy_instance]
353
388
 
354
389
  field_name = property_info.field_name.to_sym
355
390
  row_eval_context_type.send(:define_method, field_name) do
356
391
  unless filter_table.field_populated?(field_name)
357
- filter_table.populate_lazy_field(field_name, NoCriteriaProvided) # No access to criteria here
392
+ if property_info.opts[:lazy]
393
+ filter_table.populate_lazy_field(field_name, NoCriteriaProvided)
394
+ end # No access to criteria here
395
+ if property_info.opts[:lazy_instance]
396
+ filter_table.populate_lazy_instance_field(field_name,
397
+ NoCriteriaProvided)
398
+ end
358
399
  # OK, the underlying raw data has the value in the first row
359
400
  # (because we would trigger population only on the first row)
360
401
  # We could just return the value, but we need to set it on this Struct in case it is referenced multiple times
@@ -449,7 +490,10 @@ module FilterTable
449
490
  result = where(nil)
450
491
  if custom_property_struct.opts[:lazy]
451
492
  result.populate_lazy_field(custom_property_struct.field_name, filter_criteria_value)
493
+ elsif custom_property_struct.opts[:lazy_instance]
494
+ result.populate_lazy_instance_field(custom_property_struct.field_name, filter_criteria_value)
452
495
  end
496
+
453
497
  result = where(nil).get_column_values(custom_property_struct.field_name) # TODO: the where(nil). is likely unneeded
454
498
  result = result.flatten.uniq.compact if custom_property_struct.opts[:style] == :simple
455
499
  result
@@ -65,7 +65,7 @@ module Inspec
65
65
  c[:results]&.each do |r|
66
66
  next unless r[:message] # :message only set on failure
67
67
 
68
- pos = r[:message].index("\n\nDiff:")
68
+ pos = r[:message].index(/\n{1,2}Diff.*:/)
69
69
  next unless pos # Only textual tests get Diffs
70
70
 
71
71
  r[:message] = r[:message].slice(0, pos)
@@ -1,3 +1,3 @@
1
1
  module Inspec
2
- VERSION = "4.49.0".freeze
2
+ VERSION = "4.56.17".freeze
3
3
  end
@@ -84,7 +84,7 @@ module InspecPlugins
84
84
  return {} if data.nil? || data.empty?
85
85
 
86
86
  parsed = JSON.parse(data)
87
- return {} unless parsed.key?("version") && !parsed["version"].empty?
87
+ return {} unless parsed.key?("build_timestamp") && !parsed["build_timestamp"].empty?
88
88
 
89
89
  parsed
90
90
  end
@@ -219,9 +219,10 @@ module InspecPlugins
219
219
  def version
220
220
  config = InspecPlugins::Compliance::Configuration.new
221
221
  info = InspecPlugins::Compliance::API.version(config)
222
- if !info.nil? && info["version"]
223
- puts "Name: #{info["api"]}"
224
- puts "Version: #{info["version"]}"
222
+ if !info.nil? && info["build_timestamp"]
223
+ # key info["api"] is not longer available in latest version api response
224
+ puts "Name: automate"
225
+ puts "Version: #{info["build_timestamp"]}"
225
226
  else
226
227
  puts "Could not determine server version."
227
228
  exit 1
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.49.0
4
+ version: 4.56.17
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: 2021-10-25 00:00:00.000000000 Z
11
+ date: 2022-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-telemetry
@@ -117,7 +117,7 @@ dependencies:
117
117
  - - ">="
118
118
  - !ruby/object:Gem::Version
119
119
  version: '3.9'
120
- - - "<"
120
+ - - "<="
121
121
  - !ruby/object:Gem::Version
122
122
  version: '3.11'
123
123
  type: :runtime
@@ -127,7 +127,7 @@ dependencies:
127
127
  - - ">="
128
128
  - !ruby/object:Gem::Version
129
129
  version: '3.9'
130
- - - "<"
130
+ - - "<="
131
131
  - !ruby/object:Gem::Version
132
132
  version: '3.11'
133
133
  - !ruby/object:Gem::Dependency
@@ -479,6 +479,7 @@ files:
479
479
  - lib/inspec/plugin/v2/plugin_types/input.rb
480
480
  - lib/inspec/plugin/v2/plugin_types/mock.rb
481
481
  - lib/inspec/plugin/v2/plugin_types/reporter.rb
482
+ - lib/inspec/plugin/v2/plugin_types/streaming_reporter.rb
482
483
  - lib/inspec/plugin/v2/registry.rb
483
484
  - lib/inspec/plugin/v2/status.rb
484
485
  - lib/inspec/profile.rb
@@ -554,6 +555,7 @@ files:
554
555
  - lib/inspec/resources/json.rb
555
556
  - lib/inspec/resources/kernel_module.rb
556
557
  - lib/inspec/resources/kernel_parameter.rb
558
+ - lib/inspec/resources/kernel_parameters.rb
557
559
  - lib/inspec/resources/key_rsa.rb
558
560
  - lib/inspec/resources/ksh.rb
559
561
  - lib/inspec/resources/launchd_service.rb
@@ -619,6 +621,7 @@ files:
619
621
  - lib/inspec/resources/sys_info.rb
620
622
  - lib/inspec/resources/systemd_service.rb
621
623
  - lib/inspec/resources/sysv_service.rb
624
+ - lib/inspec/resources/timezone.rb
622
625
  - lib/inspec/resources/toml.rb
623
626
  - lib/inspec/resources/upstart_service.rb
624
627
  - lib/inspec/resources/user.rb
@@ -788,7 +791,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
788
791
  requirements:
789
792
  - - ">="
790
793
  - !ruby/object:Gem::Version
791
- version: '2.5'
794
+ version: '2.6'
792
795
  required_rubygems_version: !ruby/object:Gem::Requirement
793
796
  requirements:
794
797
  - - ">="