inspec 1.43.8 → 1.44.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -10
- data/docs/ruby_usage.md +0 -1
- data/inspec.gemspec +1 -1
- data/lib/bundles/inspec-compliance/api.rb +14 -6
- data/lib/bundles/inspec-compliance/cli.rb +14 -7
- data/lib/bundles/inspec-habitat/profile.rb +2 -2
- data/lib/inspec/dependencies/requirement.rb +10 -7
- data/lib/inspec/dependencies/resolver.rb +1 -1
- data/lib/inspec/exceptions.rb +2 -0
- data/lib/inspec/metadata.rb +15 -1
- data/lib/inspec/plugins/resource.rb +34 -5
- data/lib/inspec/runner.rb +52 -28
- data/lib/inspec/version.rb +1 -1
- data/lib/resources/http.rb +2 -1
- data/lib/resources/packages.rb +1 -1
- data/lib/resources/toml.rb +2 -2
- data/lib/utils/nginx_parser.rb +10 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0586114d59157e09b9b4aa313cf7ec2e3db9a720'
|
4
|
+
data.tar.gz: cb26ac2fb7d6d46606b4e84b9be339da1f4b5d07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6b466fd7877af420af8fad49925b94e51b09e3ed07ea9bc21ebc9e211d67966d73e27c6461a49bd48be9afbfa3b7a7f9647d40d5b4f2ecdb323bde76ad6b990
|
7
|
+
data.tar.gz: 652504e305a7b8a145c5d17120313f107c2e3742668491431a73767b43463f8d71b29517bc71b330863929cee4f5668c498194c780b66d993c750ce08113191c
|
data/CHANGELOG.md
CHANGED
@@ -1,22 +1,42 @@
|
|
1
1
|
# Change Log
|
2
2
|
<!-- usage documentation: http://expeditor-docs.es.chef.io/configuration/changelog/ -->
|
3
|
-
<!-- latest_release 1.
|
4
|
-
## [v1.
|
3
|
+
<!-- latest_release 1.44.8 -->
|
4
|
+
## [v1.44.8](https://github.com/chef/inspec/tree/v1.44.8) (2017-11-09)
|
5
5
|
|
6
|
-
####
|
7
|
-
-
|
6
|
+
#### Enhancements
|
7
|
+
- Issue warning during check if profile name contains slash [#2231](https://github.com/chef/inspec/pull/2231) ([clintoncwolfe](https://github.com/clintoncwolfe))
|
8
8
|
<!-- latest_release -->
|
9
9
|
|
10
|
-
<!-- release_rollup since=1.43.
|
11
|
-
### Changes since 1.43.
|
10
|
+
<!-- release_rollup since=1.43.8 -->
|
11
|
+
### Changes since 1.43.8 release
|
12
|
+
|
13
|
+
#### Enhancements
|
14
|
+
- Issue warning during check if profile name contains slash [#2231](https://github.com/chef/inspec/pull/2231) ([clintoncwolfe](https://github.com/clintoncwolfe)) <!-- 1.44.8 -->
|
15
|
+
- http resource: supply max-time option using read_timeout and open_timeout [#2289](https://github.com/chef/inspec/pull/2289) ([bdellegrazie](https://github.com/bdellegrazie)) <!-- 1.44.5 -->
|
16
|
+
- allow users to specify user/namespace when fetching profiles from Chef Automate [#2275](https://github.com/chef/inspec/pull/2275) ([arlimus](https://github.com/arlimus)) <!-- 1.44.1 -->
|
17
|
+
- Add non-halting exception support to resources [#2235](https://github.com/chef/inspec/pull/2235) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.44.0 -->
|
18
|
+
|
19
|
+
#### Merged Pull Requests
|
20
|
+
- Eliminate deprecation warnings on resource skipped messages [#2296](https://github.com/chef/inspec/pull/2296) ([adamleff](https://github.com/adamleff)) <!-- 1.44.6 -->
|
21
|
+
- Use Ruby 2.4.2 in the Omnibus InSpec packages [#2294](https://github.com/chef/inspec/pull/2294) ([adamleff](https://github.com/adamleff)) <!-- 1.44.4 -->
|
22
|
+
- Switch to tomlrb for TOML parsing [#2295](https://github.com/chef/inspec/pull/2295) ([adamleff](https://github.com/adamleff)) <!-- 1.44.2 -->
|
23
|
+
- Pin RubyGems to 2.6.14 [#2287](https://github.com/chef/inspec/pull/2287) ([adamleff](https://github.com/adamleff)) <!-- 1.43.10 -->
|
12
24
|
|
13
25
|
#### Bug Fixes
|
14
|
-
-
|
15
|
-
-
|
16
|
-
-
|
26
|
+
- Properly compare profile version strings as SemVer [#2280](https://github.com/chef/inspec/pull/2280) ([adamleff](https://github.com/adamleff)) <!-- 1.44.7 -->
|
27
|
+
- nginx resource: support quoted identifiers [#2292](https://github.com/chef/inspec/pull/2292) ([adamleff](https://github.com/adamleff)) <!-- 1.44.3 -->
|
28
|
+
- http resource: use proper syntax in `curl` header option [#2285](https://github.com/chef/inspec/pull/2285) ([schisamo](https://github.com/schisamo)) <!-- 1.43.9 -->
|
17
29
|
<!-- release_rollup -->
|
18
30
|
|
19
31
|
<!-- latest_stable_release -->
|
32
|
+
## [v1.43.8](https://github.com/chef/inspec/tree/v1.43.8) (2017-11-02)
|
33
|
+
|
34
|
+
#### Bug Fixes
|
35
|
+
- inspec compliance login: Ensure supplied server has a proper URI scheme [#2268](https://github.com/chef/inspec/pull/2268) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
|
36
|
+
- mount resource: fix for Device-/Sharenames and Mountpoints including … [#2257](https://github.com/chef/inspec/pull/2257) ([mgrobelin](https://github.com/mgrobelin))
|
37
|
+
- service resource: properly search for SysV Init S files [#2274](https://github.com/chef/inspec/pull/2274) ([Wing924](https://github.com/Wing924))
|
38
|
+
<!-- latest_stable_release -->
|
39
|
+
|
20
40
|
## [v1.43.5](https://github.com/chef/inspec/tree/v1.43.5) (2017-10-26)
|
21
41
|
|
22
42
|
#### New Resources
|
@@ -30,7 +50,6 @@
|
|
30
50
|
|
31
51
|
#### Bug Fixes
|
32
52
|
- Fix regression when uploading compliance profiles [#2264](https://github.com/chef/inspec/pull/2264) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
|
33
|
-
<!-- latest_stable_release -->
|
34
53
|
|
35
54
|
## [v1.42.3](https://github.com/chef/inspec/tree/v1.42.3) (2017-10-19)
|
36
55
|
|
data/docs/ruby_usage.md
CHANGED
@@ -114,7 +114,6 @@ methods available, etc. For the above example:
|
|
114
114
|
[3] pry> ls perl_out
|
115
115
|
Inspec::Plugins::Resource#methods: inspect
|
116
116
|
Inspec::Resources::Cmd#methods: command exist? exit_status result stderr stdout to_s
|
117
|
-
Inspec::Plugins::ResourceCommon#methods: resource_skipped skip_resource
|
118
117
|
Inspec::Resource::Registry::Command#methods: inspec
|
119
118
|
instance variables: @__backend_runner__ @__resource_name__ @command @result
|
120
119
|
[4] pry> perl_out.stdout.partition('@INC:').last.strip.split("\n")
|
data/inspec.gemspec
CHANGED
@@ -40,7 +40,7 @@ Gem::Specification.new do |spec|
|
|
40
40
|
spec.add_dependency 'sslshake', '~> 1.2'
|
41
41
|
spec.add_dependency 'parallel', '~> 1.9'
|
42
42
|
spec.add_dependency 'faraday', '>=0.9.0'
|
43
|
-
spec.add_dependency '
|
43
|
+
spec.add_dependency 'tomlrb', '~> 1.2'
|
44
44
|
spec.add_dependency 'addressable', '~> 2.4'
|
45
45
|
spec.add_dependency 'parslet', '~> 1.5'
|
46
46
|
spec.add_dependency 'semverse'
|
@@ -16,13 +16,17 @@ module Compliance
|
|
16
16
|
extend Compliance::API::Login
|
17
17
|
|
18
18
|
# return all compliance profiles available for the user
|
19
|
+
# the user is either specified in the options hash or by default
|
20
|
+
# the username of the account is used that is logged in
|
19
21
|
def self.profiles(config)
|
22
|
+
owner = config['owner'] || config['user']
|
23
|
+
|
20
24
|
# Chef Compliance
|
21
25
|
if is_compliance_server?(config)
|
22
26
|
url = "#{config['server']}/user/compliance"
|
23
27
|
# Chef Automate
|
24
28
|
elsif is_automate_server?(config)
|
25
|
-
url = "#{config['server']}/profiles/#{
|
29
|
+
url = "#{config['server']}/profiles/#{owner}"
|
26
30
|
else
|
27
31
|
raise ServerConfigurationMissing
|
28
32
|
end
|
@@ -45,9 +49,8 @@ module Compliance
|
|
45
49
|
elsif is_automate_server_pre_080?(config)
|
46
50
|
mapped_profiles = profiles.values.flatten
|
47
51
|
else
|
48
|
-
owner_id = config['user']
|
49
52
|
mapped_profiles = profiles.map { |e|
|
50
|
-
e['owner_id'] =
|
53
|
+
e['owner_id'] = owner
|
51
54
|
e
|
52
55
|
}
|
53
56
|
end
|
@@ -85,8 +88,13 @@ module Compliance
|
|
85
88
|
|
86
89
|
# verifies that a profile
|
87
90
|
def self.exist?(config, profile)
|
88
|
-
_msg, profiles = Compliance::API.profiles(config)
|
89
91
|
owner, id, ver = profile_split(profile)
|
92
|
+
|
93
|
+
# ensure that we do not manipulate the configuration object
|
94
|
+
user_config = config.dup
|
95
|
+
user_config['owner'] = owner
|
96
|
+
_msg, profiles = Compliance::API.profiles(user_config)
|
97
|
+
|
90
98
|
if !profiles.empty?
|
91
99
|
profiles.any? do |p|
|
92
100
|
p['owner_id'] == owner &&
|
@@ -104,10 +112,10 @@ module Compliance
|
|
104
112
|
url = "#{config['server']}/owners/#{owner}/compliance/#{profile_name}/tar"
|
105
113
|
# Chef Automate pre 0.8.0
|
106
114
|
elsif is_automate_server_pre_080?(config)
|
107
|
-
url = "#{config['server']}/#{
|
115
|
+
url = "#{config['server']}/#{owner}"
|
108
116
|
# Chef Automate
|
109
117
|
else
|
110
|
-
url = "#{config['server']}/profiles/#{
|
118
|
+
url = "#{config['server']}/profiles/#{owner}"
|
111
119
|
end
|
112
120
|
|
113
121
|
headers = get_headers(config)
|
@@ -79,11 +79,15 @@ module Compliance
|
|
79
79
|
end
|
80
80
|
|
81
81
|
desc 'profiles', 'list all available profiles in Chef Compliance'
|
82
|
-
|
82
|
+
option :owner, type: :string, required: false,
|
83
|
+
desc: 'owner whose profiles to list'
|
83
84
|
def profiles
|
84
85
|
config = Compliance::Configuration.new
|
85
86
|
return if !loggedin(config)
|
86
87
|
|
88
|
+
# set owner to config
|
89
|
+
config['owner'] = options['owner'] || config['user']
|
90
|
+
|
87
91
|
msg, profiles = Compliance::API.profiles(config)
|
88
92
|
profiles.sort_by! { |hsh| hsh['title'] }
|
89
93
|
if !profiles.empty?
|
@@ -145,11 +149,16 @@ module Compliance
|
|
145
149
|
|
146
150
|
desc 'upload PATH', 'uploads a local profile to Chef Compliance'
|
147
151
|
option :overwrite, type: :boolean, default: false,
|
148
|
-
desc: 'Overwrite existing profile on
|
152
|
+
desc: 'Overwrite existing profile on Server.'
|
153
|
+
option :owner, type: :string, required: false,
|
154
|
+
desc: 'Owner that should own the profile'
|
149
155
|
def upload(path) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, PerceivedComplexity, Metrics/CyclomaticComplexity
|
150
156
|
config = Compliance::Configuration.new
|
151
157
|
return if !loggedin(config)
|
152
158
|
|
159
|
+
# set owner to config
|
160
|
+
config['owner'] = options['owner'] || config['user']
|
161
|
+
|
153
162
|
unless File.exist?(path)
|
154
163
|
puts "Directory #{path} does not exist."
|
155
164
|
exit 1
|
@@ -181,14 +190,12 @@ module Compliance
|
|
181
190
|
error.call('Please login via `inspec compliance login`')
|
182
191
|
end
|
183
192
|
|
184
|
-
# owner
|
185
|
-
owner = config['user']
|
186
193
|
# read profile name from inspec.yml
|
187
194
|
profile_name = profile.params[:name]
|
188
195
|
|
189
196
|
# check that the profile is not uploaded already,
|
190
197
|
# confirm upload to the user (overwrite with --force)
|
191
|
-
if Compliance::API.exist?(config, "#{owner}/#{profile_name}") && !options['overwrite']
|
198
|
+
if Compliance::API.exist?(config, "#{config['owner']}/#{profile_name}") && !options['overwrite']
|
192
199
|
error.call('Profile exists on the server, use --overwrite')
|
193
200
|
end
|
194
201
|
|
@@ -207,12 +214,12 @@ module Compliance
|
|
207
214
|
archive_path = path
|
208
215
|
end
|
209
216
|
|
210
|
-
puts "Start upload to #{owner}/#{profile_name}"
|
217
|
+
puts "Start upload to #{config['owner']}/#{profile_name}"
|
211
218
|
pname = ERB::Util.url_encode(profile_name)
|
212
219
|
|
213
220
|
Compliance::API.is_automate_server?(config) ? upload_msg = 'Uploading to Chef Automate' : upload_msg = 'Uploading to Chef Compliance'
|
214
221
|
puts upload_msg
|
215
|
-
success, msg = Compliance::API.upload(config, owner, pname, archive_path)
|
222
|
+
success, msg = Compliance::API.upload(config, config['owner'], pname, archive_path)
|
216
223
|
|
217
224
|
if success
|
218
225
|
puts 'Successfully uploaded profile'
|
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'inspec/profile_vendor'
|
5
5
|
require 'mixlib/shellout'
|
6
|
-
require '
|
6
|
+
require 'tomlrb'
|
7
7
|
|
8
8
|
module Habitat
|
9
9
|
class Profile # rubocop:disable Metrics/ClassLength
|
@@ -298,7 +298,7 @@ module Habitat
|
|
298
298
|
config_file = File.join(ENV['HOME'], '.hab', 'etc', 'cli.toml')
|
299
299
|
return {} unless File.exist?(config_file)
|
300
300
|
|
301
|
-
@cli_config =
|
301
|
+
@cli_config = Tomlrb.load_file(config_file)
|
302
302
|
end
|
303
303
|
|
304
304
|
def output_dir
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'inspec/cached_fetcher'
|
3
3
|
require 'inspec/dependencies/dependency_set'
|
4
|
+
require 'semverse'
|
4
5
|
|
5
6
|
module Inspec
|
6
7
|
#
|
@@ -39,10 +40,10 @@ module Inspec
|
|
39
40
|
req
|
40
41
|
end
|
41
42
|
|
42
|
-
attr_reader :cwd, :opts, :
|
43
|
+
attr_reader :cwd, :opts, :version_constraints
|
43
44
|
def initialize(name, version_constraints, cache, cwd, opts)
|
44
45
|
@name = name
|
45
|
-
@
|
46
|
+
@version_constraints = Array(version_constraints)
|
46
47
|
@cache = cache
|
47
48
|
@backend = opts[:backend]
|
48
49
|
@opts = opts
|
@@ -62,11 +63,13 @@ module Inspec
|
|
62
63
|
end
|
63
64
|
|
64
65
|
def source_satisfies_spec?
|
65
|
-
|
66
|
-
end
|
66
|
+
return true if version_constraints.empty?
|
67
67
|
|
68
|
-
|
69
|
-
|
68
|
+
# Semverse::Constraint.satisfy_all returns a list of versions that match all of the
|
69
|
+
# supplied constraints. Since we're only matching against a single version, the return
|
70
|
+
# of satisfy_all will be non-empty if the profile version we have satisfies the constraints.
|
71
|
+
constraints = @version_constraints.map { |x| Semverse::Constraint.new(x) }
|
72
|
+
!Semverse::Constraint.satisfy_all(constraints, Semverse::Version.new(profile.version)).empty?
|
70
73
|
end
|
71
74
|
|
72
75
|
def resolved_source
|
@@ -77,7 +80,7 @@ module Inspec
|
|
77
80
|
h = {
|
78
81
|
'name' => name,
|
79
82
|
'resolved_source' => resolved_source,
|
80
|
-
'version_constraints' =>
|
83
|
+
'version_constraints' => version_constraints.to_s,
|
81
84
|
}
|
82
85
|
|
83
86
|
if !dependencies.empty?
|
@@ -71,7 +71,7 @@ module Inspec
|
|
71
71
|
end
|
72
72
|
|
73
73
|
if !dep.source_satisfies_spec?
|
74
|
-
raise Inspec::UnsatisfiedVersionSpecification, "The profile #{dep.name} from #{dep.resolved_source} has a version #{dep.source_version} which doesn't match #{dep.
|
74
|
+
raise Inspec::UnsatisfiedVersionSpecification, "The profile #{dep.name} from #{dep.resolved_source} has a version #{dep.source_version} which doesn't match #{dep.version_constraints}"
|
75
75
|
end
|
76
76
|
|
77
77
|
Inspec::Log.debug("Adding dependency #{dep.name} (#{dep.resolved_source})")
|
data/lib/inspec/exceptions.rb
CHANGED
@@ -5,6 +5,8 @@ module Inspec
|
|
5
5
|
module Exceptions
|
6
6
|
class AttributesFileDoesNotExist < ArgumentError; end
|
7
7
|
class AttributesFileNotReadable < ArgumentError; end
|
8
|
+
class ResourceFailed < StandardError; end
|
9
|
+
class ResourceSkipped < StandardError; end
|
8
10
|
class SecretsBackendNotFound < ArgumentError; end
|
9
11
|
end
|
10
12
|
end
|
data/lib/inspec/metadata.rb
CHANGED
@@ -11,6 +11,9 @@ require 'utils/spdx'
|
|
11
11
|
|
12
12
|
module Inspec
|
13
13
|
# Extract metadata.rb information
|
14
|
+
# A Metadata object may be created and finalized with invalid data.
|
15
|
+
# This allows the check CLI command to analyse the issues.
|
16
|
+
# Use valid? to determine if the metadata is coherent.
|
14
17
|
class Metadata # rubocop:disable Metrics/ClassLength
|
15
18
|
attr_reader :ref
|
16
19
|
attr_accessor :params, :content
|
@@ -112,6 +115,12 @@ module Inspec
|
|
112
115
|
errors.push("Missing profile #{field} in #{ref}")
|
113
116
|
end
|
114
117
|
|
118
|
+
if params[:name] =~ %r{[\/\\]}
|
119
|
+
warnings.push("Your profile name (#{params[:name]}) contains a slash " \
|
120
|
+
'which will not be permitted in InSpec 2.0. Please change your profile ' \
|
121
|
+
'name in the `inspec.yml` file.')
|
122
|
+
end
|
123
|
+
|
115
124
|
# if version is set, ensure it is correct
|
116
125
|
if !params[:version].nil? && !valid_version?(params[:version])
|
117
126
|
errors.push('Version needs to be in SemVer format')
|
@@ -212,7 +221,12 @@ module Inspec
|
|
212
221
|
return unless metadata.params[:title].nil?
|
213
222
|
|
214
223
|
# create a new name based on the original target if it exists
|
215
|
-
|
224
|
+
# Crudely slug the target to not contain slashes, to avoid breaking
|
225
|
+
# unit tests that look for warning sequences
|
226
|
+
unless original_target.to_s.empty?
|
227
|
+
metadata.params[:title] = "tests from #{original_target}"
|
228
|
+
metadata.params[:name] = metadata.params[:title].gsub(%r{[\\\/]}, '.')
|
229
|
+
end
|
216
230
|
end
|
217
231
|
|
218
232
|
def self.finalize(metadata, profile_id, options, logger = nil)
|
@@ -37,14 +37,26 @@ module Inspec
|
|
37
37
|
Inspec::Resource.registry
|
38
38
|
end
|
39
39
|
|
40
|
-
def __register(name, obj)
|
40
|
+
def __register(name, obj) # rubocop:disable Metrics/MethodLength
|
41
41
|
cl = Class.new(obj) do
|
42
|
+
attr_reader :resource_exception_message
|
43
|
+
|
42
44
|
def initialize(backend, name, *args)
|
45
|
+
@resource_skipped = false
|
46
|
+
@resource_failed = false
|
47
|
+
|
43
48
|
# attach the backend to this instance
|
44
49
|
@__backend_runner__ = backend
|
45
50
|
@__resource_name__ = name
|
51
|
+
|
46
52
|
# call the resource initializer
|
47
|
-
|
53
|
+
begin
|
54
|
+
super(*args)
|
55
|
+
rescue Inspec::Exceptions::ResourceSkipped => e
|
56
|
+
skip_resource(e.message)
|
57
|
+
rescue Inspec::Exceptions::ResourceFailed => e
|
58
|
+
fail_resource(e.message)
|
59
|
+
end
|
48
60
|
end
|
49
61
|
|
50
62
|
def self.desc(description = nil)
|
@@ -57,12 +69,29 @@ module Inspec
|
|
57
69
|
@example = example
|
58
70
|
end
|
59
71
|
|
72
|
+
def skip_resource(message)
|
73
|
+
@resource_skipped = true
|
74
|
+
@resource_exception_message = message
|
75
|
+
end
|
76
|
+
|
77
|
+
def resource_skipped?
|
78
|
+
@resource_skipped
|
79
|
+
end
|
80
|
+
|
60
81
|
def resource_skipped
|
61
|
-
|
82
|
+
warn('[DEPRECATION] Use `resource_exception_message` for the resource skipped message. This method will be removed in InSpec 2.0.')
|
83
|
+
# Returning `nil` here to match previous behavior
|
84
|
+
return nil if @resource_skipped == false
|
85
|
+
@resource_exception_message
|
62
86
|
end
|
63
87
|
|
64
|
-
def
|
65
|
-
@
|
88
|
+
def fail_resource(message)
|
89
|
+
@resource_failed = true
|
90
|
+
@resource_exception_message = message
|
91
|
+
end
|
92
|
+
|
93
|
+
def resource_failed?
|
94
|
+
@resource_failed
|
66
95
|
end
|
67
96
|
|
68
97
|
def inspec
|
data/lib/inspec/runner.rb
CHANGED
@@ -231,35 +231,18 @@ module Inspec
|
|
231
231
|
def get_check_example(method_name, arg, block)
|
232
232
|
opts = block_source_info(block)
|
233
233
|
|
234
|
-
if
|
235
|
-
|
236
|
-
|
237
|
-
return
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
case method_name
|
243
|
-
when 'describe'
|
244
|
-
return @test_collector.example_group(*arg, opts, &block)
|
245
|
-
when 'expect'
|
246
|
-
return block.example_group
|
247
|
-
when 'describe.one'
|
248
|
-
tests = arg.map do |x|
|
249
|
-
@test_collector.example_group(x[1][0], block_source_info(x[2]), &x[2])
|
250
|
-
end
|
251
|
-
return nil if tests.empty?
|
252
|
-
ok_tests = tests.find_all(&:run)
|
253
|
-
# return all tests if none succeeds; we will just report full failure
|
254
|
-
return tests if ok_tests.empty?
|
255
|
-
# otherwise return all working tests
|
256
|
-
return ok_tests
|
257
|
-
else
|
258
|
-
raise "A rule was registered with #{method_name.inspect}, "\
|
259
|
-
"which isn't understood and cannot be processed."
|
260
|
-
end
|
234
|
+
return nil if arg.empty?
|
235
|
+
|
236
|
+
if arg[0].respond_to?(:resource_skipped?) && arg[0].resource_skipped?
|
237
|
+
return rspec_skipped_block(arg, opts, arg[0].resource_exception_message)
|
238
|
+
end
|
239
|
+
|
240
|
+
if arg[0].respond_to?(:resource_failed?) && arg[0].resource_failed?
|
241
|
+
return rspec_failed_block(arg, opts, arg[0].resource_exception_message)
|
261
242
|
end
|
262
|
-
|
243
|
+
|
244
|
+
# If neither skipped nor failed then add the resource
|
245
|
+
add_resource(method_name, arg, opts, block)
|
263
246
|
end
|
264
247
|
|
265
248
|
def register_rule(rule)
|
@@ -288,5 +271,46 @@ module Inspec
|
|
288
271
|
|
289
272
|
true
|
290
273
|
end
|
274
|
+
|
275
|
+
def rspec_skipped_block(arg, opts, message)
|
276
|
+
@test_collector.example_group(*arg, opts) do
|
277
|
+
# Send custom `it` block to RSpec
|
278
|
+
it message
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
def rspec_failed_block(arg, opts, message)
|
283
|
+
@test_collector.example_group(*arg, opts) do
|
284
|
+
# Send custom `it` block to RSpec
|
285
|
+
it '' do
|
286
|
+
# Raising here to fail the test and get proper formatting
|
287
|
+
raise Inspec::Exceptions::ResourceFailed, message
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
def add_resource(method_name, arg, opts, block)
|
293
|
+
case method_name
|
294
|
+
when 'describe'
|
295
|
+
@test_collector.example_group(*arg, opts, &block)
|
296
|
+
when 'expect'
|
297
|
+
block.example_group
|
298
|
+
when 'describe.one'
|
299
|
+
tests = arg.map do |x|
|
300
|
+
@test_collector.example_group(x[1][0], block_source_info(x[2]), &x[2])
|
301
|
+
end
|
302
|
+
return nil if tests.empty?
|
303
|
+
|
304
|
+
successful_tests = tests.find_all(&:run)
|
305
|
+
|
306
|
+
# Return all tests if none succeeds; we will just report full failure
|
307
|
+
return tests if successful_tests.empty?
|
308
|
+
|
309
|
+
successful_tests
|
310
|
+
else
|
311
|
+
raise "A rule was registered with #{method_name.inspect}," \
|
312
|
+
"which isn't understood and cannot be processed."
|
313
|
+
end
|
314
|
+
end
|
291
315
|
end
|
292
316
|
end
|
data/lib/inspec/version.rb
CHANGED
data/lib/resources/http.rb
CHANGED
@@ -205,12 +205,13 @@ module Inspec::Resources
|
|
205
205
|
def curl_command
|
206
206
|
cmd = ["curl -i -X #{http_method}"]
|
207
207
|
cmd << "--connect-timeout #{open_timeout}"
|
208
|
+
cmd << "--max-time #{open_timeout+read_timeout}"
|
208
209
|
cmd << "--user \'#{username}:#{password}\'" unless username.nil? || password.nil?
|
209
210
|
cmd << '--insecure' unless ssl_verify?
|
210
211
|
cmd << "--data #{Shellwords.shellescape(request_body)}" unless request_body.nil?
|
211
212
|
|
212
213
|
request_headers.each do |k, v|
|
213
|
-
cmd << "-H '#{k}
|
214
|
+
cmd << "-H '#{k}: #{v}'"
|
214
215
|
end
|
215
216
|
|
216
217
|
cmd << "'#{url}'"
|
data/lib/resources/packages.rb
CHANGED
@@ -63,7 +63,7 @@ module Inspec::Resources
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def filtered_packages
|
66
|
-
warn "The packages resource is not yet supported on OS #{inspec.os.name}" if resource_skipped
|
66
|
+
warn "The packages resource is not yet supported on OS #{inspec.os.name}" if resource_skipped?
|
67
67
|
@list
|
68
68
|
end
|
69
69
|
end
|
data/lib/resources/toml.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# author: Nolan Davidson
|
3
3
|
|
4
|
-
require '
|
4
|
+
require 'tomlrb'
|
5
5
|
|
6
6
|
module Inspec::Resources
|
7
7
|
class TomlConfig < JsonConfig
|
@@ -16,7 +16,7 @@ module Inspec::Resources
|
|
16
16
|
"
|
17
17
|
|
18
18
|
def parse(content)
|
19
|
-
|
19
|
+
Tomlrb.parse(content)
|
20
20
|
end
|
21
21
|
|
22
22
|
def to_s
|
data/lib/utils/nginx_parser.rb
CHANGED
@@ -21,15 +21,24 @@ class NginxParser < Parslet::Parser
|
|
21
21
|
(identifier >> values.maybe.as(:args)).as(:assignment) >> str(';') >> filler?
|
22
22
|
}
|
23
23
|
|
24
|
-
rule(:
|
24
|
+
rule(:standard_identifier) {
|
25
25
|
(match('[a-zA-Z]') >> match('\S').repeat).as(:identifier) >> space >> space.repeat
|
26
26
|
}
|
27
27
|
|
28
|
+
rule(:quoted_identifier) {
|
29
|
+
str('"') >> (str('"').absent? >> any).repeat.as(:identifier) >> str('"') >> space.repeat
|
30
|
+
}
|
31
|
+
|
32
|
+
rule(:identifier) {
|
33
|
+
standard_identifier | quoted_identifier
|
34
|
+
}
|
35
|
+
|
28
36
|
rule(:value) {
|
29
37
|
((match('[#;{]').absent? >> any) >> (
|
30
38
|
str('\\') >> any | match('[#;{]|\s').absent? >> any
|
31
39
|
).repeat).as(:value) >> space.repeat
|
32
40
|
}
|
41
|
+
|
33
42
|
rule(:values) {
|
34
43
|
value.repeat >> space.maybe
|
35
44
|
}
|
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: 1.
|
4
|
+
version: 1.44.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Richter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: train
|
@@ -213,19 +213,19 @@ dependencies:
|
|
213
213
|
- !ruby/object:Gem::Version
|
214
214
|
version: 0.9.0
|
215
215
|
- !ruby/object:Gem::Dependency
|
216
|
-
name:
|
216
|
+
name: tomlrb
|
217
217
|
requirement: !ruby/object:Gem::Requirement
|
218
218
|
requirements:
|
219
219
|
- - "~>"
|
220
220
|
- !ruby/object:Gem::Version
|
221
|
-
version: '
|
221
|
+
version: '1.2'
|
222
222
|
type: :runtime
|
223
223
|
prerelease: false
|
224
224
|
version_requirements: !ruby/object:Gem::Requirement
|
225
225
|
requirements:
|
226
226
|
- - "~>"
|
227
227
|
- !ruby/object:Gem::Version
|
228
|
-
version: '
|
228
|
+
version: '1.2'
|
229
229
|
- !ruby/object:Gem::Dependency
|
230
230
|
name: addressable
|
231
231
|
requirement: !ruby/object:Gem::Requirement
|
@@ -698,7 +698,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
698
698
|
version: '0'
|
699
699
|
requirements: []
|
700
700
|
rubyforge_project:
|
701
|
-
rubygems_version: 2.6.
|
701
|
+
rubygems_version: 2.6.14
|
702
702
|
signing_key:
|
703
703
|
specification_version: 4
|
704
704
|
summary: Infrastructure and compliance testing.
|