inspec 2.0.32 → 2.0.45
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 +4 -4
- data/.rubocop.yml +101 -101
- data/CHANGELOG.md +2991 -2970
- data/Gemfile +55 -55
- data/LICENSE +14 -14
- data/MAINTAINERS.md +33 -33
- data/MAINTAINERS.toml +52 -52
- data/README.md +446 -437
- data/Rakefile +322 -322
- data/bin/inspec +12 -12
- data/docs/.gitignore +2 -2
- data/docs/README.md +40 -40
- data/docs/dsl_inspec.md +258 -258
- data/docs/dsl_resource.md +93 -93
- data/docs/glossary.md +99 -99
- data/docs/habitat.md +191 -191
- data/docs/inspec_and_friends.md +107 -107
- data/docs/matchers.md +169 -168
- data/docs/migration.md +293 -293
- data/docs/platforms.md +118 -118
- data/docs/plugin_kitchen_inspec.md +49 -49
- data/docs/profiles.md +370 -370
- data/docs/reporters.md +105 -105
- data/docs/resources/aide_conf.md.erb +75 -75
- data/docs/resources/apache.md.erb +67 -67
- data/docs/resources/apache_conf.md.erb +68 -68
- data/docs/resources/apt.md.erb +71 -71
- data/docs/resources/audit_policy.md.erb +47 -47
- data/docs/resources/auditd.md.erb +79 -79
- data/docs/resources/auditd_conf.md.erb +68 -68
- data/docs/resources/aws_cloudtrail_trail.md.erb +140 -140
- data/docs/resources/aws_cloudtrail_trails.md.erb +81 -81
- data/docs/resources/aws_cloudwatch_alarm.md.erb +86 -86
- data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +151 -151
- data/docs/resources/aws_config_recorder.md.erb +71 -71
- data/docs/resources/aws_ec2_instance.md.erb +106 -106
- data/docs/resources/aws_iam_access_key.md.erb +123 -123
- data/docs/resources/aws_iam_access_keys.md.erb +198 -198
- data/docs/resources/aws_iam_group.md.erb +46 -46
- data/docs/resources/aws_iam_groups.md.erb +43 -43
- data/docs/resources/aws_iam_password_policy.md.erb +76 -76
- data/docs/resources/aws_iam_policies.md.erb +82 -82
- data/docs/resources/aws_iam_policy.md.erb +144 -144
- data/docs/resources/aws_iam_role.md.erb +63 -63
- data/docs/resources/aws_iam_root_user.md.erb +58 -58
- data/docs/resources/aws_iam_user.md.erb +64 -64
- data/docs/resources/aws_iam_users.md.erb +89 -89
- data/docs/resources/aws_kms_keys.md.erb +84 -84
- data/docs/resources/aws_route_table.md.erb +47 -47
- data/docs/resources/aws_s3_bucket.md.erb +134 -134
- data/docs/resources/aws_security_group.md.erb +151 -151
- data/docs/resources/aws_security_groups.md.erb +91 -91
- data/docs/resources/aws_sns_topic.md.erb +63 -63
- data/docs/resources/aws_subnet.md.erb +133 -133
- data/docs/resources/aws_subnets.md.erb +126 -126
- data/docs/resources/aws_vpc.md.erb +120 -120
- data/docs/resources/aws_vpcs.md.erb +48 -48
- data/docs/resources/azure_generic_resource.md.erb +170 -170
- data/docs/resources/azure_resource_group.md.erb +284 -284
- data/docs/resources/azure_virtual_machine.md.erb +347 -347
- data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -224
- data/docs/resources/bash.md.erb +75 -75
- data/docs/resources/bond.md.erb +90 -90
- data/docs/resources/bridge.md.erb +57 -57
- data/docs/resources/bsd_service.md.erb +67 -67
- data/docs/resources/command.md.erb +138 -138
- data/docs/resources/cpan.md.erb +79 -79
- data/docs/resources/cran.md.erb +64 -64
- data/docs/resources/crontab.md.erb +89 -89
- data/docs/resources/csv.md.erb +54 -54
- data/docs/resources/dh_params.md.erb +205 -205
- data/docs/resources/directory.md.erb +30 -30
- data/docs/resources/docker.md.erb +219 -219
- data/docs/resources/docker_container.md.erb +104 -104
- data/docs/resources/docker_image.md.erb +94 -94
- data/docs/resources/docker_service.md.erb +114 -114
- data/docs/resources/elasticsearch.md.erb +242 -242
- data/docs/resources/etc_fstab.md.erb +125 -125
- data/docs/resources/etc_group.md.erb +75 -75
- data/docs/resources/etc_hosts.md.erb +78 -78
- data/docs/resources/etc_hosts_allow.md.erb +74 -74
- data/docs/resources/etc_hosts_deny.md.erb +74 -74
- data/docs/resources/file.md.erb +526 -515
- data/docs/resources/filesystem.md.erb +41 -41
- data/docs/resources/firewalld.md.erb +107 -107
- data/docs/resources/gem.md.erb +79 -79
- data/docs/resources/group.md.erb +61 -61
- data/docs/resources/grub_conf.md.erb +101 -101
- data/docs/resources/host.md.erb +86 -86
- data/docs/resources/http.md.erb +196 -196
- data/docs/resources/iis_app.md.erb +122 -122
- data/docs/resources/iis_site.md.erb +135 -135
- data/docs/resources/inetd_conf.md.erb +94 -94
- data/docs/resources/ini.md.erb +76 -76
- data/docs/resources/interface.md.erb +58 -58
- data/docs/resources/iptables.md.erb +64 -64
- data/docs/resources/json.md.erb +63 -63
- data/docs/resources/kernel_module.md.erb +120 -120
- data/docs/resources/kernel_parameter.md.erb +53 -53
- data/docs/resources/key_rsa.md.erb +85 -85
- data/docs/resources/launchd_service.md.erb +57 -57
- data/docs/resources/limits_conf.md.erb +75 -75
- data/docs/resources/login_def.md.erb +71 -71
- data/docs/resources/mount.md.erb +69 -69
- data/docs/resources/mssql_session.md.erb +60 -60
- data/docs/resources/mysql_conf.md.erb +99 -99
- data/docs/resources/mysql_session.md.erb +74 -74
- data/docs/resources/nginx.md.erb +79 -79
- data/docs/resources/nginx_conf.md.erb +128 -128
- data/docs/resources/npm.md.erb +60 -60
- data/docs/resources/ntp_conf.md.erb +60 -60
- data/docs/resources/oneget.md.erb +53 -53
- data/docs/resources/oracledb_session.md.erb +52 -52
- data/docs/resources/os.md.erb +141 -141
- data/docs/resources/os_env.md.erb +78 -78
- data/docs/resources/package.md.erb +120 -120
- data/docs/resources/packages.md.erb +67 -67
- data/docs/resources/parse_config.md.erb +103 -103
- data/docs/resources/parse_config_file.md.erb +138 -138
- data/docs/resources/passwd.md.erb +141 -141
- data/docs/resources/pip.md.erb +67 -67
- data/docs/resources/port.md.erb +137 -137
- data/docs/resources/postgres_conf.md.erb +79 -79
- data/docs/resources/postgres_hba_conf.md.erb +93 -93
- data/docs/resources/postgres_ident_conf.md.erb +76 -76
- data/docs/resources/postgres_session.md.erb +69 -69
- data/docs/resources/powershell.md.erb +102 -102
- data/docs/resources/processes.md.erb +109 -109
- data/docs/resources/rabbitmq_config.md.erb +41 -41
- data/docs/resources/registry_key.md.erb +158 -158
- data/docs/resources/runit_service.md.erb +57 -57
- data/docs/resources/security_policy.md.erb +47 -47
- data/docs/resources/service.md.erb +121 -121
- data/docs/resources/shadow.md.erb +146 -144
- data/docs/resources/ssh_config.md.erb +80 -80
- data/docs/resources/sshd_config.md.erb +83 -83
- data/docs/resources/ssl.md.erb +119 -119
- data/docs/resources/sys_info.md.erb +42 -42
- data/docs/resources/systemd_service.md.erb +57 -57
- data/docs/resources/sysv_service.md.erb +57 -57
- data/docs/resources/upstart_service.md.erb +57 -57
- data/docs/resources/user.md.erb +140 -140
- data/docs/resources/users.md.erb +127 -127
- data/docs/resources/vbscript.md.erb +55 -55
- data/docs/resources/virtualization.md.erb +57 -57
- data/docs/resources/windows_feature.md.erb +47 -47
- data/docs/resources/windows_hotfix.md.erb +53 -53
- data/docs/resources/windows_task.md.erb +95 -95
- data/docs/resources/wmi.md.erb +81 -81
- data/docs/resources/x509_certificate.md.erb +151 -151
- data/docs/resources/xinetd_conf.md.erb +156 -156
- data/docs/resources/xml.md.erb +85 -85
- data/docs/resources/yaml.md.erb +69 -69
- data/docs/resources/yum.md.erb +98 -98
- data/docs/resources/zfs_dataset.md.erb +53 -53
- data/docs/resources/zfs_pool.md.erb +47 -47
- data/docs/ruby_usage.md +203 -203
- data/docs/shared/matcher_be.md.erb +1 -1
- data/docs/shared/matcher_cmp.md.erb +43 -43
- data/docs/shared/matcher_eq.md.erb +3 -3
- data/docs/shared/matcher_include.md.erb +1 -1
- data/docs/shared/matcher_match.md.erb +1 -1
- data/docs/shell.md +215 -215
- data/examples/README.md +8 -8
- data/examples/inheritance/README.md +65 -65
- data/examples/inheritance/controls/example.rb +14 -14
- data/examples/inheritance/inspec.yml +15 -15
- data/examples/kitchen-ansible/.kitchen.yml +25 -25
- data/examples/kitchen-ansible/Gemfile +19 -19
- data/examples/kitchen-ansible/README.md +53 -53
- data/examples/kitchen-ansible/files/nginx.repo +6 -6
- data/examples/kitchen-ansible/tasks/main.yml +16 -16
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-chef/.kitchen.yml +20 -20
- data/examples/kitchen-chef/Berksfile +3 -3
- data/examples/kitchen-chef/Gemfile +19 -19
- data/examples/kitchen-chef/README.md +27 -27
- data/examples/kitchen-chef/metadata.rb +7 -7
- data/examples/kitchen-chef/recipes/default.rb +6 -6
- data/examples/kitchen-chef/recipes/nginx.rb +30 -30
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-puppet/.kitchen.yml +22 -22
- data/examples/kitchen-puppet/Gemfile +20 -20
- data/examples/kitchen-puppet/Puppetfile +25 -25
- data/examples/kitchen-puppet/README.md +53 -53
- data/examples/kitchen-puppet/manifests/site.pp +33 -33
- data/examples/kitchen-puppet/metadata.json +11 -11
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
- data/examples/meta-profile/README.md +37 -37
- data/examples/meta-profile/controls/example.rb +13 -13
- data/examples/meta-profile/inspec.yml +13 -13
- data/examples/profile-attribute.yml +2 -2
- data/examples/profile-attribute/README.md +14 -14
- data/examples/profile-attribute/controls/example.rb +11 -11
- data/examples/profile-attribute/inspec.yml +8 -8
- data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
- data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
- data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
- data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
- data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
- data/examples/profile-aws/inspec.yml +11 -11
- data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
- data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
- data/examples/profile-azure/inspec.yml +11 -11
- data/examples/profile-sensitive/README.md +29 -29
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
- data/examples/profile-sensitive/controls/sensitive.rb +9 -9
- data/examples/profile-sensitive/inspec.yml +8 -8
- data/examples/profile/README.md +48 -48
- data/examples/profile/controls/example.rb +23 -23
- data/examples/profile/controls/gordon.rb +36 -36
- data/examples/profile/controls/meta.rb +34 -34
- data/examples/profile/inspec.yml +10 -10
- data/examples/profile/libraries/gordon_config.rb +53 -53
- data/inspec.gemspec +47 -47
- data/lib/bundles/README.md +3 -3
- data/lib/bundles/inspec-artifact.rb +7 -7
- data/lib/bundles/inspec-artifact/README.md +1 -1
- data/lib/bundles/inspec-artifact/cli.rb +277 -277
- data/lib/bundles/inspec-compliance.rb +16 -16
- data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
- data/lib/bundles/inspec-compliance/README.md +185 -185
- data/lib/bundles/inspec-compliance/api.rb +316 -316
- data/lib/bundles/inspec-compliance/api/login.rb +152 -152
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
- data/lib/bundles/inspec-compliance/cli.rb +254 -254
- data/lib/bundles/inspec-compliance/configuration.rb +103 -103
- data/lib/bundles/inspec-compliance/http.rb +86 -86
- data/lib/bundles/inspec-compliance/support.rb +36 -36
- data/lib/bundles/inspec-compliance/target.rb +98 -98
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
- data/lib/bundles/inspec-habitat.rb +12 -12
- data/lib/bundles/inspec-habitat/cli.rb +36 -36
- data/lib/bundles/inspec-habitat/log.rb +10 -10
- data/lib/bundles/inspec-habitat/profile.rb +390 -390
- data/lib/bundles/inspec-init.rb +8 -8
- data/lib/bundles/inspec-init/README.md +31 -31
- data/lib/bundles/inspec-init/cli.rb +97 -97
- data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
- data/lib/bundles/inspec-supermarket.rb +13 -13
- data/lib/bundles/inspec-supermarket/README.md +45 -45
- data/lib/bundles/inspec-supermarket/api.rb +84 -84
- data/lib/bundles/inspec-supermarket/cli.rb +73 -73
- data/lib/bundles/inspec-supermarket/target.rb +34 -34
- data/lib/fetchers/git.rb +163 -163
- data/lib/fetchers/local.rb +74 -74
- data/lib/fetchers/mock.rb +35 -35
- data/lib/fetchers/url.rb +204 -204
- data/lib/inspec.rb +24 -24
- data/lib/inspec/archive/tar.rb +29 -29
- data/lib/inspec/archive/zip.rb +19 -19
- data/lib/inspec/backend.rb +92 -92
- data/lib/inspec/base_cli.rb +355 -350
- data/lib/inspec/cached_fetcher.rb +66 -66
- data/lib/inspec/cli.rb +292 -292
- data/lib/inspec/completions/bash.sh.erb +45 -45
- data/lib/inspec/completions/fish.sh.erb +34 -34
- data/lib/inspec/completions/zsh.sh.erb +61 -61
- data/lib/inspec/control_eval_context.rb +179 -179
- data/lib/inspec/dependencies/cache.rb +72 -72
- data/lib/inspec/dependencies/dependency_set.rb +92 -92
- data/lib/inspec/dependencies/lockfile.rb +115 -115
- data/lib/inspec/dependencies/requirement.rb +123 -123
- data/lib/inspec/dependencies/resolver.rb +86 -86
- data/lib/inspec/describe.rb +27 -27
- data/lib/inspec/dsl.rb +66 -66
- data/lib/inspec/dsl_shared.rb +33 -33
- data/lib/inspec/env_printer.rb +157 -157
- data/lib/inspec/errors.rb +13 -13
- data/lib/inspec/exceptions.rb +12 -12
- data/lib/inspec/expect.rb +45 -45
- data/lib/inspec/fetcher.rb +45 -45
- data/lib/inspec/file_provider.rb +275 -275
- data/lib/inspec/formatters.rb +3 -3
- data/lib/inspec/formatters/base.rb +250 -250
- data/lib/inspec/formatters/json_rspec.rb +20 -20
- data/lib/inspec/formatters/show_progress.rb +12 -12
- data/lib/inspec/library_eval_context.rb +58 -58
- data/lib/inspec/log.rb +11 -11
- data/lib/inspec/metadata.rb +247 -247
- data/lib/inspec/method_source.rb +24 -24
- data/lib/inspec/objects.rb +14 -14
- data/lib/inspec/objects/attribute.rb +65 -65
- data/lib/inspec/objects/control.rb +61 -61
- data/lib/inspec/objects/describe.rb +92 -92
- data/lib/inspec/objects/each_loop.rb +36 -36
- data/lib/inspec/objects/list.rb +15 -15
- data/lib/inspec/objects/or_test.rb +40 -40
- data/lib/inspec/objects/ruby_helper.rb +15 -15
- data/lib/inspec/objects/tag.rb +27 -27
- data/lib/inspec/objects/test.rb +87 -87
- data/lib/inspec/objects/value.rb +27 -27
- data/lib/inspec/plugins.rb +60 -60
- data/lib/inspec/plugins/cli.rb +24 -24
- data/lib/inspec/plugins/fetcher.rb +86 -86
- data/lib/inspec/plugins/resource.rb +135 -135
- data/lib/inspec/plugins/secret.rb +15 -15
- data/lib/inspec/plugins/source_reader.rb +40 -40
- data/lib/inspec/polyfill.rb +12 -12
- data/lib/inspec/profile.rb +510 -510
- data/lib/inspec/profile_context.rb +207 -207
- data/lib/inspec/profile_vendor.rb +66 -66
- data/lib/inspec/reporters.rb +54 -50
- data/lib/inspec/reporters/base.rb +24 -24
- data/lib/inspec/reporters/cli.rb +356 -356
- data/lib/inspec/reporters/json.rb +116 -116
- data/lib/inspec/reporters/json_min.rb +48 -48
- data/lib/inspec/reporters/junit.rb +77 -77
- data/lib/inspec/require_loader.rb +33 -33
- data/lib/inspec/resource.rb +186 -186
- data/lib/inspec/rule.rb +266 -266
- data/lib/inspec/runner.rb +345 -345
- data/lib/inspec/runner_mock.rb +41 -41
- data/lib/inspec/runner_rspec.rb +175 -175
- data/lib/inspec/runtime_profile.rb +26 -26
- data/lib/inspec/schema.rb +213 -213
- data/lib/inspec/secrets.rb +19 -19
- data/lib/inspec/secrets/yaml.rb +30 -30
- data/lib/inspec/shell.rb +220 -220
- data/lib/inspec/shell_detector.rb +90 -90
- data/lib/inspec/source_reader.rb +29 -29
- data/lib/inspec/version.rb +8 -8
- data/lib/matchers/matchers.rb +339 -339
- data/lib/resource_support/aws.rb +41 -41
- data/lib/resource_support/aws/aws_backend_base.rb +12 -12
- data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
- data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
- data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
- data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
- data/lib/resources/aide_conf.rb +159 -160
- data/lib/resources/apache.rb +48 -48
- data/lib/resources/apache_conf.rb +156 -156
- data/lib/resources/apt.rb +149 -149
- data/lib/resources/audit_policy.rb +63 -63
- data/lib/resources/auditd.rb +231 -231
- data/lib/resources/auditd_conf.rb +55 -55
- data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -77
- data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
- data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
- data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
- data/lib/resources/aws/aws_config_recorder.rb +98 -98
- data/lib/resources/aws/aws_ec2_instance.rb +157 -157
- data/lib/resources/aws/aws_iam_access_key.rb +106 -106
- data/lib/resources/aws/aws_iam_access_keys.rb +149 -144
- data/lib/resources/aws/aws_iam_group.rb +56 -56
- data/lib/resources/aws/aws_iam_groups.rb +52 -45
- data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
- data/lib/resources/aws/aws_iam_policies.rb +53 -46
- data/lib/resources/aws/aws_iam_policy.rb +125 -119
- data/lib/resources/aws/aws_iam_role.rb +51 -51
- data/lib/resources/aws/aws_iam_root_user.rb +60 -60
- data/lib/resources/aws/aws_iam_user.rb +111 -111
- data/lib/resources/aws/aws_iam_users.rb +108 -96
- data/lib/resources/aws/aws_kms_keys.rb +53 -46
- data/lib/resources/aws/aws_route_table.rb +61 -61
- data/lib/resources/aws/aws_s3_bucket.rb +115 -115
- data/lib/resources/aws/aws_security_group.rb +93 -93
- data/lib/resources/aws/aws_security_groups.rb +68 -68
- data/lib/resources/aws/aws_sns_topic.rb +53 -53
- data/lib/resources/aws/aws_subnet.rb +88 -88
- data/lib/resources/aws/aws_subnets.rb +53 -53
- data/lib/resources/aws/aws_vpc.rb +69 -69
- data/lib/resources/aws/aws_vpcs.rb +45 -45
- data/lib/resources/azure/azure_backend.rb +377 -377
- data/lib/resources/azure/azure_generic_resource.rb +59 -59
- data/lib/resources/azure/azure_resource_group.rb +152 -152
- data/lib/resources/azure/azure_virtual_machine.rb +264 -264
- data/lib/resources/azure/azure_virtual_machine_data_disk.rb +136 -136
- data/lib/resources/bash.rb +35 -35
- data/lib/resources/bond.rb +68 -68
- data/lib/resources/bridge.rb +122 -122
- data/lib/resources/command.rb +73 -69
- data/lib/resources/cpan.rb +58 -58
- data/lib/resources/cran.rb +64 -64
- data/lib/resources/crontab.rb +169 -170
- data/lib/resources/csv.rb +60 -60
- data/lib/resources/dh_params.rb +82 -82
- data/lib/resources/directory.rb +25 -25
- data/lib/resources/docker.rb +236 -236
- data/lib/resources/docker_container.rb +89 -89
- data/lib/resources/docker_image.rb +83 -83
- data/lib/resources/docker_object.rb +57 -57
- data/lib/resources/docker_service.rb +90 -90
- data/lib/resources/elasticsearch.rb +169 -169
- data/lib/resources/etc_fstab.rb +101 -102
- data/lib/resources/etc_group.rb +152 -156
- data/lib/resources/etc_hosts.rb +82 -81
- data/lib/resources/etc_hosts_allow_deny.rb +122 -123
- data/lib/resources/file.rb +298 -298
- data/lib/resources/filesystem.rb +31 -31
- data/lib/resources/firewalld.rb +143 -144
- data/lib/resources/gem.rb +70 -70
- data/lib/resources/groups.rb +215 -215
- data/lib/resources/grub_conf.rb +237 -237
- data/lib/resources/host.rb +306 -300
- data/lib/resources/http.rb +251 -250
- data/lib/resources/iis_app.rb +101 -104
- data/lib/resources/iis_site.rb +148 -148
- data/lib/resources/inetd_conf.rb +62 -62
- data/lib/resources/ini.rb +29 -29
- data/lib/resources/interface.rb +129 -129
- data/lib/resources/iptables.rb +80 -69
- data/lib/resources/json.rb +117 -117
- data/lib/resources/kernel_module.rb +107 -107
- data/lib/resources/kernel_parameter.rb +58 -58
- data/lib/resources/key_rsa.rb +67 -67
- data/lib/resources/limits_conf.rb +55 -55
- data/lib/resources/login_def.rb +66 -66
- data/lib/resources/mount.rb +88 -88
- data/lib/resources/mssql_session.rb +101 -101
- data/lib/resources/mysql.rb +81 -81
- data/lib/resources/mysql_conf.rb +134 -134
- data/lib/resources/mysql_session.rb +71 -71
- data/lib/resources/nginx.rb +96 -96
- data/lib/resources/nginx_conf.rb +227 -227
- data/lib/resources/npm.rb +48 -48
- data/lib/resources/ntp_conf.rb +58 -58
- data/lib/resources/oneget.rb +71 -71
- data/lib/resources/oracledb_session.rb +139 -139
- data/lib/resources/os.rb +36 -36
- data/lib/resources/os_env.rb +76 -76
- data/lib/resources/package.rb +370 -370
- data/lib/resources/packages.rb +111 -111
- data/lib/resources/parse_config.rb +116 -116
- data/lib/resources/passwd.rb +74 -74
- data/lib/resources/pip.rb +89 -89
- data/lib/resources/platform.rb +109 -109
- data/lib/resources/port.rb +771 -771
- data/lib/resources/postgres.rb +130 -130
- data/lib/resources/postgres_conf.rb +121 -121
- data/lib/resources/postgres_hba_conf.rb +99 -100
- data/lib/resources/postgres_ident_conf.rb +76 -78
- data/lib/resources/postgres_session.rb +71 -71
- data/lib/resources/powershell.rb +53 -57
- data/lib/resources/processes.rb +204 -204
- data/lib/resources/rabbitmq_conf.rb +52 -52
- data/lib/resources/registry_key.rb +296 -296
- data/lib/resources/security_policy.rb +180 -180
- data/lib/resources/service.rb +789 -789
- data/lib/resources/shadow.rb +146 -140
- data/lib/resources/ssh_conf.rb +102 -102
- data/lib/resources/ssl.rb +99 -99
- data/lib/resources/sys_info.rb +28 -28
- data/lib/resources/toml.rb +32 -32
- data/lib/resources/users.rb +654 -654
- data/lib/resources/vbscript.rb +68 -69
- data/lib/resources/virtualization.rb +247 -247
- data/lib/resources/windows_feature.rb +84 -84
- data/lib/resources/windows_hotfix.rb +35 -35
- data/lib/resources/windows_task.rb +102 -105
- data/lib/resources/wmi.rb +110 -113
- data/lib/resources/x509_certificate.rb +143 -143
- data/lib/resources/xinetd.rb +111 -111
- data/lib/resources/xml.rb +46 -46
- data/lib/resources/yaml.rb +47 -47
- data/lib/resources/yum.rb +180 -180
- data/lib/resources/zfs_dataset.rb +60 -60
- data/lib/resources/zfs_pool.rb +49 -49
- data/lib/source_readers/flat.rb +39 -39
- data/lib/source_readers/inspec.rb +75 -75
- data/lib/utils/command_wrapper.rb +27 -27
- data/lib/utils/convert.rb +12 -12
- data/lib/utils/database_helpers.rb +77 -77
- data/lib/utils/erlang_parser.rb +192 -192
- data/lib/utils/filter.rb +272 -272
- data/lib/utils/filter_array.rb +27 -27
- data/lib/utils/find_files.rb +44 -44
- data/lib/utils/hash.rb +41 -41
- data/lib/utils/json_log.rb +18 -18
- data/lib/utils/latest_version.rb +22 -22
- data/lib/utils/modulator.rb +12 -12
- data/lib/utils/nginx_parser.rb +85 -85
- data/lib/utils/object_traversal.rb +49 -49
- data/lib/utils/parser.rb +274 -274
- data/lib/utils/plugin_registry.rb +93 -93
- data/lib/utils/simpleconfig.rb +120 -120
- data/lib/utils/spdx.rb +13 -13
- data/lib/utils/spdx.txt +343 -343
- metadata +2 -2
data/lib/inspec/formatters.rb
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
require 'inspec/formatters/base'
|
|
2
|
-
require 'inspec/formatters/json_rspec'
|
|
3
|
-
require 'inspec/formatters/show_progress'
|
|
1
|
+
require 'inspec/formatters/base'
|
|
2
|
+
require 'inspec/formatters/json_rspec'
|
|
3
|
+
require 'inspec/formatters/show_progress'
|
|
@@ -1,250 +1,250 @@
|
|
|
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
|
-
}
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# Add the current profile to the list of executed profiles.
|
|
76
|
-
# Called by the runner during example collection.
|
|
77
|
-
def add_profile(profile)
|
|
78
|
-
@profiles.push(profile)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Return all the collected output to the caller
|
|
82
|
-
def results
|
|
83
|
-
run_data
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
private
|
|
87
|
-
|
|
88
|
-
def all_unique_controls
|
|
89
|
-
unique_controls = Set.new
|
|
90
|
-
run_data[:profiles].each do |profile|
|
|
91
|
-
profile[:controls].map { |control| unique_controls.add(control) }
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
unique_controls
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def statistics
|
|
98
|
-
failed = 0
|
|
99
|
-
skipped = 0
|
|
100
|
-
passed = 0
|
|
101
|
-
|
|
102
|
-
all_unique_controls.each do |control|
|
|
103
|
-
next unless control[:results]
|
|
104
|
-
if control[:results].any? { |r| r[:status] == 'failed' }
|
|
105
|
-
failed += 1
|
|
106
|
-
elsif control[:results].any? { |r| r[:status] == 'skipped' }
|
|
107
|
-
skipped += 1
|
|
108
|
-
else
|
|
109
|
-
passed += 1
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
total = failed + passed + skipped
|
|
114
|
-
|
|
115
|
-
{
|
|
116
|
-
total: total,
|
|
117
|
-
passed: {
|
|
118
|
-
total: passed,
|
|
119
|
-
},
|
|
120
|
-
skipped: {
|
|
121
|
-
total: skipped,
|
|
122
|
-
},
|
|
123
|
-
failed: {
|
|
124
|
-
total: failed,
|
|
125
|
-
},
|
|
126
|
-
}
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def exception_message(exception)
|
|
130
|
-
if exception.is_a?(RSpec::Core::MultipleExceptionError)
|
|
131
|
-
exception.all_exceptions.map(&:message).uniq.join("\n\n")
|
|
132
|
-
else
|
|
133
|
-
exception.message
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
# RSpec Override: #format_example
|
|
138
|
-
#
|
|
139
|
-
# Called after test execution, this allows us to populate our own hash with data
|
|
140
|
-
# for this test that is necessary for the rest of our reports.
|
|
141
|
-
def format_example(example) # rubocop:disable Metrics/AbcSize
|
|
142
|
-
if !example.metadata[:description_args].empty? && example.metadata[:skip]
|
|
143
|
-
# For skipped profiles, rspec returns in full_description the skip_message as well. We don't want
|
|
144
|
-
# to mix the two, so we pick the full_description from the example.metadata[:example_group] hash.
|
|
145
|
-
code_description = example.metadata[:example_group][:description]
|
|
146
|
-
else
|
|
147
|
-
code_description = example.metadata[:full_description]
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
res = {
|
|
151
|
-
id: example.metadata[:id],
|
|
152
|
-
profile_id: example.metadata[:profile_id],
|
|
153
|
-
status: example.execution_result.status.to_s,
|
|
154
|
-
code_desc: code_description,
|
|
155
|
-
run_time: example.execution_result.run_time,
|
|
156
|
-
start_time: example.execution_result.started_at.to_datetime.rfc3339.to_s,
|
|
157
|
-
resource_title: example.metadata[:described_class] || example.metadata[:example_group][:description],
|
|
158
|
-
expectation_message: format_expectation_message(example),
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
unless (pid = example.metadata[:profile_id]).nil?
|
|
162
|
-
res[:profile_id] = pid
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
if res[:status] == 'pending'
|
|
166
|
-
res[:status] = 'skipped'
|
|
167
|
-
res[:skip_message] = example.metadata[:description]
|
|
168
|
-
res[:resource] = example.metadata[:described_class].to_s
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
res
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
def format_expectation_message(example)
|
|
175
|
-
if (example.metadata[:example_group][:description_args].first == example.metadata[:example_group][:described_class]) ||
|
|
176
|
-
example.metadata[:example_group][:described_class].nil?
|
|
177
|
-
example.metadata[:description]
|
|
178
|
-
else
|
|
179
|
-
"#{example.metadata[:example_group][:description]} #{example.metadata[:description]}"
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def platform(field)
|
|
184
|
-
return nil if @backend.nil?
|
|
185
|
-
@backend.platform[field]
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def backend_target
|
|
189
|
-
return nil if @backend.nil?
|
|
190
|
-
connection = @backend.backend
|
|
191
|
-
connection.respond_to?(:uri) ? connection.uri : nil
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
def examples
|
|
195
|
-
run_data[:controls]
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def examples_without_controls
|
|
199
|
-
examples.find_all { |example| example2control(example).nil? }
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def examples_with_controls
|
|
203
|
-
examples.find_all { |example| !example2control(example).nil? }
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def profiles_info
|
|
207
|
-
@profiles_info ||= @profiles.map(&:info!).map(&:dup)
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
def example2control(example)
|
|
211
|
-
profile = profile_from_example(example)
|
|
212
|
-
return nil unless profile&.[](:controls)
|
|
213
|
-
profile[:controls].find { |x| x[:id] == example[:id] }
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
def profile_from_example(example)
|
|
217
|
-
profiles_info.find { |p| profile_contains_example?(p, example) }
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
def profile_contains_example?(profile, example)
|
|
221
|
-
profile_name = profile[:name]
|
|
222
|
-
example_profile_id = example[:profile_id]
|
|
223
|
-
|
|
224
|
-
# if either the profile name is nil or the profile in the given example
|
|
225
|
-
# is nil, assume the profile doesn't contain the example and default
|
|
226
|
-
# to creating a new profile. Otherwise, for profiles that have no
|
|
227
|
-
# metadata, this may incorrectly match a profile that does not contain
|
|
228
|
-
# this example, leading to Ruby exceptions.
|
|
229
|
-
return false if profile_name.nil? || example_profile_id.nil?
|
|
230
|
-
|
|
231
|
-
# The correct profile is one where the name of the profile, and the profile
|
|
232
|
-
# name in the example match. Additionally, the list of controls in the
|
|
233
|
-
# profile must contain the example in question (which we match by ID).
|
|
234
|
-
#
|
|
235
|
-
# While the profile name match is usually good enough, we must also match by
|
|
236
|
-
# the control ID in the case where an InSpec runner has multiple profiles of
|
|
237
|
-
# the same name (i.e. when Test Kitchen is running concurrently using a
|
|
238
|
-
# single test suite that uses the Flat source reader, in which case InSpec
|
|
239
|
-
# creates a fake profile with a name like "tests from /path/to/tests")
|
|
240
|
-
profile_name == example_profile_id && profile[:controls].any? { |control| control[:id] == example[:id] }
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
def move_example_into_control(example, control)
|
|
244
|
-
control[:results] ||= []
|
|
245
|
-
example.delete(:id)
|
|
246
|
-
example.delete(:profile_id)
|
|
247
|
-
control[:results].push(example)
|
|
248
|
-
end
|
|
249
|
-
end
|
|
250
|
-
end
|
|
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
|
+
}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Add the current profile to the list of executed profiles.
|
|
76
|
+
# Called by the runner during example collection.
|
|
77
|
+
def add_profile(profile)
|
|
78
|
+
@profiles.push(profile)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Return all the collected output to the caller
|
|
82
|
+
def results
|
|
83
|
+
run_data
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def all_unique_controls
|
|
89
|
+
unique_controls = Set.new
|
|
90
|
+
run_data[:profiles].each do |profile|
|
|
91
|
+
profile[:controls].map { |control| unique_controls.add(control) }
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
unique_controls
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def statistics
|
|
98
|
+
failed = 0
|
|
99
|
+
skipped = 0
|
|
100
|
+
passed = 0
|
|
101
|
+
|
|
102
|
+
all_unique_controls.each do |control|
|
|
103
|
+
next unless control[:results]
|
|
104
|
+
if control[:results].any? { |r| r[:status] == 'failed' }
|
|
105
|
+
failed += 1
|
|
106
|
+
elsif control[:results].any? { |r| r[:status] == 'skipped' }
|
|
107
|
+
skipped += 1
|
|
108
|
+
else
|
|
109
|
+
passed += 1
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
total = failed + passed + skipped
|
|
114
|
+
|
|
115
|
+
{
|
|
116
|
+
total: total,
|
|
117
|
+
passed: {
|
|
118
|
+
total: passed,
|
|
119
|
+
},
|
|
120
|
+
skipped: {
|
|
121
|
+
total: skipped,
|
|
122
|
+
},
|
|
123
|
+
failed: {
|
|
124
|
+
total: failed,
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def exception_message(exception)
|
|
130
|
+
if exception.is_a?(RSpec::Core::MultipleExceptionError)
|
|
131
|
+
exception.all_exceptions.map(&:message).uniq.join("\n\n")
|
|
132
|
+
else
|
|
133
|
+
exception.message
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# RSpec Override: #format_example
|
|
138
|
+
#
|
|
139
|
+
# Called after test execution, this allows us to populate our own hash with data
|
|
140
|
+
# for this test that is necessary for the rest of our reports.
|
|
141
|
+
def format_example(example) # rubocop:disable Metrics/AbcSize
|
|
142
|
+
if !example.metadata[:description_args].empty? && example.metadata[:skip]
|
|
143
|
+
# For skipped profiles, rspec returns in full_description the skip_message as well. We don't want
|
|
144
|
+
# to mix the two, so we pick the full_description from the example.metadata[:example_group] hash.
|
|
145
|
+
code_description = example.metadata[:example_group][:description]
|
|
146
|
+
else
|
|
147
|
+
code_description = example.metadata[:full_description]
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
res = {
|
|
151
|
+
id: example.metadata[:id],
|
|
152
|
+
profile_id: example.metadata[:profile_id],
|
|
153
|
+
status: example.execution_result.status.to_s,
|
|
154
|
+
code_desc: code_description,
|
|
155
|
+
run_time: example.execution_result.run_time,
|
|
156
|
+
start_time: example.execution_result.started_at.to_datetime.rfc3339.to_s,
|
|
157
|
+
resource_title: example.metadata[:described_class] || example.metadata[:example_group][:description],
|
|
158
|
+
expectation_message: format_expectation_message(example),
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
unless (pid = example.metadata[:profile_id]).nil?
|
|
162
|
+
res[:profile_id] = pid
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
if res[:status] == 'pending'
|
|
166
|
+
res[:status] = 'skipped'
|
|
167
|
+
res[:skip_message] = example.metadata[:description]
|
|
168
|
+
res[:resource] = example.metadata[:described_class].to_s
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
res
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def format_expectation_message(example)
|
|
175
|
+
if (example.metadata[:example_group][:description_args].first == example.metadata[:example_group][:described_class]) ||
|
|
176
|
+
example.metadata[:example_group][:described_class].nil?
|
|
177
|
+
example.metadata[:description]
|
|
178
|
+
else
|
|
179
|
+
"#{example.metadata[:example_group][:description]} #{example.metadata[:description]}"
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def platform(field)
|
|
184
|
+
return nil if @backend.nil?
|
|
185
|
+
@backend.platform[field]
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def backend_target
|
|
189
|
+
return nil if @backend.nil?
|
|
190
|
+
connection = @backend.backend
|
|
191
|
+
connection.respond_to?(:uri) ? connection.uri : nil
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def examples
|
|
195
|
+
run_data[:controls]
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def examples_without_controls
|
|
199
|
+
examples.find_all { |example| example2control(example).nil? }
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def examples_with_controls
|
|
203
|
+
examples.find_all { |example| !example2control(example).nil? }
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def profiles_info
|
|
207
|
+
@profiles_info ||= @profiles.map(&:info!).map(&:dup)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def example2control(example)
|
|
211
|
+
profile = profile_from_example(example)
|
|
212
|
+
return nil unless profile&.[](:controls)
|
|
213
|
+
profile[:controls].find { |x| x[:id] == example[:id] }
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def profile_from_example(example)
|
|
217
|
+
profiles_info.find { |p| profile_contains_example?(p, example) }
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def profile_contains_example?(profile, example)
|
|
221
|
+
profile_name = profile[:name]
|
|
222
|
+
example_profile_id = example[:profile_id]
|
|
223
|
+
|
|
224
|
+
# if either the profile name is nil or the profile in the given example
|
|
225
|
+
# is nil, assume the profile doesn't contain the example and default
|
|
226
|
+
# to creating a new profile. Otherwise, for profiles that have no
|
|
227
|
+
# metadata, this may incorrectly match a profile that does not contain
|
|
228
|
+
# this example, leading to Ruby exceptions.
|
|
229
|
+
return false if profile_name.nil? || example_profile_id.nil?
|
|
230
|
+
|
|
231
|
+
# The correct profile is one where the name of the profile, and the profile
|
|
232
|
+
# name in the example match. Additionally, the list of controls in the
|
|
233
|
+
# profile must contain the example in question (which we match by ID).
|
|
234
|
+
#
|
|
235
|
+
# While the profile name match is usually good enough, we must also match by
|
|
236
|
+
# the control ID in the case where an InSpec runner has multiple profiles of
|
|
237
|
+
# the same name (i.e. when Test Kitchen is running concurrently using a
|
|
238
|
+
# single test suite that uses the Flat source reader, in which case InSpec
|
|
239
|
+
# creates a fake profile with a name like "tests from /path/to/tests")
|
|
240
|
+
profile_name == example_profile_id && profile[:controls].any? { |control| control[:id] == example[:id] }
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def move_example_into_control(example, control)
|
|
244
|
+
control[:results] ||= []
|
|
245
|
+
example.delete(:id)
|
|
246
|
+
example.delete(:profile_id)
|
|
247
|
+
control[:results].push(example)
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|