inspec 0.30.0 → 0.31.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +50 -2
- data/Gemfile +2 -1
- data/docs/cli.rst +1 -17
- data/docs/resources.rst +128 -0
- data/docs/shell.rst +130 -0
- data/inspec.gemspec +3 -4
- data/lib/bundles/inspec-compliance/.kitchen.yml +0 -1
- data/lib/bundles/inspec-compliance/README.md +8 -3
- data/lib/bundles/inspec-compliance/api.rb +21 -6
- data/lib/bundles/inspec-compliance/bootstrap.sh +13 -9
- data/lib/bundles/inspec-compliance/cli.rb +23 -19
- data/lib/bundles/inspec-compliance/target.rb +1 -0
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +42 -5
- data/lib/bundles/inspec-init/cli.rb +9 -0
- data/lib/bundles/inspec-supermarket/cli.rb +9 -0
- data/lib/bundles/inspec-supermarket/target.rb +2 -1
- data/lib/fetchers/local.rb +5 -2
- data/lib/fetchers/url.rb +1 -0
- data/lib/inspec/base_cli.rb +2 -1
- data/lib/inspec/cli.rb +14 -5
- data/lib/inspec/dependencies/dependency_set.rb +38 -0
- data/lib/inspec/dependencies/requirement.rb +103 -0
- data/lib/inspec/{dependencies.rb → dependencies/resolver.rb} +13 -132
- data/lib/inspec/dependencies/vendor_index.rb +98 -0
- data/lib/inspec/plugins/source_reader.rb +4 -0
- data/lib/inspec/profile.rb +2 -2
- data/lib/inspec/resource.rb +2 -0
- data/lib/inspec/runner.rb +13 -1
- data/lib/inspec/runner_mock.rb +4 -0
- data/lib/inspec/runner_rspec.rb +6 -2
- data/lib/inspec/shell.rb +22 -1
- data/lib/inspec/version.rb +1 -1
- data/lib/resources/iis_site.rb +107 -0
- data/lib/resources/port.rb +11 -4
- data/lib/resources/ssh_conf.rb +10 -2
- data/lib/resources/ssl.rb +94 -0
- data/lib/resources/xinetd.rb +11 -2
- data/lib/utils/parser.rb +6 -1
- metadata +17 -561
- data/lib/utils/hash_map.rb +0 -37
- data/tasks/maintainers.rb +0 -213
- data/test/bench/startup/startup.flat.txt +0 -1005
- data/test/bench/startup/startup.graph.html +0 -71958
- data/test/bench/startup/startup.grind.dat +0 -101602
- data/test/bench/startup/startup.stack.html +0 -24516
- data/test/bench/startup.flat.txt +0 -998
- data/test/bench/startup.graph.html +0 -71420
- data/test/bench/startup.grind.dat +0 -103554
- data/test/bench/startup.stack.html +0 -25015
- data/test/cookbooks/os_prepare/attributes/default.rb +0 -2
- data/test/cookbooks/os_prepare/files/empty.iso +0 -0
- data/test/cookbooks/os_prepare/files/example.csv +0 -7
- data/test/cookbooks/os_prepare/files/example.ini +0 -6
- data/test/cookbooks/os_prepare/files/example.json +0 -12
- data/test/cookbooks/os_prepare/files/example.yml +0 -7
- data/test/cookbooks/os_prepare/metadata.rb +0 -13
- data/test/cookbooks/os_prepare/recipes/_runit_service_centos.rb +0 -34
- data/test/cookbooks/os_prepare/recipes/_upstart_service_centos.rb +0 -25
- data/test/cookbooks/os_prepare/recipes/apache.rb +0 -14
- data/test/cookbooks/os_prepare/recipes/apt.rb +0 -20
- data/test/cookbooks/os_prepare/recipes/auditctl.rb +0 -8
- data/test/cookbooks/os_prepare/recipes/default.rb +0 -29
- data/test/cookbooks/os_prepare/recipes/file.rb +0 -46
- data/test/cookbooks/os_prepare/recipes/iptables.rb +0 -13
- data/test/cookbooks/os_prepare/recipes/json_yaml_csv_ini.rb +0 -34
- data/test/cookbooks/os_prepare/recipes/mount.rb +0 -33
- data/test/cookbooks/os_prepare/recipes/package.rb +0 -25
- data/test/cookbooks/os_prepare/recipes/postgres.rb +0 -20
- data/test/cookbooks/os_prepare/recipes/prep_container.rb +0 -15
- data/test/cookbooks/os_prepare/recipes/registry_key.rb +0 -87
- data/test/cookbooks/os_prepare/recipes/service.rb +0 -19
- data/test/cookbooks/os_prepare/templates/default/sv-default-svlog-run.erb +0 -2
- data/test/docker_run.rb +0 -162
- data/test/docker_test.rb +0 -58
- data/test/functional/helper.rb +0 -37
- data/test/functional/inheritance_test.rb +0 -62
- data/test/functional/inspec_archive_test.rb +0 -80
- data/test/functional/inspec_compliance_test.rb +0 -61
- data/test/functional/inspec_exec_json_test.rb +0 -122
- data/test/functional/inspec_exec_jsonmin_test.rb +0 -59
- data/test/functional/inspec_exec_test.rb +0 -123
- data/test/functional/inspec_json_profile_test.rb +0 -103
- data/test/functional/inspec_test.rb +0 -91
- data/test/helper.rb +0 -329
- data/test/integration/default/_debug_spec.rb +0 -8
- data/test/integration/default/apache_conf_spec.rb +0 -21
- data/test/integration/default/apt_spec.rb +0 -37
- data/test/integration/default/auditd_rules_spec.rb +0 -32
- data/test/integration/default/cmp_matcher_spec.rb +0 -115
- data/test/integration/default/csv_spec.rb +0 -11
- data/test/integration/default/etc_group_spec.rb +0 -29
- data/test/integration/default/file_spec.rb +0 -195
- data/test/integration/default/group_spec.rb +0 -59
- data/test/integration/default/ini_spec.rb +0 -11
- data/test/integration/default/iptables_spec.rb +0 -29
- data/test/integration/default/json_spec.rb +0 -11
- data/test/integration/default/kernel_module_spec.rb +0 -23
- data/test/integration/default/kernel_parameter_spec.rb +0 -60
- data/test/integration/default/mount_spec.rb +0 -19
- data/test/integration/default/os_spec.rb +0 -13
- data/test/integration/default/package_spec.rb +0 -30
- data/test/integration/default/port_spec.rb +0 -27
- data/test/integration/default/postgres_session_spec.rb +0 -13
- data/test/integration/default/powershell_spec.rb +0 -42
- data/test/integration/default/registry_key_spec.rb +0 -109
- data/test/integration/default/secpol_spec.rb +0 -11
- data/test/integration/default/service_spec.rb +0 -128
- data/test/integration/default/user_spec.rb +0 -96
- data/test/integration/default/vbscript_spec.rb +0 -22
- data/test/integration/default/wmi_spec.rb +0 -66
- data/test/integration/default/yaml_spec.rb +0 -11
- data/test/resource/command_test.rb +0 -33
- data/test/resource/dsl_test.rb +0 -45
- data/test/resource/file_test.rb +0 -146
- data/test/resource/ssh_config.rb +0 -9
- data/test/resource/sshd_config.rb +0 -9
- data/test/test-extra.yaml +0 -11
- data/test/test.yaml +0 -11
- data/test/unit/control_test.rb +0 -58
- data/test/unit/fetchers/local_test.rb +0 -67
- data/test/unit/fetchers/mock_test.rb +0 -43
- data/test/unit/fetchers/tar_test.rb +0 -36
- data/test/unit/fetchers/url_test.rb +0 -152
- data/test/unit/fetchers/zip_test.rb +0 -36
- data/test/unit/fetchers_test.rb +0 -65
- data/test/unit/metadata_test.rb +0 -137
- data/test/unit/mock/cmd/$env-PATH +0 -1
- data/test/unit/mock/cmd/Get-NetAdapter +0 -24
- data/test/unit/mock/cmd/GetUserAccount +0 -33
- data/test/unit/mock/cmd/GetWin32Group +0 -23
- data/test/unit/mock/cmd/Resolve-DnsName +0 -26
- data/test/unit/mock/cmd/Test-NetConnection +0 -4
- data/test/unit/mock/cmd/auditctl +0 -3
- data/test/unit/mock/cmd/auditctl-legacy +0 -7
- data/test/unit/mock/cmd/auditctl-s +0 -8
- data/test/unit/mock/cmd/auditpol +0 -2
- data/test/unit/mock/cmd/brew-info-jq +0 -1
- data/test/unit/mock/cmd/chage-l-root +0 -7
- data/test/unit/mock/cmd/dpkg-s-curl +0 -21
- data/test/unit/mock/cmd/dscl +0 -5
- data/test/unit/mock/cmd/env +0 -1
- data/test/unit/mock/cmd/etc-apt +0 -7
- data/test/unit/mock/cmd/find-apache2-conf-enabled +0 -1
- data/test/unit/mock/cmd/find-apache2-ports-conf +0 -1
- data/test/unit/mock/cmd/find-etc-rc-d-name-S +0 -12
- data/test/unit/mock/cmd/find-net-interface +0 -9
- data/test/unit/mock/cmd/find-xinetd.d +0 -2
- data/test/unit/mock/cmd/gem-list-local-a-q-rubocop +0 -1
- data/test/unit/mock/cmd/get-net-tcpconnection +0 -24
- data/test/unit/mock/cmd/get-netadapter-binding-bridge +0 -4
- data/test/unit/mock/cmd/get-package-firefox +0 -30
- data/test/unit/mock/cmd/get-package-ruby +0 -18
- data/test/unit/mock/cmd/get-service-dhcp +0 -10
- data/test/unit/mock/cmd/get-windows-feature +0 -7
- data/test/unit/mock/cmd/get-wmiobject +0 -9
- data/test/unit/mock/cmd/getent-hosts-example.com +0 -1
- data/test/unit/mock/cmd/getent-passwd-jfolmer +0 -1
- data/test/unit/mock/cmd/getent-passwd-root +0 -1
- data/test/unit/mock/cmd/hpux-netstat-inet +0 -10
- data/test/unit/mock/cmd/hpux-netstat-inet6 +0 -11
- data/test/unit/mock/cmd/id-chartmann +0 -1
- data/test/unit/mock/cmd/id-jfolmer +0 -1
- data/test/unit/mock/cmd/id-root +0 -1
- data/test/unit/mock/cmd/initctl--version +0 -5
- data/test/unit/mock/cmd/initctl-show-config-ssh +0 -3
- data/test/unit/mock/cmd/initctl-status-ssh +0 -1
- data/test/unit/mock/cmd/iptables-s +0 -6
- data/test/unit/mock/cmd/launchctl-list +0 -3
- data/test/unit/mock/cmd/logins-x +0 -4
- data/test/unit/mock/cmd/ls-1-etc-init.d +0 -2
- data/test/unit/mock/cmd/ls-sys-class-net-br +0 -2
- data/test/unit/mock/cmd/lsmod +0 -2
- data/test/unit/mock/cmd/lsof-nP-i-FpctPn +0 -63
- data/test/unit/mock/cmd/mount +0 -1
- data/test/unit/mock/cmd/mount-multiple +0 -2
- data/test/unit/mock/cmd/netstat-an.utf8 +0 -13
- data/test/unit/mock/cmd/netstat-tulpen +0 -6
- data/test/unit/mock/cmd/npm-ls-g--json-bower +0 -9
- data/test/unit/mock/cmd/pacman-qi-curl +0 -21
- data/test/unit/mock/cmd/ping-example.com +0 -6
- data/test/unit/mock/cmd/pip-show-jinja2 +0 -11
- data/test/unit/mock/cmd/pkg-info-system-file-system-zfs +0 -8
- data/test/unit/mock/cmd/pkginfo-l-SUNWzfsr +0 -7
- data/test/unit/mock/cmd/ps-aux +0 -5
- data/test/unit/mock/cmd/ps-auxZ +0 -3
- data/test/unit/mock/cmd/pw-usershow-root-7 +0 -1
- data/test/unit/mock/cmd/reg_schedule +0 -6
- data/test/unit/mock/cmd/rpm-qia-curl +0 -24
- data/test/unit/mock/cmd/s11-netstat-an-finet-finet6 +0 -32
- data/test/unit/mock/cmd/sbin_sysctl +0 -1
- data/test/unit/mock/cmd/secedit-export +0 -7
- data/test/unit/mock/cmd/service-e +0 -2
- data/test/unit/mock/cmd/service-sendmail-onestatus +0 -3
- data/test/unit/mock/cmd/service-sshd-status +0 -1
- data/test/unit/mock/cmd/sockstat +0 -5
- data/test/unit/mock/cmd/success +0 -0
- data/test/unit/mock/cmd/swlist-l-product +0 -1
- data/test/unit/mock/cmd/systemctl-show-all-dbus +0 -6
- data/test/unit/mock/cmd/systemctl-show-all-sshd +0 -7
- data/test/unit/mock/cmd/win32_product +0 -8
- data/test/unit/mock/cmd/yum-repolist-all +0 -52
- data/test/unit/mock/files/apache2.conf +0 -14
- data/test/unit/mock/files/auditd.conf +0 -4
- data/test/unit/mock/files/bond0 +0 -37
- data/test/unit/mock/files/etcgroup +0 -3
- data/test/unit/mock/files/example.csv +0 -6
- data/test/unit/mock/files/grub.conf +0 -21
- data/test/unit/mock/files/inetd.conf +0 -2
- data/test/unit/mock/files/kitchen.yml +0 -7
- data/test/unit/mock/files/limits.conf +0 -5
- data/test/unit/mock/files/login.defs +0 -5
- data/test/unit/mock/files/mysql.conf +0 -8
- data/test/unit/mock/files/mysql2.conf +0 -2
- data/test/unit/mock/files/ntp.conf +0 -5
- data/test/unit/mock/files/passwd +0 -2
- data/test/unit/mock/files/policyfile.lock.json +0 -12
- data/test/unit/mock/files/ports.conf +0 -6
- data/test/unit/mock/files/rootwrap.conf +0 -7
- data/test/unit/mock/files/serve-cgi-bin.conf +0 -20
- data/test/unit/mock/files/shadow +0 -2
- data/test/unit/mock/files/ssh_config +0 -5
- data/test/unit/mock/files/sshd_config +0 -7
- data/test/unit/mock/files/sysctl.conf +0 -7
- data/test/unit/mock/files/xinetd.conf +0 -9
- data/test/unit/mock/files/xinetd.d/.gitkeep +0 -0
- data/test/unit/mock/files/xinetd.d_chargen-dgram +0 -9
- data/test/unit/mock/files/xinetd.d_chargen-stream +0 -9
- data/test/unit/mock/profiles/complete-metadata/inspec.yml +0 -7
- data/test/unit/mock/profiles/complete-profile/controls/filesystem_spec.rb +0 -16
- data/test/unit/mock/profiles/complete-profile/inspec.yml +0 -10
- data/test/unit/mock/profiles/complete-profile/libraries/testlib.rb +0 -1
- data/test/unit/mock/profiles/empty-metadata/inspec.yml +0 -0
- data/test/unit/mock/profiles/legacy-complete-metadata/metadata.rb +0 -7
- data/test/unit/mock/profiles/legacy-complete-metadata/test/.gitkeep +0 -0
- data/test/unit/mock/profiles/legacy-empty-metadata/controls/.gitkeep +0 -0
- data/test/unit/mock/profiles/legacy-empty-metadata/metadata.rb +0 -0
- data/test/unit/mock/profiles/legacy-simple-metadata/metadata.rb +0 -1
- data/test/unit/mock/profiles/legacy-simple-metadata/test/.gitkeep +0 -0
- data/test/unit/mock/profiles/library/controls/filesystem_spec.rb +0 -7
- data/test/unit/mock/profiles/library/inspec.yml +0 -10
- data/test/unit/mock/profiles/library/libraries/gordonlib.rb +0 -2
- data/test/unit/mock/profiles/library/libraries/testlib.rb +0 -12
- data/test/unit/mock/profiles/resource-tiny/inspec.yml +0 -10
- data/test/unit/mock/profiles/resource-tiny/libraries/resource.rb +0 -3
- data/test/unit/mock/profiles/simple-metadata/inspec.yml +0 -1
- data/test/unit/mock/profiles/skippy-profile-os/controls/one.rb +0 -3
- data/test/unit/mock/profiles/skippy-profile-os/inspec.yml +0 -5
- data/test/unit/mock/profiles/spec_only/specfile.rb +0 -11
- data/test/unit/mock/profiles/supported_inspec/inspec.yml +0 -2
- data/test/unit/mock/profiles/unsupported_inspec/inspec.yml +0 -2
- data/test/unit/objects_test.rb +0 -65
- data/test/unit/plugin_test.rb +0 -44
- data/test/unit/plugins/resource_test.rb +0 -60
- data/test/unit/profile_context_test.rb +0 -345
- data/test/unit/profile_test.rb +0 -252
- data/test/unit/resources/apache_conf_test.rb +0 -31
- data/test/unit/resources/apt_test.rb +0 -46
- data/test/unit/resources/audit_policy_test.rb +0 -13
- data/test/unit/resources/auditd_conf_test.rb +0 -15
- data/test/unit/resources/auditd_rules_test.rb +0 -91
- data/test/unit/resources/bash_test.rb +0 -29
- data/test/unit/resources/bond_test.rb +0 -24
- data/test/unit/resources/bridge_test.rb +0 -56
- data/test/unit/resources/csv_test.rb +0 -35
- data/test/unit/resources/etc_group_test.rb +0 -37
- data/test/unit/resources/file_test.rb +0 -202
- data/test/unit/resources/gem_test.rb +0 -20
- data/test/unit/resources/group_test.rb +0 -96
- data/test/unit/resources/grub_conf_test.rb +0 -29
- data/test/unit/resources/host_test.rb +0 -38
- data/test/unit/resources/inetd_conf_test.rb +0 -15
- data/test/unit/resources/ini_test.rb +0 -16
- data/test/unit/resources/interface_test.rb +0 -54
- data/test/unit/resources/iptables_test.rb +0 -35
- data/test/unit/resources/json_test.rb +0 -36
- data/test/unit/resources/kernel_module_test.rb +0 -23
- data/test/unit/resources/kernel_parameter_test.rb +0 -13
- data/test/unit/resources/limits_conf_test.rb +0 -14
- data/test/unit/resources/login_def_test.rb +0 -16
- data/test/unit/resources/mount_test.rb +0 -26
- data/test/unit/resources/mysql_conf_test.rb +0 -14
- data/test/unit/resources/npm_test.rb +0 -20
- data/test/unit/resources/ntp_conf_test.rb +0 -16
- data/test/unit/resources/oneget_test.rb +0 -45
- data/test/unit/resources/os_env_test.rb +0 -18
- data/test/unit/resources/os_test.rb +0 -40
- data/test/unit/resources/package_test.rb +0 -87
- data/test/unit/resources/parse_config_test.rb +0 -26
- data/test/unit/resources/passwd_test.rb +0 -111
- data/test/unit/resources/pip_test.rb +0 -15
- data/test/unit/resources/port_test.rb +0 -165
- data/test/unit/resources/powershell_test.rb +0 -32
- data/test/unit/resources/processes_test.rb +0 -72
- data/test/unit/resources/registry_key_test.rb +0 -18
- data/test/unit/resources/security_policy_test.rb +0 -16
- data/test/unit/resources/service_test.rb +0 -305
- data/test/unit/resources/shadow_test.rb +0 -67
- data/test/unit/resources/ssh_conf_test.rb +0 -33
- data/test/unit/resources/user_test.rb +0 -124
- data/test/unit/resources/vbscript_test.rb +0 -18
- data/test/unit/resources/windows_feature.rb +0 -17
- data/test/unit/resources/wmi_test.rb +0 -42
- data/test/unit/resources/xinetd_test.rb +0 -60
- data/test/unit/resources/yaml_test.rb +0 -34
- data/test/unit/resources/yum_test.rb +0 -68
- data/test/unit/shell_detector_test.rb +0 -78
- data/test/unit/source_reader_test.rb +0 -17
- data/test/unit/source_readers/flat_test.rb +0 -61
- data/test/unit/source_readers/inspec_test.rb +0 -38
- data/test/unit/utils/filter_array_test.rb +0 -59
- data/test/unit/utils/filter_table_test.rb +0 -177
- data/test/unit/utils/find_files_test.rb +0 -23
- data/test/unit/utils/passwd_parser_test.rb +0 -32
- data/test/unit/utils/simpleconfig_test.rb +0 -80
- data/test/unit/utils/solaris_netstat_parser.rb +0 -124
@@ -1,13 +1,17 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
# options
|
4
|
-
inspec_bin = '/
|
4
|
+
inspec_bin = 'BUNDLE_GEMFILE=/inspec/Gemfile bundle exec inspec'
|
5
5
|
api_url = 'https://0.0.0.0'
|
6
6
|
profile = '/inspec/examples/profile'
|
7
7
|
|
8
|
+
user = command('whoami').stdout.strip
|
9
|
+
pwd = command('pwd').stdout.strip
|
10
|
+
puts "Run test as #{user} in path #{pwd}"
|
11
|
+
|
8
12
|
# TODO: determine tokens automatically, define in kitchen yml
|
9
|
-
access_token = ENV['
|
10
|
-
refresh_token = ENV['
|
13
|
+
access_token = ENV['COMPLIANCE_ACCESSTOKEN']
|
14
|
+
refresh_token = ENV['COMPLIANCE_REFRESHTOKEN']
|
11
15
|
|
12
16
|
%w{refresh_token access_token}.each do |type|
|
13
17
|
case type
|
@@ -24,9 +28,35 @@ refresh_token = ENV['COMPLIANCE_REFRESH_TOKEN']
|
|
24
28
|
its('exit_status') { should eq 0 }
|
25
29
|
end
|
26
30
|
|
31
|
+
# version command fails gracefully when server not configured
|
32
|
+
describe command("#{inspec_bin} compliance version") do
|
33
|
+
its('stdout') { should include 'Server configuration information is missing' }
|
34
|
+
its('stderr') { should eq '' }
|
35
|
+
its('exit_status') { should eq 1 }
|
36
|
+
end
|
37
|
+
|
38
|
+
# submitting a wrong token should have an exit of 0
|
39
|
+
describe command("#{inspec_bin} compliance login #{api_url} --insecure --user 'admin' --token 'wrong-token'") do
|
40
|
+
its('stdout') { should include 'token stored' }
|
41
|
+
end
|
42
|
+
|
43
|
+
# compliance login --help should give an accurate message for login
|
44
|
+
describe command("#{inspec_bin} compliance login --help") do
|
45
|
+
its('stdout') { should include "inspec compliance login SERVER --insecure --user='USER' --token='TOKEN'" }
|
46
|
+
its('exit_status') { should eq 0 }
|
47
|
+
end
|
48
|
+
|
49
|
+
# profiles command fails gracefully when token/server info is incorrect
|
50
|
+
describe command("#{inspec_bin} compliance profiles") do
|
51
|
+
its('stdout') { should include '401 Unauthorized. Please check your token' }
|
52
|
+
its('stderr') { should eq '' }
|
53
|
+
its('exit_status') { should eq 1 }
|
54
|
+
end
|
55
|
+
|
27
56
|
# 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 '
|
57
|
+
describe command("#{inspec_bin} compliance login #{api_url} --insecure --user 'admin' #{token_options}") do
|
58
|
+
its('stdout') { should include 'token', 'stored' }
|
59
|
+
its('stdout') { should_not include 'Your server supports --user and --password only' }
|
30
60
|
its('stderr') { should eq '' }
|
31
61
|
its('exit_status') { should eq 0 }
|
32
62
|
end
|
@@ -47,6 +77,13 @@ refresh_token = ENV['COMPLIANCE_REFRESH_TOKEN']
|
|
47
77
|
its('exit_status') { should eq 0 }
|
48
78
|
end
|
49
79
|
|
80
|
+
# returns the version of the server
|
81
|
+
describe command("#{inspec_bin} compliance version") do
|
82
|
+
its('stdout') { should include 'Chef Compliance version:' }
|
83
|
+
its('stderr') { should eq '' }
|
84
|
+
its('exit_status') { should eq 0 }
|
85
|
+
end
|
86
|
+
|
50
87
|
# logout
|
51
88
|
describe command("#{inspec_bin} compliance logout") do
|
52
89
|
its('stdout') { should include 'Successfully logged out' }
|
@@ -7,6 +7,15 @@ module Init
|
|
7
7
|
class CLI < Inspec::BaseCLI
|
8
8
|
namespace 'init'
|
9
9
|
|
10
|
+
# TODO: find another solution, once https://github.com/erikhuda/thor/issues/261 is fixed
|
11
|
+
def self.banner(command, _namespace = nil, _subcommand = false)
|
12
|
+
"#{basename} #{subcommand_prefix} #{command.usage}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.subcommand_prefix
|
16
|
+
namespace
|
17
|
+
end
|
18
|
+
|
10
19
|
# read template directoy
|
11
20
|
template_dir = File.join(File.dirname(__FILE__), 'templates')
|
12
21
|
Dir.glob(File.join(template_dir, '*')) do |template|
|
@@ -6,6 +6,15 @@ module Supermarket
|
|
6
6
|
class SupermarketCLI < Inspec::BaseCLI
|
7
7
|
namespace 'supermarket'
|
8
8
|
|
9
|
+
# TODO: find another solution, once https://github.com/erikhuda/thor/issues/261 is fixed
|
10
|
+
def self.banner(command, _namespace = nil, _subcommand = false)
|
11
|
+
"#{basename} #{subcommand_prefix} #{command.usage}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.subcommand_prefix
|
15
|
+
namespace
|
16
|
+
end
|
17
|
+
|
9
18
|
desc 'profiles', 'list all available profiles in Chef Supermarket'
|
10
19
|
def profiles
|
11
20
|
# display profiles in format user/profile
|
@@ -13,11 +13,12 @@ module Supermarket
|
|
13
13
|
priority 500
|
14
14
|
|
15
15
|
def self.resolve(target, opts = {})
|
16
|
+
return nil unless target.is_a?(String)
|
16
17
|
return nil unless URI(target).scheme == 'supermarket'
|
17
18
|
return nil unless Supermarket::API.exist?(target)
|
18
19
|
tool_info = Supermarket::API.find(target)
|
19
20
|
super(tool_info['tool_source_url'], opts)
|
20
|
-
rescue URI::Error
|
21
|
+
rescue URI::Error
|
21
22
|
nil
|
22
23
|
end
|
23
24
|
|
data/lib/fetchers/local.rb
CHANGED
@@ -10,8 +10,11 @@ module Fetchers
|
|
10
10
|
attr_reader :files
|
11
11
|
|
12
12
|
def self.resolve(target)
|
13
|
-
|
14
|
-
|
13
|
+
unless target.is_a?(String) && File.exist?(target)
|
14
|
+
nil
|
15
|
+
else
|
16
|
+
new(target)
|
17
|
+
end
|
15
18
|
end
|
16
19
|
|
17
20
|
def initialize(target)
|
data/lib/fetchers/url.rb
CHANGED
data/lib/inspec/base_cli.rb
CHANGED
@@ -64,7 +64,8 @@ module Inspec
|
|
64
64
|
# helper method to run tests
|
65
65
|
def run_tests(targets, opts)
|
66
66
|
o = opts.dup
|
67
|
-
|
67
|
+
log_device = opts['format'] == 'json' ? nil : STDOUT
|
68
|
+
o[:logger] = Logger.new(log_device)
|
68
69
|
o[:logger].level = get_log_level(o.log_level)
|
69
70
|
|
70
71
|
runner = Inspec::Runner.new(o)
|
data/lib/inspec/cli.rb
CHANGED
@@ -154,20 +154,29 @@ class Inspec::InspecCLI < Inspec::BaseCLI # rubocop:disable Metrics/ClassLength
|
|
154
154
|
|
155
155
|
desc 'shell', 'open an interactive debugging shell'
|
156
156
|
target_options
|
157
|
-
option :command, aliases: :c
|
158
|
-
|
157
|
+
option :command, aliases: :c,
|
158
|
+
desc: 'A single command string to run instead of launching the shell'
|
159
|
+
option :format, type: :string, default: nil, hide: true,
|
160
|
+
desc: 'Which formatter to use: cli, progress, documentation, json, json-min'
|
159
161
|
def shell_func
|
160
162
|
diagnose
|
161
163
|
o = opts.dup
|
162
|
-
|
164
|
+
|
165
|
+
log_device = opts['format'] == 'json' ? nil : STDOUT
|
166
|
+
o[:logger] = Logger.new(log_device)
|
163
167
|
o[:logger].level = get_log_level(o.log_level)
|
168
|
+
|
164
169
|
if o[:command].nil?
|
165
170
|
runner = Inspec::Runner.new(o)
|
166
171
|
return Inspec::Shell.new(runner).start
|
167
172
|
else
|
168
173
|
res = run_command(o)
|
169
|
-
|
170
|
-
|
174
|
+
if opts['format'] == 'json'
|
175
|
+
jres = res.respond_to?(:to_json) ? res.to_json : JSON.dump(res)
|
176
|
+
puts jres
|
177
|
+
else
|
178
|
+
puts res
|
179
|
+
end
|
171
180
|
end
|
172
181
|
rescue RuntimeError, Train::UserError => e
|
173
182
|
$stderr.puts e.message
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'inspec/dependencies/vendor_index'
|
3
|
+
require 'inspec/dependencies/resolver'
|
4
|
+
|
5
|
+
module Inspec
|
6
|
+
#
|
7
|
+
# A DependencySet manages a list of dependencies for a profile.
|
8
|
+
#
|
9
|
+
# Currently this class is a thin wrapper interface to coordinate the
|
10
|
+
# VendorIndex and the Resolver.
|
11
|
+
#
|
12
|
+
class DependencySet
|
13
|
+
attr_reader :list, :vendor_path
|
14
|
+
|
15
|
+
# initialize
|
16
|
+
#
|
17
|
+
# @param cwd [String] current working directory for relative path includes
|
18
|
+
# @param vendor_path [String] path which contains vendored dependencies
|
19
|
+
# @return [dependencies] this
|
20
|
+
def initialize(cwd, vendor_path)
|
21
|
+
@cwd = cwd
|
22
|
+
@vendor_path = vendor_path || File.join(Dir.home, '.inspec', 'cache')
|
23
|
+
@list = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# 1. Get dependencies, pull things to a local cache if necessary
|
28
|
+
# 2. Resolve dependencies
|
29
|
+
#
|
30
|
+
# @param dependencies [Gem::Dependency] list of dependencies
|
31
|
+
# @return [nil]
|
32
|
+
def vendor(dependencies)
|
33
|
+
return nil if dependencies.nil? || dependencies.empty?
|
34
|
+
@vendor_index ||= VendorIndex.new(@vendor_path)
|
35
|
+
@list = Resolver.resolve(dependencies, @vendor_index, @cwd)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'inspec/fetcher'
|
3
|
+
|
4
|
+
module Inspec
|
5
|
+
#
|
6
|
+
# Inspec::Requirement represents a given profile dependency, where
|
7
|
+
# appropriate we delegate to Inspec::Profile directly.
|
8
|
+
#
|
9
|
+
class Requirement
|
10
|
+
attr_reader :name, :dep, :cwd, :opts
|
11
|
+
|
12
|
+
def initialize(name, version_constraints, vendor_index, cwd, opts)
|
13
|
+
@name = name
|
14
|
+
@dep = Gem::Dependency.new(name,
|
15
|
+
Gem::Requirement.new(Array(version_constraints)),
|
16
|
+
:runtime)
|
17
|
+
@vendor_index = vendor_index
|
18
|
+
@opts = opts
|
19
|
+
@cwd = cwd
|
20
|
+
end
|
21
|
+
|
22
|
+
def matches_spec?(spec)
|
23
|
+
params = spec.profile.metadata.params
|
24
|
+
@dep.match?(params[:name], params[:version])
|
25
|
+
end
|
26
|
+
|
27
|
+
def source_url
|
28
|
+
case source_type
|
29
|
+
when :local_path
|
30
|
+
"file://#{File.expand_path(opts[:path])}"
|
31
|
+
when :url
|
32
|
+
@opts[:url]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def local_path
|
37
|
+
@local_path ||= case source_type
|
38
|
+
when :local_path
|
39
|
+
File.expand_path(opts[:path], @cwd)
|
40
|
+
else
|
41
|
+
@vendor_index.prefered_entry_for(@name, source_url)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def source_type
|
46
|
+
@source_type ||= if @opts[:path]
|
47
|
+
:local_path
|
48
|
+
elsif opts[:url]
|
49
|
+
:url
|
50
|
+
else
|
51
|
+
fail "Cannot determine source type from #{opts}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def fetcher_class
|
56
|
+
@fetcher_class ||= case source_type
|
57
|
+
when :local_path
|
58
|
+
Fetchers::Local
|
59
|
+
when :url
|
60
|
+
Fetchers::Url
|
61
|
+
else
|
62
|
+
fail "No known fetcher for dependency #{name} with source_type #{source_type}"
|
63
|
+
end
|
64
|
+
|
65
|
+
fail "No fetcher for #{name} (options: #{opts})" if @fetcher_class.nil?
|
66
|
+
@fetcher_class
|
67
|
+
end
|
68
|
+
|
69
|
+
def pull
|
70
|
+
case source_type
|
71
|
+
when :local_path
|
72
|
+
local_path
|
73
|
+
else
|
74
|
+
if @vendor_index.exists?(@name, source_url)
|
75
|
+
local_path
|
76
|
+
else
|
77
|
+
archive = fetcher_class.download_archive(source_url)
|
78
|
+
@vendor_index.add(@name, source_url, archive.path)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_s
|
84
|
+
dep.to_s
|
85
|
+
end
|
86
|
+
|
87
|
+
def path
|
88
|
+
@path ||= pull
|
89
|
+
end
|
90
|
+
|
91
|
+
def profile
|
92
|
+
return nil if path.nil?
|
93
|
+
@profile ||= Inspec::Profile.for_target(path, {})
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.from_metadata(dep, vendor_index, opts)
|
97
|
+
fail 'Cannot load empty dependency.' if dep.nil? || dep.empty?
|
98
|
+
name = dep[:name] || fail('You must provide a name for all dependencies')
|
99
|
+
version = dep[:version]
|
100
|
+
new(name, version, vendor_index, opts[:cwd], opts.merge(dep))
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -1,28 +1,32 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# author: Dominik Richter
|
3
3
|
# author: Christoph Hartmann
|
4
|
-
|
5
4
|
require 'logger'
|
6
|
-
require 'fileutils'
|
7
5
|
require 'molinillo'
|
8
6
|
require 'inspec/errors'
|
7
|
+
require 'inspec/dependencies/requirement'
|
9
8
|
|
10
9
|
module Inspec
|
10
|
+
#
|
11
|
+
# Inspec::Resolver is responsible for recursively resolving all the
|
12
|
+
# depenendencies for a given top-level dependency set.
|
13
|
+
#
|
11
14
|
class Resolver
|
12
15
|
def self.resolve(requirements, vendor_index, cwd, opts = {})
|
13
16
|
reqs = requirements.map do |req|
|
14
|
-
Requirement.from_metadata(req, cwd: cwd)
|
15
|
-
|
17
|
+
req = Inspec::Requirement.from_metadata(req, vendor_index, cwd: cwd)
|
18
|
+
req || fail("Cannot initialize dependency: #{req}")
|
16
19
|
end
|
17
20
|
|
18
|
-
new(vendor_index, opts).resolve(reqs)
|
21
|
+
new(vendor_index, opts.merge(cwd: cwd)).resolve(reqs)
|
19
22
|
end
|
20
23
|
|
21
24
|
def initialize(vendor_index, opts = {})
|
22
25
|
@logger = opts[:logger] || Logger.new(nil)
|
23
|
-
@debug_mode = false
|
26
|
+
@debug_mode = false
|
24
27
|
|
25
28
|
@vendor_index = vendor_index
|
29
|
+
@cwd = opts[:cwd] || './'
|
26
30
|
@resolver = Molinillo::Resolver.new(self, self)
|
27
31
|
@search_cache = {}
|
28
32
|
end
|
@@ -87,7 +91,9 @@ module Inspec
|
|
87
91
|
# @return [Array<Object>] the dependencies that are required by the given
|
88
92
|
# `specification`.
|
89
93
|
def dependencies_for(specification)
|
90
|
-
specification.profile.metadata.dependencies
|
94
|
+
specification.profile.metadata.dependencies.map do |r|
|
95
|
+
Inspec::Requirement.from_metadata(r, @vendor_index, cwd: @cwd)
|
96
|
+
end
|
91
97
|
end
|
92
98
|
|
93
99
|
# Determines whether the given `requirement` is satisfied by the given
|
@@ -179,129 +185,4 @@ module Inspec
|
|
179
185
|
end
|
180
186
|
alias puts print
|
181
187
|
end
|
182
|
-
|
183
|
-
class Package
|
184
|
-
def initialize(path, version)
|
185
|
-
@path = path
|
186
|
-
@version = version
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
class VendorIndex
|
191
|
-
attr_reader :list, :path
|
192
|
-
def initialize(path)
|
193
|
-
@path = path
|
194
|
-
FileUtils.mkdir_p(path) unless File.directory?(path)
|
195
|
-
@list = Dir[File.join(path, '*')].map { |x| load_path(x) }
|
196
|
-
end
|
197
|
-
|
198
|
-
def find(_dependency)
|
199
|
-
# TODO
|
200
|
-
fail NotImplementedError, '#find(dependency) on VendorIndex seeks implementation.'
|
201
|
-
end
|
202
|
-
|
203
|
-
private
|
204
|
-
|
205
|
-
def load_path(_path)
|
206
|
-
# TODO
|
207
|
-
fail NotImplementedError, '#load_path(path) on VendorIndex wants to be implemented.'
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
class Requirement
|
212
|
-
attr_reader :name, :dep, :cwd, :opts
|
213
|
-
def initialize(name, dep, cwd, opts)
|
214
|
-
@name = name
|
215
|
-
@dep = Gem::Dependency.new(name, Gem::Requirement.new(Array(dep)), :runtime)
|
216
|
-
@opts = opts
|
217
|
-
@cwd = cwd
|
218
|
-
end
|
219
|
-
|
220
|
-
def matches_spec?(spec)
|
221
|
-
params = spec.profile.metadata.params
|
222
|
-
@dep.match?(params[:name], params[:version])
|
223
|
-
end
|
224
|
-
|
225
|
-
def pull
|
226
|
-
case
|
227
|
-
when @opts[:path] then pull_path(@opts[:path])
|
228
|
-
else
|
229
|
-
# TODO: should default to supermarket
|
230
|
-
fail 'You must specify the source of the dependency (for now...)'
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
def path
|
235
|
-
@path || pull
|
236
|
-
end
|
237
|
-
|
238
|
-
def profile
|
239
|
-
return nil if path.nil?
|
240
|
-
@profile ||= Inspec::Profile.for_target(path, {})
|
241
|
-
end
|
242
|
-
|
243
|
-
def self.from_metadata(dep, opts)
|
244
|
-
fail 'Cannot load empty dependency.' if dep.nil? || dep.empty?
|
245
|
-
name = dep[:name] || fail('You must provide a name for all dependencies')
|
246
|
-
version = dep[:version]
|
247
|
-
new(name, version, opts[:cwd], dep)
|
248
|
-
end
|
249
|
-
|
250
|
-
def to_s
|
251
|
-
@dep.to_s
|
252
|
-
end
|
253
|
-
|
254
|
-
private
|
255
|
-
|
256
|
-
def pull_path(path)
|
257
|
-
abspath = File.absolute_path(path, @cwd)
|
258
|
-
fail "Dependency path doesn't exist: #{path}" unless File.exist?(abspath)
|
259
|
-
fail "Dependency path isn't a folder: #{path}" unless File.directory?(abspath)
|
260
|
-
@path = abspath
|
261
|
-
true
|
262
|
-
end
|
263
|
-
end
|
264
|
-
|
265
|
-
class SupermarketDependency
|
266
|
-
def initialize(url, requirement)
|
267
|
-
@url = url
|
268
|
-
@requirement = requirement
|
269
|
-
end
|
270
|
-
|
271
|
-
def self.load(dep)
|
272
|
-
return nil if dep.nil?
|
273
|
-
sname = dep[:supermarket]
|
274
|
-
return nil if sname.nil?
|
275
|
-
surl = dep[:supermarket_url] || 'default_url...'
|
276
|
-
requirement = dep[:version]
|
277
|
-
url = surl + '/' + sname
|
278
|
-
new(url, requirement)
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
class Dependencies
|
283
|
-
attr_reader :list, :vendor_path
|
284
|
-
|
285
|
-
# initialize
|
286
|
-
#
|
287
|
-
# @param cwd [String] current working directory for relative path includes
|
288
|
-
# @param vendor_path [String] path which contains vendored dependencies
|
289
|
-
# @return [dependencies] this
|
290
|
-
def initialize(cwd, vendor_path)
|
291
|
-
@cwd = cwd
|
292
|
-
@vendor_path = vendor_path || File.join(Dir.home, '.inspec', 'cache')
|
293
|
-
@list = nil
|
294
|
-
end
|
295
|
-
|
296
|
-
# 1. Get dependencies, pull things to a local cache if necessary
|
297
|
-
# 2. Resolve dependencies
|
298
|
-
#
|
299
|
-
# @param dependencies [Gem::Dependency] list of dependencies
|
300
|
-
# @return [nil]
|
301
|
-
def vendor(dependencies)
|
302
|
-
return if dependencies.nil? || dependencies.empty?
|
303
|
-
@vendor_index ||= VendorIndex.new(@vendor_path)
|
304
|
-
@list = Resolver.resolve(dependencies, @vendor_index, @cwd)
|
305
|
-
end
|
306
|
-
end
|
307
188
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'digest'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module Inspec
|
6
|
+
#
|
7
|
+
# VendorIndex manages an on-disk cache of inspec profiles. The
|
8
|
+
# cache can contain:
|
9
|
+
#
|
10
|
+
# - .tar.gz profile archives
|
11
|
+
# - .zip profile archives
|
12
|
+
# - unpacked profiles
|
13
|
+
#
|
14
|
+
# Cache entries names include a hash of their source to prevent
|
15
|
+
# conflicts between depenedencies with the same name from different
|
16
|
+
# sources.
|
17
|
+
#
|
18
|
+
#
|
19
|
+
class VendorIndex
|
20
|
+
attr_reader :path
|
21
|
+
def initialize(path)
|
22
|
+
@path = path
|
23
|
+
FileUtils.mkdir_p(path) unless File.directory?(path)
|
24
|
+
end
|
25
|
+
|
26
|
+
def add(name, source, path_from)
|
27
|
+
path_to = base_path_for(name, source)
|
28
|
+
path_to = if File.directory?(path_to)
|
29
|
+
path_to
|
30
|
+
elsif path_from.end_with?('.zip')
|
31
|
+
"#{path_to}.tar.gz"
|
32
|
+
elsif path_from.end_with?('.tar.gz')
|
33
|
+
"#{path_to}.tar.gz"
|
34
|
+
else
|
35
|
+
fail "Cannot add unknown archive #{path} to vendor index"
|
36
|
+
end
|
37
|
+
FileUtils.cp_r(path_from, path_to)
|
38
|
+
path_to
|
39
|
+
end
|
40
|
+
|
41
|
+
def prefered_entry_for(name, source_url)
|
42
|
+
path = base_path_for(name, source_url)
|
43
|
+
if File.directory?(path)
|
44
|
+
path
|
45
|
+
elsif File.exist?("#{path}.tar.gz")
|
46
|
+
"#{path}.tar.gz"
|
47
|
+
elsif File.exist?("#{path}.zip")
|
48
|
+
"#{path}.zip"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# For a given name and source_url, return true if the
|
54
|
+
# profile exists in the VendorIndex.
|
55
|
+
#
|
56
|
+
# @param [String] name
|
57
|
+
# @param [String] source_url
|
58
|
+
# @return [Boolean]
|
59
|
+
#
|
60
|
+
def exists?(name, source_url)
|
61
|
+
path = base_path_for(name, source_url)
|
62
|
+
File.directory?(path) || File.exist?("#{path}.tar.gz") || File.exist?("#{path}.zip")
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# Return the path to given profile in the vendor index.
|
67
|
+
#
|
68
|
+
# The `source_url` parameter should be a URI-like string that
|
69
|
+
# fully specifies the source of the exact version we want to pull
|
70
|
+
# down.
|
71
|
+
#
|
72
|
+
# @param [String] name
|
73
|
+
# @param [String] source_url
|
74
|
+
# @return [String]
|
75
|
+
#
|
76
|
+
def base_path_for(name, source_url)
|
77
|
+
File.join(@path, key_for(name, source_url))
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
#
|
83
|
+
# Return the key for a given profile in the vendor index.
|
84
|
+
#
|
85
|
+
# The `source_url` parameter should be a URI-like string that
|
86
|
+
# fully specifies the source of the exact version we want to pull
|
87
|
+
# down.
|
88
|
+
#
|
89
|
+
# @param [String] name
|
90
|
+
# @param [String] source_url
|
91
|
+
# @return [String]
|
92
|
+
#
|
93
|
+
def key_for(name, source_url)
|
94
|
+
source_hash = Digest::SHA256.hexdigest source_url
|
95
|
+
"#{name}-#{source_hash}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -20,6 +20,10 @@ module Inspec
|
|
20
20
|
|
21
21
|
# Retrieve this profile's tests
|
22
22
|
#
|
23
|
+
# "tests" here refers to a test file. Individual controls and anonymous
|
24
|
+
# tests are later extracted from the raw contents of a test file. The map
|
25
|
+
# her simply maps from a test file name to the file contents.
|
26
|
+
#
|
23
27
|
# @return [Hash] Collection with references pointing to test contents
|
24
28
|
def tests
|
25
29
|
fail "SourceReader #{self} does not implement `tests()`. This method is required"
|
data/lib/inspec/profile.rb
CHANGED
@@ -8,7 +8,7 @@ require 'inspec/polyfill'
|
|
8
8
|
require 'inspec/fetcher'
|
9
9
|
require 'inspec/source_reader'
|
10
10
|
require 'inspec/metadata'
|
11
|
-
require 'inspec/dependencies'
|
11
|
+
require 'inspec/dependencies/dependency_set'
|
12
12
|
|
13
13
|
module Inspec
|
14
14
|
class Profile # rubocop:disable Metrics/ClassLength
|
@@ -298,7 +298,7 @@ module Inspec
|
|
298
298
|
|
299
299
|
def load_dependencies
|
300
300
|
cwd = File.directory?(@target) ? @target : nil
|
301
|
-
res = Inspec::
|
301
|
+
res = Inspec::DependencySet.new(cwd, nil)
|
302
302
|
res.vendor(metadata.dependencies)
|
303
303
|
res
|
304
304
|
end
|
data/lib/inspec/resource.rb
CHANGED
@@ -65,6 +65,7 @@ require 'resources/gem'
|
|
65
65
|
require 'resources/group'
|
66
66
|
require 'resources/grub_conf'
|
67
67
|
require 'resources/host'
|
68
|
+
require 'resources/iis_site'
|
68
69
|
require 'resources/inetd_conf'
|
69
70
|
require 'resources/interface'
|
70
71
|
require 'resources/iptables'
|
@@ -97,6 +98,7 @@ require 'resources/registry_key'
|
|
97
98
|
require 'resources/security_policy'
|
98
99
|
require 'resources/service'
|
99
100
|
require 'resources/shadow'
|
101
|
+
require 'resources/ssl'
|
100
102
|
require 'resources/ssh_conf'
|
101
103
|
require 'resources/user'
|
102
104
|
require 'resources/vbscript'
|