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,115 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Inspec
|
5
|
+
class Lockfile
|
6
|
+
# When we finalize this feature, we should set these to 1
|
7
|
+
MINIMUM_SUPPORTED_VERSION = 1
|
8
|
+
CURRENT_LOCKFILE_VERSION = 1
|
9
|
+
|
10
|
+
def self.from_dependency_set(dep_set)
|
11
|
+
lockfile_content = {
|
12
|
+
'lockfile_version' => CURRENT_LOCKFILE_VERSION,
|
13
|
+
'depends' => dep_set.to_array,
|
14
|
+
}
|
15
|
+
new(lockfile_content)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.from_content(content)
|
19
|
+
parsed_content = YAML.load(content)
|
20
|
+
version = parsed_content['lockfile_version']
|
21
|
+
raise "No lockfile_version set in #{path}!" if version.nil?
|
22
|
+
validate_lockfile_version!(version.to_i)
|
23
|
+
new(parsed_content)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.from_file(path)
|
27
|
+
content = File.read(path)
|
28
|
+
from_content(content)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.validate_lockfile_version!(version)
|
32
|
+
if version < MINIMUM_SUPPORTED_VERSION
|
33
|
+
raise <<~EOF
|
34
|
+
This lockfile specifies a lockfile_version of #{version} which is
|
35
|
+
lower than the minimum supported version #{MINIMUM_SUPPORTED_VERSION}.
|
36
|
+
|
37
|
+
Please create a new lockfile for this project by running:
|
38
|
+
|
39
|
+
inspec vendor
|
40
|
+
EOF
|
41
|
+
elsif version > CURRENT_LOCKFILE_VERSION
|
42
|
+
raise <<~EOF
|
43
|
+
This lockfile claims to be version #{version} which is greater than
|
44
|
+
the most recent lockfile version(#{CURRENT_LOCKFILE_VERSION}).
|
45
|
+
|
46
|
+
This may happen if you are using an older version of inspec than was
|
47
|
+
used to create the lockfile.
|
48
|
+
EOF
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
attr_reader :version, :deps
|
53
|
+
def initialize(lockfile_content_hash)
|
54
|
+
version = lockfile_content_hash['lockfile_version']
|
55
|
+
@version = version.to_i
|
56
|
+
parse_content_hash(lockfile_content_hash)
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_yaml
|
60
|
+
{
|
61
|
+
'lockfile_version' => CURRENT_LOCKFILE_VERSION,
|
62
|
+
'depends' => @deps.map { |i| stringify_keys(i) },
|
63
|
+
}.to_yaml
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
# Refactor this to be "version-wise" - i.e. make one dispatch
|
69
|
+
# function for each version so that even if it duplicates code,
|
70
|
+
# it can describe the part of the code that it expects to be
|
71
|
+
# different. Then that dispatch routine can call more well
|
72
|
+
# defined methods like "parse_v0_dependencies" or
|
73
|
+
# "parse_flat_dependencies" or what not as things generally
|
74
|
+
# develop. It does help people easily set breakpoints/track
|
75
|
+
# different entry points of the API.
|
76
|
+
def parse_content_hash(lockfile_content_hash)
|
77
|
+
case version
|
78
|
+
when 1
|
79
|
+
parse_content_hash_1(lockfile_content_hash)
|
80
|
+
else
|
81
|
+
# If we've gotten here, there is likely a mistake in the
|
82
|
+
# lockfile version validation in the constructor.
|
83
|
+
raise "No lockfile parser for version #{version}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def parse_content_hash_1(lockfile_content_hash)
|
88
|
+
@deps = lockfile_content_hash['depends']&.map { |i| symbolize_keys(i) }
|
89
|
+
end
|
90
|
+
|
91
|
+
def mutate_hash_keys_with(hash, fun)
|
92
|
+
hash.each_with_object({}) do |v, memo|
|
93
|
+
key = fun.call(v[0])
|
94
|
+
value = if v[1].is_a?(Hash)
|
95
|
+
mutate_hash_keys_with(v[1], fun)
|
96
|
+
elsif v[1].is_a?(Array)
|
97
|
+
v[1].map do |i|
|
98
|
+
i.is_a?(Hash) ? mutate_hash_keys_with(i, fun) : i
|
99
|
+
end
|
100
|
+
else
|
101
|
+
v[1]
|
102
|
+
end
|
103
|
+
memo[key] = value
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def stringify_keys(hash)
|
108
|
+
mutate_hash_keys_with(hash, proc { |i| i.to_s })
|
109
|
+
end
|
110
|
+
|
111
|
+
def symbolize_keys(hash)
|
112
|
+
mutate_hash_keys_with(hash, proc { |i| i.to_sym })
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'inspec/cached_fetcher'
|
3
|
+
require 'inspec/dependencies/dependency_set'
|
4
|
+
require 'semverse'
|
5
|
+
|
6
|
+
module Inspec
|
7
|
+
#
|
8
|
+
# Inspec::Requirement represents a given profile dependency, where
|
9
|
+
# appropriate we delegate to Inspec::Profile directly.
|
10
|
+
#
|
11
|
+
class Requirement
|
12
|
+
def self.from_metadata(dep, cache, opts)
|
13
|
+
raise 'Cannot load empty dependency.' if dep.nil? || dep.empty?
|
14
|
+
|
15
|
+
req_path = opts[:cwd]
|
16
|
+
|
17
|
+
if dep[:path]
|
18
|
+
req_path = File.expand_path(dep[:path], req_path)
|
19
|
+
end
|
20
|
+
|
21
|
+
new(dep[:name],
|
22
|
+
dep[:version],
|
23
|
+
cache,
|
24
|
+
req_path,
|
25
|
+
opts.merge(dep))
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.from_lock_entry(entry, cwd, cache, backend, opts = {})
|
29
|
+
req = new(entry[:name],
|
30
|
+
entry[:version_constraints],
|
31
|
+
cache,
|
32
|
+
cwd,
|
33
|
+
entry[:resolved_source].merge(backend: backend).merge(opts))
|
34
|
+
|
35
|
+
locked_deps = []
|
36
|
+
Array(entry[:dependencies]).each do |dep_entry|
|
37
|
+
locked_deps << Inspec::Requirement.from_lock_entry(dep_entry, cwd, cache, backend, opts)
|
38
|
+
end
|
39
|
+
req.lock_deps(locked_deps)
|
40
|
+
req
|
41
|
+
end
|
42
|
+
|
43
|
+
attr_reader :cwd, :opts, :version_constraints
|
44
|
+
def initialize(name, version_constraints, cache, cwd, opts)
|
45
|
+
@name = name
|
46
|
+
@version_constraints = Array(version_constraints)
|
47
|
+
@cache = cache
|
48
|
+
@backend = opts[:backend]
|
49
|
+
@opts = opts
|
50
|
+
@cwd = cwd
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# A dependency can be renamed in inspec.yml/inspec.lock. Prefer
|
55
|
+
# the name the user gave this dependency over the profile name.
|
56
|
+
#
|
57
|
+
def name
|
58
|
+
@name || profile.name
|
59
|
+
end
|
60
|
+
|
61
|
+
def source_version
|
62
|
+
profile.version
|
63
|
+
end
|
64
|
+
|
65
|
+
def source_satisfies_spec?
|
66
|
+
return true if version_constraints.empty?
|
67
|
+
|
68
|
+
# Semverse::Constraint.satisfy_all returns a list of versions that match all of the
|
69
|
+
# supplied constraints. Since we're only matching against a single version, the return
|
70
|
+
# of satisfy_all will be non-empty if the profile version we have satisfies the constraints.
|
71
|
+
constraints = @version_constraints.map { |x| Semverse::Constraint.new(x) }
|
72
|
+
!Semverse::Constraint.satisfy_all(constraints, Semverse::Version.new(profile.version)).empty?
|
73
|
+
end
|
74
|
+
|
75
|
+
def resolved_source
|
76
|
+
@resolved_source ||= fetcher.resolved_source
|
77
|
+
end
|
78
|
+
|
79
|
+
def to_hash
|
80
|
+
h = {
|
81
|
+
'name' => name,
|
82
|
+
'resolved_source' => resolved_source,
|
83
|
+
'version_constraints' => version_constraints,
|
84
|
+
}
|
85
|
+
|
86
|
+
if !dependencies.empty?
|
87
|
+
h['dependencies'] = dependencies.map(&:to_hash)
|
88
|
+
end
|
89
|
+
|
90
|
+
h
|
91
|
+
end
|
92
|
+
|
93
|
+
def lock_deps(dep_array)
|
94
|
+
@dependencies = dep_array
|
95
|
+
end
|
96
|
+
|
97
|
+
def fetcher
|
98
|
+
@fetcher ||= Inspec::CachedFetcher.new(opts, @cache)
|
99
|
+
end
|
100
|
+
|
101
|
+
# load dependencies of the dependency
|
102
|
+
def dependencies
|
103
|
+
@dependencies ||= profile.metadata.dependencies.map do |r|
|
104
|
+
Inspec::Requirement.from_metadata(r, @cache, cwd: @cwd, backend: @backend)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def to_s
|
109
|
+
name
|
110
|
+
end
|
111
|
+
|
112
|
+
# load the profile for the requirement
|
113
|
+
def profile
|
114
|
+
return @profile unless @profile.nil?
|
115
|
+
opts = @opts.dup
|
116
|
+
opts[:backend] = @backend
|
117
|
+
if !@dependencies.nil?
|
118
|
+
opts[:dependencies] = Inspec::DependencySet.from_array(@dependencies, @cwd, @cache, @backend)
|
119
|
+
end
|
120
|
+
@profile = Inspec::Profile.for_fetcher(fetcher, opts)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Steven Danna <steve@chef.io>
|
3
|
+
require 'inspec/log'
|
4
|
+
require 'inspec/errors'
|
5
|
+
|
6
|
+
module Inspec
|
7
|
+
#
|
8
|
+
# Inspec::Resolver is a simple dependency resolver. Unlike Bundler
|
9
|
+
# or Berkshelf, it does not attempt to resolve each named dependency
|
10
|
+
# to a single version. Rather, it traverses down the dependency tree
|
11
|
+
# and:
|
12
|
+
#
|
13
|
+
# - Fetches the dependency from the source
|
14
|
+
# - Checks the presence of cycles, and
|
15
|
+
# - Checks that the specified dependency source satisfies the
|
16
|
+
# specified version constraint
|
17
|
+
#
|
18
|
+
# The full dependency tree is then available for the loader, which
|
19
|
+
# will provide the isolation necessary to support multiple versions
|
20
|
+
# of the same profile being used at runtime.
|
21
|
+
#
|
22
|
+
# Currently the fetching happens somewhat lazily depending on the
|
23
|
+
# implementation of the fetcher being used.
|
24
|
+
#
|
25
|
+
class Resolver
|
26
|
+
def self.resolve(dependencies, cache, working_dir, backend)
|
27
|
+
reqs = dependencies.map do |dep|
|
28
|
+
req = Inspec::Requirement.from_metadata(dep, cache, cwd: working_dir, backend: backend)
|
29
|
+
req || raise("Cannot initialize dependency: #{req}")
|
30
|
+
end
|
31
|
+
new.resolve(reqs)
|
32
|
+
end
|
33
|
+
|
34
|
+
def detect_duplicates(deps, top_level, path_string)
|
35
|
+
seen_items_local = []
|
36
|
+
deps.each do |dep|
|
37
|
+
if seen_items_local.include?(dep.name)
|
38
|
+
problem_cookbook = if top_level
|
39
|
+
'the inspec.yml for this profile.'
|
40
|
+
else
|
41
|
+
"the dependency information for #{path_string.split(' ').last}"
|
42
|
+
end
|
43
|
+
raise Inspec::DuplicateDep, "The dependency #{dep.name} is listed twice in #{problem_cookbook}"
|
44
|
+
else
|
45
|
+
seen_items_local << dep.name
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def resolve(deps, top_level = true, seen_items = {}, path_string = '') # rubocop:disable Metrics/AbcSize
|
51
|
+
graph = {}
|
52
|
+
if top_level
|
53
|
+
Inspec::Log.debug("Starting traversal of dependencies #{deps.map(&:to_s)}")
|
54
|
+
else
|
55
|
+
Inspec::Log.debug("Traversing dependency tree of transitive dependency #{deps.map(&:name)}")
|
56
|
+
end
|
57
|
+
|
58
|
+
detect_duplicates(deps, top_level, path_string)
|
59
|
+
deps.each do |dep|
|
60
|
+
new_seen_items = seen_items.dup
|
61
|
+
new_path_string = if path_string.empty?
|
62
|
+
dep.name
|
63
|
+
else
|
64
|
+
path_string + " -> #{dep.name}"
|
65
|
+
end
|
66
|
+
|
67
|
+
raise Inspec::CyclicDependencyError, "Dependency #{dep} would cause a dependency cycle (#{new_path_string})" if new_seen_items.key?(dep.resolved_source)
|
68
|
+
|
69
|
+
new_seen_items[dep.resolved_source] = true
|
70
|
+
|
71
|
+
if !dep.source_satisfies_spec?
|
72
|
+
raise Inspec::UnsatisfiedVersionSpecification, "The profile #{dep.name} from #{dep.resolved_source} has a version #{dep.source_version} which doesn't match #{dep.version_constraints}"
|
73
|
+
end
|
74
|
+
|
75
|
+
Inspec::Log.debug("Adding dependency #{dep.name} (#{dep.resolved_source})")
|
76
|
+
graph[dep.name] = dep
|
77
|
+
if !dep.dependencies.empty?
|
78
|
+
resolve(dep.dependencies, false, new_seen_items.dup, new_path_string)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
Inspec::Log.debug('Dependency traversal complete.') if top_level
|
83
|
+
graph
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Dominik Richter
|
3
|
+
# author: Christoph Hartmann
|
4
|
+
|
5
|
+
module Inspec
|
6
|
+
class DescribeBase
|
7
|
+
def initialize(action)
|
8
|
+
@action = action
|
9
|
+
@checks = []
|
10
|
+
end
|
11
|
+
|
12
|
+
# Evaluate the given block and collect all checks. These will be registered
|
13
|
+
# with the callback function under the 'describe.one' name.
|
14
|
+
#
|
15
|
+
# @param [Proc] ruby block containing checks (e.g. via describe)
|
16
|
+
# @return [nil]
|
17
|
+
def one(&block)
|
18
|
+
return unless block_given?
|
19
|
+
instance_eval(&block)
|
20
|
+
@action.call('describe.one', @checks, nil)
|
21
|
+
end
|
22
|
+
|
23
|
+
def describe(*args, &block)
|
24
|
+
@checks.push(['describe', args, block])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/inspec/dsl.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Dominik Richter
|
3
|
+
# author: Dominik Richter
|
4
|
+
# author: Christoph Hartmann
|
5
|
+
require 'inspec/log'
|
6
|
+
|
7
|
+
module Inspec::DSL
|
8
|
+
def require_controls(id, &block)
|
9
|
+
opts = { profile_id: id, include_all: false, backend: @backend, conf: @conf, dependencies: @dependencies }
|
10
|
+
::Inspec::DSL.load_spec_files_for_profile(self, opts, &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def include_controls(id, &block)
|
14
|
+
opts = { profile_id: id, include_all: true, backend: @backend, conf: @conf, dependencies: @dependencies }
|
15
|
+
::Inspec::DSL.load_spec_files_for_profile(self, opts, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias require_rules require_controls
|
19
|
+
alias include_rules include_controls
|
20
|
+
|
21
|
+
def require_resource(options = {})
|
22
|
+
raise 'You must specify a specific resource name when calling require_resource()' if options[:resource].nil?
|
23
|
+
|
24
|
+
from_profile = options[:profile] || profile_name
|
25
|
+
target_name = options[:as] || options[:resource]
|
26
|
+
res = resource_class(from_profile, options[:resource])
|
27
|
+
add_resource(target_name, res)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.load_spec_files_for_profile(bind_context, opts, &block)
|
31
|
+
dependencies = opts[:dependencies]
|
32
|
+
profile_id = opts[:profile_id]
|
33
|
+
|
34
|
+
dep_entry = dependencies.list[profile_id]
|
35
|
+
if dep_entry.nil?
|
36
|
+
raise <<~EOF
|
37
|
+
Cannot load #{profile_id} since it is not listed as a dependency of #{bind_context.profile_name}.
|
38
|
+
|
39
|
+
Dependencies available from this context are:
|
40
|
+
#{dependencies.list.keys.join("\n ")}
|
41
|
+
EOF
|
42
|
+
end
|
43
|
+
|
44
|
+
context = dep_entry.profile.runner_context
|
45
|
+
# if we don't want all the rules, then just make 1 pass to get all rule_IDs
|
46
|
+
# that we want to keep from the original
|
47
|
+
filter_included_controls(context, dep_entry.profile, &block) if !opts[:include_all]
|
48
|
+
# interpret the block and skip/modify as required
|
49
|
+
context.load(block) if block_given?
|
50
|
+
bind_context.add_subcontext(context)
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.filter_included_controls(context, profile, &block)
|
54
|
+
mock = Inspec::Backend.create({ backend: 'mock' })
|
55
|
+
include_ctx = Inspec::ProfileContext.for_profile(profile, mock, {})
|
56
|
+
include_ctx.load(block) if block_given?
|
57
|
+
# remove all rules that were not registered
|
58
|
+
context.all_rules.each do |r|
|
59
|
+
id = Inspec::Rule.rule_id(r)
|
60
|
+
fid = Inspec::Rule.profile_id(r) + '/' + id
|
61
|
+
unless include_ctx.rules[id] || include_ctx.rules[fid]
|
62
|
+
context.remove_rule(fid)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Inspec
|
3
|
+
#
|
4
|
+
# Contains methods we would like in multiple DSL
|
5
|
+
#
|
6
|
+
module DSL
|
7
|
+
module RequireOverride
|
8
|
+
# Save the toplevel require method to load all ruby dependencies.
|
9
|
+
# It is used whenever the `require 'lib'` is not in libraries.
|
10
|
+
alias __ruby_require require
|
11
|
+
|
12
|
+
def require(path)
|
13
|
+
rbpath = path + '.rb'
|
14
|
+
return __ruby_require(path) if !@require_loader.exists?(rbpath)
|
15
|
+
return false if @require_loader.loaded?(rbpath)
|
16
|
+
|
17
|
+
# This is equivalent to calling `require 'lib'` with lib on disk.
|
18
|
+
# We cannot rely on libraries residing on disk however.
|
19
|
+
# TODO: Sandboxing.
|
20
|
+
content, path, line = @require_loader.load(rbpath)
|
21
|
+
|
22
|
+
# If we are in the realm of libraries and the LibraryEvalContext
|
23
|
+
# we should have access to the __inspec_binding, which is a Binding
|
24
|
+
# context that provides the correct plane to evaluate all required files to.
|
25
|
+
# It will ensure that embedded calls to `require` still call this
|
26
|
+
# method and get loaded from their correct paths.
|
27
|
+
return __inspec_binding.eval(content, path, line) if defined?(__inspec_binding)
|
28
|
+
|
29
|
+
eval(content, TOPLEVEL_BINDING, path, line) # rubocop:disable Security/Eval
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|