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/runner.rb
CHANGED
|
@@ -1,345 +1,345 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
# copyright: 2015, Dominik Richter
|
|
3
|
-
# author: Dominik Richter
|
|
4
|
-
# author: Christoph Hartmann
|
|
5
|
-
|
|
6
|
-
require 'forwardable'
|
|
7
|
-
require 'uri'
|
|
8
|
-
require 'inspec/backend'
|
|
9
|
-
require 'inspec/profile_context'
|
|
10
|
-
require 'inspec/profile'
|
|
11
|
-
require 'inspec/metadata'
|
|
12
|
-
require 'inspec/secrets'
|
|
13
|
-
require 'inspec/dependencies/cache'
|
|
14
|
-
# spec requirements
|
|
15
|
-
|
|
16
|
-
module Inspec
|
|
17
|
-
#
|
|
18
|
-
# Inspec::Runner coordinates the running of tests and is the main
|
|
19
|
-
# entry point to the application.
|
|
20
|
-
#
|
|
21
|
-
# Users are expected to insantiate a runner, add targets to be run,
|
|
22
|
-
# and then call the run method:
|
|
23
|
-
#
|
|
24
|
-
# ```
|
|
25
|
-
# r = Inspec::Runner.new()
|
|
26
|
-
# r.add_target("/path/to/some/profile")
|
|
27
|
-
# r.add_target("http://url/to/some/profile")
|
|
28
|
-
# r.run
|
|
29
|
-
# ```
|
|
30
|
-
#
|
|
31
|
-
class Runner
|
|
32
|
-
extend Forwardable
|
|
33
|
-
|
|
34
|
-
attr_reader :backend, :rules, :attributes
|
|
35
|
-
def initialize(conf = {})
|
|
36
|
-
@rules = []
|
|
37
|
-
@conf = conf.dup
|
|
38
|
-
@conf[:logger] ||= Logger.new(nil)
|
|
39
|
-
@target_profiles = []
|
|
40
|
-
@controls = @conf[:controls] || []
|
|
41
|
-
@depends = @conf[:depends] || []
|
|
42
|
-
@ignore_supports = @conf[:ignore_supports]
|
|
43
|
-
@create_lockfile = @conf[:create_lockfile]
|
|
44
|
-
@cache = Inspec::Cache.new(@conf[:vendor_cache])
|
|
45
|
-
|
|
46
|
-
# parse any ad-hoc runners reporter formats
|
|
47
|
-
# this has to happen before we load the test_collector
|
|
48
|
-
@conf = Inspec::BaseCLI.parse_reporters(@conf) if @conf[:type].nil?
|
|
49
|
-
|
|
50
|
-
@test_collector = @conf.delete(:test_collector) || begin
|
|
51
|
-
require 'inspec/runner_rspec'
|
|
52
|
-
RunnerRspec.new(@conf)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# list of profile attributes
|
|
56
|
-
@attributes = []
|
|
57
|
-
|
|
58
|
-
load_attributes(@conf)
|
|
59
|
-
configure_transport
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def tests
|
|
63
|
-
@test_collector.tests
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def configure_transport
|
|
67
|
-
@backend = Inspec::Backend.create(@conf)
|
|
68
|
-
@test_collector.backend = @backend
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def reset
|
|
72
|
-
@test_collector.reset
|
|
73
|
-
@target_profiles.each do |profile|
|
|
74
|
-
profile.runner_context.rules = {}
|
|
75
|
-
end
|
|
76
|
-
@rules = []
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def load
|
|
80
|
-
all_controls = []
|
|
81
|
-
|
|
82
|
-
@target_profiles.each do |profile|
|
|
83
|
-
@test_collector.add_profile(profile)
|
|
84
|
-
write_lockfile(profile) if @create_lockfile
|
|
85
|
-
profile.locked_dependencies
|
|
86
|
-
profile_context = profile.load_libraries
|
|
87
|
-
|
|
88
|
-
profile_context.dependencies.list.values.each do |requirement|
|
|
89
|
-
@test_collector.add_profile(requirement.profile)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
@attributes |= profile.runner_context.attributes
|
|
93
|
-
all_controls += profile.collect_tests
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
all_controls.each do |rule|
|
|
97
|
-
register_rule(rule) unless rule.nil?
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def run(with = nil)
|
|
102
|
-
Inspec::Log.debug "Starting run with targets: #{@target_profiles.map(&:to_s)}"
|
|
103
|
-
load
|
|
104
|
-
run_tests(with)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def render_output(run_data)
|
|
108
|
-
return if @conf['reporter'].nil?
|
|
109
|
-
|
|
110
|
-
@conf['reporter'].each do |reporter|
|
|
111
|
-
Inspec::Reporters.render(reporter, run_data)
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def report
|
|
116
|
-
Inspec::Reporters.report(@conf['reporter'].first, @run_data)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def write_lockfile(profile)
|
|
120
|
-
return false if !profile.writable?
|
|
121
|
-
|
|
122
|
-
if profile.lockfile_exists?
|
|
123
|
-
Inspec::Log.debug "Using existing lockfile #{profile.lockfile_path}"
|
|
124
|
-
else
|
|
125
|
-
Inspec::Log.debug "Creating lockfile: #{profile.lockfile_path}"
|
|
126
|
-
lockfile = profile.generate_lockfile
|
|
127
|
-
File.write(profile.lockfile_path, lockfile.to_yaml)
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def run_tests(with = nil)
|
|
132
|
-
@run_data = @test_collector.run(with)
|
|
133
|
-
# dont output anything if we want a report
|
|
134
|
-
render_output(@run_data) unless @conf['report']
|
|
135
|
-
@test_collector.exit_code
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# determine all attributes before the execution, fetch data from secrets backend
|
|
139
|
-
def load_attributes(options)
|
|
140
|
-
options[:attributes] ||= {}
|
|
141
|
-
|
|
142
|
-
secrets_targets = options[:attrs]
|
|
143
|
-
return options[:attributes] if secrets_targets.nil?
|
|
144
|
-
|
|
145
|
-
secrets_targets.each do |target|
|
|
146
|
-
validate_attributes_file_readability!(target)
|
|
147
|
-
|
|
148
|
-
secrets = Inspec::SecretsBackend.resolve(target)
|
|
149
|
-
if secrets.nil?
|
|
150
|
-
raise Inspec::Exceptions::SecretsBackendNotFound,
|
|
151
|
-
"Cannot find parser for attributes file '#{target}'. " \
|
|
152
|
-
'Check to make sure file has the appropriate extension.'
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
next if secrets.attributes.nil?
|
|
156
|
-
options[:attributes].merge!(secrets.attributes)
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
options[:attributes]
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
#
|
|
163
|
-
# add_target allows the user to add a target whose tests will be
|
|
164
|
-
# run when the user calls the run method.
|
|
165
|
-
#
|
|
166
|
-
# A target is a path or URL that points to a profile. Using this
|
|
167
|
-
# target we generate a Profile and a ProfileContext. The content
|
|
168
|
-
# (libraries, tests, and attributes) from the Profile are loaded
|
|
169
|
-
# into the ProfileContext.
|
|
170
|
-
#
|
|
171
|
-
# If the profile depends on other profiles, those profiles will be
|
|
172
|
-
# loaded on-demand when include_content or required_content are
|
|
173
|
-
# called using similar code in Inspec::DSL.
|
|
174
|
-
#
|
|
175
|
-
# Once the we've loaded all of the tests files in the profile, we
|
|
176
|
-
# query the profile for the full list of rules. Those rules are
|
|
177
|
-
# registered with the @test_collector which is ultimately
|
|
178
|
-
# responsible for actually running the tests.
|
|
179
|
-
#
|
|
180
|
-
# TODO: Deduplicate/clarify the loading code that exists in here,
|
|
181
|
-
# the ProfileContext, the Profile, and Inspec::DSL
|
|
182
|
-
#
|
|
183
|
-
# @params target [String] A path or URL to a profile or raw test.
|
|
184
|
-
# @params _opts [Hash] Unused, but still here to avoid breaking kitchen-inspec
|
|
185
|
-
#
|
|
186
|
-
# @eturns [Inspec::ProfileContext]
|
|
187
|
-
#
|
|
188
|
-
def add_target(target, _opts = [])
|
|
189
|
-
profile = Inspec::Profile.for_target(target,
|
|
190
|
-
vendor_cache: @cache,
|
|
191
|
-
backend: @backend,
|
|
192
|
-
controls: @controls,
|
|
193
|
-
attributes: @conf[:attributes])
|
|
194
|
-
raise "Could not resolve #{target} to valid input." if profile.nil?
|
|
195
|
-
@target_profiles << profile if supports_profile?(profile)
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def supports_profile?(profile)
|
|
199
|
-
return true if @ignore_supports
|
|
200
|
-
|
|
201
|
-
if !profile.supports_runtime?
|
|
202
|
-
raise 'This profile requires InSpec version '\
|
|
203
|
-
"#{profile.metadata.inspec_requirement}. You are running "\
|
|
204
|
-
"InSpec v#{Inspec::VERSION}.\n"
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
if !profile.supports_platform?
|
|
208
|
-
raise "This OS/platform (#{@backend.platform.name}/#{@backend.platform.release}) is not supported by this profile."
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
true
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
# In some places we read the rules off of the runner, in other
|
|
215
|
-
# places we read it off of the profile context. To keep the API's
|
|
216
|
-
# the same, we provide an #all_rules method here as well.
|
|
217
|
-
def all_rules
|
|
218
|
-
@rules
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
def register_rules(ctx)
|
|
222
|
-
new_tests = false
|
|
223
|
-
ctx.rules.each do |rule_id, rule|
|
|
224
|
-
next if block_given? && !(yield rule_id, rule)
|
|
225
|
-
new_tests = true
|
|
226
|
-
register_rule(rule)
|
|
227
|
-
end
|
|
228
|
-
new_tests
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
def eval_with_virtual_profile(command)
|
|
232
|
-
require 'fetchers/mock'
|
|
233
|
-
add_target({ 'inspec.yml' => 'name: inspec-shell' })
|
|
234
|
-
our_profile = @target_profiles.first
|
|
235
|
-
ctx = our_profile.runner_context
|
|
236
|
-
|
|
237
|
-
# Load local profile dependencies. This is used in inspec shell
|
|
238
|
-
# to provide access to local profiles that add resources.
|
|
239
|
-
@depends
|
|
240
|
-
.map { |x| Inspec::Profile.for_path(x, { profile_context: ctx }) }
|
|
241
|
-
.each(&:load_libraries)
|
|
242
|
-
|
|
243
|
-
ctx.load(command)
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
private
|
|
247
|
-
|
|
248
|
-
def block_source_info(block)
|
|
249
|
-
return {} if block.nil? || !block.respond_to?(:source_location)
|
|
250
|
-
opts = {}
|
|
251
|
-
file_path, line = block.source_location
|
|
252
|
-
opts['file_path'] = file_path
|
|
253
|
-
opts['line_number'] = line
|
|
254
|
-
opts
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
def get_check_example(method_name, arg, block)
|
|
258
|
-
opts = block_source_info(block)
|
|
259
|
-
|
|
260
|
-
return nil if arg.empty?
|
|
261
|
-
|
|
262
|
-
resource = arg[0]
|
|
263
|
-
# check to see if we are using a filtertable object
|
|
264
|
-
resource = arg[0].resource if arg[0].class.superclass == FilterTable::Table
|
|
265
|
-
if resource.respond_to?(:resource_skipped?) && resource.resource_skipped?
|
|
266
|
-
return rspec_skipped_block(arg, opts, resource.resource_exception_message)
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
if resource.respond_to?(:resource_failed?) && resource.resource_failed?
|
|
270
|
-
return rspec_failed_block(arg, opts, resource.resource_exception_message)
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
# If neither skipped nor failed then add the resource
|
|
274
|
-
add_resource(method_name, arg, opts, block)
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
def register_rule(rule)
|
|
278
|
-
Inspec::Log.debug "Registering rule #{rule}"
|
|
279
|
-
@rules << rule
|
|
280
|
-
checks = ::Inspec::Rule.prepare_checks(rule)
|
|
281
|
-
examples = checks.flat_map do |m, a, b|
|
|
282
|
-
get_check_example(m, a, b)
|
|
283
|
-
end.compact
|
|
284
|
-
|
|
285
|
-
examples.each { |e| @test_collector.add_test(e, rule) }
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
def validate_attributes_file_readability!(target)
|
|
289
|
-
unless File.exist?(target)
|
|
290
|
-
raise Inspec::Exceptions::AttributesFileDoesNotExist,
|
|
291
|
-
"Cannot find attributes file '#{target}'. " \
|
|
292
|
-
'Check to make sure file exists.'
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
unless File.readable?(target)
|
|
296
|
-
raise Inspec::Exceptions::AttributesFileNotReadable,
|
|
297
|
-
"Cannot read attributes file '#{target}'. " \
|
|
298
|
-
'Check to make sure file is readable.'
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
true
|
|
302
|
-
end
|
|
303
|
-
|
|
304
|
-
def rspec_skipped_block(arg, opts, message)
|
|
305
|
-
@test_collector.example_group(*arg, opts) do
|
|
306
|
-
# Send custom `it` block to RSpec
|
|
307
|
-
it message
|
|
308
|
-
end
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
def rspec_failed_block(arg, opts, message)
|
|
312
|
-
@test_collector.example_group(*arg, opts) do
|
|
313
|
-
# Send custom `it` block to RSpec
|
|
314
|
-
it '' do
|
|
315
|
-
# Raising here to fail the test and get proper formatting
|
|
316
|
-
raise Inspec::Exceptions::ResourceFailed, message
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
def add_resource(method_name, arg, opts, block)
|
|
322
|
-
case method_name
|
|
323
|
-
when 'describe'
|
|
324
|
-
@test_collector.example_group(*arg, opts, &block)
|
|
325
|
-
when 'expect'
|
|
326
|
-
block.example_group
|
|
327
|
-
when 'describe.one'
|
|
328
|
-
tests = arg.map do |x|
|
|
329
|
-
@test_collector.example_group(x[1][0], block_source_info(x[2]), &x[2])
|
|
330
|
-
end
|
|
331
|
-
return nil if tests.empty?
|
|
332
|
-
|
|
333
|
-
successful_tests = tests.find_all(&:run)
|
|
334
|
-
|
|
335
|
-
# Return all tests if none succeeds; we will just report full failure
|
|
336
|
-
return tests if successful_tests.empty?
|
|
337
|
-
|
|
338
|
-
successful_tests
|
|
339
|
-
else
|
|
340
|
-
raise "A rule was registered with #{method_name.inspect}," \
|
|
341
|
-
"which isn't understood and cannot be processed."
|
|
342
|
-
end
|
|
343
|
-
end
|
|
344
|
-
end
|
|
345
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# copyright: 2015, Dominik Richter
|
|
3
|
+
# author: Dominik Richter
|
|
4
|
+
# author: Christoph Hartmann
|
|
5
|
+
|
|
6
|
+
require 'forwardable'
|
|
7
|
+
require 'uri'
|
|
8
|
+
require 'inspec/backend'
|
|
9
|
+
require 'inspec/profile_context'
|
|
10
|
+
require 'inspec/profile'
|
|
11
|
+
require 'inspec/metadata'
|
|
12
|
+
require 'inspec/secrets'
|
|
13
|
+
require 'inspec/dependencies/cache'
|
|
14
|
+
# spec requirements
|
|
15
|
+
|
|
16
|
+
module Inspec
|
|
17
|
+
#
|
|
18
|
+
# Inspec::Runner coordinates the running of tests and is the main
|
|
19
|
+
# entry point to the application.
|
|
20
|
+
#
|
|
21
|
+
# Users are expected to insantiate a runner, add targets to be run,
|
|
22
|
+
# and then call the run method:
|
|
23
|
+
#
|
|
24
|
+
# ```
|
|
25
|
+
# r = Inspec::Runner.new()
|
|
26
|
+
# r.add_target("/path/to/some/profile")
|
|
27
|
+
# r.add_target("http://url/to/some/profile")
|
|
28
|
+
# r.run
|
|
29
|
+
# ```
|
|
30
|
+
#
|
|
31
|
+
class Runner
|
|
32
|
+
extend Forwardable
|
|
33
|
+
|
|
34
|
+
attr_reader :backend, :rules, :attributes
|
|
35
|
+
def initialize(conf = {})
|
|
36
|
+
@rules = []
|
|
37
|
+
@conf = conf.dup
|
|
38
|
+
@conf[:logger] ||= Logger.new(nil)
|
|
39
|
+
@target_profiles = []
|
|
40
|
+
@controls = @conf[:controls] || []
|
|
41
|
+
@depends = @conf[:depends] || []
|
|
42
|
+
@ignore_supports = @conf[:ignore_supports]
|
|
43
|
+
@create_lockfile = @conf[:create_lockfile]
|
|
44
|
+
@cache = Inspec::Cache.new(@conf[:vendor_cache])
|
|
45
|
+
|
|
46
|
+
# parse any ad-hoc runners reporter formats
|
|
47
|
+
# this has to happen before we load the test_collector
|
|
48
|
+
@conf = Inspec::BaseCLI.parse_reporters(@conf) if @conf[:type].nil?
|
|
49
|
+
|
|
50
|
+
@test_collector = @conf.delete(:test_collector) || begin
|
|
51
|
+
require 'inspec/runner_rspec'
|
|
52
|
+
RunnerRspec.new(@conf)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# list of profile attributes
|
|
56
|
+
@attributes = []
|
|
57
|
+
|
|
58
|
+
load_attributes(@conf)
|
|
59
|
+
configure_transport
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def tests
|
|
63
|
+
@test_collector.tests
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def configure_transport
|
|
67
|
+
@backend = Inspec::Backend.create(@conf)
|
|
68
|
+
@test_collector.backend = @backend
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def reset
|
|
72
|
+
@test_collector.reset
|
|
73
|
+
@target_profiles.each do |profile|
|
|
74
|
+
profile.runner_context.rules = {}
|
|
75
|
+
end
|
|
76
|
+
@rules = []
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def load
|
|
80
|
+
all_controls = []
|
|
81
|
+
|
|
82
|
+
@target_profiles.each do |profile|
|
|
83
|
+
@test_collector.add_profile(profile)
|
|
84
|
+
write_lockfile(profile) if @create_lockfile
|
|
85
|
+
profile.locked_dependencies
|
|
86
|
+
profile_context = profile.load_libraries
|
|
87
|
+
|
|
88
|
+
profile_context.dependencies.list.values.each do |requirement|
|
|
89
|
+
@test_collector.add_profile(requirement.profile)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
@attributes |= profile.runner_context.attributes
|
|
93
|
+
all_controls += profile.collect_tests
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
all_controls.each do |rule|
|
|
97
|
+
register_rule(rule) unless rule.nil?
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def run(with = nil)
|
|
102
|
+
Inspec::Log.debug "Starting run with targets: #{@target_profiles.map(&:to_s)}"
|
|
103
|
+
load
|
|
104
|
+
run_tests(with)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def render_output(run_data)
|
|
108
|
+
return if @conf['reporter'].nil?
|
|
109
|
+
|
|
110
|
+
@conf['reporter'].each do |reporter|
|
|
111
|
+
Inspec::Reporters.render(reporter, run_data)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def report
|
|
116
|
+
Inspec::Reporters.report(@conf['reporter'].first, @run_data)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def write_lockfile(profile)
|
|
120
|
+
return false if !profile.writable?
|
|
121
|
+
|
|
122
|
+
if profile.lockfile_exists?
|
|
123
|
+
Inspec::Log.debug "Using existing lockfile #{profile.lockfile_path}"
|
|
124
|
+
else
|
|
125
|
+
Inspec::Log.debug "Creating lockfile: #{profile.lockfile_path}"
|
|
126
|
+
lockfile = profile.generate_lockfile
|
|
127
|
+
File.write(profile.lockfile_path, lockfile.to_yaml)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def run_tests(with = nil)
|
|
132
|
+
@run_data = @test_collector.run(with)
|
|
133
|
+
# dont output anything if we want a report
|
|
134
|
+
render_output(@run_data) unless @conf['report']
|
|
135
|
+
@test_collector.exit_code
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# determine all attributes before the execution, fetch data from secrets backend
|
|
139
|
+
def load_attributes(options)
|
|
140
|
+
options[:attributes] ||= {}
|
|
141
|
+
|
|
142
|
+
secrets_targets = options[:attrs]
|
|
143
|
+
return options[:attributes] if secrets_targets.nil?
|
|
144
|
+
|
|
145
|
+
secrets_targets.each do |target|
|
|
146
|
+
validate_attributes_file_readability!(target)
|
|
147
|
+
|
|
148
|
+
secrets = Inspec::SecretsBackend.resolve(target)
|
|
149
|
+
if secrets.nil?
|
|
150
|
+
raise Inspec::Exceptions::SecretsBackendNotFound,
|
|
151
|
+
"Cannot find parser for attributes file '#{target}'. " \
|
|
152
|
+
'Check to make sure file has the appropriate extension.'
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
next if secrets.attributes.nil?
|
|
156
|
+
options[:attributes].merge!(secrets.attributes)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
options[:attributes]
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
#
|
|
163
|
+
# add_target allows the user to add a target whose tests will be
|
|
164
|
+
# run when the user calls the run method.
|
|
165
|
+
#
|
|
166
|
+
# A target is a path or URL that points to a profile. Using this
|
|
167
|
+
# target we generate a Profile and a ProfileContext. The content
|
|
168
|
+
# (libraries, tests, and attributes) from the Profile are loaded
|
|
169
|
+
# into the ProfileContext.
|
|
170
|
+
#
|
|
171
|
+
# If the profile depends on other profiles, those profiles will be
|
|
172
|
+
# loaded on-demand when include_content or required_content are
|
|
173
|
+
# called using similar code in Inspec::DSL.
|
|
174
|
+
#
|
|
175
|
+
# Once the we've loaded all of the tests files in the profile, we
|
|
176
|
+
# query the profile for the full list of rules. Those rules are
|
|
177
|
+
# registered with the @test_collector which is ultimately
|
|
178
|
+
# responsible for actually running the tests.
|
|
179
|
+
#
|
|
180
|
+
# TODO: Deduplicate/clarify the loading code that exists in here,
|
|
181
|
+
# the ProfileContext, the Profile, and Inspec::DSL
|
|
182
|
+
#
|
|
183
|
+
# @params target [String] A path or URL to a profile or raw test.
|
|
184
|
+
# @params _opts [Hash] Unused, but still here to avoid breaking kitchen-inspec
|
|
185
|
+
#
|
|
186
|
+
# @eturns [Inspec::ProfileContext]
|
|
187
|
+
#
|
|
188
|
+
def add_target(target, _opts = [])
|
|
189
|
+
profile = Inspec::Profile.for_target(target,
|
|
190
|
+
vendor_cache: @cache,
|
|
191
|
+
backend: @backend,
|
|
192
|
+
controls: @controls,
|
|
193
|
+
attributes: @conf[:attributes])
|
|
194
|
+
raise "Could not resolve #{target} to valid input." if profile.nil?
|
|
195
|
+
@target_profiles << profile if supports_profile?(profile)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def supports_profile?(profile)
|
|
199
|
+
return true if @ignore_supports
|
|
200
|
+
|
|
201
|
+
if !profile.supports_runtime?
|
|
202
|
+
raise 'This profile requires InSpec version '\
|
|
203
|
+
"#{profile.metadata.inspec_requirement}. You are running "\
|
|
204
|
+
"InSpec v#{Inspec::VERSION}.\n"
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
if !profile.supports_platform?
|
|
208
|
+
raise "This OS/platform (#{@backend.platform.name}/#{@backend.platform.release}) is not supported by this profile."
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
true
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# In some places we read the rules off of the runner, in other
|
|
215
|
+
# places we read it off of the profile context. To keep the API's
|
|
216
|
+
# the same, we provide an #all_rules method here as well.
|
|
217
|
+
def all_rules
|
|
218
|
+
@rules
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def register_rules(ctx)
|
|
222
|
+
new_tests = false
|
|
223
|
+
ctx.rules.each do |rule_id, rule|
|
|
224
|
+
next if block_given? && !(yield rule_id, rule)
|
|
225
|
+
new_tests = true
|
|
226
|
+
register_rule(rule)
|
|
227
|
+
end
|
|
228
|
+
new_tests
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def eval_with_virtual_profile(command)
|
|
232
|
+
require 'fetchers/mock'
|
|
233
|
+
add_target({ 'inspec.yml' => 'name: inspec-shell' })
|
|
234
|
+
our_profile = @target_profiles.first
|
|
235
|
+
ctx = our_profile.runner_context
|
|
236
|
+
|
|
237
|
+
# Load local profile dependencies. This is used in inspec shell
|
|
238
|
+
# to provide access to local profiles that add resources.
|
|
239
|
+
@depends
|
|
240
|
+
.map { |x| Inspec::Profile.for_path(x, { profile_context: ctx }) }
|
|
241
|
+
.each(&:load_libraries)
|
|
242
|
+
|
|
243
|
+
ctx.load(command)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
private
|
|
247
|
+
|
|
248
|
+
def block_source_info(block)
|
|
249
|
+
return {} if block.nil? || !block.respond_to?(:source_location)
|
|
250
|
+
opts = {}
|
|
251
|
+
file_path, line = block.source_location
|
|
252
|
+
opts['file_path'] = file_path
|
|
253
|
+
opts['line_number'] = line
|
|
254
|
+
opts
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def get_check_example(method_name, arg, block)
|
|
258
|
+
opts = block_source_info(block)
|
|
259
|
+
|
|
260
|
+
return nil if arg.empty?
|
|
261
|
+
|
|
262
|
+
resource = arg[0]
|
|
263
|
+
# check to see if we are using a filtertable object
|
|
264
|
+
resource = arg[0].resource if arg[0].class.superclass == FilterTable::Table
|
|
265
|
+
if resource.respond_to?(:resource_skipped?) && resource.resource_skipped?
|
|
266
|
+
return rspec_skipped_block(arg, opts, resource.resource_exception_message)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
if resource.respond_to?(:resource_failed?) && resource.resource_failed?
|
|
270
|
+
return rspec_failed_block(arg, opts, resource.resource_exception_message)
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# If neither skipped nor failed then add the resource
|
|
274
|
+
add_resource(method_name, arg, opts, block)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def register_rule(rule)
|
|
278
|
+
Inspec::Log.debug "Registering rule #{rule}"
|
|
279
|
+
@rules << rule
|
|
280
|
+
checks = ::Inspec::Rule.prepare_checks(rule)
|
|
281
|
+
examples = checks.flat_map do |m, a, b|
|
|
282
|
+
get_check_example(m, a, b)
|
|
283
|
+
end.compact
|
|
284
|
+
|
|
285
|
+
examples.each { |e| @test_collector.add_test(e, rule) }
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def validate_attributes_file_readability!(target)
|
|
289
|
+
unless File.exist?(target)
|
|
290
|
+
raise Inspec::Exceptions::AttributesFileDoesNotExist,
|
|
291
|
+
"Cannot find attributes file '#{target}'. " \
|
|
292
|
+
'Check to make sure file exists.'
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
unless File.readable?(target)
|
|
296
|
+
raise Inspec::Exceptions::AttributesFileNotReadable,
|
|
297
|
+
"Cannot read attributes file '#{target}'. " \
|
|
298
|
+
'Check to make sure file is readable.'
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
true
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def rspec_skipped_block(arg, opts, message)
|
|
305
|
+
@test_collector.example_group(*arg, opts) do
|
|
306
|
+
# Send custom `it` block to RSpec
|
|
307
|
+
it message
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def rspec_failed_block(arg, opts, message)
|
|
312
|
+
@test_collector.example_group(*arg, opts) do
|
|
313
|
+
# Send custom `it` block to RSpec
|
|
314
|
+
it '' do
|
|
315
|
+
# Raising here to fail the test and get proper formatting
|
|
316
|
+
raise Inspec::Exceptions::ResourceFailed, message
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
def add_resource(method_name, arg, opts, block)
|
|
322
|
+
case method_name
|
|
323
|
+
when 'describe'
|
|
324
|
+
@test_collector.example_group(*arg, opts, &block)
|
|
325
|
+
when 'expect'
|
|
326
|
+
block.example_group
|
|
327
|
+
when 'describe.one'
|
|
328
|
+
tests = arg.map do |x|
|
|
329
|
+
@test_collector.example_group(x[1][0], block_source_info(x[2]), &x[2])
|
|
330
|
+
end
|
|
331
|
+
return nil if tests.empty?
|
|
332
|
+
|
|
333
|
+
successful_tests = tests.find_all(&:run)
|
|
334
|
+
|
|
335
|
+
# Return all tests if none succeeds; we will just report full failure
|
|
336
|
+
return tests if successful_tests.empty?
|
|
337
|
+
|
|
338
|
+
successful_tests
|
|
339
|
+
else
|
|
340
|
+
raise "A rule was registered with #{method_name.inspect}," \
|
|
341
|
+
"which isn't understood and cannot be processed."
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
end
|
|
345
|
+
end
|