inspec 2.0.16 → 2.0.17

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 (480) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +101 -101
  3. data/CHANGELOG.md +2949 -2944
  4. data/Gemfile +55 -55
  5. data/LICENSE +14 -14
  6. data/MAINTAINERS.md +31 -31
  7. data/MAINTAINERS.toml +47 -47
  8. data/README.md +438 -438
  9. data/Rakefile +284 -284
  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 +93 -93
  15. data/docs/glossary.md +99 -99
  16. data/docs/habitat.md +191 -191
  17. data/docs/inspec_and_friends.md +107 -107
  18. data/docs/matchers.md +165 -165
  19. data/docs/migration.md +293 -293
  20. data/docs/platforms.md +118 -118
  21. data/docs/plugin_kitchen_inspec.md +49 -49
  22. data/docs/profiles.md +370 -370
  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_ec2_instance.md.erb +106 -106
  36. data/docs/resources/aws_iam_access_key.md.erb +123 -123
  37. data/docs/resources/aws_iam_access_keys.md.erb +198 -198
  38. data/docs/resources/aws_iam_group.md.erb +46 -46
  39. data/docs/resources/aws_iam_groups.md.erb +43 -43
  40. data/docs/resources/aws_iam_password_policy.md.erb +76 -76
  41. data/docs/resources/aws_iam_policies.md.erb +82 -82
  42. data/docs/resources/aws_iam_policy.md.erb +146 -146
  43. data/docs/resources/aws_iam_role.md.erb +65 -65
  44. data/docs/resources/aws_iam_root_user.md.erb +58 -58
  45. data/docs/resources/aws_iam_user.md.erb +64 -64
  46. data/docs/resources/aws_iam_users.md.erb +89 -89
  47. data/docs/resources/aws_kms_keys.md.erb +84 -84
  48. data/docs/resources/aws_route_table.md.erb +47 -47
  49. data/docs/resources/aws_s3_bucket.md.erb +134 -134
  50. data/docs/resources/aws_security_group.md.erb +152 -152
  51. data/docs/resources/aws_security_groups.md.erb +92 -92
  52. data/docs/resources/aws_sns_topic.md.erb +62 -62
  53. data/docs/resources/aws_subnet.md.erb +133 -133
  54. data/docs/resources/aws_subnets.md.erb +126 -126
  55. data/docs/resources/aws_vpc.md.erb +120 -120
  56. data/docs/resources/aws_vpcs.md.erb +48 -48
  57. data/docs/resources/azure_generic_resource.md.erb +170 -139
  58. data/docs/resources/azure_resource_group.md.erb +284 -284
  59. data/docs/resources/azure_virtual_machine.md.erb +347 -314
  60. data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -182
  61. data/docs/resources/bash.md.erb +75 -75
  62. data/docs/resources/bond.md.erb +90 -90
  63. data/docs/resources/bridge.md.erb +57 -57
  64. data/docs/resources/bsd_service.md.erb +67 -67
  65. data/docs/resources/command.md.erb +138 -138
  66. data/docs/resources/cpan.md.erb +79 -79
  67. data/docs/resources/cran.md.erb +64 -64
  68. data/docs/resources/crontab.md.erb +88 -88
  69. data/docs/resources/csv.md.erb +54 -54
  70. data/docs/resources/dh_params.md.erb +217 -217
  71. data/docs/resources/directory.md.erb +30 -30
  72. data/docs/resources/docker.md.erb +164 -164
  73. data/docs/resources/docker_container.md.erb +104 -104
  74. data/docs/resources/docker_image.md.erb +94 -94
  75. data/docs/resources/docker_service.md.erb +114 -114
  76. data/docs/resources/elasticsearch.md.erb +242 -242
  77. data/docs/resources/etc_fstab.md.erb +125 -125
  78. data/docs/resources/etc_group.md.erb +75 -75
  79. data/docs/resources/etc_hosts.md.erb +78 -78
  80. data/docs/resources/etc_hosts_allow.md.erb +74 -74
  81. data/docs/resources/etc_hosts_deny.md.erb +74 -74
  82. data/docs/resources/file.md.erb +515 -515
  83. data/docs/resources/filesystem.md.erb +41 -41
  84. data/docs/resources/firewalld.md.erb +107 -107
  85. data/docs/resources/gem.md.erb +79 -79
  86. data/docs/resources/group.md.erb +61 -61
  87. data/docs/resources/grub_conf.md.erb +101 -101
  88. data/docs/resources/host.md.erb +78 -78
  89. data/docs/resources/http.md.erb +101 -101
  90. data/docs/resources/iis_app.md.erb +122 -122
  91. data/docs/resources/iis_site.md.erb +135 -135
  92. data/docs/resources/inetd_conf.md.erb +94 -94
  93. data/docs/resources/ini.md.erb +76 -76
  94. data/docs/resources/interface.md.erb +58 -58
  95. data/docs/resources/iptables.md.erb +64 -64
  96. data/docs/resources/json.md.erb +62 -62
  97. data/docs/resources/kernel_module.md.erb +107 -107
  98. data/docs/resources/kernel_parameter.md.erb +53 -53
  99. data/docs/resources/key_rsa.md.erb +85 -85
  100. data/docs/resources/launchd_service.md.erb +57 -57
  101. data/docs/resources/limits_conf.md.erb +75 -75
  102. data/docs/resources/login_def.md.erb +71 -71
  103. data/docs/resources/mount.md.erb +69 -69
  104. data/docs/resources/mssql_session.md.erb +60 -60
  105. data/docs/resources/mysql_conf.md.erb +99 -99
  106. data/docs/resources/mysql_session.md.erb +74 -74
  107. data/docs/resources/nginx.md.erb +79 -79
  108. data/docs/resources/nginx_conf.md.erb +128 -128
  109. data/docs/resources/npm.md.erb +60 -60
  110. data/docs/resources/ntp_conf.md.erb +60 -60
  111. data/docs/resources/oneget.md.erb +53 -53
  112. data/docs/resources/oracledb_session.md.erb +52 -52
  113. data/docs/resources/os.md.erb +141 -141
  114. data/docs/resources/os_env.md.erb +78 -78
  115. data/docs/resources/package.md.erb +120 -120
  116. data/docs/resources/packages.md.erb +67 -67
  117. data/docs/resources/parse_config.md.erb +103 -103
  118. data/docs/resources/parse_config_file.md.erb +138 -138
  119. data/docs/resources/passwd.md.erb +141 -141
  120. data/docs/resources/pip.md.erb +67 -67
  121. data/docs/resources/port.md.erb +137 -137
  122. data/docs/resources/postgres_conf.md.erb +79 -79
  123. data/docs/resources/postgres_hba_conf.md.erb +93 -93
  124. data/docs/resources/postgres_ident_conf.md.erb +76 -76
  125. data/docs/resources/postgres_session.md.erb +69 -69
  126. data/docs/resources/powershell.md.erb +102 -102
  127. data/docs/resources/processes.md.erb +109 -109
  128. data/docs/resources/rabbitmq_config.md.erb +41 -41
  129. data/docs/resources/registry_key.md.erb +158 -158
  130. data/docs/resources/runit_service.md.erb +57 -57
  131. data/docs/resources/security_policy.md.erb +47 -47
  132. data/docs/resources/service.md.erb +121 -121
  133. data/docs/resources/shadow.md.erb +144 -144
  134. data/docs/resources/ssh_config.md.erb +80 -80
  135. data/docs/resources/sshd_config.md.erb +83 -83
  136. data/docs/resources/ssl.md.erb +119 -119
  137. data/docs/resources/sys_info.md.erb +42 -42
  138. data/docs/resources/systemd_service.md.erb +57 -57
  139. data/docs/resources/sysv_service.md.erb +57 -57
  140. data/docs/resources/upstart_service.md.erb +57 -57
  141. data/docs/resources/user.md.erb +140 -140
  142. data/docs/resources/users.md.erb +127 -127
  143. data/docs/resources/vbscript.md.erb +55 -55
  144. data/docs/resources/virtualization.md.erb +57 -57
  145. data/docs/resources/windows_feature.md.erb +47 -47
  146. data/docs/resources/windows_hotfix.md.erb +53 -53
  147. data/docs/resources/windows_task.md.erb +95 -95
  148. data/docs/resources/wmi.md.erb +81 -81
  149. data/docs/resources/x509_certificate.md.erb +151 -151
  150. data/docs/resources/xinetd_conf.md.erb +156 -156
  151. data/docs/resources/xml.md.erb +85 -85
  152. data/docs/resources/yaml.md.erb +69 -69
  153. data/docs/resources/yum.md.erb +98 -98
  154. data/docs/resources/zfs_dataset.md.erb +53 -53
  155. data/docs/resources/zfs_pool.md.erb +47 -47
  156. data/docs/ruby_usage.md +203 -203
  157. data/docs/shared/matcher_be.md.erb +1 -1
  158. data/docs/shared/matcher_cmp.md.erb +43 -43
  159. data/docs/shared/matcher_eq.md.erb +3 -3
  160. data/docs/shared/matcher_include.md.erb +1 -1
  161. data/docs/shared/matcher_match.md.erb +1 -1
  162. data/docs/shell.md +172 -172
  163. data/examples/README.md +8 -8
  164. data/examples/inheritance/README.md +65 -65
  165. data/examples/inheritance/controls/example.rb +14 -14
  166. data/examples/inheritance/inspec.yml +15 -15
  167. data/examples/kitchen-ansible/.kitchen.yml +25 -25
  168. data/examples/kitchen-ansible/Gemfile +19 -19
  169. data/examples/kitchen-ansible/README.md +53 -53
  170. data/examples/kitchen-ansible/files/nginx.repo +6 -6
  171. data/examples/kitchen-ansible/tasks/main.yml +16 -16
  172. data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
  173. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
  174. data/examples/kitchen-chef/.kitchen.yml +20 -20
  175. data/examples/kitchen-chef/Berksfile +3 -3
  176. data/examples/kitchen-chef/Gemfile +19 -19
  177. data/examples/kitchen-chef/README.md +27 -27
  178. data/examples/kitchen-chef/metadata.rb +7 -7
  179. data/examples/kitchen-chef/recipes/default.rb +6 -6
  180. data/examples/kitchen-chef/recipes/nginx.rb +30 -30
  181. data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
  182. data/examples/kitchen-puppet/.kitchen.yml +22 -22
  183. data/examples/kitchen-puppet/Gemfile +20 -20
  184. data/examples/kitchen-puppet/Puppetfile +25 -25
  185. data/examples/kitchen-puppet/README.md +53 -53
  186. data/examples/kitchen-puppet/manifests/site.pp +33 -33
  187. data/examples/kitchen-puppet/metadata.json +11 -11
  188. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
  189. data/examples/meta-profile/README.md +37 -37
  190. data/examples/meta-profile/controls/example.rb +13 -13
  191. data/examples/meta-profile/inspec.yml +13 -13
  192. data/examples/profile-attribute.yml +2 -2
  193. data/examples/profile-attribute/README.md +14 -14
  194. data/examples/profile-attribute/controls/example.rb +11 -11
  195. data/examples/profile-attribute/inspec.yml +8 -8
  196. data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
  197. data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
  198. data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
  199. data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
  200. data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
  201. data/examples/profile-aws/inspec.yml +11 -11
  202. data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
  203. data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
  204. data/examples/profile-azure/inspec.yml +11 -11
  205. data/examples/profile-sensitive/README.md +29 -29
  206. data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
  207. data/examples/profile-sensitive/controls/sensitive.rb +9 -9
  208. data/examples/profile-sensitive/inspec.yml +8 -8
  209. data/examples/profile/README.md +48 -48
  210. data/examples/profile/controls/example.rb +23 -23
  211. data/examples/profile/controls/gordon.rb +36 -36
  212. data/examples/profile/controls/meta.rb +34 -34
  213. data/examples/profile/inspec.yml +10 -10
  214. data/examples/profile/libraries/gordon_config.rb +53 -53
  215. data/inspec.gemspec +47 -47
  216. data/lib/bundles/README.md +3 -3
  217. data/lib/bundles/inspec-artifact.rb +7 -7
  218. data/lib/bundles/inspec-artifact/README.md +1 -1
  219. data/lib/bundles/inspec-artifact/cli.rb +277 -277
  220. data/lib/bundles/inspec-compliance.rb +16 -16
  221. data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
  222. data/lib/bundles/inspec-compliance/README.md +185 -185
  223. data/lib/bundles/inspec-compliance/api.rb +316 -316
  224. data/lib/bundles/inspec-compliance/api/login.rb +152 -152
  225. data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
  226. data/lib/bundles/inspec-compliance/cli.rb +254 -254
  227. data/lib/bundles/inspec-compliance/configuration.rb +103 -103
  228. data/lib/bundles/inspec-compliance/http.rb +86 -86
  229. data/lib/bundles/inspec-compliance/support.rb +36 -36
  230. data/lib/bundles/inspec-compliance/target.rb +98 -98
  231. data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
  232. data/lib/bundles/inspec-habitat.rb +12 -12
  233. data/lib/bundles/inspec-habitat/cli.rb +36 -36
  234. data/lib/bundles/inspec-habitat/log.rb +10 -10
  235. data/lib/bundles/inspec-habitat/profile.rb +390 -390
  236. data/lib/bundles/inspec-init.rb +8 -8
  237. data/lib/bundles/inspec-init/README.md +31 -31
  238. data/lib/bundles/inspec-init/cli.rb +97 -97
  239. data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
  240. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
  241. data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
  242. data/lib/bundles/inspec-supermarket.rb +13 -13
  243. data/lib/bundles/inspec-supermarket/README.md +45 -45
  244. data/lib/bundles/inspec-supermarket/api.rb +84 -84
  245. data/lib/bundles/inspec-supermarket/cli.rb +73 -73
  246. data/lib/bundles/inspec-supermarket/target.rb +34 -34
  247. data/lib/fetchers/git.rb +163 -163
  248. data/lib/fetchers/local.rb +74 -74
  249. data/lib/fetchers/mock.rb +35 -35
  250. data/lib/fetchers/url.rb +204 -204
  251. data/lib/inspec.rb +24 -24
  252. data/lib/inspec/archive/tar.rb +29 -29
  253. data/lib/inspec/archive/zip.rb +19 -19
  254. data/lib/inspec/backend.rb +92 -92
  255. data/lib/inspec/base_cli.rb +350 -333
  256. data/lib/inspec/cached_fetcher.rb +66 -66
  257. data/lib/inspec/cli.rb +292 -302
  258. data/lib/inspec/completions/bash.sh.erb +45 -45
  259. data/lib/inspec/completions/fish.sh.erb +34 -34
  260. data/lib/inspec/completions/zsh.sh.erb +61 -61
  261. data/lib/inspec/control_eval_context.rb +179 -179
  262. data/lib/inspec/dependencies/cache.rb +72 -72
  263. data/lib/inspec/dependencies/dependency_set.rb +92 -92
  264. data/lib/inspec/dependencies/lockfile.rb +115 -115
  265. data/lib/inspec/dependencies/requirement.rb +123 -123
  266. data/lib/inspec/dependencies/resolver.rb +86 -86
  267. data/lib/inspec/describe.rb +27 -27
  268. data/lib/inspec/dsl.rb +66 -66
  269. data/lib/inspec/dsl_shared.rb +33 -33
  270. data/lib/inspec/env_printer.rb +157 -157
  271. data/lib/inspec/errors.rb +13 -13
  272. data/lib/inspec/exceptions.rb +12 -12
  273. data/lib/inspec/expect.rb +45 -45
  274. data/lib/inspec/fetcher.rb +45 -45
  275. data/lib/inspec/file_provider.rb +275 -275
  276. data/lib/inspec/formatters.rb +3 -3
  277. data/lib/inspec/formatters/base.rb +250 -250
  278. data/lib/inspec/formatters/json_rspec.rb +20 -20
  279. data/lib/inspec/formatters/show_progress.rb +12 -12
  280. data/lib/inspec/library_eval_context.rb +58 -58
  281. data/lib/inspec/log.rb +11 -11
  282. data/lib/inspec/metadata.rb +247 -247
  283. data/lib/inspec/method_source.rb +24 -24
  284. data/lib/inspec/objects.rb +14 -14
  285. data/lib/inspec/objects/attribute.rb +65 -65
  286. data/lib/inspec/objects/control.rb +61 -61
  287. data/lib/inspec/objects/describe.rb +92 -92
  288. data/lib/inspec/objects/each_loop.rb +36 -36
  289. data/lib/inspec/objects/list.rb +15 -15
  290. data/lib/inspec/objects/or_test.rb +40 -40
  291. data/lib/inspec/objects/ruby_helper.rb +15 -15
  292. data/lib/inspec/objects/tag.rb +27 -27
  293. data/lib/inspec/objects/test.rb +87 -87
  294. data/lib/inspec/objects/value.rb +27 -27
  295. data/lib/inspec/plugins.rb +60 -60
  296. data/lib/inspec/plugins/cli.rb +24 -24
  297. data/lib/inspec/plugins/fetcher.rb +86 -86
  298. data/lib/inspec/plugins/resource.rb +133 -133
  299. data/lib/inspec/plugins/secret.rb +15 -15
  300. data/lib/inspec/plugins/source_reader.rb +40 -40
  301. data/lib/inspec/polyfill.rb +12 -12
  302. data/lib/inspec/profile.rb +510 -510
  303. data/lib/inspec/profile_context.rb +207 -207
  304. data/lib/inspec/profile_vendor.rb +66 -66
  305. data/lib/inspec/reporters.rb +50 -50
  306. data/lib/inspec/reporters/base.rb +24 -24
  307. data/lib/inspec/reporters/cli.rb +356 -356
  308. data/lib/inspec/reporters/json.rb +116 -116
  309. data/lib/inspec/reporters/json_min.rb +48 -48
  310. data/lib/inspec/reporters/junit.rb +77 -77
  311. data/lib/inspec/require_loader.rb +33 -33
  312. data/lib/inspec/resource.rb +186 -186
  313. data/lib/inspec/rule.rb +266 -266
  314. data/lib/inspec/runner.rb +344 -344
  315. data/lib/inspec/runner_mock.rb +41 -41
  316. data/lib/inspec/runner_rspec.rb +174 -174
  317. data/lib/inspec/runtime_profile.rb +26 -26
  318. data/lib/inspec/schema.rb +213 -213
  319. data/lib/inspec/secrets.rb +19 -19
  320. data/lib/inspec/secrets/yaml.rb +30 -30
  321. data/lib/inspec/shell.rb +220 -223
  322. data/lib/inspec/shell_detector.rb +90 -90
  323. data/lib/inspec/source_reader.rb +29 -29
  324. data/lib/inspec/version.rb +8 -8
  325. data/lib/matchers/matchers.rb +339 -339
  326. data/lib/resource_support/aws.rb +40 -40
  327. data/lib/resource_support/aws/aws_backend_base.rb +12 -12
  328. data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
  329. data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
  330. data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
  331. data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
  332. data/lib/resources/aide_conf.rb +160 -160
  333. data/lib/resources/apache.rb +48 -48
  334. data/lib/resources/apache_conf.rb +156 -156
  335. data/lib/resources/apt.rb +149 -149
  336. data/lib/resources/audit_policy.rb +63 -63
  337. data/lib/resources/auditd.rb +231 -231
  338. data/lib/resources/auditd_conf.rb +55 -55
  339. data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -77
  340. data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
  341. data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
  342. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
  343. data/lib/resources/aws/aws_ec2_instance.rb +157 -157
  344. data/lib/resources/aws/aws_iam_access_key.rb +106 -106
  345. data/lib/resources/aws/aws_iam_access_keys.rb +144 -144
  346. data/lib/resources/aws/aws_iam_group.rb +56 -56
  347. data/lib/resources/aws/aws_iam_groups.rb +45 -45
  348. data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
  349. data/lib/resources/aws/aws_iam_policies.rb +46 -46
  350. data/lib/resources/aws/aws_iam_policy.rb +119 -119
  351. data/lib/resources/aws/aws_iam_role.rb +51 -51
  352. data/lib/resources/aws/aws_iam_root_user.rb +60 -60
  353. data/lib/resources/aws/aws_iam_user.rb +111 -111
  354. data/lib/resources/aws/aws_iam_users.rb +96 -96
  355. data/lib/resources/aws/aws_kms_keys.rb +46 -46
  356. data/lib/resources/aws/aws_route_table.rb +61 -61
  357. data/lib/resources/aws/aws_s3_bucket.rb +115 -115
  358. data/lib/resources/aws/aws_security_group.rb +93 -93
  359. data/lib/resources/aws/aws_security_groups.rb +68 -68
  360. data/lib/resources/aws/aws_sns_topic.rb +53 -53
  361. data/lib/resources/aws/aws_subnet.rb +88 -88
  362. data/lib/resources/aws/aws_subnets.rb +53 -53
  363. data/lib/resources/aws/aws_vpc.rb +69 -69
  364. data/lib/resources/aws/aws_vpcs.rb +45 -45
  365. data/lib/resources/azure/azure_backend.rb +377 -377
  366. data/lib/resources/azure/azure_generic_resource.rb +59 -59
  367. data/lib/resources/azure/azure_resource_group.rb +152 -152
  368. data/lib/resources/azure/azure_virtual_machine.rb +264 -264
  369. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +136 -136
  370. data/lib/resources/bash.rb +35 -35
  371. data/lib/resources/bond.rb +68 -68
  372. data/lib/resources/bridge.rb +122 -122
  373. data/lib/resources/command.rb +69 -69
  374. data/lib/resources/cpan.rb +58 -58
  375. data/lib/resources/cran.rb +64 -64
  376. data/lib/resources/crontab.rb +170 -170
  377. data/lib/resources/csv.rb +60 -60
  378. data/lib/resources/dh_params.rb +82 -82
  379. data/lib/resources/directory.rb +25 -25
  380. data/lib/resources/docker.rb +236 -236
  381. data/lib/resources/docker_container.rb +89 -89
  382. data/lib/resources/docker_image.rb +83 -83
  383. data/lib/resources/docker_object.rb +57 -57
  384. data/lib/resources/docker_service.rb +90 -90
  385. data/lib/resources/elasticsearch.rb +169 -169
  386. data/lib/resources/etc_fstab.rb +102 -102
  387. data/lib/resources/etc_group.rb +156 -156
  388. data/lib/resources/etc_hosts.rb +81 -81
  389. data/lib/resources/etc_hosts_allow_deny.rb +123 -123
  390. data/lib/resources/file.rb +298 -298
  391. data/lib/resources/filesystem.rb +31 -31
  392. data/lib/resources/firewalld.rb +144 -144
  393. data/lib/resources/gem.rb +70 -70
  394. data/lib/resources/groups.rb +215 -215
  395. data/lib/resources/grub_conf.rb +237 -237
  396. data/lib/resources/host.rb +300 -300
  397. data/lib/resources/http.rb +250 -250
  398. data/lib/resources/iis_app.rb +104 -104
  399. data/lib/resources/iis_site.rb +148 -148
  400. data/lib/resources/inetd_conf.rb +62 -62
  401. data/lib/resources/ini.rb +29 -29
  402. data/lib/resources/interface.rb +129 -129
  403. data/lib/resources/iptables.rb +69 -69
  404. data/lib/resources/json.rb +117 -117
  405. data/lib/resources/kernel_module.rb +107 -107
  406. data/lib/resources/kernel_parameter.rb +58 -58
  407. data/lib/resources/key_rsa.rb +67 -67
  408. data/lib/resources/limits_conf.rb +55 -55
  409. data/lib/resources/login_def.rb +66 -66
  410. data/lib/resources/mount.rb +88 -88
  411. data/lib/resources/mssql_session.rb +101 -101
  412. data/lib/resources/mysql.rb +81 -81
  413. data/lib/resources/mysql_conf.rb +134 -134
  414. data/lib/resources/mysql_session.rb +71 -71
  415. data/lib/resources/nginx.rb +96 -96
  416. data/lib/resources/nginx_conf.rb +227 -227
  417. data/lib/resources/npm.rb +48 -48
  418. data/lib/resources/ntp_conf.rb +58 -58
  419. data/lib/resources/oneget.rb +71 -71
  420. data/lib/resources/oracledb_session.rb +139 -139
  421. data/lib/resources/os.rb +36 -36
  422. data/lib/resources/os_env.rb +76 -76
  423. data/lib/resources/package.rb +363 -363
  424. data/lib/resources/packages.rb +111 -111
  425. data/lib/resources/parse_config.rb +116 -116
  426. data/lib/resources/passwd.rb +74 -74
  427. data/lib/resources/pip.rb +89 -89
  428. data/lib/resources/platform.rb +109 -109
  429. data/lib/resources/port.rb +771 -771
  430. data/lib/resources/postgres.rb +130 -130
  431. data/lib/resources/postgres_conf.rb +121 -121
  432. data/lib/resources/postgres_hba_conf.rb +100 -100
  433. data/lib/resources/postgres_ident_conf.rb +78 -78
  434. data/lib/resources/postgres_session.rb +71 -71
  435. data/lib/resources/powershell.rb +57 -57
  436. data/lib/resources/processes.rb +204 -204
  437. data/lib/resources/rabbitmq_conf.rb +52 -52
  438. data/lib/resources/registry_key.rb +296 -296
  439. data/lib/resources/security_policy.rb +180 -180
  440. data/lib/resources/service.rb +789 -789
  441. data/lib/resources/shadow.rb +140 -140
  442. data/lib/resources/ssh_conf.rb +102 -102
  443. data/lib/resources/ssl.rb +99 -99
  444. data/lib/resources/sys_info.rb +28 -28
  445. data/lib/resources/toml.rb +32 -32
  446. data/lib/resources/users.rb +654 -654
  447. data/lib/resources/vbscript.rb +69 -69
  448. data/lib/resources/virtualization.rb +251 -251
  449. data/lib/resources/windows_feature.rb +84 -84
  450. data/lib/resources/windows_hotfix.rb +35 -35
  451. data/lib/resources/windows_task.rb +105 -105
  452. data/lib/resources/wmi.rb +113 -113
  453. data/lib/resources/x509_certificate.rb +143 -143
  454. data/lib/resources/xinetd.rb +111 -111
  455. data/lib/resources/xml.rb +46 -46
  456. data/lib/resources/yaml.rb +47 -47
  457. data/lib/resources/yum.rb +180 -180
  458. data/lib/resources/zfs_dataset.rb +60 -60
  459. data/lib/resources/zfs_pool.rb +49 -49
  460. data/lib/source_readers/flat.rb +39 -39
  461. data/lib/source_readers/inspec.rb +75 -75
  462. data/lib/utils/command_wrapper.rb +27 -27
  463. data/lib/utils/convert.rb +12 -12
  464. data/lib/utils/database_helpers.rb +77 -77
  465. data/lib/utils/erlang_parser.rb +192 -192
  466. data/lib/utils/filter.rb +272 -272
  467. data/lib/utils/filter_array.rb +27 -27
  468. data/lib/utils/find_files.rb +44 -44
  469. data/lib/utils/hash.rb +41 -41
  470. data/lib/utils/json_log.rb +18 -18
  471. data/lib/utils/latest_version.rb +22 -22
  472. data/lib/utils/modulator.rb +12 -12
  473. data/lib/utils/nginx_parser.rb +85 -85
  474. data/lib/utils/object_traversal.rb +49 -49
  475. data/lib/utils/parser.rb +274 -274
  476. data/lib/utils/plugin_registry.rb +93 -93
  477. data/lib/utils/simpleconfig.rb +120 -120
  478. data/lib/utils/spdx.rb +13 -13
  479. data/lib/utils/spdx.txt +343 -343
  480. metadata +1 -1
@@ -1,101 +1,101 @@
1
- # encoding: utf-8
2
-
3
- require 'hashie/mash'
4
- require 'utils/database_helpers'
5
-
6
- module Inspec::Resources
7
- # STABILITY: Experimental
8
- # This resource needs further testing and refinement
9
- #
10
- # This requires the `sqlcmd` tool available on platform
11
- # @see https://docs.microsoft.com/en-us/sql/relational-databases/scripting/sqlcmd-use-the-utility
12
- # @see https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-connect-and-query-sqlcmd
13
- class MssqlSession < Inspec.resource(1)
14
- name 'mssql_session'
15
- supports platform: 'windows'
16
- desc 'Use the mssql_session InSpec audit resource to test SQL commands run against a MS Sql Server database.'
17
- example "
18
- # Using SQL authentication
19
- sql = mssql_session(user: 'myuser', pass: 'mypassword')
20
- describe sql.query('SELECT * FROM table').row(0).column('columnname') do
21
- its('value') { should cmp == 1 }
22
- end
23
-
24
- # Passing no credentials to mssql_session forces it to use Windows authentication
25
- sql_windows_auth = mssql_session
26
- describe sql_windows_auth.query(\"SELECT SERVERPROPERTY('IsIntegratedSecurityOnly') as \\\"login_mode\\\";\").row(0).column('login_mode') do
27
- its('value') { should_not be_empty }
28
- its('value') { should cmp == 1 }
29
- end
30
- "
31
-
32
- attr_reader :user, :password, :host, :port, :instance
33
- def initialize(opts = {})
34
- @user = opts[:user]
35
- @password = opts[:password] || opts[:pass]
36
- if opts[:pass]
37
- warn '[DEPRECATED] use `password` option to supply password instead of `pass`'
38
- end
39
- @host = opts[:host] || 'localhost'
40
- @port = opts[:port] || '1433'
41
- @instance = opts[:instance]
42
-
43
- # check if sqlcmd is available
44
- raise Inspec::Exceptions::ResourceSkipped, 'sqlcmd is missing' unless inspec.command('sqlcmd').exist?
45
- # check that database is reachable
46
- raise Inspec::Exceptions::ResourceSkipped, "Can't connect to the MS SQL Server." unless test_connection
47
- end
48
-
49
- def query(q)
50
- escaped_query = q.gsub(/\\/, '\\\\').gsub(/"/, '\\"').gsub(/\$/, '\\$')
51
- # surpress 'x rows affected' in SQLCMD with 'set nocount on;'
52
- cmd_string = "sqlcmd -Q \"set nocount on; #{escaped_query}\" -W -w 1024 -s ','"
53
- cmd_string += " -U '#{@user}' -P '#{@password}'" unless @user.nil? || @password.nil?
54
- if @instance.nil?
55
- cmd_string += " -S '#{@host},#{@port}'"
56
- else
57
- cmd_string += " -S '#{@host},#{@port}\\#{@instance}'"
58
- end
59
- cmd = inspec.command(cmd_string)
60
- out = cmd.stdout + "\n" + cmd.stderr
61
- if cmd.exit_status != 0 || out =~ /Sqlcmd: Error/
62
- # TODO: we need to throw an exception here
63
- # change once https://github.com/chef/inspec/issues/1205 is in
64
- warn "Could not execute the sql query #{out}"
65
- DatabaseHelper::SQLQueryResult.new(cmd, Hashie::Mash.new({}))
66
- else
67
- DatabaseHelper::SQLQueryResult.new(cmd, parse_csv_result(cmd))
68
- end
69
- end
70
-
71
- def to_s
72
- 'MSSQL session'
73
- end
74
-
75
- private
76
-
77
- def test_connection
78
- !query('select getdate()').empty?
79
- end
80
-
81
- def parse_csv_result(cmd)
82
- require 'csv'
83
- table = CSV.parse(cmd.stdout, { headers: true })
84
-
85
- # remove first row, since it will be a seperator line
86
- table.delete(0)
87
-
88
- # convert to hash
89
- headers = table.headers
90
-
91
- results = table.map { |row|
92
- res = {}
93
- headers.each { |header|
94
- res[header.downcase] = row[header]
95
- }
96
- Hashie::Mash.new(res)
97
- }
98
- results
99
- end
100
- end
101
- end
1
+ # encoding: utf-8
2
+
3
+ require 'hashie/mash'
4
+ require 'utils/database_helpers'
5
+
6
+ module Inspec::Resources
7
+ # STABILITY: Experimental
8
+ # This resource needs further testing and refinement
9
+ #
10
+ # This requires the `sqlcmd` tool available on platform
11
+ # @see https://docs.microsoft.com/en-us/sql/relational-databases/scripting/sqlcmd-use-the-utility
12
+ # @see https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-connect-and-query-sqlcmd
13
+ class MssqlSession < Inspec.resource(1)
14
+ name 'mssql_session'
15
+ supports platform: 'windows'
16
+ desc 'Use the mssql_session InSpec audit resource to test SQL commands run against a MS Sql Server database.'
17
+ example "
18
+ # Using SQL authentication
19
+ sql = mssql_session(user: 'myuser', pass: 'mypassword')
20
+ describe sql.query('SELECT * FROM table').row(0).column('columnname') do
21
+ its('value') { should cmp == 1 }
22
+ end
23
+
24
+ # Passing no credentials to mssql_session forces it to use Windows authentication
25
+ sql_windows_auth = mssql_session
26
+ describe sql_windows_auth.query(\"SELECT SERVERPROPERTY('IsIntegratedSecurityOnly') as \\\"login_mode\\\";\").row(0).column('login_mode') do
27
+ its('value') { should_not be_empty }
28
+ its('value') { should cmp == 1 }
29
+ end
30
+ "
31
+
32
+ attr_reader :user, :password, :host, :port, :instance
33
+ def initialize(opts = {})
34
+ @user = opts[:user]
35
+ @password = opts[:password] || opts[:pass]
36
+ if opts[:pass]
37
+ warn '[DEPRECATED] use `password` option to supply password instead of `pass`'
38
+ end
39
+ @host = opts[:host] || 'localhost'
40
+ @port = opts[:port] || '1433'
41
+ @instance = opts[:instance]
42
+
43
+ # check if sqlcmd is available
44
+ raise Inspec::Exceptions::ResourceSkipped, 'sqlcmd is missing' unless inspec.command('sqlcmd').exist?
45
+ # check that database is reachable
46
+ raise Inspec::Exceptions::ResourceSkipped, "Can't connect to the MS SQL Server." unless test_connection
47
+ end
48
+
49
+ def query(q)
50
+ escaped_query = q.gsub(/\\/, '\\\\').gsub(/"/, '\\"').gsub(/\$/, '\\$')
51
+ # surpress 'x rows affected' in SQLCMD with 'set nocount on;'
52
+ cmd_string = "sqlcmd -Q \"set nocount on; #{escaped_query}\" -W -w 1024 -s ','"
53
+ cmd_string += " -U '#{@user}' -P '#{@password}'" unless @user.nil? || @password.nil?
54
+ if @instance.nil?
55
+ cmd_string += " -S '#{@host},#{@port}'"
56
+ else
57
+ cmd_string += " -S '#{@host},#{@port}\\#{@instance}'"
58
+ end
59
+ cmd = inspec.command(cmd_string)
60
+ out = cmd.stdout + "\n" + cmd.stderr
61
+ if cmd.exit_status != 0 || out =~ /Sqlcmd: Error/
62
+ # TODO: we need to throw an exception here
63
+ # change once https://github.com/chef/inspec/issues/1205 is in
64
+ warn "Could not execute the sql query #{out}"
65
+ DatabaseHelper::SQLQueryResult.new(cmd, Hashie::Mash.new({}))
66
+ else
67
+ DatabaseHelper::SQLQueryResult.new(cmd, parse_csv_result(cmd))
68
+ end
69
+ end
70
+
71
+ def to_s
72
+ 'MSSQL session'
73
+ end
74
+
75
+ private
76
+
77
+ def test_connection
78
+ !query('select getdate()').empty?
79
+ end
80
+
81
+ def parse_csv_result(cmd)
82
+ require 'csv'
83
+ table = CSV.parse(cmd.stdout, { headers: true })
84
+
85
+ # remove first row, since it will be a seperator line
86
+ table.delete(0)
87
+
88
+ # convert to hash
89
+ headers = table.headers
90
+
91
+ results = table.map { |row|
92
+ res = {}
93
+ headers.each { |header|
94
+ res[header.downcase] = row[header]
95
+ }
96
+ Hashie::Mash.new(res)
97
+ }
98
+ results
99
+ end
100
+ end
101
+ end
@@ -1,81 +1,81 @@
1
- # encoding: utf-8
2
- # copyright: 2015, Vulcano Security GmbH
3
-
4
- module Inspec::Resources
5
- class Mysql < Inspec.resource(1)
6
- name 'mysql'
7
- supports platform: 'unix'
8
-
9
- attr_reader :package, :service, :conf_dir, :conf_path, :data_dir, :log_dir, :log_path, :log_group, :log_dir_group
10
- def initialize
11
- # set OS-dependent filenames and paths
12
- case inspec.os[:family]
13
- when 'debian'
14
- init_ubuntu
15
- when 'redhat', 'fedora'
16
- init_redhat
17
- when 'arch'
18
- init_arch
19
- else
20
- # TODO: could not detect
21
- init_default
22
- end
23
- end
24
-
25
- def init_ubuntu
26
- @package = 'mysql-server'
27
- @service = 'mysql'
28
- @conf_path = '/etc/mysql/my.cnf'
29
- @conf_dir = '/etc/mysql/'
30
- @data_dir = '/var/lib/mysql/'
31
- @log_dir = '/var/log/'
32
- @log_path = '/var/log/mysql.log'
33
- @log_group = 'adm'
34
- case inspec.os[:release]
35
- when '14.04'
36
- @log_dir_group = 'syslog'
37
- else
38
- @log_dir_group = 'root'
39
- end
40
- end
41
-
42
- def init_redhat
43
- @package = 'mysql-server'
44
- @service = 'mysqld'
45
- @conf_path = '/etc/my.cnf'
46
- @conf_dir = '/etc/'
47
- @data_dir = '/var/lib/mysql/'
48
- @log_dir = '/var/log/'
49
- @log_path = '/var/log/mysqld.log'
50
- @log_group = 'mysql'
51
- @log_dir_group = 'root'
52
- end
53
-
54
- def init_arch
55
- @package = 'mariadb'
56
- @service = 'mysql'
57
- @conf_path = '/etc/mysql/my.cnf'
58
- @conf_dir = '/etc/mysql/'
59
- @data_dir = '/var/lib/mysql/'
60
- @log_dir = '/var/log/'
61
- @log_path = '/var/log/mysql.log'
62
- @log_group = 'mysql'
63
- @log_dir_group = 'root'
64
- end
65
-
66
- def init_default
67
- @service = 'mysqld'
68
- @conf_path = '/etc/my.cnf'
69
- @conf_dir = '/etc/'
70
- @data_dir = '/var/lib/mysql/'
71
- @log_dir = '/var/log/'
72
- @log_path = '/var/log/mysqld.log'
73
- @log_group = 'mysql'
74
- @log_dir_group = 'root'
75
- end
76
-
77
- def to_s
78
- 'MySQL'
79
- end
80
- end
81
- end
1
+ # encoding: utf-8
2
+ # copyright: 2015, Vulcano Security GmbH
3
+
4
+ module Inspec::Resources
5
+ class Mysql < Inspec.resource(1)
6
+ name 'mysql'
7
+ supports platform: 'unix'
8
+
9
+ attr_reader :package, :service, :conf_dir, :conf_path, :data_dir, :log_dir, :log_path, :log_group, :log_dir_group
10
+ def initialize
11
+ # set OS-dependent filenames and paths
12
+ case inspec.os[:family]
13
+ when 'debian'
14
+ init_ubuntu
15
+ when 'redhat', 'fedora'
16
+ init_redhat
17
+ when 'arch'
18
+ init_arch
19
+ else
20
+ # TODO: could not detect
21
+ init_default
22
+ end
23
+ end
24
+
25
+ def init_ubuntu
26
+ @package = 'mysql-server'
27
+ @service = 'mysql'
28
+ @conf_path = '/etc/mysql/my.cnf'
29
+ @conf_dir = '/etc/mysql/'
30
+ @data_dir = '/var/lib/mysql/'
31
+ @log_dir = '/var/log/'
32
+ @log_path = '/var/log/mysql.log'
33
+ @log_group = 'adm'
34
+ case inspec.os[:release]
35
+ when '14.04'
36
+ @log_dir_group = 'syslog'
37
+ else
38
+ @log_dir_group = 'root'
39
+ end
40
+ end
41
+
42
+ def init_redhat
43
+ @package = 'mysql-server'
44
+ @service = 'mysqld'
45
+ @conf_path = '/etc/my.cnf'
46
+ @conf_dir = '/etc/'
47
+ @data_dir = '/var/lib/mysql/'
48
+ @log_dir = '/var/log/'
49
+ @log_path = '/var/log/mysqld.log'
50
+ @log_group = 'mysql'
51
+ @log_dir_group = 'root'
52
+ end
53
+
54
+ def init_arch
55
+ @package = 'mariadb'
56
+ @service = 'mysql'
57
+ @conf_path = '/etc/mysql/my.cnf'
58
+ @conf_dir = '/etc/mysql/'
59
+ @data_dir = '/var/lib/mysql/'
60
+ @log_dir = '/var/log/'
61
+ @log_path = '/var/log/mysql.log'
62
+ @log_group = 'mysql'
63
+ @log_dir_group = 'root'
64
+ end
65
+
66
+ def init_default
67
+ @service = 'mysqld'
68
+ @conf_path = '/etc/my.cnf'
69
+ @conf_dir = '/etc/'
70
+ @data_dir = '/var/lib/mysql/'
71
+ @log_dir = '/var/log/'
72
+ @log_path = '/var/log/mysqld.log'
73
+ @log_group = 'mysql'
74
+ @log_dir_group = 'root'
75
+ end
76
+
77
+ def to_s
78
+ 'MySQL'
79
+ end
80
+ end
81
+ end
@@ -1,134 +1,134 @@
1
- # encoding: utf-8
2
- # copyright: 2015, Vulcano Security GmbH
3
-
4
- require 'utils/simpleconfig'
5
- require 'utils/find_files'
6
- require 'utils/hash'
7
- require 'resources/mysql'
8
-
9
- module Inspec::Resources
10
- class MysqlConfEntry
11
- def initialize(path, params)
12
- @params = params
13
- @path = path
14
- end
15
-
16
- def method_missing(name, *_)
17
- k = name.to_s
18
- res = @params[k]
19
- return true if res.nil? && @params.key?(k)
20
- @params[k]
21
- end
22
-
23
- def to_s
24
- "MySQL Config entry [#{@path.join(' ')}]"
25
- end
26
- end
27
-
28
- class MysqlConf < Inspec.resource(1)
29
- name 'mysql_conf'
30
- supports platform: 'unix'
31
- supports platform: 'windows'
32
- desc 'Use the mysql_conf InSpec audit resource to test the contents of the configuration file for MySQL, typically located at /etc/mysql/my.cnf or /etc/my.cnf.'
33
- example "
34
- describe mysql_conf('path') do
35
- its('setting') { should eq 'value' }
36
- end
37
-
38
- # Test a parameter set within the [mysqld] section
39
- describe mysql_conf do
40
- its('mysqld.port') { should cmp 3306 }
41
- end
42
-
43
- # Test a parameter set within the [mariadb] section using array notation
44
- describe mysql_conf do
45
- its(['mariadb', 'max-connections']) { should_not be_nil }
46
- end
47
- "
48
-
49
- include FindFiles
50
-
51
- def initialize(conf_path = nil)
52
- @conf_path = conf_path || inspec.mysql.conf_path
53
- @files_contents = {}
54
- @content = nil
55
- @params = nil
56
- read_content
57
- end
58
-
59
- def content
60
- @content ||= read_content
61
- end
62
-
63
- def params(*opts)
64
- @params || read_content
65
- res = @params
66
- opts.each do |opt|
67
- res = res[opt] unless res.nil?
68
- end
69
- MysqlConfEntry.new(opts, res)
70
- end
71
-
72
- def method_missing(name)
73
- @params || read_content
74
- @params[name.to_s]
75
- end
76
-
77
- def read_content
78
- @content = ''
79
- @params = {}
80
-
81
- # skip if the main configuration file doesn't exist
82
- if !inspec.file(@conf_path).file?
83
- return skip_resource "Can't find file \"#{@conf_path}\""
84
- end
85
- raw_conf = read_file(@conf_path)
86
- if raw_conf.empty? && !inspec.file(@conf_path).empty?
87
- return skip_resource("Can't read file \"#{@conf_path}\"")
88
- end
89
-
90
- to_read = [@conf_path]
91
- until to_read.empty?
92
- cur_file = to_read[0]
93
- raw_conf = read_file(cur_file)
94
- @content += raw_conf
95
-
96
- params = SimpleConfig.new(raw_conf).params
97
- @params = @params.deep_merge(params)
98
-
99
- to_read = to_read.drop(1)
100
- # see if there is more stuff to include
101
-
102
- dir = File.dirname(cur_file)
103
- to_read += include_files(dir, raw_conf).find_all do |fp|
104
- not @files_contents.key? fp
105
- end
106
- end
107
- #
108
- @content
109
- end
110
-
111
- def include_files(reldir, conf)
112
- files = conf.scan(/^!include\s+(.*)\s*/).flatten.compact.map { |x| abs_path(reldir, x) }
113
- dirs = conf.scan(/^!includedir\s+(.*)\s*/).flatten.compact.map { |x| abs_path(reldir, x) }
114
- dirs.map do |dir|
115
- # @TODO: non local glob
116
- files += find_files(dir, depth: 1, type: 'file')
117
- end
118
- files
119
- end
120
-
121
- def abs_path(dir, f)
122
- return f if f.start_with? '/'
123
- File.join(dir, f)
124
- end
125
-
126
- def read_file(path)
127
- @files_contents[path] ||= inspec.file(path).content
128
- end
129
-
130
- def to_s
131
- 'MySQL Configuration'
132
- end
133
- end
134
- end
1
+ # encoding: utf-8
2
+ # copyright: 2015, Vulcano Security GmbH
3
+
4
+ require 'utils/simpleconfig'
5
+ require 'utils/find_files'
6
+ require 'utils/hash'
7
+ require 'resources/mysql'
8
+
9
+ module Inspec::Resources
10
+ class MysqlConfEntry
11
+ def initialize(path, params)
12
+ @params = params
13
+ @path = path
14
+ end
15
+
16
+ def method_missing(name, *_)
17
+ k = name.to_s
18
+ res = @params[k]
19
+ return true if res.nil? && @params.key?(k)
20
+ @params[k]
21
+ end
22
+
23
+ def to_s
24
+ "MySQL Config entry [#{@path.join(' ')}]"
25
+ end
26
+ end
27
+
28
+ class MysqlConf < Inspec.resource(1)
29
+ name 'mysql_conf'
30
+ supports platform: 'unix'
31
+ supports platform: 'windows'
32
+ desc 'Use the mysql_conf InSpec audit resource to test the contents of the configuration file for MySQL, typically located at /etc/mysql/my.cnf or /etc/my.cnf.'
33
+ example "
34
+ describe mysql_conf('path') do
35
+ its('setting') { should eq 'value' }
36
+ end
37
+
38
+ # Test a parameter set within the [mysqld] section
39
+ describe mysql_conf do
40
+ its('mysqld.port') { should cmp 3306 }
41
+ end
42
+
43
+ # Test a parameter set within the [mariadb] section using array notation
44
+ describe mysql_conf do
45
+ its(['mariadb', 'max-connections']) { should_not be_nil }
46
+ end
47
+ "
48
+
49
+ include FindFiles
50
+
51
+ def initialize(conf_path = nil)
52
+ @conf_path = conf_path || inspec.mysql.conf_path
53
+ @files_contents = {}
54
+ @content = nil
55
+ @params = nil
56
+ read_content
57
+ end
58
+
59
+ def content
60
+ @content ||= read_content
61
+ end
62
+
63
+ def params(*opts)
64
+ @params || read_content
65
+ res = @params
66
+ opts.each do |opt|
67
+ res = res[opt] unless res.nil?
68
+ end
69
+ MysqlConfEntry.new(opts, res)
70
+ end
71
+
72
+ def method_missing(name)
73
+ @params || read_content
74
+ @params[name.to_s]
75
+ end
76
+
77
+ def read_content
78
+ @content = ''
79
+ @params = {}
80
+
81
+ # skip if the main configuration file doesn't exist
82
+ if !inspec.file(@conf_path).file?
83
+ return skip_resource "Can't find file \"#{@conf_path}\""
84
+ end
85
+ raw_conf = read_file(@conf_path)
86
+ if raw_conf.empty? && !inspec.file(@conf_path).empty?
87
+ return skip_resource("Can't read file \"#{@conf_path}\"")
88
+ end
89
+
90
+ to_read = [@conf_path]
91
+ until to_read.empty?
92
+ cur_file = to_read[0]
93
+ raw_conf = read_file(cur_file)
94
+ @content += raw_conf
95
+
96
+ params = SimpleConfig.new(raw_conf).params
97
+ @params = @params.deep_merge(params)
98
+
99
+ to_read = to_read.drop(1)
100
+ # see if there is more stuff to include
101
+
102
+ dir = File.dirname(cur_file)
103
+ to_read += include_files(dir, raw_conf).find_all do |fp|
104
+ not @files_contents.key? fp
105
+ end
106
+ end
107
+ #
108
+ @content
109
+ end
110
+
111
+ def include_files(reldir, conf)
112
+ files = conf.scan(/^!include\s+(.*)\s*/).flatten.compact.map { |x| abs_path(reldir, x) }
113
+ dirs = conf.scan(/^!includedir\s+(.*)\s*/).flatten.compact.map { |x| abs_path(reldir, x) }
114
+ dirs.map do |dir|
115
+ # @TODO: non local glob
116
+ files += find_files(dir, depth: 1, type: 'file')
117
+ end
118
+ files
119
+ end
120
+
121
+ def abs_path(dir, f)
122
+ return f if f.start_with? '/'
123
+ File.join(dir, f)
124
+ end
125
+
126
+ def read_file(path)
127
+ @files_contents[path] ||= inspec.file(path).content
128
+ end
129
+
130
+ def to_s
131
+ 'MySQL Configuration'
132
+ end
133
+ end
134
+ end