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,105 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Dominik Richter
|
3
|
+
# author: Christoph Hartmann
|
4
|
+
|
5
|
+
require 'parslet'
|
6
|
+
|
7
|
+
class NginxParser < Parslet::Parser
|
8
|
+
root :outermost
|
9
|
+
# only designed for rabbitmq config files for now:
|
10
|
+
rule(:outermost) { filler? >> exp.repeat }
|
11
|
+
|
12
|
+
rule(:filler?) { one_filler.repeat }
|
13
|
+
rule(:one_filler) { match('\s+') | match["\n"] | comment }
|
14
|
+
rule(:space) { match('\s+') }
|
15
|
+
rule(:comment) { str('#') >> (match["\n\r"].absent? >> any).repeat }
|
16
|
+
|
17
|
+
rule(:exp) {
|
18
|
+
section | assignment
|
19
|
+
}
|
20
|
+
rule(:assignment) {
|
21
|
+
(identifier >> values.maybe.as(:args)).as(:assignment) >> str(';') >> filler?
|
22
|
+
}
|
23
|
+
|
24
|
+
rule(:standard_identifier) {
|
25
|
+
(match('[a-zA-Z]') >> match('\S').repeat).as(:identifier) >> space >> space.repeat
|
26
|
+
}
|
27
|
+
|
28
|
+
rule(:quoted_identifier) {
|
29
|
+
str('"') >> (str('"').absent? >> any).repeat.as(:identifier) >> str('"') >> space.repeat
|
30
|
+
}
|
31
|
+
|
32
|
+
rule(:identifier) {
|
33
|
+
standard_identifier | quoted_identifier
|
34
|
+
}
|
35
|
+
|
36
|
+
rule(:standard_value) {
|
37
|
+
((match(/[#;{'"]/).absent? >> any) >> (
|
38
|
+
str('\\') >> any | match('[#;{]|\s').absent? >> any
|
39
|
+
).repeat).as(:value) >> space.repeat
|
40
|
+
}
|
41
|
+
|
42
|
+
rule(:single_quoted_value) {
|
43
|
+
str("'") >> (
|
44
|
+
str('\\') >> any | str("'").absent? >> any
|
45
|
+
).repeat.as(:value) >> str("'") >> space.repeat
|
46
|
+
}
|
47
|
+
|
48
|
+
rule(:double_quoted_value) {
|
49
|
+
str('"') >> (
|
50
|
+
str('\\') >> any | str('"').absent? >> any
|
51
|
+
).repeat.as(:value) >> str('"') >> space.repeat
|
52
|
+
}
|
53
|
+
|
54
|
+
rule(:quoted_value) {
|
55
|
+
single_quoted_value | double_quoted_value
|
56
|
+
}
|
57
|
+
|
58
|
+
rule(:value) {
|
59
|
+
standard_value | quoted_value
|
60
|
+
}
|
61
|
+
|
62
|
+
rule(:values) {
|
63
|
+
value.repeat >> space.maybe
|
64
|
+
}
|
65
|
+
|
66
|
+
rule(:section) {
|
67
|
+
identifier.as(:section) >> values.maybe.as(:args) >> str('{') >> filler? >> exp.repeat.as(:expressions) >> str('}') >> filler?
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
class NginxTransform < Parslet::Transform
|
72
|
+
Group = Struct.new(:id, :args, :body)
|
73
|
+
Exp = Struct.new(:key, :vals)
|
74
|
+
|
75
|
+
def self.assemble_binary(seq)
|
76
|
+
b = ErlangBitstream.new
|
77
|
+
seq.each { |i| b.add(i) }
|
78
|
+
b.value
|
79
|
+
end
|
80
|
+
|
81
|
+
rule(section: { identifier: simple(:x) }, args: subtree(:y), expressions: subtree(:z)) { Group.new(x.to_s, y, z) }
|
82
|
+
rule(assignment: { identifier: simple(:x), args: subtree(:y) }) { Exp.new(x.to_s, y) }
|
83
|
+
rule(value: simple(:x)) { x.to_s }
|
84
|
+
end
|
85
|
+
|
86
|
+
class NginxConfig
|
87
|
+
def self.parse(content)
|
88
|
+
lex = NginxParser.new.parse(content)
|
89
|
+
tree = NginxTransform.new.apply(lex)
|
90
|
+
gtree = NginxTransform::Group.new(nil, '', tree)
|
91
|
+
read_nginx_group(gtree)
|
92
|
+
rescue Parslet::ParseFailed => err
|
93
|
+
raise "Failed to parse NginX config: #{err}"
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.read_nginx_group(t)
|
97
|
+
agg_conf = Hash.new([])
|
98
|
+
agg_conf['_'] = t.args unless t.args == ''
|
99
|
+
|
100
|
+
groups, conf = t.body.partition { |i| i.is_a? NginxTransform::Group }
|
101
|
+
conf.each { |x| agg_conf[x.key] += [x.vals] }
|
102
|
+
groups.each { |x| agg_conf[x.id] += [read_nginx_group(x)] }
|
103
|
+
agg_conf
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Dominik Richter
|
3
|
+
# author: Christoph Hartmann
|
4
|
+
module ObjectTraverser
|
5
|
+
def extract_value(keys, value)
|
6
|
+
return nil if value.nil?
|
7
|
+
|
8
|
+
key = keys.shift
|
9
|
+
return nil if key.nil?
|
10
|
+
|
11
|
+
# if the current value is not a Hash or Array, it is undefined
|
12
|
+
# behavior so value will be assigned nil by default.
|
13
|
+
value = if value.is_a?(Array)
|
14
|
+
extract_from_array(key, value)
|
15
|
+
elsif value.is_a?(Hash)
|
16
|
+
extract_from_hash(key, value)
|
17
|
+
end
|
18
|
+
|
19
|
+
# if there are no more keys, just return the value
|
20
|
+
return value if keys.first.nil?
|
21
|
+
# if there are more keys, extract more
|
22
|
+
extract_value(keys.clone, value)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# If the values to return from is an Array, allow returning by index.
|
28
|
+
# Otherwise, support methods on the Array itself.
|
29
|
+
def extract_from_array(key, value)
|
30
|
+
if key.is_a?(Integer)
|
31
|
+
value[key]
|
32
|
+
elsif value.respond_to?(key.to_sym)
|
33
|
+
value.send(key.to_sym)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# for Hashes, try to return the value by the key.
|
38
|
+
# We first try to find by the raw key before we stringify
|
39
|
+
# if the keys themselves are symbols, for example.
|
40
|
+
#
|
41
|
+
# This will return nil default if we can't find the key.
|
42
|
+
def extract_from_hash(key, value)
|
43
|
+
if value.key?(key)
|
44
|
+
value[key]
|
45
|
+
elsif value.key?(key.to_s)
|
46
|
+
value[key.to_s]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/utils/parser.rb
ADDED
@@ -0,0 +1,274 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
|
5
|
+
module PasswdParser
|
6
|
+
# Parse /etc/passwd files.
|
7
|
+
#
|
8
|
+
# @param [String] content the raw content of /etc/passwd
|
9
|
+
# @return [Array] Collection of passwd entries
|
10
|
+
def parse_passwd(content)
|
11
|
+
content.to_s.split("\n").map do |line|
|
12
|
+
next if line[0] == '#'
|
13
|
+
parse_passwd_line(line)
|
14
|
+
end.compact
|
15
|
+
end
|
16
|
+
|
17
|
+
# Parse a line of /etc/passwd
|
18
|
+
#
|
19
|
+
# @param [String] line a line of /etc/passwd
|
20
|
+
# @return [Hash] Map of entries in this line
|
21
|
+
def parse_passwd_line(line)
|
22
|
+
x = line.split(':')
|
23
|
+
{
|
24
|
+
'user' => x.at(0),
|
25
|
+
'password' => x.at(1),
|
26
|
+
'uid' => x.at(2),
|
27
|
+
'gid' => x.at(3),
|
28
|
+
'desc' => x.at(4),
|
29
|
+
'home' => x.at(5),
|
30
|
+
'shell' => x.at(6),
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
module CommentParser
|
36
|
+
# Parse a line with a command. For example: `a = b # comment`.
|
37
|
+
# Retrieves the actual content.
|
38
|
+
#
|
39
|
+
# @param [String] raw the content lines you want to be parsed
|
40
|
+
# @param [Hash] opts optional configuration
|
41
|
+
# @return [Array] contains the actual line and the position of the line end
|
42
|
+
def parse_comment_line(raw, opts)
|
43
|
+
idx_nl = raw.index("\n")
|
44
|
+
idx_comment = raw.index(opts[:comment_char])
|
45
|
+
idx_nl = raw.length if idx_nl.nil?
|
46
|
+
idx_comment = idx_nl + 1 if idx_comment.nil?
|
47
|
+
line = ''
|
48
|
+
|
49
|
+
# is a comment inside this line
|
50
|
+
if idx_comment < idx_nl && idx_comment != 0
|
51
|
+
line = raw[0..(idx_comment - 1)]
|
52
|
+
# in case we don't allow comments at the end
|
53
|
+
# of an assignment/statement, ignore it and fall
|
54
|
+
# back to treating this as a regular line
|
55
|
+
if opts[:standalone_comments] && !is_empty_line(line)
|
56
|
+
line = raw[0..(idx_nl - 1)]
|
57
|
+
end
|
58
|
+
# if there is no comment in this line
|
59
|
+
elsif idx_comment > idx_nl && idx_nl != 0
|
60
|
+
line = raw[0..(idx_nl - 1)]
|
61
|
+
end
|
62
|
+
[line, idx_nl]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
module LinuxMountParser
|
67
|
+
# this parses the output of mount command (only tested on linux)
|
68
|
+
# this method expects only one line of the mount output
|
69
|
+
def parse_mount_options(mount_line, compatibility = false)
|
70
|
+
if includes_whitespaces?(mount_line)
|
71
|
+
# Device-/Sharenames and Mountpoints including whitespaces require special treatment:
|
72
|
+
# We use the keyword ' type ' to split up and rebuild the desired array of fields
|
73
|
+
type_split = mount_line.split(' type ')
|
74
|
+
fs_path = type_split[0]
|
75
|
+
other_opts = type_split[1]
|
76
|
+
fs, path = fs_path.match(%r{^(.+?)\son\s(/.+?)$}).captures
|
77
|
+
mount = [fs, 'on', path, 'type']
|
78
|
+
mount.concat(other_opts.scan(/\S+/))
|
79
|
+
else
|
80
|
+
# ... otherwise we just split the fields by whitespaces
|
81
|
+
mount = mount_line.scan(/\S+/)
|
82
|
+
end
|
83
|
+
|
84
|
+
# parse device and type
|
85
|
+
mount_options = { device: mount[0], type: mount[4] }
|
86
|
+
|
87
|
+
if compatibility == false
|
88
|
+
# parse options as array
|
89
|
+
mount_options[:options] = mount[5].gsub(/\(|\)/, '').split(',')
|
90
|
+
else
|
91
|
+
# parse options as serverspec uses it, tbis is deprecated
|
92
|
+
mount_options[:options] = {}
|
93
|
+
mount[5].gsub(/\(|\)/, '').split(',').each do |option|
|
94
|
+
name, val = option.split('=')
|
95
|
+
if val.nil?
|
96
|
+
val = true
|
97
|
+
elsif val =~ /^\d+$/
|
98
|
+
# parse numbers
|
99
|
+
val = val.to_i
|
100
|
+
end
|
101
|
+
mount_options[:options][name.to_sym] = val
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
mount_options
|
106
|
+
end
|
107
|
+
|
108
|
+
# Device-/Sharename or Mountpoint includes whitespaces?
|
109
|
+
def includes_whitespaces?(mount_line)
|
110
|
+
ws = mount_line.match(/^(.+)\son\s(.+)\stype\s.*$/)
|
111
|
+
ws.captures[0].include?(' ') or ws.captures[1].include?(' ')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
module BsdMountParser
|
116
|
+
# this parses the output of mount command (only tested on freebsd)
|
117
|
+
# this method expects only one line of the mount output
|
118
|
+
def parse_mount_options(mount_line, _compatibility = false)
|
119
|
+
return {} if mount_line.nil? || mount_line.empty?
|
120
|
+
|
121
|
+
mount = mount_line.chomp.split(' ', 4)
|
122
|
+
options = mount[3].tr('()', '').split(', ')
|
123
|
+
|
124
|
+
# parse device and type
|
125
|
+
{ device: mount[0], type: options.shift, options: options }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
module SolarisNetstatParser
|
130
|
+
# takes this as a input and parses the values
|
131
|
+
# UDP: IPv4
|
132
|
+
# Local Address Remote Address State
|
133
|
+
# -------------------- -------------------- ----------
|
134
|
+
# *.* Unbound
|
135
|
+
def parse_netstat(content) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize
|
136
|
+
return [] if content.nil? || content.empty?
|
137
|
+
|
138
|
+
protocol = nil
|
139
|
+
column_widths = nil
|
140
|
+
ports = []
|
141
|
+
cache_name_line = nil
|
142
|
+
|
143
|
+
content.each_line { |line|
|
144
|
+
# find header, its delimiter
|
145
|
+
if line =~ /TCP:|UDP:|SCTP:/
|
146
|
+
# get protocol
|
147
|
+
protocol = line.split(':')[0].chomp.strip.downcase
|
148
|
+
|
149
|
+
# determine version tcp, tcp6, udp, udp6
|
150
|
+
proto_version = line.split(':')[1].chomp.strip
|
151
|
+
protocol += '6' if proto_version == 'IPv6'
|
152
|
+
|
153
|
+
# reset names cache
|
154
|
+
column_widths = nil
|
155
|
+
cache_name_line = nil
|
156
|
+
names = nil
|
157
|
+
# calulate width of a column based on the horizontal line
|
158
|
+
elsif line =~ /^[- ]+$/
|
159
|
+
column_widths = columns(line)
|
160
|
+
# parse header values from line
|
161
|
+
elsif column_widths.nil? && !line.nil?
|
162
|
+
# we do not know the width at this point of time, therefore we need to cache
|
163
|
+
cache_name_line = line
|
164
|
+
# content line
|
165
|
+
elsif !column_widths.nil? && !line.nil? && !line.chomp.empty?
|
166
|
+
# default row
|
167
|
+
port = split_columns(column_widths, line).to_a.map { |v| v.chomp.strip }
|
168
|
+
|
169
|
+
# parse the header names
|
170
|
+
# TODO: names should be optional
|
171
|
+
names = split_columns(column_widths, cache_name_line).to_a.map { |v| v.chomp.strip.downcase.tr(' ', '-').gsub(/[^\w-]/, '_') }
|
172
|
+
info = {
|
173
|
+
'protocol' => protocol.downcase,
|
174
|
+
}
|
175
|
+
|
176
|
+
# generate hash for each line and use the names as keys
|
177
|
+
names.each_index { |i|
|
178
|
+
info[names[i]] = port[i] if i != 0
|
179
|
+
}
|
180
|
+
|
181
|
+
ports.push(info)
|
182
|
+
end
|
183
|
+
}
|
184
|
+
ports
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
|
189
|
+
# takes a line like "-------------------- -------------------- ----------"
|
190
|
+
# as input and calculates the length of each column
|
191
|
+
def columns(line)
|
192
|
+
# find all columns
|
193
|
+
m = line.scan(/-+/)
|
194
|
+
# calculate the length each column
|
195
|
+
m.map { |x| x.length } # rubocop:disable Style/SymbolProc
|
196
|
+
end
|
197
|
+
|
198
|
+
# takes a line and the width of the columns to extract the values
|
199
|
+
def split_columns(columns, line)
|
200
|
+
# generate regex based on columns
|
201
|
+
sep = '\\s'
|
202
|
+
length = columns.length
|
203
|
+
arr = columns.map.with_index { |x, i|
|
204
|
+
reg = "(.{#{x}})#{sep}" # add seperator between columns
|
205
|
+
reg = "(.{,#{x}})#{sep}" if i == length - 2 # make the pre-last one optional
|
206
|
+
reg = "(.{,#{x}})" if i == length - 1 # use , to say max value
|
207
|
+
reg
|
208
|
+
}
|
209
|
+
# extracts the columns
|
210
|
+
line.match(Regexp.new(arr.join))
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
# This parser for xinetd (extended Internet daemon) configuration files
|
215
|
+
module XinetdParser
|
216
|
+
def xinetd_include_dir(dir)
|
217
|
+
return [] if dir.nil?
|
218
|
+
|
219
|
+
unless inspec.file(dir).directory?
|
220
|
+
raise Inspec::Exceptions::ResourceSkipped, "Can't find folder: #{dir}"
|
221
|
+
end
|
222
|
+
|
223
|
+
files = inspec.command("find #{dir} -type f").stdout.split("\n")
|
224
|
+
files.map { |file| parse_xinetd(read_content(file)) }
|
225
|
+
end
|
226
|
+
|
227
|
+
def parse_xinetd(raw) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
228
|
+
return {} if raw.nil?
|
229
|
+
res = {}
|
230
|
+
cur_group = nil
|
231
|
+
simple_conf = []
|
232
|
+
rest = raw + "\n"
|
233
|
+
until rest.empty?
|
234
|
+
# extract content line
|
235
|
+
nl = rest.index("\n") || (rest.length-1)
|
236
|
+
comment = rest.index('#') || (rest.length-1)
|
237
|
+
dst_idx = comment < nl ? comment : nl
|
238
|
+
inner_line = dst_idx == 0 ? '' : rest[0..dst_idx-1].strip
|
239
|
+
# update unparsed content
|
240
|
+
rest = rest[nl+1..-1]
|
241
|
+
next if inner_line.empty?
|
242
|
+
|
243
|
+
if inner_line == '}'
|
244
|
+
if cur_group == 'defaults'
|
245
|
+
res[cur_group] = SimpleConfig.new(simple_conf.join("\n"))
|
246
|
+
else
|
247
|
+
res[cur_group] ||= []
|
248
|
+
res[cur_group].push(SimpleConfig.new(simple_conf.join("\n")))
|
249
|
+
end
|
250
|
+
cur_group = nil
|
251
|
+
elsif rest.lstrip[0] == '{'
|
252
|
+
cur_group = inner_line
|
253
|
+
simple_conf = []
|
254
|
+
rest = rest[rest.index("\n")+1..-1]
|
255
|
+
elsif cur_group.nil?
|
256
|
+
# parse all included files
|
257
|
+
others = xinetd_include_dir(inner_line[/includedir (.+)/, 1])
|
258
|
+
|
259
|
+
# complex merging of included configurations, as multiple services
|
260
|
+
# may be defined with the same name but different configuration
|
261
|
+
others.each { |ores|
|
262
|
+
ores.each { |k, v|
|
263
|
+
res[k] ||= []
|
264
|
+
res[k].concat(v)
|
265
|
+
}
|
266
|
+
}
|
267
|
+
else
|
268
|
+
simple_conf.push(inner_line)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
res
|
273
|
+
end
|
274
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PkeyReader
|
2
|
+
def read_pkey(filecontent, passphrase)
|
3
|
+
raise_if_default(passphrase)
|
4
|
+
|
5
|
+
OpenSSL::PKey.read(filecontent, passphrase)
|
6
|
+
rescue OpenSSL::PKey::PKeyError
|
7
|
+
raise Inspec::Exceptions::ResourceFailed, 'passphrase error'
|
8
|
+
end
|
9
|
+
|
10
|
+
def raise_if_default(passphrase)
|
11
|
+
if passphrase.is_a? Inspec::Attribute::DEFAULT_ATTRIBUTE
|
12
|
+
raise Inspec::Exceptions::ResourceFailed, 'Please provide default value for attribute'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|