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,84 +1,84 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
# check for a Windows feature
|
|
4
|
-
# Usage:
|
|
5
|
-
# describe windows_feature('DHCP Server') do
|
|
6
|
-
# it{ should be_installed }
|
|
7
|
-
# end
|
|
8
|
-
#
|
|
9
|
-
# deprecated serverspec syntax:
|
|
10
|
-
# describe windows_feature('IIS-Webserver') do
|
|
11
|
-
# it{ should be_installed.by("dism") }
|
|
12
|
-
# end
|
|
13
|
-
#
|
|
14
|
-
# describe windows_feature('Web-Webserver') do
|
|
15
|
-
# it{ should be_installed.by("powershell") }
|
|
16
|
-
# end
|
|
17
|
-
#
|
|
18
|
-
# This implementation uses the Get-WindowsFeature commandlet:
|
|
19
|
-
# Get-WindowsFeature | Where-Object {$_.Name -eq 'XPS Viewer' -or $_.DisplayName -eq 'XPS Viewe
|
|
20
|
-
# r'} | Select-Object -Property Name,DisplayName,Description,Installed,InstallState | ConvertTo-Json
|
|
21
|
-
# {
|
|
22
|
-
# "Name": "XPS-Viewer",
|
|
23
|
-
# "DisplayName": "XPS Viewer",
|
|
24
|
-
# "Description": "The XPS Viewer is used to read, set permissions for, and digitally sign XPS documents.",
|
|
25
|
-
# "Installed": false,
|
|
26
|
-
# "InstallState": 0
|
|
27
|
-
# }
|
|
28
|
-
module Inspec::Resources
|
|
29
|
-
class WindowsFeature < Inspec.resource(1)
|
|
30
|
-
name 'windows_feature'
|
|
31
|
-
supports platform: 'windows'
|
|
32
|
-
desc 'Use the windows_feature InSpec audit resource to test features on Microsoft Windows.'
|
|
33
|
-
example "
|
|
34
|
-
describe windows_feature('dhcp') do
|
|
35
|
-
it { should be_installed }
|
|
36
|
-
end
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
def initialize(feature)
|
|
40
|
-
@feature = feature
|
|
41
|
-
@cache = nil
|
|
42
|
-
|
|
43
|
-
# verify that this resource is only supported on Windows
|
|
44
|
-
return skip_resource 'The `windows_feature` resource is not supported on your OS.' if !inspec.os.windows?
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# returns true if the package is installed
|
|
48
|
-
def installed?(_provider = nil, _version = nil)
|
|
49
|
-
info[:installed] == true
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# returns the package description
|
|
53
|
-
def info
|
|
54
|
-
return @cache if !@cache.nil?
|
|
55
|
-
features_cmd = "Get-WindowsFeature | Where-Object {$_.Name -eq '#{@feature}' -or $_.DisplayName -eq '#{@feature}'} | Select-Object -Property Name,DisplayName,Description,Installed,InstallState | ConvertTo-Json"
|
|
56
|
-
cmd = inspec.command(features_cmd)
|
|
57
|
-
|
|
58
|
-
@cache = {
|
|
59
|
-
name: @feature,
|
|
60
|
-
type: 'windows-feature',
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
# cannot rely on exit code for now, successful command returns exit code 1
|
|
64
|
-
# return nil if cmd.exit_status != 0
|
|
65
|
-
# try to parse json
|
|
66
|
-
begin
|
|
67
|
-
params = JSON.parse(cmd.stdout)
|
|
68
|
-
rescue JSON::ParserError => _e
|
|
69
|
-
return @cache
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
@cache = {
|
|
73
|
-
name: params['Name'],
|
|
74
|
-
description: params['Description'],
|
|
75
|
-
installed: params['Installed'],
|
|
76
|
-
type: 'windows-feature',
|
|
77
|
-
}
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def to_s
|
|
81
|
-
"Windows Feature '#{@feature}'"
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
# check for a Windows feature
|
|
4
|
+
# Usage:
|
|
5
|
+
# describe windows_feature('DHCP Server') do
|
|
6
|
+
# it{ should be_installed }
|
|
7
|
+
# end
|
|
8
|
+
#
|
|
9
|
+
# deprecated serverspec syntax:
|
|
10
|
+
# describe windows_feature('IIS-Webserver') do
|
|
11
|
+
# it{ should be_installed.by("dism") }
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# describe windows_feature('Web-Webserver') do
|
|
15
|
+
# it{ should be_installed.by("powershell") }
|
|
16
|
+
# end
|
|
17
|
+
#
|
|
18
|
+
# This implementation uses the Get-WindowsFeature commandlet:
|
|
19
|
+
# Get-WindowsFeature | Where-Object {$_.Name -eq 'XPS Viewer' -or $_.DisplayName -eq 'XPS Viewe
|
|
20
|
+
# r'} | Select-Object -Property Name,DisplayName,Description,Installed,InstallState | ConvertTo-Json
|
|
21
|
+
# {
|
|
22
|
+
# "Name": "XPS-Viewer",
|
|
23
|
+
# "DisplayName": "XPS Viewer",
|
|
24
|
+
# "Description": "The XPS Viewer is used to read, set permissions for, and digitally sign XPS documents.",
|
|
25
|
+
# "Installed": false,
|
|
26
|
+
# "InstallState": 0
|
|
27
|
+
# }
|
|
28
|
+
module Inspec::Resources
|
|
29
|
+
class WindowsFeature < Inspec.resource(1)
|
|
30
|
+
name 'windows_feature'
|
|
31
|
+
supports platform: 'windows'
|
|
32
|
+
desc 'Use the windows_feature InSpec audit resource to test features on Microsoft Windows.'
|
|
33
|
+
example "
|
|
34
|
+
describe windows_feature('dhcp') do
|
|
35
|
+
it { should be_installed }
|
|
36
|
+
end
|
|
37
|
+
"
|
|
38
|
+
|
|
39
|
+
def initialize(feature)
|
|
40
|
+
@feature = feature
|
|
41
|
+
@cache = nil
|
|
42
|
+
|
|
43
|
+
# verify that this resource is only supported on Windows
|
|
44
|
+
return skip_resource 'The `windows_feature` resource is not supported on your OS.' if !inspec.os.windows?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# returns true if the package is installed
|
|
48
|
+
def installed?(_provider = nil, _version = nil)
|
|
49
|
+
info[:installed] == true
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# returns the package description
|
|
53
|
+
def info
|
|
54
|
+
return @cache if !@cache.nil?
|
|
55
|
+
features_cmd = "Get-WindowsFeature | Where-Object {$_.Name -eq '#{@feature}' -or $_.DisplayName -eq '#{@feature}'} | Select-Object -Property Name,DisplayName,Description,Installed,InstallState | ConvertTo-Json"
|
|
56
|
+
cmd = inspec.command(features_cmd)
|
|
57
|
+
|
|
58
|
+
@cache = {
|
|
59
|
+
name: @feature,
|
|
60
|
+
type: 'windows-feature',
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
# cannot rely on exit code for now, successful command returns exit code 1
|
|
64
|
+
# return nil if cmd.exit_status != 0
|
|
65
|
+
# try to parse json
|
|
66
|
+
begin
|
|
67
|
+
params = JSON.parse(cmd.stdout)
|
|
68
|
+
rescue JSON::ParserError => _e
|
|
69
|
+
return @cache
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
@cache = {
|
|
73
|
+
name: params['Name'],
|
|
74
|
+
description: params['Description'],
|
|
75
|
+
installed: params['Installed'],
|
|
76
|
+
type: 'windows-feature',
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def to_s
|
|
81
|
+
"Windows Feature '#{@feature}'"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Inspec::Resources
|
|
4
|
-
class WindowsHotfix < Inspec.resource(1)
|
|
5
|
-
name 'windows_hotfix'
|
|
6
|
-
supports platform: 'windows'
|
|
7
|
-
desc 'Use the windows_hotfix InSpec audit resource to test if the hotfix has been installed on the Windows system.'
|
|
8
|
-
example "
|
|
9
|
-
describe windows_hotfix('KB4012212') do
|
|
10
|
-
it { should be_installed }
|
|
11
|
-
end
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
attr_accessor :content
|
|
15
|
-
|
|
16
|
-
def initialize(hotfix_id = nil)
|
|
17
|
-
@id = hotfix_id.upcase
|
|
18
|
-
@content = nil
|
|
19
|
-
os = inspec.os
|
|
20
|
-
return skip_resource 'The `windows_hotfix` resource is not a feature of your OS.' unless os.windows?
|
|
21
|
-
query = "get-hotfix -id #{@id}"
|
|
22
|
-
cmd = inspec.powershell(query)
|
|
23
|
-
@content = cmd.stdout
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def to_s
|
|
27
|
-
"Windows Hotfix #{@id}"
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def installed?
|
|
31
|
-
return false if @content.nil?
|
|
32
|
-
@content.include?(@id)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Inspec::Resources
|
|
4
|
+
class WindowsHotfix < Inspec.resource(1)
|
|
5
|
+
name 'windows_hotfix'
|
|
6
|
+
supports platform: 'windows'
|
|
7
|
+
desc 'Use the windows_hotfix InSpec audit resource to test if the hotfix has been installed on the Windows system.'
|
|
8
|
+
example "
|
|
9
|
+
describe windows_hotfix('KB4012212') do
|
|
10
|
+
it { should be_installed }
|
|
11
|
+
end
|
|
12
|
+
"
|
|
13
|
+
|
|
14
|
+
attr_accessor :content
|
|
15
|
+
|
|
16
|
+
def initialize(hotfix_id = nil)
|
|
17
|
+
@id = hotfix_id.upcase
|
|
18
|
+
@content = nil
|
|
19
|
+
os = inspec.os
|
|
20
|
+
return skip_resource 'The `windows_hotfix` resource is not a feature of your OS.' unless os.windows?
|
|
21
|
+
query = "get-hotfix -id #{@id}"
|
|
22
|
+
cmd = inspec.powershell(query)
|
|
23
|
+
@content = cmd.stdout
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_s
|
|
27
|
+
"Windows Hotfix #{@id}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def installed?
|
|
31
|
+
return false if @content.nil?
|
|
32
|
+
@content.include?(@id)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -1,105 +1,102 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Inspec::Resources
|
|
3
|
-
class WindowsTasks < Inspec.resource(1)
|
|
4
|
-
name 'windows_task'
|
|
5
|
-
supports platform: 'windows'
|
|
6
|
-
desc 'Use the windows_task InSpec audit resource to test task schedules on Microsoft Windows.'
|
|
7
|
-
example "
|
|
8
|
-
describe windows_task('\\Microsoft\\Windows\\Time Synchronization\\SynchronizeTime') do
|
|
9
|
-
it { should be_enabled }
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
describe windows_task('\\Microsoft\\Windows\\AppID\\PolicyConverter') do
|
|
13
|
-
it { should be_disabled }
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
describe windows_task('\\Microsoft\\Windows\\Defrag\\ScheduledDefrag') do
|
|
17
|
-
it { should exist }
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
describe windows_task('\\Microsoft\\Windows\\AppID\\PolicyConverter') do
|
|
21
|
-
its('logon_mode') { should eq 'Interactive/Background' }
|
|
22
|
-
its('last_result') { should eq '1' }
|
|
23
|
-
its('task_to_run') { should cmp '%Windir%\\system32\\appidpolicyconverter.exe' }
|
|
24
|
-
its('run_as_user') { should eq 'LOCAL SERVICE' }
|
|
25
|
-
end
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
def initialize(taskuri)
|
|
29
|
-
@taskuri = taskuri
|
|
30
|
-
@cache = nil
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
#
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Inspec::Resources
|
|
3
|
+
class WindowsTasks < Inspec.resource(1)
|
|
4
|
+
name 'windows_task'
|
|
5
|
+
supports platform: 'windows'
|
|
6
|
+
desc 'Use the windows_task InSpec audit resource to test task schedules on Microsoft Windows.'
|
|
7
|
+
example "
|
|
8
|
+
describe windows_task('\\Microsoft\\Windows\\Time Synchronization\\SynchronizeTime') do
|
|
9
|
+
it { should be_enabled }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe windows_task('\\Microsoft\\Windows\\AppID\\PolicyConverter') do
|
|
13
|
+
it { should be_disabled }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe windows_task('\\Microsoft\\Windows\\Defrag\\ScheduledDefrag') do
|
|
17
|
+
it { should exist }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe windows_task('\\Microsoft\\Windows\\AppID\\PolicyConverter') do
|
|
21
|
+
its('logon_mode') { should eq 'Interactive/Background' }
|
|
22
|
+
its('last_result') { should eq '1' }
|
|
23
|
+
its('task_to_run') { should cmp '%Windir%\\system32\\appidpolicyconverter.exe' }
|
|
24
|
+
its('run_as_user') { should eq 'LOCAL SERVICE' }
|
|
25
|
+
end
|
|
26
|
+
"
|
|
27
|
+
|
|
28
|
+
def initialize(taskuri)
|
|
29
|
+
@taskuri = taskuri
|
|
30
|
+
@cache = nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def exists?
|
|
34
|
+
return true unless info.nil? || info[:uri].nil?
|
|
35
|
+
false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# rubocop:disable Style/WordArray
|
|
39
|
+
def enabled?
|
|
40
|
+
return false if info.nil? || info[:state].nil?
|
|
41
|
+
['Ready', 'Running'].include?(info[:state])
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def disabled?
|
|
45
|
+
return false if info.nil? || info[:state].nil?
|
|
46
|
+
info[:scheduled_task_state] == 'Disabled' || info[:state] == 'Disabled'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def logon_mode
|
|
50
|
+
info[:logon_mode]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def last_result
|
|
54
|
+
info[:last_result]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def task_to_run
|
|
58
|
+
info[:task_to_run].to_s.strip
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def run_as_user
|
|
62
|
+
info[:run_as_user]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def type
|
|
66
|
+
info[:type] unless info.nil?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def info
|
|
70
|
+
return @cache unless @cache.nil?
|
|
71
|
+
# PowerShell v5 has Get-ScheduledTask cmdlet,
|
|
72
|
+
# _using something with backward support to v3_
|
|
73
|
+
# script = "Get-ScheduledTask | ? { $_.URI -eq '#{@taskuri}' } | Select-Object URI,@{N='State';E={$_.State.ToString()}} | ConvertTo-Json"
|
|
74
|
+
|
|
75
|
+
# Using schtasks as suggested by @modille but aligning property names to match cmdlet to future proof.
|
|
76
|
+
script = "schtasks /query /v /fo csv /tn '#{@taskuri}' | ConvertFrom-Csv | Select @{N='URI';E={$_.TaskName}},@{N='State';E={$_.Status.ToString()}},'Logon Mode','Last Result','Task To Run','Run As User','Scheduled Task State' | ConvertTo-Json -Compress"
|
|
77
|
+
|
|
78
|
+
cmd = inspec.powershell(script)
|
|
79
|
+
|
|
80
|
+
begin
|
|
81
|
+
params = JSON.parse(cmd.stdout)
|
|
82
|
+
rescue JSON::ParserError => _e
|
|
83
|
+
return nil
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
@cache = {
|
|
87
|
+
uri: params['URI'],
|
|
88
|
+
state: params['State'],
|
|
89
|
+
logon_mode: params['Logon Mode'],
|
|
90
|
+
last_result: params['Last Result'],
|
|
91
|
+
task_to_run: params['Task To Run'],
|
|
92
|
+
run_as_user: params['Run As User'],
|
|
93
|
+
scheduled_task_state: params['Scheduled Task State'],
|
|
94
|
+
type: 'windows-task',
|
|
95
|
+
}
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def to_s
|
|
99
|
+
"Windows Task '#{@taskuri}'"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
data/lib/resources/wmi.rb
CHANGED
|
@@ -1,113 +1,110 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'utils/object_traversal'
|
|
4
|
-
|
|
5
|
-
module Inspec::Resources
|
|
6
|
-
# This resource simplifies the access to wmi
|
|
7
|
-
# on CLI you would use:
|
|
8
|
-
# WMIC /NAMESPACE:\\root\rsop\computer PATH RSOP_SecuritySettingNumeric WHERE "KeyName = 'MinimumPasswordAge' And precedence=1" GET Setting
|
|
9
|
-
# We use Get-WmiObject via Powershell to retrieve all values.
|
|
10
|
-
class WMI < Inspec.resource(1)
|
|
11
|
-
name 'wmi'
|
|
12
|
-
supports platform: 'windows'
|
|
13
|
-
desc 'request wmi information'
|
|
14
|
-
example "
|
|
15
|
-
describe wmi({
|
|
16
|
-
class: 'RSOP_SecuritySettingNumeric',
|
|
17
|
-
namespace: 'root\\rsop\\computer',
|
|
18
|
-
filter: 'KeyName = \'MinimumPasswordAge\' And precedence=1'
|
|
19
|
-
}) do
|
|
20
|
-
its('Setting') { should eq true }
|
|
21
|
-
end
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
include ObjectTraverser
|
|
25
|
-
attr_accessor :content
|
|
26
|
-
|
|
27
|
-
def initialize(wmiclass = nil, opts = nil)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@options
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
#
|
|
45
|
-
keys.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
@content
|
|
60
|
-
|
|
61
|
-
#
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
$
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
@content =
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'utils/object_traversal'
|
|
4
|
+
|
|
5
|
+
module Inspec::Resources
|
|
6
|
+
# This resource simplifies the access to wmi
|
|
7
|
+
# on CLI you would use:
|
|
8
|
+
# WMIC /NAMESPACE:\\root\rsop\computer PATH RSOP_SecuritySettingNumeric WHERE "KeyName = 'MinimumPasswordAge' And precedence=1" GET Setting
|
|
9
|
+
# We use Get-WmiObject via Powershell to retrieve all values.
|
|
10
|
+
class WMI < Inspec.resource(1)
|
|
11
|
+
name 'wmi'
|
|
12
|
+
supports platform: 'windows'
|
|
13
|
+
desc 'request wmi information'
|
|
14
|
+
example "
|
|
15
|
+
describe wmi({
|
|
16
|
+
class: 'RSOP_SecuritySettingNumeric',
|
|
17
|
+
namespace: 'root\\rsop\\computer',
|
|
18
|
+
filter: 'KeyName = \'MinimumPasswordAge\' And precedence=1'
|
|
19
|
+
}) do
|
|
20
|
+
its('Setting') { should eq true }
|
|
21
|
+
end
|
|
22
|
+
"
|
|
23
|
+
|
|
24
|
+
include ObjectTraverser
|
|
25
|
+
attr_accessor :content
|
|
26
|
+
|
|
27
|
+
def initialize(wmiclass = nil, opts = nil)
|
|
28
|
+
@options = opts || {}
|
|
29
|
+
# if wmiclass is not a hash, we have to handle deprecation behavior
|
|
30
|
+
if wmiclass.is_a?(Hash)
|
|
31
|
+
@options.merge!(wmiclass)
|
|
32
|
+
else
|
|
33
|
+
warn '[DEPRECATION] `wmi(\'wmiclass\')` is deprecated. Please use `wmi({class: \'wmiclass\'})` instead.'
|
|
34
|
+
@options[:class] = wmiclass
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# returns nil, if not existant or value
|
|
39
|
+
def method_missing(*keys)
|
|
40
|
+
# catch behavior of rspec its implementation
|
|
41
|
+
# @see https://github.com/rspec/rspec-its/blob/master/lib/rspec/its.rb#L110
|
|
42
|
+
keys.shift if keys.is_a?(Array) && keys[0] == :[]
|
|
43
|
+
|
|
44
|
+
# map all symbols to strings
|
|
45
|
+
keys = keys.map { |x| x.to_s.downcase } if keys.is_a?(Array)
|
|
46
|
+
|
|
47
|
+
value(keys)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def value(key)
|
|
51
|
+
extract_value(key, params)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def params
|
|
55
|
+
return @content if defined?(@content)
|
|
56
|
+
@content = {}
|
|
57
|
+
|
|
58
|
+
# abort if no options are available
|
|
59
|
+
return @content unless defined?(@options)
|
|
60
|
+
|
|
61
|
+
# filter for supported options
|
|
62
|
+
args = @options.select { |key, _value| [:class, :namespace, :query, :filter].include?(key) }
|
|
63
|
+
|
|
64
|
+
# convert to Get-WmiObject arguments
|
|
65
|
+
params = ''
|
|
66
|
+
args.each { |key, value| params += " -#{key} \"#{value.gsub('"', '`"')}\"" }
|
|
67
|
+
|
|
68
|
+
# run wmi command and filter empty wmi
|
|
69
|
+
script = <<-EOH
|
|
70
|
+
Filter Aggregate
|
|
71
|
+
{
|
|
72
|
+
$arr = @{}
|
|
73
|
+
$_.properties | % {
|
|
74
|
+
$arr.Add($_.name, $_.value)
|
|
75
|
+
}
|
|
76
|
+
$arr
|
|
77
|
+
}
|
|
78
|
+
Get-WmiObject #{params} | Aggregate | ConvertTo-Json
|
|
79
|
+
EOH
|
|
80
|
+
|
|
81
|
+
# run wmi command
|
|
82
|
+
cmd = inspec.powershell(script)
|
|
83
|
+
@content = JSON.parse(cmd.stdout)
|
|
84
|
+
|
|
85
|
+
# make all keys case-insensitive
|
|
86
|
+
@content = lowercase_keys(@content)
|
|
87
|
+
rescue JSON::ParserError => _e
|
|
88
|
+
@content
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def to_s
|
|
92
|
+
"WMI with #{@options}"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
def lowercase_keys(content)
|
|
98
|
+
if content.is_a?(Hash)
|
|
99
|
+
content.keys.each do |key|
|
|
100
|
+
new_key = key.to_s.downcase
|
|
101
|
+
content[new_key] = content.delete(key)
|
|
102
|
+
lowercase_keys(content[new_key])
|
|
103
|
+
end
|
|
104
|
+
elsif content.respond_to?(:each)
|
|
105
|
+
content.each { |item| lowercase_keys(item) }
|
|
106
|
+
end
|
|
107
|
+
content
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|