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.
Files changed (412) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3136 -0
  3. data/Gemfile +56 -0
  4. data/LICENSE +14 -0
  5. data/MAINTAINERS.md +33 -0
  6. data/MAINTAINERS.toml +52 -0
  7. data/README.md +453 -0
  8. data/bin/inspec +12 -0
  9. data/docs/.gitignore +2 -0
  10. data/docs/README.md +40 -0
  11. data/docs/dev/control-eval.md +62 -0
  12. data/docs/dsl_inspec.md +258 -0
  13. data/docs/dsl_resource.md +100 -0
  14. data/docs/glossary.md +99 -0
  15. data/docs/habitat.md +192 -0
  16. data/docs/inspec_and_friends.md +114 -0
  17. data/docs/matchers.md +169 -0
  18. data/docs/migration.md +293 -0
  19. data/docs/platforms.md +119 -0
  20. data/docs/plugin_kitchen_inspec.md +50 -0
  21. data/docs/profiles.md +378 -0
  22. data/docs/reporters.md +105 -0
  23. data/docs/resources/aide_conf.md.erb +76 -0
  24. data/docs/resources/apache.md.erb +67 -0
  25. data/docs/resources/apache_conf.md.erb +68 -0
  26. data/docs/resources/apt.md.erb +71 -0
  27. data/docs/resources/audit_policy.md.erb +47 -0
  28. data/docs/resources/auditd.md.erb +79 -0
  29. data/docs/resources/auditd_conf.md.erb +68 -0
  30. data/docs/resources/bash.md.erb +75 -0
  31. data/docs/resources/bond.md.erb +90 -0
  32. data/docs/resources/bridge.md.erb +57 -0
  33. data/docs/resources/bsd_service.md.erb +67 -0
  34. data/docs/resources/chocolatey_package.md.erb +58 -0
  35. data/docs/resources/command.md.erb +138 -0
  36. data/docs/resources/cpan.md.erb +79 -0
  37. data/docs/resources/cran.md.erb +64 -0
  38. data/docs/resources/crontab.md.erb +89 -0
  39. data/docs/resources/csv.md.erb +54 -0
  40. data/docs/resources/dh_params.md.erb +205 -0
  41. data/docs/resources/directory.md.erb +30 -0
  42. data/docs/resources/docker.md.erb +219 -0
  43. data/docs/resources/docker_container.md.erb +103 -0
  44. data/docs/resources/docker_image.md.erb +94 -0
  45. data/docs/resources/docker_service.md.erb +114 -0
  46. data/docs/resources/elasticsearch.md.erb +242 -0
  47. data/docs/resources/etc_fstab.md.erb +125 -0
  48. data/docs/resources/etc_group.md.erb +75 -0
  49. data/docs/resources/etc_hosts.md.erb +78 -0
  50. data/docs/resources/etc_hosts_allow.md.erb +74 -0
  51. data/docs/resources/etc_hosts_deny.md.erb +74 -0
  52. data/docs/resources/file.md.erb +526 -0
  53. data/docs/resources/filesystem.md.erb +41 -0
  54. data/docs/resources/firewalld.md.erb +107 -0
  55. data/docs/resources/gem.md.erb +79 -0
  56. data/docs/resources/group.md.erb +61 -0
  57. data/docs/resources/grub_conf.md.erb +101 -0
  58. data/docs/resources/host.md.erb +86 -0
  59. data/docs/resources/http.md.erb +197 -0
  60. data/docs/resources/iis_app.md.erb +122 -0
  61. data/docs/resources/iis_site.md.erb +135 -0
  62. data/docs/resources/inetd_conf.md.erb +94 -0
  63. data/docs/resources/ini.md.erb +76 -0
  64. data/docs/resources/interface.md.erb +58 -0
  65. data/docs/resources/iptables.md.erb +64 -0
  66. data/docs/resources/json.md.erb +63 -0
  67. data/docs/resources/kernel_module.md.erb +120 -0
  68. data/docs/resources/kernel_parameter.md.erb +53 -0
  69. data/docs/resources/key_rsa.md.erb +85 -0
  70. data/docs/resources/launchd_service.md.erb +57 -0
  71. data/docs/resources/limits_conf.md.erb +75 -0
  72. data/docs/resources/login_defs.md.erb +71 -0
  73. data/docs/resources/mount.md.erb +69 -0
  74. data/docs/resources/mssql_session.md.erb +60 -0
  75. data/docs/resources/mysql_conf.md.erb +99 -0
  76. data/docs/resources/mysql_session.md.erb +74 -0
  77. data/docs/resources/nginx.md.erb +79 -0
  78. data/docs/resources/nginx_conf.md.erb +138 -0
  79. data/docs/resources/npm.md.erb +60 -0
  80. data/docs/resources/ntp_conf.md.erb +60 -0
  81. data/docs/resources/oneget.md.erb +53 -0
  82. data/docs/resources/oracledb_session.md.erb +52 -0
  83. data/docs/resources/os.md.erb +141 -0
  84. data/docs/resources/os_env.md.erb +91 -0
  85. data/docs/resources/package.md.erb +120 -0
  86. data/docs/resources/packages.md.erb +67 -0
  87. data/docs/resources/parse_config.md.erb +103 -0
  88. data/docs/resources/parse_config_file.md.erb +138 -0
  89. data/docs/resources/passwd.md.erb +141 -0
  90. data/docs/resources/pip.md.erb +67 -0
  91. data/docs/resources/port.md.erb +137 -0
  92. data/docs/resources/postgres_conf.md.erb +79 -0
  93. data/docs/resources/postgres_hba_conf.md.erb +93 -0
  94. data/docs/resources/postgres_ident_conf.md.erb +76 -0
  95. data/docs/resources/postgres_session.md.erb +69 -0
  96. data/docs/resources/powershell.md.erb +102 -0
  97. data/docs/resources/processes.md.erb +109 -0
  98. data/docs/resources/rabbitmq_config.md.erb +41 -0
  99. data/docs/resources/registry_key.md.erb +158 -0
  100. data/docs/resources/runit_service.md.erb +57 -0
  101. data/docs/resources/security_policy.md.erb +47 -0
  102. data/docs/resources/service.md.erb +121 -0
  103. data/docs/resources/shadow.md.erb +146 -0
  104. data/docs/resources/ssh_config.md.erb +73 -0
  105. data/docs/resources/sshd_config.md.erb +83 -0
  106. data/docs/resources/ssl.md.erb +119 -0
  107. data/docs/resources/sys_info.md.erb +42 -0
  108. data/docs/resources/systemd_service.md.erb +57 -0
  109. data/docs/resources/sysv_service.md.erb +57 -0
  110. data/docs/resources/upstart_service.md.erb +57 -0
  111. data/docs/resources/user.md.erb +140 -0
  112. data/docs/resources/users.md.erb +127 -0
  113. data/docs/resources/vbscript.md.erb +55 -0
  114. data/docs/resources/virtualization.md.erb +57 -0
  115. data/docs/resources/windows_feature.md.erb +47 -0
  116. data/docs/resources/windows_hotfix.md.erb +53 -0
  117. data/docs/resources/windows_task.md.erb +95 -0
  118. data/docs/resources/wmi.md.erb +81 -0
  119. data/docs/resources/x509_certificate.md.erb +151 -0
  120. data/docs/resources/xinetd_conf.md.erb +156 -0
  121. data/docs/resources/xml.md.erb +85 -0
  122. data/docs/resources/yaml.md.erb +69 -0
  123. data/docs/resources/yum.md.erb +98 -0
  124. data/docs/resources/zfs_dataset.md.erb +53 -0
  125. data/docs/resources/zfs_pool.md.erb +47 -0
  126. data/docs/ruby_usage.md +203 -0
  127. data/docs/shared/matcher_be.md.erb +1 -0
  128. data/docs/shared/matcher_cmp.md.erb +43 -0
  129. data/docs/shared/matcher_eq.md.erb +3 -0
  130. data/docs/shared/matcher_include.md.erb +1 -0
  131. data/docs/shared/matcher_match.md.erb +1 -0
  132. data/docs/shell.md +217 -0
  133. data/examples/README.md +8 -0
  134. data/examples/inheritance/README.md +65 -0
  135. data/examples/inheritance/controls/example.rb +14 -0
  136. data/examples/inheritance/inspec.yml +15 -0
  137. data/examples/kitchen-ansible/.kitchen.yml +25 -0
  138. data/examples/kitchen-ansible/Gemfile +19 -0
  139. data/examples/kitchen-ansible/README.md +53 -0
  140. data/examples/kitchen-ansible/files/nginx.repo +6 -0
  141. data/examples/kitchen-ansible/tasks/main.yml +16 -0
  142. data/examples/kitchen-ansible/test/integration/default/default.yml +5 -0
  143. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -0
  144. data/examples/kitchen-chef/.kitchen.yml +20 -0
  145. data/examples/kitchen-chef/Berksfile +3 -0
  146. data/examples/kitchen-chef/Gemfile +19 -0
  147. data/examples/kitchen-chef/README.md +27 -0
  148. data/examples/kitchen-chef/metadata.rb +7 -0
  149. data/examples/kitchen-chef/recipes/default.rb +6 -0
  150. data/examples/kitchen-chef/recipes/nginx.rb +30 -0
  151. data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -0
  152. data/examples/kitchen-puppet/.kitchen.yml +23 -0
  153. data/examples/kitchen-puppet/Gemfile +20 -0
  154. data/examples/kitchen-puppet/Puppetfile +25 -0
  155. data/examples/kitchen-puppet/README.md +53 -0
  156. data/examples/kitchen-puppet/manifests/site.pp +33 -0
  157. data/examples/kitchen-puppet/metadata.json +11 -0
  158. data/examples/kitchen-puppet/modules/.gitkeep +0 -0
  159. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -0
  160. data/examples/meta-profile/README.md +37 -0
  161. data/examples/meta-profile/controls/example.rb +13 -0
  162. data/examples/meta-profile/inspec.yml +13 -0
  163. data/examples/profile-attribute.yml +2 -0
  164. data/examples/profile-attribute/README.md +14 -0
  165. data/examples/profile-attribute/controls/example.rb +11 -0
  166. data/examples/profile-attribute/inspec.yml +8 -0
  167. data/examples/profile-sensitive/README.md +29 -0
  168. data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -0
  169. data/examples/profile-sensitive/controls/sensitive.rb +9 -0
  170. data/examples/profile-sensitive/inspec.yml +8 -0
  171. data/examples/profile/README.md +48 -0
  172. data/examples/profile/controls/example.rb +23 -0
  173. data/examples/profile/controls/gordon.rb +36 -0
  174. data/examples/profile/controls/meta.rb +34 -0
  175. data/examples/profile/inspec.yml +10 -0
  176. data/examples/profile/libraries/gordon_config.rb +59 -0
  177. data/inspec-core.gemspec +43 -0
  178. data/lib/bundles/README.md +3 -0
  179. data/lib/bundles/inspec-artifact.rb +7 -0
  180. data/lib/bundles/inspec-artifact/README.md +1 -0
  181. data/lib/bundles/inspec-artifact/cli.rb +277 -0
  182. data/lib/bundles/inspec-compliance.rb +16 -0
  183. data/lib/bundles/inspec-compliance/.kitchen.yml +20 -0
  184. data/lib/bundles/inspec-compliance/README.md +193 -0
  185. data/lib/bundles/inspec-compliance/api.rb +360 -0
  186. data/lib/bundles/inspec-compliance/api/login.rb +193 -0
  187. data/lib/bundles/inspec-compliance/bootstrap.sh +41 -0
  188. data/lib/bundles/inspec-compliance/cli.rb +260 -0
  189. data/lib/bundles/inspec-compliance/configuration.rb +103 -0
  190. data/lib/bundles/inspec-compliance/http.rb +125 -0
  191. data/lib/bundles/inspec-compliance/images/cc-token.png +0 -0
  192. data/lib/bundles/inspec-compliance/support.rb +36 -0
  193. data/lib/bundles/inspec-compliance/target.rb +106 -0
  194. data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -0
  195. data/lib/bundles/inspec-habitat.rb +12 -0
  196. data/lib/bundles/inspec-habitat/cli.rb +36 -0
  197. data/lib/bundles/inspec-habitat/log.rb +10 -0
  198. data/lib/bundles/inspec-habitat/profile.rb +391 -0
  199. data/lib/bundles/inspec-init.rb +8 -0
  200. data/lib/bundles/inspec-init/README.md +31 -0
  201. data/lib/bundles/inspec-init/cli.rb +97 -0
  202. data/lib/bundles/inspec-init/templates/profile/README.md +3 -0
  203. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -0
  204. data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -0
  205. data/lib/bundles/inspec-init/templates/profile/libraries/.gitkeep +0 -0
  206. data/lib/bundles/inspec-supermarket.rb +13 -0
  207. data/lib/bundles/inspec-supermarket/README.md +45 -0
  208. data/lib/bundles/inspec-supermarket/api.rb +84 -0
  209. data/lib/bundles/inspec-supermarket/cli.rb +73 -0
  210. data/lib/bundles/inspec-supermarket/target.rb +34 -0
  211. data/lib/fetchers/git.rb +163 -0
  212. data/lib/fetchers/local.rb +74 -0
  213. data/lib/fetchers/mock.rb +35 -0
  214. data/lib/fetchers/url.rb +247 -0
  215. data/lib/inspec.rb +24 -0
  216. data/lib/inspec/archive/tar.rb +29 -0
  217. data/lib/inspec/archive/zip.rb +19 -0
  218. data/lib/inspec/backend.rb +93 -0
  219. data/lib/inspec/base_cli.rb +368 -0
  220. data/lib/inspec/cached_fetcher.rb +66 -0
  221. data/lib/inspec/cli.rb +292 -0
  222. data/lib/inspec/completions/bash.sh.erb +45 -0
  223. data/lib/inspec/completions/fish.sh.erb +34 -0
  224. data/lib/inspec/completions/zsh.sh.erb +61 -0
  225. data/lib/inspec/control_eval_context.rb +179 -0
  226. data/lib/inspec/dependencies/cache.rb +72 -0
  227. data/lib/inspec/dependencies/dependency_set.rb +92 -0
  228. data/lib/inspec/dependencies/lockfile.rb +115 -0
  229. data/lib/inspec/dependencies/requirement.rb +123 -0
  230. data/lib/inspec/dependencies/resolver.rb +86 -0
  231. data/lib/inspec/describe.rb +27 -0
  232. data/lib/inspec/dsl.rb +66 -0
  233. data/lib/inspec/dsl_shared.rb +33 -0
  234. data/lib/inspec/env_printer.rb +157 -0
  235. data/lib/inspec/errors.rb +14 -0
  236. data/lib/inspec/exceptions.rb +12 -0
  237. data/lib/inspec/expect.rb +45 -0
  238. data/lib/inspec/fetcher.rb +45 -0
  239. data/lib/inspec/file_provider.rb +275 -0
  240. data/lib/inspec/formatters.rb +3 -0
  241. data/lib/inspec/formatters/base.rb +259 -0
  242. data/lib/inspec/formatters/json_rspec.rb +20 -0
  243. data/lib/inspec/formatters/show_progress.rb +12 -0
  244. data/lib/inspec/library_eval_context.rb +58 -0
  245. data/lib/inspec/log.rb +11 -0
  246. data/lib/inspec/metadata.rb +247 -0
  247. data/lib/inspec/method_source.rb +24 -0
  248. data/lib/inspec/objects.rb +14 -0
  249. data/lib/inspec/objects/attribute.rb +75 -0
  250. data/lib/inspec/objects/control.rb +61 -0
  251. data/lib/inspec/objects/describe.rb +92 -0
  252. data/lib/inspec/objects/each_loop.rb +36 -0
  253. data/lib/inspec/objects/list.rb +15 -0
  254. data/lib/inspec/objects/or_test.rb +40 -0
  255. data/lib/inspec/objects/ruby_helper.rb +15 -0
  256. data/lib/inspec/objects/tag.rb +27 -0
  257. data/lib/inspec/objects/test.rb +87 -0
  258. data/lib/inspec/objects/value.rb +27 -0
  259. data/lib/inspec/plugins.rb +60 -0
  260. data/lib/inspec/plugins/cli.rb +24 -0
  261. data/lib/inspec/plugins/fetcher.rb +86 -0
  262. data/lib/inspec/plugins/resource.rb +135 -0
  263. data/lib/inspec/plugins/secret.rb +15 -0
  264. data/lib/inspec/plugins/source_reader.rb +40 -0
  265. data/lib/inspec/polyfill.rb +12 -0
  266. data/lib/inspec/profile.rb +513 -0
  267. data/lib/inspec/profile_context.rb +208 -0
  268. data/lib/inspec/profile_vendor.rb +66 -0
  269. data/lib/inspec/reporters.rb +60 -0
  270. data/lib/inspec/reporters/automate.rb +76 -0
  271. data/lib/inspec/reporters/base.rb +25 -0
  272. data/lib/inspec/reporters/cli.rb +356 -0
  273. data/lib/inspec/reporters/json.rb +116 -0
  274. data/lib/inspec/reporters/json_min.rb +48 -0
  275. data/lib/inspec/reporters/junit.rb +78 -0
  276. data/lib/inspec/require_loader.rb +33 -0
  277. data/lib/inspec/resource.rb +190 -0
  278. data/lib/inspec/rule.rb +280 -0
  279. data/lib/inspec/runner.rb +345 -0
  280. data/lib/inspec/runner_mock.rb +41 -0
  281. data/lib/inspec/runner_rspec.rb +175 -0
  282. data/lib/inspec/runtime_profile.rb +26 -0
  283. data/lib/inspec/schema.rb +213 -0
  284. data/lib/inspec/secrets.rb +19 -0
  285. data/lib/inspec/secrets/yaml.rb +30 -0
  286. data/lib/inspec/shell.rb +220 -0
  287. data/lib/inspec/shell_detector.rb +90 -0
  288. data/lib/inspec/source_reader.rb +29 -0
  289. data/lib/inspec/version.rb +8 -0
  290. data/lib/matchers/matchers.rb +339 -0
  291. data/lib/resources/aide_conf.rb +151 -0
  292. data/lib/resources/apache.rb +48 -0
  293. data/lib/resources/apache_conf.rb +149 -0
  294. data/lib/resources/apt.rb +149 -0
  295. data/lib/resources/audit_policy.rb +63 -0
  296. data/lib/resources/auditd.rb +231 -0
  297. data/lib/resources/auditd_conf.rb +46 -0
  298. data/lib/resources/bash.rb +35 -0
  299. data/lib/resources/bond.rb +69 -0
  300. data/lib/resources/bridge.rb +122 -0
  301. data/lib/resources/chocolatey_package.rb +78 -0
  302. data/lib/resources/command.rb +73 -0
  303. data/lib/resources/cpan.rb +58 -0
  304. data/lib/resources/cran.rb +64 -0
  305. data/lib/resources/crontab.rb +169 -0
  306. data/lib/resources/csv.rb +56 -0
  307. data/lib/resources/dh_params.rb +77 -0
  308. data/lib/resources/directory.rb +25 -0
  309. data/lib/resources/docker.rb +236 -0
  310. data/lib/resources/docker_container.rb +89 -0
  311. data/lib/resources/docker_image.rb +83 -0
  312. data/lib/resources/docker_object.rb +57 -0
  313. data/lib/resources/docker_service.rb +90 -0
  314. data/lib/resources/elasticsearch.rb +169 -0
  315. data/lib/resources/etc_fstab.rb +94 -0
  316. data/lib/resources/etc_group.rb +154 -0
  317. data/lib/resources/etc_hosts.rb +66 -0
  318. data/lib/resources/etc_hosts_allow_deny.rb +112 -0
  319. data/lib/resources/file.rb +298 -0
  320. data/lib/resources/filesystem.rb +31 -0
  321. data/lib/resources/firewalld.rb +143 -0
  322. data/lib/resources/gem.rb +70 -0
  323. data/lib/resources/groups.rb +215 -0
  324. data/lib/resources/grub_conf.rb +227 -0
  325. data/lib/resources/host.rb +306 -0
  326. data/lib/resources/http.rb +253 -0
  327. data/lib/resources/iis_app.rb +101 -0
  328. data/lib/resources/iis_site.rb +148 -0
  329. data/lib/resources/inetd_conf.rb +54 -0
  330. data/lib/resources/ini.rb +29 -0
  331. data/lib/resources/interface.rb +129 -0
  332. data/lib/resources/iptables.rb +80 -0
  333. data/lib/resources/json.rb +111 -0
  334. data/lib/resources/kernel_module.rb +107 -0
  335. data/lib/resources/kernel_parameter.rb +58 -0
  336. data/lib/resources/key_rsa.rb +63 -0
  337. data/lib/resources/limits_conf.rb +46 -0
  338. data/lib/resources/login_def.rb +57 -0
  339. data/lib/resources/mount.rb +88 -0
  340. data/lib/resources/mssql_session.rb +101 -0
  341. data/lib/resources/mysql.rb +82 -0
  342. data/lib/resources/mysql_conf.rb +127 -0
  343. data/lib/resources/mysql_session.rb +85 -0
  344. data/lib/resources/nginx.rb +96 -0
  345. data/lib/resources/nginx_conf.rb +226 -0
  346. data/lib/resources/npm.rb +48 -0
  347. data/lib/resources/ntp_conf.rb +51 -0
  348. data/lib/resources/oneget.rb +71 -0
  349. data/lib/resources/oracledb_session.rb +139 -0
  350. data/lib/resources/os.rb +36 -0
  351. data/lib/resources/os_env.rb +86 -0
  352. data/lib/resources/package.rb +370 -0
  353. data/lib/resources/packages.rb +111 -0
  354. data/lib/resources/parse_config.rb +112 -0
  355. data/lib/resources/passwd.rb +76 -0
  356. data/lib/resources/pip.rb +130 -0
  357. data/lib/resources/platform.rb +109 -0
  358. data/lib/resources/port.rb +771 -0
  359. data/lib/resources/postgres.rb +131 -0
  360. data/lib/resources/postgres_conf.rb +114 -0
  361. data/lib/resources/postgres_hba_conf.rb +90 -0
  362. data/lib/resources/postgres_ident_conf.rb +79 -0
  363. data/lib/resources/postgres_session.rb +71 -0
  364. data/lib/resources/powershell.rb +67 -0
  365. data/lib/resources/processes.rb +204 -0
  366. data/lib/resources/rabbitmq_conf.rb +51 -0
  367. data/lib/resources/registry_key.rb +297 -0
  368. data/lib/resources/security_policy.rb +180 -0
  369. data/lib/resources/service.rb +794 -0
  370. data/lib/resources/shadow.rb +159 -0
  371. data/lib/resources/ssh_conf.rb +97 -0
  372. data/lib/resources/ssl.rb +99 -0
  373. data/lib/resources/sys_info.rb +28 -0
  374. data/lib/resources/toml.rb +32 -0
  375. data/lib/resources/users.rb +654 -0
  376. data/lib/resources/vbscript.rb +68 -0
  377. data/lib/resources/virtualization.rb +247 -0
  378. data/lib/resources/windows_feature.rb +84 -0
  379. data/lib/resources/windows_hotfix.rb +35 -0
  380. data/lib/resources/windows_task.rb +102 -0
  381. data/lib/resources/wmi.rb +110 -0
  382. data/lib/resources/x509_certificate.rb +137 -0
  383. data/lib/resources/xinetd.rb +106 -0
  384. data/lib/resources/xml.rb +46 -0
  385. data/lib/resources/yaml.rb +43 -0
  386. data/lib/resources/yum.rb +180 -0
  387. data/lib/resources/zfs_dataset.rb +60 -0
  388. data/lib/resources/zfs_pool.rb +49 -0
  389. data/lib/source_readers/flat.rb +39 -0
  390. data/lib/source_readers/inspec.rb +75 -0
  391. data/lib/utils/command_wrapper.rb +27 -0
  392. data/lib/utils/convert.rb +12 -0
  393. data/lib/utils/database_helpers.rb +77 -0
  394. data/lib/utils/enumerable_delegation.rb +9 -0
  395. data/lib/utils/erlang_parser.rb +192 -0
  396. data/lib/utils/file_reader.rb +25 -0
  397. data/lib/utils/filter.rb +273 -0
  398. data/lib/utils/filter_array.rb +27 -0
  399. data/lib/utils/find_files.rb +47 -0
  400. data/lib/utils/hash.rb +41 -0
  401. data/lib/utils/json_log.rb +18 -0
  402. data/lib/utils/latest_version.rb +22 -0
  403. data/lib/utils/modulator.rb +12 -0
  404. data/lib/utils/nginx_parser.rb +105 -0
  405. data/lib/utils/object_traversal.rb +49 -0
  406. data/lib/utils/parser.rb +274 -0
  407. data/lib/utils/pkey_reader.rb +15 -0
  408. data/lib/utils/plugin_registry.rb +93 -0
  409. data/lib/utils/simpleconfig.rb +120 -0
  410. data/lib/utils/spdx.rb +13 -0
  411. data/lib/utils/spdx.txt +344 -0
  412. metadata +713 -0
@@ -0,0 +1,3 @@
1
+ require 'inspec/formatters/base'
2
+ require 'inspec/formatters/json_rspec'
3
+ require 'inspec/formatters/show_progress'
@@ -0,0 +1,259 @@
1
+ require 'rspec/core'
2
+ require 'rspec/core/formatters/base_formatter'
3
+
4
+ module Inspec::Formatters
5
+ class Base < RSpec::Core::Formatters::BaseFormatter
6
+ RSpec::Core::Formatters.register self, :close, :dump_summary, :stop
7
+
8
+ attr_accessor :backend, :run_data
9
+
10
+ def initialize(output)
11
+ super(output)
12
+
13
+ @run_data = {}
14
+ @profiles = []
15
+ @profiles_info = nil
16
+ @backend = nil
17
+ end
18
+
19
+ # RSpec Override: #dump_summary
20
+ #
21
+ # Supply run summary data, such as the InSpec version and the total duration.
22
+ def dump_summary(summary)
23
+ run_data[:version] = Inspec::VERSION
24
+ run_data[:statistics] = {
25
+ duration: summary.duration,
26
+ controls: statistics,
27
+ }
28
+ end
29
+
30
+ # RSpec Override: #stop
31
+ #
32
+ # Called at the end of a complete RSpec run.
33
+ # We use this to map tests to controls and flesh out the rest of the run_data
34
+ # hash to include details about the run, the platform, etc.
35
+ def stop(notification)
36
+ # This might be a bit confusing. The results are not actually organized
37
+ # by control. It is organized by test. So if a control has 3 tests, the
38
+ # output will have 3 control entries, each one with the same control id
39
+ # and different test results. An rspec example maps to an inspec test.
40
+ run_data[:controls] = notification.examples.map do |example|
41
+ format_example(example).tap do |hash|
42
+ e = example.exception
43
+ next unless e
44
+
45
+ if example.metadata[:sensitive]
46
+ hash[:message] = '*** sensitive output suppressed ***'
47
+ else
48
+ hash[:message] = exception_message(e)
49
+ end
50
+
51
+ next if e.is_a? RSpec::Expectations::ExpectationNotMetError
52
+ hash[:exception] = e.class.name
53
+ hash[:backtrace] = e.backtrace
54
+ end
55
+ end
56
+
57
+ # include any tests that were run that were not part of a control
58
+ run_data[:other_checks] = examples_without_controls
59
+ examples_with_controls.each do |example|
60
+ control = example2control(example)
61
+ move_example_into_control(example, control)
62
+ end
63
+
64
+ # flesh out the profiles key with additional profile information
65
+ run_data[:profiles] = profiles_info
66
+
67
+ # add the platform information for this particular target
68
+ run_data[:platform] = {
69
+ name: platform(:name),
70
+ release: platform(:release),
71
+ target: backend_target,
72
+ uuid: platform(:uuid),
73
+ }
74
+ end
75
+
76
+ # Add the current profile to the list of executed profiles.
77
+ # Called by the runner during example collection.
78
+ def add_profile(profile)
79
+ @profiles.push(profile)
80
+ end
81
+
82
+ # Return all the collected output to the caller
83
+ def results
84
+ run_data
85
+ end
86
+
87
+ private
88
+
89
+ def all_unique_controls
90
+ unique_controls = Set.new
91
+ run_data[:profiles].each do |profile|
92
+ profile[:controls].map { |control| unique_controls.add(control) }
93
+ end
94
+
95
+ unique_controls
96
+ end
97
+
98
+ def statistics
99
+ failed = 0
100
+ skipped = 0
101
+ passed = 0
102
+
103
+ all_unique_controls.each do |control|
104
+ next unless control[:results]
105
+ if control[:results].any? { |r| r[:status] == 'failed' }
106
+ failed += 1
107
+ elsif control[:results].any? { |r| r[:status] == 'skipped' }
108
+ skipped += 1
109
+ else
110
+ passed += 1
111
+ end
112
+ end
113
+
114
+ total = failed + passed + skipped
115
+
116
+ {
117
+ total: total,
118
+ passed: {
119
+ total: passed,
120
+ },
121
+ skipped: {
122
+ total: skipped,
123
+ },
124
+ failed: {
125
+ total: failed,
126
+ },
127
+ }
128
+ end
129
+
130
+ def exception_message(exception)
131
+ if exception.is_a?(RSpec::Core::MultipleExceptionError)
132
+ exception.all_exceptions.map(&:message).uniq.join("\n\n")
133
+ else
134
+ exception.message
135
+ end
136
+ end
137
+
138
+ # RSpec Override: #format_example
139
+ #
140
+ # Called after test execution, this allows us to populate our own hash with data
141
+ # for this test that is necessary for the rest of our reports.
142
+ def format_example(example) # rubocop:disable Metrics/AbcSize
143
+ if !example.metadata[:description_args].empty? && example.metadata[:skip]
144
+ # For skipped profiles, rspec returns in full_description the skip_message as well. We don't want
145
+ # to mix the two, so we pick the full_description from the example.metadata[:example_group] hash.
146
+ code_description = example.metadata[:example_group][:description]
147
+ else
148
+ code_description = example.metadata[:full_description]
149
+ end
150
+
151
+ res = {
152
+ id: example.metadata[:id],
153
+ profile_id: example.metadata[:profile_id],
154
+ status: example.execution_result.status.to_s,
155
+ code_desc: code_description,
156
+ run_time: example.execution_result.run_time,
157
+ start_time: example.execution_result.started_at.to_datetime.rfc3339.to_s,
158
+ resource_title: example.metadata[:described_class] || example.metadata[:example_group][:description],
159
+ expectation_message: format_expectation_message(example),
160
+ }
161
+
162
+ unless (pid = example.metadata[:profile_id]).nil?
163
+ res[:profile_id] = pid
164
+ end
165
+
166
+ if res[:status] == 'pending'
167
+ res[:status] = 'skipped'
168
+ res[:skip_message] = example.metadata[:description]
169
+ res[:resource] = example.metadata[:described_class].to_s
170
+ end
171
+
172
+ res
173
+ end
174
+
175
+ def format_expectation_message(example)
176
+ if (example.metadata[:example_group][:description_args].first == example.metadata[:example_group][:described_class]) ||
177
+ example.metadata[:example_group][:described_class].nil?
178
+ example.metadata[:description]
179
+ else
180
+ "#{example.metadata[:example_group][:description]} #{example.metadata[:description]}"
181
+ end
182
+ end
183
+
184
+ # This formatter runs for all reports and we cannot error on missing fields.
185
+ # Return nil if not found or Train error. If needed, we will raise an error inside
186
+ # the proper report.
187
+ def platform(field)
188
+ return nil if @backend.nil?
189
+ begin
190
+ @backend.platform[field]
191
+ rescue Train::Error => e
192
+ Inspec::Log.error(e.message)
193
+ nil
194
+ end
195
+ end
196
+
197
+ def backend_target
198
+ return nil if @backend.nil?
199
+ connection = @backend.backend
200
+ connection.respond_to?(:uri) ? connection.uri : nil
201
+ end
202
+
203
+ def examples
204
+ run_data[:controls]
205
+ end
206
+
207
+ def examples_without_controls
208
+ examples.find_all { |example| example2control(example).nil? }
209
+ end
210
+
211
+ def examples_with_controls
212
+ examples.find_all { |example| !example2control(example).nil? }
213
+ end
214
+
215
+ def profiles_info
216
+ @profiles_info ||= @profiles.map(&:info!).map(&:dup)
217
+ end
218
+
219
+ def example2control(example)
220
+ profile = profile_from_example(example)
221
+ return nil unless profile&.[](:controls)
222
+ profile[:controls].find { |x| x[:id] == example[:id] }
223
+ end
224
+
225
+ def profile_from_example(example)
226
+ profiles_info.find { |p| profile_contains_example?(p, example) }
227
+ end
228
+
229
+ def profile_contains_example?(profile, example)
230
+ profile_name = profile[:name]
231
+ example_profile_id = example[:profile_id]
232
+
233
+ # if either the profile name is nil or the profile in the given example
234
+ # is nil, assume the profile doesn't contain the example and default
235
+ # to creating a new profile. Otherwise, for profiles that have no
236
+ # metadata, this may incorrectly match a profile that does not contain
237
+ # this example, leading to Ruby exceptions.
238
+ return false if profile_name.nil? || example_profile_id.nil?
239
+
240
+ # The correct profile is one where the name of the profile, and the profile
241
+ # name in the example match. Additionally, the list of controls in the
242
+ # profile must contain the example in question (which we match by ID).
243
+ #
244
+ # While the profile name match is usually good enough, we must also match by
245
+ # the control ID in the case where an InSpec runner has multiple profiles of
246
+ # the same name (i.e. when Test Kitchen is running concurrently using a
247
+ # single test suite that uses the Flat source reader, in which case InSpec
248
+ # creates a fake profile with a name like "tests from /path/to/tests")
249
+ profile_name == example_profile_id && profile[:controls].any? { |control| control[:id] == example[:id] }
250
+ end
251
+
252
+ def move_example_into_control(example, control)
253
+ control[:results] ||= []
254
+ example.delete(:id)
255
+ example.delete(:profile_id)
256
+ control[:results].push(example)
257
+ end
258
+ end
259
+ end
@@ -0,0 +1,20 @@
1
+ module Inspec::Formatters
2
+ class RspecJson < RSpec::Core::Formatters::JsonFormatter
3
+ RSpec::Core::Formatters.register self
4
+
5
+ private
6
+
7
+ # We are cheating and overriding a private method in RSpec's core JsonFormatter.
8
+ # This is to avoid having to repeat this id functionality in both dump_summary
9
+ # and dump_profile (both of which call format_example).
10
+ # See https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/json_formatter.rb
11
+ #
12
+ # rspec's example id here corresponds to an inspec test's control name -
13
+ # either explicitly specified or auto-generated by rspec itself.
14
+ def format_example(example)
15
+ res = super(example)
16
+ res[:id] = example.metadata[:id]
17
+ res
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module Inspec::Formatters
2
+ class ShowProgress < RSpec::Core::Formatters::ProgressFormatter
3
+ RSpec::Core::Formatters.register self
4
+
5
+ # remove summary output from progress
6
+ %w{dump_summary dump_failures dump_pending message seed start_dump}.each do |m|
7
+ define_method(m) do |*args|
8
+ # override
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+ # author: Steven Danna
3
+ # author: Victoria Jeffrey
4
+ require 'inspec/plugins/resource'
5
+ require 'inspec/dsl_shared'
6
+
7
+ module Inspec
8
+ #
9
+ # LibaryEvalContext constructs an instance of an anonymous class
10
+ # that library files will be instance_exec'd against.
11
+ #
12
+ # The anonymous class ensures that `Inspec.resource(1)` will return
13
+ # an anonymouse class that is suitable as the parent class of an
14
+ # inspec resource. The class returned will have the resource
15
+ # registry used by all dsl methods bound to the resource registry
16
+ # passed into the #create constructor.
17
+ #
18
+ #
19
+ class LibraryEvalContext
20
+ def self.create(registry, require_loader)
21
+ c = Class.new do
22
+ extend Inspec::ResourceDSL
23
+ include Inspec::ResourceBehaviors
24
+ define_singleton_method :__resource_registry do
25
+ registry
26
+ end
27
+ end
28
+
29
+ c2 = Class.new do
30
+ define_singleton_method :resource do |version|
31
+ Inspec.validate_resource_dsl_version!(version)
32
+ c
33
+ end
34
+ end
35
+
36
+ c3 = Class.new do
37
+ include Inspec::DSL::RequireOverride
38
+ def initialize(require_loader)
39
+ @require_loader = require_loader
40
+ @inspec_binding = nil
41
+ end
42
+
43
+ def __inspec_binding
44
+ @inspec_binding
45
+ end
46
+ end
47
+
48
+ c3.const_set(:Inspec, c2)
49
+ res = c3.new(require_loader)
50
+
51
+ # Provide the local binding for this context which is necessary for
52
+ # calls to `require` to create all dependent objects in the correct
53
+ # context.
54
+ res.instance_variable_set('@inspec_binding', res.instance_eval('binding'))
55
+ res
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ require 'mixlib/log'
6
+
7
+ module Inspec
8
+ class Log
9
+ extend Mixlib::Log
10
+ end
11
+ end
@@ -0,0 +1,247 @@
1
+ # encoding: utf-8
2
+ # Copyright 2015 Dominik Richter
3
+ # author: Dominik Richter
4
+ # author: Christoph Hartmann
5
+
6
+ require 'logger'
7
+ require 'rubygems/version'
8
+ require 'rubygems/requirement'
9
+ require 'semverse'
10
+ require 'utils/spdx'
11
+
12
+ module Inspec
13
+ # Extract metadata.rb information
14
+ # A Metadata object may be created and finalized with invalid data.
15
+ # This allows the check CLI command to analyse the issues.
16
+ # Use valid? to determine if the metadata is coherent.
17
+ class Metadata
18
+ attr_reader :ref
19
+ attr_accessor :params, :content
20
+ def initialize(ref, logger = nil)
21
+ @ref = ref
22
+ @logger = logger || Logger.new(nil)
23
+ @content = ''
24
+ @params = {}
25
+ @missing_methods = []
26
+ end
27
+
28
+ %w{
29
+ name
30
+ title
31
+ maintainer
32
+ maintainer_email
33
+ copyright
34
+ copyright_email
35
+ license
36
+ summary
37
+ description
38
+ version
39
+ inspec_version
40
+ }.each do |name|
41
+ define_method name.to_sym do |arg|
42
+ params[name.to_sym] = arg
43
+ end
44
+ end
45
+
46
+ def dependencies
47
+ params[:depends] || []
48
+ end
49
+
50
+ def supports(sth, version = nil)
51
+ # Ignore supports with metadata.rb. This file is legacy and the way it
52
+ # it handles `supports` deprecated. A deprecation warning will be printed
53
+ # already.
54
+ end
55
+
56
+ def inspec_requirement
57
+ # using Gem::Requirement here to allow nil values which
58
+ # translate to [">= 0"]
59
+ Gem::Requirement.create(params[:inspec_version])
60
+ end
61
+
62
+ def supports_runtime?
63
+ running = Gem::Version.new(Inspec::VERSION)
64
+ inspec_requirement.satisfied_by?(running)
65
+ end
66
+
67
+ def supports_platform?(backend)
68
+ backend.platform.supported?(params[:supports])
69
+ end
70
+
71
+ # return all warn and errors
72
+ def valid # rubocop:disable Metrics/AbcSize
73
+ errors = []
74
+ warnings = []
75
+
76
+ %w{name version}.each do |field|
77
+ next unless params[field.to_sym].nil?
78
+ errors.push("Missing profile #{field} in #{ref}")
79
+ end
80
+
81
+ if params[:name] =~ %r{[\/\\]}
82
+ warnings.push("Your profile name (#{params[:name]}) contains a slash " \
83
+ 'which will not be permitted in InSpec 2.0. Please change your profile ' \
84
+ 'name in the `inspec.yml` file.')
85
+ end
86
+
87
+ # if version is set, ensure it is correct
88
+ if !params[:version].nil? && !valid_version?(params[:version])
89
+ errors.push('Version needs to be in SemVer format')
90
+ end
91
+
92
+ %w{title summary maintainer copyright license}.each do |field|
93
+ next unless params[field.to_sym].nil?
94
+ warnings.push("Missing profile #{field} in #{ref}")
95
+ end
96
+
97
+ # if version is set, ensure it is in SPDX format
98
+ if !params[:license].nil? && !Spdx.valid_license?(params[:license])
99
+ warnings.push("License '#{params[:license]}' needs to be in SPDX format. See https://spdx.org/licenses/.")
100
+ end
101
+
102
+ [errors, warnings]
103
+ end
104
+
105
+ # returns true or false
106
+ def valid?
107
+ errors, _warnings = valid
108
+ errors.empty? && unsupported.empty?
109
+ end
110
+
111
+ def valid_version?(value)
112
+ Semverse::Version.new(value)
113
+ true
114
+ rescue Semverse::InvalidVersionFormat
115
+ false
116
+ end
117
+
118
+ def method_missing(sth, *args)
119
+ @logger.warn "#{ref} doesn't support: #{sth} #{args}"
120
+ @missing_methods.push(sth)
121
+ end
122
+
123
+ def unsupported
124
+ @missing_methods
125
+ end
126
+
127
+ def self.symbolize_keys(obj)
128
+ return obj.map { |i| symbolize_keys(i) } if obj.is_a?(Array)
129
+ return obj unless obj.is_a?(Hash)
130
+
131
+ obj.each_with_object({}) do |(k, v), h|
132
+ v = symbolize_keys(v) if v.is_a?(Hash)
133
+ v = symbolize_keys(v) if v.is_a?(Array)
134
+ h[k.to_sym] = v
135
+ end
136
+ end
137
+
138
+ def self.finalize_supports_elem(elem, logger)
139
+ case x = elem
140
+ when Hash
141
+ x[:release] = x[:release].to_s if x[:release]
142
+ x
143
+ when Array
144
+ logger.warn(
145
+ 'Failed to read supports entry that is an array. Please use '\
146
+ 'the `supports: {os-family: xyz}` syntax.',
147
+ )
148
+ nil
149
+ when nil then nil
150
+ else
151
+ logger ||= Logger.new(nil)
152
+ logger.warn(
153
+ "Do not use deprecated `supports: #{x}` syntax. Instead use:\n"\
154
+ "supports:\n - os-family: #{x}\n\n",
155
+ )
156
+ { :'os-family' => x } # rubocop:disable Style/HashSyntax
157
+ end
158
+ end
159
+
160
+ def self.finalize_supports(supports, logger)
161
+ case x = supports
162
+ when Hash then [finalize_supports_elem(x, logger)]
163
+ when Array then x.map { |e| finalize_supports_elem(e, logger) }.compact
164
+ when nil then []
165
+ else
166
+ logger ||= Logger.new(nil)
167
+ logger.warn(
168
+ "Do not use deprecated `supports: #{x}` syntax. Instead use:\n"\
169
+ "supports:\n - os-family: #{x}\n\n",
170
+ )
171
+ [{ :'os-family' => x }] # rubocop:disable Style/HashSyntax
172
+ end
173
+ end
174
+
175
+ def self.finalize_name(metadata, profile_id, original_target)
176
+ # profile_id always overwrites whatever already exists as the name
177
+ unless profile_id.to_s.empty?
178
+ metadata.params[:name] = profile_id.to_s
179
+ return
180
+ end
181
+
182
+ # don't overwrite an existing name
183
+ return unless metadata.params[:name].nil?
184
+
185
+ # if there's a title, there is no need to set a name too
186
+ return unless metadata.params[:title].nil?
187
+
188
+ # create a new name based on the original target if it exists
189
+ # Crudely slug the target to not contain slashes, to avoid breaking
190
+ # unit tests that look for warning sequences
191
+ return if original_target.to_s.empty?
192
+ metadata.params[:title] = "tests from #{original_target}"
193
+ metadata.params[:name] = metadata.params[:title].gsub(%r{[\\\/]}, '.')
194
+ end
195
+
196
+ def self.finalize(metadata, profile_id, options, logger = nil)
197
+ return nil if metadata.nil?
198
+ param = metadata.params || {}
199
+ options ||= {}
200
+ param['version'] = param['version'].to_s unless param['version'].nil?
201
+ metadata.params = symbolize_keys(param)
202
+ metadata.params[:supports] = finalize_supports(metadata.params[:supports], logger)
203
+ finalize_name(metadata, profile_id, options[:target])
204
+
205
+ metadata
206
+ end
207
+
208
+ def self.from_yaml(ref, content, profile_id, logger = nil)
209
+ res = Metadata.new(ref, logger)
210
+ res.params = YAML.load(content)
211
+ res.content = content
212
+ finalize(res, profile_id, {}, logger)
213
+ end
214
+
215
+ def self.from_ruby(ref, content, profile_id, logger = nil)
216
+ res = Metadata.new(ref, logger)
217
+ res.instance_eval(content, ref, 1)
218
+ res.content = content
219
+ finalize(res, profile_id, {}, logger)
220
+ end
221
+
222
+ def self.from_ref(ref, content, profile_id, logger = nil)
223
+ # NOTE there doesn't have to exist an actual file, it may come from an
224
+ # archive (i.e., content)
225
+ case File.basename(ref)
226
+ when 'inspec.yml'
227
+ from_yaml(ref, content, profile_id, logger)
228
+ when 'metadata.rb'
229
+ from_ruby(ref, content, profile_id, logger)
230
+ else
231
+ logger ||= Logger.new(nil)
232
+ logger.error "Don't know how to handle metadata in #{ref}"
233
+ nil
234
+ end
235
+ end
236
+
237
+ def self.from_file(path, profile_id, logger = nil)
238
+ unless File.file?(path)
239
+ logger ||= Logger.new(nil)
240
+ logger.error "Can't find metadata file #{path}"
241
+ return nil
242
+ end
243
+
244
+ from_ref(File.basename(path), File.read(path), profile_id, logger)
245
+ end
246
+ end
247
+ end