inspec-core 2.3.10 → 2.3.23

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.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -13
  3. data/etc/plugin_filters.json +25 -0
  4. data/inspec-core.gemspec +1 -1
  5. data/lib/bundles/inspec-compliance/api.rb +3 -0
  6. data/lib/bundles/inspec-compliance/configuration.rb +3 -0
  7. data/lib/bundles/inspec-compliance/http.rb +3 -0
  8. data/lib/bundles/inspec-compliance/support.rb +3 -0
  9. data/lib/bundles/inspec-compliance/target.rb +3 -0
  10. data/lib/inspec/objects/attribute.rb +3 -0
  11. data/lib/inspec/plugin/v2.rb +3 -0
  12. data/lib/inspec/plugin/v2/filter.rb +62 -0
  13. data/lib/inspec/plugin/v2/installer.rb +21 -1
  14. data/lib/inspec/plugin/v2/loader.rb +4 -0
  15. data/lib/inspec/profile.rb +3 -1
  16. data/lib/inspec/version.rb +1 -1
  17. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli/cli_command.rb +25 -3
  18. data/lib/plugins/inspec-plugin-manager-cli/test/functional/inspec-plugin_test.rb +65 -11
  19. data/lib/plugins/inspec-plugin-manager-cli/test/unit/cli_args_test.rb +5 -1
  20. data/lib/resources/package.rb +1 -1
  21. metadata +4 -197
  22. data/docs/.gitignore +0 -2
  23. data/docs/README.md +0 -41
  24. data/docs/dev/control-eval.md +0 -62
  25. data/docs/dev/filtertable-internals.md +0 -353
  26. data/docs/dev/filtertable-usage.md +0 -533
  27. data/docs/dev/integration-testing.md +0 -31
  28. data/docs/dev/plugins.md +0 -323
  29. data/docs/dsl_inspec.md +0 -354
  30. data/docs/dsl_resource.md +0 -100
  31. data/docs/glossary.md +0 -381
  32. data/docs/habitat.md +0 -193
  33. data/docs/inspec_and_friends.md +0 -114
  34. data/docs/matchers.md +0 -161
  35. data/docs/migration.md +0 -293
  36. data/docs/platforms.md +0 -119
  37. data/docs/plugin_kitchen_inspec.md +0 -60
  38. data/docs/plugins.md +0 -57
  39. data/docs/profiles.md +0 -576
  40. data/docs/reporters.md +0 -170
  41. data/docs/resources/aide_conf.md.erb +0 -86
  42. data/docs/resources/apache.md.erb +0 -77
  43. data/docs/resources/apache_conf.md.erb +0 -78
  44. data/docs/resources/apt.md.erb +0 -81
  45. data/docs/resources/audit_policy.md.erb +0 -57
  46. data/docs/resources/auditd.md.erb +0 -89
  47. data/docs/resources/auditd_conf.md.erb +0 -78
  48. data/docs/resources/bash.md.erb +0 -85
  49. data/docs/resources/bond.md.erb +0 -100
  50. data/docs/resources/bridge.md.erb +0 -67
  51. data/docs/resources/bsd_service.md.erb +0 -77
  52. data/docs/resources/chocolatey_package.md.erb +0 -68
  53. data/docs/resources/command.md.erb +0 -176
  54. data/docs/resources/cpan.md.erb +0 -89
  55. data/docs/resources/cran.md.erb +0 -74
  56. data/docs/resources/crontab.md.erb +0 -103
  57. data/docs/resources/csv.md.erb +0 -64
  58. data/docs/resources/dh_params.md.erb +0 -221
  59. data/docs/resources/directory.md.erb +0 -40
  60. data/docs/resources/docker.md.erb +0 -240
  61. data/docs/resources/docker_container.md.erb +0 -113
  62. data/docs/resources/docker_image.md.erb +0 -104
  63. data/docs/resources/docker_plugin.md.erb +0 -80
  64. data/docs/resources/docker_service.md.erb +0 -124
  65. data/docs/resources/elasticsearch.md.erb +0 -252
  66. data/docs/resources/etc_fstab.md.erb +0 -135
  67. data/docs/resources/etc_group.md.erb +0 -85
  68. data/docs/resources/etc_hosts.md.erb +0 -88
  69. data/docs/resources/etc_hosts_allow.md.erb +0 -84
  70. data/docs/resources/etc_hosts_deny.md.erb +0 -84
  71. data/docs/resources/file.md.erb +0 -543
  72. data/docs/resources/filesystem.md.erb +0 -51
  73. data/docs/resources/firewalld.md.erb +0 -117
  74. data/docs/resources/gem.md.erb +0 -108
  75. data/docs/resources/group.md.erb +0 -71
  76. data/docs/resources/grub_conf.md.erb +0 -111
  77. data/docs/resources/host.md.erb +0 -96
  78. data/docs/resources/http.md.erb +0 -207
  79. data/docs/resources/iis_app.md.erb +0 -132
  80. data/docs/resources/iis_site.md.erb +0 -145
  81. data/docs/resources/inetd_conf.md.erb +0 -104
  82. data/docs/resources/ini.md.erb +0 -86
  83. data/docs/resources/interface.md.erb +0 -68
  84. data/docs/resources/iptables.md.erb +0 -74
  85. data/docs/resources/json.md.erb +0 -73
  86. data/docs/resources/kernel_module.md.erb +0 -130
  87. data/docs/resources/kernel_parameter.md.erb +0 -63
  88. data/docs/resources/key_rsa.md.erb +0 -95
  89. data/docs/resources/launchd_service.md.erb +0 -67
  90. data/docs/resources/limits_conf.md.erb +0 -85
  91. data/docs/resources/login_defs.md.erb +0 -81
  92. data/docs/resources/mount.md.erb +0 -79
  93. data/docs/resources/mssql_session.md.erb +0 -78
  94. data/docs/resources/mysql_conf.md.erb +0 -109
  95. data/docs/resources/mysql_session.md.erb +0 -84
  96. data/docs/resources/nginx.md.erb +0 -89
  97. data/docs/resources/nginx_conf.md.erb +0 -148
  98. data/docs/resources/npm.md.erb +0 -78
  99. data/docs/resources/ntp_conf.md.erb +0 -70
  100. data/docs/resources/oneget.md.erb +0 -63
  101. data/docs/resources/oracledb_session.md.erb +0 -103
  102. data/docs/resources/os.md.erb +0 -153
  103. data/docs/resources/os_env.md.erb +0 -101
  104. data/docs/resources/package.md.erb +0 -130
  105. data/docs/resources/packages.md.erb +0 -77
  106. data/docs/resources/parse_config.md.erb +0 -113
  107. data/docs/resources/parse_config_file.md.erb +0 -148
  108. data/docs/resources/passwd.md.erb +0 -151
  109. data/docs/resources/pip.md.erb +0 -77
  110. data/docs/resources/port.md.erb +0 -147
  111. data/docs/resources/postgres_conf.md.erb +0 -89
  112. data/docs/resources/postgres_hba_conf.md.erb +0 -103
  113. data/docs/resources/postgres_ident_conf.md.erb +0 -86
  114. data/docs/resources/postgres_session.md.erb +0 -79
  115. data/docs/resources/powershell.md.erb +0 -112
  116. data/docs/resources/processes.md.erb +0 -119
  117. data/docs/resources/rabbitmq_config.md.erb +0 -51
  118. data/docs/resources/registry_key.md.erb +0 -197
  119. data/docs/resources/runit_service.md.erb +0 -67
  120. data/docs/resources/security_policy.md.erb +0 -57
  121. data/docs/resources/service.md.erb +0 -131
  122. data/docs/resources/shadow.md.erb +0 -267
  123. data/docs/resources/ssh_config.md.erb +0 -83
  124. data/docs/resources/sshd_config.md.erb +0 -93
  125. data/docs/resources/ssl.md.erb +0 -129
  126. data/docs/resources/sys_info.md.erb +0 -52
  127. data/docs/resources/systemd_service.md.erb +0 -67
  128. data/docs/resources/sysv_service.md.erb +0 -67
  129. data/docs/resources/upstart_service.md.erb +0 -67
  130. data/docs/resources/user.md.erb +0 -150
  131. data/docs/resources/users.md.erb +0 -137
  132. data/docs/resources/vbscript.md.erb +0 -65
  133. data/docs/resources/virtualization.md.erb +0 -67
  134. data/docs/resources/windows_feature.md.erb +0 -69
  135. data/docs/resources/windows_hotfix.md.erb +0 -63
  136. data/docs/resources/windows_task.md.erb +0 -95
  137. data/docs/resources/wmi.md.erb +0 -91
  138. data/docs/resources/x509_certificate.md.erb +0 -161
  139. data/docs/resources/xinetd_conf.md.erb +0 -166
  140. data/docs/resources/xml.md.erb +0 -95
  141. data/docs/resources/yaml.md.erb +0 -79
  142. data/docs/resources/yum.md.erb +0 -108
  143. data/docs/resources/zfs_dataset.md.erb +0 -63
  144. data/docs/resources/zfs_pool.md.erb +0 -57
  145. data/docs/shared/matcher_be.md.erb +0 -1
  146. data/docs/shared/matcher_cmp.md.erb +0 -43
  147. data/docs/shared/matcher_eq.md.erb +0 -3
  148. data/docs/shared/matcher_include.md.erb +0 -1
  149. data/docs/shared/matcher_match.md.erb +0 -1
  150. data/docs/shell.md +0 -217
  151. data/docs/style.md +0 -178
  152. data/examples/README.md +0 -8
  153. data/examples/custom-resource/README.md +0 -3
  154. data/examples/custom-resource/controls/example.rb +0 -7
  155. data/examples/custom-resource/inspec.yml +0 -8
  156. data/examples/custom-resource/libraries/batsignal.rb +0 -20
  157. data/examples/custom-resource/libraries/gordon.rb +0 -21
  158. data/examples/inheritance/README.md +0 -65
  159. data/examples/inheritance/controls/example.rb +0 -14
  160. data/examples/inheritance/inspec.yml +0 -16
  161. data/examples/kitchen-ansible/.kitchen.yml +0 -25
  162. data/examples/kitchen-ansible/Gemfile +0 -19
  163. data/examples/kitchen-ansible/README.md +0 -53
  164. data/examples/kitchen-ansible/files/nginx.repo +0 -6
  165. data/examples/kitchen-ansible/tasks/main.yml +0 -16
  166. data/examples/kitchen-ansible/test/integration/default/default.yml +0 -5
  167. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +0 -28
  168. data/examples/kitchen-chef/.kitchen.yml +0 -20
  169. data/examples/kitchen-chef/Berksfile +0 -3
  170. data/examples/kitchen-chef/Gemfile +0 -19
  171. data/examples/kitchen-chef/README.md +0 -27
  172. data/examples/kitchen-chef/metadata.rb +0 -7
  173. data/examples/kitchen-chef/recipes/default.rb +0 -6
  174. data/examples/kitchen-chef/recipes/nginx.rb +0 -30
  175. data/examples/kitchen-chef/test/integration/default/web_spec.rb +0 -28
  176. data/examples/kitchen-puppet/.kitchen.yml +0 -23
  177. data/examples/kitchen-puppet/Gemfile +0 -20
  178. data/examples/kitchen-puppet/Puppetfile +0 -25
  179. data/examples/kitchen-puppet/README.md +0 -53
  180. data/examples/kitchen-puppet/manifests/site.pp +0 -33
  181. data/examples/kitchen-puppet/metadata.json +0 -11
  182. data/examples/kitchen-puppet/modules/.gitkeep +0 -0
  183. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +0 -28
  184. data/examples/meta-profile/README.md +0 -37
  185. data/examples/meta-profile/controls/example.rb +0 -13
  186. data/examples/meta-profile/inspec.yml +0 -13
  187. data/examples/plugins/inspec-resource-lister/Gemfile +0 -12
  188. data/examples/plugins/inspec-resource-lister/LICENSE +0 -13
  189. data/examples/plugins/inspec-resource-lister/README.md +0 -62
  190. data/examples/plugins/inspec-resource-lister/Rakefile +0 -40
  191. data/examples/plugins/inspec-resource-lister/inspec-resource-lister.gemspec +0 -45
  192. data/examples/plugins/inspec-resource-lister/lib/inspec-resource-lister.rb +0 -16
  193. data/examples/plugins/inspec-resource-lister/lib/inspec-resource-lister/cli_command.rb +0 -70
  194. data/examples/plugins/inspec-resource-lister/lib/inspec-resource-lister/plugin.rb +0 -55
  195. data/examples/plugins/inspec-resource-lister/lib/inspec-resource-lister/version.rb +0 -10
  196. data/examples/plugins/inspec-resource-lister/test/fixtures/README.md +0 -24
  197. data/examples/plugins/inspec-resource-lister/test/functional/README.md +0 -18
  198. data/examples/plugins/inspec-resource-lister/test/functional/inspec_resource_lister_test.rb +0 -110
  199. data/examples/plugins/inspec-resource-lister/test/helper.rb +0 -26
  200. data/examples/plugins/inspec-resource-lister/test/unit/README.md +0 -17
  201. data/examples/plugins/inspec-resource-lister/test/unit/cli_args_test.rb +0 -64
  202. data/examples/plugins/inspec-resource-lister/test/unit/plugin_def_test.rb +0 -51
  203. data/examples/profile-attribute.yml +0 -2
  204. data/examples/profile-attribute/README.md +0 -14
  205. data/examples/profile-attribute/controls/example.rb +0 -11
  206. data/examples/profile-attribute/inspec.yml +0 -8
  207. data/examples/profile-sensitive/README.md +0 -29
  208. data/examples/profile-sensitive/controls/sensitive-failures.rb +0 -9
  209. data/examples/profile-sensitive/controls/sensitive.rb +0 -9
  210. data/examples/profile-sensitive/inspec.yml +0 -8
  211. data/examples/profile/README.md +0 -48
  212. data/examples/profile/controls/example.rb +0 -24
  213. data/examples/profile/controls/gordon.rb +0 -36
  214. data/examples/profile/controls/meta.rb +0 -36
  215. data/examples/profile/inspec.yml +0 -11
  216. data/examples/profile/libraries/gordon_config.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c5e7615776b52330a209b35ca344d1bdb85a04f78903152edd67fa94d81700e
4
- data.tar.gz: e6042ee4e8ede90034c06762b2dd2ab6135d0eeeef505ffccc138b0df566f5f9
3
+ metadata.gz: 17c51957624df054318ca580aa5c5b8819779b6a8e908a8733d3ebaa8de324d4
4
+ data.tar.gz: 35923b58619c9ea189a3f41a10726c701bf149e3bbc85fe149c610625832725d
5
5
  SHA512:
6
- metadata.gz: 22bf4eed15b0f3b8ab6eb0ff13b7901bbe468c956d0a9c7615fcbce1e20e4974b4af823744106ed77db6d6fd40d31ae143a707edb8a94ae1d6aaf40bd1acc707
7
- data.tar.gz: 5ff797572d8637e1e1d7a6939e4c95d2b33bdc5e4577f0db0677c85a850d536d7d1677ba28e9112473ebe60ca01f7aa4d0a3d05821a090630667f42b2d687f89
6
+ metadata.gz: 39ba1aafa5dbf29b15577093145d5fc3a1385aefa588369d8e08c28af1750c8a5182cf86e093e705b177b28ee8d97dcc9905563f8c1ee5f3ecc128be8a26b6ce
7
+ data.tar.gz: 1b0f13cf9321e3ab9fcd692b41268422f2a9fd954510a853e2b27468453c67cae78ac4885e37f8d0819aac970b1d10560c2ca17d4d3950cd47d2c30e3aa7a71f
data/CHANGELOG.md CHANGED
@@ -1,33 +1,54 @@
1
1
  # Change Log
2
2
  <!-- usage documentation: http://expeditor-docs.es.chef.io/configuration/changelog/ -->
3
- <!-- latest_release 2.3.10 -->
4
- ## [v2.3.10](https://github.com/inspec/inspec/tree/v2.3.10) (2018-10-04)
3
+ <!-- latest_release 2.3.23 -->
4
+ ## [v2.3.23](https://github.com/inspec/inspec/tree/v2.3.23) (2018-10-12)
5
5
 
6
- #### Enhancements
7
- - Move compliance to v2 plugin [#3423](https://github.com/inspec/inspec/pull/3423) ([jquick](https://github.com/jquick))
6
+ #### Merged Pull Requests
7
+ - Fix plugin issues on omni builds [#3499](https://github.com/inspec/inspec/pull/3499) ([jquick](https://github.com/jquick))
8
8
  <!-- latest_release -->
9
9
 
10
- <!-- release_rollup since=2.3.5 -->
11
- ### Changes since 2.3.5 release
10
+ <!-- release_rollup since=2.3.10 -->
11
+ ### Changes since 2.3.10 release
12
+
13
+ #### Enhancements
14
+ - Plugins: Filter Plugins During Search and Install [#3458](https://github.com/inspec/inspec/pull/3458) ([clintoncwolfe](https://github.com/clintoncwolfe)) <!-- 2.3.20 -->
12
15
 
13
16
  #### Bug Fixes
14
- - Fix distinct_exit cli desc to reflect reality [#3463](https://github.com/inspec/inspec/pull/3463) ([teknofire](https://github.com/teknofire)) <!-- 2.3.8 -->
17
+ - Backport compliance namespace and add testing for A2 audit report. [#3493](https://github.com/inspec/inspec/pull/3493) ([jquick](https://github.com/jquick)) <!-- 2.3.21 -->
18
+ - Fix error on empty attributes yaml [#3485](https://github.com/inspec/inspec/pull/3485) ([jquick](https://github.com/jquick)) <!-- 2.3.19 -->
19
+ - small fix - update to AlpinePkg Class [#3483](https://github.com/inspec/inspec/pull/3483) ([aaronlippold](https://github.com/aaronlippold)) <!-- 2.3.16 -->
15
20
 
16
21
  #### Merged Pull Requests
17
- - Fix `attribute` with empty hash regression [#3454](https://github.com/inspec/inspec/pull/3454) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 2.3.7 -->
22
+ - Fix plugin issues on omni builds [#3499](https://github.com/inspec/inspec/pull/3499) ([jquick](https://github.com/jquick)) <!-- 2.3.23 -->
23
+ - Set a static node GUID for travis runs [#3497](https://github.com/inspec/inspec/pull/3497) ([jquick](https://github.com/jquick)) <!-- 2.3.22 -->
24
+ - docs: Add version to multiple descriptions doc [#3477](https://github.com/inspec/inspec/pull/3477) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 2.3.18 -->
25
+ - Skip running appveyor on docs and examples [#3474](https://github.com/inspec/inspec/pull/3474) ([btm](https://github.com/btm)) <!-- 2.3.17 -->
26
+ - Remove &#39;demo&#39; from website. [#3475](https://github.com/inspec/inspec/pull/3475) ([miah](https://github.com/miah)) <!-- 2.3.15 -->
27
+ - Enable compression for deb/rpm packages [#3472](https://github.com/inspec/inspec/pull/3472) ([tas50](https://github.com/tas50)) <!-- 2.3.14 -->
28
+ - Fix Packages Resource Docs [#3469](https://github.com/inspec/inspec/pull/3469) ([pwelch](https://github.com/pwelch)) <!-- 2.3.13 -->
29
+ - Exclude docs and examples from the gem [#3471](https://github.com/inspec/inspec/pull/3471) ([tas50](https://github.com/tas50)) <!-- 2.3.12 -->
30
+ - Fix archive with required attributes [#3468](https://github.com/inspec/inspec/pull/3468) ([jquick](https://github.com/jquick)) <!-- 2.3.11 -->
31
+ <!-- release_rollup -->
32
+
33
+ <!-- latest_stable_release -->
34
+ ## [v2.3.10](https://github.com/inspec/inspec/tree/v2.3.10) (2018-10-04)
18
35
 
19
36
  #### Enhancements
20
- - Move compliance to v2 plugin [#3423](https://github.com/inspec/inspec/pull/3423) ([jquick](https://github.com/jquick)) <!-- 2.3.10 -->
21
- - Support finding larger processes on Busybox [#3446](https://github.com/inspec/inspec/pull/3446) ([RoboticCheese](https://github.com/RoboticCheese)) <!-- 2.3.9 -->
22
- - Modify `cmp` matcher output to use `.inspect` [#3450](https://github.com/inspec/inspec/pull/3450) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 2.3.6 -->
23
- <!-- release_rollup -->
37
+ - Modify `cmp` matcher output to use `.inspect` [#3450](https://github.com/inspec/inspec/pull/3450) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
38
+ - Support finding larger processes on Busybox [#3446](https://github.com/inspec/inspec/pull/3446) ([RoboticCheese](https://github.com/RoboticCheese))
39
+ - Move compliance to v2 plugin [#3423](https://github.com/inspec/inspec/pull/3423) ([jquick](https://github.com/jquick))
40
+
41
+ #### Bug Fixes
42
+ - Fix distinct_exit cli desc to reflect reality [#3463](https://github.com/inspec/inspec/pull/3463) ([teknofire](https://github.com/teknofire))
24
43
 
44
+ #### Merged Pull Requests
45
+ - Fix `attribute` with empty hash regression [#3454](https://github.com/inspec/inspec/pull/3454) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
25
46
  <!-- latest_stable_release -->
47
+
26
48
  ## [v2.3.5](https://github.com/inspec/inspec/tree/v2.3.5) (2018-10-01)
27
49
 
28
50
  #### Bug Fixes
29
51
  - Update plugin gem install code [#3453](https://github.com/inspec/inspec/pull/3453) ([jquick](https://github.com/jquick))
30
- <!-- latest_stable_release -->
31
52
 
32
53
  ## [v2.3.4](https://github.com/inspec/inspec/tree/v2.3.4) (2018-09-28)
33
54
 
@@ -0,0 +1,25 @@
1
+ {
2
+ "file_version": "1.0.0",
3
+ "exclude": [
4
+ {
5
+ "plugin_name": "inspec-core",
6
+ "rationale": "This gem is a stripped-down alternate packaging of InSpec. It is not a plugin."
7
+ },
8
+ {
9
+ "plugin_name": "inspec-multi-server",
10
+ "rationale": "This gem is a script that attempts to drive a parallel execution of InSpec by wrapping and forking. It is not a plugin."
11
+ },
12
+ {
13
+ "plugin_name": "train-tax-calculator",
14
+ "rationale": "This gem is a tax calculation tool for the Philippines. It has nothing to do the Chef Train remote execution framework, or the InSpec project."
15
+ },
16
+ {
17
+ "plugin_name": "inspec-plugin-example",
18
+ "rationale": "This gem is an early self-taught example of a v1 plugin. Please use inspec-resource-lister as an example for PluginV2 development."
19
+ },
20
+ {
21
+ "plugin_name": "train-core",
22
+ "rationale": "This gem is a stripped-down alternate packaging of Train. It is not a plugin."
23
+ }
24
+ ]
25
+ }
data/inspec-core.gemspec CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
14
14
 
15
15
  spec.files = %w{README.md MAINTAINERS.toml MAINTAINERS.md LICENSE
16
16
  inspec-core.gemspec Gemfile CHANGELOG.md} +
17
- Dir.glob('{bin,docs,examples,lib}/**/*', File::FNM_DOTMATCH)
17
+ Dir.glob('{bin,lib,etc}/**/*', File::FNM_DOTMATCH)
18
18
  .reject { |f| File.directory?(f) || f =~ /aws|azure|gcp/ }
19
19
 
20
20
  spec.executables = %w{inspec}
@@ -2,3 +2,6 @@
2
2
  # TODO: Remove in inspec 4.0
3
3
 
4
4
  require 'plugins/inspec-compliance/lib/inspec-compliance/api'
5
+
6
+ # Backport old namespace
7
+ Compliance = InspecPlugins::Compliance unless defined?(Compliance)
@@ -2,3 +2,6 @@
2
2
  # TODO: Remove in inspec 4.0
3
3
 
4
4
  require 'plugins/inspec-compliance/lib/inspec-compliance/configuration'
5
+
6
+ # Backport old namespace
7
+ Compliance = InspecPlugins::Compliance unless defined?(Compliance)
@@ -2,3 +2,6 @@
2
2
  # TODO: Remove in inspec 4.0
3
3
 
4
4
  require 'plugins/inspec-compliance/lib/inspec-compliance/http'
5
+
6
+ # Backport old namespace
7
+ Compliance = InspecPlugins::Compliance unless defined?(Compliance)
@@ -2,3 +2,6 @@
2
2
  # TODO: Remove in inspec 4.0
3
3
 
4
4
  require 'plugins/inspec-compliance/lib/inspec-compliance/support'
5
+
6
+ # Backport old namespace
7
+ Compliance = InspecPlugins::Compliance unless defined?(Compliance)
@@ -2,3 +2,6 @@
2
2
  # TODO: Remove in inspec 4.0
3
3
 
4
4
  require 'plugins/inspec-compliance/lib/inspec-compliance/target'
5
+
6
+ # Backport old namespace
7
+ Compliance = InspecPlugins::Compliance unless defined?(Compliance)
@@ -89,6 +89,9 @@ module Inspec
89
89
  private
90
90
 
91
91
  def validate_required(value)
92
+ # skip if we are not doing an exec call (archive/vendor/check)
93
+ return unless Inspec::BaseCLI.inspec_cli_command == :exec
94
+
92
95
  # value will be set already if a secrets file was passed in
93
96
  if (!@opts.key?(:default) && value.nil?) || (@opts[:default].nil? && value.nil?)
94
97
  error = Inspec::Attribute::RequiredError.new
@@ -11,6 +11,9 @@ module Inspec
11
11
  attr_accessor :version
12
12
  end
13
13
  class InstallError < Inspec::Plugin::V2::GemActionError; end
14
+ class PluginExcludedError < Inspec::Plugin::V2::InstallError
15
+ attr_accessor :details
16
+ end
14
17
  class UpdateError < Inspec::Plugin::V2::GemActionError
15
18
  attr_accessor :from_version, :to_version
16
19
  end
@@ -0,0 +1,62 @@
1
+ require 'singleton'
2
+ require 'json'
3
+ require 'inspec/globals'
4
+
5
+ module Inspec::Plugin::V2
6
+ Exclusion = Struct.new(:plugin_name, :rationale)
7
+
8
+ class PluginFilter
9
+ include Singleton
10
+ def initialize
11
+ read_filter_data
12
+ end
13
+
14
+ def self.exclude?(plugin_name)
15
+ instance.exclude?(plugin_name)
16
+ end
17
+
18
+ def exclude?(plugin_name)
19
+ # Currently, logic is very simple: is there an exact match?
20
+ # In the future, we might add regexes on names, or exclude version ranges
21
+ return false unless @filter_data[:exclude].detect { |e| e.plugin_name == plugin_name }
22
+
23
+ # OK, return entire data structure.
24
+ @filter_data[:exclude].detect { |e| e.plugin_name == plugin_name }
25
+ end
26
+
27
+ private
28
+
29
+ def read_filter_data
30
+ path = File.join(Inspec.src_root, 'etc', 'plugin_filters.json')
31
+ @filter_data = JSON.parse(File.read(path))
32
+
33
+ unless @filter_data['file_version'] == '1.0.0'
34
+ raise Inspec::Plugin::V2::ConfigError, "Unknown plugin fillter file format at #{path}"
35
+ end
36
+
37
+ validate_plugin_filter_file('1.0.0')
38
+
39
+ @filter_data[:exclude] = @filter_data['exclude'].map do |entry|
40
+ Exclusion.new(entry['plugin_name'], entry['rationale'])
41
+ end
42
+ @filter_data.delete('exclude')
43
+ end
44
+
45
+ def validate_plugin_filter_file(_file_version)
46
+ unless @filter_data.key?('exclude') && @filter_data['exclude'].is_a?(Array)
47
+ raise Inspec::Plugin::V2::ConfigError, 'Unknown plugin fillter file format: expected "exclude" to be an array'
48
+ end
49
+ @filter_data['exclude'].each_with_index do |entry, idx|
50
+ unless entry.is_a? Hash
51
+ raise Inspec::Plugin::V2::ConfigError, "Unknown plugin fillter file format: expected entry #{idx} to be a Hash / JS Object"
52
+ end
53
+ unless entry.key?('plugin_name')
54
+ raise Inspec::Plugin::V2::ConfigError, "Unknown plugin fillter file format: expected entry #{idx} to have a \"plugin_name\" field"
55
+ end
56
+ unless entry.key?('rationale')
57
+ raise Inspec::Plugin::V2::ConfigError, "Unknown plugin fillter file format: expected entry #{idx} to have a \"rationale\" field"
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -9,6 +9,8 @@ require 'rubygems/package'
9
9
  require 'rubygems/name_tuple'
10
10
  require 'rubygems/uninstaller'
11
11
 
12
+ require 'inspec/plugin/v2/filter'
13
+
12
14
  module Inspec::Plugin::V2
13
15
  # Handles all actions modifying the user's plugin set:
14
16
  # * Modifying the plugins.json file
@@ -127,7 +129,7 @@ module Inspec::Plugin::V2
127
129
  else
128
130
  regex = Regexp.new('^' + plugin_query + '.*')
129
131
  matched_tuples = fetcher.detect(opts[:scope]) do |tuple|
130
- tuple.name != 'inspec-core' && tuple.name =~ regex
132
+ tuple.name =~ regex && !Inspec::Plugin::V2::PluginFilter.exclude?(tuple.name)
131
133
  end
132
134
  end
133
135
 
@@ -193,6 +195,13 @@ module Inspec::Plugin::V2
193
195
  raise InstallError, "#{plugin_name} is already installed. Use 'inspec plugin update' to change version."
194
196
  end
195
197
  end
198
+
199
+ reason = Inspec::Plugin::V2::PluginFilter.exclude?(plugin_name)
200
+ if reason
201
+ ex = PluginExcludedError.new("Refusing to install #{plugin_name}. It is on the Plugin Exclusion List. Rationale: #{reason.rationale}")
202
+ ex.details = reason
203
+ raise ex
204
+ end
196
205
  end
197
206
  # rubocop: enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize
198
207
 
@@ -386,10 +395,21 @@ module Inspec::Plugin::V2
386
395
  class InstalledVendorSet < Gem::Resolver::VendorSet
387
396
  def initialize
388
397
  super
398
+
389
399
  Gem::Specification.find_all do |spec|
390
400
  @specs[spec.name] = spec
391
401
  @directories[spec] = spec.gem_dir
392
402
  end
403
+
404
+ if !defined?(::Bundler)
405
+ directories = Gem::Specification.dirs.find_all do |path|
406
+ !path.start_with?(Gem.user_dir)
407
+ end
408
+ Gem::Specification.each_spec(directories) do |spec|
409
+ @specs[spec.name] = spec
410
+ @directories[spec] = spec.gem_dir
411
+ end
412
+ end
393
413
  end
394
414
  end
395
415
 
@@ -31,6 +31,10 @@ module Inspec::Plugin::V2
31
31
  end
32
32
 
33
33
  def load_all
34
+ # This fixes the gem paths on some bundles
35
+ Gem.path << plugin_gem_path
36
+ Gem.refresh
37
+
34
38
  # Be careful not to actually iterate directly over the registry here;
35
39
  # we want to allow "sidecar loading", in which case a plugin may add an entry to the registry.
36
40
  registry.plugin_names.dup.each do |plugin_name|
@@ -126,12 +126,14 @@ module Inspec
126
126
  end
127
127
 
128
128
  def register_metadata_attributes
129
- if metadata.params.key?(:attributes)
129
+ if metadata.params.key?(:attributes) && metadata.params[:attributes].is_a?(Array)
130
130
  metadata.params[:attributes].each do |attribute|
131
131
  attr_dup = attribute.dup
132
132
  name = attr_dup.delete(:name)
133
133
  @runner_context.register_attribute(name, attr_dup)
134
134
  end
135
+ elsif metadata.params.key?(:attributes)
136
+ Inspec::Log.warn 'Attributes must be defined as an Array. Skipping current definition.'
135
137
  end
136
138
  end
137
139
 
@@ -4,5 +4,5 @@
4
4
  # author: Christoph Hartmann
5
5
 
6
6
  module Inspec
7
- VERSION = '2.3.10'
7
+ VERSION = '2.3.23'
8
8
  end
@@ -1,5 +1,6 @@
1
1
  require 'term/ansicolor'
2
2
  require 'pathname'
3
+ require 'inspec/plugin/v2'
3
4
  require 'inspec/plugin/v2/installer'
4
5
 
5
6
  module InspecPlugins
@@ -35,16 +36,30 @@ module InspecPlugins
35
36
  # inspec plugin search
36
37
  #==================================================================#
37
38
 
38
- desc 'search [options] PATTERN', 'Searches rubygems.org for InSpec plugins. Exits 0 on a search hit, exits 2 on a search miss.'
39
+ desc 'search [options] PATTERN', 'Searches rubygems.org for plugins.'
40
+ long_desc <<~EOLD
41
+ Searches rubygems.org for InSpec plugins. Exits 0 on a search hit, 1 on user error,
42
+ 2 on a search miss. PATTERN is a simple string; a wildcard will be added as
43
+ a suffix, unless -e is used.
44
+ EOLD
39
45
  option :all, desc: 'List all available versions, not just the latest one.', type: :boolean, aliases: [:a]
40
46
  option :exact, desc: 'Assume PATTERN is exact; do not add a wildcard to the end', type: :boolean, aliases: [:e]
47
+ option :'include-test-fixture', type: :boolean, desc: 'Internal use', hide: true
41
48
  # Justification for disabling ABC: currently at 33.51/33
42
49
  def search(search_term) # rubocop: disable Metrics/AbcSize
43
50
  search_results = installer.search(search_term, exact: options[:exact])
51
+ # The search results have already been filtered by the reject list. But the
52
+ # RejectList doesn't filter {inspec, train}-test-fixture because we need those
53
+ # for testing. We want to hide those from users, so unless we know we're in
54
+ # test mode, remove them.
55
+ unless options[:'include-test-fixture']
56
+ search_results.delete('inspec-test-fixture')
57
+ search_results.delete('train-test-fixture')
58
+ end
44
59
 
45
60
  # TODO: ui object support
46
61
  puts
47
- puts(bold { format(' %-30s%-50s%', 'Plugin Name', 'Versions Available') })
62
+ puts(bold { format(' %-30s%-50s', 'Plugin Name', 'Versions Available') })
48
63
  puts '-' * 55
49
64
  search_results.keys.sort.each do |plugin_name|
50
65
  versions = options[:all] ? search_results[plugin_name] : [search_results[plugin_name].first]
@@ -342,8 +357,15 @@ module InspecPlugins
342
357
  exit 2
343
358
  end
344
359
 
345
- def install_attempt_install(plugin_name)
360
+ # Rationale for RuboCop variance: This is a one-line method with heavy UX-focused error handling.
361
+ def install_attempt_install(plugin_name) # rubocop: disable Metrics/AbcSize
346
362
  installer.install(plugin_name, version: options[:version])
363
+ rescue Inspec::Plugin::V2::PluginExcludedError => ex
364
+ puts(red { 'Plugin on Exclusion List' } + " - #{plugin_name} is listed as an incompatible gem - refusing to install.")
365
+ puts "Rationale: #{ex.details.rationale}"
366
+ puts 'Exclusion list location: ' + File.join(Inspec.src_root, 'etc', 'plugin_filters.json')
367
+ puts 'If you disagree with this determination, please accept our apologies for the misunderstanding, and open an issue at https://github.com/inspec/inspec/issues/new'
368
+ exit 2
347
369
  rescue Inspec::Plugin::V2::InstallError
348
370
  results = installer.search(plugin_name, exact: true)
349
371
  if results.empty?
@@ -143,8 +143,14 @@ class PluginManagerCliSearch < MiniTest::Test
143
143
  include CorePluginFunctionalHelper
144
144
  include PluginManagerHelpers
145
145
 
146
+ # TODO: Thor can't hide options, but we wish it could.
147
+ # def test_search_include_fixture_hidden_option
148
+ # result = run_inspec_process_with_this_plugin('plugin help search')
149
+ # refute_includes result.stdout, '--include-test-fixture'
150
+ # end
151
+
146
152
  def test_search_for_a_real_gem_with_full_name_no_options
147
- result = run_inspec_process('plugin search inspec-test-fixture')
153
+ result = run_inspec_process('plugin search --include-test-fixture inspec-test-fixture')
148
154
  assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
149
155
  assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the gem name'
150
156
  assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
@@ -153,7 +159,7 @@ class PluginManagerCliSearch < MiniTest::Test
153
159
  end
154
160
 
155
161
  def test_search_for_a_real_gem_with_stub_name_no_options
156
- result = run_inspec_process('plugin search inspec-test-')
162
+ result = run_inspec_process('plugin search --include-test-fixture inspec-test-')
157
163
  assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
158
164
  assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the gem name'
159
165
  assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
@@ -163,26 +169,26 @@ class PluginManagerCliSearch < MiniTest::Test
163
169
  end
164
170
 
165
171
  def test_search_for_a_real_gem_with_full_name_and_exact_option
166
- result = run_inspec_process('plugin search --exact inspec-test-fixture')
172
+ result = run_inspec_process('plugin search --exact --include-test-fixture inspec-test-fixture')
167
173
  assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
168
174
  assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the gem name'
169
175
  assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
170
176
 
171
- result = run_inspec_process('plugin search -e inspec-test-fixture')
177
+ result = run_inspec_process('plugin search -e --include-test-fixture inspec-test-fixture')
172
178
  assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
173
179
  end
174
180
 
175
181
  def test_search_for_a_real_gem_with_stub_name_and_exact_option
176
- result = run_inspec_process('plugin search --exact inspec-test-')
182
+ result = run_inspec_process('plugin search --exact --include-test-fixture inspec-test-')
177
183
  assert_equal 2, result.exit_status, 'Search should exit 2 on a miss'
178
184
  assert_includes result.stdout, '0 plugin(s) found', 'Search result should find 0 plugins'
179
185
 
180
- result = run_inspec_process('plugin search -e inspec-test-')
186
+ result = run_inspec_process('plugin search -e --include-test-fixture inspec-test-')
181
187
  assert_equal 2, result.exit_status, 'Search should exit 2 on a miss'
182
188
  end
183
189
 
184
190
  def test_search_for_a_real_gem_with_full_name_and_all_option
185
- result = run_inspec_process('plugin search --all inspec-test-fixture')
191
+ result = run_inspec_process('plugin search --all --include-test-fixture inspec-test-fixture')
186
192
  assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
187
193
  assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the gem name'
188
194
  assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
@@ -190,24 +196,24 @@ class PluginManagerCliSearch < MiniTest::Test
190
196
  line = result.stdout.split("\n").grep(/inspec-test-fixture/).first
191
197
  assert_match(/\s*inspec-test-fixture\s+\((\d+\.\d+\.\d+(,\s)?){2,}\)/,line,'Plugin line should include name and at least two versions')
192
198
 
193
- result = run_inspec_process('plugin search -a inspec-test-fixture')
199
+ result = run_inspec_process('plugin search -a --include-test-fixture inspec-test-fixture')
194
200
  assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
195
201
  end
196
202
 
197
203
  def test_search_for_a_gem_with_missing_prefix
198
- result = run_inspec_process('plugin search test-fixture')
204
+ result = run_inspec_process('plugin search --include-test-fixture test-fixture')
199
205
  assert_equal 1, result.exit_status, 'Search should exit 1 on user error'
200
206
  assert_includes result.stdout, "All inspec plugins must begin with either 'inspec-' or 'train-'"
201
207
  end
202
208
 
203
209
  def test_search_for_a_gem_that_does_not_exist
204
- result = run_inspec_process('plugin search inspec-test-fixture-nonesuch')
210
+ result = run_inspec_process('plugin search --include-test-fixture inspec-test-fixture-nonesuch')
205
211
  assert_equal 2, result.exit_status, 'Search should exit 2 on a miss'
206
212
  assert_includes result.stdout, '0 plugin(s) found', 'Search result should find 0 plugins'
207
213
  end
208
214
 
209
215
  def test_search_for_a_real_gem_with_full_name_no_options_and_train_name
210
- result = run_inspec_process('plugin search train-test-fixture')
216
+ result = run_inspec_process('plugin search --include-test-fixture train-test-fixture')
211
217
  assert_equal 0, result.exit_status, 'Search should exit 0 on a hit'
212
218
  assert_includes result.stdout, 'train-test-fixture', 'Search result should contain the gem name'
213
219
  assert_includes result.stdout, '1 plugin(s) found', 'Search result should find 1 plugin'
@@ -215,6 +221,28 @@ class PluginManagerCliSearch < MiniTest::Test
215
221
  assert_match(/\s*train-test-fixture\s+\((\d+\.\d+\.\d+){1}\)/,line,'Plugin line should include name and exactly one version')
216
222
  end
217
223
 
224
+ def test_search_omit_excluded_inspec_plugins
225
+ result = run_inspec_process('plugin search --include-test-fixture inspec-')
226
+ assert_equal 0, result.exit_status, 'Search should exit 0'
227
+ assert_includes result.stdout, 'inspec-test-fixture', 'Search result should contain the test gem'
228
+ [
229
+ 'inspec-core',
230
+ 'inspec-multi-server',
231
+ ].each do |plugin_name|
232
+ refute_includes result.stdout, plugin_name, 'Search result should not contain excluded gems'
233
+ end
234
+ end
235
+ def test_search_for_a_real_gem_with_full_name_no_options_filter_fixtures
236
+ result = run_inspec_process('plugin search inspec-test-fixture')
237
+ refute_includes result.stdout, 'inspec-test-fixture', 'Search result should not contain the fixture gem name'
238
+ end
239
+
240
+ def test_search_for_a_real_gem_with_full_name_no_options_filter_fixtures_train
241
+ result = run_inspec_process('plugin search train-test-fixture')
242
+ refute_includes result.stdout, 'train-test-fixture', 'Search result should not contain the fixture gem name'
243
+ end
244
+
245
+
218
246
  end
219
247
 
220
248
  #-----------------------------------------------------------------------------------------#
@@ -513,6 +541,32 @@ class PluginManagerCliInstall < MiniTest::Test
513
541
  refute_nil itf_line, 'train-test-fixture should now appear in the output of inspec list'
514
542
  assert_match(/\s*train-test-fixture\s+0.1.0\s+gem\s+/, itf_line, 'list output should show that it is a gem installation with version')
515
543
  end
544
+
545
+ def test_refuse_install_when_plugin_on_exclusion_list
546
+
547
+ # Here, 'inspec-core', 'inspec-multi-server', and 'train-tax-collector'
548
+ # are the names of real rubygems. They are not InSpec/Train plugins, though,
549
+ # and installing them would be a jam-up.
550
+ # This is configured in 'etc/plugin-filter.json'.
551
+ [
552
+ 'inspec-core',
553
+ 'inspec-multi-server',
554
+ 'train-tax-calculator',
555
+ ].each do |plugin_name|
556
+ install_result = run_inspec_process_with_this_plugin("plugin install #{plugin_name}")
557
+ assert_empty install_result.stderr
558
+ assert_equal 2, install_result.exit_status, 'Exit status should be 2'
559
+
560
+ refusal_message = install_result.stdout
561
+ refute_nil refusal_message, 'Should find a failure message at the end'
562
+ assert_includes refusal_message, plugin_name
563
+ assert_includes refusal_message, 'Plugin on Exclusion List'
564
+ assert_includes refusal_message, 'refusing to install'
565
+ assert_includes refusal_message, 'Rationale:'
566
+ assert_includes refusal_message, 'etc/plugin_filters.json'
567
+ assert_includes refusal_message, 'github.com/inspec/inspec/issues/new'
568
+ end
569
+ end
516
570
  end
517
571
 
518
572