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,41 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ module Inspec
6
+ class RunnerMock
7
+ attr_reader :tests, :profiles
8
+ attr_writer :backend
9
+ def initialize
10
+ reset
11
+ end
12
+
13
+ def reset
14
+ @tests = []
15
+ @profiles = []
16
+ end
17
+
18
+ def add_profile(profile)
19
+ @profiles.push(profile)
20
+ end
21
+
22
+ def add_test(example, _rule)
23
+ @tests.push(example)
24
+ end
25
+
26
+ def example_group(*in_args, &in_block)
27
+ Class.new do
28
+ define_method :args do
29
+ in_args
30
+ end
31
+ define_method :block do
32
+ in_block
33
+ end
34
+ end
35
+ end
36
+
37
+ def run(_with = nil)
38
+ puts 'uhm.... nothing or something... dunno, ask your admin'
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,175 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ require 'rspec/core'
6
+ require 'rspec/its'
7
+ require 'inspec/formatters'
8
+
9
+ # There be dragons!! Or borgs, or something...
10
+ # This file and all its contents cannot be unit-tested. both test-suits
11
+ # collide and disable all unit tests that have been added.
12
+
13
+ module Inspec
14
+ class RunnerRspec
15
+ def initialize(conf)
16
+ @conf = conf
17
+ @formatter = nil
18
+ reset
19
+ end
20
+
21
+ # Create a new RSpec example group from arguments and block.
22
+ #
23
+ # @param [Type] *args list of arguments for this example
24
+ # @param [Type] &block the block associated with this example group
25
+ # @return [RSpecExampleGroup]
26
+ def example_group(*args, &block)
27
+ RSpec::Core::ExampleGroup.describe(*args, &block)
28
+ end
29
+
30
+ # Add a full profile to the runner. Only pulls in metadata
31
+ #
32
+ # @param [Inspec::Profile] profile
33
+ # @return [nil]
34
+ def add_profile(profile)
35
+ RSpec.configuration.formatters
36
+ .find_all { |c| c.is_a?(Inspec::Formatters::Base) }
37
+ .each do |fmt|
38
+ fmt.add_profile(profile)
39
+ end
40
+ end
41
+
42
+ # Configure the backend of the runner.
43
+ #
44
+ # @param [Inspec::Backend] backend
45
+ # @return [nil]
46
+ def backend=(backend)
47
+ RSpec.configuration.formatters
48
+ .find_all { |c| c.is_a?(Inspec::Formatters::Base) }
49
+ .each do |fmt|
50
+ fmt.backend = backend
51
+ end
52
+ end
53
+
54
+ # Add an example group to the list of registered tests.
55
+ #
56
+ # @param [RSpecExampleGroup] example test
57
+ # @param [String] rule_id the ID associated with this check
58
+ # @return [nil]
59
+ def add_test(example, rule)
60
+ set_rspec_ids(example, rule)
61
+ @tests.example_groups.push(example)
62
+ end
63
+
64
+ # Retrieve the list of tests that have been added.
65
+ #
66
+ # @return [Array] full list of tests
67
+ def tests
68
+ @tests.ordered_example_groups
69
+ end
70
+
71
+ # Run all registered tests with an optional test runner.
72
+ #
73
+ # @param [RSpecRunner] with is an optional RSpecRunner
74
+ # @return [int] 0 if all went well; otherwise nonzero
75
+ def run(with = nil)
76
+ with ||= RSpec::Core::Runner.new(nil)
77
+ @rspec_exit_code = with.run_specs(tests)
78
+ @formatter.results
79
+ end
80
+
81
+ # Return a proper exit code to the runner
82
+ #
83
+ # @return [int] exit code
84
+ def exit_code
85
+ return @rspec_exit_code if @formatter.results.empty?
86
+ stats = @formatter.results[:statistics][:controls]
87
+ if stats[:failed][:total] == 0 && stats[:skipped][:total] == 0
88
+ 0
89
+ elsif stats[:failed][:total] > 0
90
+ 100
91
+ elsif stats[:skipped][:total] > 0
92
+ 101
93
+ else
94
+ @rspec_exit_code
95
+ end
96
+ end
97
+
98
+ # Empty the list of registered tests.
99
+ #
100
+ # @return [nil]
101
+ def reset
102
+ @tests = RSpec::Core::World.new
103
+ # resets "pending examples" in reporter
104
+ RSpec.configuration.reset
105
+ configure_output
106
+ end
107
+
108
+ private
109
+
110
+ # Set optional formatters and output
111
+ #
112
+ #
113
+ def set_optional_formatters
114
+ return if @conf['reporter'].nil?
115
+ if @conf['reporter'].key?('json-rspec')
116
+ # We cannot pass in a nil output path. Rspec only accepts a valid string or a IO object.
117
+ if @conf['reporter']['json-rspec']&.[]('file').nil?
118
+ RSpec.configuration.add_formatter(Inspec::Formatters::RspecJson)
119
+ else
120
+ RSpec.configuration.add_formatter(Inspec::Formatters::RspecJson, @conf[:reporter]['json-rspec']['file'])
121
+ end
122
+ @conf['reporter'].delete('json-rspec')
123
+ end
124
+
125
+ formats = @conf['reporter'].select { |k, _v| %w{documentation progress html}.include?(k) }
126
+ formats.each do |k, v|
127
+ # We cannot pass in a nil output path. Rspec only accepts a valid string or a IO object.
128
+ if v&.[]('file').nil?
129
+ RSpec.configuration.add_formatter(k.to_sym)
130
+ else
131
+ RSpec.configuration.add_formatter(k.to_sym, v['file'])
132
+ end
133
+ @conf['reporter'].delete(k)
134
+ end
135
+ end
136
+
137
+ # Configure the output formatter and stream to be used with RSpec.
138
+ #
139
+ # @return [nil]
140
+ def configure_output
141
+ RSpec.configuration.output_stream = $stdout
142
+ @formatter = RSpec.configuration.add_formatter(Inspec::Formatters::Base)
143
+ RSpec.configuration.add_formatter(Inspec::Formatters::ShowProgress, $stderr) if @conf[:show_progress]
144
+ set_optional_formatters
145
+ RSpec.configuration.color = @conf['color']
146
+ end
147
+
148
+ # Make sure that all RSpec example groups use the provided ID.
149
+ # At the time of creation, we didn't yet have full ID support in RSpec,
150
+ # which is why they were added to metadata directly. This is evaluated
151
+ # by the InSpec adjusted json formatter (rspec_json_formatter).
152
+ #
153
+ # @param [RSpecExampleGroup] example object which contains a check
154
+ # @return [Type] description of returned object
155
+ def set_rspec_ids(example, rule)
156
+ assign_rspec_ids(example.metadata, rule)
157
+ example.filtered_examples.each do |e|
158
+ assign_rspec_ids(e.metadata, rule)
159
+ end
160
+ example.children.each do |child|
161
+ set_rspec_ids(child, rule)
162
+ end
163
+ end
164
+
165
+ def assign_rspec_ids(metadata, rule)
166
+ metadata[:id] = ::Inspec::Rule.rule_id(rule)
167
+ metadata[:profile_id] = ::Inspec::Rule.profile_id(rule)
168
+ metadata[:impact] = rule.impact
169
+ metadata[:title] = rule.title
170
+ metadata[:desc] = rule.desc
171
+ metadata[:code] = rule.instance_variable_get(:@__code)
172
+ metadata[:source_location] = rule.instance_variable_get(:@__source_location)
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+ # Copyright 2017 Chef Software
3
+ # author: Dominik Richter
4
+ # author: Christoph Hartmann
5
+
6
+ module Inspec
7
+ class RuntimeProfile
8
+ attr_reader :files
9
+
10
+ def initialize(profile)
11
+ @src = profile.source_reader
12
+ @files = @src.data_files.keys.map do |k|
13
+ k.sub('files' + File::SEPARATOR, '')
14
+ end
15
+ end
16
+
17
+ # Retrieve a profile file's contents
18
+ #
19
+ # @param name [String] the name of the file
20
+ # @return [String] contents of the file of RuntimeError if missing
21
+ def file(name)
22
+ @src.data_files[File.join('files', name)] ||
23
+ raise("Cannot find file #{name} in profile.")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,213 @@
1
+ # encoding: utf-8
2
+ require 'json'
3
+
4
+ module Inspec
5
+ class Schema
6
+ STATISTICS = {
7
+ 'type' => 'object',
8
+ 'additionalProperties' => false,
9
+ 'properties' => {
10
+ 'duration' => { 'type' => 'number' },
11
+ 'controls' => {
12
+ 'type' => 'object',
13
+ 'optional' => true,
14
+ 'properties' => {
15
+ 'total' => { 'type' => 'number' },
16
+ 'passed' => {
17
+ 'type' => 'object',
18
+ 'properties' => {
19
+ 'total' => { 'type' => 'number' },
20
+ },
21
+ },
22
+ 'skipped' => {
23
+ 'type' => 'object',
24
+ 'properties' => {
25
+ 'total' => { 'type' => 'number' },
26
+ },
27
+ },
28
+ 'failed' => {
29
+ 'type' => 'object',
30
+ 'properties' => {
31
+ 'total' => { 'type' => 'number' },
32
+ },
33
+ },
34
+ },
35
+ },
36
+ },
37
+ }.freeze
38
+
39
+ PLATFORM = {
40
+ 'type' => 'object',
41
+ 'additionalProperties' => false,
42
+ 'properties' => {
43
+ 'name' => { 'type' => 'string' },
44
+ 'release' => { 'type' => 'string' },
45
+ },
46
+ }.freeze
47
+
48
+ # Tags are open right, with simple key-value associations and not restrictions
49
+ TAGS = { 'type' => 'object' }.freeze
50
+
51
+ RESULT = {
52
+ 'type' => 'object',
53
+ 'additionalProperties' => false,
54
+ 'properties' => {
55
+ 'status' => { 'type' => 'string' },
56
+ 'code_desc' => { 'type' => 'string' },
57
+ 'run_time' => { 'type' => 'number' },
58
+ 'start_time' => { 'type' => 'string' },
59
+ 'skip_message' => { 'type' => 'string', 'optional' => true },
60
+ 'resource' => { 'type' => 'string', 'optional' => true },
61
+ 'message' => { 'type' => 'string', 'optional' => true },
62
+ 'exception' => { 'type' => 'string', 'optional' => true },
63
+ 'backtrace' => { 'type' => 'object', 'optional' => true },
64
+ },
65
+ }.freeze
66
+
67
+ REF = {
68
+ 'type' => 'object',
69
+ 'additionalProperties' => false,
70
+ 'properties' => {
71
+ 'ref' => { 'type' => 'string' },
72
+ # TODO: One of these needs to be deprecated
73
+ 'uri' => { 'type' => 'string', 'optional' => true },
74
+ 'url' => { 'type' => 'string', 'optional' => true },
75
+ },
76
+ }.freeze
77
+ REFS = { 'type' => 'array', 'items' => REF }.freeze
78
+
79
+ CONTROL = {
80
+ 'type' => 'object',
81
+ 'additionalProperties' => false,
82
+ 'properties' => {
83
+ 'id' => { 'type' => 'string' },
84
+ 'title' => { 'type' => %w{string null} },
85
+ 'desc' => { 'type' => %w{string null} },
86
+ 'impact' => { 'type' => 'number' },
87
+ 'refs' => REFS,
88
+ 'tags' => TAGS,
89
+ 'code' => { 'type' => 'string' },
90
+ 'source_location' => {
91
+ 'type' => 'object',
92
+ 'properties' => {
93
+ 'ref' => { 'type' => 'string' },
94
+ 'line' => { 'type' => 'number' },
95
+ },
96
+ },
97
+ 'results' => { 'type' => 'array', 'items' => RESULT },
98
+ },
99
+ }.freeze
100
+
101
+ SUPPORTS = {
102
+ 'type' => 'object',
103
+ 'additionalProperties' => false,
104
+ 'properties' => {
105
+ 'os-family' => { 'type' => 'string', 'optional' => true },
106
+ },
107
+ }.freeze
108
+
109
+ CONTROL_GROUP = {
110
+ 'type' => 'object',
111
+ 'additionalProperties' => false,
112
+ 'properties' => {
113
+ 'id' => { 'type' => 'string' },
114
+ 'title' => { 'type' => 'string', 'optional' => true },
115
+ 'controls' => { 'type' => 'array', 'items' => { 'type' => 'string' } },
116
+ },
117
+ }.freeze
118
+
119
+ PROFILE = {
120
+ 'type' => 'object',
121
+ 'additionalProperties' => false,
122
+ 'properties' => {
123
+ 'name' => { 'type' => 'string' },
124
+ 'version' => { 'type' => 'string', 'optional' => true },
125
+ 'sha256' => { 'type' => 'string', 'optional' => false },
126
+
127
+ 'title' => { 'type' => 'string', 'optional' => true },
128
+ 'maintainer' => { 'type' => 'string', 'optional' => true },
129
+ 'copyright' => { 'type' => 'string', 'optional' => true },
130
+ 'copyright_email' => { 'type' => 'string', 'optional' => true },
131
+ 'license' => { 'type' => 'string', 'optional' => true },
132
+ 'summary' => { 'type' => 'string', 'optional' => true },
133
+
134
+ 'supports' => {
135
+ 'type' => 'array',
136
+ 'items' => SUPPORTS,
137
+ 'optional' => true,
138
+ },
139
+ 'controls' => {
140
+ 'type' => 'array',
141
+ 'items' => CONTROL,
142
+ },
143
+ 'groups' => {
144
+ 'type' => 'array',
145
+ 'items' => CONTROL_GROUP,
146
+ },
147
+ 'attributes' => {
148
+ 'type' => 'array',
149
+ # TODO: more detailed specification needed
150
+ },
151
+ },
152
+ }.freeze
153
+
154
+ EXEC_JSON = {
155
+ 'type' => 'object',
156
+ 'additionalProperties' => false,
157
+ 'properties' => {
158
+ 'platform' => PLATFORM,
159
+ 'profiles' => {
160
+ 'type' => 'array',
161
+ 'items' => PROFILE,
162
+ },
163
+ 'statistics' => STATISTICS,
164
+ 'version' => { 'type' => 'string' },
165
+ },
166
+ }.freeze
167
+
168
+ MIN_CONTROL = {
169
+ 'type' => 'object',
170
+ 'additionalProperties' => false,
171
+ 'properties' => {
172
+ 'id' => { 'type' => 'string' },
173
+ 'profile_id' => { 'type' => %w{string null} },
174
+ 'profile_sha256' => { 'type' => 'string' },
175
+ 'status' => { 'type' => 'string' },
176
+ 'code_desc' => { 'type' => 'string' },
177
+ 'skip_message' => { 'type' => 'string', 'optional' => true },
178
+ 'resource' => { 'type' => 'string', 'optional' => true },
179
+ 'message' => { 'type' => 'string', 'optional' => true },
180
+ 'exception' => { 'type' => 'string', 'optional' => true },
181
+ 'backtrace' => { 'type' => 'object', 'optional' => true },
182
+ },
183
+ }.freeze
184
+
185
+ EXEC_JSONMIN = {
186
+ 'type' => 'object',
187
+ 'additionalProperties' => false,
188
+ 'properties' => {
189
+ 'statistics' => STATISTICS,
190
+ 'version' => { 'type' => 'string' },
191
+ 'controls' => {
192
+ 'type' => 'array',
193
+ 'items' => MIN_CONTROL,
194
+ },
195
+ },
196
+ }.freeze
197
+
198
+ LIST = {
199
+ 'exec-json' => EXEC_JSON,
200
+ 'exec-jsonmin' => EXEC_JSONMIN,
201
+ }.freeze
202
+
203
+ def self.names
204
+ LIST.keys
205
+ end
206
+
207
+ def self.json(name)
208
+ v = LIST[name] ||
209
+ raise("Cannot find schema #{name.inspect}.")
210
+ JSON.dump(v)
211
+ end
212
+ end
213
+ end