inspec 4.3.2 → 4.6.3

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 (368) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +36 -38
  3. data/README.md +37 -21
  4. data/etc/deprecations.json +10 -0
  5. data/etc/plugin_filters.json +8 -0
  6. data/inspec.gemspec +38 -39
  7. data/lib/bundles/inspec-compliance/api.rb +1 -1
  8. data/lib/bundles/inspec-compliance/configuration.rb +1 -1
  9. data/lib/bundles/inspec-compliance/http.rb +1 -1
  10. data/lib/bundles/inspec-compliance/support.rb +1 -1
  11. data/lib/bundles/inspec-compliance/target.rb +1 -1
  12. data/lib/bundles/inspec-supermarket.rb +3 -7
  13. data/lib/bundles/inspec-supermarket/api.rb +10 -13
  14. data/lib/bundles/inspec-supermarket/cli.rb +12 -15
  15. data/lib/bundles/inspec-supermarket/target.rb +7 -11
  16. data/lib/fetchers/git.rb +14 -15
  17. data/lib/fetchers/local.rb +6 -10
  18. data/lib/fetchers/mock.rb +3 -5
  19. data/lib/fetchers/url.rb +42 -44
  20. data/lib/inspec.rb +23 -24
  21. data/lib/inspec/archive/tar.rb +2 -6
  22. data/lib/inspec/archive/zip.rb +3 -7
  23. data/lib/inspec/backend.rb +8 -9
  24. data/lib/inspec/base_cli.rb +64 -65
  25. data/lib/inspec/cached_fetcher.rb +2 -3
  26. data/lib/inspec/cli.rb +136 -97
  27. data/lib/inspec/config.rb +71 -61
  28. data/lib/inspec/control_eval_context.rb +22 -18
  29. data/lib/inspec/dependencies/cache.rb +2 -3
  30. data/lib/inspec/dependencies/dependency_set.rb +2 -3
  31. data/lib/inspec/dependencies/lockfile.rb +8 -9
  32. data/lib/inspec/dependencies/requirement.rb +7 -8
  33. data/lib/inspec/dependencies/resolver.rb +5 -7
  34. data/lib/inspec/describe.rb +2 -6
  35. data/lib/inspec/dist.rb +20 -0
  36. data/lib/inspec/dsl.rb +4 -7
  37. data/lib/inspec/dsl_shared.rb +1 -2
  38. data/lib/inspec/env_printer.rb +11 -12
  39. data/lib/inspec/errors.rb +0 -4
  40. data/lib/inspec/exceptions.rb +0 -1
  41. data/lib/inspec/expect.rb +5 -8
  42. data/lib/inspec/fetcher.rb +7 -10
  43. data/lib/inspec/file_provider.rb +24 -24
  44. data/lib/inspec/formatters.rb +3 -3
  45. data/lib/inspec/formatters/base.rb +8 -8
  46. data/lib/inspec/globals.rb +2 -2
  47. data/lib/inspec/impact.rb +5 -7
  48. data/lib/inspec/input_registry.rb +84 -33
  49. data/lib/inspec/library_eval_context.rb +3 -6
  50. data/lib/inspec/log.rb +1 -5
  51. data/lib/inspec/metadata.rb +17 -16
  52. data/lib/inspec/method_source.rb +5 -9
  53. data/lib/inspec/objects.rb +10 -12
  54. data/lib/inspec/objects/control.rb +7 -9
  55. data/lib/inspec/objects/describe.rb +9 -11
  56. data/lib/inspec/objects/each_loop.rb +1 -3
  57. data/lib/inspec/objects/input.rb +24 -26
  58. data/lib/inspec/objects/list.rb +4 -6
  59. data/lib/inspec/objects/or_test.rb +2 -4
  60. data/lib/inspec/objects/ruby_helper.rb +3 -5
  61. data/lib/inspec/objects/tag.rb +0 -2
  62. data/lib/inspec/objects/test.rb +9 -11
  63. data/lib/inspec/objects/value.rb +3 -5
  64. data/lib/inspec/plugin/v1.rb +2 -2
  65. data/lib/inspec/plugin/v1/plugin_types/cli.rb +1 -5
  66. data/lib/inspec/plugin/v1/plugin_types/fetcher.rb +2 -5
  67. data/lib/inspec/plugin/v1/plugin_types/resource.rb +4 -6
  68. data/lib/inspec/plugin/v1/plugin_types/secret.rb +1 -5
  69. data/lib/inspec/plugin/v1/plugin_types/source_reader.rb +1 -5
  70. data/lib/inspec/plugin/v1/plugins.rb +15 -19
  71. data/lib/inspec/plugin/v1/registry.rb +0 -4
  72. data/lib/inspec/plugin/v2.rb +8 -8
  73. data/lib/inspec/plugin/v2/activator.rb +1 -1
  74. data/lib/inspec/plugin/v2/config_file.rb +6 -6
  75. data/lib/inspec/plugin/v2/filter.rb +13 -13
  76. data/lib/inspec/plugin/v2/installer.rb +36 -24
  77. data/lib/inspec/plugin/v2/loader.rb +28 -28
  78. data/lib/inspec/plugin/v2/plugin_base.rb +15 -2
  79. data/lib/inspec/plugin/v2/plugin_types/cli.rb +5 -5
  80. data/lib/inspec/plugin/v2/plugin_types/input.rb +34 -0
  81. data/lib/inspec/plugin/v2/plugin_types/mock.rb +1 -1
  82. data/lib/inspec/plugin/v2/registry.rb +7 -7
  83. data/lib/inspec/polyfill.rb +0 -3
  84. data/lib/inspec/profile.rb +55 -63
  85. data/lib/inspec/profile_context.rb +27 -30
  86. data/lib/inspec/profile_vendor.rb +6 -9
  87. data/lib/inspec/reporters.rb +24 -24
  88. data/lib/inspec/reporters/automate.rb +17 -19
  89. data/lib/inspec/reporters/base.rb +1 -1
  90. data/lib/inspec/reporters/cli.rb +88 -91
  91. data/lib/inspec/reporters/json.rb +2 -4
  92. data/lib/inspec/reporters/json_automate.rb +1 -3
  93. data/lib/inspec/reporters/json_min.rb +1 -3
  94. data/lib/inspec/reporters/junit.rb +26 -28
  95. data/lib/inspec/reporters/yaml.rb +1 -3
  96. data/lib/inspec/require_loader.rb +0 -4
  97. data/lib/inspec/resource.rb +4 -125
  98. data/lib/inspec/resources.rb +121 -0
  99. data/lib/{resources → inspec/resources}/aide_conf.rb +24 -25
  100. data/lib/{resources → inspec/resources}/apache.rb +13 -14
  101. data/lib/{resources → inspec/resources}/apache_conf.rb +16 -17
  102. data/lib/{resources → inspec/resources}/apt.rb +17 -17
  103. data/lib/{resources → inspec/resources}/audit_policy.rb +7 -6
  104. data/lib/{resources → inspec/resources}/auditd.rb +62 -64
  105. data/lib/{resources → inspec/resources}/auditd_conf.rb +7 -8
  106. data/lib/{resources → inspec/resources}/bash.rb +6 -8
  107. data/lib/{resources → inspec/resources}/bond.rb +15 -14
  108. data/lib/{resources → inspec/resources}/bridge.rb +8 -8
  109. data/lib/{resources → inspec/resources}/chocolatey_package.rb +10 -8
  110. data/lib/{resources → inspec/resources}/command.rb +11 -10
  111. data/lib/{resources → inspec/resources}/cpan.rb +12 -12
  112. data/lib/{resources → inspec/resources}/cran.rb +9 -9
  113. data/lib/{resources → inspec/resources}/crontab.rb +47 -48
  114. data/lib/{resources → inspec/resources}/csv.rb +5 -5
  115. data/lib/{resources → inspec/resources}/dh_params.rb +5 -7
  116. data/lib/{resources → inspec/resources}/directory.rb +5 -7
  117. data/lib/{resources → inspec/resources}/docker.rb +63 -63
  118. data/lib/{resources → inspec/resources}/docker_container.rb +6 -6
  119. data/lib/{resources → inspec/resources}/docker_image.rb +9 -9
  120. data/lib/{resources → inspec/resources}/docker_object.rb +8 -13
  121. data/lib/{resources → inspec/resources}/docker_plugin.rb +6 -6
  122. data/lib/{resources → inspec/resources}/docker_service.rb +7 -7
  123. data/lib/{resources → inspec/resources}/elasticsearch.rb +40 -42
  124. data/lib/{resources → inspec/resources}/etc_fstab.rb +23 -24
  125. data/lib/{resources → inspec/resources}/etc_group.rb +26 -27
  126. data/lib/{resources → inspec/resources}/etc_hosts.rb +11 -13
  127. data/lib/{resources → inspec/resources}/etc_hosts_allow_deny.rb +25 -27
  128. data/lib/{resources → inspec/resources}/file.rb +80 -79
  129. data/lib/{resources → inspec/resources}/filesystem.rb +20 -15
  130. data/lib/{resources → inspec/resources}/firewalld.rb +26 -26
  131. data/lib/{resources → inspec/resources}/gem.rb +12 -12
  132. data/lib/{resources → inspec/resources}/groups.rb +28 -27
  133. data/lib/{resources → inspec/resources}/grub_conf.rb +46 -48
  134. data/lib/{resources → inspec/resources}/host.rb +31 -29
  135. data/lib/{resources → inspec/resources}/http.rb +24 -24
  136. data/lib/{resources → inspec/resources}/iis_app.rb +6 -7
  137. data/lib/{resources → inspec/resources}/iis_app_pool.rb +21 -19
  138. data/lib/{resources → inspec/resources}/iis_site.rb +17 -15
  139. data/lib/{resources → inspec/resources}/inetd_conf.rb +9 -10
  140. data/lib/{resources → inspec/resources}/ini.rb +7 -8
  141. data/lib/{resources → inspec/resources}/interface.rb +30 -30
  142. data/lib/{resources → inspec/resources}/iptables.rb +8 -8
  143. data/lib/{resources → inspec/resources}/json.rb +8 -10
  144. data/lib/{resources → inspec/resources}/kernel_module.rb +15 -15
  145. data/lib/{resources → inspec/resources}/kernel_parameter.rb +8 -8
  146. data/lib/{resources → inspec/resources}/key_rsa.rb +8 -10
  147. data/lib/{resources → inspec/resources}/ksh.rb +6 -8
  148. data/lib/{resources → inspec/resources}/limits_conf.rb +8 -9
  149. data/lib/{resources/login_def.rb → inspec/resources/login_defs.rb} +9 -10
  150. data/lib/{resources → inspec/resources}/mount.rb +6 -8
  151. data/lib/{resources → inspec/resources}/mssql_session.rb +16 -18
  152. data/lib/inspec/resources/mysql.rb +81 -0
  153. data/lib/{resources → inspec/resources}/mysql_conf.rb +13 -14
  154. data/lib/{resources → inspec/resources}/mysql_session.rb +16 -16
  155. data/lib/{resources → inspec/resources}/nginx.rb +16 -17
  156. data/lib/{resources → inspec/resources}/nginx_conf.rb +26 -27
  157. data/lib/{resources → inspec/resources}/npm.rb +9 -10
  158. data/lib/{resources → inspec/resources}/ntp_conf.rb +9 -10
  159. data/lib/{resources → inspec/resources}/oneget.rb +8 -8
  160. data/lib/{resources → inspec/resources}/oracledb_session.rb +33 -34
  161. data/lib/{resources → inspec/resources}/os.rb +6 -8
  162. data/lib/{resources → inspec/resources}/os_env.rb +11 -12
  163. data/lib/{resources → inspec/resources}/package.rb +66 -65
  164. data/lib/{resources → inspec/resources}/packages.rb +13 -13
  165. data/lib/{resources → inspec/resources}/parse_config.rb +8 -8
  166. data/lib/{resources → inspec/resources}/passwd.rb +18 -19
  167. data/lib/{resources → inspec/resources}/pip.rb +19 -19
  168. data/lib/{resources → inspec/resources}/platform.rb +9 -11
  169. data/lib/{resources → inspec/resources}/port.rb +134 -136
  170. data/lib/{resources → inspec/resources}/postgres.rb +40 -32
  171. data/lib/{resources → inspec/resources}/postgres_conf.rb +17 -17
  172. data/lib/{resources → inspec/resources}/postgres_hba_conf.rb +21 -23
  173. data/lib/{resources → inspec/resources}/postgres_ident_conf.rb +12 -14
  174. data/lib/{resources → inspec/resources}/postgres_session.rb +8 -9
  175. data/lib/{resources → inspec/resources}/powershell.rb +17 -13
  176. data/lib/{resources → inspec/resources}/processes.rb +29 -29
  177. data/lib/{resources/rabbitmq_conf.rb → inspec/resources/rabbitmq_config.rb} +10 -11
  178. data/lib/{resources → inspec/resources}/registry_key.rb +14 -14
  179. data/lib/inspec/resources/script.rb +1 -0
  180. data/lib/{resources → inspec/resources}/security_identifier.rb +11 -10
  181. data/lib/{resources → inspec/resources}/security_policy.rb +59 -58
  182. data/lib/{resources → inspec/resources}/service.rb +74 -75
  183. data/lib/{resources → inspec/resources}/shadow.rb +44 -45
  184. data/lib/{resources/ssh_conf.rb → inspec/resources/ssh_config.rb} +16 -17
  185. data/lib/{resources → inspec/resources}/ssl.rb +28 -29
  186. data/lib/inspec/resources/sys_info.rb +30 -0
  187. data/lib/{resources → inspec/resources}/toml.rb +5 -7
  188. data/lib/{resources → inspec/resources}/users.rb +65 -65
  189. data/lib/{resources → inspec/resources}/vbscript.rb +8 -9
  190. data/lib/{resources → inspec/resources}/virtualization.rb +60 -62
  191. data/lib/{resources → inspec/resources}/windows_feature.rb +9 -9
  192. data/lib/{resources → inspec/resources}/windows_hotfix.rb +5 -5
  193. data/lib/{resources → inspec/resources}/windows_task.rb +16 -15
  194. data/lib/{resources → inspec/resources}/wmi.rb +7 -8
  195. data/lib/{resources → inspec/resources}/x509_certificate.rb +9 -11
  196. data/lib/{resources/xinetd.rb → inspec/resources/xinetd_conf.rb} +27 -29
  197. data/lib/{resources → inspec/resources}/xml.rb +7 -7
  198. data/lib/{resources → inspec/resources}/yaml.rb +5 -6
  199. data/lib/{resources → inspec/resources}/yum.rb +10 -10
  200. data/lib/{resources → inspec/resources}/zfs_dataset.rb +6 -6
  201. data/lib/{resources → inspec/resources}/zfs_pool.rb +4 -4
  202. data/lib/inspec/rspec_extensions.rb +24 -8
  203. data/lib/inspec/rule.rb +14 -15
  204. data/lib/inspec/runner.rb +28 -28
  205. data/lib/inspec/runner_mock.rb +1 -5
  206. data/lib/inspec/runner_rspec.rb +18 -20
  207. data/lib/inspec/runtime_profile.rb +2 -5
  208. data/lib/inspec/schema.rb +142 -143
  209. data/lib/inspec/secrets.rb +3 -7
  210. data/lib/inspec/secrets/yaml.rb +3 -5
  211. data/lib/inspec/shell.rb +11 -15
  212. data/lib/inspec/shell_detector.rb +6 -7
  213. data/lib/inspec/source_reader.rb +4 -8
  214. data/lib/inspec/ui.rb +33 -39
  215. data/lib/inspec/ui_table_helper.rb +12 -0
  216. data/lib/{utils → inspec/utils}/command_wrapper.rb +4 -8
  217. data/lib/{utils → inspec/utils}/convert.rb +0 -4
  218. data/lib/{utils → inspec/utils}/database_helpers.rb +4 -8
  219. data/lib/inspec/utils/deprecation.rb +6 -0
  220. data/lib/{utils → inspec/utils}/deprecation/config_file.rb +19 -19
  221. data/lib/{utils → inspec/utils}/deprecation/deprecator.rb +12 -12
  222. data/lib/{utils → inspec/utils}/deprecation/errors.rb +1 -1
  223. data/lib/{utils → inspec/utils}/deprecation/global_method.rb +2 -2
  224. data/lib/{utils → inspec/utils}/enumerable_delegation.rb +0 -2
  225. data/lib/{utils → inspec/utils}/erlang_parser.rb +61 -65
  226. data/lib/{utils → inspec/utils}/file_reader.rb +1 -2
  227. data/lib/{utils → inspec/utils}/filter.rb +30 -33
  228. data/lib/{utils → inspec/utils}/filter_array.rb +0 -2
  229. data/lib/{utils → inspec/utils}/find_files.rb +9 -12
  230. data/lib/{utils → inspec/utils}/hash.rb +1 -5
  231. data/lib/inspec/utils/json_log.rb +15 -0
  232. data/lib/inspec/utils/latest_version.rb +13 -0
  233. data/lib/{utils → inspec/utils}/modulator.rb +0 -3
  234. data/lib/{utils → inspec/utils}/nginx_parser.rb +31 -35
  235. data/lib/{utils → inspec/utils}/object_traversal.rb +0 -3
  236. data/lib/{utils → inspec/utils}/parser.rb +45 -45
  237. data/lib/{utils → inspec/utils}/pkey_reader.rb +4 -2
  238. data/lib/{utils → inspec/utils}/simpleconfig.rb +8 -10
  239. data/lib/{utils → inspec/utils}/spdx.rb +1 -4
  240. data/lib/{utils → inspec/utils}/spdx.txt +0 -0
  241. data/lib/inspec/utils/telemetry.rb +3 -3
  242. data/lib/inspec/utils/telemetry/collector.rb +30 -9
  243. data/lib/inspec/utils/telemetry/data_series.rb +3 -1
  244. data/lib/inspec/utils/telemetry/global_methods.rb +1 -1
  245. data/lib/inspec/version.rb +1 -1
  246. data/lib/matchers/matchers.rb +22 -25
  247. data/lib/plugins/inspec-artifact/lib/inspec-artifact.rb +1 -1
  248. data/lib/plugins/inspec-artifact/lib/inspec-artifact/base.rb +52 -45
  249. data/lib/plugins/inspec-artifact/lib/inspec-artifact/cli.rb +18 -16
  250. data/lib/plugins/inspec-artifact/test/functional/inspec_artifact_test.rb +12 -11
  251. data/lib/plugins/inspec-compliance/lib/inspec-compliance.rb +1 -1
  252. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api.rb +73 -73
  253. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api/login.rb +66 -62
  254. data/lib/plugins/inspec-compliance/lib/inspec-compliance/cli.rb +59 -57
  255. data/lib/plugins/inspec-compliance/lib/inspec-compliance/configuration.rb +11 -11
  256. data/lib/plugins/inspec-compliance/lib/inspec-compliance/http.rb +20 -22
  257. data/lib/plugins/inspec-compliance/lib/inspec-compliance/support.rb +2 -4
  258. data/lib/plugins/inspec-compliance/lib/inspec-compliance/target.rb +30 -27
  259. data/lib/plugins/inspec-compliance/test/functional/inspec_compliance_test.rb +12 -14
  260. data/lib/plugins/inspec-compliance/test/integration/default/cli.rb +39 -41
  261. data/lib/plugins/inspec-compliance/test/unit/api/login_test.rb +64 -64
  262. data/lib/plugins/inspec-compliance/test/unit/api_test.rb +157 -156
  263. data/lib/plugins/inspec-compliance/test/unit/target_test.rb +85 -85
  264. data/lib/plugins/inspec-habitat/Berksfile +2 -2
  265. data/lib/plugins/inspec-habitat/lib/inspec-habitat.rb +1 -1
  266. data/lib/plugins/inspec-habitat/lib/inspec-habitat/cli.rb +15 -13
  267. data/lib/plugins/inspec-habitat/lib/inspec-habitat/profile.rb +64 -63
  268. data/lib/plugins/inspec-habitat/templates/habitat/hooks/run.erb +3 -3
  269. data/lib/plugins/inspec-habitat/templates/habitat/plan.sh.erb +11 -11
  270. data/lib/plugins/inspec-habitat/test/cookbooks/inspec_habitat_fixture/Berksfile +1 -1
  271. data/lib/plugins/inspec-habitat/test/cookbooks/inspec_habitat_fixture/metadata.rb +8 -8
  272. data/lib/plugins/inspec-habitat/test/cookbooks/inspec_habitat_fixture/recipes/default.rb +17 -17
  273. data/lib/plugins/inspec-habitat/test/functional/inspec_habitat_test.rb +9 -8
  274. data/lib/plugins/inspec-habitat/test/integration/default/inspec_habitat/controls/inspec_habitat.rb +14 -14
  275. data/lib/plugins/inspec-habitat/test/support/example_profile/controls/example.rb +4 -4
  276. data/lib/plugins/inspec-habitat/test/unit/profile_test.rb +42 -41
  277. data/lib/plugins/inspec-init/lib/inspec-init.rb +1 -1
  278. data/lib/plugins/inspec-init/lib/inspec-init/cli.rb +6 -8
  279. data/lib/plugins/inspec-init/lib/inspec-init/cli_plugin.rb +72 -74
  280. data/lib/plugins/inspec-init/lib/inspec-init/cli_profile.rb +9 -11
  281. data/lib/plugins/inspec-init/lib/inspec-init/renderer.rb +4 -4
  282. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/Gemfile +0 -1
  283. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/inspec-plugin-template.gemspec +0 -2
  284. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template.rb +0 -2
  285. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template/cli_command.rb +0 -2
  286. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template/plugin.rb +0 -2
  287. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/lib/inspec-plugin-template/version.rb +0 -2
  288. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/functional/inspec_plugin_template_test.rb +5 -5
  289. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/helper.rb +1 -3
  290. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/unit/cli_args_test.rb +2 -2
  291. data/lib/plugins/inspec-init/templates/plugins/inspec-plugin-template/test/unit/plugin_def_test.rb +2 -2
  292. data/lib/plugins/inspec-init/templates/profiles/aws/controls/example.rb +10 -11
  293. data/lib/plugins/inspec-init/templates/profiles/azure/controls/example.rb +4 -5
  294. data/lib/plugins/inspec-init/templates/profiles/gcp/controls/example.rb +10 -11
  295. data/lib/plugins/inspec-init/templates/profiles/os/controls/example.rb +6 -7
  296. data/lib/plugins/inspec-init/test/functional/inspec_init_plugin_test.rb +51 -50
  297. data/lib/plugins/inspec-init/test/functional/inspec_init_profile_test.rb +35 -33
  298. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli.rb +1 -2
  299. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli/cli_command.rb +72 -70
  300. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli/plugin.rb +1 -1
  301. data/lib/plugins/inspec-plugin-manager-cli/test/fixtures/plugins/wrong-name/lib/wrong-name.rb +1 -1
  302. data/lib/plugins/inspec-plugin-manager-cli/test/functional/inspec-plugin_test.rb +281 -271
  303. data/lib/plugins/inspec-plugin-manager-cli/test/unit/cli_args_test.rb +41 -41
  304. data/lib/plugins/inspec-plugin-manager-cli/test/unit/plugin_def_test.rb +25 -6
  305. data/lib/plugins/shared/core_plugin_test_helper.rb +43 -38
  306. data/lib/resource_support/aws.rb +67 -67
  307. data/lib/resource_support/aws/aws_plural_resource_mixin.rb +4 -1
  308. data/lib/resource_support/aws/aws_resource_mixin.rb +4 -3
  309. data/lib/resource_support/aws/aws_singular_resource_mixin.rb +4 -1
  310. data/lib/resources/aws/aws_billing_report.rb +15 -8
  311. data/lib/resources/aws/aws_billing_reports.rb +10 -7
  312. data/lib/resources/aws/aws_cloudtrail_trail.rb +9 -5
  313. data/lib/resources/aws/aws_cloudtrail_trails.rb +9 -5
  314. data/lib/resources/aws/aws_cloudwatch_alarm.rb +9 -5
  315. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +12 -8
  316. data/lib/resources/aws/aws_config_delivery_channel.rb +13 -9
  317. data/lib/resources/aws/aws_config_recorder.rb +10 -6
  318. data/lib/resources/aws/aws_ebs_volume.rb +12 -8
  319. data/lib/resources/aws/aws_ebs_volumes.rb +9 -5
  320. data/lib/resources/aws/aws_ec2_instance.rb +14 -11
  321. data/lib/resources/aws/aws_ec2_instances.rb +9 -5
  322. data/lib/resources/aws/aws_ecs_cluster.rb +11 -7
  323. data/lib/resources/aws/aws_eks_cluster.rb +13 -9
  324. data/lib/resources/aws/aws_elb.rb +9 -5
  325. data/lib/resources/aws/aws_elbs.rb +9 -5
  326. data/lib/resources/aws/aws_flow_log.rb +17 -13
  327. data/lib/resources/aws/aws_iam_access_key.rb +15 -11
  328. data/lib/resources/aws/aws_iam_access_keys.rb +19 -15
  329. data/lib/resources/aws/aws_iam_group.rb +9 -5
  330. data/lib/resources/aws/aws_iam_groups.rb +9 -5
  331. data/lib/resources/aws/aws_iam_password_policy.rb +13 -10
  332. data/lib/resources/aws/aws_iam_policies.rb +9 -5
  333. data/lib/resources/aws/aws_iam_policy.rb +16 -12
  334. data/lib/resources/aws/aws_iam_role.rb +9 -5
  335. data/lib/resources/aws/aws_iam_root_user.rb +12 -8
  336. data/lib/resources/aws/aws_iam_user.rb +12 -12
  337. data/lib/resources/aws/aws_iam_users.rb +10 -10
  338. data/lib/resources/aws/aws_kms_key.rb +12 -8
  339. data/lib/resources/aws/aws_kms_keys.rb +9 -5
  340. data/lib/resources/aws/aws_rds_instance.rb +11 -8
  341. data/lib/resources/aws/aws_route_table.rb +11 -7
  342. data/lib/resources/aws/aws_route_tables.rb +10 -6
  343. data/lib/resources/aws/aws_s3_bucket.rb +14 -11
  344. data/lib/resources/aws/aws_s3_bucket_object.rb +12 -9
  345. data/lib/resources/aws/aws_s3_buckets.rb +9 -7
  346. data/lib/resources/aws/aws_security_group.rb +16 -12
  347. data/lib/resources/aws/aws_security_groups.rb +12 -8
  348. data/lib/resources/aws/aws_sns_subscription.rb +15 -11
  349. data/lib/resources/aws/aws_sns_topic.rb +10 -6
  350. data/lib/resources/aws/aws_sns_topics.rb +9 -5
  351. data/lib/resources/aws/aws_sqs_queue.rb +18 -14
  352. data/lib/resources/aws/aws_subnet.rb +11 -7
  353. data/lib/resources/aws/aws_subnets.rb +9 -5
  354. data/lib/resources/aws/aws_vpc.rb +10 -6
  355. data/lib/resources/aws/aws_vpcs.rb +9 -5
  356. data/lib/resources/azure/azure_backend.rb +20 -18
  357. data/lib/resources/azure/azure_generic_resource.rb +13 -15
  358. data/lib/resources/azure/azure_resource_group.rb +17 -19
  359. data/lib/resources/azure/azure_virtual_machine.rb +6 -8
  360. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +6 -8
  361. data/lib/source_readers/flat.rb +6 -10
  362. data/lib/source_readers/inspec.rb +8 -12
  363. metadata +141 -142
  364. data/lib/resources/mysql.rb +0 -82
  365. data/lib/resources/sys_info.rb +0 -28
  366. data/lib/utils/deprecation.rb +0 -6
  367. data/lib/utils/json_log.rb +0 -18
  368. data/lib/utils/latest_version.rb +0 -22
@@ -1,9 +1,9 @@
1
1
  module Inspec
2
2
  def self.config_dir
3
- ENV['INSPEC_CONFIG_DIR'] ? ENV['INSPEC_CONFIG_DIR'] : File.join(Dir.home, '.inspec')
3
+ ENV["INSPEC_CONFIG_DIR"] ? ENV["INSPEC_CONFIG_DIR"] : File.join(Dir.home, ".inspec")
4
4
  end
5
5
 
6
6
  def self.src_root
7
- File.expand_path(File.join(__FILE__, '..', '..', '..'))
7
+ File.expand_path(File.join(__FILE__, "..", "..", ".."))
8
8
  end
9
9
  end
@@ -1,13 +1,11 @@
1
- # encoding: utf-8
2
-
3
1
  # Impact scores based off CVSS 3.0
4
2
  module Inspec::Impact
5
3
  IMPACT_SCORES = {
6
- 'none' => 0.0,
7
- 'low' => 0.1,
8
- 'medium' => 0.4,
9
- 'high' => 0.7,
10
- 'critical' => 0.9,
4
+ "none" => 0.0,
5
+ "low" => 0.1,
6
+ "medium" => 0.4,
7
+ "high" => 0.7,
8
+ "critical" => 0.9,
11
9
  }.freeze
12
10
 
13
11
  def self.impact_from_string(value)
@@ -1,8 +1,9 @@
1
- require 'forwardable'
2
- require 'singleton'
3
- require 'inspec/objects/input'
4
- require 'inspec/secrets'
5
- require 'inspec/exceptions'
1
+ require "forwardable"
2
+ require "singleton"
3
+ require "inspec/objects/input"
4
+ require "inspec/secrets"
5
+ require "inspec/exceptions"
6
+ require "inspec/plugin/v2"
6
7
 
7
8
  module Inspec
8
9
  # The InputRegistry's responsibilities include:
@@ -12,7 +13,7 @@ module Inspec
12
13
  include Singleton
13
14
  extend Forwardable
14
15
 
15
- attr_reader :inputs_by_profile, :profile_aliases
16
+ attr_reader :inputs_by_profile, :profile_aliases, :plugins
16
17
  def_delegator :inputs_by_profile, :each
17
18
  def_delegator :inputs_by_profile, :[]
18
19
  def_delegator :inputs_by_profile, :key?, :profile_known?
@@ -25,6 +26,14 @@ module Inspec
25
26
 
26
27
  # this is a list of optional profile name overrides set in the inspec.yml
27
28
  @profile_aliases = {}
29
+
30
+ # Upon creation, activate all input plugins
31
+ activators = Inspec::Plugin::V2::Registry.instance.find_activators(plugin_type: :input)
32
+
33
+ @plugins = activators.map do |activator|
34
+ activator.activate!
35
+ activator.implementation_class.new
36
+ end
28
37
  end
29
38
 
30
39
  #-------------------------------------------------------------#
@@ -35,32 +44,58 @@ module Inspec
35
44
  @profile_aliases[name] = alias_name
36
45
  end
37
46
 
47
+ # Returns an Hash, name => Input that have actually been mentioned
38
48
  def list_inputs_for_profile(profile)
39
49
  inputs_by_profile[profile] = {} unless profile_known?(profile)
40
50
  inputs_by_profile[profile]
41
51
  end
42
52
 
53
+ # Returns an Array of input names. This includes input names
54
+ # that plugins may be able to fetch, but have not actually been
55
+ # mentioned in the control code.
56
+ def list_potential_input_names_for_profile(profile_name)
57
+ input_names_from_dsl = inputs_by_profile[profile_name].keys
58
+ input_names_from_plugins = plugins.map { |plugin| plugin.list_inputs(profile_name) }
59
+ (input_names_from_dsl + input_names_from_plugins).flatten.uniq
60
+ end
61
+
43
62
  #-------------------------------------------------------------#
44
63
  # Support for Individual Inputs
45
64
  #-------------------------------------------------------------#
46
65
 
47
66
  def find_or_register_input(input_name, profile_name, options = {})
48
- if profile_alias?(profile_name)
67
+ if profile_alias?(profile_name) && !profile_aliases[profile_name].nil?
49
68
  alias_name = profile_name
50
69
  profile_name = profile_aliases[profile_name]
51
70
  handle_late_arriving_alias(alias_name, profile_name) if profile_known?(alias_name)
52
71
  end
53
72
 
73
+ # Find or create the input
54
74
  inputs_by_profile[profile_name] ||= {}
55
75
  if inputs_by_profile[profile_name].key?(input_name)
56
76
  inputs_by_profile[profile_name][input_name].update(options)
57
77
  else
58
78
  inputs_by_profile[profile_name][input_name] = Inspec::Input.new(input_name, options)
79
+ poll_plugins_for_update(profile_name, input_name)
59
80
  end
60
81
 
61
82
  inputs_by_profile[profile_name][input_name]
62
83
  end
63
84
 
85
+ def poll_plugins_for_update(profile_name, input_name)
86
+ plugins.each do |plugin|
87
+ response = plugin.fetch(profile_name, input_name)
88
+ evt = Inspec::Input::Event.new(
89
+ action: :fetch,
90
+ provider: plugin.class.plugin_name,
91
+ priority: plugin.default_priority,
92
+ hit: !response.nil?
93
+ )
94
+ evt.value = response unless response.nil?
95
+ inputs_by_profile[profile_name][input_name].events << evt
96
+ end
97
+ end
98
+
64
99
  # It is possible for a wrapper profile to create an input in metadata,
65
100
  # referring to the child profile by an alias that has not yet been registered.
66
101
  # The registry will then store the inputs under the alias, as if the alias
@@ -115,7 +150,7 @@ module Inspec
115
150
  provider: :runner_api, # TODO: suss out if audit cookbook or kitchen-inspec or something unknown
116
151
  priority: 40,
117
152
  file: loc.path,
118
- line: loc.lineno,
153
+ line: loc.lineno
119
154
  )
120
155
  find_or_register_input(input_name, profile_name, event: evt)
121
156
  end
@@ -135,7 +170,7 @@ module Inspec
135
170
  if data.nil?
136
171
  raise Inspec::Exceptions::SecretsBackendNotFound,
137
172
  "Cannot find parser for inputs file '#{path}'. " \
138
- 'Check to make sure file has the appropriate extension.'
173
+ "Check to make sure file has the appropriate extension."
139
174
  end
140
175
 
141
176
  next if data.inputs.nil?
@@ -144,7 +179,7 @@ module Inspec
144
179
  value: input_value,
145
180
  provider: :cli_files,
146
181
  priority: 40,
147
- file: path,
182
+ file: path
148
183
  # TODO: any way we could get a line number?
149
184
  )
150
185
  find_or_register_input(input_name, profile_name, event: evt)
@@ -156,13 +191,13 @@ module Inspec
156
191
  unless File.exist?(path)
157
192
  raise Inspec::Exceptions::InputsFileDoesNotExist,
158
193
  "Cannot find input file '#{path}'. " \
159
- 'Check to make sure file exists.'
194
+ "Check to make sure file exists."
160
195
  end
161
196
 
162
197
  unless File.readable?(path)
163
198
  raise Inspec::Exceptions::InputsFileNotReadable,
164
199
  "Cannot read input file '#{path}'. " \
165
- 'Check to make sure file is readable.'
200
+ "Check to make sure file is readable."
166
201
  end
167
202
 
168
203
  true
@@ -170,31 +205,46 @@ module Inspec
170
205
 
171
206
  def bind_inputs_from_metadata(profile_name, profile_metadata_obj)
172
207
  # TODO: move this into a core plugin
173
- # TODO: add deprecation stuff
174
208
  return if profile_metadata_obj.nil? # Metadata files are technically optional
175
209
 
176
- if profile_metadata_obj.params.key?(:attributes) && profile_metadata_obj.params[:attributes].is_a?(Array)
177
- profile_metadata_obj.params[:attributes].each do |input_orig|
178
- input_options = input_orig.dup
179
- input_name = input_options.delete(:name)
180
- input_options.merge!({ priority: 30, provider: :profile_metadata, file: File.join(profile_name, 'inspec.yml') })
181
- evt = Inspec::Input.infer_event(input_options)
182
-
183
- # Profile metadata may set inputs in other profiles by naming them.
184
- if input_options[:profile]
185
- profile_name = input_options[:profile] || profile_name
186
- # Override priority to force this to win. Allow user to set their own priority.
187
- evt.priority = input_orig[:priority] || 35
188
- end
189
- find_or_register_input(input_name,
190
- profile_name,
191
- type: input_options[:type],
192
- required: input_options[:required],
193
- event: evt)
194
- end
210
+ if profile_metadata_obj.params.key?(:inputs)
211
+ raw_inputs = profile_metadata_obj.params[:inputs]
195
212
  elsif profile_metadata_obj.params.key?(:attributes)
196
- Inspec::Log.warn 'Inputs must be defined as an Array. Skipping current definition.'
213
+ Inspec.deprecate(:attrs_rename_in_metadata, "Profile: '#{profile_name}'.")
214
+ raw_inputs = profile_metadata_obj.params[:attributes]
215
+ else
216
+ return
217
+ end
218
+
219
+ unless raw_inputs.is_a?(Array)
220
+ Inspec::Log.warn "Inputs must be defined as an Array in metadata files. Skipping definition from #{profile_name}."
221
+ return
222
+ end
223
+
224
+ raw_inputs.each { |i| handle_raw_input_from_metadata(i, profile_name) }
225
+ end
226
+
227
+ def handle_raw_input_from_metadata(input_orig, profile_name)
228
+ input_options = input_orig.dup
229
+ input_name = input_options.delete(:name)
230
+ input_options[:provider] = :profile_metadata
231
+ input_options[:file] = File.join(profile_name, "inspec.yml")
232
+ input_options[:priority] ||= 30
233
+ evt = Inspec::Input.infer_event(input_options)
234
+
235
+ # Profile metadata may set inputs in other profiles by naming them.
236
+ if input_options[:profile]
237
+ profile_name = input_options[:profile] || profile_name
238
+ # Override priority to force this to win. Allow user to set their own priority.
239
+ evt.priority = input_orig[:priority] || 35
197
240
  end
241
+ find_or_register_input(
242
+ input_name,
243
+ profile_name,
244
+ type: input_options[:type],
245
+ required: input_options[:required],
246
+ event: evt
247
+ )
198
248
  end
199
249
 
200
250
  #-------------------------------------------------------------#
@@ -214,6 +264,7 @@ module Inspec
214
264
  :find_or_register_input,
215
265
  :register_profile_alias,
216
266
  :list_inputs_for_profile,
267
+ :list_potential_input_names_for_profile,
217
268
  :bind_profile_inputs,
218
269
  ].each do |meth|
219
270
  define_singleton_method(meth) do |*args|
@@ -1,8 +1,5 @@
1
- # encoding: utf-8
2
- # author: Steven Danna
3
- # author: Victoria Jeffrey
4
- require 'inspec/plugin/v1/plugin_types/resource'
5
- require 'inspec/dsl_shared'
1
+ require "inspec/plugin/v1/plugin_types/resource"
2
+ require "inspec/dsl_shared"
6
3
 
7
4
  module Inspec
8
5
  #
@@ -51,7 +48,7 @@ module Inspec
51
48
  # Provide the local binding for this context which is necessary for
52
49
  # calls to `require` to create all dependent objects in the correct
53
50
  # context.
54
- res.instance_variable_set('@inspec_binding', res.instance_eval('binding'))
51
+ res.instance_variable_set("@inspec_binding", res.instance_eval("binding"))
55
52
  res
56
53
  end
57
54
  end
@@ -1,8 +1,4 @@
1
- # encoding: utf-8
2
- # author: Dominik Richter
3
- # author: Christoph Hartmann
4
-
5
- require 'mixlib/log'
1
+ require "mixlib/log"
6
2
 
7
3
  module Inspec
8
4
  class Log
@@ -1,11 +1,12 @@
1
- # encoding: utf-8
2
1
  # Copyright 2015 Dominik Richter
3
2
 
4
- require 'logger'
5
- require 'rubygems/version'
6
- require 'rubygems/requirement'
7
- require 'semverse'
8
- require 'utils/spdx'
3
+ require "logger"
4
+ require "rubygems/version"
5
+ require "rubygems/requirement"
6
+ require "semverse"
7
+
8
+ require "inspec/version"
9
+ require "inspec/utils/spdx"
9
10
 
10
11
  module Inspec
11
12
  # Extract metadata.rb information
@@ -18,7 +19,7 @@ module Inspec
18
19
  def initialize(ref, logger = nil)
19
20
  @ref = ref
20
21
  @logger = logger || Logger.new(nil)
21
- @content = ''
22
+ @content = ""
22
23
  @params = {}
23
24
  @missing_methods = []
24
25
  end
@@ -78,12 +79,12 @@ module Inspec
78
79
 
79
80
  if %r{[\/\\]} =~ params[:name]
80
81
  errors.push("The profile name (#{params[:name]}) contains a slash" \
81
- ' which is not permitted. Please remove all slashes from `inspec.yml`.')
82
+ " which is not permitted. Please remove all slashes from `inspec.yml`.")
82
83
  end
83
84
 
84
85
  # if version is set, ensure it is correct
85
86
  if !params[:version].nil? && !valid_version?(params[:version])
86
- errors.push('Version needs to be in SemVer format')
87
+ errors.push("Version needs to be in SemVer format")
87
88
  end
88
89
 
89
90
  %w{title summary maintainer copyright license}.each do |field|
@@ -143,8 +144,8 @@ module Inspec
143
144
  x
144
145
  when Array
145
146
  logger.warn(
146
- 'Failed to read supports entry that is an array. Please use '\
147
- 'the `supports: {os-family: xyz}` syntax.',
147
+ "Failed to read supports entry that is an array. Please use "\
148
+ "the `supports: {os-family: xyz}` syntax."
148
149
  )
149
150
  nil
150
151
  when nil then nil
@@ -182,14 +183,14 @@ module Inspec
182
183
  # unit tests that look for warning sequences
183
184
  return if original_target.to_s.empty?
184
185
  metadata.params[:title] = "tests from #{original_target}"
185
- metadata.params[:name] = metadata.params[:title].gsub(%r{[\/\\]}, '.')
186
+ metadata.params[:name] = metadata.params[:title].gsub(%r{[\/\\]}, ".")
186
187
  end
187
188
 
188
189
  def self.finalize(metadata, profile_id, options, logger = nil)
189
190
  return nil if metadata.nil?
190
191
  param = metadata.params || {}
191
192
  options ||= {}
192
- param['version'] = param['version'].to_s unless param['version'].nil?
193
+ param["version"] = param["version"].to_s unless param["version"].nil?
193
194
  metadata.params = symbolize_keys(param)
194
195
  metadata.params[:supports] = finalize_supports(metadata.params[:supports], logger)
195
196
  finalize_name(metadata, profile_id, options[:target])
@@ -198,8 +199,8 @@ module Inspec
198
199
  end
199
200
 
200
201
  def self.from_yaml(ref, content, profile_id, logger = nil)
202
+ require "erb"
201
203
  res = Metadata.new(ref, logger)
202
- require 'erb'
203
204
  res.params = YAML.load(ERB.new(content).result)
204
205
  res.content = content
205
206
  finalize(res, profile_id, {}, logger)
@@ -216,9 +217,9 @@ module Inspec
216
217
  # NOTE there doesn't have to exist an actual file, it may come from an
217
218
  # archive (i.e., content)
218
219
  case File.basename(ref)
219
- when 'inspec.yml'
220
+ when "inspec.yml"
220
221
  from_yaml(ref, content, profile_id, logger)
221
- when 'metadata.rb'
222
+ when "metadata.rb"
222
223
  from_ruby(ref, content, profile_id, logger)
223
224
  else
224
225
  logger ||= Logger.new(nil)
@@ -1,21 +1,17 @@
1
- # encoding: utf-8
2
- # author: Dominik Richter
3
- # author: Christoph Hartmann
4
-
5
1
  module Inspec
6
2
  module MethodSource
7
3
  def self.code_at(location, source_reader)
8
4
  # TODO: logger for these cases
9
- return '' if location.nil? || location[:ref].nil? || location[:line].nil?
10
- return '' unless source_reader && source_reader.target
5
+ return "" if location.nil? || location[:ref].nil? || location[:line].nil?
6
+ return "" unless source_reader && source_reader.target
11
7
 
12
8
  # TODO: Non-controls still need more detection
13
9
  ref = location[:ref]
14
- ref = ref.sub(source_reader.target.prefix, '')
10
+ ref = ref.sub(source_reader.target.prefix, "")
15
11
  src = source_reader.tests[ref]
16
- return '' if src.nil?
12
+ return "" if src.nil?
17
13
 
18
- ::MethodSource.expression_at(src.lines, location[:line]).force_encoding('utf-8')
14
+ ::MethodSource.expression_at(src.lines, location[:line]).force_encoding("utf-8")
19
15
  rescue SyntaxError => e
20
16
  raise ::MethodSource::SourceNotFoundError,
21
17
  "Could not parse source at #{location[:ref]}:#{location[:line]}: #{e.message}"
@@ -1,14 +1,12 @@
1
- # encoding: utf-8
2
-
3
1
  module Inspec
4
- autoload :Input, 'inspec/objects/input'
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'
2
+ autoload :Input, "inspec/objects/input"
3
+ autoload :Tag, "inspec/objects/tag"
4
+ autoload :Control, "inspec/objects/control"
5
+ autoload :Describe, "inspec/objects/describe"
6
+ autoload :EachLoop, "inspec/objects/each_loop"
7
+ autoload :List, "inspec/objects/list"
8
+ autoload :OrTest, "inspec/objects/or_test"
9
+ autoload :RubyHelper, "inspec/objects/ruby_helper"
10
+ autoload :Test, "inspec/objects/test"
11
+ autoload :Value, "inspec/objects/value"
14
12
  end
@@ -1,5 +1,3 @@
1
- # encoding:utf-8
2
-
3
1
  module Inspec
4
2
  class Control
5
3
  attr_accessor :id, :title, :descriptions, :impact, :tests, :tags, :refs, :only_if
@@ -34,7 +32,7 @@ module Inspec
34
32
  res.push " title #{title.inspect}" unless title.to_s.empty?
35
33
  descriptions.each do |label, text|
36
34
  if label == :default
37
- next if text.nil? or text == '' # don't render empty/nil desc
35
+ next if text.nil? || (text == "") # don't render empty/nil desc
38
36
  res.push " desc #{prettyprint_text(text, 2)}"
39
37
  else
40
38
  res.push " desc #{label.to_s.inspect}, #{prettyprint_text(text, 2)}"
@@ -45,7 +43,7 @@ module Inspec
45
43
  refs.each { |t| res.push(" ref #{print_ref(t)}") }
46
44
  res.push " only_if { #{only_if} }" if only_if
47
45
  tests.each { |t| res.push(indent(t.to_ruby, 2)) }
48
- res.push 'end'
46
+ res.push "end"
49
47
  res.join("\n")
50
48
  end
51
49
 
@@ -54,7 +52,7 @@ module Inspec
54
52
  def print_ref(x)
55
53
  return x.inspect if x.is_a?(String)
56
54
  raise "Cannot process the ref: #{x}" unless x.is_a?(Hash)
57
- '('+x.inspect+')'
55
+ "(" + x.inspect + ")"
58
56
  end
59
57
 
60
58
  # Pretty-print a text block of InSpec code
@@ -65,13 +63,13 @@ module Inspec
65
63
  def prettyprint_text(s, depth)
66
64
  txt = s.to_s.inspect.gsub('\n', "\n")
67
65
  return txt if !txt.include?("\n")
68
- middle = indent(txt[1..-2], depth+2)
69
- txt[0] + "\n" + middle + "\n" + ' '*depth + txt[-1]
66
+ middle = indent(txt[1..-2], depth + 2)
67
+ txt[0] + "\n" + middle + "\n" + " " * depth + txt[-1]
70
68
  end
71
69
 
72
70
  def indent(txt, d)
73
- dt = ' '*d
74
- dt + txt.gsub("\n", "\n"+dt)
71
+ dt = " " * d
72
+ dt + txt.gsub("\n", "\n" + dt)
75
73
  end
76
74
  end
77
75
  end