inspec 0.19.3 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +30 -2
- data/inspec.gemspec +1 -1
- data/lib/bundles/inspec-compliance.rb +1 -0
- data/lib/bundles/inspec-compliance/.kitchen.yml +21 -0
- data/lib/bundles/inspec-compliance/README.md +24 -0
- data/lib/bundles/inspec-compliance/bootstrap.sh +37 -0
- data/lib/bundles/inspec-compliance/cli.rb +2 -2
- data/lib/bundles/inspec-compliance/support.rb +36 -0
- data/lib/bundles/inspec-compliance/target.rb +3 -5
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +56 -0
- data/lib/fetchers/url.rb +7 -2
- data/lib/inspec/backend.rb +1 -1
- data/lib/inspec/cli.rb +13 -13
- data/lib/inspec/plugins/fetcher.rb +1 -0
- data/lib/inspec/version.rb +1 -1
- data/lib/resources/file.rb +11 -23
- data/lib/resources/os.rb +10 -1
- data/lib/resources/package.rb +16 -0
- data/lib/resources/user.rb +14 -0
- data/lib/resources/xinetd.rb +39 -94
- data/lib/utils/filter.rb +184 -0
- data/lib/utils/hash_map.rb +37 -0
- data/test/functional/inspec_test.rb +23 -0
- data/test/helper.rb +5 -0
- data/test/resource/file_test.rb +3 -1
- data/test/unit/{fetchers.rb → fetchers_test.rb} +1 -0
- data/test/unit/mock/cmd/logins-x +4 -0
- data/test/unit/mock/cmd/swlist-l-product +1 -0
- data/test/unit/mock/profiles/resource-tiny/inspec.yml +10 -0
- data/test/unit/mock/profiles/resource-tiny/libraries/resource.rb +3 -0
- data/test/unit/resources/file_test.rb +21 -0
- data/test/unit/resources/package_test.rb +9 -0
- data/test/unit/resources/user_test.rb +6 -0
- data/test/unit/resources/xinetd_test.rb +3 -3
- data/test/unit/utils/filter_table_test.rb +125 -0
- metadata +46 -31
- data/lib/utils/detect.rb +0 -15
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NjFmODBkODVkMTI5MzljNjk1NzI4MGNjNDZkMzc0YTczODExYjYwMA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ffbce1bccc070d857ed236bce62eedcb3bb42a4c
|
4
|
+
data.tar.gz: 14004e3dc76705d06589615590dd8bc5f2d4fd12
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MjVlYWZhNDViZjU4NmIzNDZkNjcwOThkMWZkZGY2NjU4YjI4MzFlMWU1ZjE0
|
11
|
-
MDY0NDZhOGRiODU4YTFmNWExMGYwYzYwZGYxMTI2Nzg0N2U3Y2M=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NGUwMDk1YWFiMmM3ZTNjOGMxY2ZmMjBmYzFmNGIyZWMwYmM4MDNiZWZkYjRm
|
14
|
-
YTIzMDkyNjg0ODk1YzllNjJmNDMxMzdhMTUyZmQxZTYwMWIwNDVlYTJmNTQ0
|
15
|
-
ZWUyNzljYjM1NzMzOWFlOWVmOTU4NWE0N2ZhN2FhNTlkODU0N2E=
|
6
|
+
metadata.gz: fcd0f4c1ec713bda329e8a2cbfeb9d6897fe511c2f6cfaa9bd6bfb222c68d0a1eefdcf1997bafbce0462172dc7b0153337c58b9c42af0aa6ccaf8c1c16c76495
|
7
|
+
data.tar.gz: 4a15062bb74303d4845ff8b0d7128909c3b3bb45aeeae1dd18d5a23fae9fd7841c392adbf757f6a1d3825cfc86a960b3042df8e00505d314f74dde136a7c06cd
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,34 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [0.
|
4
|
-
[Full Changelog](https://github.com/chef/inspec/compare/v0.19.
|
3
|
+
## [0.20.0](https://github.com/chef/inspec/tree/0.20.0) (2016-04-29)
|
4
|
+
[Full Changelog](https://github.com/chef/inspec/compare/v0.19.3...0.20.0)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- `where { field op value }` for filter table [\#684](https://github.com/chef/inspec/pull/684) ([arlimus](https://github.com/arlimus))
|
9
|
+
- add `shell -c` for executing calls against the inspec api [\#683](https://github.com/chef/inspec/pull/683) ([arlimus](https://github.com/arlimus))
|
10
|
+
- Add table-style filter utility [\#681](https://github.com/chef/inspec/pull/681) ([arlimus](https://github.com/arlimus))
|
11
|
+
- added hpux user and package resource support [\#678](https://github.com/chef/inspec/pull/678) ([Anirudh-Gupta](https://github.com/Anirudh-Gupta))
|
12
|
+
|
13
|
+
**Fixed bugs:**
|
14
|
+
|
15
|
+
- Specifying an invalid target protocol should give a failure message [\#686](https://github.com/chef/inspec/issues/686)
|
16
|
+
- update compliance plugin [\#695](https://github.com/chef/inspec/pull/695) ([chris-rock](https://github.com/chris-rock))
|
17
|
+
- bugfix: restore pax\_global\_header fetcher filter [\#669](https://github.com/chef/inspec/pull/669) ([arlimus](https://github.com/arlimus))
|
18
|
+
|
19
|
+
**Closed issues:**
|
20
|
+
|
21
|
+
- How do I run an inspec profile in chef audit mode? [\#692](https://github.com/chef/inspec/issues/692)
|
22
|
+
|
23
|
+
**Merged pull requests:**
|
24
|
+
|
25
|
+
- update appveyor ruby to 2.2 + fix caching [\#697](https://github.com/chef/inspec/pull/697) ([arlimus](https://github.com/arlimus))
|
26
|
+
- update to train's new file interface: symlink + uid + gid [\#694](https://github.com/chef/inspec/pull/694) ([arlimus](https://github.com/arlimus))
|
27
|
+
- validate target backend [\#688](https://github.com/chef/inspec/pull/688) ([arlimus](https://github.com/arlimus))
|
28
|
+
- Hpux [\#682](https://github.com/chef/inspec/pull/682) ([Anirudh-Gupta](https://github.com/Anirudh-Gupta))
|
29
|
+
|
30
|
+
## [v0.19.3](https://github.com/chef/inspec/tree/v0.19.3) (2016-04-22)
|
31
|
+
[Full Changelog](https://github.com/chef/inspec/compare/v0.19.2...v0.19.3)
|
5
32
|
|
6
33
|
**Fixed bugs:**
|
7
34
|
|
@@ -9,6 +36,7 @@
|
|
9
36
|
|
10
37
|
**Merged pull requests:**
|
11
38
|
|
39
|
+
- Releasing inspec 0.19.3 [\#680](https://github.com/chef/inspec/pull/680) ([alexpop](https://github.com/alexpop))
|
12
40
|
- v0.19.2 [\#675](https://github.com/chef/inspec/pull/675) ([arlimus](https://github.com/arlimus))
|
13
41
|
|
14
42
|
## [v0.19.2](https://github.com/chef/inspec/tree/v0.19.2) (2016-04-21)
|
data/inspec.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
25
25
|
spec.require_paths = ['lib']
|
26
26
|
|
27
|
-
spec.add_dependency 'r-train', '~> 0.
|
27
|
+
spec.add_dependency 'r-train', '~> 0.11'
|
28
28
|
spec.add_dependency 'thor', '~> 0.19'
|
29
29
|
spec.add_dependency 'json', '~> 1.8'
|
30
30
|
spec.add_dependency 'rainbow', '~> 2'
|
@@ -8,6 +8,7 @@ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
|
8
8
|
module Compliance
|
9
9
|
autoload :Configuration, 'inspec-compliance/configuration'
|
10
10
|
autoload :HTTP, 'inspec-compliance/http'
|
11
|
+
autoload :Support, 'inspec-compliance/support'
|
11
12
|
autoload :API, 'inspec-compliance/api'
|
12
13
|
end
|
13
14
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
driver:
|
3
|
+
name: vagrant
|
4
|
+
synced_folders:
|
5
|
+
- ['../../../', '/inspec']
|
6
|
+
network:
|
7
|
+
- ['private_network', {ip: '192.168.251.2'}]
|
8
|
+
|
9
|
+
provisioner:
|
10
|
+
name: shell
|
11
|
+
|
12
|
+
verifier:
|
13
|
+
name: inspec
|
14
|
+
sudo: true
|
15
|
+
|
16
|
+
platforms:
|
17
|
+
- name: ubuntu-14.04
|
18
|
+
suites:
|
19
|
+
- name: default
|
20
|
+
run_list:
|
21
|
+
attributes:
|
@@ -19,3 +19,27 @@ Compliance profiles can be executed in two mays:
|
|
19
19
|
|
20
20
|
- via compliance exec: `inspec compliance exec profile`
|
21
21
|
- via compliance scheme: `inspec exec compliance://profile`
|
22
|
+
|
23
|
+
## Integration Tests
|
24
|
+
|
25
|
+
At this point of time, InSpec is not able to pick up the token directly, therefore the integration test is semi-automatic at this point of time:
|
26
|
+
|
27
|
+
* run `kitchen converge`
|
28
|
+
* open https://192.168.251.2 and log in with user `admin` and password `admin`
|
29
|
+
* click on user->about and obtain the refresh token
|
30
|
+
* run `kitchen verify` with the required env variables:
|
31
|
+
|
32
|
+
```
|
33
|
+
COMPLIANCE_REFRESH_TOKEN=myrefreshtoken COMPLIANCE_ACCESS_TOKEN=mycompliancetoken b kitchen verify
|
34
|
+
-----> Starting Kitchen (v1.7.3)
|
35
|
+
-----> Verifying <default-ubuntu-1404>...
|
36
|
+
Search `/Users/chartmann/Development/compliance/inspec/lib/bundles/inspec-compliance/test/integration/default` for tests
|
37
|
+
..................................
|
38
|
+
|
39
|
+
Finished in 6.35 seconds (files took 0.40949 seconds to load)
|
40
|
+
34 examples, 0 failures
|
41
|
+
|
42
|
+
Finished verifying <default-ubuntu-1404> (0m6.62s).
|
43
|
+
-----> Kitchen is finished. (0m7.02s)
|
44
|
+
zlib(finalizer): the stream was freed prematurely.
|
45
|
+
```
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
echo "Installing Chef Compliance $deb"
|
4
|
+
# select latest package from cache directory
|
5
|
+
# deb=$(find /inspec/.cache -name '*.deb' | tail -1)
|
6
|
+
# sudo dpkg -i $deb
|
7
|
+
|
8
|
+
# use chef compliance package repository
|
9
|
+
sudo apt-get install -y apt-transport-https
|
10
|
+
sudo apt-get install wget
|
11
|
+
wget -qO - https://downloads.chef.io/packages-chef-io-public.key | sudo apt-key add -
|
12
|
+
CHANNEL=${CHANNEL:-stable}
|
13
|
+
DISTRIBUTION=$(lsb_release --codename | cut -f2)
|
14
|
+
echo "found $DISTRIBUTION"
|
15
|
+
echo "use $CHANNEL channel"
|
16
|
+
echo "deb https://packages.chef.io/$CHANNEL-apt $DISTRIBUTION main" > /etc/apt/sources.list.d/chef-$CHANNEL.list
|
17
|
+
sudo apt-get update
|
18
|
+
sudo apt-get install chef-compliance
|
19
|
+
|
20
|
+
sudo chef-compliance-ctl reconfigure --accept-license
|
21
|
+
sudo chef-compliance-ctl restart
|
22
|
+
|
23
|
+
# build master version of inspec
|
24
|
+
sudo /opt/chef-compliance/embedded/bin/gem list inspec
|
25
|
+
|
26
|
+
cd /inspec
|
27
|
+
sudo /opt/chef-compliance/embedded/bin/gem build *.gemspec
|
28
|
+
sudo /opt/chef-compliance/embedded/bin/gem install inspec*.gem
|
29
|
+
sudo /opt/chef-compliance/embedded/bin/inspec version
|
30
|
+
sudo /opt/chef-compliance/embedded/bin/gem list inspec
|
31
|
+
|
32
|
+
# finalize setup
|
33
|
+
cd /
|
34
|
+
/opt/chef-compliance/embedded/service/core/bin/core setup --endpoint "http://127.0.0.1:10500/setup" --login "admin" --password "admin" --name "John Doe" --accept-eula
|
35
|
+
|
36
|
+
# wget --no-check-certificate http://127.0.0.1/api/version
|
37
|
+
# cat version
|
@@ -23,9 +23,9 @@ module Compliance
|
|
23
23
|
desc: 'Chef Compliance access token'
|
24
24
|
option :refresh_token, type: :string, required: false,
|
25
25
|
desc: 'Chef Compliance refresh token'
|
26
|
-
def login(server) # rubocop:disable Metrics/
|
26
|
+
def login(server) # rubocop:disable Metrics/AbcSize, PerceivedComplexity
|
27
27
|
# show warning if the Compliance Server does not support
|
28
|
-
if !Compliance::Configuration.new.supported?(:oidc)
|
28
|
+
if !Compliance::Configuration.new.supported?(:oidc)
|
29
29
|
puts 'Your server supports --user and --password only'
|
30
30
|
end
|
31
31
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
|
5
|
+
module Compliance
|
6
|
+
# is a helper that provides information which version of compliance supports
|
7
|
+
# which feature
|
8
|
+
class Support
|
9
|
+
# for a feature, returns either:
|
10
|
+
# - a version v0: v supports v0 iff v0 <= v
|
11
|
+
# - an array [v0, v1] of two versions: v supports [v0, v1] iff v0 <= v < v1
|
12
|
+
def self.version_with_support(feature)
|
13
|
+
case feature.to_sym
|
14
|
+
when :oidc # open id connect authentication
|
15
|
+
Gem::Version.new('0.16.19')
|
16
|
+
else
|
17
|
+
Gem::Version.new('0.0.0')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# determines if the given version support a certain feature
|
22
|
+
def self.supported?(feature, version)
|
23
|
+
sup = version_with_support(feature)
|
24
|
+
|
25
|
+
if sup.is_a?(Array)
|
26
|
+
Gem::Version.new(version) >= sup[0] &&
|
27
|
+
Gem::Version.new(version) < sup[1]
|
28
|
+
else
|
29
|
+
Gem::Version.new(version) >= sup
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# we do not know the version, therefore we do not know if its possible to use the feature
|
34
|
+
# return if self['version'].nil? || self['version']['version'].nil?
|
35
|
+
end
|
36
|
+
end
|
@@ -14,7 +14,7 @@ module Compliance
|
|
14
14
|
name 'compliance'
|
15
15
|
priority 500
|
16
16
|
|
17
|
-
def self.resolve(target,
|
17
|
+
def self.resolve(target, _opts = {})
|
18
18
|
# check for local scheme compliance://
|
19
19
|
uri = URI(target)
|
20
20
|
return nil unless URI(uri).scheme == 'compliance'
|
@@ -25,10 +25,8 @@ module Compliance
|
|
25
25
|
|
26
26
|
# verifies that the target e.g base/ssh exists
|
27
27
|
profile = uri.host + uri.path
|
28
|
-
Compliance::API.exist?(profile)
|
29
|
-
|
30
|
-
opts['user'] = config['token']
|
31
|
-
super(target_url(config, profile), opts)
|
28
|
+
Compliance::API.exist?(config, profile)
|
29
|
+
super(target_url(config, profile), config)
|
32
30
|
rescue URI::Error => _e
|
33
31
|
nil
|
34
32
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# options
|
4
|
+
inspec_bin = '/opt/chef-compliance/embedded/bin/inspec'
|
5
|
+
api_url = 'https://0.0.0.0'
|
6
|
+
profile = '/inspec/examples/profile'
|
7
|
+
|
8
|
+
# TODO: determine tokens automatically, define in kitchen yml
|
9
|
+
access_token = ENV['COMPLIANCE_ACCESS_TOKEN']
|
10
|
+
refresh_token = ENV['COMPLIANCE_REFRESH_TOKEN']
|
11
|
+
|
12
|
+
%w{refresh_token access_token}.each do |type|
|
13
|
+
case type
|
14
|
+
when 'access_token'
|
15
|
+
token_options = "--token '#{access_token}'"
|
16
|
+
when 'refresh_token'
|
17
|
+
token_options = "--refresh_token '#{refresh_token}'"
|
18
|
+
end
|
19
|
+
|
20
|
+
# verifies that the help command works
|
21
|
+
describe command("#{inspec_bin} compliance help") do
|
22
|
+
its('stdout') { should include 'inspec compliance help [COMMAND]' }
|
23
|
+
its('stderr') { should eq '' }
|
24
|
+
its('exit_status') { should eq 0 }
|
25
|
+
end
|
26
|
+
|
27
|
+
# login via access token token
|
28
|
+
describe command("#{inspec_bin} compliance login #{api_url} --insecure --user admin #{token_options}") do
|
29
|
+
its('stdout') { should include 'Successfully authenticated' }
|
30
|
+
its('stderr') { should eq '' }
|
31
|
+
its('exit_status') { should eq 0 }
|
32
|
+
end
|
33
|
+
|
34
|
+
# see available resources
|
35
|
+
describe command("#{inspec_bin} compliance profiles") do
|
36
|
+
its('stdout') { should include 'base/ssh' }
|
37
|
+
its('stderr') { should eq '' }
|
38
|
+
its('exit_status') { should eq 0 }
|
39
|
+
end
|
40
|
+
|
41
|
+
# upload a compliance profile
|
42
|
+
describe command("#{inspec_bin} compliance upload #{profile} --overwrite") do
|
43
|
+
its('stdout') { should include 'Profile is valid' }
|
44
|
+
its('stdout') { should include 'Successfully uploaded profile' }
|
45
|
+
its('stdout') { should_not include 'error(s)' }
|
46
|
+
its('stderr') { should eq '' }
|
47
|
+
its('exit_status') { should eq 0 }
|
48
|
+
end
|
49
|
+
|
50
|
+
# logout
|
51
|
+
describe command("#{inspec_bin} compliance logout") do
|
52
|
+
its('stdout') { should include 'Successfully logged out' }
|
53
|
+
its('stderr') { should eq '' }
|
54
|
+
its('exit_status') { should eq 0 }
|
55
|
+
end
|
56
|
+
end
|
data/lib/fetchers/url.rb
CHANGED
@@ -65,10 +65,15 @@ module Fetchers
|
|
65
65
|
|
66
66
|
# download url into archive using opts,
|
67
67
|
# returns File object and content-type from HTTP headers
|
68
|
-
def self.download_archive(url, opts)
|
68
|
+
def self.download_archive(url, opts = {})
|
69
|
+
http_opts = {}
|
70
|
+
# http_opts['http_basic_authentication'] = [opts['user'] || '', opts['password'] || ''] if opts['user']
|
71
|
+
http_opts['ssl_verify_mode'.to_sym] = OpenSSL::SSL::VERIFY_NONE if opts['insecure']
|
72
|
+
http_opts['Authorization'] = "Bearer #{opts['token']}" if opts['token']
|
73
|
+
|
69
74
|
remote = open(
|
70
75
|
url,
|
71
|
-
|
76
|
+
http_opts,
|
72
77
|
)
|
73
78
|
|
74
79
|
content_type = remote.meta['content-type']
|
data/lib/inspec/backend.rb
CHANGED
@@ -14,7 +14,7 @@ module Inspec
|
|
14
14
|
# @return [TransportBackend] enriched transport instance
|
15
15
|
def self.create(config)
|
16
16
|
conf = Train.target_config(config)
|
17
|
-
name = conf
|
17
|
+
name = Train.validate_backend(conf)
|
18
18
|
transport = Train.create(name, conf)
|
19
19
|
if transport.nil?
|
20
20
|
fail "Can't find transport backend '#{name}'."
|
data/lib/inspec/cli.rb
CHANGED
@@ -116,21 +116,13 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength
|
|
116
116
|
desc 'detect', 'detect the target OS'
|
117
117
|
target_options
|
118
118
|
def detect
|
119
|
-
|
120
|
-
|
121
|
-
rel = File.join(File.dirname(__FILE__), *%w{.. utils detect.rb})
|
122
|
-
detect_util = File.expand_path(rel)
|
123
|
-
# exits on execution:
|
124
|
-
runner = Inspec::Runner.new(opts)
|
125
|
-
profile = Inspec::Profile.for_target(detect_util, opts)
|
126
|
-
runner.add_profile(profile)
|
127
|
-
exit runner.run
|
128
|
-
rescue RuntimeError => e
|
129
|
-
puts e.message
|
119
|
+
options_json[:command] = 'os.params'
|
120
|
+
shell_func
|
130
121
|
end
|
131
122
|
|
132
123
|
desc 'shell', 'open an interactive debugging shell'
|
133
124
|
target_options
|
125
|
+
option :command, aliases: :c
|
134
126
|
option :format, type: :string, default: Inspec::NoSummaryFormatter, hide: true
|
135
127
|
def shell_func
|
136
128
|
diagnose
|
@@ -138,8 +130,16 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength
|
|
138
130
|
o[:logger] = Logger.new(STDOUT)
|
139
131
|
o[:logger].level = get_log_level(o.log_level)
|
140
132
|
|
141
|
-
|
142
|
-
|
133
|
+
if o[:command].nil?
|
134
|
+
runner = Inspec::Runner.new(o)
|
135
|
+
return Inspec::Shell.new(runner).start
|
136
|
+
else
|
137
|
+
opts[:test_collector] = 'mock'
|
138
|
+
runner = Inspec::Runner.new(opts)
|
139
|
+
res = runner.create_context.load(o[:command])
|
140
|
+
jres = res.respond_to?(:to_json) ? res.to_json : JSON.dump(res)
|
141
|
+
puts jres
|
142
|
+
end
|
143
143
|
rescue RuntimeError => e
|
144
144
|
puts e.message
|
145
145
|
end
|
data/lib/inspec/version.rb
CHANGED
data/lib/resources/file.rb
CHANGED
@@ -22,17 +22,17 @@ module Inspec::Resources
|
|
22
22
|
"
|
23
23
|
include MountParser
|
24
24
|
|
25
|
-
attr_reader :file, :
|
25
|
+
attr_reader :file, :mount_options
|
26
26
|
def initialize(path)
|
27
|
-
@
|
28
|
-
@file = inspec.backend.file(@path)
|
27
|
+
@file = inspec.backend.file(path)
|
29
28
|
end
|
30
29
|
|
31
30
|
%w{
|
32
31
|
type exist? file? block_device? character_device? socket? directory?
|
33
|
-
symlink? pipe? mode mode? owner owned_by? group grouped_into?
|
32
|
+
symlink? pipe? mode mode? owner owned_by? group grouped_into?
|
34
33
|
link_path linked_to? mtime size selinux_label immutable?
|
35
34
|
product_version file_version version? md5sum sha256sum
|
35
|
+
path source source_path uid gid
|
36
36
|
}.each do |m|
|
37
37
|
define_method m.to_sym do |*args|
|
38
38
|
file.method(m.to_sym).call(*args)
|
@@ -74,7 +74,7 @@ module Inspec::Resources
|
|
74
74
|
return file.mounted? if expected_options.nil?
|
75
75
|
|
76
76
|
# deprecation warning, this functionality will be removed in future version
|
77
|
-
warn "[DEPRECATION] `be_mounted.with and be_mounted.only_with` are deprecated. Please use `mount('#{
|
77
|
+
warn "[DEPRECATION] `be_mounted.with and be_mounted.only_with` are deprecated. Please use `mount('#{source_path}')` instead."
|
78
78
|
|
79
79
|
# we cannot read mount data on non-Linux systems
|
80
80
|
return nil if !inspec.os.linux?
|
@@ -91,22 +91,8 @@ module Inspec::Resources
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
# TODO: This is temporary and must be moved to train
|
95
|
-
def uid
|
96
|
-
res = inspec.command('stat '+Shellwords.escape(@path)+' -c %u')
|
97
|
-
return nil if res.exit_status != 0 || res.stdout.empty?
|
98
|
-
res.stdout.to_i
|
99
|
-
end
|
100
|
-
|
101
|
-
# TODO: This is temporary and must be moved to train
|
102
|
-
def gid
|
103
|
-
res = inspec.command('stat '+Shellwords.escape(@path)+' -c %u')
|
104
|
-
return nil if res.exit_status != 0 || res.stdout.empty?
|
105
|
-
res.stdout.to_i
|
106
|
-
end
|
107
|
-
|
108
94
|
def to_s
|
109
|
-
"File #{
|
95
|
+
"File #{source_path}"
|
110
96
|
end
|
111
97
|
|
112
98
|
private
|
@@ -133,11 +119,13 @@ module Inspec::Resources
|
|
133
119
|
|
134
120
|
def check_file_permission_by_user(user, flag)
|
135
121
|
if inspec.os.linux?
|
136
|
-
perm_cmd = "su -s /bin/sh -c \"test -#{flag} #{
|
122
|
+
perm_cmd = "su -s /bin/sh -c \"test -#{flag} #{source_path}\" #{user}"
|
137
123
|
elsif inspec.os.bsd? || inspec.os.solaris?
|
138
|
-
perm_cmd = "sudo -u #{user} test -#{flag} #{
|
124
|
+
perm_cmd = "sudo -u #{user} test -#{flag} #{source_path}"
|
139
125
|
elsif inspec.os.aix?
|
140
|
-
perm_cmd = "su #{user} -c test -#{flag} #{
|
126
|
+
perm_cmd = "su #{user} -c test -#{flag} #{source_path}"
|
127
|
+
elsif inspec.os.hpux?
|
128
|
+
perm_cmd = "su #{user} -c \"test -#{flag} #{source_path}\""
|
141
129
|
else
|
142
130
|
return skip_resource 'The `file` resource does not support `by_user` on your OS.'
|
143
131
|
end
|