inspec-core 2.1.67
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/CHANGELOG.md +3136 -0
- data/Gemfile +56 -0
- data/LICENSE +14 -0
- data/MAINTAINERS.md +33 -0
- data/MAINTAINERS.toml +52 -0
- data/README.md +453 -0
- data/bin/inspec +12 -0
- data/docs/.gitignore +2 -0
- data/docs/README.md +40 -0
- data/docs/dev/control-eval.md +62 -0
- data/docs/dsl_inspec.md +258 -0
- data/docs/dsl_resource.md +100 -0
- data/docs/glossary.md +99 -0
- data/docs/habitat.md +192 -0
- data/docs/inspec_and_friends.md +114 -0
- data/docs/matchers.md +169 -0
- data/docs/migration.md +293 -0
- data/docs/platforms.md +119 -0
- data/docs/plugin_kitchen_inspec.md +50 -0
- data/docs/profiles.md +378 -0
- data/docs/reporters.md +105 -0
- data/docs/resources/aide_conf.md.erb +76 -0
- data/docs/resources/apache.md.erb +67 -0
- data/docs/resources/apache_conf.md.erb +68 -0
- data/docs/resources/apt.md.erb +71 -0
- data/docs/resources/audit_policy.md.erb +47 -0
- data/docs/resources/auditd.md.erb +79 -0
- data/docs/resources/auditd_conf.md.erb +68 -0
- data/docs/resources/bash.md.erb +75 -0
- data/docs/resources/bond.md.erb +90 -0
- data/docs/resources/bridge.md.erb +57 -0
- data/docs/resources/bsd_service.md.erb +67 -0
- data/docs/resources/chocolatey_package.md.erb +58 -0
- data/docs/resources/command.md.erb +138 -0
- data/docs/resources/cpan.md.erb +79 -0
- data/docs/resources/cran.md.erb +64 -0
- data/docs/resources/crontab.md.erb +89 -0
- data/docs/resources/csv.md.erb +54 -0
- data/docs/resources/dh_params.md.erb +205 -0
- data/docs/resources/directory.md.erb +30 -0
- data/docs/resources/docker.md.erb +219 -0
- data/docs/resources/docker_container.md.erb +103 -0
- data/docs/resources/docker_image.md.erb +94 -0
- data/docs/resources/docker_service.md.erb +114 -0
- data/docs/resources/elasticsearch.md.erb +242 -0
- data/docs/resources/etc_fstab.md.erb +125 -0
- data/docs/resources/etc_group.md.erb +75 -0
- data/docs/resources/etc_hosts.md.erb +78 -0
- data/docs/resources/etc_hosts_allow.md.erb +74 -0
- data/docs/resources/etc_hosts_deny.md.erb +74 -0
- data/docs/resources/file.md.erb +526 -0
- data/docs/resources/filesystem.md.erb +41 -0
- data/docs/resources/firewalld.md.erb +107 -0
- data/docs/resources/gem.md.erb +79 -0
- data/docs/resources/group.md.erb +61 -0
- data/docs/resources/grub_conf.md.erb +101 -0
- data/docs/resources/host.md.erb +86 -0
- data/docs/resources/http.md.erb +197 -0
- data/docs/resources/iis_app.md.erb +122 -0
- data/docs/resources/iis_site.md.erb +135 -0
- data/docs/resources/inetd_conf.md.erb +94 -0
- data/docs/resources/ini.md.erb +76 -0
- data/docs/resources/interface.md.erb +58 -0
- data/docs/resources/iptables.md.erb +64 -0
- data/docs/resources/json.md.erb +63 -0
- data/docs/resources/kernel_module.md.erb +120 -0
- data/docs/resources/kernel_parameter.md.erb +53 -0
- data/docs/resources/key_rsa.md.erb +85 -0
- data/docs/resources/launchd_service.md.erb +57 -0
- data/docs/resources/limits_conf.md.erb +75 -0
- data/docs/resources/login_defs.md.erb +71 -0
- data/docs/resources/mount.md.erb +69 -0
- data/docs/resources/mssql_session.md.erb +60 -0
- data/docs/resources/mysql_conf.md.erb +99 -0
- data/docs/resources/mysql_session.md.erb +74 -0
- data/docs/resources/nginx.md.erb +79 -0
- data/docs/resources/nginx_conf.md.erb +138 -0
- data/docs/resources/npm.md.erb +60 -0
- data/docs/resources/ntp_conf.md.erb +60 -0
- data/docs/resources/oneget.md.erb +53 -0
- data/docs/resources/oracledb_session.md.erb +52 -0
- data/docs/resources/os.md.erb +141 -0
- data/docs/resources/os_env.md.erb +91 -0
- data/docs/resources/package.md.erb +120 -0
- data/docs/resources/packages.md.erb +67 -0
- data/docs/resources/parse_config.md.erb +103 -0
- data/docs/resources/parse_config_file.md.erb +138 -0
- data/docs/resources/passwd.md.erb +141 -0
- data/docs/resources/pip.md.erb +67 -0
- data/docs/resources/port.md.erb +137 -0
- data/docs/resources/postgres_conf.md.erb +79 -0
- data/docs/resources/postgres_hba_conf.md.erb +93 -0
- data/docs/resources/postgres_ident_conf.md.erb +76 -0
- data/docs/resources/postgres_session.md.erb +69 -0
- data/docs/resources/powershell.md.erb +102 -0
- data/docs/resources/processes.md.erb +109 -0
- data/docs/resources/rabbitmq_config.md.erb +41 -0
- data/docs/resources/registry_key.md.erb +158 -0
- data/docs/resources/runit_service.md.erb +57 -0
- data/docs/resources/security_policy.md.erb +47 -0
- data/docs/resources/service.md.erb +121 -0
- data/docs/resources/shadow.md.erb +146 -0
- data/docs/resources/ssh_config.md.erb +73 -0
- data/docs/resources/sshd_config.md.erb +83 -0
- data/docs/resources/ssl.md.erb +119 -0
- data/docs/resources/sys_info.md.erb +42 -0
- data/docs/resources/systemd_service.md.erb +57 -0
- data/docs/resources/sysv_service.md.erb +57 -0
- data/docs/resources/upstart_service.md.erb +57 -0
- data/docs/resources/user.md.erb +140 -0
- data/docs/resources/users.md.erb +127 -0
- data/docs/resources/vbscript.md.erb +55 -0
- data/docs/resources/virtualization.md.erb +57 -0
- data/docs/resources/windows_feature.md.erb +47 -0
- data/docs/resources/windows_hotfix.md.erb +53 -0
- data/docs/resources/windows_task.md.erb +95 -0
- data/docs/resources/wmi.md.erb +81 -0
- data/docs/resources/x509_certificate.md.erb +151 -0
- data/docs/resources/xinetd_conf.md.erb +156 -0
- data/docs/resources/xml.md.erb +85 -0
- data/docs/resources/yaml.md.erb +69 -0
- data/docs/resources/yum.md.erb +98 -0
- data/docs/resources/zfs_dataset.md.erb +53 -0
- data/docs/resources/zfs_pool.md.erb +47 -0
- data/docs/ruby_usage.md +203 -0
- data/docs/shared/matcher_be.md.erb +1 -0
- data/docs/shared/matcher_cmp.md.erb +43 -0
- data/docs/shared/matcher_eq.md.erb +3 -0
- data/docs/shared/matcher_include.md.erb +1 -0
- data/docs/shared/matcher_match.md.erb +1 -0
- data/docs/shell.md +217 -0
- data/examples/README.md +8 -0
- data/examples/inheritance/README.md +65 -0
- data/examples/inheritance/controls/example.rb +14 -0
- data/examples/inheritance/inspec.yml +15 -0
- data/examples/kitchen-ansible/.kitchen.yml +25 -0
- data/examples/kitchen-ansible/Gemfile +19 -0
- data/examples/kitchen-ansible/README.md +53 -0
- data/examples/kitchen-ansible/files/nginx.repo +6 -0
- data/examples/kitchen-ansible/tasks/main.yml +16 -0
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -0
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -0
- data/examples/kitchen-chef/.kitchen.yml +20 -0
- data/examples/kitchen-chef/Berksfile +3 -0
- data/examples/kitchen-chef/Gemfile +19 -0
- data/examples/kitchen-chef/README.md +27 -0
- data/examples/kitchen-chef/metadata.rb +7 -0
- data/examples/kitchen-chef/recipes/default.rb +6 -0
- data/examples/kitchen-chef/recipes/nginx.rb +30 -0
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -0
- data/examples/kitchen-puppet/.kitchen.yml +23 -0
- data/examples/kitchen-puppet/Gemfile +20 -0
- data/examples/kitchen-puppet/Puppetfile +25 -0
- data/examples/kitchen-puppet/README.md +53 -0
- data/examples/kitchen-puppet/manifests/site.pp +33 -0
- data/examples/kitchen-puppet/metadata.json +11 -0
- data/examples/kitchen-puppet/modules/.gitkeep +0 -0
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -0
- data/examples/meta-profile/README.md +37 -0
- data/examples/meta-profile/controls/example.rb +13 -0
- data/examples/meta-profile/inspec.yml +13 -0
- data/examples/profile-attribute.yml +2 -0
- data/examples/profile-attribute/README.md +14 -0
- data/examples/profile-attribute/controls/example.rb +11 -0
- data/examples/profile-attribute/inspec.yml +8 -0
- data/examples/profile-sensitive/README.md +29 -0
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -0
- data/examples/profile-sensitive/controls/sensitive.rb +9 -0
- data/examples/profile-sensitive/inspec.yml +8 -0
- data/examples/profile/README.md +48 -0
- data/examples/profile/controls/example.rb +23 -0
- data/examples/profile/controls/gordon.rb +36 -0
- data/examples/profile/controls/meta.rb +34 -0
- data/examples/profile/inspec.yml +10 -0
- data/examples/profile/libraries/gordon_config.rb +59 -0
- data/inspec-core.gemspec +43 -0
- data/lib/bundles/README.md +3 -0
- data/lib/bundles/inspec-artifact.rb +7 -0
- data/lib/bundles/inspec-artifact/README.md +1 -0
- data/lib/bundles/inspec-artifact/cli.rb +277 -0
- data/lib/bundles/inspec-compliance.rb +16 -0
- data/lib/bundles/inspec-compliance/.kitchen.yml +20 -0
- data/lib/bundles/inspec-compliance/README.md +193 -0
- data/lib/bundles/inspec-compliance/api.rb +360 -0
- data/lib/bundles/inspec-compliance/api/login.rb +193 -0
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -0
- data/lib/bundles/inspec-compliance/cli.rb +260 -0
- data/lib/bundles/inspec-compliance/configuration.rb +103 -0
- data/lib/bundles/inspec-compliance/http.rb +125 -0
- data/lib/bundles/inspec-compliance/images/cc-token.png +0 -0
- data/lib/bundles/inspec-compliance/support.rb +36 -0
- data/lib/bundles/inspec-compliance/target.rb +106 -0
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -0
- data/lib/bundles/inspec-habitat.rb +12 -0
- data/lib/bundles/inspec-habitat/cli.rb +36 -0
- data/lib/bundles/inspec-habitat/log.rb +10 -0
- data/lib/bundles/inspec-habitat/profile.rb +391 -0
- data/lib/bundles/inspec-init.rb +8 -0
- data/lib/bundles/inspec-init/README.md +31 -0
- data/lib/bundles/inspec-init/cli.rb +97 -0
- data/lib/bundles/inspec-init/templates/profile/README.md +3 -0
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -0
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -0
- data/lib/bundles/inspec-init/templates/profile/libraries/.gitkeep +0 -0
- data/lib/bundles/inspec-supermarket.rb +13 -0
- data/lib/bundles/inspec-supermarket/README.md +45 -0
- data/lib/bundles/inspec-supermarket/api.rb +84 -0
- data/lib/bundles/inspec-supermarket/cli.rb +73 -0
- data/lib/bundles/inspec-supermarket/target.rb +34 -0
- data/lib/fetchers/git.rb +163 -0
- data/lib/fetchers/local.rb +74 -0
- data/lib/fetchers/mock.rb +35 -0
- data/lib/fetchers/url.rb +247 -0
- data/lib/inspec.rb +24 -0
- data/lib/inspec/archive/tar.rb +29 -0
- data/lib/inspec/archive/zip.rb +19 -0
- data/lib/inspec/backend.rb +93 -0
- data/lib/inspec/base_cli.rb +368 -0
- data/lib/inspec/cached_fetcher.rb +66 -0
- data/lib/inspec/cli.rb +292 -0
- data/lib/inspec/completions/bash.sh.erb +45 -0
- data/lib/inspec/completions/fish.sh.erb +34 -0
- data/lib/inspec/completions/zsh.sh.erb +61 -0
- data/lib/inspec/control_eval_context.rb +179 -0
- data/lib/inspec/dependencies/cache.rb +72 -0
- data/lib/inspec/dependencies/dependency_set.rb +92 -0
- data/lib/inspec/dependencies/lockfile.rb +115 -0
- data/lib/inspec/dependencies/requirement.rb +123 -0
- data/lib/inspec/dependencies/resolver.rb +86 -0
- data/lib/inspec/describe.rb +27 -0
- data/lib/inspec/dsl.rb +66 -0
- data/lib/inspec/dsl_shared.rb +33 -0
- data/lib/inspec/env_printer.rb +157 -0
- data/lib/inspec/errors.rb +14 -0
- data/lib/inspec/exceptions.rb +12 -0
- data/lib/inspec/expect.rb +45 -0
- data/lib/inspec/fetcher.rb +45 -0
- data/lib/inspec/file_provider.rb +275 -0
- data/lib/inspec/formatters.rb +3 -0
- data/lib/inspec/formatters/base.rb +259 -0
- data/lib/inspec/formatters/json_rspec.rb +20 -0
- data/lib/inspec/formatters/show_progress.rb +12 -0
- data/lib/inspec/library_eval_context.rb +58 -0
- data/lib/inspec/log.rb +11 -0
- data/lib/inspec/metadata.rb +247 -0
- data/lib/inspec/method_source.rb +24 -0
- data/lib/inspec/objects.rb +14 -0
- data/lib/inspec/objects/attribute.rb +75 -0
- data/lib/inspec/objects/control.rb +61 -0
- data/lib/inspec/objects/describe.rb +92 -0
- data/lib/inspec/objects/each_loop.rb +36 -0
- data/lib/inspec/objects/list.rb +15 -0
- data/lib/inspec/objects/or_test.rb +40 -0
- data/lib/inspec/objects/ruby_helper.rb +15 -0
- data/lib/inspec/objects/tag.rb +27 -0
- data/lib/inspec/objects/test.rb +87 -0
- data/lib/inspec/objects/value.rb +27 -0
- data/lib/inspec/plugins.rb +60 -0
- data/lib/inspec/plugins/cli.rb +24 -0
- data/lib/inspec/plugins/fetcher.rb +86 -0
- data/lib/inspec/plugins/resource.rb +135 -0
- data/lib/inspec/plugins/secret.rb +15 -0
- data/lib/inspec/plugins/source_reader.rb +40 -0
- data/lib/inspec/polyfill.rb +12 -0
- data/lib/inspec/profile.rb +513 -0
- data/lib/inspec/profile_context.rb +208 -0
- data/lib/inspec/profile_vendor.rb +66 -0
- data/lib/inspec/reporters.rb +60 -0
- data/lib/inspec/reporters/automate.rb +76 -0
- data/lib/inspec/reporters/base.rb +25 -0
- data/lib/inspec/reporters/cli.rb +356 -0
- data/lib/inspec/reporters/json.rb +116 -0
- data/lib/inspec/reporters/json_min.rb +48 -0
- data/lib/inspec/reporters/junit.rb +78 -0
- data/lib/inspec/require_loader.rb +33 -0
- data/lib/inspec/resource.rb +190 -0
- data/lib/inspec/rule.rb +280 -0
- data/lib/inspec/runner.rb +345 -0
- data/lib/inspec/runner_mock.rb +41 -0
- data/lib/inspec/runner_rspec.rb +175 -0
- data/lib/inspec/runtime_profile.rb +26 -0
- data/lib/inspec/schema.rb +213 -0
- data/lib/inspec/secrets.rb +19 -0
- data/lib/inspec/secrets/yaml.rb +30 -0
- data/lib/inspec/shell.rb +220 -0
- data/lib/inspec/shell_detector.rb +90 -0
- data/lib/inspec/source_reader.rb +29 -0
- data/lib/inspec/version.rb +8 -0
- data/lib/matchers/matchers.rb +339 -0
- data/lib/resources/aide_conf.rb +151 -0
- data/lib/resources/apache.rb +48 -0
- data/lib/resources/apache_conf.rb +149 -0
- data/lib/resources/apt.rb +149 -0
- data/lib/resources/audit_policy.rb +63 -0
- data/lib/resources/auditd.rb +231 -0
- data/lib/resources/auditd_conf.rb +46 -0
- data/lib/resources/bash.rb +35 -0
- data/lib/resources/bond.rb +69 -0
- data/lib/resources/bridge.rb +122 -0
- data/lib/resources/chocolatey_package.rb +78 -0
- data/lib/resources/command.rb +73 -0
- data/lib/resources/cpan.rb +58 -0
- data/lib/resources/cran.rb +64 -0
- data/lib/resources/crontab.rb +169 -0
- data/lib/resources/csv.rb +56 -0
- data/lib/resources/dh_params.rb +77 -0
- data/lib/resources/directory.rb +25 -0
- data/lib/resources/docker.rb +236 -0
- data/lib/resources/docker_container.rb +89 -0
- data/lib/resources/docker_image.rb +83 -0
- data/lib/resources/docker_object.rb +57 -0
- data/lib/resources/docker_service.rb +90 -0
- data/lib/resources/elasticsearch.rb +169 -0
- data/lib/resources/etc_fstab.rb +94 -0
- data/lib/resources/etc_group.rb +154 -0
- data/lib/resources/etc_hosts.rb +66 -0
- data/lib/resources/etc_hosts_allow_deny.rb +112 -0
- data/lib/resources/file.rb +298 -0
- data/lib/resources/filesystem.rb +31 -0
- data/lib/resources/firewalld.rb +143 -0
- data/lib/resources/gem.rb +70 -0
- data/lib/resources/groups.rb +215 -0
- data/lib/resources/grub_conf.rb +227 -0
- data/lib/resources/host.rb +306 -0
- data/lib/resources/http.rb +253 -0
- data/lib/resources/iis_app.rb +101 -0
- data/lib/resources/iis_site.rb +148 -0
- data/lib/resources/inetd_conf.rb +54 -0
- data/lib/resources/ini.rb +29 -0
- data/lib/resources/interface.rb +129 -0
- data/lib/resources/iptables.rb +80 -0
- data/lib/resources/json.rb +111 -0
- data/lib/resources/kernel_module.rb +107 -0
- data/lib/resources/kernel_parameter.rb +58 -0
- data/lib/resources/key_rsa.rb +63 -0
- data/lib/resources/limits_conf.rb +46 -0
- data/lib/resources/login_def.rb +57 -0
- data/lib/resources/mount.rb +88 -0
- data/lib/resources/mssql_session.rb +101 -0
- data/lib/resources/mysql.rb +82 -0
- data/lib/resources/mysql_conf.rb +127 -0
- data/lib/resources/mysql_session.rb +85 -0
- data/lib/resources/nginx.rb +96 -0
- data/lib/resources/nginx_conf.rb +226 -0
- data/lib/resources/npm.rb +48 -0
- data/lib/resources/ntp_conf.rb +51 -0
- data/lib/resources/oneget.rb +71 -0
- data/lib/resources/oracledb_session.rb +139 -0
- data/lib/resources/os.rb +36 -0
- data/lib/resources/os_env.rb +86 -0
- data/lib/resources/package.rb +370 -0
- data/lib/resources/packages.rb +111 -0
- data/lib/resources/parse_config.rb +112 -0
- data/lib/resources/passwd.rb +76 -0
- data/lib/resources/pip.rb +130 -0
- data/lib/resources/platform.rb +109 -0
- data/lib/resources/port.rb +771 -0
- data/lib/resources/postgres.rb +131 -0
- data/lib/resources/postgres_conf.rb +114 -0
- data/lib/resources/postgres_hba_conf.rb +90 -0
- data/lib/resources/postgres_ident_conf.rb +79 -0
- data/lib/resources/postgres_session.rb +71 -0
- data/lib/resources/powershell.rb +67 -0
- data/lib/resources/processes.rb +204 -0
- data/lib/resources/rabbitmq_conf.rb +51 -0
- data/lib/resources/registry_key.rb +297 -0
- data/lib/resources/security_policy.rb +180 -0
- data/lib/resources/service.rb +794 -0
- data/lib/resources/shadow.rb +159 -0
- data/lib/resources/ssh_conf.rb +97 -0
- data/lib/resources/ssl.rb +99 -0
- data/lib/resources/sys_info.rb +28 -0
- data/lib/resources/toml.rb +32 -0
- data/lib/resources/users.rb +654 -0
- data/lib/resources/vbscript.rb +68 -0
- data/lib/resources/virtualization.rb +247 -0
- data/lib/resources/windows_feature.rb +84 -0
- data/lib/resources/windows_hotfix.rb +35 -0
- data/lib/resources/windows_task.rb +102 -0
- data/lib/resources/wmi.rb +110 -0
- data/lib/resources/x509_certificate.rb +137 -0
- data/lib/resources/xinetd.rb +106 -0
- data/lib/resources/xml.rb +46 -0
- data/lib/resources/yaml.rb +43 -0
- data/lib/resources/yum.rb +180 -0
- data/lib/resources/zfs_dataset.rb +60 -0
- data/lib/resources/zfs_pool.rb +49 -0
- data/lib/source_readers/flat.rb +39 -0
- data/lib/source_readers/inspec.rb +75 -0
- data/lib/utils/command_wrapper.rb +27 -0
- data/lib/utils/convert.rb +12 -0
- data/lib/utils/database_helpers.rb +77 -0
- data/lib/utils/enumerable_delegation.rb +9 -0
- data/lib/utils/erlang_parser.rb +192 -0
- data/lib/utils/file_reader.rb +25 -0
- data/lib/utils/filter.rb +273 -0
- data/lib/utils/filter_array.rb +27 -0
- data/lib/utils/find_files.rb +47 -0
- data/lib/utils/hash.rb +41 -0
- data/lib/utils/json_log.rb +18 -0
- data/lib/utils/latest_version.rb +22 -0
- data/lib/utils/modulator.rb +12 -0
- data/lib/utils/nginx_parser.rb +105 -0
- data/lib/utils/object_traversal.rb +49 -0
- data/lib/utils/parser.rb +274 -0
- data/lib/utils/pkey_reader.rb +15 -0
- data/lib/utils/plugin_registry.rb +93 -0
- data/lib/utils/simpleconfig.rb +120 -0
- data/lib/utils/spdx.rb +13 -0
- data/lib/utils/spdx.txt +344 -0
- metadata +713 -0
@@ -0,0 +1,157 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'inspec/shell_detector'
|
3
|
+
require 'erb'
|
4
|
+
require 'shellwords'
|
5
|
+
|
6
|
+
module Inspec
|
7
|
+
class EnvPrinter
|
8
|
+
attr_reader :shell
|
9
|
+
|
10
|
+
EVAL_COMMANDS = {
|
11
|
+
'bash' => 'eval \"$(inspec env bash)\"',
|
12
|
+
'fish' => 'inspec env fish > ~/.config/fish/completions/inspec.fish',
|
13
|
+
'zsh' => 'eval \"$(inspec env zsh)\"',
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
def initialize(command_class, shell = nil)
|
17
|
+
if !shell
|
18
|
+
@detected = true
|
19
|
+
@shell = Inspec::ShellDetector.new.shell
|
20
|
+
else
|
21
|
+
@shell = shell
|
22
|
+
end
|
23
|
+
@command_class = command_class
|
24
|
+
end
|
25
|
+
|
26
|
+
def print_and_exit!
|
27
|
+
exit_no_shell if !have_shell?
|
28
|
+
exit_no_completion if !have_shell_completion?
|
29
|
+
|
30
|
+
print_completion_for_shell
|
31
|
+
print_detection_warning($stdout) if @detected
|
32
|
+
print_usage_guidance
|
33
|
+
exit 0
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def print_completion_for_shell
|
39
|
+
erb = ERB.new(File.read(completion_template_path), nil, '-')
|
40
|
+
puts erb.result(TemplateContext.new(@command_class).get_bindings)
|
41
|
+
end
|
42
|
+
|
43
|
+
def have_shell?
|
44
|
+
!(@shell.nil? || @shell.empty?)
|
45
|
+
end
|
46
|
+
|
47
|
+
def have_shell_completion?
|
48
|
+
File.exist?(completion_template_path)
|
49
|
+
end
|
50
|
+
|
51
|
+
def completion_dir
|
52
|
+
File.join(File.dirname(__FILE__), 'completions')
|
53
|
+
end
|
54
|
+
|
55
|
+
def completion_template_path
|
56
|
+
File.join(completion_dir, "#{@shell}.sh.erb")
|
57
|
+
end
|
58
|
+
|
59
|
+
def shells_with_completions
|
60
|
+
Dir.glob("#{completion_dir}/*.sh.erb").map { |f| File.basename(f, '.sh.erb') }
|
61
|
+
end
|
62
|
+
|
63
|
+
def print_usage_guidance
|
64
|
+
puts <<~EOF
|
65
|
+
# To use this, eval it in your shell
|
66
|
+
#
|
67
|
+
# #{EVAL_COMMANDS[shell]}
|
68
|
+
#
|
69
|
+
#
|
70
|
+
EOF
|
71
|
+
end
|
72
|
+
|
73
|
+
def print_detection_warning(device)
|
74
|
+
device.puts <<~EOF
|
75
|
+
#
|
76
|
+
# The shell #{@shell} was auto-detected. If this is incorrect, please
|
77
|
+
# specify a shell explicitly by running:
|
78
|
+
#
|
79
|
+
# inspec env SHELLNAME
|
80
|
+
#
|
81
|
+
# Currently supported shells are: #{shells_with_completions.join(', ')}
|
82
|
+
#
|
83
|
+
EOF
|
84
|
+
end
|
85
|
+
|
86
|
+
def exit_no_completion
|
87
|
+
$stderr.puts "# No completion script for #{@shell}!"
|
88
|
+
print_detection_warning($stderr) if @detected
|
89
|
+
exit 1
|
90
|
+
end
|
91
|
+
|
92
|
+
def exit_no_shell
|
93
|
+
if @detected
|
94
|
+
$stderr.puts '# Unable to automatically detect shell and no shell was provided.'
|
95
|
+
end
|
96
|
+
$stderr.puts <<~EOF
|
97
|
+
#
|
98
|
+
# Please provide the name of your shell via the command line:
|
99
|
+
#
|
100
|
+
# inspec env SHELLNAME
|
101
|
+
#
|
102
|
+
# Currently supported shells are: #{shells_with_completions.join(', ')}
|
103
|
+
EOF
|
104
|
+
exit 1
|
105
|
+
end
|
106
|
+
|
107
|
+
class TemplateContext
|
108
|
+
def initialize(command_class)
|
109
|
+
@command_class = command_class
|
110
|
+
end
|
111
|
+
|
112
|
+
def get_bindings # rubocop:disable Style/AccessorMethodName
|
113
|
+
binding
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# The following functions all assume that @command_class
|
118
|
+
# is something that provides a Thor-like API
|
119
|
+
#
|
120
|
+
def top_level_commands
|
121
|
+
commands_for_thor_class(@command_class)
|
122
|
+
end
|
123
|
+
|
124
|
+
def top_level_commands_with_descriptions
|
125
|
+
descript_lines_for_class(@command_class)
|
126
|
+
end
|
127
|
+
|
128
|
+
def subcommands_with_commands
|
129
|
+
ret = {}
|
130
|
+
@command_class.subcommand_classes.each do |k, v|
|
131
|
+
ret[k] = commands_for_thor_class(v)
|
132
|
+
end
|
133
|
+
ret
|
134
|
+
end
|
135
|
+
|
136
|
+
def subcommands_with_commands_and_descriptions
|
137
|
+
ret = {}
|
138
|
+
@command_class.subcommand_classes.each do |k, v|
|
139
|
+
ret[k] = descript_lines_for_class(v)
|
140
|
+
end
|
141
|
+
ret
|
142
|
+
end
|
143
|
+
|
144
|
+
def commands_for_thor_class(thor_class)
|
145
|
+
thor_class.all_commands.values.map { |c| c.usage.split.first }
|
146
|
+
end
|
147
|
+
|
148
|
+
def descript_lines_for_class(thor_class)
|
149
|
+
thor_class.all_commands.values.map { |c| descript_line_for_command(c) }
|
150
|
+
end
|
151
|
+
|
152
|
+
def descript_line_for_command(c)
|
153
|
+
"#{c.usage.split.first}:#{Shellwords.escape(c.description)}"
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Dominik Richter
|
3
|
+
# author: Christoph Hartmann
|
4
|
+
|
5
|
+
module Inspec
|
6
|
+
class Error < StandardError; end
|
7
|
+
|
8
|
+
# dependency resolution
|
9
|
+
class CyclicDependencyError < Error; end
|
10
|
+
class UnsatisfiedVersionSpecification < Error; end
|
11
|
+
class DuplicateDep < Error; end
|
12
|
+
class FetcherFailure < Error; end
|
13
|
+
class ReporterError < Error; end
|
14
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2017, Chef Software Inc.
|
3
|
+
|
4
|
+
module Inspec
|
5
|
+
module Exceptions
|
6
|
+
class AttributesFileDoesNotExist < ArgumentError; end
|
7
|
+
class AttributesFileNotReadable < ArgumentError; end
|
8
|
+
class ResourceFailed < StandardError; end
|
9
|
+
class ResourceSkipped < StandardError; end
|
10
|
+
class SecretsBackendNotFound < ArgumentError; end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2016, Chef Software Inc.
|
3
|
+
# author: Dominik Richter
|
4
|
+
# author: Christoph Hartmann
|
5
|
+
|
6
|
+
require 'rspec/expectations'
|
7
|
+
|
8
|
+
module Inspec
|
9
|
+
class Expect
|
10
|
+
attr_reader :calls, :value, :block
|
11
|
+
def initialize(value, &block)
|
12
|
+
@value = value
|
13
|
+
@block = block
|
14
|
+
@calls = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def to(*args, &block)
|
18
|
+
@calls.push([:to, args, block, caller])
|
19
|
+
end
|
20
|
+
|
21
|
+
def not_to(*args, &block)
|
22
|
+
@calls.push([:not_to, args, block, caller])
|
23
|
+
end
|
24
|
+
|
25
|
+
def example_group
|
26
|
+
that = self
|
27
|
+
|
28
|
+
opts = { 'caller' => calls[0][3] }
|
29
|
+
if !calls[0][3].nil? && !calls[0][3].empty? &&
|
30
|
+
(m = calls[0][3][0].match(/^([^:]*):(\d+):/))
|
31
|
+
opts['file_path'] = m[0]
|
32
|
+
opts['line_number'] = m[1]
|
33
|
+
end
|
34
|
+
|
35
|
+
RSpec::Core::ExampleGroup.describe(that.value, opts) do
|
36
|
+
that.calls.each do |method, args, block, clr|
|
37
|
+
it(nil, caller: clr) do
|
38
|
+
x = expect(that.value, &that.block).method(method)
|
39
|
+
x.call(*args, &block)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Dominik Richter
|
3
|
+
# author: Christoph Hartmann
|
4
|
+
|
5
|
+
require 'inspec/plugins'
|
6
|
+
require 'utils/plugin_registry'
|
7
|
+
|
8
|
+
module Inspec
|
9
|
+
class FetcherRegistry < PluginRegistry
|
10
|
+
def resolve(target)
|
11
|
+
if fetcher_specified?(target)
|
12
|
+
super(target)
|
13
|
+
else
|
14
|
+
Inspec::Log.debug("Assuming default supermarket source for #{target}")
|
15
|
+
super(with_default_fetcher(target))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
NON_FETCHER_KEYS = [:name, :version_constraint, :cwd, :backend, :cache, :sha256].freeze
|
20
|
+
def fetcher_specified?(target)
|
21
|
+
# Only set a default for Hash-based (i.e. from
|
22
|
+
# inspec.yml/inspec.lock) targets
|
23
|
+
|
24
|
+
return true if !target.respond_to?(:keys)
|
25
|
+
!(target.keys - NON_FETCHER_KEYS).empty?
|
26
|
+
end
|
27
|
+
|
28
|
+
def with_default_fetcher(target)
|
29
|
+
target.merge({ supermarket: target[:name] })
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Fetcher = FetcherRegistry.new
|
34
|
+
|
35
|
+
def self.fetcher(version)
|
36
|
+
if version != 1
|
37
|
+
raise 'Only fetcher version 1 is supported!'
|
38
|
+
end
|
39
|
+
Inspec::Plugins::Fetcher
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
require 'fetchers/local'
|
44
|
+
require 'fetchers/url'
|
45
|
+
require 'fetchers/git'
|
@@ -0,0 +1,275 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rubygems/package'
|
3
|
+
require 'zlib'
|
4
|
+
require 'zip'
|
5
|
+
|
6
|
+
module Inspec
|
7
|
+
class FileProvider
|
8
|
+
def self.for_path(path)
|
9
|
+
if path.is_a?(Hash)
|
10
|
+
MockProvider.new(path)
|
11
|
+
elsif File.directory?(path)
|
12
|
+
DirProvider.new(path)
|
13
|
+
elsif File.exist?(path) && path.end_with?('.tar.gz', 'tgz')
|
14
|
+
TarProvider.new(path)
|
15
|
+
elsif File.exist?(path) && path.end_with?('.zip')
|
16
|
+
ZipProvider.new(path)
|
17
|
+
elsif File.exist?(path)
|
18
|
+
DirProvider.new(path)
|
19
|
+
else
|
20
|
+
raise "No file provider for the provided path: #{path}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(_path)
|
25
|
+
end
|
26
|
+
|
27
|
+
# List all files that are offered.
|
28
|
+
#
|
29
|
+
# @return [Array[String]] list of file paths that are included
|
30
|
+
def files
|
31
|
+
raise "Fetcher #{self} does not implement `files()`. This is required."
|
32
|
+
end
|
33
|
+
|
34
|
+
# Read the contents of a file. This will typically refer to a text
|
35
|
+
# file reading a string.
|
36
|
+
#
|
37
|
+
# @param _file [String] path of the file to be read
|
38
|
+
# @return [String] contents of the file described
|
39
|
+
def read(_file)
|
40
|
+
raise "#{self} does not implement `read(...)`. This is required."
|
41
|
+
end
|
42
|
+
|
43
|
+
# Provide a method for reading binary contents from a file.
|
44
|
+
# It will default to #read if not defined. For most streams that implement
|
45
|
+
# it, it will be the same. For some special cases, it will add change the
|
46
|
+
# way in which encoding of the returned data structure is handled.
|
47
|
+
# Does not work with alias nor alias_method.
|
48
|
+
def binread(file)
|
49
|
+
read(file)
|
50
|
+
end
|
51
|
+
|
52
|
+
def relative_provider
|
53
|
+
RelativeFileProvider.new(self)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class MockProvider < FileProvider
|
58
|
+
attr_reader :files
|
59
|
+
def initialize(path)
|
60
|
+
@data = path[:mock]
|
61
|
+
@files = @data.keys
|
62
|
+
end
|
63
|
+
|
64
|
+
def read(file)
|
65
|
+
@data[file]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class DirProvider < FileProvider
|
70
|
+
attr_reader :files
|
71
|
+
def initialize(path)
|
72
|
+
@files = if File.file?(path)
|
73
|
+
[path]
|
74
|
+
else
|
75
|
+
Dir[File.join(Shellwords.shellescape(path), '**', '*')]
|
76
|
+
end
|
77
|
+
@path = path
|
78
|
+
end
|
79
|
+
|
80
|
+
def read(file)
|
81
|
+
return nil unless files.include?(file)
|
82
|
+
return nil unless File.file?(file)
|
83
|
+
File.read(file)
|
84
|
+
end
|
85
|
+
|
86
|
+
def binread(file)
|
87
|
+
return nil unless files.include?(file)
|
88
|
+
return nil unless File.file?(file)
|
89
|
+
File.binread(file)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class ZipProvider < FileProvider
|
94
|
+
attr_reader :files
|
95
|
+
|
96
|
+
def initialize(path)
|
97
|
+
@path = path
|
98
|
+
@contents = {}
|
99
|
+
@files = []
|
100
|
+
walk_zip(@path) do |io|
|
101
|
+
while (entry = io.get_next_entry)
|
102
|
+
name = entry.name.sub(%r{/+$}, '')
|
103
|
+
@files.push(name) unless name.empty?
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def read(file)
|
109
|
+
@contents[file] ||= read_from_zip(file)
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def walk_zip(path, &callback)
|
115
|
+
::Zip::InputStream.open(path, &callback)
|
116
|
+
end
|
117
|
+
|
118
|
+
def read_from_zip(file)
|
119
|
+
return nil unless @files.include?(file)
|
120
|
+
res = nil
|
121
|
+
walk_zip(@path) do |io|
|
122
|
+
while (entry = io.get_next_entry)
|
123
|
+
next unless file == entry.name
|
124
|
+
res = io.read
|
125
|
+
break
|
126
|
+
end
|
127
|
+
end
|
128
|
+
res
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
class TarProvider < FileProvider
|
133
|
+
attr_reader :files
|
134
|
+
|
135
|
+
def initialize(path)
|
136
|
+
@path = path
|
137
|
+
@contents = {}
|
138
|
+
@files = []
|
139
|
+
walk_tar(@path) do |tar|
|
140
|
+
@files = tar.find_all(&:file?)
|
141
|
+
|
142
|
+
# delete all entries with no name
|
143
|
+
@files = @files.find_all { |x| !x.full_name.empty? }
|
144
|
+
|
145
|
+
# delete all entries that have a PaxHeader
|
146
|
+
@files = @files.delete_if { |x| x.full_name.include?('PaxHeader/') }
|
147
|
+
|
148
|
+
# replace all items of the array simply with the relative filename of the file
|
149
|
+
@files.map! { |x| Pathname.new(x.full_name).relative_path_from(Pathname.new('.')).to_s }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def read(file)
|
154
|
+
@contents[file] ||= read_from_tar(file)
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
159
|
+
def walk_tar(path, &callback)
|
160
|
+
Gem::Package::TarReader.new(Zlib::GzipReader.open(path), &callback)
|
161
|
+
end
|
162
|
+
|
163
|
+
def read_from_tar(file)
|
164
|
+
return nil unless @files.include?(file)
|
165
|
+
res = nil
|
166
|
+
# NB `TarReader` includes `Enumerable` beginning with Ruby 2.x
|
167
|
+
walk_tar(@path) do |tar|
|
168
|
+
tar.each do |entry|
|
169
|
+
next unless entry.file? && [file, "./#{file}"].include?(entry.full_name)
|
170
|
+
res = entry.read
|
171
|
+
break
|
172
|
+
end
|
173
|
+
end
|
174
|
+
res
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
class RelativeFileProvider
|
179
|
+
BLACKLIST_FILES = [
|
180
|
+
'/pax_global_header',
|
181
|
+
'pax_global_header',
|
182
|
+
].freeze
|
183
|
+
|
184
|
+
attr_reader :files
|
185
|
+
attr_reader :prefix
|
186
|
+
attr_reader :parent
|
187
|
+
|
188
|
+
def initialize(parent_provider)
|
189
|
+
@parent = parent_provider
|
190
|
+
@prefix = get_prefix(parent.files)
|
191
|
+
if @prefix.nil?
|
192
|
+
raise "Could not determine path prefix for #{parent}"
|
193
|
+
end
|
194
|
+
|
195
|
+
# select all files that begin with the prefix, and strip off the prefix from the file.
|
196
|
+
#
|
197
|
+
# strip off any leading top-level relative path (./) which is common in
|
198
|
+
# PAX-formatted tar files. Do not do any translation of the path if the
|
199
|
+
# path is an absolute path.
|
200
|
+
@files = parent.files
|
201
|
+
.find_all { |x| x.start_with?(prefix) && x != prefix }
|
202
|
+
.map { |x| x[prefix.length..-1] }
|
203
|
+
.map do |x|
|
204
|
+
path = Pathname.new(x)
|
205
|
+
path.absolute? ? path.to_s : path.relative_path_from(Pathname.new('.')).to_s
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def abs_path(file)
|
210
|
+
return nil if file.nil?
|
211
|
+
prefix + file
|
212
|
+
end
|
213
|
+
|
214
|
+
def read(file)
|
215
|
+
parent.read(abs_path(file))
|
216
|
+
end
|
217
|
+
|
218
|
+
def binread(file)
|
219
|
+
parent.binread(abs_path(file))
|
220
|
+
end
|
221
|
+
|
222
|
+
private
|
223
|
+
|
224
|
+
def get_prefix(fs)
|
225
|
+
return '' if fs.empty?
|
226
|
+
|
227
|
+
# filter backlisted files
|
228
|
+
fs -= BLACKLIST_FILES
|
229
|
+
|
230
|
+
sorted = fs.sort_by(&:length)
|
231
|
+
get_folder_prefix(sorted)
|
232
|
+
end
|
233
|
+
|
234
|
+
def prefix_candidate_for(file)
|
235
|
+
if file.end_with?(File::SEPARATOR)
|
236
|
+
file
|
237
|
+
else
|
238
|
+
file + File::SEPARATOR
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
def get_folder_prefix(fs)
|
243
|
+
return get_files_prefix(fs) if fs.length == 1
|
244
|
+
first, *rest = fs
|
245
|
+
pre = prefix_candidate_for(first)
|
246
|
+
|
247
|
+
if rest.all? { |i| i.start_with? pre }
|
248
|
+
return get_folder_prefix(rest)
|
249
|
+
end
|
250
|
+
get_files_prefix(fs)
|
251
|
+
end
|
252
|
+
|
253
|
+
def get_files_prefix(fs)
|
254
|
+
return '' if fs.empty?
|
255
|
+
|
256
|
+
file = fs[0]
|
257
|
+
bn = File.basename(file)
|
258
|
+
# no more prefixes
|
259
|
+
return '' if bn == file
|
260
|
+
|
261
|
+
i = file.rindex(bn)
|
262
|
+
pre = file[0..i-1]
|
263
|
+
|
264
|
+
rest = fs.find_all { |f| !f.start_with?(pre) }
|
265
|
+
return pre if rest.empty?
|
266
|
+
|
267
|
+
new_pre = get_prefix(rest)
|
268
|
+
return new_pre if pre.start_with? new_pre
|
269
|
+
# edge case: completely different prefixes; retry prefix detection
|
270
|
+
a = File.dirname(pre + 'a')
|
271
|
+
b = File.dirname(new_pre + 'b')
|
272
|
+
get_prefix([a, b])
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|