inspec 2.1.81 → 2.1.83

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 (507) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +101 -101
  3. data/CHANGELOG.md +3183 -3177
  4. data/Gemfile +56 -56
  5. data/LICENSE +14 -14
  6. data/MAINTAINERS.md +33 -33
  7. data/MAINTAINERS.toml +52 -52
  8. data/README.md +453 -453
  9. data/Rakefile +349 -349
  10. data/bin/inspec +12 -12
  11. data/docs/.gitignore +2 -2
  12. data/docs/README.md +41 -40
  13. data/docs/dev/control-eval.md +61 -61
  14. data/docs/dsl_inspec.md +258 -258
  15. data/docs/dsl_resource.md +100 -100
  16. data/docs/glossary.md +99 -99
  17. data/docs/habitat.md +191 -191
  18. data/docs/inspec_and_friends.md +114 -114
  19. data/docs/matchers.md +169 -169
  20. data/docs/migration.md +293 -293
  21. data/docs/platforms.md +118 -118
  22. data/docs/plugin_kitchen_inspec.md +50 -50
  23. data/docs/profiles.md +378 -378
  24. data/docs/reporters.md +105 -105
  25. data/docs/resources/aide_conf.md.erb +75 -75
  26. data/docs/resources/apache.md.erb +67 -67
  27. data/docs/resources/apache_conf.md.erb +68 -68
  28. data/docs/resources/apt.md.erb +71 -71
  29. data/docs/resources/audit_policy.md.erb +47 -47
  30. data/docs/resources/auditd.md.erb +79 -79
  31. data/docs/resources/auditd_conf.md.erb +68 -68
  32. data/docs/resources/aws_cloudtrail_trail.md.erb +155 -155
  33. data/docs/resources/aws_cloudtrail_trails.md.erb +86 -86
  34. data/docs/resources/aws_cloudwatch_alarm.md.erb +91 -91
  35. data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +154 -154
  36. data/docs/resources/aws_config_delivery_channel.md.erb +101 -101
  37. data/docs/resources/aws_config_recorder.md.erb +86 -86
  38. data/docs/resources/aws_ec2_instance.md.erb +112 -112
  39. data/docs/resources/aws_ec2_instances.md.erb +79 -79
  40. data/docs/resources/aws_iam_access_key.md.erb +129 -129
  41. data/docs/resources/aws_iam_access_keys.md.erb +204 -204
  42. data/docs/resources/aws_iam_group.md.erb +64 -64
  43. data/docs/resources/aws_iam_groups.md.erb +49 -49
  44. data/docs/resources/aws_iam_password_policy.md.erb +82 -82
  45. data/docs/resources/aws_iam_policies.md.erb +87 -87
  46. data/docs/resources/aws_iam_policy.md.erb +245 -245
  47. data/docs/resources/aws_iam_role.md.erb +69 -69
  48. data/docs/resources/aws_iam_root_user.md.erb +76 -76
  49. data/docs/resources/aws_iam_user.md.erb +120 -120
  50. data/docs/resources/aws_iam_users.md.erb +279 -279
  51. data/docs/resources/aws_kms_key.md.erb +177 -177
  52. data/docs/resources/aws_kms_keys.md.erb +89 -89
  53. data/docs/resources/aws_rds_instance.md.erb +66 -66
  54. data/docs/resources/aws_route_table.md.erb +53 -53
  55. data/docs/resources/aws_route_tables.md.erb +55 -55
  56. data/docs/resources/aws_s3_bucket.md.erb +146 -146
  57. data/docs/resources/aws_s3_bucket_object.md.erb +89 -89
  58. data/docs/resources/aws_s3_buckets.md.erb +59 -59
  59. data/docs/resources/aws_security_group.md.erb +296 -296
  60. data/docs/resources/aws_security_groups.md.erb +97 -97
  61. data/docs/resources/aws_sns_subscription.md.erb +130 -130
  62. data/docs/resources/aws_sns_topic.md.erb +69 -69
  63. data/docs/resources/aws_sns_topics.md.erb +58 -58
  64. data/docs/resources/aws_subnet.md.erb +140 -140
  65. data/docs/resources/aws_subnets.md.erb +132 -132
  66. data/docs/resources/aws_vpc.md.erb +125 -125
  67. data/docs/resources/aws_vpcs.md.erb +125 -125
  68. data/docs/resources/azure_generic_resource.md.erb +171 -171
  69. data/docs/resources/azure_resource_group.md.erb +284 -284
  70. data/docs/resources/azure_virtual_machine.md.erb +347 -347
  71. data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -224
  72. data/docs/resources/bash.md.erb +75 -75
  73. data/docs/resources/bond.md.erb +90 -90
  74. data/docs/resources/bridge.md.erb +57 -57
  75. data/docs/resources/bsd_service.md.erb +67 -67
  76. data/docs/resources/chocolatey_package.md.erb +58 -58
  77. data/docs/resources/command.md.erb +138 -138
  78. data/docs/resources/cpan.md.erb +79 -79
  79. data/docs/resources/cran.md.erb +64 -64
  80. data/docs/resources/crontab.md.erb +89 -89
  81. data/docs/resources/csv.md.erb +54 -54
  82. data/docs/resources/dh_params.md.erb +205 -205
  83. data/docs/resources/directory.md.erb +30 -30
  84. data/docs/resources/docker.md.erb +219 -219
  85. data/docs/resources/docker_container.md.erb +103 -103
  86. data/docs/resources/docker_image.md.erb +94 -94
  87. data/docs/resources/docker_service.md.erb +114 -114
  88. data/docs/resources/elasticsearch.md.erb +242 -242
  89. data/docs/resources/etc_fstab.md.erb +125 -125
  90. data/docs/resources/etc_group.md.erb +75 -75
  91. data/docs/resources/etc_hosts.md.erb +78 -78
  92. data/docs/resources/etc_hosts_allow.md.erb +74 -74
  93. data/docs/resources/etc_hosts_deny.md.erb +74 -74
  94. data/docs/resources/file.md.erb +526 -526
  95. data/docs/resources/filesystem.md.erb +41 -41
  96. data/docs/resources/firewalld.md.erb +107 -107
  97. data/docs/resources/gem.md.erb +79 -79
  98. data/docs/resources/group.md.erb +61 -61
  99. data/docs/resources/grub_conf.md.erb +101 -101
  100. data/docs/resources/host.md.erb +86 -86
  101. data/docs/resources/http.md.erb +197 -197
  102. data/docs/resources/iis_app.md.erb +122 -122
  103. data/docs/resources/iis_site.md.erb +135 -135
  104. data/docs/resources/inetd_conf.md.erb +94 -94
  105. data/docs/resources/ini.md.erb +76 -76
  106. data/docs/resources/interface.md.erb +58 -58
  107. data/docs/resources/iptables.md.erb +64 -64
  108. data/docs/resources/json.md.erb +63 -63
  109. data/docs/resources/kernel_module.md.erb +120 -120
  110. data/docs/resources/kernel_parameter.md.erb +53 -53
  111. data/docs/resources/key_rsa.md.erb +85 -85
  112. data/docs/resources/launchd_service.md.erb +57 -57
  113. data/docs/resources/limits_conf.md.erb +75 -75
  114. data/docs/resources/login_defs.md.erb +71 -71
  115. data/docs/resources/mount.md.erb +69 -69
  116. data/docs/resources/mssql_session.md.erb +60 -60
  117. data/docs/resources/mysql_conf.md.erb +99 -99
  118. data/docs/resources/mysql_session.md.erb +74 -74
  119. data/docs/resources/nginx.md.erb +79 -79
  120. data/docs/resources/nginx_conf.md.erb +138 -138
  121. data/docs/resources/npm.md.erb +60 -60
  122. data/docs/resources/ntp_conf.md.erb +60 -60
  123. data/docs/resources/oneget.md.erb +53 -53
  124. data/docs/resources/oracledb_session.md.erb +52 -52
  125. data/docs/resources/os.md.erb +141 -141
  126. data/docs/resources/os_env.md.erb +91 -91
  127. data/docs/resources/package.md.erb +120 -120
  128. data/docs/resources/packages.md.erb +67 -67
  129. data/docs/resources/parse_config.md.erb +103 -103
  130. data/docs/resources/parse_config_file.md.erb +138 -138
  131. data/docs/resources/passwd.md.erb +141 -141
  132. data/docs/resources/pip.md.erb +67 -67
  133. data/docs/resources/port.md.erb +137 -137
  134. data/docs/resources/postgres_conf.md.erb +79 -79
  135. data/docs/resources/postgres_hba_conf.md.erb +93 -93
  136. data/docs/resources/postgres_ident_conf.md.erb +76 -76
  137. data/docs/resources/postgres_session.md.erb +69 -69
  138. data/docs/resources/powershell.md.erb +102 -102
  139. data/docs/resources/processes.md.erb +109 -109
  140. data/docs/resources/rabbitmq_config.md.erb +41 -41
  141. data/docs/resources/registry_key.md.erb +158 -158
  142. data/docs/resources/runit_service.md.erb +57 -57
  143. data/docs/resources/security_policy.md.erb +47 -47
  144. data/docs/resources/service.md.erb +121 -121
  145. data/docs/resources/shadow.md.erb +146 -146
  146. data/docs/resources/ssh_config.md.erb +73 -73
  147. data/docs/resources/sshd_config.md.erb +83 -83
  148. data/docs/resources/ssl.md.erb +119 -119
  149. data/docs/resources/sys_info.md.erb +42 -42
  150. data/docs/resources/systemd_service.md.erb +57 -57
  151. data/docs/resources/sysv_service.md.erb +57 -57
  152. data/docs/resources/upstart_service.md.erb +57 -57
  153. data/docs/resources/user.md.erb +140 -140
  154. data/docs/resources/users.md.erb +127 -127
  155. data/docs/resources/vbscript.md.erb +55 -55
  156. data/docs/resources/virtualization.md.erb +57 -57
  157. data/docs/resources/windows_feature.md.erb +47 -47
  158. data/docs/resources/windows_hotfix.md.erb +53 -53
  159. data/docs/resources/windows_task.md.erb +95 -95
  160. data/docs/resources/wmi.md.erb +81 -81
  161. data/docs/resources/x509_certificate.md.erb +151 -151
  162. data/docs/resources/xinetd_conf.md.erb +156 -156
  163. data/docs/resources/xml.md.erb +85 -85
  164. data/docs/resources/yaml.md.erb +69 -69
  165. data/docs/resources/yum.md.erb +98 -98
  166. data/docs/resources/zfs_dataset.md.erb +53 -53
  167. data/docs/resources/zfs_pool.md.erb +47 -47
  168. data/docs/ruby_usage.md +203 -203
  169. data/docs/shared/matcher_be.md.erb +1 -1
  170. data/docs/shared/matcher_cmp.md.erb +43 -43
  171. data/docs/shared/matcher_eq.md.erb +3 -3
  172. data/docs/shared/matcher_include.md.erb +1 -1
  173. data/docs/shared/matcher_match.md.erb +1 -1
  174. data/docs/shell.md +217 -217
  175. data/examples/README.md +8 -8
  176. data/examples/inheritance/README.md +65 -65
  177. data/examples/inheritance/controls/example.rb +14 -14
  178. data/examples/inheritance/inspec.yml +15 -15
  179. data/examples/kitchen-ansible/.kitchen.yml +25 -25
  180. data/examples/kitchen-ansible/Gemfile +19 -19
  181. data/examples/kitchen-ansible/README.md +53 -53
  182. data/examples/kitchen-ansible/files/nginx.repo +6 -6
  183. data/examples/kitchen-ansible/tasks/main.yml +16 -16
  184. data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
  185. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
  186. data/examples/kitchen-chef/.kitchen.yml +20 -20
  187. data/examples/kitchen-chef/Berksfile +3 -3
  188. data/examples/kitchen-chef/Gemfile +19 -19
  189. data/examples/kitchen-chef/README.md +27 -27
  190. data/examples/kitchen-chef/metadata.rb +7 -7
  191. data/examples/kitchen-chef/recipes/default.rb +6 -6
  192. data/examples/kitchen-chef/recipes/nginx.rb +30 -30
  193. data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
  194. data/examples/kitchen-puppet/.kitchen.yml +23 -23
  195. data/examples/kitchen-puppet/Gemfile +20 -20
  196. data/examples/kitchen-puppet/Puppetfile +25 -25
  197. data/examples/kitchen-puppet/README.md +53 -53
  198. data/examples/kitchen-puppet/manifests/site.pp +33 -33
  199. data/examples/kitchen-puppet/metadata.json +11 -11
  200. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
  201. data/examples/meta-profile/README.md +37 -37
  202. data/examples/meta-profile/controls/example.rb +13 -13
  203. data/examples/meta-profile/inspec.yml +13 -13
  204. data/examples/profile-attribute.yml +2 -2
  205. data/examples/profile-attribute/README.md +14 -14
  206. data/examples/profile-attribute/controls/example.rb +11 -11
  207. data/examples/profile-attribute/inspec.yml +8 -8
  208. data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
  209. data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
  210. data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
  211. data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
  212. data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
  213. data/examples/profile-aws/inspec.yml +11 -11
  214. data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
  215. data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
  216. data/examples/profile-azure/inspec.yml +11 -11
  217. data/examples/profile-sensitive/README.md +29 -29
  218. data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
  219. data/examples/profile-sensitive/controls/sensitive.rb +9 -9
  220. data/examples/profile-sensitive/inspec.yml +8 -8
  221. data/examples/profile/README.md +48 -48
  222. data/examples/profile/controls/example.rb +23 -23
  223. data/examples/profile/controls/gordon.rb +36 -36
  224. data/examples/profile/controls/meta.rb +34 -34
  225. data/examples/profile/inspec.yml +10 -10
  226. data/examples/profile/libraries/gordon_config.rb +59 -59
  227. data/inspec.gemspec +49 -49
  228. data/lib/bundles/README.md +3 -3
  229. data/lib/bundles/inspec-artifact.rb +7 -7
  230. data/lib/bundles/inspec-artifact/README.md +1 -1
  231. data/lib/bundles/inspec-artifact/cli.rb +277 -277
  232. data/lib/bundles/inspec-compliance.rb +16 -16
  233. data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
  234. data/lib/bundles/inspec-compliance/README.md +193 -193
  235. data/lib/bundles/inspec-compliance/api.rb +360 -360
  236. data/lib/bundles/inspec-compliance/api/login.rb +193 -193
  237. data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
  238. data/lib/bundles/inspec-compliance/cli.rb +260 -260
  239. data/lib/bundles/inspec-compliance/configuration.rb +103 -103
  240. data/lib/bundles/inspec-compliance/http.rb +125 -125
  241. data/lib/bundles/inspec-compliance/support.rb +36 -36
  242. data/lib/bundles/inspec-compliance/target.rb +112 -112
  243. data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
  244. data/lib/bundles/inspec-habitat.rb +12 -12
  245. data/lib/bundles/inspec-habitat/cli.rb +36 -36
  246. data/lib/bundles/inspec-habitat/log.rb +10 -10
  247. data/lib/bundles/inspec-habitat/profile.rb +391 -391
  248. data/lib/bundles/inspec-init.rb +8 -8
  249. data/lib/bundles/inspec-init/README.md +31 -31
  250. data/lib/bundles/inspec-init/cli.rb +97 -97
  251. data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
  252. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
  253. data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
  254. data/lib/bundles/inspec-supermarket.rb +13 -13
  255. data/lib/bundles/inspec-supermarket/README.md +45 -45
  256. data/lib/bundles/inspec-supermarket/api.rb +84 -84
  257. data/lib/bundles/inspec-supermarket/cli.rb +73 -73
  258. data/lib/bundles/inspec-supermarket/target.rb +34 -34
  259. data/lib/fetchers/git.rb +163 -163
  260. data/lib/fetchers/local.rb +74 -74
  261. data/lib/fetchers/mock.rb +35 -35
  262. data/lib/fetchers/url.rb +247 -247
  263. data/lib/inspec.rb +24 -24
  264. data/lib/inspec/archive/tar.rb +29 -29
  265. data/lib/inspec/archive/zip.rb +19 -19
  266. data/lib/inspec/backend.rb +93 -93
  267. data/lib/inspec/base_cli.rb +368 -368
  268. data/lib/inspec/cached_fetcher.rb +66 -66
  269. data/lib/inspec/cli.rb +292 -292
  270. data/lib/inspec/completions/bash.sh.erb +45 -45
  271. data/lib/inspec/completions/fish.sh.erb +34 -34
  272. data/lib/inspec/completions/zsh.sh.erb +61 -61
  273. data/lib/inspec/control_eval_context.rb +179 -179
  274. data/lib/inspec/dependencies/cache.rb +72 -72
  275. data/lib/inspec/dependencies/dependency_set.rb +92 -92
  276. data/lib/inspec/dependencies/lockfile.rb +115 -115
  277. data/lib/inspec/dependencies/requirement.rb +123 -123
  278. data/lib/inspec/dependencies/resolver.rb +86 -86
  279. data/lib/inspec/describe.rb +27 -27
  280. data/lib/inspec/dsl.rb +66 -66
  281. data/lib/inspec/dsl_shared.rb +33 -33
  282. data/lib/inspec/env_printer.rb +157 -157
  283. data/lib/inspec/errors.rb +14 -14
  284. data/lib/inspec/exceptions.rb +12 -12
  285. data/lib/inspec/expect.rb +45 -45
  286. data/lib/inspec/fetcher.rb +45 -45
  287. data/lib/inspec/file_provider.rb +275 -275
  288. data/lib/inspec/formatters.rb +3 -3
  289. data/lib/inspec/formatters/base.rb +259 -259
  290. data/lib/inspec/formatters/json_rspec.rb +20 -20
  291. data/lib/inspec/formatters/show_progress.rb +12 -12
  292. data/lib/inspec/library_eval_context.rb +58 -58
  293. data/lib/inspec/log.rb +11 -11
  294. data/lib/inspec/metadata.rb +247 -247
  295. data/lib/inspec/method_source.rb +24 -24
  296. data/lib/inspec/objects.rb +14 -14
  297. data/lib/inspec/objects/attribute.rb +75 -75
  298. data/lib/inspec/objects/control.rb +61 -61
  299. data/lib/inspec/objects/describe.rb +92 -92
  300. data/lib/inspec/objects/each_loop.rb +36 -36
  301. data/lib/inspec/objects/list.rb +15 -15
  302. data/lib/inspec/objects/or_test.rb +40 -40
  303. data/lib/inspec/objects/ruby_helper.rb +15 -15
  304. data/lib/inspec/objects/tag.rb +27 -27
  305. data/lib/inspec/objects/test.rb +87 -87
  306. data/lib/inspec/objects/value.rb +27 -27
  307. data/lib/inspec/plugins.rb +60 -60
  308. data/lib/inspec/plugins/cli.rb +24 -24
  309. data/lib/inspec/plugins/fetcher.rb +86 -86
  310. data/lib/inspec/plugins/resource.rb +135 -135
  311. data/lib/inspec/plugins/secret.rb +15 -15
  312. data/lib/inspec/plugins/source_reader.rb +40 -40
  313. data/lib/inspec/polyfill.rb +12 -12
  314. data/lib/inspec/profile.rb +513 -513
  315. data/lib/inspec/profile_context.rb +208 -208
  316. data/lib/inspec/profile_vendor.rb +66 -66
  317. data/lib/inspec/reporters.rb +60 -60
  318. data/lib/inspec/reporters/automate.rb +76 -76
  319. data/lib/inspec/reporters/base.rb +25 -25
  320. data/lib/inspec/reporters/cli.rb +356 -356
  321. data/lib/inspec/reporters/json.rb +117 -117
  322. data/lib/inspec/reporters/json_min.rb +48 -48
  323. data/lib/inspec/reporters/junit.rb +78 -78
  324. data/lib/inspec/require_loader.rb +33 -33
  325. data/lib/inspec/resource.rb +190 -190
  326. data/lib/inspec/rule.rb +280 -280
  327. data/lib/inspec/runner.rb +345 -345
  328. data/lib/inspec/runner_mock.rb +41 -41
  329. data/lib/inspec/runner_rspec.rb +175 -175
  330. data/lib/inspec/runtime_profile.rb +26 -26
  331. data/lib/inspec/schema.rb +213 -213
  332. data/lib/inspec/secrets.rb +19 -19
  333. data/lib/inspec/secrets/yaml.rb +30 -30
  334. data/lib/inspec/shell.rb +220 -220
  335. data/lib/inspec/shell_detector.rb +90 -90
  336. data/lib/inspec/source_reader.rb +29 -29
  337. data/lib/inspec/version.rb +8 -8
  338. data/lib/matchers/matchers.rb +339 -339
  339. data/lib/resource_support/aws.rb +50 -50
  340. data/lib/resource_support/aws/aws_backend_base.rb +12 -12
  341. data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
  342. data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
  343. data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
  344. data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
  345. data/lib/resources/aide_conf.rb +151 -151
  346. data/lib/resources/apache.rb +48 -48
  347. data/lib/resources/apache_conf.rb +149 -149
  348. data/lib/resources/apt.rb +149 -149
  349. data/lib/resources/audit_policy.rb +63 -63
  350. data/lib/resources/auditd.rb +231 -231
  351. data/lib/resources/auditd_conf.rb +46 -46
  352. data/lib/resources/aws/aws_cloudtrail_trail.rb +93 -93
  353. data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
  354. data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
  355. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
  356. data/lib/resources/aws/aws_config_delivery_channel.rb +70 -70
  357. data/lib/resources/aws/aws_config_recorder.rb +93 -93
  358. data/lib/resources/aws/aws_ec2_instance.rb +157 -157
  359. data/lib/resources/aws/aws_ec2_instances.rb +64 -64
  360. data/lib/resources/aws/aws_iam_access_key.rb +106 -106
  361. data/lib/resources/aws/aws_iam_access_keys.rb +149 -149
  362. data/lib/resources/aws/aws_iam_group.rb +58 -58
  363. data/lib/resources/aws/aws_iam_groups.rb +52 -52
  364. data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
  365. data/lib/resources/aws/aws_iam_policies.rb +53 -53
  366. data/lib/resources/aws/aws_iam_policy.rb +291 -291
  367. data/lib/resources/aws/aws_iam_role.rb +55 -55
  368. data/lib/resources/aws/aws_iam_root_user.rb +78 -78
  369. data/lib/resources/aws/aws_iam_user.rb +142 -142
  370. data/lib/resources/aws/aws_iam_users.rb +146 -146
  371. data/lib/resources/aws/aws_kms_key.rb +96 -96
  372. data/lib/resources/aws/aws_kms_keys.rb +53 -53
  373. data/lib/resources/aws/aws_rds_instance.rb +71 -71
  374. data/lib/resources/aws/aws_route_table.rb +63 -63
  375. data/lib/resources/aws/aws_route_tables.rb +60 -60
  376. data/lib/resources/aws/aws_s3_bucket.rb +137 -137
  377. data/lib/resources/aws/aws_s3_bucket_object.rb +82 -82
  378. data/lib/resources/aws/aws_s3_buckets.rb +51 -51
  379. data/lib/resources/aws/aws_security_group.rb +249 -249
  380. data/lib/resources/aws/aws_security_groups.rb +68 -68
  381. data/lib/resources/aws/aws_sns_subscription.rb +78 -78
  382. data/lib/resources/aws/aws_sns_topic.rb +53 -53
  383. data/lib/resources/aws/aws_sns_topics.rb +56 -56
  384. data/lib/resources/aws/aws_subnet.rb +88 -88
  385. data/lib/resources/aws/aws_subnets.rb +53 -53
  386. data/lib/resources/aws/aws_vpc.rb +73 -73
  387. data/lib/resources/aws/aws_vpcs.rb +52 -52
  388. data/lib/resources/azure/azure_backend.rb +377 -377
  389. data/lib/resources/azure/azure_generic_resource.rb +59 -59
  390. data/lib/resources/azure/azure_resource_group.rb +152 -152
  391. data/lib/resources/azure/azure_virtual_machine.rb +264 -264
  392. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +134 -134
  393. data/lib/resources/bash.rb +35 -35
  394. data/lib/resources/bond.rb +69 -69
  395. data/lib/resources/bridge.rb +122 -122
  396. data/lib/resources/chocolatey_package.rb +78 -78
  397. data/lib/resources/command.rb +73 -73
  398. data/lib/resources/cpan.rb +58 -58
  399. data/lib/resources/cran.rb +64 -64
  400. data/lib/resources/crontab.rb +169 -169
  401. data/lib/resources/csv.rb +56 -56
  402. data/lib/resources/dh_params.rb +77 -77
  403. data/lib/resources/directory.rb +25 -25
  404. data/lib/resources/docker.rb +236 -236
  405. data/lib/resources/docker_container.rb +89 -89
  406. data/lib/resources/docker_image.rb +83 -83
  407. data/lib/resources/docker_object.rb +57 -57
  408. data/lib/resources/docker_service.rb +90 -90
  409. data/lib/resources/elasticsearch.rb +169 -169
  410. data/lib/resources/etc_fstab.rb +94 -94
  411. data/lib/resources/etc_group.rb +154 -154
  412. data/lib/resources/etc_hosts.rb +66 -66
  413. data/lib/resources/etc_hosts_allow_deny.rb +112 -112
  414. data/lib/resources/file.rb +298 -298
  415. data/lib/resources/filesystem.rb +31 -31
  416. data/lib/resources/firewalld.rb +143 -143
  417. data/lib/resources/gem.rb +70 -70
  418. data/lib/resources/groups.rb +215 -215
  419. data/lib/resources/grub_conf.rb +227 -227
  420. data/lib/resources/host.rb +306 -306
  421. data/lib/resources/http.rb +253 -253
  422. data/lib/resources/iis_app.rb +101 -101
  423. data/lib/resources/iis_site.rb +148 -148
  424. data/lib/resources/inetd_conf.rb +54 -54
  425. data/lib/resources/ini.rb +29 -29
  426. data/lib/resources/interface.rb +129 -129
  427. data/lib/resources/iptables.rb +80 -80
  428. data/lib/resources/json.rb +111 -111
  429. data/lib/resources/kernel_module.rb +107 -107
  430. data/lib/resources/kernel_parameter.rb +58 -58
  431. data/lib/resources/key_rsa.rb +63 -63
  432. data/lib/resources/limits_conf.rb +46 -46
  433. data/lib/resources/login_def.rb +57 -57
  434. data/lib/resources/mount.rb +88 -88
  435. data/lib/resources/mssql_session.rb +101 -101
  436. data/lib/resources/mysql.rb +82 -82
  437. data/lib/resources/mysql_conf.rb +127 -127
  438. data/lib/resources/mysql_session.rb +85 -85
  439. data/lib/resources/nginx.rb +96 -96
  440. data/lib/resources/nginx_conf.rb +226 -226
  441. data/lib/resources/npm.rb +48 -48
  442. data/lib/resources/ntp_conf.rb +51 -51
  443. data/lib/resources/oneget.rb +71 -71
  444. data/lib/resources/oracledb_session.rb +139 -139
  445. data/lib/resources/os.rb +36 -36
  446. data/lib/resources/os_env.rb +86 -86
  447. data/lib/resources/package.rb +370 -370
  448. data/lib/resources/packages.rb +111 -111
  449. data/lib/resources/parse_config.rb +112 -112
  450. data/lib/resources/passwd.rb +76 -76
  451. data/lib/resources/pip.rb +130 -130
  452. data/lib/resources/platform.rb +109 -109
  453. data/lib/resources/port.rb +771 -771
  454. data/lib/resources/postgres.rb +131 -131
  455. data/lib/resources/postgres_conf.rb +114 -114
  456. data/lib/resources/postgres_hba_conf.rb +90 -90
  457. data/lib/resources/postgres_ident_conf.rb +79 -79
  458. data/lib/resources/postgres_session.rb +71 -71
  459. data/lib/resources/powershell.rb +67 -67
  460. data/lib/resources/processes.rb +204 -204
  461. data/lib/resources/rabbitmq_conf.rb +51 -51
  462. data/lib/resources/registry_key.rb +297 -297
  463. data/lib/resources/security_policy.rb +180 -180
  464. data/lib/resources/service.rb +794 -794
  465. data/lib/resources/shadow.rb +159 -159
  466. data/lib/resources/ssh_conf.rb +97 -97
  467. data/lib/resources/ssl.rb +99 -99
  468. data/lib/resources/sys_info.rb +28 -28
  469. data/lib/resources/toml.rb +32 -32
  470. data/lib/resources/users.rb +654 -654
  471. data/lib/resources/vbscript.rb +68 -68
  472. data/lib/resources/virtualization.rb +247 -247
  473. data/lib/resources/windows_feature.rb +84 -84
  474. data/lib/resources/windows_hotfix.rb +35 -35
  475. data/lib/resources/windows_task.rb +102 -102
  476. data/lib/resources/wmi.rb +110 -110
  477. data/lib/resources/x509_certificate.rb +137 -137
  478. data/lib/resources/xinetd.rb +106 -106
  479. data/lib/resources/xml.rb +46 -46
  480. data/lib/resources/yaml.rb +43 -43
  481. data/lib/resources/yum.rb +180 -180
  482. data/lib/resources/zfs_dataset.rb +60 -60
  483. data/lib/resources/zfs_pool.rb +49 -49
  484. data/lib/source_readers/flat.rb +39 -39
  485. data/lib/source_readers/inspec.rb +75 -75
  486. data/lib/utils/command_wrapper.rb +27 -27
  487. data/lib/utils/convert.rb +12 -12
  488. data/lib/utils/database_helpers.rb +77 -77
  489. data/lib/utils/enumerable_delegation.rb +9 -9
  490. data/lib/utils/erlang_parser.rb +192 -192
  491. data/lib/utils/file_reader.rb +25 -25
  492. data/lib/utils/filter.rb +273 -273
  493. data/lib/utils/filter_array.rb +27 -27
  494. data/lib/utils/find_files.rb +47 -47
  495. data/lib/utils/hash.rb +41 -41
  496. data/lib/utils/json_log.rb +18 -18
  497. data/lib/utils/latest_version.rb +22 -22
  498. data/lib/utils/modulator.rb +12 -12
  499. data/lib/utils/nginx_parser.rb +105 -105
  500. data/lib/utils/object_traversal.rb +49 -49
  501. data/lib/utils/parser.rb +274 -274
  502. data/lib/utils/pkey_reader.rb +15 -15
  503. data/lib/utils/plugin_registry.rb +93 -93
  504. data/lib/utils/simpleconfig.rb +120 -120
  505. data/lib/utils/spdx.rb +13 -13
  506. data/lib/utils/spdx.txt +343 -343
  507. metadata +3 -3
@@ -1,20 +1,20 @@
1
- module Inspec::Formatters
2
- class RspecJson < RSpec::Core::Formatters::JsonFormatter
3
- RSpec::Core::Formatters.register self
4
-
5
- private
6
-
7
- # We are cheating and overriding a private method in RSpec's core JsonFormatter.
8
- # This is to avoid having to repeat this id functionality in both dump_summary
9
- # and dump_profile (both of which call format_example).
10
- # See https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/json_formatter.rb
11
- #
12
- # rspec's example id here corresponds to an inspec test's control name -
13
- # either explicitly specified or auto-generated by rspec itself.
14
- def format_example(example)
15
- res = super(example)
16
- res[:id] = example.metadata[:id]
17
- res
18
- end
19
- end
20
- end
1
+ module Inspec::Formatters
2
+ class RspecJson < RSpec::Core::Formatters::JsonFormatter
3
+ RSpec::Core::Formatters.register self
4
+
5
+ private
6
+
7
+ # We are cheating and overriding a private method in RSpec's core JsonFormatter.
8
+ # This is to avoid having to repeat this id functionality in both dump_summary
9
+ # and dump_profile (both of which call format_example).
10
+ # See https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/json_formatter.rb
11
+ #
12
+ # rspec's example id here corresponds to an inspec test's control name -
13
+ # either explicitly specified or auto-generated by rspec itself.
14
+ def format_example(example)
15
+ res = super(example)
16
+ res[:id] = example.metadata[:id]
17
+ res
18
+ end
19
+ end
20
+ end
@@ -1,12 +1,12 @@
1
- module Inspec::Formatters
2
- class ShowProgress < RSpec::Core::Formatters::ProgressFormatter
3
- RSpec::Core::Formatters.register self
4
-
5
- # remove summary output from progress
6
- %w{dump_summary dump_failures dump_pending message seed start_dump}.each do |m|
7
- define_method(m) do |*args|
8
- # override
9
- end
10
- end
11
- end
12
- end
1
+ module Inspec::Formatters
2
+ class ShowProgress < RSpec::Core::Formatters::ProgressFormatter
3
+ RSpec::Core::Formatters.register self
4
+
5
+ # remove summary output from progress
6
+ %w{dump_summary dump_failures dump_pending message seed start_dump}.each do |m|
7
+ define_method(m) do |*args|
8
+ # override
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,58 +1,58 @@
1
- # encoding: utf-8
2
- # author: Steven Danna
3
- # author: Victoria Jeffrey
4
- require 'inspec/plugins/resource'
5
- require 'inspec/dsl_shared'
6
-
7
- module Inspec
8
- #
9
- # LibaryEvalContext constructs an instance of an anonymous class
10
- # that library files will be instance_exec'd against.
11
- #
12
- # The anonymous class ensures that `Inspec.resource(1)` will return
13
- # an anonymouse class that is suitable as the parent class of an
14
- # inspec resource. The class returned will have the resource
15
- # registry used by all dsl methods bound to the resource registry
16
- # passed into the #create constructor.
17
- #
18
- #
19
- class LibraryEvalContext
20
- def self.create(registry, require_loader)
21
- c = Class.new do
22
- extend Inspec::ResourceDSL
23
- include Inspec::ResourceBehaviors
24
- define_singleton_method :__resource_registry do
25
- registry
26
- end
27
- end
28
-
29
- c2 = Class.new do
30
- define_singleton_method :resource do |version|
31
- Inspec.validate_resource_dsl_version!(version)
32
- c
33
- end
34
- end
35
-
36
- c3 = Class.new do
37
- include Inspec::DSL::RequireOverride
38
- def initialize(require_loader)
39
- @require_loader = require_loader
40
- @inspec_binding = nil
41
- end
42
-
43
- def __inspec_binding
44
- @inspec_binding
45
- end
46
- end
47
-
48
- c3.const_set(:Inspec, c2)
49
- res = c3.new(require_loader)
50
-
51
- # Provide the local binding for this context which is necessary for
52
- # calls to `require` to create all dependent objects in the correct
53
- # context.
54
- res.instance_variable_set('@inspec_binding', res.instance_eval('binding'))
55
- res
56
- end
57
- end
58
- end
1
+ # encoding: utf-8
2
+ # author: Steven Danna
3
+ # author: Victoria Jeffrey
4
+ require 'inspec/plugins/resource'
5
+ require 'inspec/dsl_shared'
6
+
7
+ module Inspec
8
+ #
9
+ # LibaryEvalContext constructs an instance of an anonymous class
10
+ # that library files will be instance_exec'd against.
11
+ #
12
+ # The anonymous class ensures that `Inspec.resource(1)` will return
13
+ # an anonymouse class that is suitable as the parent class of an
14
+ # inspec resource. The class returned will have the resource
15
+ # registry used by all dsl methods bound to the resource registry
16
+ # passed into the #create constructor.
17
+ #
18
+ #
19
+ class LibraryEvalContext
20
+ def self.create(registry, require_loader)
21
+ c = Class.new do
22
+ extend Inspec::ResourceDSL
23
+ include Inspec::ResourceBehaviors
24
+ define_singleton_method :__resource_registry do
25
+ registry
26
+ end
27
+ end
28
+
29
+ c2 = Class.new do
30
+ define_singleton_method :resource do |version|
31
+ Inspec.validate_resource_dsl_version!(version)
32
+ c
33
+ end
34
+ end
35
+
36
+ c3 = Class.new do
37
+ include Inspec::DSL::RequireOverride
38
+ def initialize(require_loader)
39
+ @require_loader = require_loader
40
+ @inspec_binding = nil
41
+ end
42
+
43
+ def __inspec_binding
44
+ @inspec_binding
45
+ end
46
+ end
47
+
48
+ c3.const_set(:Inspec, c2)
49
+ res = c3.new(require_loader)
50
+
51
+ # Provide the local binding for this context which is necessary for
52
+ # calls to `require` to create all dependent objects in the correct
53
+ # context.
54
+ res.instance_variable_set('@inspec_binding', res.instance_eval('binding'))
55
+ res
56
+ end
57
+ end
58
+ end
data/lib/inspec/log.rb CHANGED
@@ -1,11 +1,11 @@
1
- # encoding: utf-8
2
- # author: Dominik Richter
3
- # author: Christoph Hartmann
4
-
5
- require 'mixlib/log'
6
-
7
- module Inspec
8
- class Log
9
- extend Mixlib::Log
10
- end
11
- end
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ require 'mixlib/log'
6
+
7
+ module Inspec
8
+ class Log
9
+ extend Mixlib::Log
10
+ end
11
+ end
@@ -1,247 +1,247 @@
1
- # encoding: utf-8
2
- # Copyright 2015 Dominik Richter
3
- # author: Dominik Richter
4
- # author: Christoph Hartmann
5
-
6
- require 'logger'
7
- require 'rubygems/version'
8
- require 'rubygems/requirement'
9
- require 'semverse'
10
- require 'utils/spdx'
11
-
12
- module Inspec
13
- # Extract metadata.rb information
14
- # A Metadata object may be created and finalized with invalid data.
15
- # This allows the check CLI command to analyse the issues.
16
- # Use valid? to determine if the metadata is coherent.
17
- class Metadata
18
- attr_reader :ref
19
- attr_accessor :params, :content
20
- def initialize(ref, logger = nil)
21
- @ref = ref
22
- @logger = logger || Logger.new(nil)
23
- @content = ''
24
- @params = {}
25
- @missing_methods = []
26
- end
27
-
28
- %w{
29
- name
30
- title
31
- maintainer
32
- maintainer_email
33
- copyright
34
- copyright_email
35
- license
36
- summary
37
- description
38
- version
39
- inspec_version
40
- }.each do |name|
41
- define_method name.to_sym do |arg|
42
- params[name.to_sym] = arg
43
- end
44
- end
45
-
46
- def dependencies
47
- params[:depends] || []
48
- end
49
-
50
- def supports(sth, version = nil)
51
- # Ignore supports with metadata.rb. This file is legacy and the way it
52
- # it handles `supports` deprecated. A deprecation warning will be printed
53
- # already.
54
- end
55
-
56
- def inspec_requirement
57
- # using Gem::Requirement here to allow nil values which
58
- # translate to [">= 0"]
59
- Gem::Requirement.create(params[:inspec_version])
60
- end
61
-
62
- def supports_runtime?
63
- running = Gem::Version.new(Inspec::VERSION)
64
- inspec_requirement.satisfied_by?(running)
65
- end
66
-
67
- def supports_platform?(backend)
68
- backend.platform.supported?(params[:supports])
69
- end
70
-
71
- # return all warn and errors
72
- def valid # rubocop:disable Metrics/AbcSize
73
- errors = []
74
- warnings = []
75
-
76
- %w{name version}.each do |field|
77
- next unless params[field.to_sym].nil?
78
- errors.push("Missing profile #{field} in #{ref}")
79
- end
80
-
81
- if params[:name] =~ %r{[\/\\]}
82
- warnings.push("Your profile name (#{params[:name]}) contains a slash " \
83
- 'which will not be permitted in InSpec 2.0. Please change your profile ' \
84
- 'name in the `inspec.yml` file.')
85
- end
86
-
87
- # if version is set, ensure it is correct
88
- if !params[:version].nil? && !valid_version?(params[:version])
89
- errors.push('Version needs to be in SemVer format')
90
- end
91
-
92
- %w{title summary maintainer copyright license}.each do |field|
93
- next unless params[field.to_sym].nil?
94
- warnings.push("Missing profile #{field} in #{ref}")
95
- end
96
-
97
- # if version is set, ensure it is in SPDX format
98
- if !params[:license].nil? && !Spdx.valid_license?(params[:license])
99
- warnings.push("License '#{params[:license]}' needs to be in SPDX format. See https://spdx.org/licenses/.")
100
- end
101
-
102
- [errors, warnings]
103
- end
104
-
105
- # returns true or false
106
- def valid?
107
- errors, _warnings = valid
108
- errors.empty? && unsupported.empty?
109
- end
110
-
111
- def valid_version?(value)
112
- Semverse::Version.new(value)
113
- true
114
- rescue Semverse::InvalidVersionFormat
115
- false
116
- end
117
-
118
- def method_missing(sth, *args)
119
- @logger.warn "#{ref} doesn't support: #{sth} #{args}"
120
- @missing_methods.push(sth)
121
- end
122
-
123
- def unsupported
124
- @missing_methods
125
- end
126
-
127
- def self.symbolize_keys(obj)
128
- return obj.map { |i| symbolize_keys(i) } if obj.is_a?(Array)
129
- return obj unless obj.is_a?(Hash)
130
-
131
- obj.each_with_object({}) do |(k, v), h|
132
- v = symbolize_keys(v) if v.is_a?(Hash)
133
- v = symbolize_keys(v) if v.is_a?(Array)
134
- h[k.to_sym] = v
135
- end
136
- end
137
-
138
- def self.finalize_supports_elem(elem, logger)
139
- case x = elem
140
- when Hash
141
- x[:release] = x[:release].to_s if x[:release]
142
- x
143
- when Array
144
- logger.warn(
145
- 'Failed to read supports entry that is an array. Please use '\
146
- 'the `supports: {os-family: xyz}` syntax.',
147
- )
148
- nil
149
- when nil then nil
150
- else
151
- logger ||= Logger.new(nil)
152
- logger.warn(
153
- "Do not use deprecated `supports: #{x}` syntax. Instead use:\n"\
154
- "supports:\n - os-family: #{x}\n\n",
155
- )
156
- { :'os-family' => x } # rubocop:disable Style/HashSyntax
157
- end
158
- end
159
-
160
- def self.finalize_supports(supports, logger)
161
- case x = supports
162
- when Hash then [finalize_supports_elem(x, logger)]
163
- when Array then x.map { |e| finalize_supports_elem(e, logger) }.compact
164
- when nil then []
165
- else
166
- logger ||= Logger.new(nil)
167
- logger.warn(
168
- "Do not use deprecated `supports: #{x}` syntax. Instead use:\n"\
169
- "supports:\n - os-family: #{x}\n\n",
170
- )
171
- [{ :'os-family' => x }] # rubocop:disable Style/HashSyntax
172
- end
173
- end
174
-
175
- def self.finalize_name(metadata, profile_id, original_target)
176
- # profile_id always overwrites whatever already exists as the name
177
- unless profile_id.to_s.empty?
178
- metadata.params[:name] = profile_id.to_s
179
- return
180
- end
181
-
182
- # don't overwrite an existing name
183
- return unless metadata.params[:name].nil?
184
-
185
- # if there's a title, there is no need to set a name too
186
- return unless metadata.params[:title].nil?
187
-
188
- # create a new name based on the original target if it exists
189
- # Crudely slug the target to not contain slashes, to avoid breaking
190
- # unit tests that look for warning sequences
191
- return if original_target.to_s.empty?
192
- metadata.params[:title] = "tests from #{original_target}"
193
- metadata.params[:name] = metadata.params[:title].gsub(%r{[\\\/]}, '.')
194
- end
195
-
196
- def self.finalize(metadata, profile_id, options, logger = nil)
197
- return nil if metadata.nil?
198
- param = metadata.params || {}
199
- options ||= {}
200
- param['version'] = param['version'].to_s unless param['version'].nil?
201
- metadata.params = symbolize_keys(param)
202
- metadata.params[:supports] = finalize_supports(metadata.params[:supports], logger)
203
- finalize_name(metadata, profile_id, options[:target])
204
-
205
- metadata
206
- end
207
-
208
- def self.from_yaml(ref, content, profile_id, logger = nil)
209
- res = Metadata.new(ref, logger)
210
- res.params = YAML.load(content)
211
- res.content = content
212
- finalize(res, profile_id, {}, logger)
213
- end
214
-
215
- def self.from_ruby(ref, content, profile_id, logger = nil)
216
- res = Metadata.new(ref, logger)
217
- res.instance_eval(content, ref, 1)
218
- res.content = content
219
- finalize(res, profile_id, {}, logger)
220
- end
221
-
222
- def self.from_ref(ref, content, profile_id, logger = nil)
223
- # NOTE there doesn't have to exist an actual file, it may come from an
224
- # archive (i.e., content)
225
- case File.basename(ref)
226
- when 'inspec.yml'
227
- from_yaml(ref, content, profile_id, logger)
228
- when 'metadata.rb'
229
- from_ruby(ref, content, profile_id, logger)
230
- else
231
- logger ||= Logger.new(nil)
232
- logger.error "Don't know how to handle metadata in #{ref}"
233
- nil
234
- end
235
- end
236
-
237
- def self.from_file(path, profile_id, logger = nil)
238
- unless File.file?(path)
239
- logger ||= Logger.new(nil)
240
- logger.error "Can't find metadata file #{path}"
241
- return nil
242
- end
243
-
244
- from_ref(File.basename(path), File.read(path), profile_id, logger)
245
- end
246
- end
247
- end
1
+ # encoding: utf-8
2
+ # Copyright 2015 Dominik Richter
3
+ # author: Dominik Richter
4
+ # author: Christoph Hartmann
5
+
6
+ require 'logger'
7
+ require 'rubygems/version'
8
+ require 'rubygems/requirement'
9
+ require 'semverse'
10
+ require 'utils/spdx'
11
+
12
+ module Inspec
13
+ # Extract metadata.rb information
14
+ # A Metadata object may be created and finalized with invalid data.
15
+ # This allows the check CLI command to analyse the issues.
16
+ # Use valid? to determine if the metadata is coherent.
17
+ class Metadata
18
+ attr_reader :ref
19
+ attr_accessor :params, :content
20
+ def initialize(ref, logger = nil)
21
+ @ref = ref
22
+ @logger = logger || Logger.new(nil)
23
+ @content = ''
24
+ @params = {}
25
+ @missing_methods = []
26
+ end
27
+
28
+ %w{
29
+ name
30
+ title
31
+ maintainer
32
+ maintainer_email
33
+ copyright
34
+ copyright_email
35
+ license
36
+ summary
37
+ description
38
+ version
39
+ inspec_version
40
+ }.each do |name|
41
+ define_method name.to_sym do |arg|
42
+ params[name.to_sym] = arg
43
+ end
44
+ end
45
+
46
+ def dependencies
47
+ params[:depends] || []
48
+ end
49
+
50
+ def supports(sth, version = nil)
51
+ # Ignore supports with metadata.rb. This file is legacy and the way it
52
+ # it handles `supports` deprecated. A deprecation warning will be printed
53
+ # already.
54
+ end
55
+
56
+ def inspec_requirement
57
+ # using Gem::Requirement here to allow nil values which
58
+ # translate to [">= 0"]
59
+ Gem::Requirement.create(params[:inspec_version])
60
+ end
61
+
62
+ def supports_runtime?
63
+ running = Gem::Version.new(Inspec::VERSION)
64
+ inspec_requirement.satisfied_by?(running)
65
+ end
66
+
67
+ def supports_platform?(backend)
68
+ backend.platform.supported?(params[:supports])
69
+ end
70
+
71
+ # return all warn and errors
72
+ def valid # rubocop:disable Metrics/AbcSize
73
+ errors = []
74
+ warnings = []
75
+
76
+ %w{name version}.each do |field|
77
+ next unless params[field.to_sym].nil?
78
+ errors.push("Missing profile #{field} in #{ref}")
79
+ end
80
+
81
+ if params[:name] =~ %r{[\/\\]}
82
+ warnings.push("Your profile name (#{params[:name]}) contains a slash " \
83
+ 'which will not be permitted in InSpec 2.0. Please change your profile ' \
84
+ 'name in the `inspec.yml` file.')
85
+ end
86
+
87
+ # if version is set, ensure it is correct
88
+ if !params[:version].nil? && !valid_version?(params[:version])
89
+ errors.push('Version needs to be in SemVer format')
90
+ end
91
+
92
+ %w{title summary maintainer copyright license}.each do |field|
93
+ next unless params[field.to_sym].nil?
94
+ warnings.push("Missing profile #{field} in #{ref}")
95
+ end
96
+
97
+ # if version is set, ensure it is in SPDX format
98
+ if !params[:license].nil? && !Spdx.valid_license?(params[:license])
99
+ warnings.push("License '#{params[:license]}' needs to be in SPDX format. See https://spdx.org/licenses/.")
100
+ end
101
+
102
+ [errors, warnings]
103
+ end
104
+
105
+ # returns true or false
106
+ def valid?
107
+ errors, _warnings = valid
108
+ errors.empty? && unsupported.empty?
109
+ end
110
+
111
+ def valid_version?(value)
112
+ Semverse::Version.new(value)
113
+ true
114
+ rescue Semverse::InvalidVersionFormat
115
+ false
116
+ end
117
+
118
+ def method_missing(sth, *args)
119
+ @logger.warn "#{ref} doesn't support: #{sth} #{args}"
120
+ @missing_methods.push(sth)
121
+ end
122
+
123
+ def unsupported
124
+ @missing_methods
125
+ end
126
+
127
+ def self.symbolize_keys(obj)
128
+ return obj.map { |i| symbolize_keys(i) } if obj.is_a?(Array)
129
+ return obj unless obj.is_a?(Hash)
130
+
131
+ obj.each_with_object({}) do |(k, v), h|
132
+ v = symbolize_keys(v) if v.is_a?(Hash)
133
+ v = symbolize_keys(v) if v.is_a?(Array)
134
+ h[k.to_sym] = v
135
+ end
136
+ end
137
+
138
+ def self.finalize_supports_elem(elem, logger)
139
+ case x = elem
140
+ when Hash
141
+ x[:release] = x[:release].to_s if x[:release]
142
+ x
143
+ when Array
144
+ logger.warn(
145
+ 'Failed to read supports entry that is an array. Please use '\
146
+ 'the `supports: {os-family: xyz}` syntax.',
147
+ )
148
+ nil
149
+ when nil then nil
150
+ else
151
+ logger ||= Logger.new(nil)
152
+ logger.warn(
153
+ "Do not use deprecated `supports: #{x}` syntax. Instead use:\n"\
154
+ "supports:\n - os-family: #{x}\n\n",
155
+ )
156
+ { :'os-family' => x } # rubocop:disable Style/HashSyntax
157
+ end
158
+ end
159
+
160
+ def self.finalize_supports(supports, logger)
161
+ case x = supports
162
+ when Hash then [finalize_supports_elem(x, logger)]
163
+ when Array then x.map { |e| finalize_supports_elem(e, logger) }.compact
164
+ when nil then []
165
+ else
166
+ logger ||= Logger.new(nil)
167
+ logger.warn(
168
+ "Do not use deprecated `supports: #{x}` syntax. Instead use:\n"\
169
+ "supports:\n - os-family: #{x}\n\n",
170
+ )
171
+ [{ :'os-family' => x }] # rubocop:disable Style/HashSyntax
172
+ end
173
+ end
174
+
175
+ def self.finalize_name(metadata, profile_id, original_target)
176
+ # profile_id always overwrites whatever already exists as the name
177
+ unless profile_id.to_s.empty?
178
+ metadata.params[:name] = profile_id.to_s
179
+ return
180
+ end
181
+
182
+ # don't overwrite an existing name
183
+ return unless metadata.params[:name].nil?
184
+
185
+ # if there's a title, there is no need to set a name too
186
+ return unless metadata.params[:title].nil?
187
+
188
+ # create a new name based on the original target if it exists
189
+ # Crudely slug the target to not contain slashes, to avoid breaking
190
+ # unit tests that look for warning sequences
191
+ return if original_target.to_s.empty?
192
+ metadata.params[:title] = "tests from #{original_target}"
193
+ metadata.params[:name] = metadata.params[:title].gsub(%r{[\\\/]}, '.')
194
+ end
195
+
196
+ def self.finalize(metadata, profile_id, options, logger = nil)
197
+ return nil if metadata.nil?
198
+ param = metadata.params || {}
199
+ options ||= {}
200
+ param['version'] = param['version'].to_s unless param['version'].nil?
201
+ metadata.params = symbolize_keys(param)
202
+ metadata.params[:supports] = finalize_supports(metadata.params[:supports], logger)
203
+ finalize_name(metadata, profile_id, options[:target])
204
+
205
+ metadata
206
+ end
207
+
208
+ def self.from_yaml(ref, content, profile_id, logger = nil)
209
+ res = Metadata.new(ref, logger)
210
+ res.params = YAML.load(content)
211
+ res.content = content
212
+ finalize(res, profile_id, {}, logger)
213
+ end
214
+
215
+ def self.from_ruby(ref, content, profile_id, logger = nil)
216
+ res = Metadata.new(ref, logger)
217
+ res.instance_eval(content, ref, 1)
218
+ res.content = content
219
+ finalize(res, profile_id, {}, logger)
220
+ end
221
+
222
+ def self.from_ref(ref, content, profile_id, logger = nil)
223
+ # NOTE there doesn't have to exist an actual file, it may come from an
224
+ # archive (i.e., content)
225
+ case File.basename(ref)
226
+ when 'inspec.yml'
227
+ from_yaml(ref, content, profile_id, logger)
228
+ when 'metadata.rb'
229
+ from_ruby(ref, content, profile_id, logger)
230
+ else
231
+ logger ||= Logger.new(nil)
232
+ logger.error "Don't know how to handle metadata in #{ref}"
233
+ nil
234
+ end
235
+ end
236
+
237
+ def self.from_file(path, profile_id, logger = nil)
238
+ unless File.file?(path)
239
+ logger ||= Logger.new(nil)
240
+ logger.error "Can't find metadata file #{path}"
241
+ return nil
242
+ end
243
+
244
+ from_ref(File.basename(path), File.read(path), profile_id, logger)
245
+ end
246
+ end
247
+ end