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,24 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ module Inspec
6
+ module MethodSource
7
+ def self.code_at(location, source_reader)
8
+ # TODO: logger for these cases
9
+ return '' if location.nil? || location[:ref].nil? || location[:line].nil?
10
+ return '' unless source_reader && source_reader.target
11
+
12
+ # TODO: Non-controls still need more detection
13
+ ref = location[:ref]
14
+ ref = ref.sub(source_reader.target.prefix, '')
15
+ src = source_reader.tests[ref]
16
+ return '' if src.nil?
17
+
18
+ ::MethodSource.expression_at(src.lines, location[:line]).force_encoding('utf-8')
19
+ rescue SyntaxError => e
20
+ raise ::MethodSource::SourceNotFoundError,
21
+ "Could not parse source at #{location[:ref]}:#{location[:line]}: #{e.message}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ module Inspec
4
+ autoload :Attribute, 'inspec/objects/attribute'
5
+ autoload :Tag, 'inspec/objects/tag'
6
+ autoload :Control, 'inspec/objects/control'
7
+ autoload :Describe, 'inspec/objects/describe'
8
+ autoload :EachLoop, 'inspec/objects/each_loop'
9
+ autoload :List, 'inspec/objects/list'
10
+ autoload :OrTest, 'inspec/objects/or_test'
11
+ autoload :RubyHelper, 'inspec/objects/ruby_helper'
12
+ autoload :Test, 'inspec/objects/test'
13
+ autoload :Value, 'inspec/objects/value'
14
+ end
@@ -0,0 +1,75 @@
1
+ # encoding:utf-8
2
+
3
+ module Inspec
4
+ class Attribute
5
+ attr_accessor :name
6
+ attr_writer :value
7
+
8
+ DEFAULT_ATTRIBUTE = Class.new do
9
+ def initialize(name)
10
+ @name = name
11
+ end
12
+
13
+ def method_missing(*_)
14
+ Inspec::Log.warn(
15
+ "Returning DEFAULT_ATTRIBUTE for '#{@name}'. "\
16
+ "Use --attrs to provide a value for '#{@name}' or specify a default "\
17
+ "value with `attribute('#{@name}', default: 'somedefault', ...)`.",
18
+ )
19
+
20
+ self
21
+ end
22
+
23
+ def respond_to_missing?(_, _)
24
+ true
25
+ end
26
+ end
27
+
28
+ def initialize(name, options = {})
29
+ @name = name
30
+ @opts = options
31
+ @value = nil
32
+ end
33
+
34
+ # implicit call is done by inspec to determine the value of an attribute
35
+ def value
36
+ @value.nil? ? default : @value
37
+ end
38
+
39
+ def default
40
+ @opts.key?(:default) ? @opts[:default] : DEFAULT_ATTRIBUTE.new(@name)
41
+ end
42
+
43
+ def title
44
+ @opts[:title]
45
+ end
46
+
47
+ def description
48
+ @opts[:description]
49
+ end
50
+
51
+ def ruby_var_identifier
52
+ @opts[:identifier] || 'attr_' + @name.downcase.strip.gsub(/\s+/, '-').gsub(/[^\w-]/, '')
53
+ end
54
+
55
+ def to_hash
56
+ {
57
+ name: @name,
58
+ options: @opts,
59
+ }
60
+ end
61
+
62
+ def to_ruby
63
+ res = ["#{ruby_var_identifier} = attribute('#{@name}',{"]
64
+ res.push " title: '#{title}'," unless title.to_s.empty?
65
+ res.push " default: #{default.inspect}," unless default.to_s.empty?
66
+ res.push " description: '#{description}'," unless description.to_s.empty?
67
+ res.push '})'
68
+ res.join("\n")
69
+ end
70
+
71
+ def to_s
72
+ "Attribute #{@name} with #{@value}"
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,61 @@
1
+ # encoding:utf-8
2
+
3
+ module Inspec
4
+ class Control
5
+ attr_accessor :id, :title, :desc, :impact, :tests, :tags, :refs
6
+ def initialize
7
+ @tests = []
8
+ @tags = []
9
+ @refs = []
10
+ end
11
+
12
+ def add_test(t)
13
+ @tests.push(t)
14
+ end
15
+
16
+ def add_tag(t)
17
+ @tags.push(t)
18
+ end
19
+
20
+ def to_hash
21
+ { id: id, title: title, desc: desc, impact: impact, tests: tests.map(&:to_hash), tags: tags.map(&:to_hash) }
22
+ end
23
+
24
+ def to_ruby # rubocop:disable Metrics/AbcSize
25
+ res = ["control #{id.inspect} do"]
26
+ res.push " title #{title.inspect}" unless title.to_s.empty?
27
+ res.push " desc #{prettyprint_text(desc, 2)}" unless desc.to_s.empty?
28
+ res.push " impact #{impact}" unless impact.nil?
29
+ tags.each { |t| res.push(indent(t.to_ruby, 2)) }
30
+ refs.each { |t| res.push(" ref #{print_ref(t)}") }
31
+ tests.each { |t| res.push(indent(t.to_ruby, 2)) }
32
+ res.push 'end'
33
+ res.join("\n")
34
+ end
35
+
36
+ private
37
+
38
+ def print_ref(x)
39
+ return x.inspect if x.is_a?(String)
40
+ raise "Cannot process the ref: #{x}" unless x.is_a?(Hash)
41
+ '('+x.inspect+')'
42
+ end
43
+
44
+ # Pretty-print a text block of InSpec code
45
+ #
46
+ # @param s [String] should not be empty
47
+ # @param depth [Int] indentation length for multiline text blocks
48
+ # @return [String] pretty-printed textblock
49
+ def prettyprint_text(s, depth)
50
+ txt = s.to_s.inspect.gsub('\n', "\n")
51
+ return txt if !txt.include?("\n")
52
+ middle = indent(txt[1..-2], depth+2)
53
+ txt[0] + "\n" + middle + "\n" + ' '*depth + txt[-1]
54
+ end
55
+
56
+ def indent(txt, d)
57
+ dt = ' '*d
58
+ dt + txt.gsub("\n", "\n"+dt)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,92 @@
1
+ # encoding:utf-8
2
+
3
+ module Inspec
4
+ class Describe
5
+ # Internal helper to structure test objects.
6
+ # Should not be exposed to the user as it is hidden behind
7
+ # `add_test`, `to_hash`, and `to_ruby` in Inspec::Describe
8
+ Test = Struct.new(:its, :matcher, :expectation, :negated) do
9
+ def negate!
10
+ self.negated = !negated
11
+ end
12
+
13
+ def to_ruby
14
+ itsy = its.nil? ? 'it' : 'its(' + its.to_s.inspect + ')'
15
+ naughty = negated ? '_not' : ''
16
+ xpect = if expectation.nil?
17
+ ''
18
+ elsif expectation.class == Regexp
19
+ # without this, xpect values like / \/zones\// will not be parsed properly
20
+ "(#{expectation.inspect})"
21
+ else
22
+ ' ' + expectation.inspect
23
+ end
24
+ format('%s { should%s %s%s }', itsy, naughty, matcher, xpect)
25
+ end
26
+ end
27
+
28
+ # A qualifier describing the resource that will be tested. It may consist
29
+ # of the resource identification and multiple accessors to pinpoint the data
30
+ # the user wants to test.
31
+ attr_accessor :qualifier
32
+
33
+ # An array of individual tests for the qualifier. Every entry will be
34
+ # translated into an `it` or `its` clause.
35
+ attr_accessor :tests
36
+
37
+ # Optional variables which are used by tests.
38
+ attr_accessor :variables
39
+
40
+ # Optional method to skip this describe block altogether. If `skip` is
41
+ # defined it takes precendence and will print the skip statement instead
42
+ # of adding other tests.
43
+ attr_accessor :skip
44
+
45
+ include RubyHelper
46
+
47
+ def initialize
48
+ @qualifier = []
49
+ @tests = []
50
+ @variables = []
51
+ end
52
+
53
+ def add_test(its, matcher, expectation)
54
+ test = Inspec::Describe::Test.new(its, matcher, expectation, false)
55
+ tests.push(test)
56
+ test
57
+ end
58
+
59
+ def to_ruby
60
+ return rb_skip if !skip.nil?
61
+ rb_describe
62
+ end
63
+
64
+ def to_hash
65
+ { qualifier: qualifier, tests: tests.map(&:to_h), variables: variables, skip: skip }
66
+ end
67
+
68
+ def resource
69
+ return nil if qualifier.empty? || qualifier[0].empty? || qualifier[0][0].empty?
70
+ qualifier[0][0]
71
+ end
72
+
73
+ private
74
+
75
+ def rb_describe
76
+ vars = variables.map(&:to_ruby).join("\n")
77
+ vars += "\n" unless vars.empty?
78
+
79
+ objarr = @qualifier
80
+ objarr = [['unknown object'.inspect]] if objarr.nil? || objarr.empty?
81
+ obj = objarr.map { |q| ruby_qualifier(q) }.join('.')
82
+
83
+ rbtests = tests.map(&:to_ruby).join("\n ")
84
+ format("%sdescribe %s do\n %s\nend", vars, obj, rbtests)
85
+ end
86
+
87
+ def rb_skip
88
+ obj = @qualifier || skip.inspect
89
+ format("describe %s do\n skip %s\nend", obj, skip.inspect)
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,36 @@
1
+ # encoding:utf-8
2
+
3
+ module Inspec
4
+ class EachLoop < List
5
+ attr_reader :variables
6
+ attr_accessor :tests
7
+ def initialize
8
+ super
9
+ @tests = []
10
+ @variables = []
11
+ end
12
+
13
+ def add_test(t = nil)
14
+ t ||= Test.new
15
+ t.qualifier[0] = ['entry']
16
+ @tests.push(t)
17
+ t
18
+ end
19
+
20
+ def negate!
21
+ @tests.each(&:negate!)
22
+ end
23
+
24
+ def to_hash
25
+ { qualifier: qualifier, test: @test }
26
+ end
27
+
28
+ def to_ruby
29
+ vars = variables.map(&:to_ruby).join("\n")
30
+ vars += "\n" unless vars.empty?
31
+ obj = super
32
+ all_tests = @tests.map(&:to_ruby).join("\n").gsub("\n", "\n ")
33
+ format("%s%s.each do |entry|\n %s\nend", vars, obj, all_tests)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ # encoding:utf-8
2
+
3
+ module Inspec
4
+ class List < Value
5
+ def map
6
+ raise 'Inspec::List.map needs to be called with a block' unless block_given?
7
+ t = List.new
8
+ t.qualifier = [['x']]
9
+ yield(t)
10
+ return if t.qualifier == [['x']]
11
+ @qualifier.push(['map', "{ |x| #{t.to_ruby} }"])
12
+ self
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ # encoding:utf-8
2
+
3
+ module Inspec
4
+ class OrTest
5
+ attr_reader :tests
6
+ def initialize(tests)
7
+ @tests = tests
8
+ @negated = false
9
+ end
10
+
11
+ def skip
12
+ nil
13
+ end
14
+
15
+ def negate!
16
+ @negated = !@negated
17
+ end
18
+
19
+ def to_ruby
20
+ if @negated
21
+ # We don't use the describe.one wrapper when negated because:
22
+ # !(test1 || test2) same as (!test1 && !test2) where && is implicit in inspec
23
+ all_tests = @tests.map { |test|
24
+ test.negate!
25
+ test
26
+ }.map(&:to_ruby).join("\n")
27
+
28
+ all_tests
29
+ else
30
+ all_tests = @tests.map(&:to_ruby).join("\n").gsub("\n", "\n ")
31
+
32
+ format("describe.one do\n %s\nend", all_tests)
33
+ end
34
+ end
35
+
36
+ def to_hash
37
+ { describe_one: @tests.map(&:to_hash) }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ module Inspec
4
+ module RubyHelper
5
+ def ruby_qualifier(q)
6
+ if q.length <= 1
7
+ q[0]
8
+ elsif q[0] == 'map' && q.length == 2
9
+ q[0] + ' ' + q[1]
10
+ else
11
+ q[0] + '(' + q[1..-1].map(&:inspect).join(', ') + ')'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ # encoding:utf-8
2
+
3
+ module Inspec
4
+ class Tag
5
+ attr_accessor :key, :value
6
+
7
+ def initialize(key, value)
8
+ @key = key
9
+ @value = value
10
+ end
11
+
12
+ def to_hash
13
+ {
14
+ name: key,
15
+ value: value,
16
+ }
17
+ end
18
+
19
+ def to_ruby
20
+ "tag #{key.inspect}: #{value.inspect}"
21
+ end
22
+
23
+ def to_s
24
+ "Tag #{key} with #{value}"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,87 @@
1
+ # encoding:utf-8
2
+
3
+ module Inspec
4
+ class Test
5
+ attr_accessor :qualifier, :matcher, :expectation, :skip, :negated, :variables
6
+ include RubyHelper
7
+
8
+ def initialize
9
+ @qualifier = []
10
+ @negated = false
11
+ @variables = []
12
+ end
13
+
14
+ def negate!
15
+ @negated = !@negated
16
+ end
17
+
18
+ def to_ruby
19
+ return rb_skip if !skip.nil?
20
+ rb_describe
21
+ end
22
+
23
+ def to_hash
24
+ { qualifier: qualifier, matcher: matcher, expectation: expectation, skip: skip, negated: negated }
25
+ end
26
+
27
+ def resource
28
+ @resource ||=
29
+ if qualifier.empty? || qualifier[0].empty? || qualifier[0][0].empty?
30
+ nil
31
+ else
32
+ qualifier[0][0]
33
+ end
34
+ end
35
+
36
+ def remove_expectation
37
+ remove_instance_variable(:@expectation)
38
+ end
39
+
40
+ private
41
+
42
+ def describe_chain
43
+ return nil if @qualifier.empty?
44
+
45
+ resource = @qualifier.length > 1 ? @qualifier[0..-2] : [@qualifier[0]]
46
+ res = resource.map { |q| ruby_qualifier(q) }.join('.')
47
+ xres = nil
48
+
49
+ if @qualifier.length > 1
50
+ last = @qualifier[-1]
51
+ last_call = last.is_a?(Array) ? last[0].to_s : ''
52
+ if last.length == 1 && last_call !~ /^to_.$/ && !last_call.include?('[') && !last_call.empty?
53
+ # this will go in its()
54
+ xres = last_call
55
+ else
56
+ res += '.' + ruby_qualifier(last) unless last_call.empty?
57
+ end
58
+ end
59
+
60
+ [res, xres]
61
+ end
62
+
63
+ def rb_describe
64
+ vars = variables.map(&:to_ruby).join("\n")
65
+ vars += "\n" unless vars.empty?
66
+ res, xtra = describe_chain
67
+ itsy = xtra.nil? ? 'it' : 'its(' + xtra.to_s.inspect + ')'
68
+ naughty = @negated ? '_not' : ''
69
+ xpect = if !defined?(@expectation)
70
+ ''
71
+ elsif @expectation.class == Regexp
72
+ # without this, xpect values like / \/zones\// will not be parsed properly
73
+ "(#{@expectation.inspect})"
74
+ elsif xpect != ''
75
+ ' ' + expectation.inspect
76
+ end
77
+ format("%sdescribe %s do\n %s { should%s %s%s }\nend",
78
+ vars, res, itsy, naughty, matcher, xpect)
79
+ end
80
+
81
+ def rb_skip
82
+ dc = describe_chain
83
+ obj = dc.nil? ? skip.inspect : dc[0]
84
+ format("describe %s do\n skip %s\nend", obj, skip.inspect)
85
+ end
86
+ end
87
+ end