inspec-core 4.28.0 → 4.33.1

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: f7e64d5cc4ef40dc18b0c488e88c804425403123a38ed5bdfbeac8e4e26c4f02
4
- data.tar.gz: 1b953e8cf39b218bed69e379bb5f03d92ae7bde3f402de1a17bfee2a7c67f58d
3
+ metadata.gz: ec42612f75dc95f62517b85b024c039ad15965f7c98dfaecb9494161b9f85611
4
+ data.tar.gz: 6373b89393e737cacdcb859ca510758afb9ce7e16d89e90d86877205a3d8d335
5
5
  SHA512:
6
- metadata.gz: 9f6b97c6cc9e7d23f64a5f5b9666831e6a1577ad164ce3b32a3bff3ce24b628be65f0b60894681aa9d408ce989355d5da946bc87f67ec51ca4679e04be2f0b77
7
- data.tar.gz: 246ddd83d0af2e3ce069deb932451c0eb905e2e73dc5255b8ce574e862115b03e30cfc92a9cda0611a996d1d00ddb3895a7284cb44aa66677e4fea932bff9d09
6
+ metadata.gz: f1591b7c166d00fe78037f703eb55292384b2c2b13195db150da008b198424177809078db9509054af664f91aca8bae06f93f41939d808263cc78baf0414f29c
7
+ data.tar.gz: 5124bfc3a8b676bd097efc319233fec94d3fd3739b727e1b92678c7929d280c093c46136b80607f166d164e0bd85586b9ce560e2ebed0eadbd7f35d09bd517b9
@@ -120,6 +120,8 @@ module Inspec
120
120
  desc: "Provide a ID which will be included on reports"
121
121
  option :winrm_shell_type, type: :string, default: "powershell",
122
122
  desc: "Specify a shell type for winrm (eg. 'elevated' or 'powershell')"
123
+ option :docker_url, type: :string,
124
+ desc: "Provides path to Docker API endpoint (Docker)"
123
125
  end
124
126
 
125
127
  def self.profile_options
@@ -166,6 +168,11 @@ module Inspec
166
168
  desc: "After normal execution order, results are sorted by control ID, or by file (default), or randomly. None uses legacy unsorted mode."
167
169
  option :filter_empty_profiles, type: :boolean, default: false,
168
170
  desc: "Filter empty profiles (profiles without controls) from the report."
171
+ option :command_timeout, type: :numeric,
172
+ desc: "Maximum seconds to allow commands to run during execution.",
173
+ long_desc: "Maximum seconds to allow commands to run during execution. A timed out command is considered an error."
174
+ option :reporter_include_source, type: :boolean, default: false,
175
+ desc: "Include full source code of controls in the CLI report"
169
176
  end
170
177
 
171
178
  def self.help(*args)
data/lib/inspec/cli.rb CHANGED
@@ -321,7 +321,14 @@ class Inspec::InspecCLI < Inspec::BaseCLI
321
321
  desc: "A space-delimited list of local folders containing profiles whose libraries and resources will be loaded into the new shell"
322
322
  option :distinct_exit, type: :boolean, default: true,
323
323
  desc: "Exit with code 100 if any tests fail, and 101 if any are skipped but none failed (default). If disabled, exit 0 on skips and 1 for failures."
324
+ option :command_timeout, type: :numeric,
325
+ desc: "Maximum seconds to allow a command to run.",
326
+ long_desc: "Maximum seconds to allow commands to run. A timed out command is considered an error."
324
327
  option :inspect, type: :boolean, default: false, desc: "Use verbose/debugging output for resources."
328
+ option :input_file, type: :array,
329
+ desc: "Load one or more input files, a YAML file with values for the shell to use"
330
+ option :input, type: :array, banner: "name1=value1 name2=value2",
331
+ desc: "Specify one or more inputs directly on the command line to the shell, as --input NAME=VALUE. Accepts single-quoted YAML and JSON structures."
325
332
  def shell_func
326
333
  o = config
327
334
  diagnose(o)
@@ -53,8 +53,9 @@ module Inspec
53
53
 
54
54
  def control(id, opts = {}, &block)
55
55
  opts[:skip_only_if_eval] = @skip_only_if_eval
56
-
57
- register_control(Inspec::Rule.new(id, profile_id, resources_dsl, opts, &block))
56
+ if control_exist_in_controls_list?(id) || controls_list_empty?
57
+ register_control(Inspec::Rule.new(id, profile_id, resources_dsl, opts, &block))
58
+ end
58
59
  end
59
60
  alias rule control
60
61
 
@@ -68,10 +69,14 @@ module Inspec
68
69
  id = "(generated from #{loc} #{SecureRandom.hex})"
69
70
 
70
71
  res = nil
72
+
71
73
  rule = Inspec::Rule.new(id, profile_id, resources_dsl, {}) do
72
74
  res = describe(*args, &block)
73
75
  end
74
- register_control(rule, &block)
76
+
77
+ if control_exist_in_controls_list?(id) || controls_list_empty?
78
+ register_control(rule, &block)
79
+ end
75
80
 
76
81
  res
77
82
  end
@@ -176,5 +181,26 @@ module Inspec
176
181
  "#{File.basename(path)}:#{line}"
177
182
  end
178
183
  end
184
+
185
+ # Returns true if configuration hash is not empty and it contains the list of controls is not empty
186
+ def profile_config_exist?
187
+ !@conf.empty? && @conf.key?("profile") && !@conf["profile"].include_controls_list.empty?
188
+ end
189
+
190
+ # Returns true if configuration hash is empty or configuration hash does not have the list of controls that needs to be included
191
+ def controls_list_empty?
192
+ !@conf.empty? && @conf.key?("profile") && @conf["profile"].include_controls_list.empty? || @conf.empty?
193
+ end
194
+
195
+ # Check if the given control exist in the --controls option
196
+ def control_exist_in_controls_list?(id)
197
+ if profile_config_exist?
198
+ id_exist_in_list = @conf["profile"].include_controls_list.any? do |inclusion|
199
+ # Try to see if the inclusion is a regex, and if it matches
200
+ inclusion == id || (inclusion.is_a?(Regexp) && inclusion =~ id)
201
+ end
202
+ end
203
+ id_exist_in_list
204
+ end
179
205
  end
180
206
  end
@@ -62,7 +62,6 @@ module Inspec::Fetcher
62
62
  def fetch(destination_path)
63
63
  @repo_directory = destination_path # Might be the cache, or vendoring, or something else
64
64
  FileUtils.mkdir_p(destination_path) unless Dir.exist?(destination_path)
65
-
66
65
  if cloned?
67
66
  checkout
68
67
  else
@@ -126,10 +125,25 @@ module Inspec::Fetcher
126
125
  elsif @tag
127
126
  resolve_ref(@tag)
128
127
  else
129
- resolve_ref("master")
128
+ resolve_ref(default_ref)
130
129
  end
131
130
  end
132
131
 
132
+ def default_ref
133
+ command_string = "git remote show #{@remote_url}"
134
+ cmd = shellout(command_string)
135
+ unless cmd.exitstatus == 0
136
+ raise(Inspec::FetcherFailure, "Profile git dependency failed with default reference - #{@remote_url} - error running '#{command_string}': #{cmd.stderr}")
137
+ else
138
+ ref = cmd.stdout.lines.detect { |l| l.include? "HEAD branch:" }&.split(":")&.last&.strip
139
+ unless ref
140
+ raise(Inspec::FetcherFailure, "Profile git dependency failed with default reference - #{@remote_url} - error running '#{command_string}': NULL reference")
141
+ end
142
+
143
+ ref
144
+ end
145
+ end
146
+
133
147
  def resolve_ref(ref_name)
134
148
  command_string = "git ls-remote \"#{@remote_url}\" \"#{ref_name}*\""
135
149
  cmd = shellout(command_string)
@@ -82,6 +82,7 @@ module Inspec
82
82
  def find_or_register_input(input_name, profile_name, options = {})
83
83
  input_name = input_name.to_s
84
84
  profile_name = profile_name.to_s
85
+ options[:event].value = Thor::CoreExt::HashWithIndifferentAccess.new(options[:event].value) if options[:event]&.value.is_a?(Hash)
85
86
 
86
87
  if profile_alias?(profile_name) && !profile_aliases[profile_name].nil?
87
88
  alias_name = profile_name
@@ -225,14 +225,17 @@ module Inspec
225
225
  end
226
226
  @tests_collected = true
227
227
  end
228
- filter_controls(@runner_context.all_rules, include_list)
228
+ @runner_context.all_rules
229
229
  end
230
230
 
231
- def filter_controls(controls_array, include_list)
232
- return controls_array if include_list.nil? || include_list.empty?
231
+ # This creates the list of controls provided in the --controls options which need to be include
232
+ # for evaluation.
233
+ def include_controls_list
234
+ return [] if @controls.nil? || @controls.empty?
233
235
 
236
+ included_controls = @controls
234
237
  # Check for anything that might be a regex in the list, and make it official
235
- include_list.each_with_index do |inclusion, index|
238
+ included_controls.each_with_index do |inclusion, index|
236
239
  next if inclusion.is_a?(Regexp)
237
240
  # Insist the user wrap the regex in slashes to demarcate it as a regex
238
241
  next unless inclusion.start_with?("/") && inclusion.end_with?("/")
@@ -240,21 +243,14 @@ module Inspec
240
243
  inclusion = inclusion[1..-2] # Trim slashes
241
244
  begin
242
245
  re = Regexp.new(inclusion)
243
- include_list[index] = re
246
+ included_controls[index] = re
244
247
  rescue RegexpError => e
245
248
  warn "Ignoring unparseable regex '/#{inclusion}/' in --control CLI option: #{e.message}"
246
- include_list[index] = nil
247
- end
248
- end
249
- include_list.compact!
250
-
251
- controls_array.select do |c|
252
- id = ::Inspec::Rule.rule_id(c)
253
- include_list.any? do |inclusion|
254
- # Try to see if the inclusion is a regex, and if it matches
255
- inclusion == id || (inclusion.is_a?(Regexp) && inclusion =~ id)
249
+ included_controls[index] = nil
256
250
  end
257
251
  end
252
+ included_controls.compact!
253
+ included_controls
258
254
  end
259
255
 
260
256
  def load_libraries
@@ -41,12 +41,14 @@ module Inspec::Reporters
41
41
  MULTI_TEST_CONTROL_SUMMARY_MAX_LEN = 60
42
42
 
43
43
  def render
44
+ @src_extent_map = {}
44
45
  run_data[:profiles].each do |profile|
45
46
  if profile[:status] == "skipped"
46
47
  platform = run_data[:platform]
47
48
  output("Skipping profile: '#{profile[:name]}' on unsupported platform: '#{platform[:name]}/#{platform[:release]}'.")
48
49
  next
49
50
  end
51
+ read_control_source(profile)
50
52
  @control_count = 0
51
53
  output("")
52
54
  print_profile_header(profile)
@@ -89,6 +91,7 @@ module Inspec::Reporters
89
91
  next if control.results.nil?
90
92
 
91
93
  output(format_control_header(control))
94
+ output(format_control_source(control)) if Inspec::Config.cached[:reporter_include_source]
92
95
  control.results.each do |result|
93
96
  output(format_result(control, result, :standard))
94
97
  @control_count += 1
@@ -127,6 +130,62 @@ module Inspec::Reporters
127
130
  )
128
131
  end
129
132
 
133
+ def format_control_source(control)
134
+ src = @control_source[control.id]
135
+ message = "Control Source from #{src[:path]}:#{src[:start]}..#{src[:end]}\n"
136
+ message += src[:content]
137
+ format_message(
138
+ color: "skipped",
139
+ indentation: 5,
140
+ message: message
141
+ )
142
+ end
143
+
144
+ def read_control_source(profile)
145
+ return unless Inspec::Config.cached[:reporter_include_source]
146
+
147
+ @control_source = {}
148
+ src_extent_map = {}
149
+
150
+ # First pass: build map of paths => ids => [start]
151
+ all_unique_controls.each do |control|
152
+ id = control[:id]
153
+ path = control[:source_location][:ref]
154
+ start = control[:source_location][:line]
155
+ next if path.nil? || start.nil?
156
+
157
+ src_extent_map[path] ||= []
158
+ src_extent_map[path] << { start: start, id: id }
159
+ end
160
+
161
+ # Now sort the controls by their starting line in their control file
162
+ src_extent_map.values.each do |extent_list|
163
+ extent_list.sort! { |a, b| a[:start] <=> b[:start] }
164
+ end
165
+
166
+ # Third pass: Read in files and split into lines
167
+ src_extent_map.keys.each do |path|
168
+ control_file_lines = File.read(path).lines # TODO error handling
169
+ last_line_in_file = control_file_lines.count
170
+ extent_list = src_extent_map[path]
171
+ extent_list.each_with_index do |extent, idx|
172
+ if idx == extent_list.count - 1 # Last entry
173
+ extent[:end] = last_line_in_file
174
+ else
175
+ extent[:end] = extent_list[idx + 1][:start] - 1
176
+ end
177
+
178
+ @control_source[extent[:id]] =
179
+ {
180
+ path: path,
181
+ start: extent[:start],
182
+ end: extent[:end],
183
+ content: control_file_lines.slice(extent[:start] - 1, extent[:end] - extent[:start] + 1).join(""),
184
+ }
185
+ end
186
+ end
187
+ end
188
+
130
189
  def format_result(control, result, type)
131
190
  impact = control.impact_string_for_result(result)
132
191
 
@@ -170,7 +229,7 @@ module Inspec::Reporters
170
229
  end
171
230
 
172
231
  def all_unique_controls
173
- @unique_controls ||= begin
232
+ @unique_controls ||= begin # rubocop:disable Style/RedundantBegin
174
233
  run_data[:profiles].flat_map do |profile|
175
234
  profile[:controls]
176
235
  end.uniq
@@ -312,6 +371,10 @@ module Inspec::Reporters
312
371
  data[:impact]
313
372
  end
314
373
 
374
+ def source_location
375
+ data[:source_location]
376
+ end
377
+
315
378
  def anonymous?
316
379
  id.start_with?("(generated from ")
317
380
  end
@@ -8,7 +8,7 @@ module Inspec::Reporters
8
8
  end
9
9
 
10
10
  def report
11
- {
11
+ output = {
12
12
  platform: platform,
13
13
  profiles: profiles,
14
14
  statistics: {
@@ -16,6 +16,11 @@ module Inspec::Reporters
16
16
  },
17
17
  version: run_data[:version],
18
18
  }
19
+
20
+ %w{passthrough}.each do |option|
21
+ output[option.to_sym] = @config[option] unless @config[option].nil?
22
+ end
23
+ output
19
24
  end
20
25
 
21
26
  private
@@ -24,7 +24,7 @@ module Inspec::Reporters
24
24
  version: run_data[:version],
25
25
  }
26
26
 
27
- # optional json-config passthrough options
27
+ # optional jsonconfig passthrough options
28
28
  %w{node_name environment roles job_uuid passthrough}.each do |option|
29
29
  output[option.to_sym] = @config[option] unless @config[option].nil?
30
30
  end
@@ -78,7 +78,7 @@ module Inspec::Resources
78
78
  return @repo_cache if defined?(@repo_cache)
79
79
 
80
80
  # load all lists
81
- cmd = inspec.command("find /etc/apt/ -name \*.list -exec sh -c 'cat {} || echo -n' \\;")
81
+ cmd = inspec.command("find /etc/apt/ -name \"*.list\" -exec sh -c 'cat {} || echo -n' \\;")
82
82
 
83
83
  # @see https://help.ubuntu.com/community/Repositories/CommandLine#Explanation_of_the_Repository_Format
84
84
  @repo_cache = cmd.stdout.lines.map do |raw_line|
@@ -31,6 +31,11 @@ module Inspec::Resources
31
31
  end
32
32
 
33
33
  @command = cmd
34
+ cli_timeout = Inspec::Config.cached["command_timeout"]&.to_i
35
+ # Can access this via Inspec::InspecCLI.commands["exec"].options[:command_timeout].default,
36
+ # but that may not be loaded for kitchen-inspec and other pure gem consumers
37
+ cli_timeout = nil if cli_timeout == 0 # Under test-kitchen we get a 0 timeout, which can't be a resonable value
38
+ @timeout = cli_timeout || options[:timeout]&.to_i
34
39
 
35
40
  if options[:redact_regex]
36
41
  unless options[:redact_regex].is_a?(Regexp)
@@ -44,7 +49,15 @@ module Inspec::Resources
44
49
  end
45
50
 
46
51
  def result
47
- @result ||= inspec.backend.run_command(@command)
52
+ @result ||= begin
53
+ inspec.backend.run_command(@command, timeout: @timeout)
54
+ rescue Train::CommandTimeoutReached
55
+ # Without a small sleep, the train connection gets broken
56
+ # We've already timed out, so a small sleep is not likely to be painful here.
57
+ sleep 0.1
58
+ raise Inspec::Exceptions::ResourceFailed,
59
+ "Command `#{@command}` timed out after #{@timeout} seconds"
60
+ end
48
61
  end
49
62
 
50
63
  def stdout
@@ -36,14 +36,20 @@ module FilterTable
36
36
  # RSpec will check the object returned to see if it responds to a method
37
37
  # before calling it. We need to fake it out and tell it that it does. This
38
38
  # allows it to skip past that check and fall through to #method_missing
39
- def respond_to?(_method)
39
+ def respond_to?(_method, include_all = false)
40
40
  true
41
41
  end
42
42
 
43
43
  def to_s
44
- @original_resource.to_s
44
+ "#{@original_resource} (#{@original_exception.message})"
45
45
  end
46
46
  alias inspect to_s
47
+
48
+ # Rspec is not able to convert FilterTable::ExceptionCatcher issue https://github.com/inspec/inspec/issues/5369
49
+ # which result into not showing actual exception message this allows to convert it properly.
50
+ def to_ary
51
+ [ to_s ]
52
+ end
47
53
  end
48
54
 
49
55
  class Trace
@@ -1,3 +1,3 @@
1
1
  module Inspec
2
- VERSION = "4.28.0".freeze
2
+ VERSION = "4.33.1".freeze
3
3
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  This example shows the implementation of an InSpec profile for AWS.
4
4
 
5
- ## Create a profile
5
+ ## Create a profile
6
6
 
7
7
  ```
8
8
  $ inspec init profile --platform aws my-profile
@@ -15,12 +15,12 @@ Creating new profile at /Users/spaterson/my-profile
15
15
  • Creating directory controls
16
16
  • Creating file controls/example.rb
17
17
  • Creating file inspec.yml
18
- • Creating file attributes.yml
18
+ • Creating file inputs.yml
19
19
  • Creating file libraries/.gitkeep
20
-
20
+
21
21
  ```
22
22
 
23
- ## Optionally update `attributes.yml` to point to your custom VPC
23
+ ## Optionally update `inputs.yml` to point to your custom VPC
24
24
 
25
25
  ```
26
26
  aws_vpc_id: 'custom-vpc-id'
@@ -32,11 +32,11 @@ The related control will simply be skipped if this is not provided. See the [In
32
32
 
33
33
  ### With a VPC Identifier
34
34
 
35
- With a supplied VPC identifier in `attributes.yml` both of the example controls will run. The 'aws-single-vpc-exists-check' control will only check for a VPC identifier in the currently configured AWS SDK region e.g. `eu-west-2` in the below:
35
+ With a supplied VPC identifier in `inputs.yml` both of the example controls will run. The 'aws-single-vpc-exists-check' control will only check for a VPC identifier in the currently configured AWS SDK region e.g. `eu-west-2` in the below:
36
36
 
37
37
  ```
38
38
  $ cd my-profile/
39
- $ inspec exec . -t aws:// --attrs attributes.yml
39
+ $ inspec exec . -t aws:// --input-file=inputs.yml
40
40
 
41
41
  Profile: AWS InSpec Profile (my-profile)
42
42
  Version: 0.1.0
@@ -111,13 +111,13 @@ Test Summary: 53 successful, 0 failures, 0 skipped
111
111
  ```
112
112
 
113
113
 
114
- ### Without Supplying a VPC Identifier
114
+ ### Without Supplying a VPC Identifier
115
115
 
116
- If no VPC identifier is supplied, the 'aws-single-vpc-exists-check' control is skipped and the other control runs. The `attributes.yml` file does not have to be specified to InSpec in this case.
116
+ If no VPC identifier is supplied, the 'aws-single-vpc-exists-check' control is skipped and the other control runs. The `inputs.yml` file does not have to be specified to InSpec in this case.
117
117
 
118
118
  ```
119
119
  $ cd my-profile/
120
- $ inspec exec . -t aws://
120
+ $ inspec exec . -t aws://
121
121
 
122
122
  Profile: AWS InSpec Profile (my-profile)
123
123
  Version: 0.1.0
@@ -189,4 +189,4 @@ Target: aws://eu-west-2
189
189
 
190
190
  Profile Summary: 2 successful controls, 0 control failures, 1 control skipped
191
191
  Test Summary: 52 successful, 0 failures, 1 skipped
192
- ```
192
+ ```
@@ -2,11 +2,11 @@
2
2
 
3
3
  title "Sample Section"
4
4
 
5
- aws_vpc_id = attribute("aws_vpc_id", default: "", description: "Optional AWS VPC identifier.")
5
+ aws_vpc_id = input("aws_vpc_id")
6
6
 
7
7
  # You add controls here
8
- control "aws-single-vpc-exists-check" do # A unique ID for this control.
9
- only_if { aws_vpc_id != "" } # Only run this control if the `aws_vpc_id` attribute is provided.
8
+ control "aws-single-vpc-exists-check" do # A unique ID for this control.
9
+ only_if { aws_vpc_id != "" } # Only run this control if the `aws_vpc_id` input is provided.
10
10
  impact 1.0 # The criticality, if this control fails.
11
11
  title "Check to see if custom VPC exists." # A human-readable title.
12
12
  describe aws_vpc(aws_vpc_id) do # The test itself.
@@ -7,14 +7,13 @@ license: Apache-2.0
7
7
  summary: An InSpec Compliance Profile For AWS
8
8
  version: 0.1.0
9
9
  inspec_version: '~> 4'
10
- attributes:
10
+ inputs:
11
11
  - name: aws_vpc_id
12
12
  required: false
13
13
  # Below is deliberately left as a default empty string to allow the profile to run when this is not provided.
14
14
  # Please see the README for more details.
15
- default: ''
15
+ value: ''
16
16
  description: 'Optional Custom AWS VPC Id'
17
- type: string
18
17
  depends:
19
18
  - name: inspec-aws
20
19
  url: https://github.com/inspec/inspec-aws/archive/master.tar.gz
@@ -2,7 +2,7 @@
2
2
 
3
3
  This example shows the implementation of an InSpec profile for GCP that depends on the [InSpec GCP Resource Pack](https://github.com/inspec/inspec-gcp). See the [README](https://github.com/inspec/inspec-gcp) for instructions on setting up appropriate GCP credentials.
4
4
 
5
- ## Create a profile
5
+ ## Create a profile
6
6
 
7
7
  ```
8
8
  $ inspec init profile --platform gcp my-profile
@@ -12,12 +12,12 @@ Create new profile at /Users/spaterson/my-profile
12
12
  * Create directory controls
13
13
  * Create file controls/example.rb
14
14
  * Create file inspec.yml
15
- * Create file attributes.yml
16
- * Create file libraries/.gitkeep
17
-
15
+ * Create file inputs.yml
16
+ * Create file libraries/.gitkeep
17
+
18
18
  ```
19
19
 
20
- ## Update `attributes.yml` to point to your project
20
+ ## Update `inputs.yml` to point to your project
21
21
 
22
22
  ```
23
23
  gcp_project_id: 'my-gcp-project'
@@ -27,7 +27,7 @@ gcp_project_id: 'my-gcp-project'
27
27
 
28
28
  ```
29
29
  $ cd gcp-profile/
30
- $ inspec exec . -t gcp:// --attrs attributes.yml
30
+ $ inspec exec . -t gcp:// --input-file=inputs.yml
31
31
 
32
32
  Profile: GCP InSpec Profile (my-profile)
33
33
  Version: 0.1.0
@@ -63,4 +63,4 @@ Target: gcp://local-service-account@my-gcp-project.iam.gserviceaccount.com
63
63
 
64
64
  Profile Summary: 2 successful controls, 0 control failures, 0 controls skipped
65
65
  Test Summary: 18 successful, 0 failures, 0 skipped
66
- ```
66
+ ```
@@ -2,7 +2,7 @@
2
2
 
3
3
  title "Sample Section"
4
4
 
5
- gcp_project_id = attribute("gcp_project_id")
5
+ gcp_project_id = input("gcp_project_id")
6
6
 
7
7
  # you add controls here
8
8
  control "gcp-single-region-1.0" do # A unique ID for this control
@@ -6,14 +6,13 @@ copyright_email: you@example.com
6
6
  license: Apache-2.0
7
7
  summary: An InSpec Compliance Profile For GCP
8
8
  version: 0.1.0
9
- inspec_version: '>= 2.3.5'
10
- attributes:
9
+ inspec_version: '>= 4'
10
+ inputs:
11
11
  - name: gcp_project_id
12
12
  required: true
13
13
  description: 'The GCP project identifier.'
14
- type: string
15
14
  depends:
16
15
  - name: inspec-gcp
17
16
  url: https://github.com/inspec/inspec-gcp/archive/master.tar.gz
18
17
  supports:
19
- - platform: gcp
18
+ - platform: gcp
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.28.0
4
+ version: 4.33.1
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-03-16 00:00:00.000000000 Z
11
+ date: 2021-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-telemetry
@@ -711,15 +711,15 @@ files:
711
711
  - lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template/reporter.rb
712
712
  - lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template/version.rb
713
713
  - lib/plugins/inspec-init/templates/profiles/aws/README.md
714
- - lib/plugins/inspec-init/templates/profiles/aws/attributes.yml
715
714
  - lib/plugins/inspec-init/templates/profiles/aws/controls/example.rb
715
+ - lib/plugins/inspec-init/templates/profiles/aws/inputs.yml
716
716
  - lib/plugins/inspec-init/templates/profiles/aws/inspec.yml
717
717
  - lib/plugins/inspec-init/templates/profiles/azure/README.md
718
718
  - lib/plugins/inspec-init/templates/profiles/azure/controls/example.rb
719
719
  - lib/plugins/inspec-init/templates/profiles/azure/inspec.yml
720
720
  - lib/plugins/inspec-init/templates/profiles/gcp/README.md
721
- - lib/plugins/inspec-init/templates/profiles/gcp/attributes.yml
722
721
  - lib/plugins/inspec-init/templates/profiles/gcp/controls/example.rb
722
+ - lib/plugins/inspec-init/templates/profiles/gcp/inputs.yml
723
723
  - lib/plugins/inspec-init/templates/profiles/gcp/inspec.yml
724
724
  - lib/plugins/inspec-init/templates/profiles/os/README.md
725
725
  - lib/plugins/inspec-init/templates/profiles/os/controls/example.rb