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,259 @@
|
|
1
|
+
require 'rspec/core'
|
2
|
+
require 'rspec/core/formatters/base_formatter'
|
3
|
+
|
4
|
+
module Inspec::Formatters
|
5
|
+
class Base < RSpec::Core::Formatters::BaseFormatter
|
6
|
+
RSpec::Core::Formatters.register self, :close, :dump_summary, :stop
|
7
|
+
|
8
|
+
attr_accessor :backend, :run_data
|
9
|
+
|
10
|
+
def initialize(output)
|
11
|
+
super(output)
|
12
|
+
|
13
|
+
@run_data = {}
|
14
|
+
@profiles = []
|
15
|
+
@profiles_info = nil
|
16
|
+
@backend = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
# RSpec Override: #dump_summary
|
20
|
+
#
|
21
|
+
# Supply run summary data, such as the InSpec version and the total duration.
|
22
|
+
def dump_summary(summary)
|
23
|
+
run_data[:version] = Inspec::VERSION
|
24
|
+
run_data[:statistics] = {
|
25
|
+
duration: summary.duration,
|
26
|
+
controls: statistics,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
# RSpec Override: #stop
|
31
|
+
#
|
32
|
+
# Called at the end of a complete RSpec run.
|
33
|
+
# We use this to map tests to controls and flesh out the rest of the run_data
|
34
|
+
# hash to include details about the run, the platform, etc.
|
35
|
+
def stop(notification)
|
36
|
+
# This might be a bit confusing. The results are not actually organized
|
37
|
+
# by control. It is organized by test. So if a control has 3 tests, the
|
38
|
+
# output will have 3 control entries, each one with the same control id
|
39
|
+
# and different test results. An rspec example maps to an inspec test.
|
40
|
+
run_data[:controls] = notification.examples.map do |example|
|
41
|
+
format_example(example).tap do |hash|
|
42
|
+
e = example.exception
|
43
|
+
next unless e
|
44
|
+
|
45
|
+
if example.metadata[:sensitive]
|
46
|
+
hash[:message] = '*** sensitive output suppressed ***'
|
47
|
+
else
|
48
|
+
hash[:message] = exception_message(e)
|
49
|
+
end
|
50
|
+
|
51
|
+
next if e.is_a? RSpec::Expectations::ExpectationNotMetError
|
52
|
+
hash[:exception] = e.class.name
|
53
|
+
hash[:backtrace] = e.backtrace
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# include any tests that were run that were not part of a control
|
58
|
+
run_data[:other_checks] = examples_without_controls
|
59
|
+
examples_with_controls.each do |example|
|
60
|
+
control = example2control(example)
|
61
|
+
move_example_into_control(example, control)
|
62
|
+
end
|
63
|
+
|
64
|
+
# flesh out the profiles key with additional profile information
|
65
|
+
run_data[:profiles] = profiles_info
|
66
|
+
|
67
|
+
# add the platform information for this particular target
|
68
|
+
run_data[:platform] = {
|
69
|
+
name: platform(:name),
|
70
|
+
release: platform(:release),
|
71
|
+
target: backend_target,
|
72
|
+
uuid: platform(:uuid),
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
# Add the current profile to the list of executed profiles.
|
77
|
+
# Called by the runner during example collection.
|
78
|
+
def add_profile(profile)
|
79
|
+
@profiles.push(profile)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Return all the collected output to the caller
|
83
|
+
def results
|
84
|
+
run_data
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def all_unique_controls
|
90
|
+
unique_controls = Set.new
|
91
|
+
run_data[:profiles].each do |profile|
|
92
|
+
profile[:controls].map { |control| unique_controls.add(control) }
|
93
|
+
end
|
94
|
+
|
95
|
+
unique_controls
|
96
|
+
end
|
97
|
+
|
98
|
+
def statistics
|
99
|
+
failed = 0
|
100
|
+
skipped = 0
|
101
|
+
passed = 0
|
102
|
+
|
103
|
+
all_unique_controls.each do |control|
|
104
|
+
next unless control[:results]
|
105
|
+
if control[:results].any? { |r| r[:status] == 'failed' }
|
106
|
+
failed += 1
|
107
|
+
elsif control[:results].any? { |r| r[:status] == 'skipped' }
|
108
|
+
skipped += 1
|
109
|
+
else
|
110
|
+
passed += 1
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
total = failed + passed + skipped
|
115
|
+
|
116
|
+
{
|
117
|
+
total: total,
|
118
|
+
passed: {
|
119
|
+
total: passed,
|
120
|
+
},
|
121
|
+
skipped: {
|
122
|
+
total: skipped,
|
123
|
+
},
|
124
|
+
failed: {
|
125
|
+
total: failed,
|
126
|
+
},
|
127
|
+
}
|
128
|
+
end
|
129
|
+
|
130
|
+
def exception_message(exception)
|
131
|
+
if exception.is_a?(RSpec::Core::MultipleExceptionError)
|
132
|
+
exception.all_exceptions.map(&:message).uniq.join("\n\n")
|
133
|
+
else
|
134
|
+
exception.message
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# RSpec Override: #format_example
|
139
|
+
#
|
140
|
+
# Called after test execution, this allows us to populate our own hash with data
|
141
|
+
# for this test that is necessary for the rest of our reports.
|
142
|
+
def format_example(example) # rubocop:disable Metrics/AbcSize
|
143
|
+
if !example.metadata[:description_args].empty? && example.metadata[:skip]
|
144
|
+
# For skipped profiles, rspec returns in full_description the skip_message as well. We don't want
|
145
|
+
# to mix the two, so we pick the full_description from the example.metadata[:example_group] hash.
|
146
|
+
code_description = example.metadata[:example_group][:description]
|
147
|
+
else
|
148
|
+
code_description = example.metadata[:full_description]
|
149
|
+
end
|
150
|
+
|
151
|
+
res = {
|
152
|
+
id: example.metadata[:id],
|
153
|
+
profile_id: example.metadata[:profile_id],
|
154
|
+
status: example.execution_result.status.to_s,
|
155
|
+
code_desc: code_description,
|
156
|
+
run_time: example.execution_result.run_time,
|
157
|
+
start_time: example.execution_result.started_at.to_datetime.rfc3339.to_s,
|
158
|
+
resource_title: example.metadata[:described_class] || example.metadata[:example_group][:description],
|
159
|
+
expectation_message: format_expectation_message(example),
|
160
|
+
}
|
161
|
+
|
162
|
+
unless (pid = example.metadata[:profile_id]).nil?
|
163
|
+
res[:profile_id] = pid
|
164
|
+
end
|
165
|
+
|
166
|
+
if res[:status] == 'pending'
|
167
|
+
res[:status] = 'skipped'
|
168
|
+
res[:skip_message] = example.metadata[:description]
|
169
|
+
res[:resource] = example.metadata[:described_class].to_s
|
170
|
+
end
|
171
|
+
|
172
|
+
res
|
173
|
+
end
|
174
|
+
|
175
|
+
def format_expectation_message(example)
|
176
|
+
if (example.metadata[:example_group][:description_args].first == example.metadata[:example_group][:described_class]) ||
|
177
|
+
example.metadata[:example_group][:described_class].nil?
|
178
|
+
example.metadata[:description]
|
179
|
+
else
|
180
|
+
"#{example.metadata[:example_group][:description]} #{example.metadata[:description]}"
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# This formatter runs for all reports and we cannot error on missing fields.
|
185
|
+
# Return nil if not found or Train error. If needed, we will raise an error inside
|
186
|
+
# the proper report.
|
187
|
+
def platform(field)
|
188
|
+
return nil if @backend.nil?
|
189
|
+
begin
|
190
|
+
@backend.platform[field]
|
191
|
+
rescue Train::Error => e
|
192
|
+
Inspec::Log.error(e.message)
|
193
|
+
nil
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def backend_target
|
198
|
+
return nil if @backend.nil?
|
199
|
+
connection = @backend.backend
|
200
|
+
connection.respond_to?(:uri) ? connection.uri : nil
|
201
|
+
end
|
202
|
+
|
203
|
+
def examples
|
204
|
+
run_data[:controls]
|
205
|
+
end
|
206
|
+
|
207
|
+
def examples_without_controls
|
208
|
+
examples.find_all { |example| example2control(example).nil? }
|
209
|
+
end
|
210
|
+
|
211
|
+
def examples_with_controls
|
212
|
+
examples.find_all { |example| !example2control(example).nil? }
|
213
|
+
end
|
214
|
+
|
215
|
+
def profiles_info
|
216
|
+
@profiles_info ||= @profiles.map(&:info!).map(&:dup)
|
217
|
+
end
|
218
|
+
|
219
|
+
def example2control(example)
|
220
|
+
profile = profile_from_example(example)
|
221
|
+
return nil unless profile&.[](:controls)
|
222
|
+
profile[:controls].find { |x| x[:id] == example[:id] }
|
223
|
+
end
|
224
|
+
|
225
|
+
def profile_from_example(example)
|
226
|
+
profiles_info.find { |p| profile_contains_example?(p, example) }
|
227
|
+
end
|
228
|
+
|
229
|
+
def profile_contains_example?(profile, example)
|
230
|
+
profile_name = profile[:name]
|
231
|
+
example_profile_id = example[:profile_id]
|
232
|
+
|
233
|
+
# if either the profile name is nil or the profile in the given example
|
234
|
+
# is nil, assume the profile doesn't contain the example and default
|
235
|
+
# to creating a new profile. Otherwise, for profiles that have no
|
236
|
+
# metadata, this may incorrectly match a profile that does not contain
|
237
|
+
# this example, leading to Ruby exceptions.
|
238
|
+
return false if profile_name.nil? || example_profile_id.nil?
|
239
|
+
|
240
|
+
# The correct profile is one where the name of the profile, and the profile
|
241
|
+
# name in the example match. Additionally, the list of controls in the
|
242
|
+
# profile must contain the example in question (which we match by ID).
|
243
|
+
#
|
244
|
+
# While the profile name match is usually good enough, we must also match by
|
245
|
+
# the control ID in the case where an InSpec runner has multiple profiles of
|
246
|
+
# the same name (i.e. when Test Kitchen is running concurrently using a
|
247
|
+
# single test suite that uses the Flat source reader, in which case InSpec
|
248
|
+
# creates a fake profile with a name like "tests from /path/to/tests")
|
249
|
+
profile_name == example_profile_id && profile[:controls].any? { |control| control[:id] == example[:id] }
|
250
|
+
end
|
251
|
+
|
252
|
+
def move_example_into_control(example, control)
|
253
|
+
control[:results] ||= []
|
254
|
+
example.delete(:id)
|
255
|
+
example.delete(:profile_id)
|
256
|
+
control[:results].push(example)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Inspec::Formatters
|
2
|
+
class RspecJson < RSpec::Core::Formatters::JsonFormatter
|
3
|
+
RSpec::Core::Formatters.register self
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
# We are cheating and overriding a private method in RSpec's core JsonFormatter.
|
8
|
+
# This is to avoid having to repeat this id functionality in both dump_summary
|
9
|
+
# and dump_profile (both of which call format_example).
|
10
|
+
# See https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/json_formatter.rb
|
11
|
+
#
|
12
|
+
# rspec's example id here corresponds to an inspec test's control name -
|
13
|
+
# either explicitly specified or auto-generated by rspec itself.
|
14
|
+
def format_example(example)
|
15
|
+
res = super(example)
|
16
|
+
res[:id] = example.metadata[:id]
|
17
|
+
res
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Inspec::Formatters
|
2
|
+
class ShowProgress < RSpec::Core::Formatters::ProgressFormatter
|
3
|
+
RSpec::Core::Formatters.register self
|
4
|
+
|
5
|
+
# remove summary output from progress
|
6
|
+
%w{dump_summary dump_failures dump_pending message seed start_dump}.each do |m|
|
7
|
+
define_method(m) do |*args|
|
8
|
+
# override
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Steven Danna
|
3
|
+
# author: Victoria Jeffrey
|
4
|
+
require 'inspec/plugins/resource'
|
5
|
+
require 'inspec/dsl_shared'
|
6
|
+
|
7
|
+
module Inspec
|
8
|
+
#
|
9
|
+
# LibaryEvalContext constructs an instance of an anonymous class
|
10
|
+
# that library files will be instance_exec'd against.
|
11
|
+
#
|
12
|
+
# The anonymous class ensures that `Inspec.resource(1)` will return
|
13
|
+
# an anonymouse class that is suitable as the parent class of an
|
14
|
+
# inspec resource. The class returned will have the resource
|
15
|
+
# registry used by all dsl methods bound to the resource registry
|
16
|
+
# passed into the #create constructor.
|
17
|
+
#
|
18
|
+
#
|
19
|
+
class LibraryEvalContext
|
20
|
+
def self.create(registry, require_loader)
|
21
|
+
c = Class.new do
|
22
|
+
extend Inspec::ResourceDSL
|
23
|
+
include Inspec::ResourceBehaviors
|
24
|
+
define_singleton_method :__resource_registry do
|
25
|
+
registry
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
c2 = Class.new do
|
30
|
+
define_singleton_method :resource do |version|
|
31
|
+
Inspec.validate_resource_dsl_version!(version)
|
32
|
+
c
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
c3 = Class.new do
|
37
|
+
include Inspec::DSL::RequireOverride
|
38
|
+
def initialize(require_loader)
|
39
|
+
@require_loader = require_loader
|
40
|
+
@inspec_binding = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def __inspec_binding
|
44
|
+
@inspec_binding
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
c3.const_set(:Inspec, c2)
|
49
|
+
res = c3.new(require_loader)
|
50
|
+
|
51
|
+
# Provide the local binding for this context which is necessary for
|
52
|
+
# calls to `require` to create all dependent objects in the correct
|
53
|
+
# context.
|
54
|
+
res.instance_variable_set('@inspec_binding', res.instance_eval('binding'))
|
55
|
+
res
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/inspec/log.rb
ADDED
@@ -0,0 +1,247 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright 2015 Dominik Richter
|
3
|
+
# author: Dominik Richter
|
4
|
+
# author: Christoph Hartmann
|
5
|
+
|
6
|
+
require 'logger'
|
7
|
+
require 'rubygems/version'
|
8
|
+
require 'rubygems/requirement'
|
9
|
+
require 'semverse'
|
10
|
+
require 'utils/spdx'
|
11
|
+
|
12
|
+
module Inspec
|
13
|
+
# Extract metadata.rb information
|
14
|
+
# A Metadata object may be created and finalized with invalid data.
|
15
|
+
# This allows the check CLI command to analyse the issues.
|
16
|
+
# Use valid? to determine if the metadata is coherent.
|
17
|
+
class Metadata
|
18
|
+
attr_reader :ref
|
19
|
+
attr_accessor :params, :content
|
20
|
+
def initialize(ref, logger = nil)
|
21
|
+
@ref = ref
|
22
|
+
@logger = logger || Logger.new(nil)
|
23
|
+
@content = ''
|
24
|
+
@params = {}
|
25
|
+
@missing_methods = []
|
26
|
+
end
|
27
|
+
|
28
|
+
%w{
|
29
|
+
name
|
30
|
+
title
|
31
|
+
maintainer
|
32
|
+
maintainer_email
|
33
|
+
copyright
|
34
|
+
copyright_email
|
35
|
+
license
|
36
|
+
summary
|
37
|
+
description
|
38
|
+
version
|
39
|
+
inspec_version
|
40
|
+
}.each do |name|
|
41
|
+
define_method name.to_sym do |arg|
|
42
|
+
params[name.to_sym] = arg
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def dependencies
|
47
|
+
params[:depends] || []
|
48
|
+
end
|
49
|
+
|
50
|
+
def supports(sth, version = nil)
|
51
|
+
# Ignore supports with metadata.rb. This file is legacy and the way it
|
52
|
+
# it handles `supports` deprecated. A deprecation warning will be printed
|
53
|
+
# already.
|
54
|
+
end
|
55
|
+
|
56
|
+
def inspec_requirement
|
57
|
+
# using Gem::Requirement here to allow nil values which
|
58
|
+
# translate to [">= 0"]
|
59
|
+
Gem::Requirement.create(params[:inspec_version])
|
60
|
+
end
|
61
|
+
|
62
|
+
def supports_runtime?
|
63
|
+
running = Gem::Version.new(Inspec::VERSION)
|
64
|
+
inspec_requirement.satisfied_by?(running)
|
65
|
+
end
|
66
|
+
|
67
|
+
def supports_platform?(backend)
|
68
|
+
backend.platform.supported?(params[:supports])
|
69
|
+
end
|
70
|
+
|
71
|
+
# return all warn and errors
|
72
|
+
def valid # rubocop:disable Metrics/AbcSize
|
73
|
+
errors = []
|
74
|
+
warnings = []
|
75
|
+
|
76
|
+
%w{name version}.each do |field|
|
77
|
+
next unless params[field.to_sym].nil?
|
78
|
+
errors.push("Missing profile #{field} in #{ref}")
|
79
|
+
end
|
80
|
+
|
81
|
+
if params[:name] =~ %r{[\/\\]}
|
82
|
+
warnings.push("Your profile name (#{params[:name]}) contains a slash " \
|
83
|
+
'which will not be permitted in InSpec 2.0. Please change your profile ' \
|
84
|
+
'name in the `inspec.yml` file.')
|
85
|
+
end
|
86
|
+
|
87
|
+
# if version is set, ensure it is correct
|
88
|
+
if !params[:version].nil? && !valid_version?(params[:version])
|
89
|
+
errors.push('Version needs to be in SemVer format')
|
90
|
+
end
|
91
|
+
|
92
|
+
%w{title summary maintainer copyright license}.each do |field|
|
93
|
+
next unless params[field.to_sym].nil?
|
94
|
+
warnings.push("Missing profile #{field} in #{ref}")
|
95
|
+
end
|
96
|
+
|
97
|
+
# if version is set, ensure it is in SPDX format
|
98
|
+
if !params[:license].nil? && !Spdx.valid_license?(params[:license])
|
99
|
+
warnings.push("License '#{params[:license]}' needs to be in SPDX format. See https://spdx.org/licenses/.")
|
100
|
+
end
|
101
|
+
|
102
|
+
[errors, warnings]
|
103
|
+
end
|
104
|
+
|
105
|
+
# returns true or false
|
106
|
+
def valid?
|
107
|
+
errors, _warnings = valid
|
108
|
+
errors.empty? && unsupported.empty?
|
109
|
+
end
|
110
|
+
|
111
|
+
def valid_version?(value)
|
112
|
+
Semverse::Version.new(value)
|
113
|
+
true
|
114
|
+
rescue Semverse::InvalidVersionFormat
|
115
|
+
false
|
116
|
+
end
|
117
|
+
|
118
|
+
def method_missing(sth, *args)
|
119
|
+
@logger.warn "#{ref} doesn't support: #{sth} #{args}"
|
120
|
+
@missing_methods.push(sth)
|
121
|
+
end
|
122
|
+
|
123
|
+
def unsupported
|
124
|
+
@missing_methods
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.symbolize_keys(obj)
|
128
|
+
return obj.map { |i| symbolize_keys(i) } if obj.is_a?(Array)
|
129
|
+
return obj unless obj.is_a?(Hash)
|
130
|
+
|
131
|
+
obj.each_with_object({}) do |(k, v), h|
|
132
|
+
v = symbolize_keys(v) if v.is_a?(Hash)
|
133
|
+
v = symbolize_keys(v) if v.is_a?(Array)
|
134
|
+
h[k.to_sym] = v
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.finalize_supports_elem(elem, logger)
|
139
|
+
case x = elem
|
140
|
+
when Hash
|
141
|
+
x[:release] = x[:release].to_s if x[:release]
|
142
|
+
x
|
143
|
+
when Array
|
144
|
+
logger.warn(
|
145
|
+
'Failed to read supports entry that is an array. Please use '\
|
146
|
+
'the `supports: {os-family: xyz}` syntax.',
|
147
|
+
)
|
148
|
+
nil
|
149
|
+
when nil then nil
|
150
|
+
else
|
151
|
+
logger ||= Logger.new(nil)
|
152
|
+
logger.warn(
|
153
|
+
"Do not use deprecated `supports: #{x}` syntax. Instead use:\n"\
|
154
|
+
"supports:\n - os-family: #{x}\n\n",
|
155
|
+
)
|
156
|
+
{ :'os-family' => x } # rubocop:disable Style/HashSyntax
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def self.finalize_supports(supports, logger)
|
161
|
+
case x = supports
|
162
|
+
when Hash then [finalize_supports_elem(x, logger)]
|
163
|
+
when Array then x.map { |e| finalize_supports_elem(e, logger) }.compact
|
164
|
+
when nil then []
|
165
|
+
else
|
166
|
+
logger ||= Logger.new(nil)
|
167
|
+
logger.warn(
|
168
|
+
"Do not use deprecated `supports: #{x}` syntax. Instead use:\n"\
|
169
|
+
"supports:\n - os-family: #{x}\n\n",
|
170
|
+
)
|
171
|
+
[{ :'os-family' => x }] # rubocop:disable Style/HashSyntax
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.finalize_name(metadata, profile_id, original_target)
|
176
|
+
# profile_id always overwrites whatever already exists as the name
|
177
|
+
unless profile_id.to_s.empty?
|
178
|
+
metadata.params[:name] = profile_id.to_s
|
179
|
+
return
|
180
|
+
end
|
181
|
+
|
182
|
+
# don't overwrite an existing name
|
183
|
+
return unless metadata.params[:name].nil?
|
184
|
+
|
185
|
+
# if there's a title, there is no need to set a name too
|
186
|
+
return unless metadata.params[:title].nil?
|
187
|
+
|
188
|
+
# create a new name based on the original target if it exists
|
189
|
+
# Crudely slug the target to not contain slashes, to avoid breaking
|
190
|
+
# unit tests that look for warning sequences
|
191
|
+
return if original_target.to_s.empty?
|
192
|
+
metadata.params[:title] = "tests from #{original_target}"
|
193
|
+
metadata.params[:name] = metadata.params[:title].gsub(%r{[\\\/]}, '.')
|
194
|
+
end
|
195
|
+
|
196
|
+
def self.finalize(metadata, profile_id, options, logger = nil)
|
197
|
+
return nil if metadata.nil?
|
198
|
+
param = metadata.params || {}
|
199
|
+
options ||= {}
|
200
|
+
param['version'] = param['version'].to_s unless param['version'].nil?
|
201
|
+
metadata.params = symbolize_keys(param)
|
202
|
+
metadata.params[:supports] = finalize_supports(metadata.params[:supports], logger)
|
203
|
+
finalize_name(metadata, profile_id, options[:target])
|
204
|
+
|
205
|
+
metadata
|
206
|
+
end
|
207
|
+
|
208
|
+
def self.from_yaml(ref, content, profile_id, logger = nil)
|
209
|
+
res = Metadata.new(ref, logger)
|
210
|
+
res.params = YAML.load(content)
|
211
|
+
res.content = content
|
212
|
+
finalize(res, profile_id, {}, logger)
|
213
|
+
end
|
214
|
+
|
215
|
+
def self.from_ruby(ref, content, profile_id, logger = nil)
|
216
|
+
res = Metadata.new(ref, logger)
|
217
|
+
res.instance_eval(content, ref, 1)
|
218
|
+
res.content = content
|
219
|
+
finalize(res, profile_id, {}, logger)
|
220
|
+
end
|
221
|
+
|
222
|
+
def self.from_ref(ref, content, profile_id, logger = nil)
|
223
|
+
# NOTE there doesn't have to exist an actual file, it may come from an
|
224
|
+
# archive (i.e., content)
|
225
|
+
case File.basename(ref)
|
226
|
+
when 'inspec.yml'
|
227
|
+
from_yaml(ref, content, profile_id, logger)
|
228
|
+
when 'metadata.rb'
|
229
|
+
from_ruby(ref, content, profile_id, logger)
|
230
|
+
else
|
231
|
+
logger ||= Logger.new(nil)
|
232
|
+
logger.error "Don't know how to handle metadata in #{ref}"
|
233
|
+
nil
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def self.from_file(path, profile_id, logger = nil)
|
238
|
+
unless File.file?(path)
|
239
|
+
logger ||= Logger.new(nil)
|
240
|
+
logger.error "Can't find metadata file #{path}"
|
241
|
+
return nil
|
242
|
+
end
|
243
|
+
|
244
|
+
from_ref(File.basename(path), File.read(path), profile_id, logger)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|