inspec 4.7.3 → 4.7.18

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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/inspec.gemspec +1 -1
  3. data/lib/bundles/inspec-supermarket/api.rb +2 -1
  4. data/lib/bundles/inspec-supermarket/cli.rb +6 -6
  5. data/lib/bundles/inspec-supermarket/target.rb +1 -0
  6. data/lib/fetchers/git.rb +3 -1
  7. data/lib/fetchers/mock.rb +1 -0
  8. data/lib/fetchers/url.rb +6 -3
  9. data/lib/inspec/backend.rb +1 -0
  10. data/lib/inspec/base_cli.rb +4 -1
  11. data/lib/inspec/cli.rb +5 -4
  12. data/lib/inspec/config.rb +9 -1
  13. data/lib/inspec/control_eval_context.rb +1 -0
  14. data/lib/inspec/dependencies/cache.rb +1 -0
  15. data/lib/inspec/dependencies/dependency_set.rb +2 -0
  16. data/lib/inspec/dependencies/lockfile.rb +1 -0
  17. data/lib/inspec/dependencies/requirement.rb +8 -7
  18. data/lib/inspec/dependencies/resolver.rb +3 -3
  19. data/lib/inspec/describe.rb +1 -0
  20. data/lib/inspec/dsl.rb +1 -1
  21. data/lib/inspec/dsl_shared.rb +1 -1
  22. data/lib/inspec/env_printer.rb +4 -4
  23. data/lib/inspec/fetcher.rb +4 -2
  24. data/lib/inspec/file_provider.rb +18 -8
  25. data/lib/inspec/formatters/base.rb +5 -0
  26. data/lib/inspec/impact.rb +2 -0
  27. data/lib/inspec/input_registry.rb +14 -13
  28. data/lib/inspec/metadata.rb +6 -2
  29. data/lib/inspec/method_source.rb +1 -1
  30. data/lib/inspec/objects/control.rb +4 -1
  31. data/lib/inspec/objects/describe.rb +3 -1
  32. data/lib/inspec/objects/input.rb +6 -5
  33. data/lib/inspec/objects/list.rb +2 -0
  34. data/lib/inspec/objects/test.rb +3 -2
  35. data/lib/inspec/plugin/v1/plugin_types/resource.rb +7 -0
  36. data/lib/inspec/plugin/v1/plugins.rb +4 -3
  37. data/lib/inspec/plugin/v1/registry.rb +3 -2
  38. data/lib/inspec/plugin/v2.rb +1 -0
  39. data/lib/inspec/plugin/v2/activator.rb +2 -0
  40. data/lib/inspec/plugin/v2/config_file.rb +4 -1
  41. data/lib/inspec/plugin/v2/filter.rb +1 -0
  42. data/lib/inspec/plugin/v2/installer.rb +9 -7
  43. data/lib/inspec/plugin/v2/loader.rb +2 -0
  44. data/lib/inspec/plugin/v2/plugin_base.rb +1 -0
  45. data/lib/inspec/plugin/v2/plugin_types/cli.rb +2 -2
  46. data/lib/inspec/plugin/v2/registry.rb +3 -1
  47. data/lib/inspec/profile.rb +13 -6
  48. data/lib/inspec/profile_context.rb +4 -2
  49. data/lib/inspec/reporters/cli.rb +14 -10
  50. data/lib/inspec/reporters/json.rb +1 -0
  51. data/lib/inspec/reporters/json_automate.rb +3 -0
  52. data/lib/inspec/reporters/json_min.rb +2 -0
  53. data/lib/inspec/resource.rb +2 -0
  54. data/lib/inspec/resources/aide_conf.rb +4 -3
  55. data/lib/inspec/resources/apache_conf.rb +1 -1
  56. data/lib/inspec/resources/apt.rb +2 -0
  57. data/lib/inspec/resources/auditd.rb +19 -18
  58. data/lib/inspec/resources/bridge.rb +5 -2
  59. data/lib/inspec/resources/chocolatey_package.rb +2 -0
  60. data/lib/inspec/resources/command.rb +1 -1
  61. data/lib/inspec/resources/crontab.rb +9 -8
  62. data/lib/inspec/resources/csv.rb +1 -1
  63. data/lib/inspec/resources/dh_params.rb +6 -0
  64. data/lib/inspec/resources/docker.rb +37 -34
  65. data/lib/inspec/resources/docker_container.rb +1 -0
  66. data/lib/inspec/resources/docker_image.rb +1 -0
  67. data/lib/inspec/resources/docker_plugin.rb +1 -0
  68. data/lib/inspec/resources/docker_service.rb +1 -0
  69. data/lib/inspec/resources/elasticsearch.rb +24 -24
  70. data/lib/inspec/resources/etc_fstab.rb +8 -7
  71. data/lib/inspec/resources/etc_group.rb +4 -0
  72. data/lib/inspec/resources/etc_hosts.rb +4 -4
  73. data/lib/inspec/resources/etc_hosts_allow_deny.rb +5 -3
  74. data/lib/inspec/resources/file.rb +4 -1
  75. data/lib/inspec/resources/filesystem.rb +5 -3
  76. data/lib/inspec/resources/firewalld.rb +7 -4
  77. data/lib/inspec/resources/groups.rb +6 -4
  78. data/lib/inspec/resources/grub_conf.rb +3 -0
  79. data/lib/inspec/resources/host.rb +5 -3
  80. data/lib/inspec/resources/http.rb +6 -4
  81. data/lib/inspec/resources/iis_app.rb +1 -0
  82. data/lib/inspec/resources/iis_app_pool.rb +1 -1
  83. data/lib/inspec/resources/iis_site.rb +4 -3
  84. data/lib/inspec/resources/interface.rb +10 -7
  85. data/lib/inspec/resources/json.rb +1 -1
  86. data/lib/inspec/resources/kernel_module.rb +1 -1
  87. data/lib/inspec/resources/kernel_parameter.rb +2 -1
  88. data/lib/inspec/resources/key_rsa.rb +5 -0
  89. data/lib/inspec/resources/mount.rb +3 -1
  90. data/lib/inspec/resources/mysql_conf.rb +3 -1
  91. data/lib/inspec/resources/mysql_session.rb +2 -0
  92. data/lib/inspec/resources/nginx.rb +1 -0
  93. data/lib/inspec/resources/nginx_conf.rb +10 -6
  94. data/lib/inspec/resources/ntp_conf.rb +1 -0
  95. data/lib/inspec/resources/oneget.rb +1 -1
  96. data/lib/inspec/resources/oracledb_session.rb +4 -2
  97. data/lib/inspec/resources/os_env.rb +1 -0
  98. data/lib/inspec/resources/package.rb +10 -6
  99. data/lib/inspec/resources/packages.rb +7 -5
  100. data/lib/inspec/resources/passwd.rb +7 -7
  101. data/lib/inspec/resources/pip.rb +2 -0
  102. data/lib/inspec/resources/port.rb +22 -8
  103. data/lib/inspec/resources/postgres.rb +2 -1
  104. data/lib/inspec/resources/postgres_conf.rb +2 -0
  105. data/lib/inspec/resources/postgres_hba_conf.rb +6 -6
  106. data/lib/inspec/resources/postgres_ident_conf.rb +3 -3
  107. data/lib/inspec/resources/processes.rb +16 -15
  108. data/lib/inspec/resources/rabbitmq_config.rb +2 -0
  109. data/lib/inspec/resources/registry_key.rb +8 -3
  110. data/lib/inspec/resources/security_identifier.rb +3 -1
  111. data/lib/inspec/resources/security_policy.rb +2 -1
  112. data/lib/inspec/resources/service.rb +13 -1
  113. data/lib/inspec/resources/shadow.rb +1 -0
  114. data/lib/inspec/resources/ssh_config.rb +2 -0
  115. data/lib/inspec/resources/ssl.rb +12 -11
  116. data/lib/inspec/resources/users.rb +29 -19
  117. data/lib/inspec/resources/virtualization.rb +10 -0
  118. data/lib/inspec/resources/windows_feature.rb +1 -1
  119. data/lib/inspec/resources/windows_hotfix.rb +2 -0
  120. data/lib/inspec/resources/windows_task.rb +4 -0
  121. data/lib/inspec/resources/wmi.rb +2 -1
  122. data/lib/inspec/resources/x509_certificate.rb +8 -0
  123. data/lib/inspec/resources/xinetd_conf.rb +10 -9
  124. data/lib/inspec/resources/yum.rb +15 -11
  125. data/lib/inspec/resources/zfs_dataset.rb +4 -2
  126. data/lib/inspec/resources/zfs_pool.rb +2 -1
  127. data/lib/inspec/rule.rb +11 -1
  128. data/lib/inspec/runner.rb +9 -6
  129. data/lib/inspec/runner_rspec.rb +10 -8
  130. data/lib/inspec/schema.rb +1 -0
  131. data/lib/inspec/secrets.rb +1 -0
  132. data/lib/inspec/secrets/yaml.rb +1 -0
  133. data/lib/inspec/shell.rb +20 -19
  134. data/lib/inspec/shell_detector.rb +1 -1
  135. data/lib/inspec/source_reader.rb +2 -0
  136. data/lib/inspec/ui.rb +1 -0
  137. data/lib/inspec/utils/deprecation/config_file.rb +8 -4
  138. data/lib/inspec/utils/erlang_parser.rb +2 -0
  139. data/lib/inspec/utils/file_reader.rb +1 -1
  140. data/lib/inspec/utils/filter.rb +16 -3
  141. data/lib/inspec/utils/find_files.rb +2 -2
  142. data/lib/inspec/utils/object_traversal.rb +1 -0
  143. data/lib/inspec/utils/parser.rb +2 -0
  144. data/lib/inspec/utils/simpleconfig.rb +4 -1
  145. data/lib/inspec/utils/telemetry/global_methods.rb +1 -0
  146. data/lib/inspec/version.rb +1 -1
  147. data/lib/matchers/matchers.rb +4 -1
  148. data/lib/plugins/inspec-artifact/lib/inspec-artifact/base.rb +12 -11
  149. data/lib/plugins/inspec-artifact/test/functional/inspec_artifact_test.rb +3 -3
  150. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api.rb +15 -11
  151. data/lib/plugins/inspec-compliance/lib/inspec-compliance/api/login.rb +4 -2
  152. data/lib/plugins/inspec-compliance/lib/inspec-compliance/cli.rb +13 -12
  153. data/lib/plugins/inspec-compliance/lib/inspec-compliance/http.rb +3 -0
  154. data/lib/plugins/inspec-compliance/test/unit/api_test.rb +28 -28
  155. data/lib/plugins/inspec-compliance/test/unit/target_test.rb +1 -1
  156. data/lib/plugins/inspec-habitat/lib/inspec-habitat/profile.rb +1 -1
  157. data/lib/plugins/inspec-habitat/test/unit/profile_test.rb +7 -6
  158. data/lib/plugins/inspec-init/lib/inspec-init/cli_profile.rb +2 -2
  159. data/lib/plugins/inspec-init/lib/inspec-init/renderer.rb +1 -0
  160. data/lib/plugins/inspec-init/test/functional/inspec_init_plugin_test.rb +12 -10
  161. data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli/cli_command.rb +6 -5
  162. data/lib/plugins/inspec-plugin-manager-cli/test/functional/inspec-plugin_test.rb +1 -0
  163. data/lib/plugins/shared/core_plugin_test_helper.rb +1 -0
  164. data/lib/resource_support/aws/aws_resource_mixin.rb +3 -2
  165. data/lib/resources/aws/aws_billing_report.rb +1 -1
  166. data/lib/resources/aws/aws_billing_reports.rb +8 -7
  167. data/lib/resources/aws/aws_cloudtrail_trail.rb +1 -1
  168. data/lib/resources/aws/aws_cloudtrail_trails.rb +1 -0
  169. data/lib/resources/aws/aws_cloudwatch_alarm.rb +4 -3
  170. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +2 -1
  171. data/lib/resources/aws/aws_config_delivery_channel.rb +1 -1
  172. data/lib/resources/aws/aws_config_recorder.rb +2 -0
  173. data/lib/resources/aws/aws_ebs_volume.rb +1 -0
  174. data/lib/resources/aws/aws_ebs_volumes.rb +2 -0
  175. data/lib/resources/aws/aws_ec2_instance.rb +2 -0
  176. data/lib/resources/aws/aws_ec2_instances.rb +2 -0
  177. data/lib/resources/aws/aws_ecs_cluster.rb +2 -2
  178. data/lib/resources/aws/aws_eks_cluster.rb +3 -3
  179. data/lib/resources/aws/aws_elb.rb +2 -2
  180. data/lib/resources/aws/aws_elbs.rb +14 -12
  181. data/lib/resources/aws/aws_flow_log.rb +2 -2
  182. data/lib/resources/aws/aws_iam_access_key.rb +3 -1
  183. data/lib/resources/aws/aws_iam_access_keys.rb +18 -16
  184. data/lib/resources/aws/aws_iam_groups.rb +1 -0
  185. data/lib/resources/aws/aws_iam_password_policy.rb +9 -7
  186. data/lib/resources/aws/aws_iam_policies.rb +2 -1
  187. data/lib/resources/aws/aws_iam_policy.rb +10 -1
  188. data/lib/resources/aws/aws_iam_role.rb +1 -0
  189. data/lib/resources/aws/aws_iam_user.rb +5 -2
  190. data/lib/resources/aws/aws_iam_users.rb +12 -11
  191. data/lib/resources/aws/aws_kms_key.rb +2 -2
  192. data/lib/resources/aws/aws_kms_keys.rb +3 -1
  193. data/lib/resources/aws/aws_route_table.rb +2 -2
  194. data/lib/resources/aws/aws_route_tables.rb +2 -1
  195. data/lib/resources/aws/aws_s3_bucket.rb +5 -3
  196. data/lib/resources/aws/aws_s3_bucket_object.rb +3 -1
  197. data/lib/resources/aws/aws_s3_buckets.rb +1 -0
  198. data/lib/resources/aws/aws_security_group.rb +20 -9
  199. data/lib/resources/aws/aws_security_groups.rb +1 -0
  200. data/lib/resources/aws/aws_sns_subscription.rb +1 -1
  201. data/lib/resources/aws/aws_sns_topics.rb +2 -0
  202. data/lib/resources/aws/aws_subnet.rb +2 -2
  203. data/lib/resources/aws/aws_subnets.rb +4 -3
  204. data/lib/resources/aws/aws_vpc.rb +1 -1
  205. data/lib/resources/aws/aws_vpcs.rb +3 -2
  206. data/lib/resources/azure/azure_generic_resource.rb +4 -4
  207. data/lib/resources/azure/azure_resource_group.rb +1 -0
  208. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +13 -12
  209. data/lib/source_readers/flat.rb +1 -0
  210. data/lib/source_readers/inspec.rb +1 -0
  211. metadata +2 -2
@@ -69,6 +69,7 @@ module Inspec::Resources
69
69
 
70
70
  def filter(query = {})
71
71
  return self if query.nil? || query.empty?
72
+
72
73
  res = set_params
73
74
  filters = ""
74
75
  query.each do |attr, condition|
@@ -48,6 +48,7 @@ module Inspec::Resources
48
48
  return nil if param.nil?
49
49
  # extract first value if we have only one value in array
50
50
  return param[0] if param.length == 1
51
+
51
52
  param
52
53
  end
53
54
 
@@ -66,6 +67,7 @@ module Inspec::Resources
66
67
  def read_params
67
68
  return @params if defined?(@params)
68
69
  return @params = {} if read_content.nil?
70
+
69
71
  conf = SimpleConfig.new(
70
72
  read_content,
71
73
  assignment_regex: /^\s*(\S+?)\s+(.*?)\s*$/,
@@ -59,20 +59,21 @@ class SSL < Inspec.resource(1)
59
59
  filter = FilterTable.create
60
60
  filter.register_custom_matcher(:enabled?) do |x|
61
61
  raise "Cannot determine host for SSL test. Please specify it or use a different target." if x.resource.host.nil?
62
+
62
63
  x.handshake.values.any? { |i| i["success"] }
63
64
  end
64
65
  filter.register_column(:ciphers, field: "cipher")
65
- .register_column(:protocols, field: "protocol")
66
- .register_custom_property(:handshake) do |x|
67
- groups = x.entries.group_by(&:protocol)
68
- res = Parallel.map(groups, in_threads: 8) do |proto, e|
69
- [proto, SSLShake.hello(x.resource.host, port: x.resource.port,
70
- protocol: proto, ciphers: e.map(&:cipher),
71
- timeout: x.resource.timeout, retries: x.resource.retries, servername: x.resource.host)]
72
- end
73
- Hash[res]
74
- end
75
- .install_filter_methods_on_resource(self, :scan_config)
66
+ .register_column(:protocols, field: "protocol")
67
+ .register_custom_property(:handshake) do |x|
68
+ groups = x.entries.group_by(&:protocol)
69
+ res = Parallel.map(groups, in_threads: 8) do |proto, e|
70
+ [proto, SSLShake.hello(x.resource.host, port: x.resource.port,
71
+ protocol: proto, ciphers: e.map(&:cipher),
72
+ timeout: x.resource.timeout, retries: x.resource.retries, servername: x.resource.host)]
73
+ end
74
+ Hash[res]
75
+ end
76
+ .install_filter_methods_on_resource(self, :scan_config)
76
77
 
77
78
  def to_s
78
79
  "SSL/TLS on #{@host}:#{@port}"
@@ -72,18 +72,18 @@ module Inspec::Resources
72
72
  filter = FilterTable.create
73
73
  filter.register_custom_matcher(:exists?) { |x| !x.entries.empty? }
74
74
  filter.register_column(:usernames, field: :username)
75
- .register_column(:uids, field: :uid)
76
- .register_column(:gids, field: :gid)
77
- .register_column(:groupnames, field: :groupname)
78
- .register_column(:groups, field: :groups)
79
- .register_column(:homes, field: :home)
80
- .register_column(:shells, field: :shell)
81
- .register_column(:mindays, field: :mindays)
82
- .register_column(:maxdays, field: :maxdays)
83
- .register_column(:warndays, field: :warndays)
84
- .register_column(:disabled, field: :disabled)
85
- .register_custom_matcher(:disabled?) { |x| x.where { disabled == false }.entries.empty? }
86
- .register_custom_matcher(:enabled?) { |x| x.where { disabled == true }.entries.empty? }
75
+ .register_column(:uids, field: :uid)
76
+ .register_column(:gids, field: :gid)
77
+ .register_column(:groupnames, field: :groupname)
78
+ .register_column(:groups, field: :groups)
79
+ .register_column(:homes, field: :home)
80
+ .register_column(:shells, field: :shell)
81
+ .register_column(:mindays, field: :mindays)
82
+ .register_column(:maxdays, field: :maxdays)
83
+ .register_column(:warndays, field: :warndays)
84
+ .register_column(:disabled, field: :disabled)
85
+ .register_custom_matcher(:disabled?) { |x| x.where { disabled == false }.entries.empty? }
86
+ .register_custom_matcher(:enabled?) { |x| x.where { disabled == true }.entries.empty? }
87
87
  filter.install_filter_methods_on_resource(self, :collect_user_details)
88
88
 
89
89
  def to_s
@@ -254,17 +254,20 @@ module Inspec::Resources
254
254
  # returns the iden
255
255
  def identity
256
256
  return @id_cache if defined?(@id_cache)
257
- @id_cache = @user_provider.identity(@username) if !@user_provider.nil?
257
+
258
+ @id_cache = @user_provider.identity(@username) unless @user_provider.nil?
258
259
  end
259
260
 
260
261
  def meta_info
261
262
  return @meta_cache if defined?(@meta_cache)
262
- @meta_cache = @user_provider.meta_info(@username) if !@user_provider.nil?
263
+
264
+ @meta_cache = @user_provider.meta_info(@username) unless @user_provider.nil?
263
265
  end
264
266
 
265
267
  def credentials
266
268
  return @cred_cache if defined?(@cred_cache)
267
- @cred_cache = @user_provider.credentials(@username) if !@user_provider.nil?
269
+
270
+ @cred_cache = @user_provider.credentials(@username) unless @user_provider.nil?
268
271
  end
269
272
  end
270
273
 
@@ -346,6 +349,7 @@ module Inspec::Resources
346
349
  def list_users
347
350
  cmd = inspec.command(list_users_cmd)
348
351
  return [] if cmd.exit_status != 0
352
+
349
353
  cmd.stdout.chomp.lines
350
354
  end
351
355
 
@@ -389,7 +393,7 @@ module Inspec::Resources
389
393
  data.push(raw[0, index + 1]) # inclue closing )
390
394
  raw = raw[index + 2, raw.length - index - 2]
391
395
  end
392
- data.push(raw) if !raw.nil?
396
+ data.push(raw) unless raw.nil?
393
397
  data.join("\n")
394
398
  end
395
399
  end
@@ -401,6 +405,7 @@ module Inspec::Resources
401
405
  def meta_info(username)
402
406
  cmd = inspec.command("getent passwd #{username}")
403
407
  return nil if cmd.exit_status != 0
408
+
404
409
  # returns: root:x:0:0:root:/root:/bin/bash
405
410
  passwd = parse_passwd_line(cmd.stdout.chomp)
406
411
  {
@@ -440,6 +445,7 @@ module Inspec::Resources
440
445
  def identity(username)
441
446
  id = super(username)
442
447
  return nil if id.nil?
448
+
443
449
  # AIX 'id' command doesn't include the primary group in the supplementary
444
450
  # yet it can be somewhere in the supplementary list if someone added root
445
451
  # to a groups list in /etc/group
@@ -483,6 +489,7 @@ module Inspec::Resources
483
489
  def meta_info(username)
484
490
  hpuxuser = inspec.command("logins -x -l #{username}")
485
491
  return nil if hpuxuser.exit_status != 0
492
+
486
493
  user = hpuxuser.stdout.chomp.split(" ")
487
494
  {
488
495
  home: user[4],
@@ -534,6 +541,7 @@ module Inspec::Resources
534
541
  def meta_info(username)
535
542
  cmd = inspec.command("pw usershow #{username} -7")
536
543
  return nil if cmd.exit_status != 0
544
+
537
545
  # returns: root:*:0:0:Charlie &:/root:/bin/csh
538
546
  passwd = parse_passwd_line(cmd.stdout.chomp)
539
547
  {
@@ -552,7 +560,7 @@ module Inspec::Resources
552
560
  def parse_windows_account(username)
553
561
  account = username.split('\\')
554
562
  name = account.pop
555
- domain = account.pop if !account.empty?
563
+ domain = account.pop unless account.empty?
556
564
  [name, domain]
557
565
  end
558
566
 
@@ -560,8 +568,9 @@ module Inspec::Resources
560
568
  # TODO: we look for local users only at this point
561
569
  name, _domain = parse_windows_account(username)
562
570
  return if collect_user_details.nil?
571
+
563
572
  res = collect_user_details.select { |user| user[:username] == name }
564
- res[0] if !res.empty?
573
+ res[0] unless res.empty?
565
574
  end
566
575
 
567
576
  def list_users
@@ -571,6 +580,7 @@ module Inspec::Resources
571
580
  # https://msdn.microsoft.com/en-us/library/aa746340(v=vs.85).aspx
572
581
  def collect_user_details # rubocop:disable Metrics/MethodLength
573
582
  return @users_cache if defined?(@users_cache)
583
+
574
584
  script = <<~EOH
575
585
  Function ConvertTo-SID { Param([byte[]]$BinarySID)
576
586
  (New-Object System.Security.Principal.SecurityIdentifier($BinarySID,0)).Value
@@ -640,7 +650,7 @@ module Inspec::Resources
640
650
  end
641
651
 
642
652
  # ensure we have an array of groups
643
- users = [users] if !users.is_a?(Array)
653
+ users = [users] unless users.is_a?(Array)
644
654
  # convert keys to symbols
645
655
  @users_cache = users.map { |user| user.each_with_object({}) { |(k, v), h| h[k.to_sym] = v } }
646
656
  end
@@ -67,6 +67,7 @@ module Inspec::Resources
67
67
  def detect_xen
68
68
  # This file should exist on most Xen systems, normally empty for guests
69
69
  return false unless inspec.file("/proc/xen/capabilities").exist?
70
+
70
71
  @virtualization_data[:system] = "xen"
71
72
  if inspec.file("/proc/xen/capabilities").content =~ /control_d/i
72
73
  @virtualization_data[:role] = "host"
@@ -80,6 +81,7 @@ module Inspec::Resources
80
81
  # Detect Virtualbox from kernel module
81
82
  def detect_virtualbox
82
83
  return false unless inspec.file("/proc/modules").exist?
84
+
83
85
  modules = inspec.file("/proc/modules").content
84
86
  if modules =~ /^vboxdrv/
85
87
  Inspec::Log.debug("Plugin Virtualization: /proc/modules contains vboxdrv. Detecting as vbox host")
@@ -98,6 +100,7 @@ module Inspec::Resources
98
100
  # if nova binary is present we're on an openstack host
99
101
  def detect_openstack
100
102
  return false unless nova_exists?
103
+
101
104
  @virtualization_data[:system] = "openstack"
102
105
  @virtualization_data[:role] = "host"
103
106
  true
@@ -106,6 +109,7 @@ module Inspec::Resources
106
109
  # Detect paravirt KVM/QEMU from cpuinfo, report as KVM
107
110
  def detect_kvm_from_cpuinfo
108
111
  return false unless inspec.file("/proc/cpuinfo").content =~ /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/
112
+
109
113
  @virtualization_data[:system] = "kvm"
110
114
  @virtualization_data[:role] = "guest"
111
115
  true
@@ -115,6 +119,7 @@ module Inspec::Resources
115
119
  # guests will have the hypervisor cpu feature that hosts don't have
116
120
  def detect_kvm_from_sys
117
121
  return false unless inspec.file("/sys/devices/virtual/misc/kvm").exist?
122
+
118
123
  @virtualization_data[:system] = "kvm"
119
124
  if inspec.file("/proc/cpuinfo").content =~ /hypervisor/
120
125
  @virtualization_data[:role] = "guest"
@@ -142,6 +147,7 @@ module Inspec::Resources
142
147
  # Detect Parallels virtual machine from pci devices
143
148
  def detect_parallels
144
149
  return false unless inspec.file("/proc/bus/pci/devices").content =~ /1ab84000/
150
+
145
151
  @virtualization_data[:system] = "parallels"
146
152
  @virtualization_data[:role] = "guest"
147
153
  true
@@ -150,9 +156,11 @@ module Inspec::Resources
150
156
  # Detect Linux-VServer
151
157
  def detect_linux_vserver
152
158
  return false unless inspec.file("/proc/self/status").exist?
159
+
153
160
  proc_self_status = inspec.file("/proc/self/status").content
154
161
  vxid = proc_self_status.match(/^(s_context|VxID):\s*(\d+)$/)
155
162
  return false unless vxid && vxid[2]
163
+
156
164
  @virtualization_data[:system] = "linux-vserver"
157
165
  if vxid[2] == "0"
158
166
  @virtualization_data[:role] = "host"
@@ -182,6 +190,7 @@ module Inspec::Resources
182
190
  # Kernel docs, https://www.kernel.org/doc/Documentation/cgroups
183
191
  def detect_lxc_docker
184
192
  return false unless inspec.file("/proc/self/cgroup").exist?
193
+
185
194
  cgroup_content = inspec.file("/proc/self/cgroup").content
186
195
  if cgroup_content =~ %r{^\d+:[^:]+:/(lxc|docker)/.+$} ||
187
196
  cgroup_content =~ %r{^\d+:[^:]+:/[^/]+/(lxc|docker)-.+$} # rubocop:disable Layout/MultilineOperationIndentation
@@ -203,6 +212,7 @@ module Inspec::Resources
203
212
 
204
213
  def detect_docker
205
214
  return false unless inspec.file("/.dockerenv").exist? || inspec.file("/.dockerinit").exist?
215
+
206
216
  @virtualization_data[:system] = "docker"
207
217
  @virtualization_data[:role] = "guest"
208
218
  true
@@ -38,7 +38,7 @@ module Inspec::Resources
38
38
 
39
39
  # returns the package description
40
40
  def info
41
- return @cache if !@cache.nil?
41
+ return @cache unless @cache.nil?
42
42
 
43
43
  case @method
44
44
  when :powershell
@@ -18,6 +18,7 @@ module Inspec::Resources
18
18
  @content = nil
19
19
  os = inspec.os
20
20
  return skip_resource "The `windows_hotfix` resource is not a feature of your OS." unless os.windows?
21
+
21
22
  query = "get-hotfix -id #{@id}"
22
23
  cmd = inspec.powershell(query)
23
24
  @content = cmd.stdout
@@ -29,6 +30,7 @@ module Inspec::Resources
29
30
 
30
31
  def installed?
31
32
  return false if @content.nil?
33
+
32
34
  @content.include?(@id)
33
35
  end
34
36
  end
@@ -33,17 +33,20 @@ module Inspec::Resources
33
33
 
34
34
  def exists?
35
35
  return true unless info.nil? || info[:uri].nil?
36
+
36
37
  false
37
38
  end
38
39
 
39
40
  # rubocop:disable Style/WordArray
40
41
  def enabled?
41
42
  return false if info.nil? || info[:state].nil?
43
+
42
44
  ["Ready", "Running"].include?(info[:state])
43
45
  end
44
46
 
45
47
  def disabled?
46
48
  return false if info.nil? || info[:state].nil?
49
+
47
50
  info[:scheduled_task_state] == "Disabled" || info[:state] == "Disabled"
48
51
  end
49
52
 
@@ -69,6 +72,7 @@ module Inspec::Resources
69
72
 
70
73
  def info
71
74
  return @cache unless @cache.nil?
75
+
72
76
  # PowerShell v5 has Get-ScheduledTask cmdlet,
73
77
  # _using something with backward support to v3_
74
78
  # script = "Get-ScheduledTask | ? { $_.URI -eq '#{@taskuri}' } | Select-Object URI,@{N='State';E={$_.State.ToString()}} | ConvertTo-Json"
@@ -51,13 +51,14 @@ module Inspec::Resources
51
51
 
52
52
  def params
53
53
  return @content if defined?(@content)
54
+
54
55
  @content = {}
55
56
 
56
57
  # abort if no options are available
57
58
  return @content unless defined?(@options)
58
59
 
59
60
  # filter for supported options
60
- args = @options.select { |key, _value| [:class, :namespace, :query, :filter].include?(key) }
61
+ args = @options.select { |key, _value| %i{class namespace query filter}.include?(key) }
61
62
 
62
63
  # convert to Get-WmiObject arguments
63
64
  params = ""
@@ -56,16 +56,19 @@ module Inspec::Resources
56
56
 
57
57
  def fingerprint
58
58
  return if @cert.nil?
59
+
59
60
  OpenSSL::Digest::SHA1.new(@cert.to_der).to_s
60
61
  end
61
62
 
62
63
  def serial
63
64
  return if @cert.nil?
65
+
64
66
  @cert.serial.to_i
65
67
  end
66
68
 
67
69
  def subject_dn
68
70
  return if @cert.nil?
71
+
69
72
  @cert.subject.to_s
70
73
  end
71
74
 
@@ -73,12 +76,14 @@ module Inspec::Resources
73
76
  return if @cert.nil?
74
77
  # Return cached subject if we have already parsed it
75
78
  return @parsed_subject if @parsed_subject
79
+
76
80
  # Use a Mash to make it easier to access hash elements in "its('subject') {should ...}"
77
81
  @parsed_subject = Hashie::Mash.new(Hash[@cert.subject.to_a.map { |k, v, _| [k, v] }])
78
82
  end
79
83
 
80
84
  def issuer_dn
81
85
  return if @cert.nil?
86
+
82
87
  @cert.issuer.to_s
83
88
  end
84
89
 
@@ -86,12 +91,14 @@ module Inspec::Resources
86
91
  return if @cert.nil?
87
92
  # Return cached subject if we have already parsed it
88
93
  return @parsed_issuer if @parsed_issuer
94
+
89
95
  # Use a Mash to make it easier to access hash elements in "its('issuer') {should ...}"
90
96
  @parsed_issuer = Hashie::Mash.new(Hash[@cert.issuer.to_a.map { |k, v, _| [k, v] }])
91
97
  end
92
98
 
93
99
  def key_length
94
100
  return if @cert.nil?
101
+
95
102
  @cert.public_key.n.num_bytes * 8
96
103
  end
97
104
 
@@ -109,6 +116,7 @@ module Inspec::Resources
109
116
  return @extensions if @extensions
110
117
  # Return the exception class if we failed to instantiate a Cert from file
111
118
  return @cert unless @cert.respond_to? :extensions
119
+
112
120
  # Use a Mash to make it easier to access hash elements in "its('entensions') {should ...}"
113
121
  @extensions = Hashie::Mash.new({})
114
122
  # Make sure standard extensions exist so we don't get nil for nil:NilClass
@@ -35,15 +35,15 @@ module Inspec::Resources
35
35
  end
36
36
 
37
37
  filter = FilterTable.create
38
- filter.register_column(:services, field: "service")
39
- .register_column(:ids, field: "id")
40
- .register_column(:socket_types, field: "socket_type")
41
- .register_column(:types, field: "type")
42
- .register_column(:protocols, field: "protocol")
43
- .register_column(:wait, field: "wait")
44
- .register_custom_matcher(:disabled?) { |x| x.where("disable" => "no").services.empty? }
45
- .register_custom_matcher(:enabled?) { |x| x.where("disable" => "yes").services.empty? }
46
- .install_filter_methods_on_resource(self, :service_lines)
38
+ filter.register_column(:services, field: "service")
39
+ .register_column(:ids, field: "id")
40
+ .register_column(:socket_types, field: "socket_type")
41
+ .register_column(:types, field: "type")
42
+ .register_column(:protocols, field: "protocol")
43
+ .register_column(:wait, field: "wait")
44
+ .register_custom_matcher(:disabled?) { |x| x.where("disable" => "no").services.empty? }
45
+ .register_custom_matcher(:enabled?) { |x| x.where("disable" => "yes").services.empty? }
46
+ .install_filter_methods_on_resource(self, :service_lines)
47
47
 
48
48
  private
49
49
 
@@ -55,6 +55,7 @@ module Inspec::Resources
55
55
 
56
56
  def read_params
57
57
  return {} if read_content.nil?
58
+
58
59
  flat_params = parse_xinetd(read_content)
59
60
  # we need to map service data in order to use it with filtertable
60
61
  params = { "services" => {} }
@@ -47,6 +47,7 @@ module Inspec::Resources
47
47
  # until \n
48
48
  def repositories
49
49
  return @cache if defined?(@cache)
50
+
50
51
  # parse the repository data from yum
51
52
  # we cannot use -C, because this is not reliable and may lead to errors
52
53
  @command_result = inspec.command("yum -v repolist all")
@@ -82,7 +83,7 @@ module Inspec::Resources
82
83
 
83
84
  # alias for yum.repo('reponame')
84
85
  def method_missing(name)
85
- repo(name.to_s) if !name.nil?
86
+ repo(name.to_s) unless name.nil?
86
87
  end
87
88
 
88
89
  def to_s
@@ -99,6 +100,7 @@ module Inspec::Resources
99
100
  # Optimize the key value
100
101
  def repo_key(key)
101
102
  return key if key.nil?
103
+
102
104
  key.gsub("Repo-", "").downcase
103
105
  end
104
106
  end
@@ -118,6 +120,7 @@ module Inspec::Resources
118
120
 
119
121
  def info
120
122
  return @cache if defined?(@cache)
123
+
121
124
  selection = @yum.repositories.select { |e| e["id"] == @reponame || shortname(e["id"]) == @reponame }
122
125
  @cache = selection.empty? ? {} : selection.first
123
126
  @cache
@@ -129,20 +132,21 @@ module Inspec::Resources
129
132
 
130
133
  def enabled?
131
134
  return false unless exist?
135
+
132
136
  info["status"] == "enabled"
133
137
  end
134
138
 
135
139
  # provide a method for each of the repo metadata items we know about
136
- [
137
- :baseurl,
138
- :expire,
139
- :filename,
140
- :mirrors,
141
- :pkgs,
142
- :size,
143
- :status,
144
- :updated,
145
- ].each do |key|
140
+ %i{
141
+ baseurl
142
+ expire
143
+ filename
144
+ mirrors
145
+ pkgs
146
+ size
147
+ status
148
+ updated
149
+ }.each do |key|
146
150
  define_method key do
147
151
  info[key.to_s]
148
152
  end