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,60 @@
1
+ # encoding: utf-8
2
+
3
+ module Inspec::Resources
4
+ class ZfsDataset < Inspec.resource(1)
5
+ name 'zfs_dataset'
6
+ supports platform: 'unix'
7
+ desc "
8
+ Use the zfs_dataset InSpec audit resource to test if the named
9
+ ZFS Dataset is present and/or has certain properties.
10
+ "
11
+ example "
12
+ describe zfs_dataset('tank/tmp') do
13
+ its('exec') { should eq('off') }
14
+ its('setuid') { should eq('off') }
15
+ end
16
+ "
17
+
18
+ def initialize(zfs_dataset)
19
+ return skip_resource 'The `zfs_dataset` resource is not supported on your OS yet.' if !inspec.os.bsd?
20
+ @zfs_dataset = zfs_dataset
21
+
22
+ @params = gather
23
+ end
24
+
25
+ # method called by 'it { should exist }'
26
+ def exists?
27
+ inspec.command("/sbin/zfs get -Hp all #{@zfs_dataset}").exit_status == 0
28
+ end
29
+
30
+ def mounted?
31
+ return false if !exists?
32
+ inspec.mount(@params['mountpoint']).mounted?
33
+ end
34
+
35
+ def to_s
36
+ "ZFS Dataset #{@zfs_dataset}"
37
+ end
38
+
39
+ def gather
40
+ cmd = inspec.command("/sbin/zfs get -Hp all #{@zfs_dataset}")
41
+ return nil if cmd.exit_status.to_i != 0
42
+
43
+ # parse data
44
+ cmd.stdout.chomp.split("\n").each_with_object(Hash.new(0)) do |line, h|
45
+ t = line.split("\t")
46
+ h[t[1].to_s] = t[2].to_s
47
+ end
48
+ end
49
+
50
+ # override method
51
+ def exec
52
+ @params['exec']
53
+ end
54
+
55
+ # expose all parameters
56
+ def method_missing(name)
57
+ @params[name.to_s]
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ module Inspec::Resources
4
+ class ZfsPool < Inspec.resource(1)
5
+ name 'zfs_pool'
6
+ supports platform: 'unix'
7
+ desc "
8
+ Use the zfs_pool InSpec audit resource to test if the named
9
+ ZFS Pool is present and/or has certain properties.
10
+ "
11
+ example "
12
+ describe zfs_pool('tank') do
13
+ its('failmode') { should eq('continue') }
14
+ end
15
+ "
16
+
17
+ def initialize(zfs_pool)
18
+ return skip_resource 'The `zfs_pool` resource is not supported on your OS yet.' if !inspec.os.bsd?
19
+ @zfs_pool = zfs_pool
20
+
21
+ @params = gather
22
+ end
23
+
24
+ # method called by 'it { should exist }'
25
+ def exists?
26
+ inspec.command("/sbin/zpool get -Hp all #{@zfs_pool}").exit_status == 0
27
+ end
28
+
29
+ def to_s
30
+ "ZFS Pool #{@zfs_pool}"
31
+ end
32
+
33
+ def gather
34
+ cmd = inspec.command("/sbin/zpool get -Hp all #{@zfs_pool}")
35
+ return nil if cmd.exit_status.to_i != 0
36
+
37
+ # parse data
38
+ cmd.stdout.chomp.split("\n").each_with_object(Hash.new(0)) do |line, h|
39
+ t = line.split("\t")
40
+ h[t[1].to_s] = t[2].to_s
41
+ end
42
+ end
43
+
44
+ # expose all parameters
45
+ def method_missing(name)
46
+ @params[name.to_s]
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ require 'inspec/fetcher'
6
+ require 'inspec/metadata'
7
+
8
+ module SourceReaders
9
+ class Flat < Inspec.source_reader(1)
10
+ name 'flat'
11
+ priority 5
12
+
13
+ def self.resolve(target)
14
+ # TODO: eventually remove the metadata.rb exception here
15
+ # when we have fully phased out metadata.rb in 1.0
16
+ files = target.files.find_all { |x|
17
+ x.end_with?('.rb') && !x.include?('/') && x != 'metadata.rb'
18
+ }
19
+ return nil if files.empty?
20
+ new(target, files)
21
+ end
22
+
23
+ attr_reader :metadata, :tests, :libraries, :data_files
24
+
25
+ def initialize(target, files)
26
+ @target = target
27
+ @metadata = ::Inspec::Metadata.new(nil)
28
+ @tests = load_tests(files)
29
+ @libraries = {}
30
+ @data_files = {}
31
+ end
32
+
33
+ private
34
+
35
+ def load_tests(files)
36
+ Hash[files.map { |x| [x, @target.read(x)] }]
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,75 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ require 'inspec/fetcher'
6
+ require 'inspec/metadata'
7
+
8
+ module SourceReaders
9
+ class InspecReader < Inspec.source_reader(1)
10
+ name 'inspec'
11
+ priority 10
12
+
13
+ def self.resolve(target)
14
+ return new(target, 'inspec.yml') if target.files.include?('inspec.yml')
15
+ # TODO: deprecated for 1.0.0 release
16
+ if target.files.include?('metadata.rb') &&
17
+ (
18
+ target.files.include?('controls') ||
19
+ target.files.include?('test')
20
+ )
21
+ return new(target, 'metadata.rb')
22
+ end
23
+ nil
24
+ end
25
+
26
+ attr_reader :metadata, :tests, :libraries, :data_files
27
+
28
+ # This create a new instance of an InSpec profile source reader
29
+ #
30
+ # @param [FileProvider] target An instance of a FileProvider object that can list files and read them
31
+ # @param [String] metadata_source eg. inspec.yml or metadata.rb
32
+ def initialize(target, metadata_source)
33
+ @target = target
34
+ @metadata = load_metadata(metadata_source)
35
+ @tests = load_tests
36
+ @libraries = load_libs
37
+ @data_files = load_data_files
38
+ end
39
+
40
+ private
41
+
42
+ def load_metadata(metadata_source)
43
+ Inspec::Metadata.from_ref(
44
+ metadata_source,
45
+ @target.read(metadata_source),
46
+ nil,
47
+ )
48
+ rescue Psych::SyntaxError => e
49
+ raise "Unable to parse inspec.yml: line #{e.line}, #{e.problem} #{e.context}"
50
+ rescue => e
51
+ raise "Unable to parse #{metadata_source}: #{e.class} -- #{e.message}"
52
+ end
53
+
54
+ def load_tests
55
+ tests = @target.files.find_all do |path|
56
+ path.start_with?('controls') && path.end_with?('.rb')
57
+ end
58
+ Hash[tests.map { |x| [x, @target.read(x)] }.delete_if { |_file, contents| contents.nil? }]
59
+ end
60
+
61
+ def load_libs
62
+ tests = @target.files.find_all do |path|
63
+ path.start_with?('libraries') && path.end_with?('.rb')
64
+ end
65
+ Hash[tests.map { |x| [x, @target.read(x)] }.delete_if { |_file, contents| contents.nil? }]
66
+ end
67
+
68
+ def load_data_files
69
+ files = @target.files.find_all do |path|
70
+ path.start_with?('files' + File::SEPARATOR)
71
+ end
72
+ Hash[files.map { |x| [x, @target.read(x)] }.delete_if { |_file, contents| contents.nil? }]
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ require 'shellwords'
6
+
7
+ class CommandWrapper
8
+ UNIX_SHELLS = %w{sh bash zsh}.freeze
9
+
10
+ def self.wrap(cmd, options)
11
+ unless options.is_a?(Hash)
12
+ raise 'All options for the command wrapper must be provided as a hash. '\
13
+ "You entered: #{options.inspect}. Please consult the documentation."
14
+ end
15
+
16
+ wrap = options[:wrap]
17
+ raise "Called command wrapper with wrap: #{wrap.inspect}. It must be called with a Proc." if !wrap.nil? && !wrap.is_a?(Proc)
18
+ return wrap.call(cmd) unless wrap.nil?
19
+
20
+ shell = options[:shell]
21
+ raise "Don't know how to wrap commands for shell: #{shell.inspect}." unless UNIX_SHELLS.include?(shell)
22
+
23
+ path = options[:path] || shell
24
+ args = options[:args] || '-c'
25
+ path.to_s + ' ' + args + ' ' + Shellwords.escape(cmd)
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ module Converter
6
+ # convert the value to an integer if we have numbers only
7
+ # otherwise we return the string
8
+ def convert_to_i(val)
9
+ val = val.to_i if val =~ /^\d+$/
10
+ val
11
+ end
12
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+
5
+ module DatabaseHelper
6
+ class SQLColumn
7
+ def initialize(row, name)
8
+ @row = row
9
+ @name = name
10
+ end
11
+
12
+ def value
13
+ @row.nil? ? '' : @row[@name.downcase]
14
+ end
15
+
16
+ def to_s
17
+ 'SQL Column'
18
+ end
19
+ end
20
+
21
+ class SQLRow
22
+ def initialize(query, row)
23
+ @query = query
24
+ @row = row
25
+ end
26
+
27
+ def column(column)
28
+ SQLColumn.new(@row, column)
29
+ end
30
+
31
+ def to_s
32
+ 'SQL Row'
33
+ end
34
+ end
35
+
36
+ class SQLQueryResult
37
+ attr_reader :error
38
+ def initialize(cmd, results)
39
+ @cmd = cmd
40
+ @results = results
41
+ end
42
+
43
+ def empty?
44
+ @results.empty?
45
+ end
46
+
47
+ def successful?
48
+ @cmd.exit_status == 0 && @error.nil?
49
+ end
50
+
51
+ def row(id)
52
+ SQLRow.new(self, @results[id])
53
+ end
54
+
55
+ def size
56
+ @results.size
57
+ end
58
+
59
+ def stdout
60
+ warn '[DEPRECATION] The `stdout` method is deprecated. Use `row` instead.'
61
+ @cmd.stdout
62
+ end
63
+
64
+ def stderr
65
+ warn '[DEPRECATION] The `stderr` method is deprecated. Use `successful?` instead.'
66
+ @cmd.stderr
67
+ end
68
+
69
+ def inspect
70
+ to_s
71
+ end
72
+
73
+ def to_s
74
+ 'SQL ResultSet'
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module EnumerableDelegation
4
+ include Enumerable
5
+
6
+ def each(&block)
7
+ @params.each(&block)
8
+ end
9
+ end
@@ -0,0 +1,192 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ require 'parslet'
6
+
7
+ class ErlangParser < Parslet::Parser
8
+ root :outermost
9
+ # only designed for rabbitmq config files for now:
10
+ rule(:outermost) { filler? >> array.maybe >> dot.maybe }
11
+
12
+ rule(:exp) {
13
+ (tuple | array | binary | string | bool | identifier | float | integer) >> filler?
14
+ }
15
+
16
+ rule(:array) {
17
+ str('[') >> filler? >> (
18
+ exp.repeat(1) >>
19
+ (comma >> exp).repeat
20
+ ).maybe.as(:array) >> str(']') >> filler?
21
+ }
22
+
23
+ rule(:tuple) {
24
+ str('{') >> filler? >> (
25
+ exp.repeat(1) >> filler? >>
26
+ (comma >> exp).repeat
27
+ ).maybe.as(:tuple) >> str('}') >> filler?
28
+ }
29
+
30
+ rule(:filler?) { space.repeat }
31
+ rule(:space) { match('\s+') | match["\n"] | comment }
32
+
33
+ rule(:comment) { str('%') >> (match["\n\r"].absent? >> any).repeat }
34
+ rule(:comma) { str(',') >> filler? }
35
+ rule(:dot) { str('.') >> filler? }
36
+ rule(:bool) { str('true').as(:bool) | str('false').as(:bool) }
37
+
38
+ rule(:identifier) {
39
+ (match('[a-zA-Z]') >> match('[a-zA-Z0-9_]').repeat).as(:identifier) >> filler?
40
+ }
41
+
42
+ rule(:float) {
43
+ (
44
+ integer >> (
45
+ str('.') >> match('[0-9]').repeat(1) |
46
+ str('e') >> match('[0-9]').repeat(1)
47
+ ).as(:e)
48
+ ).as(:float) >> filler?
49
+ }
50
+
51
+ rule(:integer) {
52
+ ((str('+') | str('-')).maybe >> match('[0-9]').repeat(1)).as(:integer) >> filler?
53
+ }
54
+
55
+ rule(:string) { stringS | stringD }
56
+
57
+ rule(:stringS) {
58
+ str("'") >> (
59
+ str('\\') >> any | str("'").absent? >> any
60
+ ).repeat.as(:string) >> str("'") >> filler?
61
+ }
62
+
63
+ rule(:stringD) {
64
+ str('"') >> (
65
+ str('\\') >> any | str('"').absent? >> any
66
+ ).repeat.as(:string) >> str('"') >> filler?
67
+ }
68
+
69
+ rule(:binary_item) {
70
+ (string | integer) >>
71
+ (str(':') >> integer).maybe.as(:size) >>
72
+ (str('/') >> identifier).maybe.as(:type) >>
73
+ filler?
74
+ }
75
+
76
+ rule(:binary) {
77
+ str('<<') >> filler? >> (
78
+ binary_item.repeat(1) >>
79
+ (comma >> binary_item).repeat
80
+ ).maybe.as(:binary) >> str('>>') >> filler?
81
+ }
82
+ end
83
+
84
+ class ErlangBitstream
85
+ def initialize
86
+ @data = [] # a stream of 8-bit numbers
87
+ @cur_bits = '' # a string of binary bits 10010010...
88
+ end
89
+
90
+ TYPES = {
91
+ 'integer' => 8,
92
+ 'float' => 8*8,
93
+ 'utf8' => 8,
94
+ 'utf16' => 8*2,
95
+ 'utf32' => 8*4,
96
+ }.freeze
97
+
98
+ def bit_size(size, type)
99
+ raise 'Cannot specify size and type at the same time.' if !type.nil? && !size.nil?
100
+ return (size || 8).to_i if type.nil?
101
+ TYPES[type] || raise("Cannot handle binary-stream type #{type}")
102
+ end
103
+
104
+ def add(i)
105
+ if i[:integer].nil? && i[:string].nil?
106
+ raise 'No data provided, internal error for binary-stream processing!'
107
+ end
108
+ s = bit_size(i[:size], i[:type])
109
+ unless i[:string].nil?
110
+ str2int(i[:string].to_s, i[:type]).map { |e| add_bits(int2bits(e, 8)) }
111
+ else
112
+ add_int(i[:integer], s)
113
+ end
114
+ rescue RuntimeError => e
115
+ raise 'Error processing Erlang bit string '\
116
+ "'#{i[:string] || i[:integer]}:#{i[:size]}/#{i[:type]}'. #{e.message}"
117
+ end
118
+
119
+ def str2int(s, type)
120
+ case type
121
+ when 'utf8' then s.encode('utf-8').unpack('C*')
122
+ when 'utf16' then s.encode('utf-16').unpack('C*').drop(2)
123
+ when 'utf32' then s.encode('utf-32').unpack('C*').drop(4)
124
+ when 'integer', 'float' then raise "Cannot handle bit string as type #{type}"
125
+ else s.split('').map { |x| x.ord & 0xff }
126
+ end
127
+ end
128
+
129
+ def int2bits(i, len)
130
+ format("%0#{len}b", i)
131
+ end
132
+
133
+ def add_int(v, size)
134
+ x = v.to_i & (2**size - 1) # only get the bits specified in size
135
+ add_bits(int2bits(x, size))
136
+ end
137
+
138
+ def add_bits(s)
139
+ b = (@cur_bits + s).scan(/.{1,8}/)
140
+ @data += b[0..-2].map { |x| x.to_i(2) }
141
+ @cur_bits = b.last
142
+ end
143
+
144
+ def value(encoding = 'utf-8')
145
+ # fill in the rest
146
+ rest = '0' * (8 - @cur_bits.length) + @cur_bits
147
+ arr = @data + [rest.to_i(2)]
148
+ s = arr.pack('C*')
149
+ s.force_encoding(encoding) unless encoding.nil?
150
+ s
151
+ end
152
+ end
153
+
154
+ class ErlangTransform < Parslet::Transform
155
+ class Tuple < Array; end
156
+ class Identifier < String; end
157
+
158
+ def self.assemble_binary(seq)
159
+ b = ErlangBitstream.new
160
+ seq.each { |i| b.add(i) }
161
+ b.value
162
+ end
163
+
164
+ rule(string: simple(:x)) { x.to_s }
165
+ rule(string: []) { '' }
166
+ rule(integer: simple(:x)) { x.to_i }
167
+ rule(float: { integer: simple(:a), e: simple(:b) }) { (a+b).to_f }
168
+ rule(bool: 'true') { true }
169
+ rule(bool: 'false') { false }
170
+ rule(binary: subtree(:x)) { x.nil? ? '' : ErlangTransform.assemble_binary(x) }
171
+ rule(identifier: simple(:x)) { Identifier.new(x.to_s) }
172
+ rule(array: subtree(:x)) { Array(x) }
173
+ rule(tuple: subtree(:x)) {
174
+ x.nil? ? Tuple.new : Tuple.new(x)
175
+ }
176
+ end
177
+
178
+ class ErlangConfigFile
179
+ def self.parse(content)
180
+ lex = ErlangParser.new.parse(content)
181
+ tree = ErlangTransform.new.apply(lex)
182
+ turn_to_hash(tree)
183
+ end
184
+
185
+ def self.turn_to_hash(t)
186
+ if t.is_a?(Array) && t.all? { |x| x.class == ErlangTransform::Tuple && x.length == 2 }
187
+ Hash[t.map { |i| [i[0], turn_to_hash(i[1])] }]
188
+ else
189
+ t
190
+ end
191
+ end
192
+ end