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/resources/vbscript.rb
CHANGED
|
@@ -1,69 +1,68 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'securerandom'
|
|
4
|
-
|
|
5
|
-
module Inspec::Resources
|
|
6
|
-
# This resource allows users to run vbscript on windows machines. We decided
|
|
7
|
-
# not to use scriptcontrol, due to the fact that it works on 32 bit systems only:
|
|
8
|
-
# $script = new-object -comobject MSScriptControl.ScriptControl
|
|
9
|
-
# $script.language = "vbscript"
|
|
10
|
-
# $script.ExecuteStatement($Cmd)
|
|
11
|
-
#
|
|
12
|
-
# For that reason, we call csript.exe directy with the script. Vbscript is
|
|
13
|
-
# embedded in Powershell to ease the file transfer and reuse powershell
|
|
14
|
-
# encodedCommand since train does not allow file upload yet.
|
|
15
|
-
#
|
|
16
|
-
# We run cscript with /nologo option to get the expected output only with the
|
|
17
|
-
# version information.
|
|
18
|
-
#
|
|
19
|
-
# Since Windows does not delete tmp files automatically, we remove the VBScript
|
|
20
|
-
# after we executed it
|
|
21
|
-
# @see https://msdn.microsoft.com/en-us/library/aa364991.aspx
|
|
22
|
-
class VBScript < PowershellScript
|
|
23
|
-
name 'vbscript'
|
|
24
|
-
supports platform: 'windows'
|
|
25
|
-
desc ''
|
|
26
|
-
example "
|
|
27
|
-
script = <<-EOH
|
|
28
|
-
# you vbscript
|
|
29
|
-
EOH
|
|
30
|
-
|
|
31
|
-
describe vbscript(script) do
|
|
32
|
-
its('stdout') { should eq 'output' }
|
|
33
|
-
end
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
def initialize(vbscript)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
#{
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
$filename
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
res
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'securerandom'
|
|
4
|
+
|
|
5
|
+
module Inspec::Resources
|
|
6
|
+
# This resource allows users to run vbscript on windows machines. We decided
|
|
7
|
+
# not to use scriptcontrol, due to the fact that it works on 32 bit systems only:
|
|
8
|
+
# $script = new-object -comobject MSScriptControl.ScriptControl
|
|
9
|
+
# $script.language = "vbscript"
|
|
10
|
+
# $script.ExecuteStatement($Cmd)
|
|
11
|
+
#
|
|
12
|
+
# For that reason, we call csript.exe directy with the script. Vbscript is
|
|
13
|
+
# embedded in Powershell to ease the file transfer and reuse powershell
|
|
14
|
+
# encodedCommand since train does not allow file upload yet.
|
|
15
|
+
#
|
|
16
|
+
# We run cscript with /nologo option to get the expected output only with the
|
|
17
|
+
# version information.
|
|
18
|
+
#
|
|
19
|
+
# Since Windows does not delete tmp files automatically, we remove the VBScript
|
|
20
|
+
# after we executed it
|
|
21
|
+
# @see https://msdn.microsoft.com/en-us/library/aa364991.aspx
|
|
22
|
+
class VBScript < PowershellScript
|
|
23
|
+
name 'vbscript'
|
|
24
|
+
supports platform: 'windows'
|
|
25
|
+
desc ''
|
|
26
|
+
example "
|
|
27
|
+
script = <<-EOH
|
|
28
|
+
# you vbscript
|
|
29
|
+
EOH
|
|
30
|
+
|
|
31
|
+
describe vbscript(script) do
|
|
32
|
+
its('stdout') { should eq 'output' }
|
|
33
|
+
end
|
|
34
|
+
"
|
|
35
|
+
|
|
36
|
+
def initialize(vbscript)
|
|
37
|
+
@seperator = SecureRandom.uuid
|
|
38
|
+
cmd = <<~EOH
|
|
39
|
+
$vbscript = @"
|
|
40
|
+
#{vbscript}
|
|
41
|
+
Wscript.Stdout.Write "#{@seperator}"
|
|
42
|
+
"@
|
|
43
|
+
$filename = [System.IO.Path]::GetTempFileName() + ".vbs"
|
|
44
|
+
New-Item $filename -type file -force -value $vbscript | Out-Null
|
|
45
|
+
cscript.exe /nologo $filename
|
|
46
|
+
Remove-Item $filename | Out-Null
|
|
47
|
+
EOH
|
|
48
|
+
super(cmd)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def result
|
|
52
|
+
@result ||= parse_stdout
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def to_s
|
|
56
|
+
'Windows VBScript'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def parse_stdout
|
|
62
|
+
res = inspec.backend.run_command(@command)
|
|
63
|
+
parsed_result = res.stdout.gsub(/#{@seperator}\r\n$/, '')
|
|
64
|
+
res.stdout = parsed_result
|
|
65
|
+
res
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -1,247 +1,247 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'hashie/mash'
|
|
4
|
-
|
|
5
|
-
module Inspec::Resources
|
|
6
|
-
class Virtualization < Inspec.resource(1)
|
|
7
|
-
name 'virtualization'
|
|
8
|
-
supports platform: 'linux'
|
|
9
|
-
desc 'Use the virtualization InSpec audit resource to test the virtualization platform on which the system is running'
|
|
10
|
-
example "
|
|
11
|
-
describe virtualization do
|
|
12
|
-
its('system') { should eq 'docker' }
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
describe virtualization do
|
|
16
|
-
its('role') { should eq 'guest' }
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
control 'test' do
|
|
20
|
-
describe file('/var/tmp/foo') do
|
|
21
|
-
it { should be_file }
|
|
22
|
-
end
|
|
23
|
-
only_if { virtualization.system == 'docker' }
|
|
24
|
-
end
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
def initialize
|
|
28
|
-
@virtualization_data = Hashie::Mash.new
|
|
29
|
-
collect_data_linux
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# add helper methods for easy access of properties
|
|
33
|
-
# allows users to use virtualization.role, virtualization.system
|
|
34
|
-
%w{role system}.each do |property|
|
|
35
|
-
define_method(property.to_sym) do
|
|
36
|
-
@virtualization_data[property.to_sym]
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def params
|
|
41
|
-
collect_data_linux
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def to_s
|
|
45
|
-
'Virtualization Detection'
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
private
|
|
49
|
-
|
|
50
|
-
def lxc_version_exists?
|
|
51
|
-
inspec.command('lxc-version').exist?
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def docker_exists?
|
|
55
|
-
inspec.command('docker').exist?
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def nova_exists?
|
|
59
|
-
inspec.command('nova').exist?
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Detect Xen
|
|
63
|
-
# /proc/xen is an empty dir for EL6 + Linode Guests + Paravirt EC2 instances
|
|
64
|
-
# Notes:
|
|
65
|
-
# - cpuid of guests, if we could get it, would also be a clue
|
|
66
|
-
# - may be able to determine if under paravirt from /dev/xen/evtchn (See OHAI-253)
|
|
67
|
-
# - Additional edge cases likely should not change the above assumptions
|
|
68
|
-
# but rather be additive - btm
|
|
69
|
-
def detect_xen
|
|
70
|
-
return false unless inspec.file('/proc/xen').exist?
|
|
71
|
-
@virtualization_data[:system] = 'xen'
|
|
72
|
-
@virtualization_data[:role] = 'guest'
|
|
73
|
-
|
|
74
|
-
# This file should exist on most Xen systems, normally empty for guests
|
|
75
|
-
if inspec.file('/proc/xen/capabilities').exist? &&
|
|
76
|
-
inspec.file('/proc/xen/capabilities').content =~ /control_d/i # rubocop:disable Layout/MultilineOperationIndentation
|
|
77
|
-
@virtualization_data[:role] = 'host'
|
|
78
|
-
end
|
|
79
|
-
true
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Detect Virtualbox from kernel module
|
|
83
|
-
def detect_virtualbox
|
|
84
|
-
return false unless inspec.file('/proc/modules').exist?
|
|
85
|
-
modules = inspec.file('/proc/modules').content
|
|
86
|
-
if modules =~ /^vboxdrv/
|
|
87
|
-
Inspec::Log.debug('Plugin Virtualization: /proc/modules contains vboxdrv. Detecting as vbox host')
|
|
88
|
-
@virtualization_data[:system] = 'vbox'
|
|
89
|
-
@virtualization_data[:role] = 'host'
|
|
90
|
-
elsif modules =~ /^vboxguest/
|
|
91
|
-
Inspec::Log.debug('Plugin Virtualization: /proc/modules contains vboxguest. Detecting as vbox guest')
|
|
92
|
-
@virtualization_data[:system] = 'vbox'
|
|
93
|
-
@virtualization_data[:role] = 'guest'
|
|
94
|
-
else
|
|
95
|
-
return false
|
|
96
|
-
end
|
|
97
|
-
true
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# if nova binary is present we're on an openstack host
|
|
101
|
-
def detect_openstack
|
|
102
|
-
return false unless nova_exists?
|
|
103
|
-
@virtualization_data[:system] = 'openstack'
|
|
104
|
-
@virtualization_data[:role] = 'host'
|
|
105
|
-
true
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# Detect paravirt KVM/QEMU from cpuinfo, report as KVM
|
|
109
|
-
def detect_kvm_from_cpuinfo
|
|
110
|
-
return false unless inspec.file('/proc/cpuinfo').content =~ /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/
|
|
111
|
-
@virtualization_data[:system] = 'kvm'
|
|
112
|
-
@virtualization_data[:role] = 'guest'
|
|
113
|
-
true
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# Detect KVM systems via /sys
|
|
117
|
-
# guests will have the hypervisor cpu feature that hosts don't have
|
|
118
|
-
def detect_kvm_from_sys
|
|
119
|
-
return false unless inspec.file('/sys/devices/virtual/misc/kvm').exist?
|
|
120
|
-
@virtualization_data[:system] = 'kvm'
|
|
121
|
-
if inspec.file('/proc/cpuinfo').content =~ /hypervisor/
|
|
122
|
-
@virtualization_data[:role] = 'guest'
|
|
123
|
-
else
|
|
124
|
-
@virtualization_data[:role] = 'host'
|
|
125
|
-
end
|
|
126
|
-
true
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
# Detect OpenVZ / Virtuozzo.
|
|
130
|
-
# http://wiki.openvz.org/BC_proc_entries
|
|
131
|
-
def detect_openvz
|
|
132
|
-
if inspec.file('/proc/bc/0').exist?
|
|
133
|
-
@virtualization_data[:system] = 'openvz'
|
|
134
|
-
@virtualization_data[:role] = 'host'
|
|
135
|
-
elsif inspec.file('/proc/vz').exist?
|
|
136
|
-
@virtualization_data[:system] = 'openvz'
|
|
137
|
-
@virtualization_data[:role] = 'guest'
|
|
138
|
-
else
|
|
139
|
-
return false
|
|
140
|
-
end
|
|
141
|
-
true
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# Detect Parallels virtual machine from pci devices
|
|
145
|
-
def detect_parallels
|
|
146
|
-
return false unless inspec.file('/proc/bus/pci/devices').content =~ /1ab84000/
|
|
147
|
-
@virtualization_data[:system] = 'parallels'
|
|
148
|
-
@virtualization_data[:role] = 'guest'
|
|
149
|
-
true
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# Detect Linux-VServer
|
|
153
|
-
def detect_linux_vserver
|
|
154
|
-
return false unless inspec.file('/proc/self/status').exist?
|
|
155
|
-
proc_self_status = inspec.file('/proc/self/status').content
|
|
156
|
-
vxid = proc_self_status.match(/^(s_context|VxID):\s*(\d+)$/)
|
|
157
|
-
return false unless vxid && vxid[2]
|
|
158
|
-
@virtualization_data[:system] = 'linux-vserver'
|
|
159
|
-
if vxid[2] == '0'
|
|
160
|
-
@virtualization_data[:role] = 'host'
|
|
161
|
-
else
|
|
162
|
-
@virtualization_data[:role] = 'guest'
|
|
163
|
-
end
|
|
164
|
-
true
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# Detect LXC/Docker
|
|
168
|
-
#
|
|
169
|
-
# /proc/self/cgroup will look like this inside a docker container:
|
|
170
|
-
# <index #>:<subsystem>:/lxc/<hexadecimal container id>
|
|
171
|
-
#
|
|
172
|
-
# /proc/self/cgroup could have a name including alpha/digit/dashes
|
|
173
|
-
# <index #>:<subsystem>:/lxc/<named container id>
|
|
174
|
-
#
|
|
175
|
-
# /proc/self/cgroup could have a non-lxc cgroup name indicating other uses
|
|
176
|
-
# of cgroups. This is probably not LXC/Docker.
|
|
177
|
-
# <index #>:<subsystem>:/Charlie
|
|
178
|
-
#
|
|
179
|
-
# A host which supports cgroups, and has capacity to host lxc containers,
|
|
180
|
-
# will show the subsystems and root (/) namespace.
|
|
181
|
-
# <index #>:<subsystem>:/
|
|
182
|
-
#
|
|
183
|
-
# Full notes, https://tickets.opscode.com/browse/OHAI-551
|
|
184
|
-
# Kernel docs, https://www.kernel.org/doc/Documentation/cgroups
|
|
185
|
-
def detect_lxc_docker
|
|
186
|
-
return false unless inspec.file('/proc/self/cgroup').exist?
|
|
187
|
-
cgroup_content = inspec.file('/proc/self/cgroup').content
|
|
188
|
-
if cgroup_content =~ %r{^\d+:[^:]+:/(lxc|docker)/.+$} ||
|
|
189
|
-
cgroup_content =~ %r{^\d+:[^:]+:/[^/]+/(lxc|docker)-.+$} # rubocop:disable Layout/MultilineOperationIndentation
|
|
190
|
-
@virtualization_data[:system] = $1 # rubocop:disable Style/PerlBackrefs
|
|
191
|
-
@virtualization_data[:role] = 'guest'
|
|
192
|
-
elsif lxc_version_exists? && cgroup_content =~ %r{\d:[^:]+:/$}
|
|
193
|
-
# lxc-version shouldn't be installed by default
|
|
194
|
-
# Even so, it is likely we are on an LXC capable host that is not being used as such
|
|
195
|
-
# So we're cautious here to not overwrite other existing values (OHAI-573)
|
|
196
|
-
unless @virtualization_data[:system] && @virtualization_data[:role]
|
|
197
|
-
@virtualization_data[:system] = 'lxc'
|
|
198
|
-
@virtualization_data[:role] = 'host'
|
|
199
|
-
end
|
|
200
|
-
else
|
|
201
|
-
return false
|
|
202
|
-
end
|
|
203
|
-
true
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def detect_docker
|
|
207
|
-
return false unless inspec.file('/.dockerenv').exist? || inspec.file('/.dockerinit').exist?
|
|
208
|
-
@virtualization_data[:system] = 'docker'
|
|
209
|
-
@virtualization_data[:role] = 'guest'
|
|
210
|
-
true
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
# Detect LXD
|
|
214
|
-
# See https://github.com/lxc/lxd/blob/master/doc/dev-lxd.md
|
|
215
|
-
def detect_lxd
|
|
216
|
-
if inspec.file('/dev/lxd/sock').exist?
|
|
217
|
-
@virtualization_data[:system] = 'lxd'
|
|
218
|
-
@virtualization_data[:role] = 'guest'
|
|
219
|
-
elsif inspec.file('/var/lib/lxd/devlxd').exist?
|
|
220
|
-
@virtualization_data[:system] = 'lxd'
|
|
221
|
-
@virtualization_data[:role] = 'host'
|
|
222
|
-
else
|
|
223
|
-
return false
|
|
224
|
-
end
|
|
225
|
-
true
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
def collect_data_linux # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
|
229
|
-
# This avoids doing multiple detections in a single test
|
|
230
|
-
return unless @virtualization_data.empty?
|
|
231
|
-
|
|
232
|
-
# each detect method will return true if it matched and was successfully
|
|
233
|
-
# able to populate @virtualization_data with stuff.
|
|
234
|
-
return if detect_xen
|
|
235
|
-
return if detect_virtualbox
|
|
236
|
-
return if detect_openstack
|
|
237
|
-
return if detect_kvm_from_cpuinfo
|
|
238
|
-
return if detect_kvm_from_sys
|
|
239
|
-
return if detect_openvz
|
|
240
|
-
return if detect_parallels
|
|
241
|
-
return if detect_linux_vserver
|
|
242
|
-
return if detect_lxc_docker
|
|
243
|
-
return if detect_docker
|
|
244
|
-
return if detect_lxd
|
|
245
|
-
end
|
|
246
|
-
end
|
|
247
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'hashie/mash'
|
|
4
|
+
|
|
5
|
+
module Inspec::Resources
|
|
6
|
+
class Virtualization < Inspec.resource(1)
|
|
7
|
+
name 'virtualization'
|
|
8
|
+
supports platform: 'linux'
|
|
9
|
+
desc 'Use the virtualization InSpec audit resource to test the virtualization platform on which the system is running'
|
|
10
|
+
example "
|
|
11
|
+
describe virtualization do
|
|
12
|
+
its('system') { should eq 'docker' }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe virtualization do
|
|
16
|
+
its('role') { should eq 'guest' }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
control 'test' do
|
|
20
|
+
describe file('/var/tmp/foo') do
|
|
21
|
+
it { should be_file }
|
|
22
|
+
end
|
|
23
|
+
only_if { virtualization.system == 'docker' }
|
|
24
|
+
end
|
|
25
|
+
"
|
|
26
|
+
|
|
27
|
+
def initialize
|
|
28
|
+
@virtualization_data = Hashie::Mash.new
|
|
29
|
+
collect_data_linux
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# add helper methods for easy access of properties
|
|
33
|
+
# allows users to use virtualization.role, virtualization.system
|
|
34
|
+
%w{role system}.each do |property|
|
|
35
|
+
define_method(property.to_sym) do
|
|
36
|
+
@virtualization_data[property.to_sym]
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def params
|
|
41
|
+
collect_data_linux
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def to_s
|
|
45
|
+
'Virtualization Detection'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def lxc_version_exists?
|
|
51
|
+
inspec.command('lxc-version').exist?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def docker_exists?
|
|
55
|
+
inspec.command('docker').exist?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def nova_exists?
|
|
59
|
+
inspec.command('nova').exist?
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Detect Xen
|
|
63
|
+
# /proc/xen is an empty dir for EL6 + Linode Guests + Paravirt EC2 instances
|
|
64
|
+
# Notes:
|
|
65
|
+
# - cpuid of guests, if we could get it, would also be a clue
|
|
66
|
+
# - may be able to determine if under paravirt from /dev/xen/evtchn (See OHAI-253)
|
|
67
|
+
# - Additional edge cases likely should not change the above assumptions
|
|
68
|
+
# but rather be additive - btm
|
|
69
|
+
def detect_xen
|
|
70
|
+
return false unless inspec.file('/proc/xen').exist?
|
|
71
|
+
@virtualization_data[:system] = 'xen'
|
|
72
|
+
@virtualization_data[:role] = 'guest'
|
|
73
|
+
|
|
74
|
+
# This file should exist on most Xen systems, normally empty for guests
|
|
75
|
+
if inspec.file('/proc/xen/capabilities').exist? &&
|
|
76
|
+
inspec.file('/proc/xen/capabilities').content =~ /control_d/i # rubocop:disable Layout/MultilineOperationIndentation
|
|
77
|
+
@virtualization_data[:role] = 'host'
|
|
78
|
+
end
|
|
79
|
+
true
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Detect Virtualbox from kernel module
|
|
83
|
+
def detect_virtualbox
|
|
84
|
+
return false unless inspec.file('/proc/modules').exist?
|
|
85
|
+
modules = inspec.file('/proc/modules').content
|
|
86
|
+
if modules =~ /^vboxdrv/
|
|
87
|
+
Inspec::Log.debug('Plugin Virtualization: /proc/modules contains vboxdrv. Detecting as vbox host')
|
|
88
|
+
@virtualization_data[:system] = 'vbox'
|
|
89
|
+
@virtualization_data[:role] = 'host'
|
|
90
|
+
elsif modules =~ /^vboxguest/
|
|
91
|
+
Inspec::Log.debug('Plugin Virtualization: /proc/modules contains vboxguest. Detecting as vbox guest')
|
|
92
|
+
@virtualization_data[:system] = 'vbox'
|
|
93
|
+
@virtualization_data[:role] = 'guest'
|
|
94
|
+
else
|
|
95
|
+
return false
|
|
96
|
+
end
|
|
97
|
+
true
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# if nova binary is present we're on an openstack host
|
|
101
|
+
def detect_openstack
|
|
102
|
+
return false unless nova_exists?
|
|
103
|
+
@virtualization_data[:system] = 'openstack'
|
|
104
|
+
@virtualization_data[:role] = 'host'
|
|
105
|
+
true
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Detect paravirt KVM/QEMU from cpuinfo, report as KVM
|
|
109
|
+
def detect_kvm_from_cpuinfo
|
|
110
|
+
return false unless inspec.file('/proc/cpuinfo').content =~ /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/
|
|
111
|
+
@virtualization_data[:system] = 'kvm'
|
|
112
|
+
@virtualization_data[:role] = 'guest'
|
|
113
|
+
true
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Detect KVM systems via /sys
|
|
117
|
+
# guests will have the hypervisor cpu feature that hosts don't have
|
|
118
|
+
def detect_kvm_from_sys
|
|
119
|
+
return false unless inspec.file('/sys/devices/virtual/misc/kvm').exist?
|
|
120
|
+
@virtualization_data[:system] = 'kvm'
|
|
121
|
+
if inspec.file('/proc/cpuinfo').content =~ /hypervisor/
|
|
122
|
+
@virtualization_data[:role] = 'guest'
|
|
123
|
+
else
|
|
124
|
+
@virtualization_data[:role] = 'host'
|
|
125
|
+
end
|
|
126
|
+
true
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Detect OpenVZ / Virtuozzo.
|
|
130
|
+
# http://wiki.openvz.org/BC_proc_entries
|
|
131
|
+
def detect_openvz
|
|
132
|
+
if inspec.file('/proc/bc/0').exist?
|
|
133
|
+
@virtualization_data[:system] = 'openvz'
|
|
134
|
+
@virtualization_data[:role] = 'host'
|
|
135
|
+
elsif inspec.file('/proc/vz').exist?
|
|
136
|
+
@virtualization_data[:system] = 'openvz'
|
|
137
|
+
@virtualization_data[:role] = 'guest'
|
|
138
|
+
else
|
|
139
|
+
return false
|
|
140
|
+
end
|
|
141
|
+
true
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Detect Parallels virtual machine from pci devices
|
|
145
|
+
def detect_parallels
|
|
146
|
+
return false unless inspec.file('/proc/bus/pci/devices').content =~ /1ab84000/
|
|
147
|
+
@virtualization_data[:system] = 'parallels'
|
|
148
|
+
@virtualization_data[:role] = 'guest'
|
|
149
|
+
true
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Detect Linux-VServer
|
|
153
|
+
def detect_linux_vserver
|
|
154
|
+
return false unless inspec.file('/proc/self/status').exist?
|
|
155
|
+
proc_self_status = inspec.file('/proc/self/status').content
|
|
156
|
+
vxid = proc_self_status.match(/^(s_context|VxID):\s*(\d+)$/)
|
|
157
|
+
return false unless vxid && vxid[2]
|
|
158
|
+
@virtualization_data[:system] = 'linux-vserver'
|
|
159
|
+
if vxid[2] == '0'
|
|
160
|
+
@virtualization_data[:role] = 'host'
|
|
161
|
+
else
|
|
162
|
+
@virtualization_data[:role] = 'guest'
|
|
163
|
+
end
|
|
164
|
+
true
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Detect LXC/Docker
|
|
168
|
+
#
|
|
169
|
+
# /proc/self/cgroup will look like this inside a docker container:
|
|
170
|
+
# <index #>:<subsystem>:/lxc/<hexadecimal container id>
|
|
171
|
+
#
|
|
172
|
+
# /proc/self/cgroup could have a name including alpha/digit/dashes
|
|
173
|
+
# <index #>:<subsystem>:/lxc/<named container id>
|
|
174
|
+
#
|
|
175
|
+
# /proc/self/cgroup could have a non-lxc cgroup name indicating other uses
|
|
176
|
+
# of cgroups. This is probably not LXC/Docker.
|
|
177
|
+
# <index #>:<subsystem>:/Charlie
|
|
178
|
+
#
|
|
179
|
+
# A host which supports cgroups, and has capacity to host lxc containers,
|
|
180
|
+
# will show the subsystems and root (/) namespace.
|
|
181
|
+
# <index #>:<subsystem>:/
|
|
182
|
+
#
|
|
183
|
+
# Full notes, https://tickets.opscode.com/browse/OHAI-551
|
|
184
|
+
# Kernel docs, https://www.kernel.org/doc/Documentation/cgroups
|
|
185
|
+
def detect_lxc_docker
|
|
186
|
+
return false unless inspec.file('/proc/self/cgroup').exist?
|
|
187
|
+
cgroup_content = inspec.file('/proc/self/cgroup').content
|
|
188
|
+
if cgroup_content =~ %r{^\d+:[^:]+:/(lxc|docker)/.+$} ||
|
|
189
|
+
cgroup_content =~ %r{^\d+:[^:]+:/[^/]+/(lxc|docker)-.+$} # rubocop:disable Layout/MultilineOperationIndentation
|
|
190
|
+
@virtualization_data[:system] = $1 # rubocop:disable Style/PerlBackrefs
|
|
191
|
+
@virtualization_data[:role] = 'guest'
|
|
192
|
+
elsif lxc_version_exists? && cgroup_content =~ %r{\d:[^:]+:/$}
|
|
193
|
+
# lxc-version shouldn't be installed by default
|
|
194
|
+
# Even so, it is likely we are on an LXC capable host that is not being used as such
|
|
195
|
+
# So we're cautious here to not overwrite other existing values (OHAI-573)
|
|
196
|
+
unless @virtualization_data[:system] && @virtualization_data[:role]
|
|
197
|
+
@virtualization_data[:system] = 'lxc'
|
|
198
|
+
@virtualization_data[:role] = 'host'
|
|
199
|
+
end
|
|
200
|
+
else
|
|
201
|
+
return false
|
|
202
|
+
end
|
|
203
|
+
true
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def detect_docker
|
|
207
|
+
return false unless inspec.file('/.dockerenv').exist? || inspec.file('/.dockerinit').exist?
|
|
208
|
+
@virtualization_data[:system] = 'docker'
|
|
209
|
+
@virtualization_data[:role] = 'guest'
|
|
210
|
+
true
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Detect LXD
|
|
214
|
+
# See https://github.com/lxc/lxd/blob/master/doc/dev-lxd.md
|
|
215
|
+
def detect_lxd
|
|
216
|
+
if inspec.file('/dev/lxd/sock').exist?
|
|
217
|
+
@virtualization_data[:system] = 'lxd'
|
|
218
|
+
@virtualization_data[:role] = 'guest'
|
|
219
|
+
elsif inspec.file('/var/lib/lxd/devlxd').exist?
|
|
220
|
+
@virtualization_data[:system] = 'lxd'
|
|
221
|
+
@virtualization_data[:role] = 'host'
|
|
222
|
+
else
|
|
223
|
+
return false
|
|
224
|
+
end
|
|
225
|
+
true
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def collect_data_linux # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
|
229
|
+
# This avoids doing multiple detections in a single test
|
|
230
|
+
return unless @virtualization_data.empty?
|
|
231
|
+
|
|
232
|
+
# each detect method will return true if it matched and was successfully
|
|
233
|
+
# able to populate @virtualization_data with stuff.
|
|
234
|
+
return if detect_xen
|
|
235
|
+
return if detect_virtualbox
|
|
236
|
+
return if detect_openstack
|
|
237
|
+
return if detect_kvm_from_cpuinfo
|
|
238
|
+
return if detect_kvm_from_sys
|
|
239
|
+
return if detect_openvz
|
|
240
|
+
return if detect_parallels
|
|
241
|
+
return if detect_linux_vserver
|
|
242
|
+
return if detect_lxc_docker
|
|
243
|
+
return if detect_docker
|
|
244
|
+
return if detect_lxd
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|