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
data/Rakefile CHANGED
@@ -1,322 +1,322 @@
1
- #!/usr/bin/env rake
2
- # encoding: utf-8
3
-
4
- require 'bundler'
5
- require 'bundler/gem_tasks'
6
- require 'rake/testtask'
7
- require 'passgen'
8
- require 'train'
9
- require_relative 'tasks/maintainers'
10
- require_relative 'tasks/spdx'
11
-
12
- def prompt(message)
13
- print(message)
14
- STDIN.gets.chomp
15
- end
16
-
17
- # The docs tasks rely on ruby-progressbar. If we can't load it, then don't
18
- # load the docs tasks. This is necessary to allow this Rakefile to work
19
- # when the "tests" gem group in the Gemfile has been excluded, such as
20
- # during an appbundle-updater run.
21
- begin
22
- require 'ruby-progressbar'
23
- require_relative 'tasks/docs'
24
- rescue LoadError
25
- puts 'docs tasks are unavailable because the ruby-progressbar gem is not available.'
26
- end
27
-
28
- # Rubocop
29
- begin
30
- require 'rubocop/rake_task'
31
- RuboCop::RakeTask.new(:lint)
32
- rescue LoadError
33
- puts 'rubocop is not available. Install the rubocop gem to run the lint tests.'
34
- end
35
-
36
- # update command output for demo
37
- desc 'Run inspec commands and save results to www/app/responses'
38
- task :update_demo do
39
- ruby 'www/tutorial/scripts/build_simulator_runtime.rb'
40
- ruby 'www/tutorial/scripts/run_simulator_recording.rb'
41
- end
42
-
43
- # run tests
44
- task default: [:lint, :test]
45
-
46
- Rake::TestTask.new do |t|
47
- t.libs << 'test'
48
- t.pattern = 'test/unit/**/*_test.rb'
49
- t.warning = true
50
- t.verbose = true
51
- t.ruby_opts = ['--dev'] if defined?(JRUBY_VERSION)
52
- end
53
-
54
- namespace :test do
55
- task :isolated do
56
- Dir.glob('test/unit/*_test.rb').all? do |file|
57
- sh(Gem.ruby, '-w', '-Ilib:test', file)
58
- end or fail 'Failures'
59
- end
60
-
61
- Rake::TestTask.new(:functional) do |t|
62
- t.libs << 'test'
63
- t.pattern = 'test/functional/**/*_test.rb'
64
- t.warning = true
65
- t.verbose = true
66
- t.ruby_opts = ['--dev'] if defined?(JRUBY_VERSION)
67
- end
68
-
69
- task :resources do
70
- tests = Dir['test/resource/*_test.rb']
71
- return if tests.empty?
72
- sh(Gem.ruby, 'test/docker_test.rb', *tests)
73
- end
74
-
75
- task :integration do
76
- concurrency = ENV['CONCURRENCY'] || 1
77
- os = ENV['OS'] || ''
78
- sh("bundle exec kitchen test -c #{concurrency} #{os}")
79
- end
80
-
81
- task :ssh, [:target] do |_t, args|
82
- tests_path = File.join(File.dirname(__FILE__), 'test', 'integration', 'test', 'integration', 'default')
83
- key_files = ENV['key_files'] || File.join(ENV['HOME'], '.ssh', 'id_rsa')
84
-
85
- sh_cmd = "bin/inspec exec #{tests_path}/"
86
- sh_cmd += ENV['test'] ? "#{ENV['test']}_spec.rb" : '*'
87
- sh_cmd += " --sudo" unless args[:target].split('@')[0] == 'root'
88
- sh_cmd += " -t ssh://#{args[:target]}"
89
- sh_cmd += " --key_files=#{key_files}"
90
- sh_cmd += " --format=#{ENV['format']}" if ENV['format']
91
-
92
- sh('sh', '-c', sh_cmd)
93
- end
94
-
95
- project_dir = File.dirname(__FILE__)
96
- namespace :aws do
97
- ['default', 'minimal'].each do |account|
98
- integration_dir = File.join(project_dir, 'test', 'integration', 'aws', account)
99
- attribute_file = File.join(integration_dir, '.attribute.yml')
100
-
101
- task :"setup:#{account}", :tf_workspace do |t, args|
102
- tf_workspace = args[:tf_workspace] || ENV['INSPEC_TERRAFORM_ENV']
103
- abort("You must either call the top-level test:aws:#{account} task, or set the INSPEC_TERRAFORM_ENV variable.") unless tf_workspace
104
- puts "----> Setup"
105
- abort("You must set the environment variable AWS_REGION") unless ENV['AWS_REGION']
106
- puts "----> Checking for required AWS profile..."
107
- sh("aws configure get aws_access_key_id --profile inspec-aws-test-#{account} > /dev/null")
108
- sh("cd #{integration_dir}/build/ && terraform init")
109
- sh("cd #{integration_dir}/build/ && terraform workspace new #{tf_workspace}")
110
- sh("cd #{integration_dir}/build/ && AWS_PROFILE=inspec-aws-test-#{account} terraform plan")
111
- sh("cd #{integration_dir}/build/ && AWS_PROFILE=inspec-aws-test-#{account} terraform apply")
112
- Rake::Task["test:aws:dump_attrs:#{account}"].execute
113
- end
114
-
115
- task :"dump_attrs:#{account}" do
116
- sh("cd #{integration_dir}/build/ && AWS_PROFILE=inspec-aws-test-#{account} terraform output > #{attribute_file}")
117
- raw_output = File.read(attribute_file)
118
- yaml_output = raw_output.gsub(" = ", " : ")
119
- File.open(attribute_file, "w") {|file| file.puts yaml_output}
120
- end
121
-
122
- task :"run:#{account}" do
123
- puts "----> Run"
124
- sh("bundle exec inspec exec #{integration_dir}/verify -t aws://${AWS_REGION}/inspec-aws-test-#{account} --attrs #{attribute_file}")
125
- end
126
-
127
- task :"cleanup:#{account}", :tf_workspace do |t, args|
128
- tf_workspace = args[:tf_workspace] || ENV['INSPEC_TERRAFORM_ENV']
129
- abort("You must either call the top-level test:aws:#{account} task, or set the INSPEC_TERRAFORM_ENV variable.") unless tf_workspace
130
- puts "----> Cleanup"
131
- sh("cd #{integration_dir}/build/ && AWS_PROFILE=inspec-aws-test-#{account} terraform destroy -force")
132
- sh("cd #{integration_dir}/build/ && terraform workspace select default")
133
- sh("cd #{integration_dir}/build && terraform workspace delete #{tf_workspace}")
134
- end
135
-
136
- task :"#{account}" do
137
- tf_workspace = ENV['INSPEC_TERRAFORM_ENV'] || prompt("Please enter a workspace for your integration tests to run in: ")
138
- begin
139
- Rake::Task["test:aws:setup:#{account}"].execute({:tf_workspace => tf_workspace})
140
- Rake::Task["test:aws:run:#{account}"].execute
141
- rescue
142
- abort("Integration testing has failed for the #{account} account")
143
- ensure
144
- Rake::Task["test:aws:cleanup:#{account}"].execute({:tf_workspace => tf_workspace})
145
- end
146
- end
147
- end
148
- end
149
- desc "Perform AWS Integration Tests"
150
- task aws: [:'aws:default', :'aws:minimal']
151
-
152
- namespace :azure do
153
- # Specify the directory for the integration tests
154
- integration_dir = File.join(project_dir, 'test', 'integration', 'azure')
155
- attribute_file = File.join(integration_dir, '.attribute.yml')
156
-
157
- task :setup, :tf_workspace do |t, args|
158
- tf_workspace = args[:tf_workspace] || ENV['INSPEC_TERRAFORM_ENV']
159
- abort("You must either call the top-level test:azure task, or set the INSPEC_TERRAFORM_ENV variable.") unless tf_workspace
160
- puts '----> Setup'
161
- sh("cd #{integration_dir}/build/ && terraform init")
162
- sh("cd #{integration_dir}/build/ && terraform workspace new #{tf_workspace}")
163
-
164
- # Generate Azure crendentials
165
- creds = Train.create('azure').connection.connect
166
-
167
- # Determine the storage account name and the admin password
168
- sa_name = (0...15).map { (65 + rand(26)).chr }.join.downcase
169
- admin_password = Passgen::generate(length: 12, uppercase: true, lowercase: true, symbols: true, digits: true)
170
-
171
- # Use the first 4 characters of the storage account to create a suffix
172
- suffix = sa_name[0..3]
173
-
174
- # Create the plan that can be applied to Azure
175
- cmd = ""
176
- cmd += "cd #{integration_dir}/build/ && terraform plan -out inspec-azure.plan"
177
- cmd += " -var 'subscription_id=#{creds[:subscription_id]}' "
178
- cmd += " -var 'client_id=#{creds[:client_id]}' "
179
- cmd += " -var 'client_secret=#{creds[:client_secret]}' "
180
- cmd += " -var 'tenant_id=#{creds[:tenant_id]}' "
181
- cmd += " -var 'storage_account_name=#{sa_name}' "
182
- cmd += " -var 'admin_password=#{admin_password}' "
183
- cmd += " -var 'suffix=#{suffix}' "
184
- sh(cmd)
185
-
186
- # Apply the plan on Azure
187
- cmd = "cd #{integration_dir}/build/ && terraform apply inspec-azure.plan"
188
- sh(cmd)
189
-
190
- # Dump TF outputs to InSpec attributes file
191
- Rake::Task["test:azure:dump_attrs"].execute
192
- end
193
-
194
- task :"dump_attrs" do
195
- sh("cd #{integration_dir}/build/ && terraform output > #{attribute_file}")
196
- raw_output = File.read(attribute_file)
197
- yaml_output = raw_output.gsub(" = ", " : ")
198
- File.open(attribute_file, "w") {|file| file.puts yaml_output}
199
- end
200
-
201
- task :run do
202
- puts '----> Run'
203
- sh("bundle exec inspec exec #{integration_dir}/verify -t azure://1e0b427a-d58b-494e-ae4f-ee558463ebbf")
204
- end
205
-
206
- task :cleanup, :tf_workspace do |t, args|
207
- tf_workspace = args[:tf_workspace] || ENV['INSPEC_TERRAFORM_ENV']
208
- abort("You must either call the top-level test:azure task, or set the INSPEC_TERRAFORM_ENV variable.") unless tf_workspace
209
- puts '----> Cleanup'
210
-
211
- creds = Train.create('azure').connection.connect
212
-
213
- cmd = ""
214
- cmd += "cd #{integration_dir}/build/ && terraform destroy -force "
215
- cmd += " -var 'subscription_id=#{creds[:subscription_id]}' "
216
- cmd += " -var 'client_id=#{creds[:client_id]}' "
217
- cmd += " -var 'client_secret=#{creds[:client_secret]}' "
218
- cmd += " -var 'tenant_id=#{creds[:tenant_id]}' "
219
- cmd += " -var 'storage_account_name=dummy' "
220
- cmd += " -var 'admin_password=dummy' "
221
- cmd += " -var 'suffix=dummy' "
222
-
223
- sh(cmd)
224
-
225
- sh("cd #{integration_dir}/build/ && terraform workspace select default")
226
- sh("cd #{integration_dir}/build && terraform workspace delete #{tf_workspace}")
227
- end
228
- end
229
-
230
- desc "Perform Azure Integration Tests"
231
- task :azure do
232
- tf_workspace = ENV['INSPEC_TERRAFORM_ENV'] || prompt("Please enter a workspace for your integration tests to run in: ")
233
- begin
234
- Rake::Task["test:azure:setup"].execute({:tf_workspace => tf_workspace})
235
- Rake::Task["test:azure:run"].execute
236
- rescue
237
- abort("Integration testing has failed")
238
- ensure
239
- Rake::Task["test:azure:cleanup"].execute({:tf_workspace => tf_workspace})
240
- end
241
- end
242
- end
243
-
244
- # Print the current version of this gem or update it.
245
- #
246
- # @param [Type] target the new version you want to set, or nil if you only want to show
247
- def inspec_version(target = nil)
248
- path = 'lib/inspec/version.rb'
249
- require_relative path.sub(/.rb$/, '')
250
-
251
- nu_version = target.nil? ? '' : " -> #{target}"
252
- puts "Inspec: #{Inspec::VERSION}#{nu_version}"
253
-
254
- unless target.nil?
255
- raw = File.read(path)
256
- nu = raw.sub(/VERSION.*/, "VERSION = '#{target}'.freeze")
257
- File.write(path, nu)
258
- load(path)
259
- end
260
- end
261
-
262
- # Check if a command is available
263
- #
264
- # @param [Type] x the command you are interested in
265
- # @param [Type] msg the message to display if the command is missing
266
- def require_command(x, msg = nil)
267
- return if system("command -v #{x} || exit 1")
268
- msg ||= 'Please install it first!'
269
- puts "\033[31;1mCan't find command #{x.inspect}. #{msg}\033[0m"
270
- exit 1
271
- end
272
-
273
- # Check if a required environment variable has been set
274
- #
275
- # @param [String] x the variable you are interested in
276
- # @param [String] msg the message you want to display if the variable is missing
277
- def require_env(x, msg = nil)
278
- exists = `env | grep "^#{x}="`
279
- return unless exists.empty?
280
- puts "\033[31;1mCan't find environment variable #{x.inspect}. #{msg}\033[0m"
281
- exit 1
282
- end
283
-
284
- # Check the requirements for running an update of this repository.
285
- def check_update_requirements
286
- require_command 'git'
287
- end
288
-
289
- # Show the current version of this gem.
290
- desc 'Show the version of this gem'
291
- task :version do
292
- inspec_version
293
- end
294
-
295
- desc 'Release a new docker image'
296
- task :release_docker do
297
- version = Inspec::VERSION
298
- cmd = "rm *.gem; gem build *gemspec && "\
299
- "mv *.gem inspec.gem && "\
300
- "docker build -t chef/inspec:#{version} . && "\
301
- "docker push chef/inspec:#{version} && "\
302
- "docker tag chef/inspec:#{version} chef/inspec:latest &&"\
303
- "docker push chef/inspec:latest"
304
- puts "--> #{cmd}"
305
- sh('sh', '-c', cmd)
306
- end
307
-
308
- desc 'Release the website [deprecated]'
309
- task :www do
310
- puts 'The Rake tasks for releasing the website are now in the www/ directory.'
311
- puts 'Run `cd www` and then `rake --tasks` for a list of the www-related tasks available.'
312
- exit(1)
313
- end
314
-
315
- namespace :www do
316
- desc 'Release the website [deprecated]'
317
- task :release do
318
- puts 'The Rake tasks for releasing the website are now in the www/ directory.'
319
- puts 'Run `cd www` and then `rake --tasks` for a list of the www-related tasks available.'
320
- exit(1)
321
- end
322
- end
1
+ #!/usr/bin/env rake
2
+ # encoding: utf-8
3
+
4
+ require 'bundler'
5
+ require 'bundler/gem_tasks'
6
+ require 'rake/testtask'
7
+ require 'passgen'
8
+ require 'train'
9
+ require_relative 'tasks/maintainers'
10
+ require_relative 'tasks/spdx'
11
+
12
+ def prompt(message)
13
+ print(message)
14
+ STDIN.gets.chomp
15
+ end
16
+
17
+ # The docs tasks rely on ruby-progressbar. If we can't load it, then don't
18
+ # load the docs tasks. This is necessary to allow this Rakefile to work
19
+ # when the "tests" gem group in the Gemfile has been excluded, such as
20
+ # during an appbundle-updater run.
21
+ begin
22
+ require 'ruby-progressbar'
23
+ require_relative 'tasks/docs'
24
+ rescue LoadError
25
+ puts 'docs tasks are unavailable because the ruby-progressbar gem is not available.'
26
+ end
27
+
28
+ # Rubocop
29
+ begin
30
+ require 'rubocop/rake_task'
31
+ RuboCop::RakeTask.new(:lint)
32
+ rescue LoadError
33
+ puts 'rubocop is not available. Install the rubocop gem to run the lint tests.'
34
+ end
35
+
36
+ # update command output for demo
37
+ desc 'Run inspec commands and save results to www/app/responses'
38
+ task :update_demo do
39
+ ruby 'www/tutorial/scripts/build_simulator_runtime.rb'
40
+ ruby 'www/tutorial/scripts/run_simulator_recording.rb'
41
+ end
42
+
43
+ # run tests
44
+ task default: [:lint, :test]
45
+
46
+ Rake::TestTask.new do |t|
47
+ t.libs << 'test'
48
+ t.pattern = 'test/unit/**/*_test.rb'
49
+ t.warning = true
50
+ t.verbose = true
51
+ t.ruby_opts = ['--dev'] if defined?(JRUBY_VERSION)
52
+ end
53
+
54
+ namespace :test do
55
+ task :isolated do
56
+ Dir.glob('test/unit/*_test.rb').all? do |file|
57
+ sh(Gem.ruby, '-w', '-Ilib:test', file)
58
+ end or fail 'Failures'
59
+ end
60
+
61
+ Rake::TestTask.new(:functional) do |t|
62
+ t.libs << 'test'
63
+ t.pattern = 'test/functional/**/*_test.rb'
64
+ t.warning = true
65
+ t.verbose = true
66
+ t.ruby_opts = ['--dev'] if defined?(JRUBY_VERSION)
67
+ end
68
+
69
+ task :resources do
70
+ tests = Dir['test/resource/*_test.rb']
71
+ return if tests.empty?
72
+ sh(Gem.ruby, 'test/docker_test.rb', *tests)
73
+ end
74
+
75
+ task :integration do
76
+ concurrency = ENV['CONCURRENCY'] || 1
77
+ os = ENV['OS'] || ''
78
+ sh("bundle exec kitchen test -c #{concurrency} #{os}")
79
+ end
80
+
81
+ task :ssh, [:target] do |_t, args|
82
+ tests_path = File.join(File.dirname(__FILE__), 'test', 'integration', 'test', 'integration', 'default')
83
+ key_files = ENV['key_files'] || File.join(ENV['HOME'], '.ssh', 'id_rsa')
84
+
85
+ sh_cmd = "bin/inspec exec #{tests_path}/"
86
+ sh_cmd += ENV['test'] ? "#{ENV['test']}_spec.rb" : '*'
87
+ sh_cmd += " --sudo" unless args[:target].split('@')[0] == 'root'
88
+ sh_cmd += " -t ssh://#{args[:target]}"
89
+ sh_cmd += " --key_files=#{key_files}"
90
+ sh_cmd += " --format=#{ENV['format']}" if ENV['format']
91
+
92
+ sh('sh', '-c', sh_cmd)
93
+ end
94
+
95
+ project_dir = File.dirname(__FILE__)
96
+ namespace :aws do
97
+ ['default', 'minimal'].each do |account|
98
+ integration_dir = File.join(project_dir, 'test', 'integration', 'aws', account)
99
+ attribute_file = File.join(integration_dir, '.attribute.yml')
100
+
101
+ task :"setup:#{account}", :tf_workspace do |t, args|
102
+ tf_workspace = args[:tf_workspace] || ENV['INSPEC_TERRAFORM_ENV']
103
+ abort("You must either call the top-level test:aws:#{account} task, or set the INSPEC_TERRAFORM_ENV variable.") unless tf_workspace
104
+ puts "----> Setup"
105
+ abort("You must set the environment variable AWS_REGION") unless ENV['AWS_REGION']
106
+ puts "----> Checking for required AWS profile..."
107
+ sh("aws configure get aws_access_key_id --profile inspec-aws-test-#{account} > /dev/null")
108
+ sh("cd #{integration_dir}/build/ && terraform init")
109
+ sh("cd #{integration_dir}/build/ && terraform workspace new #{tf_workspace}")
110
+ sh("cd #{integration_dir}/build/ && AWS_PROFILE=inspec-aws-test-#{account} terraform plan")
111
+ sh("cd #{integration_dir}/build/ && AWS_PROFILE=inspec-aws-test-#{account} terraform apply")
112
+ Rake::Task["test:aws:dump_attrs:#{account}"].execute
113
+ end
114
+
115
+ task :"dump_attrs:#{account}" do
116
+ sh("cd #{integration_dir}/build/ && AWS_PROFILE=inspec-aws-test-#{account} terraform output > #{attribute_file}")
117
+ raw_output = File.read(attribute_file)
118
+ yaml_output = raw_output.gsub(" = ", " : ")
119
+ File.open(attribute_file, "w") {|file| file.puts yaml_output}
120
+ end
121
+
122
+ task :"run:#{account}" do
123
+ puts "----> Run"
124
+ sh("bundle exec inspec exec #{integration_dir}/verify -t aws://${AWS_REGION}/inspec-aws-test-#{account} --attrs #{attribute_file}")
125
+ end
126
+
127
+ task :"cleanup:#{account}", :tf_workspace do |t, args|
128
+ tf_workspace = args[:tf_workspace] || ENV['INSPEC_TERRAFORM_ENV']
129
+ abort("You must either call the top-level test:aws:#{account} task, or set the INSPEC_TERRAFORM_ENV variable.") unless tf_workspace
130
+ puts "----> Cleanup"
131
+ sh("cd #{integration_dir}/build/ && AWS_PROFILE=inspec-aws-test-#{account} terraform destroy -force")
132
+ sh("cd #{integration_dir}/build/ && terraform workspace select default")
133
+ sh("cd #{integration_dir}/build && terraform workspace delete #{tf_workspace}")
134
+ end
135
+
136
+ task :"#{account}" do
137
+ tf_workspace = ENV['INSPEC_TERRAFORM_ENV'] || prompt("Please enter a workspace for your integration tests to run in: ")
138
+ begin
139
+ Rake::Task["test:aws:setup:#{account}"].execute({:tf_workspace => tf_workspace})
140
+ Rake::Task["test:aws:run:#{account}"].execute
141
+ rescue
142
+ abort("Integration testing has failed for the #{account} account")
143
+ ensure
144
+ Rake::Task["test:aws:cleanup:#{account}"].execute({:tf_workspace => tf_workspace})
145
+ end
146
+ end
147
+ end
148
+ end
149
+ desc "Perform AWS Integration Tests"
150
+ task aws: [:'aws:default', :'aws:minimal']
151
+
152
+ namespace :azure do
153
+ # Specify the directory for the integration tests
154
+ integration_dir = File.join(project_dir, 'test', 'integration', 'azure')
155
+ attribute_file = File.join(integration_dir, '.attribute.yml')
156
+
157
+ task :setup, :tf_workspace do |t, args|
158
+ tf_workspace = args[:tf_workspace] || ENV['INSPEC_TERRAFORM_ENV']
159
+ abort("You must either call the top-level test:azure task, or set the INSPEC_TERRAFORM_ENV variable.") unless tf_workspace
160
+ puts '----> Setup'
161
+ sh("cd #{integration_dir}/build/ && terraform init")
162
+ sh("cd #{integration_dir}/build/ && terraform workspace new #{tf_workspace}")
163
+
164
+ # Generate Azure crendentials
165
+ creds = Train.create('azure').connection.connect
166
+
167
+ # Determine the storage account name and the admin password
168
+ sa_name = (0...15).map { (65 + rand(26)).chr }.join.downcase
169
+ admin_password = Passgen::generate(length: 12, uppercase: true, lowercase: true, symbols: true, digits: true)
170
+
171
+ # Use the first 4 characters of the storage account to create a suffix
172
+ suffix = sa_name[0..3]
173
+
174
+ # Create the plan that can be applied to Azure
175
+ cmd = ""
176
+ cmd += "cd #{integration_dir}/build/ && terraform plan -out inspec-azure.plan"
177
+ cmd += " -var 'subscription_id=#{creds[:subscription_id]}' "
178
+ cmd += " -var 'client_id=#{creds[:client_id]}' "
179
+ cmd += " -var 'client_secret=#{creds[:client_secret]}' "
180
+ cmd += " -var 'tenant_id=#{creds[:tenant_id]}' "
181
+ cmd += " -var 'storage_account_name=#{sa_name}' "
182
+ cmd += " -var 'admin_password=#{admin_password}' "
183
+ cmd += " -var 'suffix=#{suffix}' "
184
+ sh(cmd)
185
+
186
+ # Apply the plan on Azure
187
+ cmd = "cd #{integration_dir}/build/ && terraform apply inspec-azure.plan"
188
+ sh(cmd)
189
+
190
+ # Dump TF outputs to InSpec attributes file
191
+ Rake::Task["test:azure:dump_attrs"].execute
192
+ end
193
+
194
+ task :"dump_attrs" do
195
+ sh("cd #{integration_dir}/build/ && terraform output > #{attribute_file}")
196
+ raw_output = File.read(attribute_file)
197
+ yaml_output = raw_output.gsub(" = ", " : ")
198
+ File.open(attribute_file, "w") {|file| file.puts yaml_output}
199
+ end
200
+
201
+ task :run do
202
+ puts '----> Run'
203
+ sh("bundle exec inspec exec #{integration_dir}/verify -t azure://1e0b427a-d58b-494e-ae4f-ee558463ebbf")
204
+ end
205
+
206
+ task :cleanup, :tf_workspace do |t, args|
207
+ tf_workspace = args[:tf_workspace] || ENV['INSPEC_TERRAFORM_ENV']
208
+ abort("You must either call the top-level test:azure task, or set the INSPEC_TERRAFORM_ENV variable.") unless tf_workspace
209
+ puts '----> Cleanup'
210
+
211
+ creds = Train.create('azure').connection.connect
212
+
213
+ cmd = ""
214
+ cmd += "cd #{integration_dir}/build/ && terraform destroy -force "
215
+ cmd += " -var 'subscription_id=#{creds[:subscription_id]}' "
216
+ cmd += " -var 'client_id=#{creds[:client_id]}' "
217
+ cmd += " -var 'client_secret=#{creds[:client_secret]}' "
218
+ cmd += " -var 'tenant_id=#{creds[:tenant_id]}' "
219
+ cmd += " -var 'storage_account_name=dummy' "
220
+ cmd += " -var 'admin_password=dummy' "
221
+ cmd += " -var 'suffix=dummy' "
222
+
223
+ sh(cmd)
224
+
225
+ sh("cd #{integration_dir}/build/ && terraform workspace select default")
226
+ sh("cd #{integration_dir}/build && terraform workspace delete #{tf_workspace}")
227
+ end
228
+ end
229
+
230
+ desc "Perform Azure Integration Tests"
231
+ task :azure do
232
+ tf_workspace = ENV['INSPEC_TERRAFORM_ENV'] || prompt("Please enter a workspace for your integration tests to run in: ")
233
+ begin
234
+ Rake::Task["test:azure:setup"].execute({:tf_workspace => tf_workspace})
235
+ Rake::Task["test:azure:run"].execute
236
+ rescue
237
+ abort("Integration testing has failed")
238
+ ensure
239
+ Rake::Task["test:azure:cleanup"].execute({:tf_workspace => tf_workspace})
240
+ end
241
+ end
242
+ end
243
+
244
+ # Print the current version of this gem or update it.
245
+ #
246
+ # @param [Type] target the new version you want to set, or nil if you only want to show
247
+ def inspec_version(target = nil)
248
+ path = 'lib/inspec/version.rb'
249
+ require_relative path.sub(/.rb$/, '')
250
+
251
+ nu_version = target.nil? ? '' : " -> #{target}"
252
+ puts "Inspec: #{Inspec::VERSION}#{nu_version}"
253
+
254
+ unless target.nil?
255
+ raw = File.read(path)
256
+ nu = raw.sub(/VERSION.*/, "VERSION = '#{target}'.freeze")
257
+ File.write(path, nu)
258
+ load(path)
259
+ end
260
+ end
261
+
262
+ # Check if a command is available
263
+ #
264
+ # @param [Type] x the command you are interested in
265
+ # @param [Type] msg the message to display if the command is missing
266
+ def require_command(x, msg = nil)
267
+ return if system("command -v #{x} || exit 1")
268
+ msg ||= 'Please install it first!'
269
+ puts "\033[31;1mCan't find command #{x.inspect}. #{msg}\033[0m"
270
+ exit 1
271
+ end
272
+
273
+ # Check if a required environment variable has been set
274
+ #
275
+ # @param [String] x the variable you are interested in
276
+ # @param [String] msg the message you want to display if the variable is missing
277
+ def require_env(x, msg = nil)
278
+ exists = `env | grep "^#{x}="`
279
+ return unless exists.empty?
280
+ puts "\033[31;1mCan't find environment variable #{x.inspect}. #{msg}\033[0m"
281
+ exit 1
282
+ end
283
+
284
+ # Check the requirements for running an update of this repository.
285
+ def check_update_requirements
286
+ require_command 'git'
287
+ end
288
+
289
+ # Show the current version of this gem.
290
+ desc 'Show the version of this gem'
291
+ task :version do
292
+ inspec_version
293
+ end
294
+
295
+ desc 'Release a new docker image'
296
+ task :release_docker do
297
+ version = Inspec::VERSION
298
+ cmd = "rm *.gem; gem build *gemspec && "\
299
+ "mv *.gem inspec.gem && "\
300
+ "docker build -t chef/inspec:#{version} . && "\
301
+ "docker push chef/inspec:#{version} && "\
302
+ "docker tag chef/inspec:#{version} chef/inspec:latest &&"\
303
+ "docker push chef/inspec:latest"
304
+ puts "--> #{cmd}"
305
+ sh('sh', '-c', cmd)
306
+ end
307
+
308
+ desc 'Release the website [deprecated]'
309
+ task :www do
310
+ puts 'The Rake tasks for releasing the website are now in the www/ directory.'
311
+ puts 'Run `cd www` and then `rake --tasks` for a list of the www-related tasks available.'
312
+ exit(1)
313
+ end
314
+
315
+ namespace :www do
316
+ desc 'Release the website [deprecated]'
317
+ task :release do
318
+ puts 'The Rake tasks for releasing the website are now in the www/ directory.'
319
+ puts 'Run `cd www` and then `rake --tasks` for a list of the www-related tasks available.'
320
+ exit(1)
321
+ end
322
+ end