inspec 2.1.21 → 2.1.30

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 (502) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +101 -101
  3. data/CHANGELOG.md +3062 -3045
  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 +447 -447
  9. data/Rakefile +322 -322
  10. data/bin/inspec +12 -12
  11. data/docs/.gitignore +2 -2
  12. data/docs/README.md +40 -40
  13. data/docs/dsl_inspec.md +258 -258
  14. data/docs/dsl_resource.md +100 -100
  15. data/docs/glossary.md +99 -99
  16. data/docs/habitat.md +191 -191
  17. data/docs/inspec_and_friends.md +114 -114
  18. data/docs/matchers.md +169 -169
  19. data/docs/migration.md +293 -293
  20. data/docs/platforms.md +118 -118
  21. data/docs/plugin_kitchen_inspec.md +50 -50
  22. data/docs/profiles.md +376 -376
  23. data/docs/reporters.md +105 -105
  24. data/docs/resources/aide_conf.md.erb +75 -75
  25. data/docs/resources/apache.md.erb +67 -67
  26. data/docs/resources/apache_conf.md.erb +68 -68
  27. data/docs/resources/apt.md.erb +71 -71
  28. data/docs/resources/audit_policy.md.erb +47 -47
  29. data/docs/resources/auditd.md.erb +79 -79
  30. data/docs/resources/auditd_conf.md.erb +68 -68
  31. data/docs/resources/aws_cloudtrail_trail.md.erb +140 -140
  32. data/docs/resources/aws_cloudtrail_trails.md.erb +81 -81
  33. data/docs/resources/aws_cloudwatch_alarm.md.erb +86 -86
  34. data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +151 -151
  35. data/docs/resources/aws_config_delivery_channel.md +79 -79
  36. data/docs/resources/aws_config_recorder.md.erb +71 -71
  37. data/docs/resources/aws_ec2_instance.md.erb +106 -106
  38. data/docs/resources/aws_iam_access_key.md.erb +123 -123
  39. data/docs/resources/aws_iam_access_keys.md.erb +198 -198
  40. data/docs/resources/aws_iam_group.md.erb +46 -46
  41. data/docs/resources/aws_iam_groups.md.erb +43 -43
  42. data/docs/resources/aws_iam_password_policy.md.erb +76 -76
  43. data/docs/resources/aws_iam_policies.md.erb +82 -82
  44. data/docs/resources/aws_iam_policy.md.erb +144 -144
  45. data/docs/resources/aws_iam_role.md.erb +63 -63
  46. data/docs/resources/aws_iam_root_user.md.erb +70 -58
  47. data/docs/resources/aws_iam_user.md.erb +64 -64
  48. data/docs/resources/aws_iam_users.md.erb +89 -89
  49. data/docs/resources/aws_kms_key.md.erb +171 -171
  50. data/docs/resources/aws_kms_keys.md.erb +84 -84
  51. data/docs/resources/aws_rds_instance.md.erb +60 -60
  52. data/docs/resources/aws_route_table.md.erb +47 -47
  53. data/docs/resources/aws_route_tables.md.erb +49 -0
  54. data/docs/resources/aws_s3_bucket.md.erb +134 -134
  55. data/docs/resources/aws_s3_bucket_object.md.erb +83 -83
  56. data/docs/resources/aws_s3_buckets.md.erb +53 -0
  57. data/docs/resources/aws_security_group.md.erb +151 -151
  58. data/docs/resources/aws_security_groups.md.erb +91 -91
  59. data/docs/resources/aws_sns_subscription.md.erb +124 -124
  60. data/docs/resources/aws_sns_topic.md.erb +63 -63
  61. data/docs/resources/aws_sns_topics.md.erb +52 -52
  62. data/docs/resources/aws_subnet.md.erb +134 -134
  63. data/docs/resources/aws_subnets.md.erb +126 -126
  64. data/docs/resources/aws_vpc.md.erb +120 -120
  65. data/docs/resources/aws_vpcs.md.erb +48 -48
  66. data/docs/resources/azure_generic_resource.md.erb +171 -171
  67. data/docs/resources/azure_resource_group.md.erb +284 -284
  68. data/docs/resources/azure_virtual_machine.md.erb +347 -347
  69. data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -224
  70. data/docs/resources/bash.md.erb +75 -75
  71. data/docs/resources/bond.md.erb +90 -90
  72. data/docs/resources/bridge.md.erb +57 -57
  73. data/docs/resources/bsd_service.md.erb +67 -67
  74. data/docs/resources/chocolatey_package.md.erb +58 -0
  75. data/docs/resources/command.md.erb +138 -138
  76. data/docs/resources/cpan.md.erb +79 -79
  77. data/docs/resources/cran.md.erb +64 -64
  78. data/docs/resources/crontab.md.erb +89 -89
  79. data/docs/resources/csv.md.erb +54 -54
  80. data/docs/resources/dh_params.md.erb +205 -205
  81. data/docs/resources/directory.md.erb +30 -30
  82. data/docs/resources/docker.md.erb +219 -219
  83. data/docs/resources/docker_container.md.erb +103 -103
  84. data/docs/resources/docker_image.md.erb +94 -94
  85. data/docs/resources/docker_service.md.erb +114 -114
  86. data/docs/resources/elasticsearch.md.erb +242 -242
  87. data/docs/resources/etc_fstab.md.erb +125 -125
  88. data/docs/resources/etc_group.md.erb +75 -75
  89. data/docs/resources/etc_hosts.md.erb +78 -78
  90. data/docs/resources/etc_hosts_allow.md.erb +74 -74
  91. data/docs/resources/etc_hosts_deny.md.erb +74 -74
  92. data/docs/resources/file.md.erb +526 -526
  93. data/docs/resources/filesystem.md.erb +41 -41
  94. data/docs/resources/firewalld.md.erb +107 -107
  95. data/docs/resources/gem.md.erb +79 -79
  96. data/docs/resources/group.md.erb +61 -61
  97. data/docs/resources/grub_conf.md.erb +101 -101
  98. data/docs/resources/host.md.erb +86 -86
  99. data/docs/resources/http.md.erb +196 -196
  100. data/docs/resources/iis_app.md.erb +122 -122
  101. data/docs/resources/iis_site.md.erb +135 -135
  102. data/docs/resources/inetd_conf.md.erb +94 -94
  103. data/docs/resources/ini.md.erb +76 -76
  104. data/docs/resources/interface.md.erb +58 -58
  105. data/docs/resources/iptables.md.erb +64 -64
  106. data/docs/resources/json.md.erb +63 -63
  107. data/docs/resources/kernel_module.md.erb +120 -120
  108. data/docs/resources/kernel_parameter.md.erb +53 -53
  109. data/docs/resources/key_rsa.md.erb +85 -85
  110. data/docs/resources/launchd_service.md.erb +57 -57
  111. data/docs/resources/limits_conf.md.erb +75 -75
  112. data/docs/resources/login_defs.md.erb +71 -71
  113. data/docs/resources/mount.md.erb +69 -69
  114. data/docs/resources/mssql_session.md.erb +60 -60
  115. data/docs/resources/mysql_conf.md.erb +99 -99
  116. data/docs/resources/mysql_session.md.erb +74 -74
  117. data/docs/resources/nginx.md.erb +79 -79
  118. data/docs/resources/nginx_conf.md.erb +138 -138
  119. data/docs/resources/npm.md.erb +60 -60
  120. data/docs/resources/ntp_conf.md.erb +60 -60
  121. data/docs/resources/oneget.md.erb +53 -53
  122. data/docs/resources/oracledb_session.md.erb +52 -52
  123. data/docs/resources/os.md.erb +141 -141
  124. data/docs/resources/os_env.md.erb +78 -78
  125. data/docs/resources/package.md.erb +120 -120
  126. data/docs/resources/packages.md.erb +67 -67
  127. data/docs/resources/parse_config.md.erb +103 -103
  128. data/docs/resources/parse_config_file.md.erb +138 -138
  129. data/docs/resources/passwd.md.erb +141 -141
  130. data/docs/resources/pip.md.erb +67 -67
  131. data/docs/resources/port.md.erb +137 -137
  132. data/docs/resources/postgres_conf.md.erb +79 -79
  133. data/docs/resources/postgres_hba_conf.md.erb +93 -93
  134. data/docs/resources/postgres_ident_conf.md.erb +76 -76
  135. data/docs/resources/postgres_session.md.erb +69 -69
  136. data/docs/resources/powershell.md.erb +102 -102
  137. data/docs/resources/processes.md.erb +109 -109
  138. data/docs/resources/rabbitmq_config.md.erb +41 -41
  139. data/docs/resources/registry_key.md.erb +158 -158
  140. data/docs/resources/runit_service.md.erb +57 -57
  141. data/docs/resources/security_policy.md.erb +47 -47
  142. data/docs/resources/service.md.erb +121 -121
  143. data/docs/resources/shadow.md.erb +146 -146
  144. data/docs/resources/ssh_config.md.erb +73 -73
  145. data/docs/resources/sshd_config.md.erb +83 -83
  146. data/docs/resources/ssl.md.erb +119 -119
  147. data/docs/resources/sys_info.md.erb +42 -42
  148. data/docs/resources/systemd_service.md.erb +57 -57
  149. data/docs/resources/sysv_service.md.erb +57 -57
  150. data/docs/resources/upstart_service.md.erb +57 -57
  151. data/docs/resources/user.md.erb +140 -140
  152. data/docs/resources/users.md.erb +127 -127
  153. data/docs/resources/vbscript.md.erb +55 -55
  154. data/docs/resources/virtualization.md.erb +57 -57
  155. data/docs/resources/windows_feature.md.erb +47 -47
  156. data/docs/resources/windows_hotfix.md.erb +53 -53
  157. data/docs/resources/windows_task.md.erb +95 -95
  158. data/docs/resources/wmi.md.erb +81 -81
  159. data/docs/resources/x509_certificate.md.erb +151 -151
  160. data/docs/resources/xinetd_conf.md.erb +156 -156
  161. data/docs/resources/xml.md.erb +85 -85
  162. data/docs/resources/yaml.md.erb +69 -69
  163. data/docs/resources/yum.md.erb +98 -98
  164. data/docs/resources/zfs_dataset.md.erb +53 -53
  165. data/docs/resources/zfs_pool.md.erb +47 -47
  166. data/docs/ruby_usage.md +203 -203
  167. data/docs/shared/matcher_be.md.erb +1 -1
  168. data/docs/shared/matcher_cmp.md.erb +43 -43
  169. data/docs/shared/matcher_eq.md.erb +3 -3
  170. data/docs/shared/matcher_include.md.erb +1 -1
  171. data/docs/shared/matcher_match.md.erb +1 -1
  172. data/docs/shell.md +217 -217
  173. data/examples/README.md +8 -8
  174. data/examples/inheritance/README.md +65 -65
  175. data/examples/inheritance/controls/example.rb +14 -14
  176. data/examples/inheritance/inspec.yml +15 -15
  177. data/examples/kitchen-ansible/.kitchen.yml +25 -25
  178. data/examples/kitchen-ansible/Gemfile +19 -19
  179. data/examples/kitchen-ansible/README.md +53 -53
  180. data/examples/kitchen-ansible/files/nginx.repo +6 -6
  181. data/examples/kitchen-ansible/tasks/main.yml +16 -16
  182. data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
  183. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
  184. data/examples/kitchen-chef/.kitchen.yml +20 -20
  185. data/examples/kitchen-chef/Berksfile +3 -3
  186. data/examples/kitchen-chef/Gemfile +19 -19
  187. data/examples/kitchen-chef/README.md +27 -27
  188. data/examples/kitchen-chef/metadata.rb +7 -7
  189. data/examples/kitchen-chef/recipes/default.rb +6 -6
  190. data/examples/kitchen-chef/recipes/nginx.rb +30 -30
  191. data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
  192. data/examples/kitchen-puppet/.kitchen.yml +22 -22
  193. data/examples/kitchen-puppet/Gemfile +20 -20
  194. data/examples/kitchen-puppet/Puppetfile +25 -25
  195. data/examples/kitchen-puppet/README.md +53 -53
  196. data/examples/kitchen-puppet/manifests/site.pp +33 -33
  197. data/examples/kitchen-puppet/metadata.json +11 -11
  198. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
  199. data/examples/meta-profile/README.md +37 -37
  200. data/examples/meta-profile/controls/example.rb +13 -13
  201. data/examples/meta-profile/inspec.yml +13 -13
  202. data/examples/profile-attribute.yml +2 -2
  203. data/examples/profile-attribute/README.md +14 -14
  204. data/examples/profile-attribute/controls/example.rb +11 -11
  205. data/examples/profile-attribute/inspec.yml +8 -8
  206. data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
  207. data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
  208. data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
  209. data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
  210. data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
  211. data/examples/profile-aws/inspec.yml +11 -11
  212. data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
  213. data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
  214. data/examples/profile-azure/inspec.yml +11 -11
  215. data/examples/profile-sensitive/README.md +29 -29
  216. data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
  217. data/examples/profile-sensitive/controls/sensitive.rb +9 -9
  218. data/examples/profile-sensitive/inspec.yml +8 -8
  219. data/examples/profile/README.md +48 -48
  220. data/examples/profile/controls/example.rb +23 -23
  221. data/examples/profile/controls/gordon.rb +36 -36
  222. data/examples/profile/controls/meta.rb +34 -34
  223. data/examples/profile/inspec.yml +10 -10
  224. data/examples/profile/libraries/gordon_config.rb +59 -53
  225. data/inspec.gemspec +47 -47
  226. data/lib/bundles/README.md +3 -3
  227. data/lib/bundles/inspec-artifact.rb +7 -7
  228. data/lib/bundles/inspec-artifact/README.md +1 -1
  229. data/lib/bundles/inspec-artifact/cli.rb +277 -277
  230. data/lib/bundles/inspec-compliance.rb +16 -16
  231. data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
  232. data/lib/bundles/inspec-compliance/README.md +185 -185
  233. data/lib/bundles/inspec-compliance/api.rb +316 -316
  234. data/lib/bundles/inspec-compliance/api/login.rb +152 -152
  235. data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
  236. data/lib/bundles/inspec-compliance/cli.rb +254 -254
  237. data/lib/bundles/inspec-compliance/configuration.rb +103 -103
  238. data/lib/bundles/inspec-compliance/http.rb +86 -86
  239. data/lib/bundles/inspec-compliance/support.rb +36 -36
  240. data/lib/bundles/inspec-compliance/target.rb +98 -98
  241. data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
  242. data/lib/bundles/inspec-habitat.rb +12 -12
  243. data/lib/bundles/inspec-habitat/cli.rb +36 -36
  244. data/lib/bundles/inspec-habitat/log.rb +10 -10
  245. data/lib/bundles/inspec-habitat/profile.rb +391 -391
  246. data/lib/bundles/inspec-init.rb +8 -8
  247. data/lib/bundles/inspec-init/README.md +31 -31
  248. data/lib/bundles/inspec-init/cli.rb +97 -97
  249. data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
  250. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
  251. data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
  252. data/lib/bundles/inspec-supermarket.rb +13 -13
  253. data/lib/bundles/inspec-supermarket/README.md +45 -45
  254. data/lib/bundles/inspec-supermarket/api.rb +84 -84
  255. data/lib/bundles/inspec-supermarket/cli.rb +73 -73
  256. data/lib/bundles/inspec-supermarket/target.rb +34 -34
  257. data/lib/fetchers/git.rb +163 -163
  258. data/lib/fetchers/local.rb +74 -74
  259. data/lib/fetchers/mock.rb +35 -35
  260. data/lib/fetchers/url.rb +204 -204
  261. data/lib/inspec.rb +24 -24
  262. data/lib/inspec/archive/tar.rb +29 -29
  263. data/lib/inspec/archive/zip.rb +19 -19
  264. data/lib/inspec/backend.rb +93 -93
  265. data/lib/inspec/base_cli.rb +363 -357
  266. data/lib/inspec/cached_fetcher.rb +66 -66
  267. data/lib/inspec/cli.rb +292 -292
  268. data/lib/inspec/completions/bash.sh.erb +45 -45
  269. data/lib/inspec/completions/fish.sh.erb +34 -34
  270. data/lib/inspec/completions/zsh.sh.erb +61 -61
  271. data/lib/inspec/control_eval_context.rb +179 -179
  272. data/lib/inspec/dependencies/cache.rb +72 -72
  273. data/lib/inspec/dependencies/dependency_set.rb +92 -92
  274. data/lib/inspec/dependencies/lockfile.rb +115 -115
  275. data/lib/inspec/dependencies/requirement.rb +123 -123
  276. data/lib/inspec/dependencies/resolver.rb +86 -86
  277. data/lib/inspec/describe.rb +27 -27
  278. data/lib/inspec/dsl.rb +66 -66
  279. data/lib/inspec/dsl_shared.rb +33 -33
  280. data/lib/inspec/env_printer.rb +157 -157
  281. data/lib/inspec/errors.rb +14 -13
  282. data/lib/inspec/exceptions.rb +12 -12
  283. data/lib/inspec/expect.rb +45 -45
  284. data/lib/inspec/fetcher.rb +45 -45
  285. data/lib/inspec/file_provider.rb +275 -275
  286. data/lib/inspec/formatters.rb +3 -3
  287. data/lib/inspec/formatters/base.rb +259 -250
  288. data/lib/inspec/formatters/json_rspec.rb +20 -20
  289. data/lib/inspec/formatters/show_progress.rb +12 -12
  290. data/lib/inspec/library_eval_context.rb +58 -58
  291. data/lib/inspec/log.rb +11 -11
  292. data/lib/inspec/metadata.rb +247 -247
  293. data/lib/inspec/method_source.rb +24 -24
  294. data/lib/inspec/objects.rb +14 -14
  295. data/lib/inspec/objects/attribute.rb +65 -65
  296. data/lib/inspec/objects/control.rb +61 -61
  297. data/lib/inspec/objects/describe.rb +92 -92
  298. data/lib/inspec/objects/each_loop.rb +36 -36
  299. data/lib/inspec/objects/list.rb +15 -15
  300. data/lib/inspec/objects/or_test.rb +40 -40
  301. data/lib/inspec/objects/ruby_helper.rb +15 -15
  302. data/lib/inspec/objects/tag.rb +27 -27
  303. data/lib/inspec/objects/test.rb +87 -87
  304. data/lib/inspec/objects/value.rb +27 -27
  305. data/lib/inspec/plugins.rb +60 -60
  306. data/lib/inspec/plugins/cli.rb +24 -24
  307. data/lib/inspec/plugins/fetcher.rb +86 -86
  308. data/lib/inspec/plugins/resource.rb +135 -135
  309. data/lib/inspec/plugins/secret.rb +15 -15
  310. data/lib/inspec/plugins/source_reader.rb +40 -40
  311. data/lib/inspec/polyfill.rb +12 -12
  312. data/lib/inspec/profile.rb +513 -513
  313. data/lib/inspec/profile_context.rb +208 -208
  314. data/lib/inspec/profile_vendor.rb +66 -66
  315. data/lib/inspec/reporters.rb +60 -54
  316. data/lib/inspec/reporters/automate.rb +76 -0
  317. data/lib/inspec/reporters/base.rb +25 -24
  318. data/lib/inspec/reporters/cli.rb +356 -356
  319. data/lib/inspec/reporters/json.rb +116 -116
  320. data/lib/inspec/reporters/json_min.rb +48 -48
  321. data/lib/inspec/reporters/junit.rb +77 -77
  322. data/lib/inspec/require_loader.rb +33 -33
  323. data/lib/inspec/resource.rb +187 -186
  324. data/lib/inspec/rule.rb +266 -266
  325. data/lib/inspec/runner.rb +345 -345
  326. data/lib/inspec/runner_mock.rb +41 -41
  327. data/lib/inspec/runner_rspec.rb +175 -175
  328. data/lib/inspec/runtime_profile.rb +26 -26
  329. data/lib/inspec/schema.rb +213 -213
  330. data/lib/inspec/secrets.rb +19 -19
  331. data/lib/inspec/secrets/yaml.rb +30 -30
  332. data/lib/inspec/shell.rb +220 -220
  333. data/lib/inspec/shell_detector.rb +90 -90
  334. data/lib/inspec/source_reader.rb +29 -29
  335. data/lib/inspec/version.rb +8 -8
  336. data/lib/matchers/matchers.rb +339 -339
  337. data/lib/resource_support/aws.rb +49 -47
  338. data/lib/resource_support/aws/aws_backend_base.rb +12 -12
  339. data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
  340. data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
  341. data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
  342. data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
  343. data/lib/resources/aide_conf.rb +151 -151
  344. data/lib/resources/apache.rb +48 -48
  345. data/lib/resources/apache_conf.rb +149 -149
  346. data/lib/resources/apt.rb +149 -149
  347. data/lib/resources/audit_policy.rb +63 -63
  348. data/lib/resources/auditd.rb +231 -231
  349. data/lib/resources/auditd_conf.rb +46 -46
  350. data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -77
  351. data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
  352. data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
  353. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
  354. data/lib/resources/aws/aws_config_delivery_channel.rb +76 -76
  355. data/lib/resources/aws/aws_config_recorder.rb +98 -98
  356. data/lib/resources/aws/aws_ec2_instance.rb +157 -157
  357. data/lib/resources/aws/aws_iam_access_key.rb +106 -106
  358. data/lib/resources/aws/aws_iam_access_keys.rb +149 -149
  359. data/lib/resources/aws/aws_iam_group.rb +56 -56
  360. data/lib/resources/aws/aws_iam_groups.rb +52 -52
  361. data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
  362. data/lib/resources/aws/aws_iam_policies.rb +53 -53
  363. data/lib/resources/aws/aws_iam_policy.rb +125 -125
  364. data/lib/resources/aws/aws_iam_role.rb +51 -51
  365. data/lib/resources/aws/aws_iam_root_user.rb +78 -60
  366. data/lib/resources/aws/aws_iam_user.rb +111 -111
  367. data/lib/resources/aws/aws_iam_users.rb +108 -108
  368. data/lib/resources/aws/aws_kms_key.rb +96 -96
  369. data/lib/resources/aws/aws_kms_keys.rb +53 -53
  370. data/lib/resources/aws/aws_rds_instance.rb +71 -71
  371. data/lib/resources/aws/aws_route_table.rb +63 -63
  372. data/lib/resources/aws/aws_route_tables.rb +60 -0
  373. data/lib/resources/aws/aws_s3_bucket.rb +115 -115
  374. data/lib/resources/aws/aws_s3_bucket_object.rb +82 -82
  375. data/lib/resources/aws/aws_s3_buckets.rb +51 -0
  376. data/lib/resources/aws/aws_security_group.rb +93 -93
  377. data/lib/resources/aws/aws_security_groups.rb +68 -68
  378. data/lib/resources/aws/aws_sns_subscription.rb +78 -78
  379. data/lib/resources/aws/aws_sns_topic.rb +53 -53
  380. data/lib/resources/aws/aws_sns_topics.rb +56 -56
  381. data/lib/resources/aws/aws_subnet.rb +88 -88
  382. data/lib/resources/aws/aws_subnets.rb +53 -53
  383. data/lib/resources/aws/aws_vpc.rb +69 -69
  384. data/lib/resources/aws/aws_vpcs.rb +45 -45
  385. data/lib/resources/azure/azure_backend.rb +377 -377
  386. data/lib/resources/azure/azure_generic_resource.rb +59 -59
  387. data/lib/resources/azure/azure_resource_group.rb +152 -152
  388. data/lib/resources/azure/azure_virtual_machine.rb +264 -264
  389. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +134 -134
  390. data/lib/resources/bash.rb +35 -35
  391. data/lib/resources/bond.rb +69 -69
  392. data/lib/resources/bridge.rb +122 -122
  393. data/lib/resources/chocolatey_package.rb +78 -0
  394. data/lib/resources/command.rb +73 -73
  395. data/lib/resources/cpan.rb +58 -58
  396. data/lib/resources/cran.rb +64 -64
  397. data/lib/resources/crontab.rb +169 -169
  398. data/lib/resources/csv.rb +56 -56
  399. data/lib/resources/dh_params.rb +77 -77
  400. data/lib/resources/directory.rb +25 -25
  401. data/lib/resources/docker.rb +236 -236
  402. data/lib/resources/docker_container.rb +89 -89
  403. data/lib/resources/docker_image.rb +83 -83
  404. data/lib/resources/docker_object.rb +57 -57
  405. data/lib/resources/docker_service.rb +90 -90
  406. data/lib/resources/elasticsearch.rb +169 -169
  407. data/lib/resources/etc_fstab.rb +94 -94
  408. data/lib/resources/etc_group.rb +152 -152
  409. data/lib/resources/etc_hosts.rb +66 -66
  410. data/lib/resources/etc_hosts_allow_deny.rb +112 -112
  411. data/lib/resources/file.rb +298 -298
  412. data/lib/resources/filesystem.rb +31 -31
  413. data/lib/resources/firewalld.rb +143 -143
  414. data/lib/resources/gem.rb +70 -70
  415. data/lib/resources/groups.rb +215 -215
  416. data/lib/resources/grub_conf.rb +227 -227
  417. data/lib/resources/host.rb +306 -306
  418. data/lib/resources/http.rb +253 -253
  419. data/lib/resources/iis_app.rb +101 -101
  420. data/lib/resources/iis_site.rb +148 -148
  421. data/lib/resources/inetd_conf.rb +54 -54
  422. data/lib/resources/ini.rb +29 -29
  423. data/lib/resources/interface.rb +129 -129
  424. data/lib/resources/iptables.rb +80 -80
  425. data/lib/resources/json.rb +107 -107
  426. data/lib/resources/kernel_module.rb +107 -107
  427. data/lib/resources/kernel_parameter.rb +58 -58
  428. data/lib/resources/key_rsa.rb +61 -61
  429. data/lib/resources/limits_conf.rb +46 -46
  430. data/lib/resources/login_def.rb +57 -57
  431. data/lib/resources/mount.rb +88 -88
  432. data/lib/resources/mssql_session.rb +101 -101
  433. data/lib/resources/mysql.rb +82 -81
  434. data/lib/resources/mysql_conf.rb +127 -127
  435. data/lib/resources/mysql_session.rb +85 -85
  436. data/lib/resources/nginx.rb +96 -96
  437. data/lib/resources/nginx_conf.rb +226 -226
  438. data/lib/resources/npm.rb +48 -48
  439. data/lib/resources/ntp_conf.rb +51 -51
  440. data/lib/resources/oneget.rb +71 -71
  441. data/lib/resources/oracledb_session.rb +139 -139
  442. data/lib/resources/os.rb +36 -36
  443. data/lib/resources/os_env.rb +75 -75
  444. data/lib/resources/package.rb +370 -370
  445. data/lib/resources/packages.rb +111 -111
  446. data/lib/resources/parse_config.rb +112 -112
  447. data/lib/resources/passwd.rb +76 -76
  448. data/lib/resources/pip.rb +130 -130
  449. data/lib/resources/platform.rb +109 -109
  450. data/lib/resources/port.rb +771 -771
  451. data/lib/resources/postgres.rb +131 -130
  452. data/lib/resources/postgres_conf.rb +114 -114
  453. data/lib/resources/postgres_hba_conf.rb +90 -90
  454. data/lib/resources/postgres_ident_conf.rb +79 -79
  455. data/lib/resources/postgres_session.rb +71 -71
  456. data/lib/resources/powershell.rb +66 -66
  457. data/lib/resources/processes.rb +204 -204
  458. data/lib/resources/rabbitmq_conf.rb +51 -51
  459. data/lib/resources/registry_key.rb +297 -297
  460. data/lib/resources/security_policy.rb +180 -180
  461. data/lib/resources/service.rb +794 -790
  462. data/lib/resources/shadow.rb +149 -149
  463. data/lib/resources/ssh_conf.rb +97 -97
  464. data/lib/resources/ssl.rb +99 -99
  465. data/lib/resources/sys_info.rb +28 -28
  466. data/lib/resources/toml.rb +32 -32
  467. data/lib/resources/users.rb +654 -654
  468. data/lib/resources/vbscript.rb +68 -68
  469. data/lib/resources/virtualization.rb +247 -247
  470. data/lib/resources/windows_feature.rb +84 -84
  471. data/lib/resources/windows_hotfix.rb +35 -35
  472. data/lib/resources/windows_task.rb +102 -102
  473. data/lib/resources/wmi.rb +110 -110
  474. data/lib/resources/x509_certificate.rb +137 -137
  475. data/lib/resources/xinetd.rb +106 -106
  476. data/lib/resources/xml.rb +46 -46
  477. data/lib/resources/yaml.rb +43 -43
  478. data/lib/resources/yum.rb +180 -180
  479. data/lib/resources/zfs_dataset.rb +60 -60
  480. data/lib/resources/zfs_pool.rb +49 -49
  481. data/lib/source_readers/flat.rb +39 -39
  482. data/lib/source_readers/inspec.rb +75 -75
  483. data/lib/utils/command_wrapper.rb +27 -27
  484. data/lib/utils/convert.rb +12 -12
  485. data/lib/utils/database_helpers.rb +77 -77
  486. data/lib/utils/erlang_parser.rb +192 -192
  487. data/lib/utils/file_reader.rb +25 -25
  488. data/lib/utils/filter.rb +273 -273
  489. data/lib/utils/filter_array.rb +27 -27
  490. data/lib/utils/find_files.rb +44 -44
  491. data/lib/utils/hash.rb +41 -41
  492. data/lib/utils/json_log.rb +18 -18
  493. data/lib/utils/latest_version.rb +22 -22
  494. data/lib/utils/modulator.rb +12 -12
  495. data/lib/utils/nginx_parser.rb +85 -85
  496. data/lib/utils/object_traversal.rb +49 -49
  497. data/lib/utils/parser.rb +274 -274
  498. data/lib/utils/plugin_registry.rb +93 -93
  499. data/lib/utils/simpleconfig.rb +120 -120
  500. data/lib/utils/spdx.rb +13 -13
  501. data/lib/utils/spdx.txt +343 -343
  502. metadata +9 -2
@@ -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