inspec 1.51.25 → 2.0.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (482) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +24 -19
  4. data/Gemfile +3 -1
  5. data/LICENSE +0 -0
  6. data/MAINTAINERS.md +0 -0
  7. data/MAINTAINERS.toml +0 -0
  8. data/README.md +22 -3
  9. data/Rakefile +117 -0
  10. data/docs/.gitignore +0 -0
  11. data/docs/README.md +0 -0
  12. data/docs/dsl_inspec.md +0 -0
  13. data/docs/dsl_resource.md +0 -0
  14. data/docs/glossary.md +0 -0
  15. data/docs/habitat.md +0 -0
  16. data/docs/inspec_and_friends.md +0 -0
  17. data/docs/matchers.md +0 -0
  18. data/docs/migration.md +0 -0
  19. data/docs/platforms.md +119 -0
  20. data/docs/plugin_kitchen_inspec.md +0 -0
  21. data/docs/profiles.md +0 -0
  22. data/docs/reporters.md +0 -0
  23. data/docs/resources/aide_conf.md.erb +6 -8
  24. data/docs/resources/apache.md.erb +2 -1
  25. data/docs/resources/apache_conf.md.erb +2 -1
  26. data/docs/resources/apt.md.erb +2 -1
  27. data/docs/resources/audit_policy.md.erb +3 -2
  28. data/docs/resources/auditd.md.erb +2 -1
  29. data/docs/resources/auditd_conf.md.erb +3 -3
  30. data/docs/resources/aws_cloudtrail_trail.md.erb +140 -0
  31. data/docs/resources/aws_cloudtrail_trails.md.erb +81 -0
  32. data/docs/resources/aws_cloudwatch_alarm.md.erb +86 -0
  33. data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +151 -0
  34. data/docs/resources/aws_ec2_instance.md.erb +106 -0
  35. data/docs/resources/aws_iam_access_key.md.erb +123 -0
  36. data/docs/resources/aws_iam_access_keys.md.erb +198 -0
  37. data/docs/resources/aws_iam_group.md.erb +46 -0
  38. data/docs/resources/aws_iam_groups.md.erb +43 -0
  39. data/docs/resources/aws_iam_password_policy.md.erb +76 -0
  40. data/docs/resources/aws_iam_policies.md.erb +82 -0
  41. data/docs/resources/aws_iam_policy.md.erb +146 -0
  42. data/docs/resources/aws_iam_role.md.erb +65 -0
  43. data/docs/resources/aws_iam_root_user.md.erb +58 -0
  44. data/docs/resources/aws_iam_user.md.erb +64 -0
  45. data/docs/resources/aws_iam_users.md.erb +90 -0
  46. data/docs/resources/aws_kms_keys.md.erb +84 -0
  47. data/docs/resources/aws_route_table.md.erb +47 -0
  48. data/docs/resources/aws_s3_bucket.md.erb +134 -0
  49. data/docs/resources/aws_security_group.md.erb +152 -0
  50. data/docs/resources/aws_security_groups.md.erb +92 -0
  51. data/docs/resources/aws_sns_topic.md.erb +63 -0
  52. data/docs/resources/aws_subnet.md.erb +134 -0
  53. data/docs/resources/aws_subnets.md.erb +126 -0
  54. data/docs/resources/aws_vpc.md.erb +120 -0
  55. data/docs/resources/aws_vpcs.md.erb +48 -0
  56. data/docs/resources/azure_generic_resource.md.erb +140 -0
  57. data/docs/resources/azure_resource_group.md.erb +284 -0
  58. data/docs/resources/azure_virtual_machine.md.erb +314 -0
  59. data/docs/resources/azure_virtual_machine_data_disk.md.erb +182 -0
  60. data/docs/resources/bash.md.erb +2 -1
  61. data/docs/resources/bond.md.erb +2 -1
  62. data/docs/resources/bridge.md.erb +5 -2
  63. data/docs/resources/bsd_service.md.erb +3 -1
  64. data/docs/resources/command.md.erb +2 -1
  65. data/docs/resources/cpan.md.erb +4 -3
  66. data/docs/resources/cran.md.erb +2 -1
  67. data/docs/resources/crontab.md.erb +2 -1
  68. data/docs/resources/csv.md.erb +2 -1
  69. data/docs/resources/dh_params.md.erb +2 -1
  70. data/docs/resources/directory.md.erb +4 -2
  71. data/docs/resources/docker.md.erb +2 -1
  72. data/docs/resources/docker_container.md.erb +5 -2
  73. data/docs/resources/docker_image.md.erb +2 -1
  74. data/docs/resources/docker_service.md.erb +2 -1
  75. data/docs/resources/elasticsearch.md.erb +12 -1
  76. data/docs/resources/etc_fstab.md.erb +2 -1
  77. data/docs/resources/etc_group.md.erb +2 -1
  78. data/docs/resources/etc_hosts.md.erb +4 -1
  79. data/docs/resources/etc_hosts_allow.md.erb +2 -1
  80. data/docs/resources/etc_hosts_deny.md.erb +2 -1
  81. data/docs/resources/file.md.erb +6 -3
  82. data/docs/resources/filesystem.md.erb +2 -1
  83. data/docs/resources/firewalld.md.erb +4 -3
  84. data/docs/resources/gem.md.erb +2 -1
  85. data/docs/resources/group.md.erb +2 -1
  86. data/docs/resources/grub_conf.md.erb +2 -2
  87. data/docs/resources/host.md.erb +2 -1
  88. data/docs/resources/http.md.erb +4 -7
  89. data/docs/resources/iis_app.md.erb +3 -1
  90. data/docs/resources/iis_site.md.erb +4 -1
  91. data/docs/resources/inetd_conf.md.erb +2 -3
  92. data/docs/resources/ini.md.erb +6 -2
  93. data/docs/resources/interface.md.erb +5 -2
  94. data/docs/resources/iptables.md.erb +2 -1
  95. data/docs/resources/json.md.erb +2 -1
  96. data/docs/resources/kernel_module.md.erb +2 -1
  97. data/docs/resources/kernel_parameter.md.erb +3 -3
  98. data/docs/resources/key_rsa.md.erb +5 -3
  99. data/docs/resources/launchd_service.md.erb +2 -1
  100. data/docs/resources/limits_conf.md.erb +4 -2
  101. data/docs/resources/login_def.md.erb +2 -2
  102. data/docs/resources/mount.md.erb +2 -1
  103. data/docs/resources/mssql_session.md.erb +2 -1
  104. data/docs/resources/mysql_conf.md.erb +2 -1
  105. data/docs/resources/mysql_session.md.erb +2 -1
  106. data/docs/resources/nginx.md.erb +1 -0
  107. data/docs/resources/nginx_conf.md.erb +2 -1
  108. data/docs/resources/npm.md.erb +2 -1
  109. data/docs/resources/ntp_conf.md.erb +2 -1
  110. data/docs/resources/oneget.md.erb +2 -1
  111. data/docs/resources/oracledb_session.md.erb +2 -1
  112. data/docs/resources/os.md.erb +4 -3
  113. data/docs/resources/os_env.md.erb +2 -1
  114. data/docs/resources/package.md.erb +3 -2
  115. data/docs/resources/packages.md.erb +2 -1
  116. data/docs/resources/parse_config.md.erb +2 -1
  117. data/docs/resources/parse_config_file.md.erb +3 -2
  118. data/docs/resources/passwd.md.erb +2 -1
  119. data/docs/resources/pip.md.erb +2 -1
  120. data/docs/resources/port.md.erb +2 -1
  121. data/docs/resources/postgres_conf.md.erb +2 -1
  122. data/docs/resources/postgres_hba_conf.md.erb +2 -1
  123. data/docs/resources/postgres_ident_conf.md.erb +2 -1
  124. data/docs/resources/postgres_session.md.erb +2 -1
  125. data/docs/resources/powershell.md.erb +2 -1
  126. data/docs/resources/processes.md.erb +3 -1
  127. data/docs/resources/rabbitmq_config.md.erb +2 -1
  128. data/docs/resources/registry_key.md.erb +2 -1
  129. data/docs/resources/runit_service.md.erb +2 -1
  130. data/docs/resources/security_policy.md.erb +2 -1
  131. data/docs/resources/service.md.erb +2 -1
  132. data/docs/resources/shadow.md.erb +2 -1
  133. data/docs/resources/ssh_config.md.erb +2 -1
  134. data/docs/resources/sshd_config.md.erb +2 -1
  135. data/docs/resources/ssl.md.erb +2 -1
  136. data/docs/resources/sys_info.md.erb +2 -1
  137. data/docs/resources/systemd_service.md.erb +2 -1
  138. data/docs/resources/sysv_service.md.erb +2 -1
  139. data/docs/resources/upstart_service.md.erb +2 -1
  140. data/docs/resources/user.md.erb +3 -1
  141. data/docs/resources/users.md.erb +2 -1
  142. data/docs/resources/vbscript.md.erb +2 -1
  143. data/docs/resources/virtualization.md.erb +2 -1
  144. data/docs/resources/windows_feature.md.erb +2 -1
  145. data/docs/resources/windows_hotfix.md.erb +2 -1
  146. data/docs/resources/windows_task.md.erb +49 -43
  147. data/docs/resources/wmi.md.erb +2 -1
  148. data/docs/resources/x509_certificate.md.erb +1 -0
  149. data/docs/resources/xinetd_conf.md.erb +2 -1
  150. data/docs/resources/xml.md.erb +2 -1
  151. data/docs/resources/yaml.md.erb +2 -1
  152. data/docs/resources/yum.md.erb +2 -1
  153. data/docs/resources/zfs_dataset.md.erb +2 -1
  154. data/docs/resources/zfs_pool.md.erb +2 -1
  155. data/docs/ruby_usage.md +0 -0
  156. data/docs/shared/matcher_be.md.erb +0 -0
  157. data/docs/shared/matcher_cmp.md.erb +0 -0
  158. data/docs/shared/matcher_eq.md.erb +0 -0
  159. data/docs/shared/matcher_include.md.erb +0 -0
  160. data/docs/shared/matcher_match.md.erb +0 -0
  161. data/docs/shell.md +0 -0
  162. data/examples/README.md +0 -0
  163. data/examples/inheritance/README.md +0 -0
  164. data/examples/inheritance/controls/example.rb +0 -0
  165. data/examples/inheritance/inspec.yml +0 -0
  166. data/examples/kitchen-ansible/.kitchen.yml +0 -0
  167. data/examples/kitchen-ansible/Gemfile +0 -0
  168. data/examples/kitchen-ansible/README.md +0 -0
  169. data/examples/kitchen-ansible/files/nginx.repo +0 -0
  170. data/examples/kitchen-ansible/tasks/main.yml +0 -0
  171. data/examples/kitchen-ansible/test/integration/default/default.yml +0 -0
  172. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +0 -0
  173. data/examples/kitchen-chef/.kitchen.yml +0 -0
  174. data/examples/kitchen-chef/Berksfile +0 -0
  175. data/examples/kitchen-chef/Gemfile +0 -0
  176. data/examples/kitchen-chef/README.md +0 -0
  177. data/examples/kitchen-chef/metadata.rb +0 -0
  178. data/examples/kitchen-chef/recipes/default.rb +0 -0
  179. data/examples/kitchen-chef/recipes/nginx.rb +0 -0
  180. data/examples/kitchen-chef/test/integration/default/web_spec.rb +0 -0
  181. data/examples/kitchen-puppet/.kitchen.yml +0 -0
  182. data/examples/kitchen-puppet/Gemfile +0 -0
  183. data/examples/kitchen-puppet/Puppetfile +0 -0
  184. data/examples/kitchen-puppet/README.md +0 -0
  185. data/examples/kitchen-puppet/manifests/site.pp +0 -0
  186. data/examples/kitchen-puppet/metadata.json +0 -0
  187. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +0 -0
  188. data/examples/meta-profile/README.md +0 -0
  189. data/examples/meta-profile/controls/example.rb +0 -0
  190. data/examples/meta-profile/inspec.yml +0 -0
  191. data/examples/profile-attribute.yml +0 -0
  192. data/examples/profile-attribute/README.md +0 -0
  193. data/examples/profile-attribute/controls/example.rb +0 -0
  194. data/examples/profile-attribute/inspec.yml +0 -0
  195. data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -0
  196. data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -0
  197. data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -0
  198. data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -0
  199. data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -0
  200. data/examples/profile-aws/inspec.yml +11 -0
  201. data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -0
  202. data/examples/profile-azure/controls/azure_vm_example.rb +29 -0
  203. data/examples/profile-azure/inspec.yml +11 -0
  204. data/examples/profile-sensitive/README.md +0 -0
  205. data/examples/profile-sensitive/controls/sensitive-failures.rb +0 -0
  206. data/examples/profile-sensitive/controls/sensitive.rb +0 -0
  207. data/examples/profile-sensitive/inspec.yml +0 -0
  208. data/examples/profile/README.md +0 -0
  209. data/examples/profile/controls/example.rb +0 -0
  210. data/examples/profile/controls/gordon.rb +0 -0
  211. data/examples/profile/controls/meta.rb +0 -0
  212. data/examples/profile/inspec.yml +0 -0
  213. data/examples/profile/libraries/gordon_config.rb +0 -0
  214. data/inspec.gemspec +1 -1
  215. data/lib/bundles/README.md +0 -0
  216. data/lib/bundles/inspec-artifact.rb +0 -0
  217. data/lib/bundles/inspec-artifact/README.md +0 -0
  218. data/lib/bundles/inspec-artifact/cli.rb +0 -0
  219. data/lib/bundles/inspec-compliance.rb +0 -0
  220. data/lib/bundles/inspec-compliance/.kitchen.yml +0 -0
  221. data/lib/bundles/inspec-compliance/README.md +0 -0
  222. data/lib/bundles/inspec-compliance/api/login.rb +0 -0
  223. data/lib/bundles/inspec-compliance/bootstrap.sh +0 -0
  224. data/lib/bundles/inspec-compliance/cli.rb +12 -35
  225. data/lib/bundles/inspec-compliance/configuration.rb +0 -0
  226. data/lib/bundles/inspec-compliance/http.rb +0 -0
  227. data/lib/bundles/inspec-compliance/images/cc-token.png +0 -0
  228. data/lib/bundles/inspec-compliance/support.rb +0 -0
  229. data/lib/bundles/inspec-compliance/target.rb +0 -0
  230. data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +0 -0
  231. data/lib/bundles/inspec-habitat.rb +0 -0
  232. data/lib/bundles/inspec-habitat/cli.rb +0 -0
  233. data/lib/bundles/inspec-habitat/log.rb +0 -0
  234. data/lib/bundles/inspec-habitat/profile.rb +0 -0
  235. data/lib/bundles/inspec-init.rb +0 -0
  236. data/lib/bundles/inspec-init/README.md +0 -0
  237. data/lib/bundles/inspec-init/cli.rb +0 -0
  238. data/lib/bundles/inspec-init/templates/profile/README.md +0 -0
  239. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +1 -1
  240. data/lib/bundles/inspec-init/templates/profile/inspec.yml +0 -0
  241. data/lib/bundles/inspec-init/templates/profile/libraries/.gitkeep +0 -0
  242. data/lib/bundles/inspec-supermarket.rb +0 -0
  243. data/lib/bundles/inspec-supermarket/README.md +0 -0
  244. data/lib/bundles/inspec-supermarket/api.rb +0 -0
  245. data/lib/bundles/inspec-supermarket/cli.rb +11 -3
  246. data/lib/bundles/inspec-supermarket/target.rb +0 -0
  247. data/lib/fetchers/git.rb +0 -0
  248. data/lib/fetchers/local.rb +0 -0
  249. data/lib/fetchers/mock.rb +0 -0
  250. data/lib/fetchers/url.rb +0 -0
  251. data/lib/inspec.rb +0 -0
  252. data/lib/inspec/archive/tar.rb +0 -0
  253. data/lib/inspec/archive/zip.rb +0 -0
  254. data/lib/inspec/backend.rb +0 -0
  255. data/lib/inspec/base_cli.rb +2 -4
  256. data/lib/inspec/cached_fetcher.rb +0 -0
  257. data/lib/inspec/cli.rb +15 -11
  258. data/lib/inspec/completions/bash.sh.erb +0 -0
  259. data/lib/inspec/completions/fish.sh.erb +0 -0
  260. data/lib/inspec/completions/zsh.sh.erb +0 -0
  261. data/lib/inspec/control_eval_context.rb +0 -0
  262. data/lib/inspec/dependencies/cache.rb +0 -0
  263. data/lib/inspec/dependencies/dependency_set.rb +0 -0
  264. data/lib/inspec/dependencies/lockfile.rb +0 -0
  265. data/lib/inspec/dependencies/requirement.rb +0 -0
  266. data/lib/inspec/dependencies/resolver.rb +0 -0
  267. data/lib/inspec/describe.rb +0 -0
  268. data/lib/inspec/dsl.rb +0 -0
  269. data/lib/inspec/dsl_shared.rb +0 -0
  270. data/lib/inspec/env_printer.rb +0 -0
  271. data/lib/inspec/errors.rb +0 -0
  272. data/lib/inspec/exceptions.rb +0 -0
  273. data/lib/inspec/expect.rb +0 -0
  274. data/lib/inspec/fetcher.rb +0 -0
  275. data/lib/inspec/file_provider.rb +0 -0
  276. data/lib/inspec/formatters.rb +0 -0
  277. data/lib/inspec/formatters/base.rb +43 -1
  278. data/lib/inspec/formatters/json_rspec.rb +0 -0
  279. data/lib/inspec/formatters/show_progress.rb +0 -0
  280. data/lib/inspec/library_eval_context.rb +0 -0
  281. data/lib/inspec/log.rb +0 -0
  282. data/lib/inspec/metadata.rb +3 -9
  283. data/lib/inspec/method_source.rb +0 -0
  284. data/lib/inspec/objects.rb +0 -0
  285. data/lib/inspec/objects/attribute.rb +0 -0
  286. data/lib/inspec/objects/control.rb +0 -0
  287. data/lib/inspec/objects/describe.rb +0 -0
  288. data/lib/inspec/objects/each_loop.rb +0 -0
  289. data/lib/inspec/objects/list.rb +0 -0
  290. data/lib/inspec/objects/or_test.rb +0 -0
  291. data/lib/inspec/objects/ruby_helper.rb +0 -0
  292. data/lib/inspec/objects/tag.rb +0 -0
  293. data/lib/inspec/objects/test.rb +0 -0
  294. data/lib/inspec/objects/value.rb +0 -0
  295. data/lib/inspec/plugins.rb +0 -0
  296. data/lib/inspec/plugins/cli.rb +0 -0
  297. data/lib/inspec/plugins/fetcher.rb +0 -0
  298. data/lib/inspec/plugins/resource.rb +10 -9
  299. data/lib/inspec/plugins/secret.rb +0 -0
  300. data/lib/inspec/plugins/source_reader.rb +0 -0
  301. data/lib/inspec/polyfill.rb +0 -0
  302. data/lib/inspec/profile.rb +0 -0
  303. data/lib/inspec/profile_context.rb +0 -0
  304. data/lib/inspec/profile_vendor.rb +0 -0
  305. data/lib/inspec/reporters.rb +0 -0
  306. data/lib/inspec/reporters/base.rb +0 -0
  307. data/lib/inspec/reporters/cli.rb +12 -51
  308. data/lib/inspec/reporters/json.rb +3 -26
  309. data/lib/inspec/reporters/json_min.rb +0 -0
  310. data/lib/inspec/reporters/junit.rb +0 -0
  311. data/lib/inspec/require_loader.rb +0 -0
  312. data/lib/inspec/resource.rb +11 -1
  313. data/lib/inspec/rule.rb +0 -0
  314. data/lib/inspec/runner.rb +10 -8
  315. data/lib/inspec/runner_mock.rb +0 -0
  316. data/lib/inspec/runner_rspec.rb +18 -2
  317. data/lib/inspec/runtime_profile.rb +0 -0
  318. data/lib/inspec/schema.rb +25 -4
  319. data/lib/inspec/secrets.rb +0 -0
  320. data/lib/inspec/secrets/yaml.rb +0 -0
  321. data/lib/inspec/shell.rb +0 -0
  322. data/lib/inspec/shell_detector.rb +0 -0
  323. data/lib/inspec/source_reader.rb +0 -0
  324. data/lib/inspec/version.rb +1 -1
  325. data/lib/matchers/matchers.rb +1 -59
  326. data/lib/resource_support/aws.rb +40 -0
  327. data/lib/resource_support/aws/aws_backend_base.rb +12 -0
  328. data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -0
  329. data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -0
  330. data/lib/resource_support/aws/aws_resource_mixin.rb +66 -0
  331. data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -0
  332. data/lib/resources/aide_conf.rb +1 -1
  333. data/lib/resources/apache.rb +1 -2
  334. data/lib/resources/apache_conf.rb +2 -4
  335. data/lib/resources/apt.rb +1 -2
  336. data/lib/resources/audit_policy.rb +1 -2
  337. data/lib/resources/auditd.rb +1 -3
  338. data/lib/resources/auditd_conf.rb +1 -2
  339. data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -0
  340. data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -0
  341. data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -0
  342. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -0
  343. data/lib/resources/aws/aws_ec2_instance.rb +157 -0
  344. data/lib/resources/aws/aws_iam_access_key.rb +106 -0
  345. data/lib/resources/aws/aws_iam_access_keys.rb +144 -0
  346. data/lib/resources/aws/aws_iam_group.rb +56 -0
  347. data/lib/resources/aws/aws_iam_groups.rb +45 -0
  348. data/lib/resources/aws/aws_iam_password_policy.rb +116 -0
  349. data/lib/resources/aws/aws_iam_policies.rb +46 -0
  350. data/lib/resources/aws/aws_iam_policy.rb +119 -0
  351. data/lib/resources/aws/aws_iam_role.rb +51 -0
  352. data/lib/resources/aws/aws_iam_root_user.rb +60 -0
  353. data/lib/resources/aws/aws_iam_user.rb +111 -0
  354. data/lib/resources/aws/aws_iam_users.rb +96 -0
  355. data/lib/resources/aws/aws_kms_keys.rb +46 -0
  356. data/lib/resources/aws/aws_route_table.rb +61 -0
  357. data/lib/resources/aws/aws_s3_bucket.rb +115 -0
  358. data/lib/resources/aws/aws_security_group.rb +93 -0
  359. data/lib/resources/aws/aws_security_groups.rb +68 -0
  360. data/lib/resources/aws/aws_sns_topic.rb +53 -0
  361. data/lib/resources/aws/aws_subnet.rb +88 -0
  362. data/lib/resources/aws/aws_subnets.rb +53 -0
  363. data/lib/resources/aws/aws_vpc.rb +69 -0
  364. data/lib/resources/aws/aws_vpcs.rb +45 -0
  365. data/lib/resources/azure/azure_backend.rb +377 -0
  366. data/lib/resources/azure/azure_generic_resource.rb +59 -0
  367. data/lib/resources/azure/azure_resource_group.rb +152 -0
  368. data/lib/resources/azure/azure_virtual_machine.rb +264 -0
  369. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +136 -0
  370. data/lib/resources/bash.rb +1 -2
  371. data/lib/resources/bond.rb +1 -2
  372. data/lib/resources/bridge.rb +1 -2
  373. data/lib/resources/command.rb +2 -2
  374. data/lib/resources/cpan.rb +1 -3
  375. data/lib/resources/cran.rb +1 -3
  376. data/lib/resources/crontab.rb +1 -0
  377. data/lib/resources/csv.rb +4 -2
  378. data/lib/resources/dh_params.rb +1 -2
  379. data/lib/resources/directory.rb +2 -2
  380. data/lib/resources/docker.rb +1 -4
  381. data/lib/resources/docker_container.rb +1 -4
  382. data/lib/resources/docker_image.rb +1 -4
  383. data/lib/resources/docker_object.rb +0 -0
  384. data/lib/resources/docker_service.rb +1 -5
  385. data/lib/resources/elasticsearch.rb +1 -0
  386. data/lib/resources/etc_fstab.rb +1 -1
  387. data/lib/resources/etc_group.rb +1 -2
  388. data/lib/resources/etc_hosts.rb +1 -1
  389. data/lib/resources/etc_hosts_allow_deny.rb +2 -1
  390. data/lib/resources/file.rb +2 -2
  391. data/lib/resources/filesystem.rb +1 -1
  392. data/lib/resources/firewalld.rb +1 -1
  393. data/lib/resources/gem.rb +2 -3
  394. data/lib/resources/groups.rb +4 -2
  395. data/lib/resources/grub_conf.rb +1 -1
  396. data/lib/resources/host.rb +2 -2
  397. data/lib/resources/http.rb +20 -22
  398. data/lib/resources/iis_app.rb +1 -0
  399. data/lib/resources/iis_site.rb +1 -0
  400. data/lib/resources/inetd_conf.rb +1 -2
  401. data/lib/resources/ini.rb +2 -2
  402. data/lib/resources/interface.rb +2 -3
  403. data/lib/resources/iptables.rb +1 -2
  404. data/lib/resources/json.rb +4 -2
  405. data/lib/resources/kernel_module.rb +1 -4
  406. data/lib/resources/kernel_parameter.rb +1 -1
  407. data/lib/resources/key_rsa.rb +2 -2
  408. data/lib/resources/limits_conf.rb +1 -2
  409. data/lib/resources/login_def.rb +1 -2
  410. data/lib/resources/mount.rb +1 -3
  411. data/lib/resources/mssql_session.rb +1 -3
  412. data/lib/resources/mysql.rb +1 -2
  413. data/lib/resources/mysql_conf.rb +2 -1
  414. data/lib/resources/mysql_session.rb +2 -3
  415. data/lib/resources/nginx.rb +1 -2
  416. data/lib/resources/nginx_conf.rb +1 -2
  417. data/lib/resources/npm.rb +2 -2
  418. data/lib/resources/ntp_conf.rb +1 -2
  419. data/lib/resources/oneget.rb +1 -2
  420. data/lib/resources/oracledb_session.rb +2 -3
  421. data/lib/resources/os.rb +2 -12
  422. data/lib/resources/os_env.rb +2 -2
  423. data/lib/resources/package.rb +2 -2
  424. data/lib/resources/packages.rb +1 -2
  425. data/lib/resources/parse_config.rb +2 -2
  426. data/lib/resources/passwd.rb +1 -23
  427. data/lib/resources/pip.rb +2 -2
  428. data/lib/resources/platform.rb +19 -22
  429. data/lib/resources/port.rb +2 -2
  430. data/lib/resources/postgres.rb +1 -3
  431. data/lib/resources/postgres_conf.rb +2 -3
  432. data/lib/resources/postgres_hba_conf.rb +1 -2
  433. data/lib/resources/postgres_ident_conf.rb +1 -2
  434. data/lib/resources/postgres_session.rb +2 -3
  435. data/lib/resources/powershell.rb +1 -2
  436. data/lib/resources/processes.rb +2 -2
  437. data/lib/resources/rabbitmq_conf.rb +1 -2
  438. data/lib/resources/registry_key.rb +1 -1
  439. data/lib/resources/security_policy.rb +1 -2
  440. data/lib/resources/service.rb +8 -3
  441. data/lib/resources/shadow.rb +1 -2
  442. data/lib/resources/ssh_conf.rb +2 -2
  443. data/lib/resources/ssl.rb +2 -2
  444. data/lib/resources/sys_info.rb +2 -0
  445. data/lib/resources/toml.rb +0 -0
  446. data/lib/resources/users.rb +4 -2
  447. data/lib/resources/vbscript.rb +1 -2
  448. data/lib/resources/virtualization.rb +1 -1
  449. data/lib/resources/windows_feature.rb +1 -2
  450. data/lib/resources/windows_hotfix.rb +1 -1
  451. data/lib/resources/windows_task.rb +1 -2
  452. data/lib/resources/wmi.rb +1 -2
  453. data/lib/resources/x509_certificate.rb +2 -2
  454. data/lib/resources/xinetd.rb +1 -2
  455. data/lib/resources/xml.rb +2 -1
  456. data/lib/resources/yaml.rb +4 -2
  457. data/lib/resources/yum.rb +1 -2
  458. data/lib/resources/zfs_dataset.rb +1 -1
  459. data/lib/resources/zfs_pool.rb +1 -1
  460. data/lib/source_readers/flat.rb +0 -0
  461. data/lib/source_readers/inspec.rb +0 -0
  462. data/lib/utils/command_wrapper.rb +0 -0
  463. data/lib/utils/convert.rb +0 -0
  464. data/lib/utils/database_helpers.rb +0 -0
  465. data/lib/utils/erlang_parser.rb +0 -0
  466. data/lib/utils/filter.rb +0 -0
  467. data/lib/utils/filter_array.rb +0 -0
  468. data/lib/utils/find_files.rb +0 -0
  469. data/lib/utils/hash.rb +0 -0
  470. data/lib/utils/json_log.rb +0 -0
  471. data/lib/utils/latest_version.rb +0 -0
  472. data/lib/utils/modulator.rb +0 -0
  473. data/lib/utils/nginx_parser.rb +0 -0
  474. data/lib/utils/object_traversal.rb +0 -0
  475. data/lib/utils/parser.rb +0 -0
  476. data/lib/utils/plugin_registry.rb +0 -0
  477. data/lib/utils/simpleconfig.rb +0 -12
  478. data/lib/utils/spdx.rb +0 -0
  479. data/lib/utils/spdx.txt +0 -0
  480. metadata +81 -6
  481. data/docs/resources/auditd_rules.md.erb +0 -116
  482. data/lib/resources/auditd_rules.rb +0 -205
@@ -1,11 +1,10 @@
1
1
  # encoding: utf-8
2
2
  # copyright: 2015, Vulcano Security GmbH
3
- # author: Christoph Hartmann
4
- # author: Dominik Richter
5
3
 
6
4
  module Inspec::Resources
7
5
  class Apache < Inspec.resource(1)
8
6
  name 'apache'
7
+ supports platform: 'unix'
9
8
  desc 'Use the apache InSpec audit resource to retrieve Apache environment settings.'
10
9
  example "
11
10
  describe apache do
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
  # copyright: 2015, Vulcano Security GmbH
3
- # author: Dominik Richter
4
- # author: Christoph Hartmann
5
3
 
6
4
  require 'utils/simpleconfig'
7
5
  require 'utils/find_files'
@@ -9,8 +7,8 @@ require 'utils/find_files'
9
7
  module Inspec::Resources
10
8
  class ApacheConf < Inspec.resource(1)
11
9
  name 'apache_conf'
12
- supports os_family: 'linux'
13
- supports os_family: 'debian'
10
+ supports platform: 'linux'
11
+ supports platform: 'debian'
14
12
  desc 'Use the apache_conf InSpec audit resource to test the configuration settings for Apache. This file is typically located under /etc/apache2 on the Debian and Ubuntu platforms and under /etc/httpd on the Fedora, CentOS, Red Hat Enterprise Linux, and Arch Linux platforms. The configuration settings may vary significantly from platform to platform.'
15
13
  example "
16
14
  describe apache_conf do
@@ -1,6 +1,4 @@
1
1
  # encoding: utf-8
2
- # author: Christoph Hartmann
3
- # author: Dominik Richter
4
2
 
5
3
  # Verifies apt and ppa repositories
6
4
  #
@@ -31,6 +29,7 @@ require 'uri'
31
29
  module Inspec::Resources
32
30
  class AptRepository < Inspec.resource(1)
33
31
  name 'apt'
32
+ supports platform: 'unix'
34
33
  desc 'Use the apt InSpec audit resource to verify Apt repositories on the Debian and Ubuntu platforms, and also PPA repositories on the Ubuntu platform.'
35
34
  example "
36
35
  describe apt('nginx/stable') do
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
  # copyright: 2015, Vulcano Security GmbH
3
- # author: Christoph Hartmann
4
- # author: Dominik Richter
5
3
 
6
4
  # Advanced Auditing:
7
5
  # As soon as you start applying Advanced Audit Configuration Policy, legacy policies will be completely ignored.
@@ -26,6 +24,7 @@
26
24
  module Inspec::Resources
27
25
  class AuditPolicy < Inspec.resource(1)
28
26
  name 'audit_policy'
27
+ supports platform: 'unix'
29
28
  desc 'Use the audit_policy InSpec audit resource to test auditing policies on the Microsoft Windows platform. An auditing policy is a category of security-related events to be audited. Auditing is disabled by default and may be enabled for categories like account management, logon events, policy changes, process tracking, privilege use, system events, or object access. For each enabled auditing category property, the auditing level may be set to No Auditing, Not Specified, Success, Success and Failure, or Failure.'
30
29
  example "
31
30
  describe audit_policy do
@@ -1,7 +1,4 @@
1
1
  # encoding: utf-8
2
- # author: Christoph Hartmann
3
- # author: Dominik Richter
4
- # author: Jen Burns
5
2
 
6
3
  require 'forwardable'
7
4
  require 'utils/filter_array'
@@ -15,6 +12,7 @@ module Inspec::Resources
15
12
  attr_reader :params
16
13
 
17
14
  name 'auditd'
15
+ supports platform: 'unix'
18
16
  desc 'Use the auditd InSpec audit resource to test the rules for logging that exist on the system. The audit.rules file is typically located under /etc/audit/ and contains the list of rules that define what is captured in log files. These rules are output using the auditcl -l command.'
19
17
  example "
20
18
  describe auditd.syscall('chown').where {arch == 'b32'} do
@@ -1,13 +1,12 @@
1
1
  # encoding: utf-8
2
2
  # copyright: 2015, Vulcano Security GmbH
3
- # author: Christoph Hartmann
4
- # author: Dominik Richter
5
3
 
6
4
  require 'utils/simpleconfig'
7
5
 
8
6
  module Inspec::Resources
9
7
  class AuditDaemonConf < Inspec.resource(1)
10
8
  name 'auditd_conf'
9
+ supports platform: 'unix'
11
10
  desc "Use the auditd_conf InSpec audit resource to test the configuration settings for the audit daemon. This file is typically located under /etc/audit/auditd.conf' on UNIX and Linux platforms."
12
11
  example "
13
12
  describe auditd_conf do
@@ -0,0 +1,77 @@
1
+ class AwsCloudTrailTrail < Inspec.resource(1)
2
+ name 'aws_cloudtrail_trail'
3
+ desc 'Verifies settings for an individual AWS CloudTrail Trail'
4
+ example "
5
+ describe aws_cloudtrail_trail('trail-name') do
6
+ it { should exist }
7
+ end
8
+ "
9
+
10
+ supports platform: 'aws'
11
+
12
+ include AwsSingularResourceMixin
13
+ attr_reader :cloud_watch_logs_log_group_arn, :cloud_watch_logs_role_arn, :home_region,
14
+ :kms_key_id, :s3_bucket_name, :trail_arn
15
+
16
+ def to_s
17
+ "CloudTrail #{@trail_name}"
18
+ end
19
+
20
+ def multi_region_trail?
21
+ @is_multi_region_trail
22
+ end
23
+
24
+ def log_file_validation_enabled?
25
+ @log_file_validation_enabled
26
+ end
27
+
28
+ def encrypted?
29
+ !kms_key_id.nil?
30
+ end
31
+
32
+ private
33
+
34
+ def validate_params(raw_params)
35
+ validated_params = check_resource_param_names(
36
+ raw_params: raw_params,
37
+ allowed_params: [:trail_name],
38
+ allowed_scalar_name: :trail_name,
39
+ allowed_scalar_type: String,
40
+ )
41
+
42
+ if validated_params.empty?
43
+ raise ArgumentError, "You must provide the parameter 'trail_name' to aws_cloudtrail_trail."
44
+ end
45
+
46
+ validated_params
47
+ end
48
+
49
+ def fetch_from_api
50
+ backend = BackendFactory.create(inspec_runner)
51
+
52
+ query = { trail_name_list: [@trail_name] }
53
+ resp = backend.describe_trails(query)
54
+
55
+ @trail = resp.trail_list[0].to_h
56
+ @exists = !@trail.empty?
57
+ @s3_bucket_name = @trail[:s3_bucket_name]
58
+ @is_multi_region_trail = @trail[:is_multi_region_trail]
59
+ @trail_arn = @trail[:trail_arn]
60
+ @log_file_validation_enabled = @trail[:log_file_validation_enabled]
61
+ @cloud_watch_logs_role_arn = @trail[:cloud_watch_logs_role_arn]
62
+ @cloud_watch_logs_log_group_arn = @trail[:cloud_watch_logs_log_group_arn]
63
+ @kms_key_id = @trail[:kms_key_id]
64
+ @home_region = @trail[:home_region]
65
+ end
66
+
67
+ class Backend
68
+ class AwsClientApi < AwsBackendBase
69
+ AwsCloudTrailTrail::BackendFactory.set_default_backend(self)
70
+ self.aws_client_class = Aws::CloudTrail::Client
71
+
72
+ def describe_trails(query)
73
+ aws_service_client.describe_trails(query)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,47 @@
1
+ class AwsCloudTrailTrails < Inspec.resource(1)
2
+ name 'aws_cloudtrail_trails'
3
+ desc 'Verifies settings for AWS CloudTrail Trails in bulk'
4
+ example '
5
+ describe aws_cloudtrail_trails do
6
+ it { should exist }
7
+ end
8
+ '
9
+ supports platform: 'aws'
10
+
11
+ include AwsPluralResourceMixin
12
+
13
+ def validate_params(resource_params)
14
+ unless resource_params.empty?
15
+ raise ArgumentError, 'aws_cloudtrail_trails does not accept resource parameters.'
16
+ end
17
+ resource_params
18
+ end
19
+
20
+ # Underlying FilterTable implementation.
21
+ filter = FilterTable.create
22
+ filter.add_accessor(:entries)
23
+ .add(:exists?) { |x| !x.entries.empty? }
24
+ .add(:names, field: :name)
25
+ .add(:trail_arns, field: :trail_arn)
26
+ filter.connect(self, :table)
27
+
28
+ def to_s
29
+ 'CloudTrail Trails'
30
+ end
31
+
32
+ def fetch_from_api
33
+ backend = BackendFactory.create(inspec_runner)
34
+ @table = backend.describe_trails({}).to_h[:trail_list]
35
+ end
36
+
37
+ class Backend
38
+ class AwsClientApi < AwsBackendBase
39
+ AwsCloudTrailTrails::BackendFactory.set_default_backend(self)
40
+ self.aws_client_class = Aws::CloudTrail::Client
41
+
42
+ def describe_trails(query)
43
+ aws_service_client.describe_trails(query)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,62 @@
1
+ class AwsCloudwatchAlarm < Inspec.resource(1)
2
+ name 'aws_cloudwatch_alarm'
3
+ desc <<-EOD
4
+ # Look for a specific alarm
5
+ aws_cloudwatch_alarm(
6
+ metric: 'my-metric-name',
7
+ metric_namespace: 'my-metric-namespace',
8
+ ) do
9
+ it { should exist }
10
+ end
11
+ EOD
12
+ supports platform: 'aws'
13
+
14
+ include AwsSingularResourceMixin
15
+ attr_reader :alarm_actions, :alarm_name, :metric_name, :metric_namespace
16
+
17
+ private
18
+
19
+ def validate_params(raw_params)
20
+ recognized_params = check_resource_param_names(
21
+ raw_params: raw_params,
22
+ allowed_params: [:metric_name, :metric_namespace],
23
+ )
24
+ validated_params = {}
25
+ # Currently you must specify exactly metric_name and metric_namespace
26
+ [:metric_name, :metric_namespace].each do |param|
27
+ raise ArgumentError, "Missing resource param #{param}" unless recognized_params.key?(param)
28
+ validated_params[param] = recognized_params.delete(param)
29
+ end
30
+
31
+ validated_params
32
+ end
33
+
34
+ def fetch_from_api
35
+ aws_alarms = BackendFactory.create(inspec_runner).describe_alarms_for_metric(
36
+ metric_name: @metric_name,
37
+ namespace: @metric_namespace,
38
+ )
39
+ if aws_alarms.metric_alarms.empty?
40
+ @exists = false
41
+ elsif aws_alarms.metric_alarms.count > 1
42
+ alarms = aws_alarms.metric_alarms.map(&:alarm_name)
43
+ raise 'More than one Cloudwatch Alarm was matched. Try using ' \
44
+ "more specific resource parameters. Alarms matched: #{alarms.join(', ')}"
45
+ else
46
+ @alarm_actions = aws_alarms.metric_alarms.first.alarm_actions
47
+ @alarm_name = aws_alarms.metric_alarms.first.alarm_name
48
+ @exists = true
49
+ end
50
+ end
51
+
52
+ class Backend
53
+ class AwsClientApi < AwsBackendBase
54
+ AwsCloudwatchAlarm::BackendFactory.set_default_backend(self)
55
+ self.aws_client_class = Aws::CloudWatch::Client
56
+
57
+ def describe_alarms_for_metric(query)
58
+ aws_service_client.describe_alarms_for_metric(query)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,100 @@
1
+ class AwsCloudwatchLogMetricFilter < Inspec.resource(1)
2
+ name 'aws_cloudwatch_log_metric_filter'
3
+ desc 'Verifies individual Cloudwatch Log Metric Filters'
4
+ example <<-EOX
5
+ # Look for a LMF by its filter name and log group name. This combination
6
+ # will always either find at most one LMF - no duplicates.
7
+ describe aws_cloudwatch_log_metric_filter(
8
+ filter_name: 'my-filter',
9
+ log_group_name: 'my-log-group'
10
+ ) do
11
+ it { should exist }
12
+ end
13
+
14
+ # Search for an LMF by pattern and log group.
15
+ # This could result in an error if the results are not unique.
16
+ describe aws_cloudwatch_log_metric_filter(
17
+ log_group_name: 'my-log-group',
18
+ pattern: 'my-filter'
19
+ ) do
20
+ it { should exist }
21
+ end
22
+ EOX
23
+ supports platform: 'aws'
24
+ include AwsSingularResourceMixin
25
+ attr_reader :filter_name, :log_group_name, :metric_name, :metric_namespace, :pattern
26
+
27
+ private
28
+
29
+ def validate_params(raw_params)
30
+ validated_params = check_resource_param_names(
31
+ raw_params: raw_params,
32
+ allowed_params: [:filter_name, :log_group_name, :pattern],
33
+ )
34
+ if validated_params.empty?
35
+ raise ArgumentError, 'You must provide either filter_name, log_group, or pattern to aws_cloudwatch_log_metric_filter.'
36
+ end
37
+ validated_params
38
+ end
39
+
40
+ def fetch_from_api
41
+ # get a backend
42
+ backend = BackendFactory.create(inspec_runner)
43
+
44
+ # Perform query with remote filtering
45
+ aws_search_criteria = {}
46
+ aws_search_criteria[:filter_name] = filter_name if filter_name
47
+ aws_search_criteria[:log_group_name] = log_group_name if log_group_name
48
+ begin
49
+ aws_results = backend.describe_metric_filters(aws_search_criteria)
50
+ rescue Aws::CloudWatchLogs::Errors::ResourceNotFoundException
51
+ @exists = false
52
+ return
53
+ end
54
+
55
+ # Then perform local filtering
56
+ if pattern
57
+ aws_results.select! { |lmf| lmf.filter_pattern == pattern }
58
+ end
59
+
60
+ # Check result count. We're a singular resource and can tolerate
61
+ # 0 or 1 results, not multiple.
62
+ if aws_results.count > 1
63
+ raise 'More than one result was returned, but aws_cloudwatch_log_metric_filter '\
64
+ 'can only handle a single AWS resource. Consider passing more resource '\
65
+ 'parameters to narrow down the search.'
66
+ elsif aws_results.empty?
67
+ @exists = false
68
+ else
69
+ @exists = true
70
+ # Unpack the funny-shaped object we got back from AWS into our instance vars
71
+ lmf = aws_results.first
72
+ @filter_name = lmf.filter_name
73
+ @log_group_name = lmf.log_group_name
74
+ @pattern = lmf.filter_pattern # Note inconsistent name
75
+ # AWS SDK returns an array of metric transformations
76
+ # but only allows one (mandatory) entry, let's flatten that
77
+ @metric_name = lmf.metric_transformations.first.metric_name
78
+ @metric_namespace = lmf.metric_transformations.first.metric_namespace
79
+ end
80
+ end
81
+
82
+ class Backend
83
+ # Uses the cloudwatch API to really talk to AWS
84
+ class AwsClientApi < AwsBackendBase
85
+ BackendFactory.set_default_backend(self)
86
+ self.aws_client_class = Aws::CloudWatchLogs::Client
87
+
88
+ def describe_metric_filters(criteria)
89
+ query = {}
90
+ query[:filter_name_prefix] = criteria[:filter_name] if criteria[:filter_name]
91
+ query[:log_group_name] = criteria[:log_group_name] if criteria[:log_group_name]
92
+ # 'pattern' is not available as a remote filter,
93
+ # we filter it after the fact locally
94
+ # TODO: handle pagination? Max 50/page. Maybe you want a plural resource?
95
+ aws_response = aws_service_client.describe_metric_filters(query)
96
+ aws_response.metric_filters
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,157 @@
1
+ # author: Christoph Hartmann
2
+ class AwsEc2Instance < Inspec.resource(1)
3
+ name 'aws_ec2_instance'
4
+ desc 'Verifies settings for an EC2 instance'
5
+
6
+ example <<-EOX
7
+ describe aws_ec2_instance('i-123456') do
8
+ it { should be_running }
9
+ it { should have_roles }
10
+ end
11
+
12
+ describe aws_ec2_instance(name: 'my-instance') do
13
+ it { should be_running }
14
+ it { should have_roles }
15
+ end
16
+ EOX
17
+ supports platform: 'aws'
18
+
19
+ # TODO: rewrite to avoid direct injection, match other resources, use AwsSingularResourceMixin
20
+ def initialize(opts, conn = nil)
21
+ @opts = opts
22
+ @opts.is_a?(Hash) ? @display_name = @opts[:name] : @display_name = opts
23
+ @ec2_client = conn ? conn.ec2_client : inspec_runner.backend.aws_client(Aws::EC2::Client)
24
+ @ec2_resource = conn ? conn.ec2_resource : inspec_runner.backend.aws_resource(Aws::EC2::Resource, {})
25
+ @iam_resource = conn ? conn.iam_resource : inspec_runner.backend.aws_resource(Aws::IAM::Resource, {})
26
+ end
27
+
28
+ # TODO: DRY up, see https://github.com/chef/inspec/issues/2633
29
+ # Copied from resource_support/aws/aws_resource_mixin.rb
30
+ def catch_aws_errors
31
+ yield
32
+ rescue Aws::Errors::MissingCredentialsError
33
+ # The AWS error here is unhelpful:
34
+ # "unable to sign request without credentials set"
35
+ Inspec::Log.error "It appears that you have not set your AWS credentials. You may set them using environment variables, or using the 'aws://region/aws_credentials_profile' target. See https://www.inspec.io/docs/reference/platforms for details."
36
+ fail_resource('No AWS credentials available')
37
+ rescue Aws::Errors::ServiceError => e
38
+ fail_resource e.message
39
+ end
40
+
41
+ # TODO: DRY up, see https://github.com/chef/inspec/issues/2633
42
+ # Copied from resource_support/aws/aws_singular_resource_mixin.rb
43
+ def inspec_runner
44
+ # When running under inspec-cli, we have an 'inspec' method that
45
+ # returns the runner. When running under unit tests, we don't
46
+ # have that, but we still have to call this to pass something
47
+ # (nil is OK) to the backend.
48
+ # TODO: remove with https://github.com/chef/inspec-aws/issues/216
49
+ # TODO: remove after rewrite to include AwsSingularResource
50
+ inspec if respond_to?(:inspec)
51
+ end
52
+
53
+ def id
54
+ return @instance_id if defined?(@instance_id)
55
+ catch_aws_errors do
56
+ if @opts.is_a?(Hash)
57
+ first = @ec2_resource.instances(
58
+ {
59
+ filters: [{
60
+ name: 'tag:Name',
61
+ values: [@opts[:name]],
62
+ }],
63
+ },
64
+ ).first
65
+ # catch case where the instance is not known
66
+ @instance_id = first.id unless first.nil?
67
+ else
68
+ @instance_id = @opts
69
+ end
70
+ end
71
+ end
72
+ alias instance_id id
73
+
74
+ def exists?
75
+ return false if instance.nil?
76
+ instance.exists?
77
+ end
78
+
79
+ # returns the instance state
80
+ def state
81
+ catch_aws_errors do
82
+ instance&.state&.name
83
+ end
84
+ end
85
+
86
+ # helper methods for each state
87
+ %w{
88
+ pending running shutting-down
89
+ terminated stopping stopped unknown
90
+ }.each do |state_name|
91
+ define_method state_name.tr('-', '_') + '?' do
92
+ state == state_name
93
+ end
94
+ end
95
+
96
+ # attributes that we want to expose
97
+ %w{
98
+ public_ip_address private_ip_address key_name private_dns_name
99
+ public_dns_name subnet_id architecture root_device_type
100
+ root_device_name virtualization_type client_token launch_time
101
+ instance_type image_id vpc_id
102
+ }.each do |attribute|
103
+ define_method attribute do
104
+ catch_aws_errors do
105
+ instance.send(attribute) if instance
106
+ end
107
+ end
108
+ end
109
+
110
+ # Don't document this - it's a bit hard to use. Our current doctrine
111
+ # is to use dumb things, like arrays of strings - use security_group_ids instead.
112
+ def security_groups
113
+ catch_aws_errors do
114
+ @security_groups ||= instance.security_groups.map { |sg|
115
+ { id: sg.group_id, name: sg.group_name }
116
+ }
117
+ end
118
+ end
119
+
120
+ def security_group_ids
121
+ catch_aws_errors do
122
+ @security_group_ids ||= instance.security_groups.map(&:group_id)
123
+ end
124
+ end
125
+
126
+ def tags
127
+ catch_aws_errors do
128
+ @tags ||= instance.tags.map { |tag| { key: tag.key, value: tag.value } }
129
+ end
130
+ end
131
+
132
+ def to_s
133
+ "EC2 Instance #{@display_name}"
134
+ end
135
+
136
+ def has_roles?
137
+ catch_aws_errors do
138
+ instance_profile = instance.iam_instance_profile
139
+
140
+ if instance_profile
141
+ roles = @iam_resource.instance_profile(
142
+ instance_profile.arn.gsub(%r{^.*\/}, ''),
143
+ ).roles
144
+ else
145
+ roles = nil
146
+ end
147
+
148
+ roles && !roles.empty?
149
+ end
150
+ end
151
+
152
+ private
153
+
154
+ def instance
155
+ catch_aws_errors { @instance ||= @ec2_resource.instance(id) }
156
+ end
157
+ end