inspec 0.9.0
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 +7 -0
- data/.gitignore +8 -0
- data/.rubocop.yml +65 -0
- data/.travis.yml +23 -0
- data/CHANGELOG.md +38 -0
- data/Gemfile +33 -0
- data/LICENSE +201 -0
- data/MAINTAINERS.md +28 -0
- data/MAINTAINERS.toml +42 -0
- data/README.md +257 -0
- data/Rakefile +47 -0
- data/bin/inspec +109 -0
- data/docs/ctl_inspec.rst +195 -0
- data/docs/dsl_inspec.rst +182 -0
- data/docs/readme.rst +100 -0
- data/docs/resources.rst +4319 -0
- data/docs/template.rst +51 -0
- data/examples/test-kitchen/.kitchen.yml +20 -0
- data/examples/test-kitchen/Berksfile +3 -0
- data/examples/test-kitchen/Gemfile +21 -0
- data/examples/test-kitchen/README.md +27 -0
- data/examples/test-kitchen/metadata.rb +7 -0
- data/examples/test-kitchen/recipes/default.rb +6 -0
- data/examples/test-kitchen/recipes/nginx.rb +30 -0
- data/examples/test-kitchen/test/integration/default/web_spec.rb +28 -0
- data/inspec.gemspec +30 -0
- data/lib/inspec.rb +20 -0
- data/lib/inspec/backend.rb +42 -0
- data/lib/inspec/dsl.rb +151 -0
- data/lib/inspec/log.rb +34 -0
- data/lib/inspec/metadata.rb +79 -0
- data/lib/inspec/plugins.rb +9 -0
- data/lib/inspec/plugins/resource.rb +62 -0
- data/lib/inspec/profile.rb +138 -0
- data/lib/inspec/profile_context.rb +170 -0
- data/lib/inspec/resource.rb +76 -0
- data/lib/inspec/rspec_json_formatter.rb +27 -0
- data/lib/inspec/rule.rb +170 -0
- data/lib/inspec/runner.rb +154 -0
- data/lib/inspec/shell.rb +66 -0
- data/lib/inspec/targets.rb +9 -0
- data/lib/inspec/targets/core.rb +27 -0
- data/lib/inspec/targets/dir.rb +67 -0
- data/lib/inspec/targets/file.rb +29 -0
- data/lib/inspec/targets/folder.rb +43 -0
- data/lib/inspec/targets/tar.rb +34 -0
- data/lib/inspec/targets/url.rb +39 -0
- data/lib/inspec/targets/zip.rb +47 -0
- data/lib/inspec/version.rb +7 -0
- data/lib/matchers/matchers.rb +221 -0
- data/lib/resources/apache.rb +29 -0
- data/lib/resources/apache_conf.rb +113 -0
- data/lib/resources/apt.rb +140 -0
- data/lib/resources/audit_policy.rb +63 -0
- data/lib/resources/auditd_conf.rb +56 -0
- data/lib/resources/auditd_rules.rb +53 -0
- data/lib/resources/bond.rb +65 -0
- data/lib/resources/bridge.rb +114 -0
- data/lib/resources/command.rb +57 -0
- data/lib/resources/csv.rb +32 -0
- data/lib/resources/directory.rb +15 -0
- data/lib/resources/etc_group.rb +150 -0
- data/lib/resources/file.rb +110 -0
- data/lib/resources/gem.rb +46 -0
- data/lib/resources/group.rb +132 -0
- data/lib/resources/host.rb +143 -0
- data/lib/resources/inetd_conf.rb +56 -0
- data/lib/resources/interface.rb +127 -0
- data/lib/resources/iptables.rb +65 -0
- data/lib/resources/json.rb +64 -0
- data/lib/resources/kernel_module.rb +40 -0
- data/lib/resources/kernel_parameter.rb +55 -0
- data/lib/resources/limits_conf.rb +55 -0
- data/lib/resources/login_def.rb +60 -0
- data/lib/resources/mysql.rb +81 -0
- data/lib/resources/mysql_conf.rb +116 -0
- data/lib/resources/mysql_session.rb +52 -0
- data/lib/resources/npm.rb +44 -0
- data/lib/resources/ntp_conf.rb +58 -0
- data/lib/resources/oneget.rb +63 -0
- data/lib/resources/os.rb +22 -0
- data/lib/resources/os_env.rb +34 -0
- data/lib/resources/package.rb +169 -0
- data/lib/resources/parse_config.rb +75 -0
- data/lib/resources/passwd.rb +93 -0
- data/lib/resources/pip.rb +75 -0
- data/lib/resources/port.rb +296 -0
- data/lib/resources/postgres.rb +37 -0
- data/lib/resources/postgres_conf.rb +87 -0
- data/lib/resources/postgres_session.rb +59 -0
- data/lib/resources/processes.rb +57 -0
- data/lib/resources/registry_key.rb +54 -0
- data/lib/resources/script.rb +34 -0
- data/lib/resources/security_policy.rb +73 -0
- data/lib/resources/service.rb +379 -0
- data/lib/resources/ssh_conf.rb +75 -0
- data/lib/resources/user.rb +374 -0
- data/lib/resources/windows_feature.rb +77 -0
- data/lib/resources/yaml.rb +23 -0
- data/lib/resources/yum.rb +154 -0
- data/lib/utils/convert.rb +12 -0
- data/lib/utils/detect.rb +15 -0
- data/lib/utils/find_files.rb +36 -0
- data/lib/utils/hash.rb +13 -0
- data/lib/utils/modulator.rb +12 -0
- data/lib/utils/parser.rb +61 -0
- data/lib/utils/simpleconfig.rb +115 -0
- data/tasks/maintainers.rb +213 -0
- data/test/docker_run.rb +156 -0
- data/test/docker_test.rb +51 -0
- data/test/helper.rb +200 -0
- data/test/integration/.kitchen.yml +42 -0
- data/test/integration/Berksfile +4 -0
- data/test/integration/cookbooks/os_prepare/metadata.rb +8 -0
- data/test/integration/cookbooks/os_prepare/recipes/apt.rb +20 -0
- data/test/integration/cookbooks/os_prepare/recipes/default.rb +9 -0
- data/test/integration/cookbooks/os_prepare/recipes/file.rb +21 -0
- data/test/integration/cookbooks/os_prepare/recipes/package.rb +26 -0
- data/test/integration/default/_debug_spec.rb +1 -0
- data/test/integration/default/apt_spec.rb +42 -0
- data/test/integration/default/file_spec.rb +109 -0
- data/test/integration/default/group_spec.rb +32 -0
- data/test/integration/default/kernel_module_spec.rb +17 -0
- data/test/integration/default/kernel_parameter_spec.rb +56 -0
- data/test/integration/default/package_spec.rb +11 -0
- data/test/integration/default/service_spec.rb +28 -0
- data/test/integration/default/user_spec.rb +44 -0
- data/test/resource/command_test.rb +33 -0
- data/test/resource/dsl_test.rb +45 -0
- data/test/resource/file_test.rb +130 -0
- data/test/resource/ssh_config.rb +9 -0
- data/test/resource/sshd_config.rb +9 -0
- data/test/test-extra.yaml +11 -0
- data/test/test.yaml +11 -0
- data/test/unit/mock/cmd/Get-NetAdapter +24 -0
- data/test/unit/mock/cmd/GetUserAccount +33 -0
- data/test/unit/mock/cmd/GetWin32Group +23 -0
- data/test/unit/mock/cmd/PATH +1 -0
- data/test/unit/mock/cmd/Resolve-DnsName +26 -0
- data/test/unit/mock/cmd/Test-NetConnection +4 -0
- data/test/unit/mock/cmd/auditctl +7 -0
- data/test/unit/mock/cmd/auditpol +2 -0
- data/test/unit/mock/cmd/brew-info-jq +1 -0
- data/test/unit/mock/cmd/chage-l-root +7 -0
- data/test/unit/mock/cmd/dpkg-s-curl +21 -0
- data/test/unit/mock/cmd/dscl +5 -0
- data/test/unit/mock/cmd/etc-apt +7 -0
- data/test/unit/mock/cmd/find-etc-rc-d-name-S +12 -0
- data/test/unit/mock/cmd/find-net-interface +9 -0
- data/test/unit/mock/cmd/gem-list-local-a-q-rubocop +1 -0
- data/test/unit/mock/cmd/get-net-tcpconnection +24 -0
- data/test/unit/mock/cmd/get-netadapter-binding-bridge +4 -0
- data/test/unit/mock/cmd/get-package-firefox +30 -0
- data/test/unit/mock/cmd/get-package-ruby +18 -0
- data/test/unit/mock/cmd/get-service-dhcp +10 -0
- data/test/unit/mock/cmd/get-windows-feature +7 -0
- data/test/unit/mock/cmd/getent-hosts-example.com +1 -0
- data/test/unit/mock/cmd/getent-passwd-root +1 -0
- data/test/unit/mock/cmd/id-chartmann +1 -0
- data/test/unit/mock/cmd/id-root +1 -0
- data/test/unit/mock/cmd/initctl-show-config-ssh +3 -0
- data/test/unit/mock/cmd/initctl-status-ssh +1 -0
- data/test/unit/mock/cmd/iptables-s +6 -0
- data/test/unit/mock/cmd/launchctl-list +3 -0
- data/test/unit/mock/cmd/ls-1-etc-init.d +2 -0
- data/test/unit/mock/cmd/ls-sys-class-net-br +2 -0
- data/test/unit/mock/cmd/lsmod +2 -0
- data/test/unit/mock/cmd/lsof-np-itcp +4 -0
- data/test/unit/mock/cmd/netstat-tulpen +5 -0
- data/test/unit/mock/cmd/npm-ls-g--json-bower +9 -0
- data/test/unit/mock/cmd/pacman-qi-curl +21 -0
- data/test/unit/mock/cmd/ping-example.com +6 -0
- data/test/unit/mock/cmd/pip-show-jinja2 +11 -0
- data/test/unit/mock/cmd/ps-aux +3 -0
- data/test/unit/mock/cmd/pw-usershow-root-7 +1 -0
- data/test/unit/mock/cmd/reg_schedule +1 -0
- data/test/unit/mock/cmd/rpm-qia-curl +24 -0
- data/test/unit/mock/cmd/sbin_sysctl +1 -0
- data/test/unit/mock/cmd/secedit-export +7 -0
- data/test/unit/mock/cmd/service-e +2 -0
- data/test/unit/mock/cmd/service-sendmail-onestatus +3 -0
- data/test/unit/mock/cmd/service-sshd-status +1 -0
- data/test/unit/mock/cmd/sockstat +5 -0
- data/test/unit/mock/cmd/success +0 -0
- data/test/unit/mock/cmd/systemctl-show-all-sshd +6 -0
- data/test/unit/mock/cmd/win32_product +8 -0
- data/test/unit/mock/cmd/yum-repolist-all +52 -0
- data/test/unit/mock/files/auditd.conf +4 -0
- data/test/unit/mock/files/bond0 +37 -0
- data/test/unit/mock/files/etcgroup +3 -0
- data/test/unit/mock/files/example.csv +6 -0
- data/test/unit/mock/files/inetd.conf +2 -0
- data/test/unit/mock/files/kitchen.yml +7 -0
- data/test/unit/mock/files/limits.conf +5 -0
- data/test/unit/mock/files/login.defs +5 -0
- data/test/unit/mock/files/mysql.conf +8 -0
- data/test/unit/mock/files/mysql2.conf +2 -0
- data/test/unit/mock/files/ntp.conf +5 -0
- data/test/unit/mock/files/passwd +2 -0
- data/test/unit/mock/files/policyfile.lock.json +12 -0
- data/test/unit/mock/files/ssh_config +5 -0
- data/test/unit/mock/files/sshd_config +7 -0
- data/test/unit/mock/profiles/empty/metadata.rb +0 -0
- data/test/unit/mock/profiles/metadata/metadata.rb +1 -0
- data/test/unit/profile_context_test.rb +140 -0
- data/test/unit/profile_test.rb +49 -0
- data/test/unit/resources/apt_test.rb +46 -0
- data/test/unit/resources/audit_policy_test.rb +13 -0
- data/test/unit/resources/auditd_conf_test.rb +15 -0
- data/test/unit/resources/auditd_rules_test.rb +21 -0
- data/test/unit/resources/bond_test.rb +24 -0
- data/test/unit/resources/bridge_test.rb +56 -0
- data/test/unit/resources/csv_test.rb +35 -0
- data/test/unit/resources/etc_group_test.rb +37 -0
- data/test/unit/resources/gem_test.rb +20 -0
- data/test/unit/resources/group_test.rb +96 -0
- data/test/unit/resources/host_test.rb +38 -0
- data/test/unit/resources/inetd_conf_test.rb +15 -0
- data/test/unit/resources/interface_test.rb +54 -0
- data/test/unit/resources/iptables_test.rb +30 -0
- data/test/unit/resources/json_test.rb +36 -0
- data/test/unit/resources/kernel_module_test.rb +23 -0
- data/test/unit/resources/kernel_parameter_test.rb +13 -0
- data/test/unit/resources/limits_conf_test.rb +14 -0
- data/test/unit/resources/login_def_test.rb +16 -0
- data/test/unit/resources/mysql_conf_test.rb +14 -0
- data/test/unit/resources/npm_test.rb +20 -0
- data/test/unit/resources/ntp_conf_test.rb +16 -0
- data/test/unit/resources/oneget_test.rb +45 -0
- data/test/unit/resources/os_env_test.rb +13 -0
- data/test/unit/resources/package_test.rb +51 -0
- data/test/unit/resources/passwd_test.rb +24 -0
- data/test/unit/resources/pip_test.rb +15 -0
- data/test/unit/resources/port_test.rb +46 -0
- data/test/unit/resources/processes_test.rb +32 -0
- data/test/unit/resources/registry_key_test.rb +19 -0
- data/test/unit/resources/script_test.rb +19 -0
- data/test/unit/resources/security_policy_test.rb +16 -0
- data/test/unit/resources/service_test.rb +116 -0
- data/test/unit/resources/ssh_conf_test.rb +33 -0
- data/test/unit/resources/user_test.rb +93 -0
- data/test/unit/resources/windows_feature.rb +17 -0
- data/test/unit/resources/yaml_test.rb +34 -0
- data/test/unit/resources/yum_test.rb +68 -0
- data/test/unit/simpleconfig_test.rb +80 -0
- data/test/unit/utils/content_parser_test.rb +30 -0
- metadata +555 -0
data/docs/template.rst
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
resource_name
|
|
2
|
+
=====================================================
|
|
3
|
+
Use the ``resource_name`` audit resource to xxxxx.
|
|
4
|
+
|
|
5
|
+
Syntax
|
|
6
|
+
-----------------------------------------------------
|
|
7
|
+
A ``resource_name`` audit resource block declares xxxxx. For example:
|
|
8
|
+
|
|
9
|
+
.. code-block:: ruby
|
|
10
|
+
|
|
11
|
+
describe xxxxx(xxxxx) do
|
|
12
|
+
it { should xxxxx }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
where
|
|
16
|
+
|
|
17
|
+
* ``xxxxx`` must specify xxxxx
|
|
18
|
+
* xxxxx
|
|
19
|
+
* ``xxxxx`` is a valid matcher for this audit resource
|
|
20
|
+
|
|
21
|
+
Matchers
|
|
22
|
+
-----------------------------------------------------
|
|
23
|
+
This audit resource has the following matchers.
|
|
24
|
+
|
|
25
|
+
xxxxx
|
|
26
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
27
|
+
The ``xxxxx`` matcher tests if xxxxx. For example:
|
|
28
|
+
|
|
29
|
+
.. code-block:: ruby
|
|
30
|
+
|
|
31
|
+
it { should xxxxx }
|
|
32
|
+
|
|
33
|
+
xxxxx
|
|
34
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
35
|
+
The ``xxxxx`` matcher tests if xxxxx. For example:
|
|
36
|
+
|
|
37
|
+
.. code-block:: ruby
|
|
38
|
+
|
|
39
|
+
it { should xxxxx }
|
|
40
|
+
|
|
41
|
+
Examples
|
|
42
|
+
-----------------------------------------------------
|
|
43
|
+
The following examples show how to use this audit resource in a recipe.
|
|
44
|
+
|
|
45
|
+
**xxxxx**
|
|
46
|
+
|
|
47
|
+
xxxxx
|
|
48
|
+
|
|
49
|
+
**xxxxx**
|
|
50
|
+
|
|
51
|
+
xxxxx
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
driver:
|
|
3
|
+
name: vagrant
|
|
4
|
+
|
|
5
|
+
provisioner:
|
|
6
|
+
name: chef_solo
|
|
7
|
+
|
|
8
|
+
verifier:
|
|
9
|
+
name: inspec
|
|
10
|
+
|
|
11
|
+
platforms:
|
|
12
|
+
- name: centos-7.1
|
|
13
|
+
- name: ubuntu-12.04
|
|
14
|
+
- name: ubuntu-14.04
|
|
15
|
+
|
|
16
|
+
suites:
|
|
17
|
+
- name: default
|
|
18
|
+
run_list:
|
|
19
|
+
- recipe[prepare]
|
|
20
|
+
attributes:
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
source 'https://rubygems.org'
|
|
3
|
+
|
|
4
|
+
gem 'inspec', path: '../../.'
|
|
5
|
+
gem 'train', git: 'git@github.com:chef/train.git'
|
|
6
|
+
|
|
7
|
+
group :test do
|
|
8
|
+
gem 'bundler', '~> 1.5'
|
|
9
|
+
gem 'minitest', '~> 5.5'
|
|
10
|
+
gem 'rake', '~> 10'
|
|
11
|
+
gem 'rubocop', '~> 0.33.0'
|
|
12
|
+
gem 'simplecov', '~> 0.10'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
group :integration do
|
|
16
|
+
gem 'berkshelf', '~> 4.0'
|
|
17
|
+
gem 'test-kitchen', '~> 1.4'
|
|
18
|
+
gem 'kitchen-vagrant'
|
|
19
|
+
gem 'kitchen-inspec', git: 'git@github.com:chef/kitchen-inspec.git'
|
|
20
|
+
gem 'concurrent-ruby', '~> 0.9'
|
|
21
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# InSpec Test-Kitchen Example
|
|
2
|
+
|
|
3
|
+
This example demonstrates a complete roundtrip via [Test-Kitchen](http://kitchen.ci/).
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
# install all dependencies
|
|
7
|
+
$ bundle install
|
|
8
|
+
# show all available tests
|
|
9
|
+
$ bundle exec kitchen list
|
|
10
|
+
Instance Driver Provisioner Verifier Transport Last Action
|
|
11
|
+
default-centos-71 Vagrant ChefSolo InSpec Ssh <Not Created>
|
|
12
|
+
default-ubuntu-1204 Vagrant ChefSolo InSpec Ssh <Not Created>
|
|
13
|
+
default-ubuntu-1404 Vagrant ChefSolo InSpec Ssh <Not Created>
|
|
14
|
+
|
|
15
|
+
# Now we are ready to run a complete test
|
|
16
|
+
$ bundle exec kitchen test default-ubuntu-1404
|
|
17
|
+
-----> Starting Kitchen (v1.4.2)
|
|
18
|
+
-----> Verifying <default-ubuntu-1404>...
|
|
19
|
+
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
Finished in 0.03241 seconds (files took 0.22475 seconds to load)
|
|
23
|
+
5 examples, 0 failures
|
|
24
|
+
|
|
25
|
+
Finished verifying <default-ubuntu-1404> (0m0.16s).
|
|
26
|
+
-----> Kitchen is finished. (0m0.82s)
|
|
27
|
+
```
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# author: Christoph Hartmann
|
|
3
|
+
# author: Dominik Richter
|
|
4
|
+
|
|
5
|
+
# install repositories for nginx
|
|
6
|
+
case node['platform']
|
|
7
|
+
when 'ubuntu'
|
|
8
|
+
include_recipe('apt')
|
|
9
|
+
# if ubuntu, install
|
|
10
|
+
apt_repository 'nginx-php' do
|
|
11
|
+
uri 'ppa:nginx/stable'
|
|
12
|
+
distribution node['lsb']['codename']
|
|
13
|
+
end
|
|
14
|
+
when 'centos'
|
|
15
|
+
# add repo for Centos 7
|
|
16
|
+
yum_repository 'nginx' do
|
|
17
|
+
description 'Nginx Repo'
|
|
18
|
+
baseurl 'http://nginx.org/packages/centos/7/x86_64'
|
|
19
|
+
gpgkey 'http://nginx.org/keys/nginx_signing.key'
|
|
20
|
+
action :create
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# install nginx package
|
|
25
|
+
package 'nginx'
|
|
26
|
+
|
|
27
|
+
# start the service
|
|
28
|
+
service 'nginx' do
|
|
29
|
+
action :start
|
|
30
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# author: Christoph Hartmann
|
|
3
|
+
# author: Dominik Richter
|
|
4
|
+
|
|
5
|
+
# use basic tests
|
|
6
|
+
describe package('nginx') do
|
|
7
|
+
it { should be_installed }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# extend tests with metadata
|
|
11
|
+
rule '01' do
|
|
12
|
+
impact 0.7
|
|
13
|
+
title 'Verify nginx service'
|
|
14
|
+
desc 'Ensures nginx service is up and running'
|
|
15
|
+
describe service('nginx') do
|
|
16
|
+
it { should be_enabled }
|
|
17
|
+
it { should be_installed }
|
|
18
|
+
it { should be_running }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# implement os dependent tests
|
|
23
|
+
web_user = 'www-data'
|
|
24
|
+
web_user = 'nginx' if os[:family] == 'centos'
|
|
25
|
+
|
|
26
|
+
describe user(web_user) do
|
|
27
|
+
it { should exist }
|
|
28
|
+
end
|
data/inspec.gemspec
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'inspec/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = 'inspec'
|
|
8
|
+
spec.version = Inspec::VERSION
|
|
9
|
+
spec.authors = ['Dominik Richter']
|
|
10
|
+
spec.email = ['dominik.richter@gmail.com']
|
|
11
|
+
spec.summary = 'Validate Inspec compliance checks'
|
|
12
|
+
spec.description = 'Validate Inspec compliance checks.'
|
|
13
|
+
spec.homepage = 'https://github.com/chef/inspec'
|
|
14
|
+
spec.license = 'Apache 2.0'
|
|
15
|
+
|
|
16
|
+
spec.files = `hash git 2>/dev/null && git ls-files -z`.split("\x0").find_all { |x| x !~ /^\.delivery/ }
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ['lib']
|
|
20
|
+
|
|
21
|
+
spec.add_dependency 'r-train', '~> 0.9'
|
|
22
|
+
spec.add_dependency 'thor', '~> 0.19'
|
|
23
|
+
spec.add_dependency 'json', '~> 1.8'
|
|
24
|
+
spec.add_dependency 'rainbow', '~> 2'
|
|
25
|
+
spec.add_dependency 'method_source', '~> 0.8'
|
|
26
|
+
spec.add_dependency 'rubyzip', '~> 1.1'
|
|
27
|
+
spec.add_dependency 'rspec', '~> 3.3'
|
|
28
|
+
spec.add_dependency 'rspec-its', '~> 1.2'
|
|
29
|
+
spec.add_dependency 'pry', '~> 0.10'
|
|
30
|
+
end
|
data/lib/inspec.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# copyright: 2015, Dominik Richter
|
|
3
|
+
# license: All rights reserved
|
|
4
|
+
# author: Dominik Richter
|
|
5
|
+
# author: Christoph Hartmann
|
|
6
|
+
|
|
7
|
+
Encoding.default_external = Encoding::UTF_8
|
|
8
|
+
Encoding.default_internal = Encoding::UTF_8
|
|
9
|
+
|
|
10
|
+
libdir = File.dirname(__FILE__)
|
|
11
|
+
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
|
12
|
+
|
|
13
|
+
require 'inspec/version'
|
|
14
|
+
require 'inspec/profile'
|
|
15
|
+
require 'inspec/resource'
|
|
16
|
+
require 'inspec/rspec_json_formatter'
|
|
17
|
+
require 'inspec/rule'
|
|
18
|
+
require 'inspec/runner'
|
|
19
|
+
require 'inspec/shell'
|
|
20
|
+
require 'matchers/matchers'
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# copyright: 2015, Dominik Richter
|
|
3
|
+
# license: All rights reserved
|
|
4
|
+
# author: Dominik Richter
|
|
5
|
+
# author: Christoph Hartmann
|
|
6
|
+
|
|
7
|
+
require 'train'
|
|
8
|
+
|
|
9
|
+
module Inspec
|
|
10
|
+
module Backend
|
|
11
|
+
# Create the transport backend with aggregated resources.
|
|
12
|
+
#
|
|
13
|
+
# @param [Hash] config for the transport backend
|
|
14
|
+
# @return [TransportBackend] enriched transport instance
|
|
15
|
+
def self.create(config)
|
|
16
|
+
conf = Train.target_config(config)
|
|
17
|
+
name = conf[:backend] || :local
|
|
18
|
+
transport = Train.create(name, conf)
|
|
19
|
+
if transport.nil?
|
|
20
|
+
fail "Can't find transport backend '#{name}'."
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
connection = transport.connection
|
|
24
|
+
if connection.nil?
|
|
25
|
+
fail "Can't connect to transport backend '#{name}'."
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
cls = Class.new do
|
|
29
|
+
define_method :backend do
|
|
30
|
+
connection
|
|
31
|
+
end
|
|
32
|
+
Inspec::Resource.registry.each do |id, r|
|
|
33
|
+
define_method id.to_sym do |*args|
|
|
34
|
+
r.new(self, id.to_s, *args)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
cls.new
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
data/lib/inspec/dsl.rb
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# copyright: 2015, Dominik Richter
|
|
3
|
+
# license: All rights reserved
|
|
4
|
+
# author: Dominik Richter
|
|
5
|
+
# author: Christoph Hartmann
|
|
6
|
+
|
|
7
|
+
module Inspec::DSL
|
|
8
|
+
def require_controls(id, &block)
|
|
9
|
+
::Inspec::DSL.load_spec_files_for_profile self, id, false, &block
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def include_controls(id, &block)
|
|
13
|
+
::Inspec::DSL.load_spec_files_for_profile self, id, true, &block
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
alias_method :require_rules, :require_controls
|
|
17
|
+
alias_method :include_rules, :include_controls
|
|
18
|
+
|
|
19
|
+
# Register a given rule with RSpec and
|
|
20
|
+
# let it run. This happens after everything
|
|
21
|
+
# else is merged in.
|
|
22
|
+
def self.execute_rule(r, profile_id)
|
|
23
|
+
checks = r.instance_variable_get(:@checks)
|
|
24
|
+
fid = InspecBaseRule.full_id(r, profile_id)
|
|
25
|
+
checks.each do |m, a, b|
|
|
26
|
+
# check if the resource is skippable and skipped
|
|
27
|
+
if a.is_a?(Array) && !a.empty? &&
|
|
28
|
+
a[0].respond_to?(:resource_skipped) &&
|
|
29
|
+
!a[0].resource_skipped.nil?
|
|
30
|
+
cres = ::Inspec::Rule.__send__(m, *a) do
|
|
31
|
+
it a[0].resource_skipped
|
|
32
|
+
end
|
|
33
|
+
else
|
|
34
|
+
# execute the method
|
|
35
|
+
cres = ::Inspec::Rule.__send__(m, *a, &b)
|
|
36
|
+
end
|
|
37
|
+
if m == 'describe'
|
|
38
|
+
set_rspec_ids(cres, fid)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
# merge two rules completely; all defined
|
|
46
|
+
# fields from src will be overwritten in dst
|
|
47
|
+
def self.merge_rules(dst, src)
|
|
48
|
+
InspecBaseRule.merge dst, src
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Attach an ID attribute to the
|
|
52
|
+
# metadata of all examples
|
|
53
|
+
# TODO: remove this once IDs are in rspec-core
|
|
54
|
+
def self.set_rspec_ids(obj, id)
|
|
55
|
+
obj.examples.each {|ex|
|
|
56
|
+
ex.metadata[:id] = id
|
|
57
|
+
}
|
|
58
|
+
obj.children.each {|c|
|
|
59
|
+
set_rspec_ids(c, id)
|
|
60
|
+
}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.load_spec_file_for_profile(profile_id, file, rule_registry, only_ifs)
|
|
64
|
+
raw = File.read(file)
|
|
65
|
+
# TODO: error-handling
|
|
66
|
+
|
|
67
|
+
ctx = Inspec::ProfileContext.new(profile_id, rule_registry, only_ifs)
|
|
68
|
+
ctx.instance_eval(raw, file, 1)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.load_spec_files_for_profile(bind_context, profile_id, include_all, &block)
|
|
72
|
+
# get all spec files
|
|
73
|
+
files = get_spec_files_for_profile profile_id
|
|
74
|
+
# load all rules from spec files
|
|
75
|
+
rule_registry = {}
|
|
76
|
+
# TODO: handling of only_ifs
|
|
77
|
+
only_ifs = []
|
|
78
|
+
files.each do |file|
|
|
79
|
+
load_spec_file_for_profile(profile_id, file, rule_registry, only_ifs)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# interpret the block and create a set of rules from it
|
|
83
|
+
block_registry = {}
|
|
84
|
+
if block_given?
|
|
85
|
+
ctx = Inspec::ProfileContext.new(profile_id, block_registry, only_ifs)
|
|
86
|
+
ctx.instance_eval(&block)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# if all rules are not included, select only the ones
|
|
90
|
+
# that were defined in the block
|
|
91
|
+
unless include_all
|
|
92
|
+
remove = rule_registry.keys - block_registry.keys
|
|
93
|
+
remove.each { |key| rule_registry.delete(key) }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# merge the rules in the block_registry (adjustments) with
|
|
97
|
+
# the rules in the rule_registry (included)
|
|
98
|
+
block_registry.each do |id, r|
|
|
99
|
+
org = rule_registry[id]
|
|
100
|
+
if org.nil?
|
|
101
|
+
# TODO: print error because we write alter a rule that doesn't exist
|
|
102
|
+
elsif r.nil?
|
|
103
|
+
rule_registry.delete(id)
|
|
104
|
+
else
|
|
105
|
+
merge_rules(org, r)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# finally register all combined rules
|
|
110
|
+
rule_registry.each do |_id, rule|
|
|
111
|
+
bind_context.__register_rule rule
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def self.get_spec_files_for_profile(id)
|
|
116
|
+
base_path = '/etc/inspec/tests'
|
|
117
|
+
path = File.join(base_path, id)
|
|
118
|
+
# find all files to be included
|
|
119
|
+
files = []
|
|
120
|
+
if File.directory? path
|
|
121
|
+
# include all library paths, if they exist
|
|
122
|
+
libdir = File.join(path, 'lib')
|
|
123
|
+
if File.directory? libdir and !$LOAD_PATH.include?(libdir)
|
|
124
|
+
$LOAD_PATH.unshift(libdir)
|
|
125
|
+
end
|
|
126
|
+
files = Dir[File.join(path, 'spec', '*_spec.rb')]
|
|
127
|
+
end
|
|
128
|
+
files
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
module Inspec::GlobalDSL
|
|
133
|
+
def __register_rule(r)
|
|
134
|
+
# make sure the profile id is attached to the rule
|
|
135
|
+
::Inspec::DSL.execute_rule(r, __profile_id)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def __unregister_rule(_id)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
module Inspec::DSLHelper
|
|
143
|
+
def self.bind_dsl(scope)
|
|
144
|
+
(class << scope; self; end).class_exec do
|
|
145
|
+
include Inspec::DSL
|
|
146
|
+
include Inspec::GlobalDSL
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
::Inspec::DSLHelper.bind_dsl(self)
|