inspec-core 2.1.67
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 +7 -0
- data/CHANGELOG.md +3136 -0
- data/Gemfile +56 -0
- data/LICENSE +14 -0
- data/MAINTAINERS.md +33 -0
- data/MAINTAINERS.toml +52 -0
- data/README.md +453 -0
- data/bin/inspec +12 -0
- data/docs/.gitignore +2 -0
- data/docs/README.md +40 -0
- data/docs/dev/control-eval.md +62 -0
- data/docs/dsl_inspec.md +258 -0
- data/docs/dsl_resource.md +100 -0
- data/docs/glossary.md +99 -0
- data/docs/habitat.md +192 -0
- data/docs/inspec_and_friends.md +114 -0
- data/docs/matchers.md +169 -0
- data/docs/migration.md +293 -0
- data/docs/platforms.md +119 -0
- data/docs/plugin_kitchen_inspec.md +50 -0
- data/docs/profiles.md +378 -0
- data/docs/reporters.md +105 -0
- data/docs/resources/aide_conf.md.erb +76 -0
- data/docs/resources/apache.md.erb +67 -0
- data/docs/resources/apache_conf.md.erb +68 -0
- data/docs/resources/apt.md.erb +71 -0
- data/docs/resources/audit_policy.md.erb +47 -0
- data/docs/resources/auditd.md.erb +79 -0
- data/docs/resources/auditd_conf.md.erb +68 -0
- data/docs/resources/bash.md.erb +75 -0
- data/docs/resources/bond.md.erb +90 -0
- data/docs/resources/bridge.md.erb +57 -0
- data/docs/resources/bsd_service.md.erb +67 -0
- data/docs/resources/chocolatey_package.md.erb +58 -0
- data/docs/resources/command.md.erb +138 -0
- data/docs/resources/cpan.md.erb +79 -0
- data/docs/resources/cran.md.erb +64 -0
- data/docs/resources/crontab.md.erb +89 -0
- data/docs/resources/csv.md.erb +54 -0
- data/docs/resources/dh_params.md.erb +205 -0
- data/docs/resources/directory.md.erb +30 -0
- data/docs/resources/docker.md.erb +219 -0
- data/docs/resources/docker_container.md.erb +103 -0
- data/docs/resources/docker_image.md.erb +94 -0
- data/docs/resources/docker_service.md.erb +114 -0
- data/docs/resources/elasticsearch.md.erb +242 -0
- data/docs/resources/etc_fstab.md.erb +125 -0
- data/docs/resources/etc_group.md.erb +75 -0
- data/docs/resources/etc_hosts.md.erb +78 -0
- data/docs/resources/etc_hosts_allow.md.erb +74 -0
- data/docs/resources/etc_hosts_deny.md.erb +74 -0
- data/docs/resources/file.md.erb +526 -0
- data/docs/resources/filesystem.md.erb +41 -0
- data/docs/resources/firewalld.md.erb +107 -0
- data/docs/resources/gem.md.erb +79 -0
- data/docs/resources/group.md.erb +61 -0
- data/docs/resources/grub_conf.md.erb +101 -0
- data/docs/resources/host.md.erb +86 -0
- data/docs/resources/http.md.erb +197 -0
- data/docs/resources/iis_app.md.erb +122 -0
- data/docs/resources/iis_site.md.erb +135 -0
- data/docs/resources/inetd_conf.md.erb +94 -0
- data/docs/resources/ini.md.erb +76 -0
- data/docs/resources/interface.md.erb +58 -0
- data/docs/resources/iptables.md.erb +64 -0
- data/docs/resources/json.md.erb +63 -0
- data/docs/resources/kernel_module.md.erb +120 -0
- data/docs/resources/kernel_parameter.md.erb +53 -0
- data/docs/resources/key_rsa.md.erb +85 -0
- data/docs/resources/launchd_service.md.erb +57 -0
- data/docs/resources/limits_conf.md.erb +75 -0
- data/docs/resources/login_defs.md.erb +71 -0
- data/docs/resources/mount.md.erb +69 -0
- data/docs/resources/mssql_session.md.erb +60 -0
- data/docs/resources/mysql_conf.md.erb +99 -0
- data/docs/resources/mysql_session.md.erb +74 -0
- data/docs/resources/nginx.md.erb +79 -0
- data/docs/resources/nginx_conf.md.erb +138 -0
- data/docs/resources/npm.md.erb +60 -0
- data/docs/resources/ntp_conf.md.erb +60 -0
- data/docs/resources/oneget.md.erb +53 -0
- data/docs/resources/oracledb_session.md.erb +52 -0
- data/docs/resources/os.md.erb +141 -0
- data/docs/resources/os_env.md.erb +91 -0
- data/docs/resources/package.md.erb +120 -0
- data/docs/resources/packages.md.erb +67 -0
- data/docs/resources/parse_config.md.erb +103 -0
- data/docs/resources/parse_config_file.md.erb +138 -0
- data/docs/resources/passwd.md.erb +141 -0
- data/docs/resources/pip.md.erb +67 -0
- data/docs/resources/port.md.erb +137 -0
- data/docs/resources/postgres_conf.md.erb +79 -0
- data/docs/resources/postgres_hba_conf.md.erb +93 -0
- data/docs/resources/postgres_ident_conf.md.erb +76 -0
- data/docs/resources/postgres_session.md.erb +69 -0
- data/docs/resources/powershell.md.erb +102 -0
- data/docs/resources/processes.md.erb +109 -0
- data/docs/resources/rabbitmq_config.md.erb +41 -0
- data/docs/resources/registry_key.md.erb +158 -0
- data/docs/resources/runit_service.md.erb +57 -0
- data/docs/resources/security_policy.md.erb +47 -0
- data/docs/resources/service.md.erb +121 -0
- data/docs/resources/shadow.md.erb +146 -0
- data/docs/resources/ssh_config.md.erb +73 -0
- data/docs/resources/sshd_config.md.erb +83 -0
- data/docs/resources/ssl.md.erb +119 -0
- data/docs/resources/sys_info.md.erb +42 -0
- data/docs/resources/systemd_service.md.erb +57 -0
- data/docs/resources/sysv_service.md.erb +57 -0
- data/docs/resources/upstart_service.md.erb +57 -0
- data/docs/resources/user.md.erb +140 -0
- data/docs/resources/users.md.erb +127 -0
- data/docs/resources/vbscript.md.erb +55 -0
- data/docs/resources/virtualization.md.erb +57 -0
- data/docs/resources/windows_feature.md.erb +47 -0
- data/docs/resources/windows_hotfix.md.erb +53 -0
- data/docs/resources/windows_task.md.erb +95 -0
- data/docs/resources/wmi.md.erb +81 -0
- data/docs/resources/x509_certificate.md.erb +151 -0
- data/docs/resources/xinetd_conf.md.erb +156 -0
- data/docs/resources/xml.md.erb +85 -0
- data/docs/resources/yaml.md.erb +69 -0
- data/docs/resources/yum.md.erb +98 -0
- data/docs/resources/zfs_dataset.md.erb +53 -0
- data/docs/resources/zfs_pool.md.erb +47 -0
- data/docs/ruby_usage.md +203 -0
- data/docs/shared/matcher_be.md.erb +1 -0
- data/docs/shared/matcher_cmp.md.erb +43 -0
- data/docs/shared/matcher_eq.md.erb +3 -0
- data/docs/shared/matcher_include.md.erb +1 -0
- data/docs/shared/matcher_match.md.erb +1 -0
- data/docs/shell.md +217 -0
- data/examples/README.md +8 -0
- data/examples/inheritance/README.md +65 -0
- data/examples/inheritance/controls/example.rb +14 -0
- data/examples/inheritance/inspec.yml +15 -0
- data/examples/kitchen-ansible/.kitchen.yml +25 -0
- data/examples/kitchen-ansible/Gemfile +19 -0
- data/examples/kitchen-ansible/README.md +53 -0
- data/examples/kitchen-ansible/files/nginx.repo +6 -0
- data/examples/kitchen-ansible/tasks/main.yml +16 -0
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -0
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -0
- data/examples/kitchen-chef/.kitchen.yml +20 -0
- data/examples/kitchen-chef/Berksfile +3 -0
- data/examples/kitchen-chef/Gemfile +19 -0
- data/examples/kitchen-chef/README.md +27 -0
- data/examples/kitchen-chef/metadata.rb +7 -0
- data/examples/kitchen-chef/recipes/default.rb +6 -0
- data/examples/kitchen-chef/recipes/nginx.rb +30 -0
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -0
- data/examples/kitchen-puppet/.kitchen.yml +23 -0
- data/examples/kitchen-puppet/Gemfile +20 -0
- data/examples/kitchen-puppet/Puppetfile +25 -0
- data/examples/kitchen-puppet/README.md +53 -0
- data/examples/kitchen-puppet/manifests/site.pp +33 -0
- data/examples/kitchen-puppet/metadata.json +11 -0
- data/examples/kitchen-puppet/modules/.gitkeep +0 -0
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -0
- data/examples/meta-profile/README.md +37 -0
- data/examples/meta-profile/controls/example.rb +13 -0
- data/examples/meta-profile/inspec.yml +13 -0
- data/examples/profile-attribute.yml +2 -0
- data/examples/profile-attribute/README.md +14 -0
- data/examples/profile-attribute/controls/example.rb +11 -0
- data/examples/profile-attribute/inspec.yml +8 -0
- data/examples/profile-sensitive/README.md +29 -0
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -0
- data/examples/profile-sensitive/controls/sensitive.rb +9 -0
- data/examples/profile-sensitive/inspec.yml +8 -0
- data/examples/profile/README.md +48 -0
- data/examples/profile/controls/example.rb +23 -0
- data/examples/profile/controls/gordon.rb +36 -0
- data/examples/profile/controls/meta.rb +34 -0
- data/examples/profile/inspec.yml +10 -0
- data/examples/profile/libraries/gordon_config.rb +59 -0
- data/inspec-core.gemspec +43 -0
- data/lib/bundles/README.md +3 -0
- data/lib/bundles/inspec-artifact.rb +7 -0
- data/lib/bundles/inspec-artifact/README.md +1 -0
- data/lib/bundles/inspec-artifact/cli.rb +277 -0
- data/lib/bundles/inspec-compliance.rb +16 -0
- data/lib/bundles/inspec-compliance/.kitchen.yml +20 -0
- data/lib/bundles/inspec-compliance/README.md +193 -0
- data/lib/bundles/inspec-compliance/api.rb +360 -0
- data/lib/bundles/inspec-compliance/api/login.rb +193 -0
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -0
- data/lib/bundles/inspec-compliance/cli.rb +260 -0
- data/lib/bundles/inspec-compliance/configuration.rb +103 -0
- data/lib/bundles/inspec-compliance/http.rb +125 -0
- data/lib/bundles/inspec-compliance/images/cc-token.png +0 -0
- data/lib/bundles/inspec-compliance/support.rb +36 -0
- data/lib/bundles/inspec-compliance/target.rb +106 -0
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -0
- data/lib/bundles/inspec-habitat.rb +12 -0
- data/lib/bundles/inspec-habitat/cli.rb +36 -0
- data/lib/bundles/inspec-habitat/log.rb +10 -0
- data/lib/bundles/inspec-habitat/profile.rb +391 -0
- data/lib/bundles/inspec-init.rb +8 -0
- data/lib/bundles/inspec-init/README.md +31 -0
- data/lib/bundles/inspec-init/cli.rb +97 -0
- data/lib/bundles/inspec-init/templates/profile/README.md +3 -0
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -0
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -0
- data/lib/bundles/inspec-init/templates/profile/libraries/.gitkeep +0 -0
- data/lib/bundles/inspec-supermarket.rb +13 -0
- data/lib/bundles/inspec-supermarket/README.md +45 -0
- data/lib/bundles/inspec-supermarket/api.rb +84 -0
- data/lib/bundles/inspec-supermarket/cli.rb +73 -0
- data/lib/bundles/inspec-supermarket/target.rb +34 -0
- data/lib/fetchers/git.rb +163 -0
- data/lib/fetchers/local.rb +74 -0
- data/lib/fetchers/mock.rb +35 -0
- data/lib/fetchers/url.rb +247 -0
- data/lib/inspec.rb +24 -0
- data/lib/inspec/archive/tar.rb +29 -0
- data/lib/inspec/archive/zip.rb +19 -0
- data/lib/inspec/backend.rb +93 -0
- data/lib/inspec/base_cli.rb +368 -0
- data/lib/inspec/cached_fetcher.rb +66 -0
- data/lib/inspec/cli.rb +292 -0
- data/lib/inspec/completions/bash.sh.erb +45 -0
- data/lib/inspec/completions/fish.sh.erb +34 -0
- data/lib/inspec/completions/zsh.sh.erb +61 -0
- data/lib/inspec/control_eval_context.rb +179 -0
- data/lib/inspec/dependencies/cache.rb +72 -0
- data/lib/inspec/dependencies/dependency_set.rb +92 -0
- data/lib/inspec/dependencies/lockfile.rb +115 -0
- data/lib/inspec/dependencies/requirement.rb +123 -0
- data/lib/inspec/dependencies/resolver.rb +86 -0
- data/lib/inspec/describe.rb +27 -0
- data/lib/inspec/dsl.rb +66 -0
- data/lib/inspec/dsl_shared.rb +33 -0
- data/lib/inspec/env_printer.rb +157 -0
- data/lib/inspec/errors.rb +14 -0
- data/lib/inspec/exceptions.rb +12 -0
- data/lib/inspec/expect.rb +45 -0
- data/lib/inspec/fetcher.rb +45 -0
- data/lib/inspec/file_provider.rb +275 -0
- data/lib/inspec/formatters.rb +3 -0
- data/lib/inspec/formatters/base.rb +259 -0
- data/lib/inspec/formatters/json_rspec.rb +20 -0
- data/lib/inspec/formatters/show_progress.rb +12 -0
- data/lib/inspec/library_eval_context.rb +58 -0
- data/lib/inspec/log.rb +11 -0
- data/lib/inspec/metadata.rb +247 -0
- data/lib/inspec/method_source.rb +24 -0
- data/lib/inspec/objects.rb +14 -0
- data/lib/inspec/objects/attribute.rb +75 -0
- data/lib/inspec/objects/control.rb +61 -0
- data/lib/inspec/objects/describe.rb +92 -0
- data/lib/inspec/objects/each_loop.rb +36 -0
- data/lib/inspec/objects/list.rb +15 -0
- data/lib/inspec/objects/or_test.rb +40 -0
- data/lib/inspec/objects/ruby_helper.rb +15 -0
- data/lib/inspec/objects/tag.rb +27 -0
- data/lib/inspec/objects/test.rb +87 -0
- data/lib/inspec/objects/value.rb +27 -0
- data/lib/inspec/plugins.rb +60 -0
- data/lib/inspec/plugins/cli.rb +24 -0
- data/lib/inspec/plugins/fetcher.rb +86 -0
- data/lib/inspec/plugins/resource.rb +135 -0
- data/lib/inspec/plugins/secret.rb +15 -0
- data/lib/inspec/plugins/source_reader.rb +40 -0
- data/lib/inspec/polyfill.rb +12 -0
- data/lib/inspec/profile.rb +513 -0
- data/lib/inspec/profile_context.rb +208 -0
- data/lib/inspec/profile_vendor.rb +66 -0
- data/lib/inspec/reporters.rb +60 -0
- data/lib/inspec/reporters/automate.rb +76 -0
- data/lib/inspec/reporters/base.rb +25 -0
- data/lib/inspec/reporters/cli.rb +356 -0
- data/lib/inspec/reporters/json.rb +116 -0
- data/lib/inspec/reporters/json_min.rb +48 -0
- data/lib/inspec/reporters/junit.rb +78 -0
- data/lib/inspec/require_loader.rb +33 -0
- data/lib/inspec/resource.rb +190 -0
- data/lib/inspec/rule.rb +280 -0
- data/lib/inspec/runner.rb +345 -0
- data/lib/inspec/runner_mock.rb +41 -0
- data/lib/inspec/runner_rspec.rb +175 -0
- data/lib/inspec/runtime_profile.rb +26 -0
- data/lib/inspec/schema.rb +213 -0
- data/lib/inspec/secrets.rb +19 -0
- data/lib/inspec/secrets/yaml.rb +30 -0
- data/lib/inspec/shell.rb +220 -0
- data/lib/inspec/shell_detector.rb +90 -0
- data/lib/inspec/source_reader.rb +29 -0
- data/lib/inspec/version.rb +8 -0
- data/lib/matchers/matchers.rb +339 -0
- data/lib/resources/aide_conf.rb +151 -0
- data/lib/resources/apache.rb +48 -0
- data/lib/resources/apache_conf.rb +149 -0
- data/lib/resources/apt.rb +149 -0
- data/lib/resources/audit_policy.rb +63 -0
- data/lib/resources/auditd.rb +231 -0
- data/lib/resources/auditd_conf.rb +46 -0
- data/lib/resources/bash.rb +35 -0
- data/lib/resources/bond.rb +69 -0
- data/lib/resources/bridge.rb +122 -0
- data/lib/resources/chocolatey_package.rb +78 -0
- data/lib/resources/command.rb +73 -0
- data/lib/resources/cpan.rb +58 -0
- data/lib/resources/cran.rb +64 -0
- data/lib/resources/crontab.rb +169 -0
- data/lib/resources/csv.rb +56 -0
- data/lib/resources/dh_params.rb +77 -0
- data/lib/resources/directory.rb +25 -0
- data/lib/resources/docker.rb +236 -0
- data/lib/resources/docker_container.rb +89 -0
- data/lib/resources/docker_image.rb +83 -0
- data/lib/resources/docker_object.rb +57 -0
- data/lib/resources/docker_service.rb +90 -0
- data/lib/resources/elasticsearch.rb +169 -0
- data/lib/resources/etc_fstab.rb +94 -0
- data/lib/resources/etc_group.rb +154 -0
- data/lib/resources/etc_hosts.rb +66 -0
- data/lib/resources/etc_hosts_allow_deny.rb +112 -0
- data/lib/resources/file.rb +298 -0
- data/lib/resources/filesystem.rb +31 -0
- data/lib/resources/firewalld.rb +143 -0
- data/lib/resources/gem.rb +70 -0
- data/lib/resources/groups.rb +215 -0
- data/lib/resources/grub_conf.rb +227 -0
- data/lib/resources/host.rb +306 -0
- data/lib/resources/http.rb +253 -0
- data/lib/resources/iis_app.rb +101 -0
- data/lib/resources/iis_site.rb +148 -0
- data/lib/resources/inetd_conf.rb +54 -0
- data/lib/resources/ini.rb +29 -0
- data/lib/resources/interface.rb +129 -0
- data/lib/resources/iptables.rb +80 -0
- data/lib/resources/json.rb +111 -0
- data/lib/resources/kernel_module.rb +107 -0
- data/lib/resources/kernel_parameter.rb +58 -0
- data/lib/resources/key_rsa.rb +63 -0
- data/lib/resources/limits_conf.rb +46 -0
- data/lib/resources/login_def.rb +57 -0
- data/lib/resources/mount.rb +88 -0
- data/lib/resources/mssql_session.rb +101 -0
- data/lib/resources/mysql.rb +82 -0
- data/lib/resources/mysql_conf.rb +127 -0
- data/lib/resources/mysql_session.rb +85 -0
- data/lib/resources/nginx.rb +96 -0
- data/lib/resources/nginx_conf.rb +226 -0
- data/lib/resources/npm.rb +48 -0
- data/lib/resources/ntp_conf.rb +51 -0
- data/lib/resources/oneget.rb +71 -0
- data/lib/resources/oracledb_session.rb +139 -0
- data/lib/resources/os.rb +36 -0
- data/lib/resources/os_env.rb +86 -0
- data/lib/resources/package.rb +370 -0
- data/lib/resources/packages.rb +111 -0
- data/lib/resources/parse_config.rb +112 -0
- data/lib/resources/passwd.rb +76 -0
- data/lib/resources/pip.rb +130 -0
- data/lib/resources/platform.rb +109 -0
- data/lib/resources/port.rb +771 -0
- data/lib/resources/postgres.rb +131 -0
- data/lib/resources/postgres_conf.rb +114 -0
- data/lib/resources/postgres_hba_conf.rb +90 -0
- data/lib/resources/postgres_ident_conf.rb +79 -0
- data/lib/resources/postgres_session.rb +71 -0
- data/lib/resources/powershell.rb +67 -0
- data/lib/resources/processes.rb +204 -0
- data/lib/resources/rabbitmq_conf.rb +51 -0
- data/lib/resources/registry_key.rb +297 -0
- data/lib/resources/security_policy.rb +180 -0
- data/lib/resources/service.rb +794 -0
- data/lib/resources/shadow.rb +159 -0
- data/lib/resources/ssh_conf.rb +97 -0
- data/lib/resources/ssl.rb +99 -0
- data/lib/resources/sys_info.rb +28 -0
- data/lib/resources/toml.rb +32 -0
- data/lib/resources/users.rb +654 -0
- data/lib/resources/vbscript.rb +68 -0
- data/lib/resources/virtualization.rb +247 -0
- data/lib/resources/windows_feature.rb +84 -0
- data/lib/resources/windows_hotfix.rb +35 -0
- data/lib/resources/windows_task.rb +102 -0
- data/lib/resources/wmi.rb +110 -0
- data/lib/resources/x509_certificate.rb +137 -0
- data/lib/resources/xinetd.rb +106 -0
- data/lib/resources/xml.rb +46 -0
- data/lib/resources/yaml.rb +43 -0
- data/lib/resources/yum.rb +180 -0
- data/lib/resources/zfs_dataset.rb +60 -0
- data/lib/resources/zfs_pool.rb +49 -0
- data/lib/source_readers/flat.rb +39 -0
- data/lib/source_readers/inspec.rb +75 -0
- data/lib/utils/command_wrapper.rb +27 -0
- data/lib/utils/convert.rb +12 -0
- data/lib/utils/database_helpers.rb +77 -0
- data/lib/utils/enumerable_delegation.rb +9 -0
- data/lib/utils/erlang_parser.rb +192 -0
- data/lib/utils/file_reader.rb +25 -0
- data/lib/utils/filter.rb +273 -0
- data/lib/utils/filter_array.rb +27 -0
- data/lib/utils/find_files.rb +47 -0
- data/lib/utils/hash.rb +41 -0
- data/lib/utils/json_log.rb +18 -0
- data/lib/utils/latest_version.rb +22 -0
- data/lib/utils/modulator.rb +12 -0
- data/lib/utils/nginx_parser.rb +105 -0
- data/lib/utils/object_traversal.rb +49 -0
- data/lib/utils/parser.rb +274 -0
- data/lib/utils/pkey_reader.rb +15 -0
- data/lib/utils/plugin_registry.rb +93 -0
- data/lib/utils/simpleconfig.rb +120 -0
- data/lib/utils/spdx.rb +13 -0
- data/lib/utils/spdx.txt +344 -0
- metadata +713 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
3
|
+
|
4
|
+
module Inspec::Resources
|
5
|
+
class PowershellScript < Cmd
|
6
|
+
name 'powershell'
|
7
|
+
supports platform: 'windows'
|
8
|
+
supports platform: 'unix'
|
9
|
+
desc 'Use the powershell InSpec audit resource to test a Windows PowerShell script on the Microsoft Windows platform.'
|
10
|
+
example "
|
11
|
+
script = <<-EOH
|
12
|
+
# your powershell script
|
13
|
+
EOH
|
14
|
+
|
15
|
+
describe powershell(script) do
|
16
|
+
its('matcher') { should eq 'output' }
|
17
|
+
end
|
18
|
+
"
|
19
|
+
|
20
|
+
def initialize(script)
|
21
|
+
# PowerShell is the default shell on Windows, use the `command` resource
|
22
|
+
return super(script) if inspec.os.windows?
|
23
|
+
|
24
|
+
unless inspec.command('pwsh').exist?
|
25
|
+
raise Inspec::Exceptions::ResourceSkipped, 'Can not find `pwsh` command'
|
26
|
+
end
|
27
|
+
|
28
|
+
# Prevent progress stream from leaking into stderr
|
29
|
+
command = "$ProgressPreference='SilentlyContinue';" + script
|
30
|
+
|
31
|
+
# Encode as Base64 to remove any quotes/escapes/etc issues
|
32
|
+
command = command.encode('UTF-16LE', 'UTF-8')
|
33
|
+
command = Base64.strict_encode64(command)
|
34
|
+
|
35
|
+
# Use the `command` resource to execute the command via `pwsh`
|
36
|
+
super("pwsh -encodedCommand '#{command}'")
|
37
|
+
end
|
38
|
+
|
39
|
+
# we cannot determine if a command exists, because that does not work for scripts
|
40
|
+
def exist?
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
44
|
+
# Removes leading and trailing whitespace from stdout
|
45
|
+
def strip
|
46
|
+
result.stdout&.strip
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
'Powershell'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# this is deprecated syntax and will be removed in future versions
|
55
|
+
class LegacyPowershellScript < PowershellScript
|
56
|
+
name 'script'
|
57
|
+
|
58
|
+
def initialize(script)
|
59
|
+
deprecated
|
60
|
+
super(script)
|
61
|
+
end
|
62
|
+
|
63
|
+
def deprecated
|
64
|
+
warn '[DEPRECATION] `script(script)` is deprecated. Please use `powershell(script)` instead.'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
3
|
+
|
4
|
+
require 'utils/filter'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
module Inspec::Resources
|
8
|
+
class Processes < Inspec.resource(1)
|
9
|
+
name 'processes'
|
10
|
+
supports platform: 'unix'
|
11
|
+
supports platform: 'windows'
|
12
|
+
desc 'Use the processes InSpec audit resource to test properties for programs that are running on the system.'
|
13
|
+
example "
|
14
|
+
describe processes('mysqld') do
|
15
|
+
its('entries.length') { should eq 1 }
|
16
|
+
its('users') { should eq ['mysql'] }
|
17
|
+
its('states') { should include 'S' }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe processes(/.+/).where { label != 'unconfined' && pid < 1000 } do
|
21
|
+
its('users') { should cmp [] }
|
22
|
+
end
|
23
|
+
|
24
|
+
# work with all processes
|
25
|
+
describe processes do
|
26
|
+
its('entries.length') { should be <= 100 }
|
27
|
+
end
|
28
|
+
"
|
29
|
+
|
30
|
+
def initialize(grep = /.*/)
|
31
|
+
@grep = grep
|
32
|
+
# turn into a regexp if it isn't one yet
|
33
|
+
if grep.class == String
|
34
|
+
# if windows ignore case as we can't make up our minds
|
35
|
+
if inspec.os.windows?
|
36
|
+
grep = '(?i)' + grep
|
37
|
+
else
|
38
|
+
grep = '(/[^/]*)*' + grep unless grep[0] == '/'
|
39
|
+
grep = '^' + grep + '(\s|$)'
|
40
|
+
end
|
41
|
+
grep = Regexp.new(grep)
|
42
|
+
end
|
43
|
+
|
44
|
+
all_cmds = ps_axo
|
45
|
+
@list = all_cmds.find_all do |hm|
|
46
|
+
hm[:command] =~ grep
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def exists?
|
51
|
+
!@list.empty?
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
"Processes #{@grep.class == String ? @grep : @grep.inspect}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def list
|
59
|
+
warn '[DEPRECATION] `processes.list` is deprecated. Please use `processes.entries` instead. It will be removed in version 2.0.0.'
|
60
|
+
@list
|
61
|
+
end
|
62
|
+
|
63
|
+
filter = FilterTable.create
|
64
|
+
filter.add_accessor(:where)
|
65
|
+
.add_accessor(:entries)
|
66
|
+
.add(:labels, field: 'label')
|
67
|
+
.add(:pids, field: 'pid')
|
68
|
+
.add(:cpus, field: 'cpu')
|
69
|
+
.add(:mem, field: 'mem')
|
70
|
+
.add(:vsz, field: 'vsz')
|
71
|
+
.add(:rss, field: 'rss')
|
72
|
+
.add(:tty, field: 'tty')
|
73
|
+
.add(:states, field: 'stat')
|
74
|
+
.add(:start, field: 'start')
|
75
|
+
.add(:time, field: 'time')
|
76
|
+
.add(:users, field: 'user')
|
77
|
+
.add(:commands, field: 'command')
|
78
|
+
.connect(self, :filtered_processes)
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def filtered_processes
|
83
|
+
@list
|
84
|
+
end
|
85
|
+
|
86
|
+
def ps_axo
|
87
|
+
os = inspec.os
|
88
|
+
|
89
|
+
if os.linux?
|
90
|
+
command, regex, field_map = ps_configuration_for_linux
|
91
|
+
elsif os.windows?
|
92
|
+
command = '$Proc = Get-Process -IncludeUserName | Where-Object {$_.Path -ne $null } | Select-Object PriorityClass,Id,CPU,PM,VirtualMemorySize,NPM,SessionId,Responding,StartTime,TotalProcessorTime,UserName,Path | ConvertTo-Csv -NoTypeInformation;$Proc.Replace("""","").Replace("`r`n","`n")'
|
93
|
+
# Wanted to use /(?:^|,)([^,]*)/; works on rubular.com not sure why here?
|
94
|
+
regex = /^(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+)$/
|
95
|
+
field_map = {
|
96
|
+
pid: 2,
|
97
|
+
cpu: 3,
|
98
|
+
mem: 4,
|
99
|
+
vsz: 5,
|
100
|
+
rss: 6,
|
101
|
+
tty: 7,
|
102
|
+
stat: 8,
|
103
|
+
start: 9,
|
104
|
+
time: 10,
|
105
|
+
user: 11,
|
106
|
+
command: 12,
|
107
|
+
}
|
108
|
+
else
|
109
|
+
command = 'ps axo pid,pcpu,pmem,vsz,rss,tty,stat,start,time,user,command'
|
110
|
+
regex = /^\s*([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+(.*)$/
|
111
|
+
field_map = {
|
112
|
+
pid: 1,
|
113
|
+
cpu: 2,
|
114
|
+
mem: 3,
|
115
|
+
vsz: 4,
|
116
|
+
rss: 5,
|
117
|
+
tty: 6,
|
118
|
+
stat: 7,
|
119
|
+
start: 8,
|
120
|
+
time: 9,
|
121
|
+
user: 10,
|
122
|
+
command: 11,
|
123
|
+
}
|
124
|
+
end
|
125
|
+
build_process_list(command, regex, field_map)
|
126
|
+
end
|
127
|
+
|
128
|
+
def ps_configuration_for_linux
|
129
|
+
if busybox_ps?
|
130
|
+
command = 'ps -o pid,vsz,rss,tty,stat,time,ruser,args'
|
131
|
+
regex = /^\s*(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.*)$/
|
132
|
+
field_map = {
|
133
|
+
pid: 1,
|
134
|
+
vsz: 2,
|
135
|
+
rss: 3,
|
136
|
+
tty: 4,
|
137
|
+
stat: 5,
|
138
|
+
time: 6,
|
139
|
+
user: 7,
|
140
|
+
command: 8,
|
141
|
+
}
|
142
|
+
else
|
143
|
+
command = 'ps axo label,pid,pcpu,pmem,vsz,rss,tty,stat,start,time,user:32,command'
|
144
|
+
regex = /^(.+?)\s+(\d+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+(\w{3} \d{2}|\d{2}:\d{2}:\d{2})\s+([^ ]+)\s+([^ ]+)\s+(.*)$/
|
145
|
+
field_map = {
|
146
|
+
label: 1,
|
147
|
+
pid: 2,
|
148
|
+
cpu: 3,
|
149
|
+
mem: 4,
|
150
|
+
vsz: 5,
|
151
|
+
rss: 6,
|
152
|
+
tty: 7,
|
153
|
+
stat: 8,
|
154
|
+
start: 9,
|
155
|
+
time: 10,
|
156
|
+
user: 11,
|
157
|
+
command: 12,
|
158
|
+
}
|
159
|
+
end
|
160
|
+
|
161
|
+
[command, regex, field_map]
|
162
|
+
end
|
163
|
+
|
164
|
+
def busybox_ps?
|
165
|
+
@busybox_ps ||= inspec.command('ps --help').stderr.include?('BusyBox')
|
166
|
+
end
|
167
|
+
|
168
|
+
def build_process_list(command, regex, field_map)
|
169
|
+
cmd = inspec.command(command)
|
170
|
+
all = cmd.stdout.split("\n")[1..-1]
|
171
|
+
return [] if all.nil?
|
172
|
+
|
173
|
+
# map all the process lines into match objects, fetch the available fields,
|
174
|
+
# and then build an OpenStruct of the process data for each process
|
175
|
+
all.map do |line|
|
176
|
+
line = line.match(regex)
|
177
|
+
|
178
|
+
# skip this line if we couldn't match the regular expression
|
179
|
+
next if line.nil?
|
180
|
+
|
181
|
+
# skip this entry if there's no command for this line
|
182
|
+
next if line[field_map[:command]].nil?
|
183
|
+
|
184
|
+
# build a hash of process data that we'll turn into a struct for FilterTable
|
185
|
+
process_data = {}
|
186
|
+
[:label, :pid, :cpu, :mem, :vsz, :rss, :tty, :stat, :start, :time, :user, :command].each do |param|
|
187
|
+
# not all operating systems support all fields, so skip the field if we don't have it
|
188
|
+
process_data[param] = line[field_map[param]] if field_map.key?(param)
|
189
|
+
end
|
190
|
+
|
191
|
+
# ensure pid, vsz, and rss are integers for backward compatibility
|
192
|
+
[:pid, :vsz, :rss].each do |int_param|
|
193
|
+
process_data[int_param] = process_data[int_param].to_i if process_data.key?(int_param)
|
194
|
+
end
|
195
|
+
|
196
|
+
# strip any newlines off the command
|
197
|
+
process_data[:command].strip!
|
198
|
+
|
199
|
+
# return an OpenStruct of the process for future use by FilterTable
|
200
|
+
OpenStruct.new(process_data)
|
201
|
+
end.compact
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'utils/erlang_parser'
|
4
|
+
require 'utils/file_reader'
|
5
|
+
|
6
|
+
module Inspec::Resources
|
7
|
+
class RabbitmqConf < Inspec.resource(1)
|
8
|
+
name 'rabbitmq_config'
|
9
|
+
supports platform: 'unix'
|
10
|
+
desc 'Use the rabbitmq_config InSpec resource to test configuration data '\
|
11
|
+
'for the RabbitMQ service located in /etc/rabbitmq/rabbitmq.config on '\
|
12
|
+
'Linux and UNIX platforms.'
|
13
|
+
example "
|
14
|
+
describe rabbitmq_config.params('rabbit', 'ssl_listeners') do
|
15
|
+
it { should cmp 5671 }
|
16
|
+
end
|
17
|
+
"
|
18
|
+
|
19
|
+
include FileReader
|
20
|
+
|
21
|
+
def initialize(conf_path = nil)
|
22
|
+
@conf_path = conf_path || '/etc/rabbitmq/rabbitmq.config'
|
23
|
+
@content = read_file_content(@conf_path, allow_empty: true)
|
24
|
+
end
|
25
|
+
|
26
|
+
def params(*opts)
|
27
|
+
opts.inject(read_params) do |res, nxt|
|
28
|
+
res.respond_to?(:key) ? res[nxt] : nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
"rabbitmq_config #{@conf_path}"
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def read_content
|
39
|
+
return @content if defined?(@content)
|
40
|
+
@content = read_file_content(@conf_path, allow_empty: true)
|
41
|
+
end
|
42
|
+
|
43
|
+
def read_params
|
44
|
+
return @params if defined?(@params)
|
45
|
+
return @params = {} if read_content.nil?
|
46
|
+
@params = ErlangConfigFile.parse(read_content)
|
47
|
+
rescue Parslet::ParseFailed
|
48
|
+
raise "Cannot parse RabbitMQ config: \"#{read_content}\""
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,297 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
3
|
+
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
# Three constructor methods are available:
|
7
|
+
# 1. resistry_key(path'):
|
8
|
+
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule') do
|
9
|
+
# its('Start') { should eq 2 }
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# 2. resistry_key('name','path'):
|
13
|
+
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule') do
|
14
|
+
# its('Start') { should eq 2 }
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# 3. options hash
|
18
|
+
# describe registry_key({
|
19
|
+
# name: 'Task Scheduler',
|
20
|
+
# hive: 'HKEY_LOCAL_MACHINE',
|
21
|
+
# key: '\SYSTEM\CurrentControlSet\services\Schedule'
|
22
|
+
# }) do
|
23
|
+
# its('Start') { should eq 2 }
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# Get all childs of a registry key:
|
27
|
+
# describe registry_key('Task Scheduler','HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet').children do
|
28
|
+
# it { should_not eq [] }
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# Example to use regular expressions for keys
|
32
|
+
# describe registry_key({
|
33
|
+
# hive: HKEY_USERS
|
34
|
+
# }).children(/^S-1-5-21-[0-9]+-[0-9]+-[0-9]+-[0-9]{3,}\\Software\\Policies\\Microsoft\\Windows\\Installer/).each { |key|
|
35
|
+
# describe registry_key(key) do
|
36
|
+
# its('AlwaysInstallElevated') { should eq 'value' }
|
37
|
+
# end
|
38
|
+
# }
|
39
|
+
#
|
40
|
+
# Example to use regular expressions in responses
|
41
|
+
# describe registry_key({
|
42
|
+
# hive: 'HKEY_LOCAL_MACHINE',
|
43
|
+
# key: 'SOFTWARE\Microsoft\Windows NT\CurrentVersion'
|
44
|
+
# }) do
|
45
|
+
# its('ProductName') { should match /^[a-zA-Z0-9\(\)\s]*2012\s[rR]2[a-zA-Z0-9\(\)\s]*$/ }
|
46
|
+
# end
|
47
|
+
|
48
|
+
module Inspec::Resources
|
49
|
+
class RegistryKey < Inspec.resource(1)
|
50
|
+
name 'registry_key'
|
51
|
+
supports platform: 'windows'
|
52
|
+
desc 'Use the registry_key InSpec audit resource to test key values in the Microsoft Windows registry.'
|
53
|
+
example "
|
54
|
+
describe registry_key('path\to\key') do
|
55
|
+
its('name') { should eq 'value' }
|
56
|
+
end
|
57
|
+
"
|
58
|
+
|
59
|
+
def initialize(name, reg_key = nil)
|
60
|
+
# if we have one parameter, we use it as name
|
61
|
+
reg_key ||= name
|
62
|
+
@options = {}
|
63
|
+
if reg_key && reg_key.is_a?(Hash)
|
64
|
+
@options = @options.merge!(reg_key)
|
65
|
+
|
66
|
+
# generate registry_key if we do not have a regular expression
|
67
|
+
@options[:path] = generate_registry_key_path_from_options
|
68
|
+
@options[:name] ||= @options[:path]
|
69
|
+
else
|
70
|
+
@options[:name] = name
|
71
|
+
@options[:path] = reg_key
|
72
|
+
end
|
73
|
+
|
74
|
+
return skip_resource 'The `registry_key` resource is not supported on your OS yet.' if !inspec.os.windows?
|
75
|
+
end
|
76
|
+
|
77
|
+
def exists?
|
78
|
+
!registry_key(@options[:path]).nil?
|
79
|
+
end
|
80
|
+
|
81
|
+
def has_value?(value)
|
82
|
+
val = registry_key(@options[:path])
|
83
|
+
!val.nil? && registry_property_value(val, '(default)') == value ? true : false
|
84
|
+
end
|
85
|
+
|
86
|
+
def has_property?(property_name, property_type = nil)
|
87
|
+
val = registry_key(@options[:path])
|
88
|
+
!val.nil? && registry_property_exists(val, property_name) && (property_type.nil? || registry_property_type(val, property_name) == map2type(property_type)) ? true : false
|
89
|
+
end
|
90
|
+
|
91
|
+
# deactivate rubocop, because we need to stay compatible with Serverspe
|
92
|
+
# rubocop:disable Style/OptionalArguments
|
93
|
+
def has_property_value?(property_name, property_type = nil, value)
|
94
|
+
# rubocop:enable Style/OptionalArguments
|
95
|
+
val = registry_key(@options[:path])
|
96
|
+
|
97
|
+
# convert value to binary if required
|
98
|
+
value = value.bytes if !property_type.nil? && map2type(property_type) == 3 && !value.is_a?(Array)
|
99
|
+
|
100
|
+
!val.nil? && registry_property_value(val, property_name) == value && (property_type.nil? || registry_property_type(val, property_name) == map2type(property_type)) ? true : false
|
101
|
+
end
|
102
|
+
|
103
|
+
# returns an arrray of child nodes
|
104
|
+
def children(filter = nil)
|
105
|
+
children_keys(@options[:path], filter)
|
106
|
+
end
|
107
|
+
|
108
|
+
# returns nil, if not existant or value
|
109
|
+
def method_missing(*keys)
|
110
|
+
# allow the use of array syntax in an `its` block so that users
|
111
|
+
# can use it to query for keys with . characters in them
|
112
|
+
if keys.is_a?(Array)
|
113
|
+
keys.shift if keys[0] == :[]
|
114
|
+
key = keys.first
|
115
|
+
else
|
116
|
+
key = keys
|
117
|
+
end
|
118
|
+
|
119
|
+
# get data
|
120
|
+
val = registry_key(@options[:path])
|
121
|
+
registry_property_value(val, key)
|
122
|
+
end
|
123
|
+
|
124
|
+
def to_s
|
125
|
+
"Registry Key #{@options[:name]}"
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
def prep_prop(property)
|
131
|
+
property.to_s.downcase
|
132
|
+
end
|
133
|
+
|
134
|
+
def registry_property_exists(regkey, property)
|
135
|
+
return false if regkey.nil? || property.nil?
|
136
|
+
# always ensure the key is lower case
|
137
|
+
!regkey[prep_prop(property)].nil?
|
138
|
+
end
|
139
|
+
|
140
|
+
def registry_property_value(regkey, property)
|
141
|
+
return nil if !registry_property_exists(regkey, property)
|
142
|
+
# always ensure the key is lower case
|
143
|
+
regkey[prep_prop(property)]['value']
|
144
|
+
end
|
145
|
+
|
146
|
+
def registry_property_type(regkey, property)
|
147
|
+
return nil if !registry_property_exists(regkey, property)
|
148
|
+
# always ensure the key is lower case
|
149
|
+
regkey[prep_prop(property)]['type']
|
150
|
+
end
|
151
|
+
|
152
|
+
def registry_key(path)
|
153
|
+
return @registry_cache if defined?(@registry_cache)
|
154
|
+
# load registry key and all properties
|
155
|
+
script = <<-EOH
|
156
|
+
Function InSpec-GetRegistryKey($path) {
|
157
|
+
$reg = Get-Item ('Registry::' + $path)
|
158
|
+
if ($reg -eq $null) {
|
159
|
+
Write-Error "InSpec: Failed to find registry key"
|
160
|
+
exit 1001
|
161
|
+
}
|
162
|
+
|
163
|
+
$properties = New-Object -Type PSObject
|
164
|
+
$reg.Property | ForEach-Object {
|
165
|
+
$key = $_
|
166
|
+
$keytype = $key
|
167
|
+
if ("(default)".Equals($key)) { $keytype = '' }
|
168
|
+
$value = New-Object psobject -Property @{
|
169
|
+
"value" = $(Get-ItemProperty ('Registry::' + $path)).$key;
|
170
|
+
"type" = $reg.GetValueKind($keytype);
|
171
|
+
}
|
172
|
+
$properties | Add-Member NoteProperty $_ $value
|
173
|
+
}
|
174
|
+
$properties
|
175
|
+
}
|
176
|
+
$path = '#{path}'
|
177
|
+
InSpec-GetRegistryKey($path) | ConvertTo-Json -Compress
|
178
|
+
EOH
|
179
|
+
|
180
|
+
cmd = inspec.powershell(script)
|
181
|
+
# cannot rely on exit code for now, successful command returns exit code 1
|
182
|
+
# return nil if cmd.exit_status != 0, try to parse json
|
183
|
+
begin
|
184
|
+
if cmd.exit_status == 1001 && cmd.stderr =~ /InSpec: Failed to find registry key/
|
185
|
+
# TODO: provide the stderr output
|
186
|
+
@registry_cache = nil
|
187
|
+
else
|
188
|
+
@registry_cache = JSON.parse(cmd.stdout)
|
189
|
+
# convert keys to lower case
|
190
|
+
@registry_cache = Hash[@registry_cache.map do |key, value|
|
191
|
+
[key.downcase, value]
|
192
|
+
end]
|
193
|
+
end
|
194
|
+
rescue JSON::ParserError => _e
|
195
|
+
@registry_cache = nil
|
196
|
+
end
|
197
|
+
@registry_cache
|
198
|
+
end
|
199
|
+
|
200
|
+
def children_keys(path, filter = '')
|
201
|
+
return @children_cache if defined?(@children_cache)
|
202
|
+
filter = filter.source if filter.is_a? ::Regexp
|
203
|
+
script = <<-EOH
|
204
|
+
Function InSpec-FindChildsRegistryKeys($path, $filter) {
|
205
|
+
# get information about the child registry keys
|
206
|
+
$items = Get-ChildItem -Path ('Registry::' + $path) -rec -ea SilentlyContinue
|
207
|
+
# filter entries
|
208
|
+
$items | Where-Object {
|
209
|
+
$name = $_.Name
|
210
|
+
$simple = $name -replace "HKEY_LOCAL_MACHINE\\\\",""
|
211
|
+
$simple = $name -replace "HKEY_USERS\\\\",""
|
212
|
+
$simple -Match $filter
|
213
|
+
} | % { $_.Name }
|
214
|
+
}
|
215
|
+
|
216
|
+
$path = '#{path}'
|
217
|
+
$filter = "#{filter}"
|
218
|
+
ConvertTo-Json @(InSpec-FindChildsRegistryKeys $path $filter)
|
219
|
+
EOH
|
220
|
+
cmd = inspec.powershell(script)
|
221
|
+
begin
|
222
|
+
@children_cache = JSON.parse(cmd.stdout)
|
223
|
+
rescue JSON::ParserError => _e
|
224
|
+
@children_cache = []
|
225
|
+
end
|
226
|
+
@children_cache
|
227
|
+
end
|
228
|
+
|
229
|
+
# Registry key value types
|
230
|
+
# @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms724884(v=vs.85).aspx
|
231
|
+
# REG_NONE 0
|
232
|
+
# REG_SZ 1
|
233
|
+
# REG_EXPAND_SZ 2
|
234
|
+
# REG_BINARY 3
|
235
|
+
# REG_DWORD 4
|
236
|
+
# REG_DWORD_LITTLE_ENDIAN 4
|
237
|
+
# REG_DWORD_BIG_ENDIAN 5
|
238
|
+
# REG_LINK 6
|
239
|
+
# REG_MULTI_SZ 7
|
240
|
+
# REG_RESOURCE_LIST 8
|
241
|
+
# REG_FULL_RESOURCE_DESCRIPTOR 9
|
242
|
+
# REG_RESOURCE_REQUIREMENTS_LIST 10
|
243
|
+
# REG_QWORD 11
|
244
|
+
# REG_QWORD_LITTLE_ENDIAN 11
|
245
|
+
def map2type(symbol)
|
246
|
+
options = {}
|
247
|
+
|
248
|
+
# chef symbols, we prefer those
|
249
|
+
options[:binary] = 3
|
250
|
+
options[:string] = 1
|
251
|
+
options[:multi_string] = 7
|
252
|
+
options[:expand_string] = 2
|
253
|
+
options[:dword] = 4
|
254
|
+
options[:dword_big_endian] = 5
|
255
|
+
options[:qword] = 11
|
256
|
+
|
257
|
+
# serverspec symbols
|
258
|
+
options[:type_string] = 1
|
259
|
+
options[:type_binary] = 3
|
260
|
+
options[:type_dword] = 4
|
261
|
+
options[:type_qword] = 11
|
262
|
+
options[:type_multistring] = 7
|
263
|
+
options[:type_expandstring] = 2
|
264
|
+
|
265
|
+
options[symbol]
|
266
|
+
end
|
267
|
+
|
268
|
+
def generate_registry_key_path_from_options
|
269
|
+
path = @options[:hive]
|
270
|
+
path += format_key_from_options
|
271
|
+
|
272
|
+
path
|
273
|
+
end
|
274
|
+
|
275
|
+
def format_key_from_options
|
276
|
+
key = @options[:key]
|
277
|
+
return '' unless key
|
278
|
+
|
279
|
+
key.start_with?('\\') ? key : "\\#{key}"
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
# for compatability with serverspec
|
284
|
+
# this is deprecated syntax and will be removed in future versions
|
285
|
+
class WindowsRegistryKey < RegistryKey
|
286
|
+
name 'windows_registry_key'
|
287
|
+
|
288
|
+
def initialize(name)
|
289
|
+
deprecated
|
290
|
+
super(name)
|
291
|
+
end
|
292
|
+
|
293
|
+
def deprecated
|
294
|
+
warn '[DEPRECATION] `windows_registry_key(reg_key)` is deprecated. Please use `registry_key(\'path\to\key\')` instead.'
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|