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,33 +1,33 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
# author: Dominik Richter
|
|
3
|
-
# author: Christoph Hartmann
|
|
4
|
-
|
|
5
|
-
module Inspec
|
|
6
|
-
class RequireLoader
|
|
7
|
-
Item = Struct.new(:content, :ref, :line, :loaded)
|
|
8
|
-
|
|
9
|
-
def initialize
|
|
10
|
-
@contents = {}
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def add(path, content, ref, line)
|
|
14
|
-
@contents[path] = Item.new(content, ref, line, false)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def load(path)
|
|
18
|
-
c = @contents[path]
|
|
19
|
-
c.loaded = true
|
|
20
|
-
res = [c.content, c.ref, c.line || 1]
|
|
21
|
-
yield res if block_given?
|
|
22
|
-
res
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def exists?(path)
|
|
26
|
-
@contents.key?(path)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def loaded?(path)
|
|
30
|
-
@contents[path].loaded == true
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# author: Dominik Richter
|
|
3
|
+
# author: Christoph Hartmann
|
|
4
|
+
|
|
5
|
+
module Inspec
|
|
6
|
+
class RequireLoader
|
|
7
|
+
Item = Struct.new(:content, :ref, :line, :loaded)
|
|
8
|
+
|
|
9
|
+
def initialize
|
|
10
|
+
@contents = {}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def add(path, content, ref, line)
|
|
14
|
+
@contents[path] = Item.new(content, ref, line, false)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def load(path)
|
|
18
|
+
c = @contents[path]
|
|
19
|
+
c.loaded = true
|
|
20
|
+
res = [c.content, c.ref, c.line || 1]
|
|
21
|
+
yield res if block_given?
|
|
22
|
+
res
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def exists?(path)
|
|
26
|
+
@contents.key?(path)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def loaded?(path)
|
|
30
|
+
@contents[path].loaded == true
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
data/lib/inspec/resource.rb
CHANGED
|
@@ -1,186 +1,186 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
# copyright: 2015, Vulcano Security GmbH
|
|
3
|
-
# author: Dominik Richter
|
|
4
|
-
# author: Christoph Hartmann
|
|
5
|
-
require 'inspec/plugins'
|
|
6
|
-
|
|
7
|
-
module Inspec
|
|
8
|
-
class ProfileNotFound < StandardError; end
|
|
9
|
-
|
|
10
|
-
class Resource
|
|
11
|
-
def self.default_registry
|
|
12
|
-
@default_registry ||= {}
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def self.registry
|
|
16
|
-
@registry ||= default_registry
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def self.supports
|
|
20
|
-
@supports ||= {}
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def self.new_registry
|
|
24
|
-
default_registry.dup
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Creates the inner DSL which includes all resources for
|
|
28
|
-
# creating tests. It is always connected to one target,
|
|
29
|
-
# which is specified via the backend argument.
|
|
30
|
-
#
|
|
31
|
-
# @param backend [BackendRunner] exposing the target to resources
|
|
32
|
-
# @return [ResourcesDSL]
|
|
33
|
-
def self.create_dsl(profile_context)
|
|
34
|
-
backend = profile_context.backend
|
|
35
|
-
my_registry = profile_context.resource_registry
|
|
36
|
-
|
|
37
|
-
Module.new do
|
|
38
|
-
define_method :resource_class do |profile_name, resource_name|
|
|
39
|
-
inner_context = if profile_name == profile_context.profile_id
|
|
40
|
-
profile_context
|
|
41
|
-
else
|
|
42
|
-
profile_context.subcontext_by_name(profile_name)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
raise ProfileNotFound, "Cannot find profile named: #{profile_name}" if inner_context.nil?
|
|
46
|
-
inner_context.resource_registry[resource_name]
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
my_registry.each do |id, r|
|
|
50
|
-
define_method id.to_sym do |*args|
|
|
51
|
-
r.new(backend, id.to_s, *args)
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
define_method :inspec do
|
|
56
|
-
backend
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Retrieve the base class for creating a new resource.
|
|
63
|
-
# Create classes that inherit from this class.
|
|
64
|
-
#
|
|
65
|
-
# @param [int] version the resource version to use
|
|
66
|
-
# @return [Resource] base class for creating a new resource
|
|
67
|
-
def self.resource(version)
|
|
68
|
-
validate_resource_dsl_version!(version)
|
|
69
|
-
Inspec::Plugins::Resource
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def self.validate_resource_dsl_version!(version)
|
|
73
|
-
raise 'Only resource version 1 is supported!' if version != 1
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# Many resources use FilterTable.
|
|
78
|
-
require 'utils/filter'
|
|
79
|
-
|
|
80
|
-
# AWS resources are included via their own file.
|
|
81
|
-
require 'resource_support/aws'
|
|
82
|
-
|
|
83
|
-
require 'resources/azure/azure_backend.rb'
|
|
84
|
-
require 'resources/azure/azure_generic_resource.rb'
|
|
85
|
-
require 'resources/azure/azure_resource_group.rb'
|
|
86
|
-
require 'resources/azure/azure_virtual_machine.rb'
|
|
87
|
-
require 'resources/azure/azure_virtual_machine_data_disk.rb'
|
|
88
|
-
require 'resources/aide_conf'
|
|
89
|
-
require 'resources/apache'
|
|
90
|
-
require 'resources/apache_conf'
|
|
91
|
-
require 'resources/apt'
|
|
92
|
-
require 'resources/audit_policy'
|
|
93
|
-
require 'resources/auditd'
|
|
94
|
-
require 'resources/auditd_conf'
|
|
95
|
-
require 'resources/bash'
|
|
96
|
-
require 'resources/bond'
|
|
97
|
-
require 'resources/bridge'
|
|
98
|
-
require 'resources/command'
|
|
99
|
-
require 'resources/cran'
|
|
100
|
-
require 'resources/cpan'
|
|
101
|
-
require 'resources/crontab'
|
|
102
|
-
require 'resources/dh_params'
|
|
103
|
-
require 'resources/directory'
|
|
104
|
-
require 'resources/docker'
|
|
105
|
-
require 'resources/docker_container'
|
|
106
|
-
require 'resources/docker_image'
|
|
107
|
-
require 'resources/docker_service'
|
|
108
|
-
require 'resources/elasticsearch'
|
|
109
|
-
require 'resources/etc_fstab'
|
|
110
|
-
require 'resources/etc_group'
|
|
111
|
-
require 'resources/etc_hosts_allow_deny'
|
|
112
|
-
require 'resources/etc_hosts'
|
|
113
|
-
require 'resources/file'
|
|
114
|
-
require 'resources/filesystem'
|
|
115
|
-
require 'resources/firewalld'
|
|
116
|
-
require 'resources/gem'
|
|
117
|
-
require 'resources/groups'
|
|
118
|
-
require 'resources/grub_conf'
|
|
119
|
-
require 'resources/host'
|
|
120
|
-
require 'resources/http'
|
|
121
|
-
require 'resources/iis_app'
|
|
122
|
-
require 'resources/iis_site'
|
|
123
|
-
require 'resources/inetd_conf'
|
|
124
|
-
require 'resources/interface'
|
|
125
|
-
require 'resources/iptables'
|
|
126
|
-
require 'resources/json'
|
|
127
|
-
require 'resources/kernel_module'
|
|
128
|
-
require 'resources/kernel_parameter'
|
|
129
|
-
require 'resources/key_rsa'
|
|
130
|
-
require 'resources/limits_conf'
|
|
131
|
-
require 'resources/login_def'
|
|
132
|
-
require 'resources/mount'
|
|
133
|
-
require 'resources/mssql_session'
|
|
134
|
-
require 'resources/mysql'
|
|
135
|
-
require 'resources/mysql_conf'
|
|
136
|
-
require 'resources/mysql_session'
|
|
137
|
-
require 'resources/nginx'
|
|
138
|
-
require 'resources/nginx_conf'
|
|
139
|
-
require 'resources/npm'
|
|
140
|
-
require 'resources/ntp_conf'
|
|
141
|
-
require 'resources/oneget'
|
|
142
|
-
require 'resources/oracledb_session'
|
|
143
|
-
require 'resources/os'
|
|
144
|
-
require 'resources/os_env'
|
|
145
|
-
require 'resources/package'
|
|
146
|
-
require 'resources/packages'
|
|
147
|
-
require 'resources/parse_config'
|
|
148
|
-
require 'resources/passwd'
|
|
149
|
-
require 'resources/pip'
|
|
150
|
-
require 'resources/platform'
|
|
151
|
-
require 'resources/port'
|
|
152
|
-
require 'resources/postgres'
|
|
153
|
-
require 'resources/postgres_conf'
|
|
154
|
-
require 'resources/postgres_hba_conf'
|
|
155
|
-
require 'resources/postgres_ident_conf'
|
|
156
|
-
require 'resources/postgres_session'
|
|
157
|
-
require 'resources/powershell'
|
|
158
|
-
require 'resources/processes'
|
|
159
|
-
require 'resources/rabbitmq_conf'
|
|
160
|
-
require 'resources/registry_key'
|
|
161
|
-
require 'resources/security_policy'
|
|
162
|
-
require 'resources/service'
|
|
163
|
-
require 'resources/shadow'
|
|
164
|
-
require 'resources/ssh_conf'
|
|
165
|
-
require 'resources/ssl'
|
|
166
|
-
require 'resources/sys_info'
|
|
167
|
-
require 'resources/toml'
|
|
168
|
-
require 'resources/users'
|
|
169
|
-
require 'resources/vbscript'
|
|
170
|
-
require 'resources/virtualization'
|
|
171
|
-
require 'resources/windows_feature'
|
|
172
|
-
require 'resources/windows_hotfix'
|
|
173
|
-
require 'resources/windows_task'
|
|
174
|
-
require 'resources/wmi'
|
|
175
|
-
require 'resources/x509_certificate'
|
|
176
|
-
require 'resources/xinetd'
|
|
177
|
-
require 'resources/yum'
|
|
178
|
-
require 'resources/zfs_dataset'
|
|
179
|
-
require 'resources/zfs_pool'
|
|
180
|
-
|
|
181
|
-
# file formats, depend on json implementation
|
|
182
|
-
require 'resources/json'
|
|
183
|
-
require 'resources/yaml'
|
|
184
|
-
require 'resources/csv'
|
|
185
|
-
require 'resources/ini'
|
|
186
|
-
require 'resources/xml'
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
|
3
|
+
# author: Dominik Richter
|
|
4
|
+
# author: Christoph Hartmann
|
|
5
|
+
require 'inspec/plugins'
|
|
6
|
+
|
|
7
|
+
module Inspec
|
|
8
|
+
class ProfileNotFound < StandardError; end
|
|
9
|
+
|
|
10
|
+
class Resource
|
|
11
|
+
def self.default_registry
|
|
12
|
+
@default_registry ||= {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.registry
|
|
16
|
+
@registry ||= default_registry
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.supports
|
|
20
|
+
@supports ||= {}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.new_registry
|
|
24
|
+
default_registry.dup
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Creates the inner DSL which includes all resources for
|
|
28
|
+
# creating tests. It is always connected to one target,
|
|
29
|
+
# which is specified via the backend argument.
|
|
30
|
+
#
|
|
31
|
+
# @param backend [BackendRunner] exposing the target to resources
|
|
32
|
+
# @return [ResourcesDSL]
|
|
33
|
+
def self.create_dsl(profile_context)
|
|
34
|
+
backend = profile_context.backend
|
|
35
|
+
my_registry = profile_context.resource_registry
|
|
36
|
+
|
|
37
|
+
Module.new do
|
|
38
|
+
define_method :resource_class do |profile_name, resource_name|
|
|
39
|
+
inner_context = if profile_name == profile_context.profile_id
|
|
40
|
+
profile_context
|
|
41
|
+
else
|
|
42
|
+
profile_context.subcontext_by_name(profile_name)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
raise ProfileNotFound, "Cannot find profile named: #{profile_name}" if inner_context.nil?
|
|
46
|
+
inner_context.resource_registry[resource_name]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
my_registry.each do |id, r|
|
|
50
|
+
define_method id.to_sym do |*args|
|
|
51
|
+
r.new(backend, id.to_s, *args)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
define_method :inspec do
|
|
56
|
+
backend
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Retrieve the base class for creating a new resource.
|
|
63
|
+
# Create classes that inherit from this class.
|
|
64
|
+
#
|
|
65
|
+
# @param [int] version the resource version to use
|
|
66
|
+
# @return [Resource] base class for creating a new resource
|
|
67
|
+
def self.resource(version)
|
|
68
|
+
validate_resource_dsl_version!(version)
|
|
69
|
+
Inspec::Plugins::Resource
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def self.validate_resource_dsl_version!(version)
|
|
73
|
+
raise 'Only resource version 1 is supported!' if version != 1
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Many resources use FilterTable.
|
|
78
|
+
require 'utils/filter'
|
|
79
|
+
|
|
80
|
+
# AWS resources are included via their own file.
|
|
81
|
+
require 'resource_support/aws'
|
|
82
|
+
|
|
83
|
+
require 'resources/azure/azure_backend.rb'
|
|
84
|
+
require 'resources/azure/azure_generic_resource.rb'
|
|
85
|
+
require 'resources/azure/azure_resource_group.rb'
|
|
86
|
+
require 'resources/azure/azure_virtual_machine.rb'
|
|
87
|
+
require 'resources/azure/azure_virtual_machine_data_disk.rb'
|
|
88
|
+
require 'resources/aide_conf'
|
|
89
|
+
require 'resources/apache'
|
|
90
|
+
require 'resources/apache_conf'
|
|
91
|
+
require 'resources/apt'
|
|
92
|
+
require 'resources/audit_policy'
|
|
93
|
+
require 'resources/auditd'
|
|
94
|
+
require 'resources/auditd_conf'
|
|
95
|
+
require 'resources/bash'
|
|
96
|
+
require 'resources/bond'
|
|
97
|
+
require 'resources/bridge'
|
|
98
|
+
require 'resources/command'
|
|
99
|
+
require 'resources/cran'
|
|
100
|
+
require 'resources/cpan'
|
|
101
|
+
require 'resources/crontab'
|
|
102
|
+
require 'resources/dh_params'
|
|
103
|
+
require 'resources/directory'
|
|
104
|
+
require 'resources/docker'
|
|
105
|
+
require 'resources/docker_container'
|
|
106
|
+
require 'resources/docker_image'
|
|
107
|
+
require 'resources/docker_service'
|
|
108
|
+
require 'resources/elasticsearch'
|
|
109
|
+
require 'resources/etc_fstab'
|
|
110
|
+
require 'resources/etc_group'
|
|
111
|
+
require 'resources/etc_hosts_allow_deny'
|
|
112
|
+
require 'resources/etc_hosts'
|
|
113
|
+
require 'resources/file'
|
|
114
|
+
require 'resources/filesystem'
|
|
115
|
+
require 'resources/firewalld'
|
|
116
|
+
require 'resources/gem'
|
|
117
|
+
require 'resources/groups'
|
|
118
|
+
require 'resources/grub_conf'
|
|
119
|
+
require 'resources/host'
|
|
120
|
+
require 'resources/http'
|
|
121
|
+
require 'resources/iis_app'
|
|
122
|
+
require 'resources/iis_site'
|
|
123
|
+
require 'resources/inetd_conf'
|
|
124
|
+
require 'resources/interface'
|
|
125
|
+
require 'resources/iptables'
|
|
126
|
+
require 'resources/json'
|
|
127
|
+
require 'resources/kernel_module'
|
|
128
|
+
require 'resources/kernel_parameter'
|
|
129
|
+
require 'resources/key_rsa'
|
|
130
|
+
require 'resources/limits_conf'
|
|
131
|
+
require 'resources/login_def'
|
|
132
|
+
require 'resources/mount'
|
|
133
|
+
require 'resources/mssql_session'
|
|
134
|
+
require 'resources/mysql'
|
|
135
|
+
require 'resources/mysql_conf'
|
|
136
|
+
require 'resources/mysql_session'
|
|
137
|
+
require 'resources/nginx'
|
|
138
|
+
require 'resources/nginx_conf'
|
|
139
|
+
require 'resources/npm'
|
|
140
|
+
require 'resources/ntp_conf'
|
|
141
|
+
require 'resources/oneget'
|
|
142
|
+
require 'resources/oracledb_session'
|
|
143
|
+
require 'resources/os'
|
|
144
|
+
require 'resources/os_env'
|
|
145
|
+
require 'resources/package'
|
|
146
|
+
require 'resources/packages'
|
|
147
|
+
require 'resources/parse_config'
|
|
148
|
+
require 'resources/passwd'
|
|
149
|
+
require 'resources/pip'
|
|
150
|
+
require 'resources/platform'
|
|
151
|
+
require 'resources/port'
|
|
152
|
+
require 'resources/postgres'
|
|
153
|
+
require 'resources/postgres_conf'
|
|
154
|
+
require 'resources/postgres_hba_conf'
|
|
155
|
+
require 'resources/postgres_ident_conf'
|
|
156
|
+
require 'resources/postgres_session'
|
|
157
|
+
require 'resources/powershell'
|
|
158
|
+
require 'resources/processes'
|
|
159
|
+
require 'resources/rabbitmq_conf'
|
|
160
|
+
require 'resources/registry_key'
|
|
161
|
+
require 'resources/security_policy'
|
|
162
|
+
require 'resources/service'
|
|
163
|
+
require 'resources/shadow'
|
|
164
|
+
require 'resources/ssh_conf'
|
|
165
|
+
require 'resources/ssl'
|
|
166
|
+
require 'resources/sys_info'
|
|
167
|
+
require 'resources/toml'
|
|
168
|
+
require 'resources/users'
|
|
169
|
+
require 'resources/vbscript'
|
|
170
|
+
require 'resources/virtualization'
|
|
171
|
+
require 'resources/windows_feature'
|
|
172
|
+
require 'resources/windows_hotfix'
|
|
173
|
+
require 'resources/windows_task'
|
|
174
|
+
require 'resources/wmi'
|
|
175
|
+
require 'resources/x509_certificate'
|
|
176
|
+
require 'resources/xinetd'
|
|
177
|
+
require 'resources/yum'
|
|
178
|
+
require 'resources/zfs_dataset'
|
|
179
|
+
require 'resources/zfs_pool'
|
|
180
|
+
|
|
181
|
+
# file formats, depend on json implementation
|
|
182
|
+
require 'resources/json'
|
|
183
|
+
require 'resources/yaml'
|
|
184
|
+
require 'resources/csv'
|
|
185
|
+
require 'resources/ini'
|
|
186
|
+
require 'resources/xml'
|
data/lib/inspec/rule.rb
CHANGED
|
@@ -1,266 +1,266 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
# copyright: 2015, Dominik Richter
|
|
3
|
-
# author: Dominik Richter
|
|
4
|
-
# author: Christoph Hartmann
|
|
5
|
-
|
|
6
|
-
require 'method_source'
|
|
7
|
-
require 'inspec/describe'
|
|
8
|
-
require 'inspec/expect'
|
|
9
|
-
|
|
10
|
-
module Inspec
|
|
11
|
-
class Rule
|
|
12
|
-
include ::RSpec::Matchers
|
|
13
|
-
|
|
14
|
-
#
|
|
15
|
-
# Include any resources from the given resource DSL. The passed
|
|
16
|
-
# resource_dsl will also be included in any Inspec::Expect objects
|
|
17
|
-
# we make.
|
|
18
|
-
#
|
|
19
|
-
# @params resource_dsl [Module]
|
|
20
|
-
# @returns [TrueClass]
|
|
21
|
-
#
|
|
22
|
-
def self.with_resource_dsl(resource_dsl)
|
|
23
|
-
include resource_dsl
|
|
24
|
-
@resource_dsl = resource_dsl
|
|
25
|
-
true
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def self.resource_dsl # rubocop:disable Style/TrivialAccessors
|
|
29
|
-
@resource_dsl
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def initialize(id, profile_id, opts, &block)
|
|
33
|
-
@impact = nil
|
|
34
|
-
@title = nil
|
|
35
|
-
@desc = nil
|
|
36
|
-
@refs = []
|
|
37
|
-
@tags = {}
|
|
38
|
-
|
|
39
|
-
# not changeable by the user:
|
|
40
|
-
@__block = block
|
|
41
|
-
@__source_location = __get_block_source_location(&block)
|
|
42
|
-
@__rule_id = id
|
|
43
|
-
@__profile_id = profile_id
|
|
44
|
-
@__checks = []
|
|
45
|
-
@__skip_rule = nil
|
|
46
|
-
@__merge_count = 0
|
|
47
|
-
@__skip_only_if_eval = opts[:skip_only_if_eval]
|
|
48
|
-
|
|
49
|
-
# evaluate the given definition
|
|
50
|
-
instance_eval(&block) if block_given?
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def to_s
|
|
54
|
-
Inspec::Rule.rule_id(self)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def id(*_)
|
|
58
|
-
# never overwrite the ID
|
|
59
|
-
@id
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def impact(v = nil)
|
|
63
|
-
@impact = v unless v.nil?
|
|
64
|
-
@impact
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def title(v = nil)
|
|
68
|
-
@title = v unless v.nil?
|
|
69
|
-
@title
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def desc(v = nil)
|
|
73
|
-
@desc = unindent(v) unless v.nil?
|
|
74
|
-
@desc
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def ref(ref = nil, opts = {})
|
|
78
|
-
return @refs if ref.nil? && opts.empty?
|
|
79
|
-
if opts.empty? && ref.is_a?(Hash)
|
|
80
|
-
opts = ref
|
|
81
|
-
else
|
|
82
|
-
opts[:ref] = ref
|
|
83
|
-
end
|
|
84
|
-
@refs.push(opts)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def tag(*args)
|
|
88
|
-
args.each do |arg|
|
|
89
|
-
if arg.is_a?(Hash)
|
|
90
|
-
@tags.merge!(arg)
|
|
91
|
-
else
|
|
92
|
-
@tags[arg] ||= nil
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
@tags
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def source_file
|
|
99
|
-
@__file
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Skip all checks if only_if is false
|
|
103
|
-
#
|
|
104
|
-
# @param [Type] &block returns true if tests are added, false otherwise
|
|
105
|
-
# @return [nil]
|
|
106
|
-
def only_if
|
|
107
|
-
return unless block_given?
|
|
108
|
-
return if @__skip_only_if_eval == true
|
|
109
|
-
|
|
110
|
-
@__skip_rule ||= !yield
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# Describe will add one or more tests to this control. There is 2 ways
|
|
114
|
-
# of calling it:
|
|
115
|
-
#
|
|
116
|
-
# describe resource do ... end
|
|
117
|
-
#
|
|
118
|
-
# or
|
|
119
|
-
#
|
|
120
|
-
# describe.one do ... end
|
|
121
|
-
#
|
|
122
|
-
# @param [any] Resource to be describe, string, or nil
|
|
123
|
-
# @param [Proc] An optional block containing tests for the described resource
|
|
124
|
-
# @return [nil|DescribeBase] if called without arguments, returns DescribeBase
|
|
125
|
-
def describe(*values, &block)
|
|
126
|
-
if values.empty? && !block_given?
|
|
127
|
-
dsl = self.class.ancestors[1]
|
|
128
|
-
Class.new(DescribeBase) do
|
|
129
|
-
include dsl
|
|
130
|
-
end.new(method(:__add_check))
|
|
131
|
-
else
|
|
132
|
-
__add_check('describe', values, with_dsl(block))
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def expect(value, &block)
|
|
137
|
-
target = Inspec::Expect.new(value, &with_dsl(block))
|
|
138
|
-
__add_check('expect', [value], target)
|
|
139
|
-
target
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def self.rule_id(rule)
|
|
143
|
-
rule.instance_variable_get(:@__rule_id)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def self.set_rule_id(rule, value)
|
|
147
|
-
rule.instance_variable_set(:@__rule_id, value)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
def self.profile_id(rule)
|
|
151
|
-
rule.instance_variable_get(:@__profile_id)
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def self.checks(rule)
|
|
155
|
-
rule.instance_variable_get(:@__checks)
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def self.skip_status(rule)
|
|
159
|
-
rule.instance_variable_get(:@__skip_rule)
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
def self.set_skip_rule(rule, value)
|
|
163
|
-
rule.instance_variable_set(:@__skip_rule, value)
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def self.merge_count(rule)
|
|
167
|
-
rule.instance_variable_get(:@__merge_count)
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def self.prepare_checks(rule)
|
|
171
|
-
msg = skip_status(rule)
|
|
172
|
-
return checks(rule) unless msg
|
|
173
|
-
msg = 'Skipped control due to only_if condition.' if msg == true
|
|
174
|
-
|
|
175
|
-
# TODO: we use os as the carrier here, but should consider
|
|
176
|
-
# a separate resource to do skipping
|
|
177
|
-
resource = rule.os
|
|
178
|
-
resource.skip_resource(msg)
|
|
179
|
-
[['describe', [resource], nil]]
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def self.merge(dst, src)
|
|
183
|
-
if src.id != dst.id
|
|
184
|
-
# TODO: register an error, this case should not happen
|
|
185
|
-
return
|
|
186
|
-
end
|
|
187
|
-
sp = rule_id(src)
|
|
188
|
-
dp = rule_id(dst)
|
|
189
|
-
if sp != dp
|
|
190
|
-
# TODO: register an error, this case should not happen
|
|
191
|
-
return
|
|
192
|
-
end
|
|
193
|
-
# merge all fields
|
|
194
|
-
dst.impact(src.impact) unless src.impact.nil?
|
|
195
|
-
dst.title(src.title) unless src.title.nil?
|
|
196
|
-
dst.desc(src.desc) unless src.desc.nil?
|
|
197
|
-
# merge indirect fields
|
|
198
|
-
# checks defined in the source will completely eliminate
|
|
199
|
-
# all checks that were defined in the destination
|
|
200
|
-
sc = checks(src)
|
|
201
|
-
dst.instance_variable_set(:@__checks, sc) unless sc.empty?
|
|
202
|
-
sr = skip_status(src)
|
|
203
|
-
set_skip_rule(dst, sr) unless sr.nil?
|
|
204
|
-
# increment merge count
|
|
205
|
-
dst.instance_variable_set(:@__merge_count, merge_count(dst) + 1)
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
private
|
|
209
|
-
|
|
210
|
-
def __add_check(describe_or_expect, values, block)
|
|
211
|
-
@__checks.push([describe_or_expect, values, block])
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
#
|
|
215
|
-
# Takes a block and returns a block that will run the given block
|
|
216
|
-
# with access to the resource_dsl of the current class. This is to
|
|
217
|
-
# ensure that inside the constructed Rspec::ExampleGroup users
|
|
218
|
-
# have access to DSL methods. Previous this was done in
|
|
219
|
-
# Inspec::Runner before sending the example groups to rspec. It
|
|
220
|
-
# was moved here to ensure that code inside `its` blocks hae the
|
|
221
|
-
# same visibility into resources as code outside its blocks.
|
|
222
|
-
#
|
|
223
|
-
# @param [Proc] block
|
|
224
|
-
# @return [Proc]
|
|
225
|
-
#
|
|
226
|
-
def with_dsl(block)
|
|
227
|
-
return nil if block.nil?
|
|
228
|
-
if self.class.resource_dsl
|
|
229
|
-
dsl = self.class.resource_dsl
|
|
230
|
-
proc do |*args|
|
|
231
|
-
include dsl
|
|
232
|
-
instance_exec(*args, &block)
|
|
233
|
-
end
|
|
234
|
-
else
|
|
235
|
-
block
|
|
236
|
-
end
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
# Idio(ma)tic unindent, behaves similar to Ruby2.3 curly heredocs.
|
|
240
|
-
# Find the shortest indentation of non-empty lines and strip that from every line
|
|
241
|
-
# See: https://bugs.ruby-lang.org/issues/9098
|
|
242
|
-
#
|
|
243
|
-
# It is implemented here to support pre-Ruby2.3 with this feature and
|
|
244
|
-
# to not force non-programmers to understand heredocs.
|
|
245
|
-
#
|
|
246
|
-
# Please note: tabs are not supported! (they will be removed but they are not
|
|
247
|
-
# treated the same as in Ruby2.3 heredocs)
|
|
248
|
-
#
|
|
249
|
-
# @param [String] text string which needs to be unindented
|
|
250
|
-
# @return [String] input with indentation removed; '' if input is nil
|
|
251
|
-
def unindent(text)
|
|
252
|
-
return '' if text.nil?
|
|
253
|
-
len = text.split("\n").reject { |l| l.strip.empty? }.map { |x| x.index(/[^\s]/) }.compact.min
|
|
254
|
-
text.gsub(/^[[:blank:]]{#{len}}/, '').strip
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
# get the source location of the block
|
|
258
|
-
def __get_block_source_location(&block)
|
|
259
|
-
return {} unless block_given?
|
|
260
|
-
r, l = block.source_location
|
|
261
|
-
{ ref: r, line: l }
|
|
262
|
-
rescue MethodSource::SourceNotFoundError
|
|
263
|
-
{}
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# copyright: 2015, Dominik Richter
|
|
3
|
+
# author: Dominik Richter
|
|
4
|
+
# author: Christoph Hartmann
|
|
5
|
+
|
|
6
|
+
require 'method_source'
|
|
7
|
+
require 'inspec/describe'
|
|
8
|
+
require 'inspec/expect'
|
|
9
|
+
|
|
10
|
+
module Inspec
|
|
11
|
+
class Rule
|
|
12
|
+
include ::RSpec::Matchers
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Include any resources from the given resource DSL. The passed
|
|
16
|
+
# resource_dsl will also be included in any Inspec::Expect objects
|
|
17
|
+
# we make.
|
|
18
|
+
#
|
|
19
|
+
# @params resource_dsl [Module]
|
|
20
|
+
# @returns [TrueClass]
|
|
21
|
+
#
|
|
22
|
+
def self.with_resource_dsl(resource_dsl)
|
|
23
|
+
include resource_dsl
|
|
24
|
+
@resource_dsl = resource_dsl
|
|
25
|
+
true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.resource_dsl # rubocop:disable Style/TrivialAccessors
|
|
29
|
+
@resource_dsl
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def initialize(id, profile_id, opts, &block)
|
|
33
|
+
@impact = nil
|
|
34
|
+
@title = nil
|
|
35
|
+
@desc = nil
|
|
36
|
+
@refs = []
|
|
37
|
+
@tags = {}
|
|
38
|
+
|
|
39
|
+
# not changeable by the user:
|
|
40
|
+
@__block = block
|
|
41
|
+
@__source_location = __get_block_source_location(&block)
|
|
42
|
+
@__rule_id = id
|
|
43
|
+
@__profile_id = profile_id
|
|
44
|
+
@__checks = []
|
|
45
|
+
@__skip_rule = nil
|
|
46
|
+
@__merge_count = 0
|
|
47
|
+
@__skip_only_if_eval = opts[:skip_only_if_eval]
|
|
48
|
+
|
|
49
|
+
# evaluate the given definition
|
|
50
|
+
instance_eval(&block) if block_given?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def to_s
|
|
54
|
+
Inspec::Rule.rule_id(self)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def id(*_)
|
|
58
|
+
# never overwrite the ID
|
|
59
|
+
@id
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def impact(v = nil)
|
|
63
|
+
@impact = v unless v.nil?
|
|
64
|
+
@impact
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def title(v = nil)
|
|
68
|
+
@title = v unless v.nil?
|
|
69
|
+
@title
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def desc(v = nil)
|
|
73
|
+
@desc = unindent(v) unless v.nil?
|
|
74
|
+
@desc
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def ref(ref = nil, opts = {})
|
|
78
|
+
return @refs if ref.nil? && opts.empty?
|
|
79
|
+
if opts.empty? && ref.is_a?(Hash)
|
|
80
|
+
opts = ref
|
|
81
|
+
else
|
|
82
|
+
opts[:ref] = ref
|
|
83
|
+
end
|
|
84
|
+
@refs.push(opts)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def tag(*args)
|
|
88
|
+
args.each do |arg|
|
|
89
|
+
if arg.is_a?(Hash)
|
|
90
|
+
@tags.merge!(arg)
|
|
91
|
+
else
|
|
92
|
+
@tags[arg] ||= nil
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
@tags
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def source_file
|
|
99
|
+
@__file
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Skip all checks if only_if is false
|
|
103
|
+
#
|
|
104
|
+
# @param [Type] &block returns true if tests are added, false otherwise
|
|
105
|
+
# @return [nil]
|
|
106
|
+
def only_if
|
|
107
|
+
return unless block_given?
|
|
108
|
+
return if @__skip_only_if_eval == true
|
|
109
|
+
|
|
110
|
+
@__skip_rule ||= !yield
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Describe will add one or more tests to this control. There is 2 ways
|
|
114
|
+
# of calling it:
|
|
115
|
+
#
|
|
116
|
+
# describe resource do ... end
|
|
117
|
+
#
|
|
118
|
+
# or
|
|
119
|
+
#
|
|
120
|
+
# describe.one do ... end
|
|
121
|
+
#
|
|
122
|
+
# @param [any] Resource to be describe, string, or nil
|
|
123
|
+
# @param [Proc] An optional block containing tests for the described resource
|
|
124
|
+
# @return [nil|DescribeBase] if called without arguments, returns DescribeBase
|
|
125
|
+
def describe(*values, &block)
|
|
126
|
+
if values.empty? && !block_given?
|
|
127
|
+
dsl = self.class.ancestors[1]
|
|
128
|
+
Class.new(DescribeBase) do
|
|
129
|
+
include dsl
|
|
130
|
+
end.new(method(:__add_check))
|
|
131
|
+
else
|
|
132
|
+
__add_check('describe', values, with_dsl(block))
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def expect(value, &block)
|
|
137
|
+
target = Inspec::Expect.new(value, &with_dsl(block))
|
|
138
|
+
__add_check('expect', [value], target)
|
|
139
|
+
target
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def self.rule_id(rule)
|
|
143
|
+
rule.instance_variable_get(:@__rule_id)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def self.set_rule_id(rule, value)
|
|
147
|
+
rule.instance_variable_set(:@__rule_id, value)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def self.profile_id(rule)
|
|
151
|
+
rule.instance_variable_get(:@__profile_id)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def self.checks(rule)
|
|
155
|
+
rule.instance_variable_get(:@__checks)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def self.skip_status(rule)
|
|
159
|
+
rule.instance_variable_get(:@__skip_rule)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def self.set_skip_rule(rule, value)
|
|
163
|
+
rule.instance_variable_set(:@__skip_rule, value)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def self.merge_count(rule)
|
|
167
|
+
rule.instance_variable_get(:@__merge_count)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def self.prepare_checks(rule)
|
|
171
|
+
msg = skip_status(rule)
|
|
172
|
+
return checks(rule) unless msg
|
|
173
|
+
msg = 'Skipped control due to only_if condition.' if msg == true
|
|
174
|
+
|
|
175
|
+
# TODO: we use os as the carrier here, but should consider
|
|
176
|
+
# a separate resource to do skipping
|
|
177
|
+
resource = rule.os
|
|
178
|
+
resource.skip_resource(msg)
|
|
179
|
+
[['describe', [resource], nil]]
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def self.merge(dst, src)
|
|
183
|
+
if src.id != dst.id
|
|
184
|
+
# TODO: register an error, this case should not happen
|
|
185
|
+
return
|
|
186
|
+
end
|
|
187
|
+
sp = rule_id(src)
|
|
188
|
+
dp = rule_id(dst)
|
|
189
|
+
if sp != dp
|
|
190
|
+
# TODO: register an error, this case should not happen
|
|
191
|
+
return
|
|
192
|
+
end
|
|
193
|
+
# merge all fields
|
|
194
|
+
dst.impact(src.impact) unless src.impact.nil?
|
|
195
|
+
dst.title(src.title) unless src.title.nil?
|
|
196
|
+
dst.desc(src.desc) unless src.desc.nil?
|
|
197
|
+
# merge indirect fields
|
|
198
|
+
# checks defined in the source will completely eliminate
|
|
199
|
+
# all checks that were defined in the destination
|
|
200
|
+
sc = checks(src)
|
|
201
|
+
dst.instance_variable_set(:@__checks, sc) unless sc.empty?
|
|
202
|
+
sr = skip_status(src)
|
|
203
|
+
set_skip_rule(dst, sr) unless sr.nil?
|
|
204
|
+
# increment merge count
|
|
205
|
+
dst.instance_variable_set(:@__merge_count, merge_count(dst) + 1)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
private
|
|
209
|
+
|
|
210
|
+
def __add_check(describe_or_expect, values, block)
|
|
211
|
+
@__checks.push([describe_or_expect, values, block])
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
#
|
|
215
|
+
# Takes a block and returns a block that will run the given block
|
|
216
|
+
# with access to the resource_dsl of the current class. This is to
|
|
217
|
+
# ensure that inside the constructed Rspec::ExampleGroup users
|
|
218
|
+
# have access to DSL methods. Previous this was done in
|
|
219
|
+
# Inspec::Runner before sending the example groups to rspec. It
|
|
220
|
+
# was moved here to ensure that code inside `its` blocks hae the
|
|
221
|
+
# same visibility into resources as code outside its blocks.
|
|
222
|
+
#
|
|
223
|
+
# @param [Proc] block
|
|
224
|
+
# @return [Proc]
|
|
225
|
+
#
|
|
226
|
+
def with_dsl(block)
|
|
227
|
+
return nil if block.nil?
|
|
228
|
+
if self.class.resource_dsl
|
|
229
|
+
dsl = self.class.resource_dsl
|
|
230
|
+
proc do |*args|
|
|
231
|
+
include dsl
|
|
232
|
+
instance_exec(*args, &block)
|
|
233
|
+
end
|
|
234
|
+
else
|
|
235
|
+
block
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Idio(ma)tic unindent, behaves similar to Ruby2.3 curly heredocs.
|
|
240
|
+
# Find the shortest indentation of non-empty lines and strip that from every line
|
|
241
|
+
# See: https://bugs.ruby-lang.org/issues/9098
|
|
242
|
+
#
|
|
243
|
+
# It is implemented here to support pre-Ruby2.3 with this feature and
|
|
244
|
+
# to not force non-programmers to understand heredocs.
|
|
245
|
+
#
|
|
246
|
+
# Please note: tabs are not supported! (they will be removed but they are not
|
|
247
|
+
# treated the same as in Ruby2.3 heredocs)
|
|
248
|
+
#
|
|
249
|
+
# @param [String] text string which needs to be unindented
|
|
250
|
+
# @return [String] input with indentation removed; '' if input is nil
|
|
251
|
+
def unindent(text)
|
|
252
|
+
return '' if text.nil?
|
|
253
|
+
len = text.split("\n").reject { |l| l.strip.empty? }.map { |x| x.index(/[^\s]/) }.compact.min
|
|
254
|
+
text.gsub(/^[[:blank:]]{#{len}}/, '').strip
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# get the source location of the block
|
|
258
|
+
def __get_block_source_location(&block)
|
|
259
|
+
return {} unless block_given?
|
|
260
|
+
r, l = block.source_location
|
|
261
|
+
{ ref: r, line: l }
|
|
262
|
+
rescue MethodSource::SourceNotFoundError
|
|
263
|
+
{}
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
end
|