inspec-core 2.2.78 → 2.2.101
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -14
- data/docs/profiles.md +106 -8
- data/examples/inheritance/inspec.yml +2 -1
- data/examples/profile/controls/gordon.rb +1 -1
- data/examples/profile/controls/meta.rb +2 -0
- data/examples/profile/inspec.yml +2 -1
- data/inspec-core.gemspec +2 -1
- data/lib/bundles/inspec-compliance/cli.rb +13 -1
- data/lib/bundles/inspec-compliance/http.rb +9 -18
- data/lib/bundles/inspec-compliance/target.rb +3 -3
- data/lib/fetchers/local.rb +60 -17
- data/lib/inspec.rb +4 -0
- data/lib/inspec/attribute_registry.rb +83 -0
- data/lib/inspec/base_cli.rb +10 -1
- data/lib/inspec/cli.rb +12 -1
- data/lib/inspec/control_eval_context.rb +13 -4
- data/lib/inspec/dependencies/cache.rb +1 -1
- data/lib/inspec/dependencies/dependency_set.rb +1 -1
- data/lib/inspec/dependencies/requirement.rb +2 -1
- data/lib/inspec/errors.rb +27 -0
- data/lib/inspec/file_provider.rb +38 -1
- data/lib/inspec/globals.rb +5 -0
- data/lib/inspec/impact.rb +34 -0
- data/lib/inspec/objects/attribute.rb +92 -7
- data/lib/inspec/profile.rb +33 -4
- data/lib/inspec/profile_context.rb +7 -7
- data/lib/inspec/profile_vendor.rb +21 -1
- data/lib/inspec/reporters/automate.rb +7 -2
- data/lib/inspec/reporters/cli.rb +12 -4
- data/lib/inspec/reporters/json.rb +3 -1
- data/lib/inspec/rspec_extensions.rb +12 -0
- data/lib/inspec/rule.rb +6 -1
- data/lib/inspec/runner.rb +2 -2
- data/lib/inspec/schema.rb +16 -2
- data/lib/inspec/version.rb +1 -1
- data/lib/resources/mysql_session.rb +1 -0
- metadata +22 -4
data/lib/inspec/profile.rb
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
require 'forwardable'
|
7
7
|
require 'openssl'
|
8
|
+
require 'inspec/attribute_registry'
|
8
9
|
require 'inspec/polyfill'
|
9
10
|
require 'inspec/cached_fetcher'
|
10
11
|
require 'inspec/file_provider'
|
@@ -55,7 +56,7 @@ module Inspec
|
|
55
56
|
file_provider = FileProvider.for_path(path)
|
56
57
|
rp = file_provider.relative_provider
|
57
58
|
|
58
|
-
# copy embedded
|
59
|
+
# copy embedded dependencies into global cache
|
59
60
|
copy_deps_into_cache(rp, opts) unless opts[:vendor_cache].nil?
|
60
61
|
|
61
62
|
reader = Inspec::SourceReader.resolve(rp)
|
@@ -79,7 +80,7 @@ module Inspec
|
|
79
80
|
end
|
80
81
|
|
81
82
|
attr_reader :source_reader, :backend, :runner_context, :check_mode
|
82
|
-
attr_accessor :parent_profile
|
83
|
+
attr_accessor :parent_profile, :profile_name
|
83
84
|
def_delegator :@source_reader, :tests
|
84
85
|
def_delegator :@source_reader, :libraries
|
85
86
|
def_delegator :@source_reader, :metadata
|
@@ -93,11 +94,13 @@ module Inspec
|
|
93
94
|
@controls = options[:controls] || []
|
94
95
|
@writable = options[:writable] || false
|
95
96
|
@profile_id = options[:id]
|
97
|
+
@profile_name = options[:profile_name]
|
96
98
|
@cache = options[:vendor_cache] || Cache.new
|
97
99
|
@attr_values = options[:attributes]
|
98
100
|
@tests_collected = false
|
99
101
|
@libraries_loaded = false
|
100
102
|
@check_mode = options[:check_mode] || false
|
103
|
+
@parent_profile = options[:parent_profile]
|
101
104
|
Metadata.finalize(@source_reader.metadata, @profile_id, options)
|
102
105
|
|
103
106
|
# if a backend has already been created, clone it so each profile has its own unique backend object
|
@@ -119,6 +122,17 @@ module Inspec
|
|
119
122
|
|
120
123
|
@supports_platform = metadata.supports_platform?(@backend)
|
121
124
|
@supports_runtime = metadata.supports_runtime?
|
125
|
+
register_metadata_attributes
|
126
|
+
end
|
127
|
+
|
128
|
+
def register_metadata_attributes
|
129
|
+
if metadata.params.key?(:attributes)
|
130
|
+
metadata.params[:attributes].each do |attribute|
|
131
|
+
attr_dup = attribute.dup
|
132
|
+
name = attr_dup.delete(:name)
|
133
|
+
@runner_context.register_attribute(name, attr_dup)
|
134
|
+
end
|
135
|
+
end
|
122
136
|
end
|
123
137
|
|
124
138
|
def name
|
@@ -229,7 +243,7 @@ module Inspec
|
|
229
243
|
info(load_params.dup)
|
230
244
|
end
|
231
245
|
|
232
|
-
def info(res = params.dup) # rubocop:disable Metrics/CyclomaticComplexity
|
246
|
+
def info(res = params.dup) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
233
247
|
# add information about the controls
|
234
248
|
res[:controls] = res[:controls].map do |id, rule|
|
235
249
|
next if id.to_s.empty?
|
@@ -239,6 +253,16 @@ module Inspec
|
|
239
253
|
data[:impact] = 1.0 if data[:impact] > 1.0
|
240
254
|
data[:impact] = 0.0 if data[:impact] < 0.0
|
241
255
|
data[:id] = id
|
256
|
+
|
257
|
+
# if the code field is empty try and pull info from dependencies
|
258
|
+
if data[:code].empty? && parent_profile.nil?
|
259
|
+
locked_dependencies.dep_list.each do |_name, dep|
|
260
|
+
profile = dep.profile
|
261
|
+
code = Inspec::MethodSource.code_at(data[:source_location], profile.source_reader)
|
262
|
+
data[:code] = code unless code.nil? || code.empty?
|
263
|
+
break if !data[:code].empty?
|
264
|
+
end
|
265
|
+
end
|
242
266
|
data
|
243
267
|
end.compact
|
244
268
|
|
@@ -249,7 +273,12 @@ module Inspec
|
|
249
273
|
end
|
250
274
|
|
251
275
|
# add information about the required attributes
|
252
|
-
|
276
|
+
if res[:attributes].nil? || res[:attributes].empty?
|
277
|
+
# convert to array for backwords compatability
|
278
|
+
res[:attributes] = []
|
279
|
+
else
|
280
|
+
res[:attributes] = res[:attributes].values.map(&:to_hash)
|
281
|
+
end
|
253
282
|
res[:sha256] = sha256
|
254
283
|
res[:parent_profile] = parent_profile unless parent_profile.nil?
|
255
284
|
|
@@ -18,7 +18,7 @@ module Inspec
|
|
18
18
|
'check_mode' => profile.check_mode })
|
19
19
|
end
|
20
20
|
|
21
|
-
attr_reader :attributes, :
|
21
|
+
attr_reader :attributes, :backend, :profile_name, :profile_id, :resource_registry
|
22
22
|
attr_accessor :rules
|
23
23
|
def initialize(profile_id, backend, conf)
|
24
24
|
if backend.nil?
|
@@ -28,12 +28,14 @@ module Inspec
|
|
28
28
|
@profile_id = profile_id
|
29
29
|
@backend = backend
|
30
30
|
@conf = conf.dup
|
31
|
+
@profile_name = @conf['profile'].profile_name || @profile_id if @conf['profile']
|
31
32
|
@skip_only_if_eval = @conf['check_mode']
|
32
33
|
@rules = {}
|
33
34
|
@control_subcontexts = []
|
34
35
|
@lib_subcontexts = []
|
35
36
|
@require_loader = ::Inspec::RequireLoader.new
|
36
|
-
@
|
37
|
+
Inspec::AttributeRegistry.register_profile_alias(@profile_id, @profile_name) if @profile_id != @profile_name
|
38
|
+
@attributes = Inspec::AttributeRegistry.list_attributes_for_profile(@profile_id)
|
37
39
|
# A local resource registry that only contains resources defined
|
38
40
|
# in the transitive dependency tree of the loaded profile.
|
39
41
|
@resource_registry = Inspec::Resource.new_registry
|
@@ -187,11 +189,9 @@ module Inspec
|
|
187
189
|
|
188
190
|
def register_attribute(name, options = {})
|
189
191
|
# we need to return an attribute object, to allow dermination of default values
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
@attributes.push(attr)
|
194
|
-
attr.value
|
192
|
+
attribute = Inspec::AttributeRegistry.register_attribute(name, @profile_id, options)
|
193
|
+
attribute.value = @conf['attributes'][name] unless @conf['attributes'].nil? || @conf['attributes'][name].nil?
|
194
|
+
attribute.value
|
195
195
|
end
|
196
196
|
|
197
197
|
def set_header(field, val)
|
@@ -8,7 +8,7 @@ module Inspec
|
|
8
8
|
attr_reader :profile_path
|
9
9
|
|
10
10
|
def initialize(path)
|
11
|
-
@profile_path = Pathname.new(path)
|
11
|
+
@profile_path = Pathname.new(File.expand_path(path))
|
12
12
|
end
|
13
13
|
|
14
14
|
def vendor!
|
@@ -56,11 +56,31 @@ module Inspec
|
|
56
56
|
def vendor_dependencies
|
57
57
|
delete_vendored_data
|
58
58
|
File.write(lockfile, profile.generate_lockfile.to_yaml)
|
59
|
+
extract_archives
|
59
60
|
end
|
60
61
|
|
61
62
|
def delete_vendored_data
|
62
63
|
FileUtils.rm_rf(cache_path) if cache_path.exist?
|
63
64
|
File.delete(lockfile) if lockfile.exist?
|
64
65
|
end
|
66
|
+
|
67
|
+
def extract_archives
|
68
|
+
Dir.glob(File.join(cache_path, '*')).each do |filepath|
|
69
|
+
# Get SHA without extension
|
70
|
+
# We use split since '.' is not valid in a SHA checksum
|
71
|
+
destination_dir_name = File.basename(filepath).split('.')[0]
|
72
|
+
destination_path = File.join(cache_path, destination_dir_name)
|
73
|
+
|
74
|
+
provider = FileProvider.for_path(filepath)
|
75
|
+
|
76
|
+
next unless provider.is_a?(ZipProvider) || provider.is_a?(TarProvider)
|
77
|
+
|
78
|
+
Inspec::Log.debug("Extracting '#{filepath}' to '#{destination_path}'")
|
79
|
+
provider.extract(destination_path)
|
80
|
+
|
81
|
+
Inspec::Log.debug("Deleting archive '#{filepath}'")
|
82
|
+
File.delete(filepath)
|
83
|
+
end
|
84
|
+
end
|
65
85
|
end
|
66
86
|
end
|
@@ -53,8 +53,13 @@ module Inspec::Reporters
|
|
53
53
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
54
54
|
end
|
55
55
|
|
56
|
-
http.request(req)
|
57
|
-
|
56
|
+
res = http.request(req)
|
57
|
+
if res.is_a?(Net::HTTPSuccess)
|
58
|
+
return true
|
59
|
+
else
|
60
|
+
Inspec::Log.error "send_report: POST to #{uri.path} returned: #{res.body}"
|
61
|
+
return false
|
62
|
+
end
|
58
63
|
rescue => e
|
59
64
|
Inspec::Log.error "send_report: POST to #{uri.path} returned: #{e.message}"
|
60
65
|
return false
|
data/lib/inspec/reporters/cli.rb
CHANGED
@@ -63,9 +63,17 @@ module Inspec::Reporters
|
|
63
63
|
private
|
64
64
|
|
65
65
|
def print_profile_header(profile)
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
header = {
|
67
|
+
'Profile' => format_profile_name(profile),
|
68
|
+
'Version' => profile[:version] || '(not specified)',
|
69
|
+
}
|
70
|
+
header['Target'] = run_data[:platform][:target] unless run_data[:platform][:target].nil?
|
71
|
+
header['Target ID'] = @config['target_id'] unless @config['target_id'].nil?
|
72
|
+
|
73
|
+
pad = header.keys.max_by(&:length).length + 1
|
74
|
+
header.each do |title, value|
|
75
|
+
output(format("%-#{pad}s %s", title + ':', value))
|
76
|
+
end
|
69
77
|
output('')
|
70
78
|
end
|
71
79
|
|
@@ -141,7 +149,7 @@ module Inspec::Reporters
|
|
141
149
|
|
142
150
|
message_to_format = ''
|
143
151
|
message_to_format += "#{INDICATORS[indicator]} " unless indicator.nil?
|
144
|
-
message_to_format += message.to_s.lstrip
|
152
|
+
message_to_format += message.to_s.lstrip.force_encoding(Encoding::UTF_8)
|
145
153
|
|
146
154
|
format_with_color(color, indent_lines(message_to_format, indentation))
|
147
155
|
end
|
@@ -22,10 +22,12 @@ module Inspec::Reporters
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def platform
|
25
|
-
{
|
25
|
+
platform = {
|
26
26
|
name: run_data[:platform][:name],
|
27
27
|
release: run_data[:platform][:release],
|
28
28
|
}
|
29
|
+
platform[:target_id] = @config['target_id'] if @config['target_id']
|
30
|
+
platform
|
29
31
|
end
|
30
32
|
|
31
33
|
def profile_results(control)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'inspec/attribute_registry'
|
2
|
+
require 'rspec/core/example_group'
|
3
|
+
|
4
|
+
# This file allows you to add ExampleGroups to be used in rspec tests
|
5
|
+
#
|
6
|
+
class RSpec::Core::ExampleGroup
|
7
|
+
# This DSL method allows us to access the values of attributes within InSpec tests
|
8
|
+
def attribute(name)
|
9
|
+
Inspec::AttributeRegistry.find_attribute(name, self.class.metadata[:profile_id]).value
|
10
|
+
end
|
11
|
+
define_example_method :attribute
|
12
|
+
end
|
data/lib/inspec/rule.rb
CHANGED
data/lib/inspec/runner.rb
CHANGED
@@ -52,7 +52,7 @@ module Inspec
|
|
52
52
|
end
|
53
53
|
|
54
54
|
# list of profile attributes
|
55
|
-
@attributes =
|
55
|
+
@attributes = {}
|
56
56
|
|
57
57
|
load_attributes(@conf)
|
58
58
|
configure_transport
|
@@ -88,7 +88,7 @@ module Inspec
|
|
88
88
|
@test_collector.add_profile(requirement.profile)
|
89
89
|
end
|
90
90
|
|
91
|
-
@attributes
|
91
|
+
@attributes = profile.runner_context.attributes if @attributes.empty?
|
92
92
|
all_controls += profile.collect_tests
|
93
93
|
end
|
94
94
|
|
data/lib/inspec/schema.rb
CHANGED
@@ -42,6 +42,7 @@ module Inspec
|
|
42
42
|
'properties' => {
|
43
43
|
'name' => { 'type' => 'string' },
|
44
44
|
'release' => { 'type' => 'string' },
|
45
|
+
'target_id' => { 'type' => 'string', 'optional' => true },
|
45
46
|
},
|
46
47
|
}.freeze
|
47
48
|
|
@@ -200,9 +201,17 @@ module Inspec
|
|
200
201
|
},
|
201
202
|
}.freeze
|
202
203
|
|
204
|
+
# using a proc here so we can lazy load it when we need
|
205
|
+
PLATFORMS = lambda do
|
206
|
+
require 'train'
|
207
|
+
Train.create('mock').connection
|
208
|
+
Train::Platforms.export
|
209
|
+
end
|
210
|
+
|
203
211
|
LIST = {
|
204
212
|
'exec-json' => EXEC_JSON,
|
205
213
|
'exec-jsonmin' => EXEC_JSONMIN,
|
214
|
+
'platforms' => PLATFORMS,
|
206
215
|
}.freeze
|
207
216
|
|
208
217
|
def self.names
|
@@ -210,8 +219,13 @@ module Inspec
|
|
210
219
|
end
|
211
220
|
|
212
221
|
def self.json(name)
|
213
|
-
|
214
|
-
|
222
|
+
if !LIST.key?(name)
|
223
|
+
raise("Cannot find schema #{name.inspect}.")
|
224
|
+
elsif LIST[name].is_a?(Proc)
|
225
|
+
v = LIST[name].call
|
226
|
+
else
|
227
|
+
v = LIST[name]
|
228
|
+
end
|
215
229
|
JSON.dump(v)
|
216
230
|
end
|
217
231
|
end
|
data/lib/inspec/version.rb
CHANGED
@@ -72,6 +72,7 @@ module Inspec::Resources
|
|
72
72
|
|
73
73
|
def init_fallback
|
74
74
|
# support debian mysql administration login
|
75
|
+
return if inspec.platform.in_family?('windows')
|
75
76
|
debian = inspec.command('test -f /etc/mysql/debian.cnf && cat /etc/mysql/debian.cnf').stdout
|
76
77
|
return if debian.empty?
|
77
78
|
|
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: 2.2.
|
4
|
+
version: 2.2.101
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Richter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: train-core
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '1.4'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.4.
|
22
|
+
version: 1.4.37
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '1.4'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.4.
|
32
|
+
version: 1.4.37
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: thor
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -274,6 +274,20 @@ dependencies:
|
|
274
274
|
- - ">="
|
275
275
|
- !ruby/object:Gem::Version
|
276
276
|
version: '0'
|
277
|
+
- !ruby/object:Gem::Dependency
|
278
|
+
name: multipart-post
|
279
|
+
requirement: !ruby/object:Gem::Requirement
|
280
|
+
requirements:
|
281
|
+
- - ">="
|
282
|
+
- !ruby/object:Gem::Version
|
283
|
+
version: '0'
|
284
|
+
type: :runtime
|
285
|
+
prerelease: false
|
286
|
+
version_requirements: !ruby/object:Gem::Requirement
|
287
|
+
requirements:
|
288
|
+
- - ">="
|
289
|
+
- !ruby/object:Gem::Version
|
290
|
+
version: '0'
|
277
291
|
description: Core InSpec, local support only. See `inspec` for full support.
|
278
292
|
email:
|
279
293
|
- dominik.richter@gmail.com
|
@@ -508,6 +522,7 @@ files:
|
|
508
522
|
- lib/inspec.rb
|
509
523
|
- lib/inspec/archive/tar.rb
|
510
524
|
- lib/inspec/archive/zip.rb
|
525
|
+
- lib/inspec/attribute_registry.rb
|
511
526
|
- lib/inspec/backend.rb
|
512
527
|
- lib/inspec/base_cli.rb
|
513
528
|
- lib/inspec/cached_fetcher.rb
|
@@ -534,6 +549,8 @@ files:
|
|
534
549
|
- lib/inspec/formatters/base.rb
|
535
550
|
- lib/inspec/formatters/json_rspec.rb
|
536
551
|
- lib/inspec/formatters/show_progress.rb
|
552
|
+
- lib/inspec/globals.rb
|
553
|
+
- lib/inspec/impact.rb
|
537
554
|
- lib/inspec/library_eval_context.rb
|
538
555
|
- lib/inspec/log.rb
|
539
556
|
- lib/inspec/metadata.rb
|
@@ -580,6 +597,7 @@ files:
|
|
580
597
|
- lib/inspec/reporters/yaml.rb
|
581
598
|
- lib/inspec/require_loader.rb
|
582
599
|
- lib/inspec/resource.rb
|
600
|
+
- lib/inspec/rspec_extensions.rb
|
583
601
|
- lib/inspec/rule.rb
|
584
602
|
- lib/inspec/runner.rb
|
585
603
|
- lib/inspec/runner_mock.rb
|