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
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
|
-
# Copyright 2017, Christoph Hartmann
|
|
4
|
-
|
|
5
|
-
require_relative 'docker_object'
|
|
6
|
-
|
|
7
|
-
module Inspec::Resources
|
|
8
|
-
class DockerService < Inspec.resource(1)
|
|
9
|
-
include Inspec::Resources::DockerObject
|
|
10
|
-
|
|
11
|
-
name 'docker_service'
|
|
12
|
-
supports platform: 'unix'
|
|
13
|
-
desc 'Swarm-mode service'
|
|
14
|
-
example "
|
|
15
|
-
describe docker_service('service1') do
|
|
16
|
-
it { should exist }
|
|
17
|
-
its('id') { should_not eq '' }
|
|
18
|
-
its('image') { should eq 'alpine:latest' }
|
|
19
|
-
its('repo') { should eq 'alpine' }
|
|
20
|
-
its('tag') { should eq 'latest' }
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe docker_service(id: '4a415e366388') do
|
|
24
|
-
it { should exist }
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
describe docker_service(image: 'alpine:latest') do
|
|
28
|
-
it { should exist }
|
|
29
|
-
end
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
def initialize(opts = {})
|
|
33
|
-
# do sanitizion of input values
|
|
34
|
-
o = opts.dup
|
|
35
|
-
o = { name: opts } if opts.is_a?(String)
|
|
36
|
-
@opts = sanitize_options(o)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def name
|
|
40
|
-
object_info.names[0] if object_info.entries.size == 1
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def image
|
|
44
|
-
object_info.images[0] if object_info.entries.size == 1
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def image_name
|
|
48
|
-
parse_components_from_image(image)[:image_name] if object_info.entries.size == 1
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def repo
|
|
52
|
-
parse_components_from_image(image)[:repo] if object_info.entries.size == 1
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def tag
|
|
56
|
-
parse_components_from_image(image)[:tag] if object_info.entries.size == 1
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def mode
|
|
60
|
-
object_info.modes[0] if object_info.entries.size == 1
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def replicas
|
|
64
|
-
object_info.replicas[0] if object_info.entries.size == 1
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def ports
|
|
68
|
-
object_info.ports[0] if object_info.entries.size == 1
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def to_s
|
|
72
|
-
service = @opts[:name] || @opts[:id]
|
|
73
|
-
"Docker Service #{service}"
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
private
|
|
77
|
-
|
|
78
|
-
def sanitize_options(opts)
|
|
79
|
-
opts.merge(parse_components_from_image(opts[:image]))
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def object_info
|
|
83
|
-
return @info if defined?(@info)
|
|
84
|
-
opts = @opts
|
|
85
|
-
@info = inspec.docker.services.where {
|
|
86
|
-
name == opts[:name] || image == opts[:image] || (!id.nil? && !opts[:id].nil? && (id == opts[:id] || id.start_with?(opts[:id])))
|
|
87
|
-
}
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2017, Christoph Hartmann
|
|
4
|
+
|
|
5
|
+
require_relative 'docker_object'
|
|
6
|
+
|
|
7
|
+
module Inspec::Resources
|
|
8
|
+
class DockerService < Inspec.resource(1)
|
|
9
|
+
include Inspec::Resources::DockerObject
|
|
10
|
+
|
|
11
|
+
name 'docker_service'
|
|
12
|
+
supports platform: 'unix'
|
|
13
|
+
desc 'Swarm-mode service'
|
|
14
|
+
example "
|
|
15
|
+
describe docker_service('service1') do
|
|
16
|
+
it { should exist }
|
|
17
|
+
its('id') { should_not eq '' }
|
|
18
|
+
its('image') { should eq 'alpine:latest' }
|
|
19
|
+
its('repo') { should eq 'alpine' }
|
|
20
|
+
its('tag') { should eq 'latest' }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe docker_service(id: '4a415e366388') do
|
|
24
|
+
it { should exist }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe docker_service(image: 'alpine:latest') do
|
|
28
|
+
it { should exist }
|
|
29
|
+
end
|
|
30
|
+
"
|
|
31
|
+
|
|
32
|
+
def initialize(opts = {})
|
|
33
|
+
# do sanitizion of input values
|
|
34
|
+
o = opts.dup
|
|
35
|
+
o = { name: opts } if opts.is_a?(String)
|
|
36
|
+
@opts = sanitize_options(o)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def name
|
|
40
|
+
object_info.names[0] if object_info.entries.size == 1
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def image
|
|
44
|
+
object_info.images[0] if object_info.entries.size == 1
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def image_name
|
|
48
|
+
parse_components_from_image(image)[:image_name] if object_info.entries.size == 1
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def repo
|
|
52
|
+
parse_components_from_image(image)[:repo] if object_info.entries.size == 1
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def tag
|
|
56
|
+
parse_components_from_image(image)[:tag] if object_info.entries.size == 1
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def mode
|
|
60
|
+
object_info.modes[0] if object_info.entries.size == 1
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def replicas
|
|
64
|
+
object_info.replicas[0] if object_info.entries.size == 1
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def ports
|
|
68
|
+
object_info.ports[0] if object_info.entries.size == 1
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def to_s
|
|
72
|
+
service = @opts[:name] || @opts[:id]
|
|
73
|
+
"Docker Service #{service}"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
def sanitize_options(opts)
|
|
79
|
+
opts.merge(parse_components_from_image(opts[:image]))
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def object_info
|
|
83
|
+
return @info if defined?(@info)
|
|
84
|
+
opts = @opts
|
|
85
|
+
@info = inspec.docker.services.where {
|
|
86
|
+
name == opts[:name] || image == opts[:image] || (!id.nil? && !opts[:id].nil? && (id == opts[:id] || id.start_with?(opts[:id])))
|
|
87
|
+
}
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'utils/filter'
|
|
4
|
-
require 'hashie/mash'
|
|
5
|
-
require 'resources/package'
|
|
6
|
-
|
|
7
|
-
module Inspec::Resources
|
|
8
|
-
class Elasticsearch < Inspec.resource(1)
|
|
9
|
-
name 'elasticsearch'
|
|
10
|
-
supports platform: 'unix'
|
|
11
|
-
desc "Use the Elasticsearch InSpec audit resource to test the status of nodes in
|
|
12
|
-
an Elasticsearch cluster."
|
|
13
|
-
|
|
14
|
-
example "
|
|
15
|
-
describe elasticsearch('http://eshost.mycompany.biz:9200/', username: 'elastic', password: 'changeme', ssl_verify: false) do
|
|
16
|
-
its('node_count') { should >= 3 }
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
describe elasticsearch do
|
|
20
|
-
its('node_name') { should include 'node1' }
|
|
21
|
-
its('os') { should_not include 'MacOS' }
|
|
22
|
-
its('version') { should cmp > 1.2.0 }
|
|
23
|
-
end
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
filter = FilterTable.create
|
|
27
|
-
filter.add_accessor(:where)
|
|
28
|
-
.add_accessor(:entries)
|
|
29
|
-
.add(:cluster_name, field: 'cluster_name')
|
|
30
|
-
.add(:node_name, field: 'name')
|
|
31
|
-
.add(:transport_address, field: 'transport_address')
|
|
32
|
-
.add(:host, field: 'host')
|
|
33
|
-
.add(:ip, field: 'ip')
|
|
34
|
-
.add(:version, field: 'version')
|
|
35
|
-
.add(:build_hash, field: 'build_hash')
|
|
36
|
-
.add(:total_indexing_buffer, field: 'total_indexing_buffer')
|
|
37
|
-
.add(:roles, field: 'roles')
|
|
38
|
-
.add(:settings, field: 'settings')
|
|
39
|
-
.add(:os, field: 'os')
|
|
40
|
-
.add(:process, field: 'process')
|
|
41
|
-
.add(:jvm, field: 'jvm')
|
|
42
|
-
.add(:transport, field: 'transport')
|
|
43
|
-
.add(:http, field: 'http')
|
|
44
|
-
.add(:plugins, field: 'plugins')
|
|
45
|
-
.add(:plugin_list, field: 'plugin_list')
|
|
46
|
-
.add(:modules, field: 'modules')
|
|
47
|
-
.add(:module_list, field: 'module_list')
|
|
48
|
-
.add(:node_id, field: 'node_id')
|
|
49
|
-
.add(:ingest, field: 'ingest')
|
|
50
|
-
.add(:exists?) { |x| !x.entries.empty? }
|
|
51
|
-
.add(:node_count) { |t, _|
|
|
52
|
-
t.entries.length
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
filter.connect(self, :nodes)
|
|
56
|
-
|
|
57
|
-
attr_reader :nodes, :url
|
|
58
|
-
|
|
59
|
-
def initialize(opts = {})
|
|
60
|
-
return skip_resource 'Package `curl` not avaiable on the host' unless inspec.command('curl').exist?
|
|
61
|
-
|
|
62
|
-
@url = opts.fetch(:url, 'http://localhost:9200')
|
|
63
|
-
|
|
64
|
-
username = opts.fetch(:username, nil)
|
|
65
|
-
password = opts.fetch(:password, nil)
|
|
66
|
-
ssl_verify = opts.fetch(:ssl_verify, true)
|
|
67
|
-
|
|
68
|
-
cmd = inspec.command(curl_command_string(username, password, ssl_verify))
|
|
69
|
-
|
|
70
|
-
# after implementation of PR #2235, this begin..rescue won't be necessary.
|
|
71
|
-
# The checks in verify_curl_success! can raise their own skip message exception.
|
|
72
|
-
begin
|
|
73
|
-
verify_curl_success!(cmd)
|
|
74
|
-
rescue => e
|
|
75
|
-
return skip_resource e.message
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
begin
|
|
79
|
-
content = JSON.parse(cmd.stdout)
|
|
80
|
-
# after implementation of PR #2235, this can be broken out of the begin..rescue
|
|
81
|
-
# clause. The checks in verify_json_payload! can raise their own skip message exception.
|
|
82
|
-
verify_json_payload!(content)
|
|
83
|
-
rescue JSON::ParserError => e
|
|
84
|
-
return skip_resource "Couldn't parse the Elasticsearch response: #{e.message}"
|
|
85
|
-
rescue => e
|
|
86
|
-
return skip_resource e.message
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
@nodes = parse_cluster(content)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def to_s
|
|
93
|
-
"Elasticsearch Cluster #{url}"
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
private
|
|
97
|
-
|
|
98
|
-
def parse_cluster(content)
|
|
99
|
-
return [] unless content['nodes']
|
|
100
|
-
|
|
101
|
-
nodes = []
|
|
102
|
-
|
|
103
|
-
content['nodes'].each do |node_id, node_data|
|
|
104
|
-
node_data = fix_mash_key_collision(node_data)
|
|
105
|
-
|
|
106
|
-
node = Hashie::Mash.new(node_data)
|
|
107
|
-
node.node_id = node_id
|
|
108
|
-
node.plugin_list = node.plugins.map(&:name)
|
|
109
|
-
node.module_list = node.modules.map(&:name)
|
|
110
|
-
node.cluster_name = node.settings.cluster.name
|
|
111
|
-
nodes << node
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
nodes
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
#
|
|
118
|
-
# Hashie::Mash will throw warnings if the Mash contains a key that is the same as a built-in
|
|
119
|
-
# method on a Hashie::Mash instance. This is a crude way of avoiding those warnings without
|
|
120
|
-
# hard-coding a bunch of key renames.
|
|
121
|
-
#
|
|
122
|
-
# Any key that is in conflict will be renamed "es_ORIGINALKEY"
|
|
123
|
-
#
|
|
124
|
-
def fix_mash_key_collision(data)
|
|
125
|
-
test_mash = Hashie::Mash.new
|
|
126
|
-
|
|
127
|
-
new_data = {}
|
|
128
|
-
data.each do |key, value|
|
|
129
|
-
new_key = test_mash.respond_to?(key.to_sym) ? "es_#{key}" : key
|
|
130
|
-
new_value = value.is_a?(Hash) ? fix_mash_key_collision(value) : value
|
|
131
|
-
|
|
132
|
-
new_data[new_key] = new_value
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
new_data
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def curl_command_string(username, password, ssl_verify)
|
|
139
|
-
cmd_string = ['curl']
|
|
140
|
-
cmd_string << '-k' unless ssl_verify
|
|
141
|
-
cmd_string << "-H 'Content-Type: application/json'"
|
|
142
|
-
cmd_string << " -u #{username}:#{password}" unless username.nil? || password.nil?
|
|
143
|
-
cmd_string << URI.join(url, '_nodes')
|
|
144
|
-
|
|
145
|
-
cmd_string.join(' ')
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def verify_curl_success!(cmd)
|
|
149
|
-
# the following lines captures known possible curl command errors and provides compact skip resource messeges
|
|
150
|
-
if cmd.stderr =~ /Failed to connect/
|
|
151
|
-
raise "Connection refused - please check the URL #{url} for accuracy"
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
if cmd.stderr =~ /Peer's Certificate issuer is not recognized/
|
|
155
|
-
raise 'Connection refused - peer certificate issuer is not recognized'
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
raise "Error fetching Elastcsearch data from curl #{url}: #{cmd.stderr}" unless cmd.exit_status.zero?
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def verify_json_payload!(content)
|
|
162
|
-
unless content['error'].nil?
|
|
163
|
-
raise "#{content['error']['type']}: #{content['error']['reason']}"
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
raise 'No successful nodes available in cluster' if content['_nodes']['successful'].zero?
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'utils/filter'
|
|
4
|
+
require 'hashie/mash'
|
|
5
|
+
require 'resources/package'
|
|
6
|
+
|
|
7
|
+
module Inspec::Resources
|
|
8
|
+
class Elasticsearch < Inspec.resource(1)
|
|
9
|
+
name 'elasticsearch'
|
|
10
|
+
supports platform: 'unix'
|
|
11
|
+
desc "Use the Elasticsearch InSpec audit resource to test the status of nodes in
|
|
12
|
+
an Elasticsearch cluster."
|
|
13
|
+
|
|
14
|
+
example "
|
|
15
|
+
describe elasticsearch('http://eshost.mycompany.biz:9200/', username: 'elastic', password: 'changeme', ssl_verify: false) do
|
|
16
|
+
its('node_count') { should >= 3 }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe elasticsearch do
|
|
20
|
+
its('node_name') { should include 'node1' }
|
|
21
|
+
its('os') { should_not include 'MacOS' }
|
|
22
|
+
its('version') { should cmp > 1.2.0 }
|
|
23
|
+
end
|
|
24
|
+
"
|
|
25
|
+
|
|
26
|
+
filter = FilterTable.create
|
|
27
|
+
filter.add_accessor(:where)
|
|
28
|
+
.add_accessor(:entries)
|
|
29
|
+
.add(:cluster_name, field: 'cluster_name')
|
|
30
|
+
.add(:node_name, field: 'name')
|
|
31
|
+
.add(:transport_address, field: 'transport_address')
|
|
32
|
+
.add(:host, field: 'host')
|
|
33
|
+
.add(:ip, field: 'ip')
|
|
34
|
+
.add(:version, field: 'version')
|
|
35
|
+
.add(:build_hash, field: 'build_hash')
|
|
36
|
+
.add(:total_indexing_buffer, field: 'total_indexing_buffer')
|
|
37
|
+
.add(:roles, field: 'roles')
|
|
38
|
+
.add(:settings, field: 'settings')
|
|
39
|
+
.add(:os, field: 'os')
|
|
40
|
+
.add(:process, field: 'process')
|
|
41
|
+
.add(:jvm, field: 'jvm')
|
|
42
|
+
.add(:transport, field: 'transport')
|
|
43
|
+
.add(:http, field: 'http')
|
|
44
|
+
.add(:plugins, field: 'plugins')
|
|
45
|
+
.add(:plugin_list, field: 'plugin_list')
|
|
46
|
+
.add(:modules, field: 'modules')
|
|
47
|
+
.add(:module_list, field: 'module_list')
|
|
48
|
+
.add(:node_id, field: 'node_id')
|
|
49
|
+
.add(:ingest, field: 'ingest')
|
|
50
|
+
.add(:exists?) { |x| !x.entries.empty? }
|
|
51
|
+
.add(:node_count) { |t, _|
|
|
52
|
+
t.entries.length
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
filter.connect(self, :nodes)
|
|
56
|
+
|
|
57
|
+
attr_reader :nodes, :url
|
|
58
|
+
|
|
59
|
+
def initialize(opts = {})
|
|
60
|
+
return skip_resource 'Package `curl` not avaiable on the host' unless inspec.command('curl').exist?
|
|
61
|
+
|
|
62
|
+
@url = opts.fetch(:url, 'http://localhost:9200')
|
|
63
|
+
|
|
64
|
+
username = opts.fetch(:username, nil)
|
|
65
|
+
password = opts.fetch(:password, nil)
|
|
66
|
+
ssl_verify = opts.fetch(:ssl_verify, true)
|
|
67
|
+
|
|
68
|
+
cmd = inspec.command(curl_command_string(username, password, ssl_verify))
|
|
69
|
+
|
|
70
|
+
# after implementation of PR #2235, this begin..rescue won't be necessary.
|
|
71
|
+
# The checks in verify_curl_success! can raise their own skip message exception.
|
|
72
|
+
begin
|
|
73
|
+
verify_curl_success!(cmd)
|
|
74
|
+
rescue => e
|
|
75
|
+
return skip_resource e.message
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
begin
|
|
79
|
+
content = JSON.parse(cmd.stdout)
|
|
80
|
+
# after implementation of PR #2235, this can be broken out of the begin..rescue
|
|
81
|
+
# clause. The checks in verify_json_payload! can raise their own skip message exception.
|
|
82
|
+
verify_json_payload!(content)
|
|
83
|
+
rescue JSON::ParserError => e
|
|
84
|
+
return skip_resource "Couldn't parse the Elasticsearch response: #{e.message}"
|
|
85
|
+
rescue => e
|
|
86
|
+
return skip_resource e.message
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
@nodes = parse_cluster(content)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def to_s
|
|
93
|
+
"Elasticsearch Cluster #{url}"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
|
|
98
|
+
def parse_cluster(content)
|
|
99
|
+
return [] unless content['nodes']
|
|
100
|
+
|
|
101
|
+
nodes = []
|
|
102
|
+
|
|
103
|
+
content['nodes'].each do |node_id, node_data|
|
|
104
|
+
node_data = fix_mash_key_collision(node_data)
|
|
105
|
+
|
|
106
|
+
node = Hashie::Mash.new(node_data)
|
|
107
|
+
node.node_id = node_id
|
|
108
|
+
node.plugin_list = node.plugins.map(&:name)
|
|
109
|
+
node.module_list = node.modules.map(&:name)
|
|
110
|
+
node.cluster_name = node.settings.cluster.name
|
|
111
|
+
nodes << node
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
nodes
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
#
|
|
118
|
+
# Hashie::Mash will throw warnings if the Mash contains a key that is the same as a built-in
|
|
119
|
+
# method on a Hashie::Mash instance. This is a crude way of avoiding those warnings without
|
|
120
|
+
# hard-coding a bunch of key renames.
|
|
121
|
+
#
|
|
122
|
+
# Any key that is in conflict will be renamed "es_ORIGINALKEY"
|
|
123
|
+
#
|
|
124
|
+
def fix_mash_key_collision(data)
|
|
125
|
+
test_mash = Hashie::Mash.new
|
|
126
|
+
|
|
127
|
+
new_data = {}
|
|
128
|
+
data.each do |key, value|
|
|
129
|
+
new_key = test_mash.respond_to?(key.to_sym) ? "es_#{key}" : key
|
|
130
|
+
new_value = value.is_a?(Hash) ? fix_mash_key_collision(value) : value
|
|
131
|
+
|
|
132
|
+
new_data[new_key] = new_value
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
new_data
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def curl_command_string(username, password, ssl_verify)
|
|
139
|
+
cmd_string = ['curl']
|
|
140
|
+
cmd_string << '-k' unless ssl_verify
|
|
141
|
+
cmd_string << "-H 'Content-Type: application/json'"
|
|
142
|
+
cmd_string << " -u #{username}:#{password}" unless username.nil? || password.nil?
|
|
143
|
+
cmd_string << URI.join(url, '_nodes')
|
|
144
|
+
|
|
145
|
+
cmd_string.join(' ')
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def verify_curl_success!(cmd)
|
|
149
|
+
# the following lines captures known possible curl command errors and provides compact skip resource messeges
|
|
150
|
+
if cmd.stderr =~ /Failed to connect/
|
|
151
|
+
raise "Connection refused - please check the URL #{url} for accuracy"
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
if cmd.stderr =~ /Peer's Certificate issuer is not recognized/
|
|
155
|
+
raise 'Connection refused - peer certificate issuer is not recognized'
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
raise "Error fetching Elastcsearch data from curl #{url}: #{cmd.stderr}" unless cmd.exit_status.zero?
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def verify_json_payload!(content)
|
|
162
|
+
unless content['error'].nil?
|
|
163
|
+
raise "#{content['error']['type']}: #{content['error']['reason']}"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
raise 'No successful nodes available in cluster' if content['_nodes']['successful'].zero?
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|