inspec-core 5.12.2 → 5.18.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/etc/deprecations.json +4 -0
  4. data/etc/keys/progress-2022-05-04.pem.pub +9 -0
  5. data/inspec-core.gemspec +1 -1
  6. data/lib/inspec/base_cli.rb +5 -0
  7. data/lib/inspec/cli.rb +64 -9
  8. data/lib/inspec/dependencies/dependency_set.rb +6 -2
  9. data/lib/inspec/dependency_loader.rb +5 -1
  10. data/lib/inspec/dsl.rb +18 -5
  11. data/lib/inspec/errors.rb +2 -0
  12. data/lib/inspec/exceptions.rb +2 -0
  13. data/lib/inspec/fetcher/url.rb +1 -1
  14. data/lib/inspec/file_provider.rb +36 -0
  15. data/lib/inspec/iaf_file.rb +127 -0
  16. data/lib/inspec/profile.rb +31 -14
  17. data/lib/inspec/resources/aide_conf.rb +4 -0
  18. data/lib/inspec/resources/apache.rb +4 -0
  19. data/lib/inspec/resources/apache_conf.rb +4 -0
  20. data/lib/inspec/resources/apt.rb +6 -1
  21. data/lib/inspec/resources/audit_policy.rb +5 -0
  22. data/lib/inspec/resources/auditd_conf.rb +4 -0
  23. data/lib/inspec/resources/bash.rb +4 -0
  24. data/lib/inspec/resources/bond.rb +4 -0
  25. data/lib/inspec/resources/bridge.rb +4 -0
  26. data/lib/inspec/resources/cassandradb_conf.rb +5 -0
  27. data/lib/inspec/resources/cassandradb_session.rb +8 -3
  28. data/lib/inspec/resources/chocolatey_package.rb +4 -0
  29. data/lib/inspec/resources/chrony_conf.rb +4 -0
  30. data/lib/inspec/resources/command.rb +5 -0
  31. data/lib/inspec/resources/cpan.rb +4 -0
  32. data/lib/inspec/resources/cran.rb +4 -0
  33. data/lib/inspec/resources/cron.rb +5 -0
  34. data/lib/inspec/resources/csv.rb +6 -1
  35. data/lib/inspec/resources/default_gateway.rb +61 -0
  36. data/lib/inspec/resources/dh_params.rb +4 -0
  37. data/lib/inspec/resources/docker_container.rb +4 -0
  38. data/lib/inspec/resources/docker_image.rb +4 -0
  39. data/lib/inspec/resources/docker_plugin.rb +4 -0
  40. data/lib/inspec/resources/docker_service.rb +4 -0
  41. data/lib/inspec/resources/etc_group.rb +4 -0
  42. data/lib/inspec/resources/etc_hosts_allow_deny.rb +5 -0
  43. data/lib/inspec/resources/file.rb +97 -1
  44. data/lib/inspec/resources/filesystem.rb +4 -0
  45. data/lib/inspec/resources/gem.rb +4 -0
  46. data/lib/inspec/resources/groups.rb +9 -0
  47. data/lib/inspec/resources/grub_conf.rb +4 -0
  48. data/lib/inspec/resources/host.rb +46 -3
  49. data/lib/inspec/resources/http.rb +4 -0
  50. data/lib/inspec/resources/ibmdb2_conf.rb +8 -0
  51. data/lib/inspec/resources/ibmdb2_session.rb +12 -3
  52. data/lib/inspec/resources/iis_app.rb +4 -0
  53. data/lib/inspec/resources/iis_app_pool.rb +4 -0
  54. data/lib/inspec/resources/iis_site.rb +4 -0
  55. data/lib/inspec/resources/inetd_conf.rb +4 -0
  56. data/lib/inspec/resources/interface.rb +4 -0
  57. data/lib/inspec/resources/ip6tables.rb +4 -0
  58. data/lib/inspec/resources/ipfilter.rb +4 -0
  59. data/lib/inspec/resources/ipnat.rb +4 -0
  60. data/lib/inspec/resources/iptables.rb +4 -0
  61. data/lib/inspec/resources/json.rb +4 -0
  62. data/lib/inspec/resources/kernel_module.rb +4 -0
  63. data/lib/inspec/resources/kernel_parameter.rb +4 -0
  64. data/lib/inspec/resources/key_rsa.rb +4 -0
  65. data/lib/inspec/resources/ksh.rb +4 -0
  66. data/lib/inspec/resources/limits_conf.rb +4 -0
  67. data/lib/inspec/resources/linux_audit_system.rb +81 -0
  68. data/lib/inspec/resources/login_defs.rb +4 -0
  69. data/lib/inspec/resources/mongodb.rb +4 -0
  70. data/lib/inspec/resources/mongodb_conf.rb +5 -0
  71. data/lib/inspec/resources/mongodb_session.rb +6 -1
  72. data/lib/inspec/resources/mount.rb +4 -0
  73. data/lib/inspec/resources/mssql_session.rb +4 -0
  74. data/lib/inspec/resources/mssql_sys_conf.rb +7 -0
  75. data/lib/inspec/resources/mysql_conf.rb +4 -0
  76. data/lib/inspec/resources/mysql_session.rb +8 -1
  77. data/lib/inspec/resources/nginx.rb +6 -1
  78. data/lib/inspec/resources/nginx_conf.rb +4 -0
  79. data/lib/inspec/resources/noop.rb +4 -0
  80. data/lib/inspec/resources/npm.rb +4 -0
  81. data/lib/inspec/resources/ntp_conf.rb +4 -0
  82. data/lib/inspec/resources/oneget.rb +4 -0
  83. data/lib/inspec/resources/opa_api.rb +10 -0
  84. data/lib/inspec/resources/opa_cli.rb +14 -0
  85. data/lib/inspec/resources/oracledb_conf.rb +5 -0
  86. data/lib/inspec/resources/oracledb_listener_conf.rb +4 -0
  87. data/lib/inspec/resources/oracledb_session.rb +10 -0
  88. data/lib/inspec/resources/os.rb +4 -0
  89. data/lib/inspec/resources/os_env.rb +4 -0
  90. data/lib/inspec/resources/package.rb +4 -0
  91. data/lib/inspec/resources/parse_config.rb +10 -1
  92. data/lib/inspec/resources/php_config.rb +72 -0
  93. data/lib/inspec/resources/pip.rb +4 -0
  94. data/lib/inspec/resources/platform.rb +4 -0
  95. data/lib/inspec/resources/postfix_conf.rb +4 -0
  96. data/lib/inspec/resources/postgres_conf.rb +4 -0
  97. data/lib/inspec/resources/postgres_session.rb +8 -4
  98. data/lib/inspec/resources/powershell.rb +4 -0
  99. data/lib/inspec/resources/processes.rb +17 -4
  100. data/lib/inspec/resources/rabbitmq_config.rb +4 -0
  101. data/lib/inspec/resources/registry_key.rb +4 -0
  102. data/lib/inspec/resources/security_identifier.rb +4 -0
  103. data/lib/inspec/resources/security_policy.rb +4 -0
  104. data/lib/inspec/resources/service.rb +80 -1
  105. data/lib/inspec/resources/ssh_config.rb +4 -0
  106. data/lib/inspec/resources/sybase_conf.rb +4 -0
  107. data/lib/inspec/resources/sybase_session.rb +4 -0
  108. data/lib/inspec/resources/sys_info.rb +4 -0
  109. data/lib/inspec/resources/timezone.rb +4 -0
  110. data/lib/inspec/resources/users.rb +4 -0
  111. data/lib/inspec/resources/vbscript.rb +5 -0
  112. data/lib/inspec/resources/virtualization.rb +4 -0
  113. data/lib/inspec/resources/windows_feature.rb +5 -1
  114. data/lib/inspec/resources/windows_firewall.rb +4 -0
  115. data/lib/inspec/resources/windows_firewall_rule.rb +4 -0
  116. data/lib/inspec/resources/windows_hotfix.rb +4 -0
  117. data/lib/inspec/resources/windows_task.rb +4 -0
  118. data/lib/inspec/resources/wmi.rb +4 -0
  119. data/lib/inspec/resources/x509_certificate.rb +59 -0
  120. data/lib/inspec/resources/x509_private_key.rb +93 -0
  121. data/lib/inspec/resources/yum.rb +4 -0
  122. data/lib/inspec/resources/zfs.rb +48 -0
  123. data/lib/inspec/resources/zfs_dataset.rb +4 -0
  124. data/lib/inspec/resources/zfs_pool.rb +4 -0
  125. data/lib/inspec/rule.rb +1 -1
  126. data/lib/inspec/secrets/yaml.rb +7 -1
  127. data/lib/inspec/ui.rb +1 -0
  128. data/lib/inspec/utils/yaml_profile_summary.rb +34 -0
  129. data/lib/inspec/version.rb +1 -1
  130. data/lib/plugins/inspec-reporter-html2/templates/body.html.erb +4 -4
  131. data/lib/plugins/inspec-reporter-html2/templates/control.html.erb +1 -1
  132. data/lib/plugins/inspec-reporter-html2/templates/profile.html.erb +1 -1
  133. data/lib/plugins/{inspec-artifact/inspec-artifact.gemspec → inspec-sign/inspec-sign.gemspec} +2 -2
  134. data/lib/plugins/inspec-sign/lib/inspec-sign/base.rb +161 -0
  135. data/lib/plugins/{inspec-artifact/lib/inspec-artifact → inspec-sign/lib/inspec-sign}/cli.rb +14 -23
  136. data/lib/plugins/inspec-sign/lib/inspec-sign.rb +12 -0
  137. data/lib/source_readers/inspec.rb +8 -2
  138. metadata +16 -8
  139. data/lib/plugins/inspec-artifact/lib/inspec-artifact/base.rb +0 -187
  140. data/lib/plugins/inspec-artifact/lib/inspec-artifact.rb +0 -12
@@ -63,6 +63,10 @@ module Inspec::Resources
63
63
  params["Bonding Mode"].first
64
64
  end
65
65
 
66
+ def resource_id
67
+ @path || "bond"
68
+ end
69
+
66
70
  def to_s
67
71
  "Bond #{@bond}"
68
72
  end
@@ -45,6 +45,10 @@ module Inspec::Resources
45
45
  bridge_info.nil? ? nil : bridge_info[:interfaces]
46
46
  end
47
47
 
48
+ def resource_id
49
+ @bridge_name || "bridge"
50
+ end
51
+
48
52
  def to_s
49
53
  "Bridge #{@bridge_name}"
50
54
  end
@@ -31,6 +31,11 @@ module Inspec::Resources
31
31
  super(@conf_path)
32
32
  end
33
33
 
34
+ # if system unables to determine the cassandra conf path the @conf_path can be nil so in that case sending "" string as resource_id
35
+ def resource_id
36
+ @conf_path || "cassandradb_conf"
37
+ end
38
+
34
39
  private
35
40
 
36
41
  def parse(content)
@@ -1,10 +1,11 @@
1
1
  module Inspec::Resources
2
2
  class Lines
3
- attr_reader :output
3
+ attr_reader :output, :exit_status
4
4
 
5
- def initialize(raw, desc)
5
+ def initialize(raw, desc, exit_status)
6
6
  @output = raw
7
7
  @desc = desc
8
+ @exit_status = exit_status
8
9
  end
9
10
 
10
11
  def to_s
@@ -40,10 +41,14 @@ module Inspec::Resources
40
41
  if cmd.exit_status != 0 || out =~ /Unable to connect to any servers/ || out.downcase =~ /^error:.*/
41
42
  raise Inspec::Exceptions::ResourceFailed, "Cassandra query with errors: #{out}"
42
43
  else
43
- Lines.new(cmd.stdout.strip, "Cassandra query: #{q}")
44
+ Lines.new(cmd.stdout.strip, "Cassandra query: #{q}", cmd.exit_status)
44
45
  end
45
46
  end
46
47
 
48
+ def resource_id
49
+ "cassandradb_session:User:#{@user}:Host:#{host}"
50
+ end
51
+
47
52
  def to_s
48
53
  "Cassandra DB Session"
49
54
  end
@@ -45,6 +45,10 @@ module Inspec::Resources
45
45
  end
46
46
  end
47
47
 
48
+ def resource_id
49
+ @package_name || "chocolatey_package"
50
+ end
51
+
48
52
  def to_s
49
53
  "Chocolatey package #{package_name}"
50
54
  end
@@ -34,6 +34,10 @@ module Inspec::Resources
34
34
  param
35
35
  end
36
36
 
37
+ def resource_id
38
+ @conf_path || "chrony_conf"
39
+ end
40
+
37
41
  def to_s
38
42
  "chrony.conf"
39
43
  end
@@ -93,6 +93,11 @@ module Inspec::Resources
93
93
  res.exit_status.to_i == 0
94
94
  end
95
95
 
96
+ # to_s method outputs the command which we are using here as UUID to identify resource and also it take cares of Redact output
97
+ def resource_id
98
+ to_s || "command"
99
+ end
100
+
96
101
  def to_s
97
102
  output = "Command: `#{@command}`"
98
103
  # Redact output if the `redact_regex` option is passed
@@ -51,6 +51,10 @@ module Inspec::Resources
51
51
  info[:version]
52
52
  end
53
53
 
54
+ def resource_id
55
+ @package_name || "cpan"
56
+ end
57
+
54
58
  def to_s
55
59
  "Perl Module #{@package_name}"
56
60
  end
@@ -57,6 +57,10 @@ module Inspec::Resources
57
57
  info[:version]
58
58
  end
59
59
 
60
+ def resource_id
61
+ @package_name || "cran"
62
+ end
63
+
60
64
  def to_s
61
65
  "R Module #{@package_name}"
62
66
  end
@@ -38,6 +38,11 @@ module Inspec::Resources
38
38
  @params.include?(rule)
39
39
  end
40
40
 
41
+ def resource_id
42
+ user = @user || "current user"
43
+ "cron #{user}"
44
+ end
45
+
41
46
  def to_s
42
47
  if is_user_crontab?
43
48
  "cron for user #{@user}"
@@ -19,7 +19,8 @@ module Inspec::Resources
19
19
 
20
20
  def initialize(path, headers = true)
21
21
  @headers = headers
22
- super(path)
22
+ @path = path
23
+ super(@path)
23
24
  end
24
25
 
25
26
  # override the parse method from JsonConfig
@@ -68,6 +69,10 @@ module Inspec::Resources
68
69
  end
69
70
  end
70
71
 
72
+ def resource_id
73
+ @path || "csv"
74
+ end
75
+
71
76
  private
72
77
 
73
78
  # used by JsonConfig to build up a full to_s method
@@ -0,0 +1,61 @@
1
+ require "inspec/resources/command"
2
+ require_relative "routing_table"
3
+
4
+ module Inspec::Resources
5
+ class Defaultgateway < Routingtable
6
+ # resource internal name.
7
+ name "default_gateway"
8
+
9
+ # Restrict to only run on the below platforms (if none were given,
10
+ # all OS's and cloud API's supported)
11
+ supports platform: "unix"
12
+ supports platform: "windows"
13
+
14
+ desc "Use the `default_gateway` Chef InSpec audit resource to test the assigned ip address and interface for the default route."
15
+
16
+ example <<~EXAMPLE
17
+ describe default_gateway do
18
+ its(:ipaddress) { should eq '172.31.80.1' }
19
+ end
20
+ describe default_gateway do
21
+ its("interface") { should eq 'eth0' }
22
+ end
23
+ EXAMPLE
24
+
25
+ def initialize
26
+ skip_resource "The `default_gateway` resource is not yet available on your OS." unless inspec.os.unix? || inspec.os.windows?
27
+ # invoke the routing_table initialize; which populates the @routing_info
28
+ super()
29
+ end
30
+
31
+ # resource appearance in test reports.
32
+ def to_s
33
+ "default_gateway"
34
+ end
35
+
36
+ # fetches the ipaddress assigned to the default gateway
37
+ # default gateway's destination is either `default` or `0.0.0.0`
38
+ def ipaddress
39
+ # @routing_info is the hash populated in routing_table resource
40
+ # @routing_info contain values as:
41
+ # {
42
+ # destination1: [ [gateway1x, interface1x], [gateway1y, interface1y] ],
43
+ # destination2: [gateway2, interface2]
44
+ # }
45
+ %w{default 0.0.0.0}.each do |destination|
46
+ return @routing_info[destination][0][0] if @routing_info.key?(destination)
47
+ end
48
+ # raise exception because no destination with value default or 0.0.0.0 is found in the routing table
49
+ raise Inspec::Exceptions::ResourceFailed, "No routing found as part of default gateway"
50
+ end
51
+
52
+ # fetches the interface assigned to the default gateway
53
+ def interface
54
+ %w{default 0.0.0.0}.each do |destination|
55
+ return @routing_info[destination][0][1] if @routing_info.key?(destination)
56
+ end
57
+ # raise exception because no destination with value default or 0.0.0.0 is found in the routing table
58
+ raise Inspec::Exceptions::ResourceFailed, "No routing found as part of default gateway"
59
+ end
60
+ end
61
+ end
@@ -76,6 +76,10 @@ module Inspec::Resources
76
76
  @dh_params.params_ok?
77
77
  end
78
78
 
79
+ def resource_id
80
+ @dh_params_path || "dh_params"
81
+ end
82
+
79
83
  def to_s
80
84
  "dh_params #{@dh_params_path}"
81
85
  end
@@ -92,6 +92,10 @@ module Inspec::Resources
92
92
  "Docker Container #{name}"
93
93
  end
94
94
 
95
+ def resource_id
96
+ object_info.ids[0] || @opts[:id] || @opts[:name] || ""
97
+ end
98
+
95
99
  private
96
100
 
97
101
  def object_info
@@ -72,6 +72,10 @@ module Inspec::Resources
72
72
  "Docker Image #{img}"
73
73
  end
74
74
 
75
+ def resource_id
76
+ object_info.ids[0] || @opts[:id] || @opts[:image] || ""
77
+ end
78
+
75
79
  private
76
80
 
77
81
  def sanitize_options(opts)
@@ -50,6 +50,10 @@ module Inspec::Resources
50
50
  "Docker plugin #{plugin}"
51
51
  end
52
52
 
53
+ def resource_id
54
+ id || @opts[:id] || @opts[:name] || ""
55
+ end
56
+
53
57
  private
54
58
 
55
59
  def object_info
@@ -73,6 +73,10 @@ module Inspec::Resources
73
73
  "Docker Service #{service}"
74
74
  end
75
75
 
76
+ def resource_id
77
+ object_info.ids[0] || @opts[:id] || @opts[:name] || ""
78
+ end
79
+
76
80
  private
77
81
 
78
82
  def sanitize_options(opts)
@@ -95,6 +95,10 @@ module Inspec::Resources
95
95
  "/etc/group"
96
96
  end
97
97
 
98
+ def resource_id
99
+ @path
100
+ end
101
+
98
102
  private
99
103
 
100
104
  def parse_group(path)
@@ -37,6 +37,10 @@ module Inspec::Resources
37
37
  "hosts.allow Configuration"
38
38
  end
39
39
 
40
+ def resource_id
41
+ @conf_path
42
+ end
43
+
40
44
  private
41
45
 
42
46
  def read_content
@@ -110,5 +114,6 @@ module Inspec::Resources
110
114
  def to_s
111
115
  "hosts.deny Configuration"
112
116
  end
117
+
113
118
  end
114
119
  end
@@ -35,11 +35,12 @@ module Inspec::Resources
35
35
  end
36
36
  EXAMPLE
37
37
 
38
- attr_reader :file, :mount_options
38
+ attr_reader :file, :mount_options, :path
39
39
  def initialize(path)
40
40
  # select permissions style
41
41
  @perms_provider = select_file_perms_style(inspec.os)
42
42
  @file = inspec.backend.file(path)
43
+ @path = path
43
44
  end
44
45
 
45
46
  %w{
@@ -181,6 +182,34 @@ module Inspec::Resources
181
182
  inv_mode & file.mode != 0
182
183
  end
183
184
 
185
+ def immutable?
186
+ raise Inspec::Exceptions::ResourceSkipped, "The `be_immutable` matcher is not supported on your OS yet." unless inspec.os.unix?
187
+
188
+ if inspec.os.linux?
189
+ file_info = LinuxImmutableFlagCheck.new(inspec, file)
190
+ else
191
+ file_info = UnixImmutableFlagCheck.new(inspec, file)
192
+ end
193
+
194
+ file_info.is_immutable?
195
+ end
196
+
197
+ # parse the json file content and returns the content
198
+ def content_as_json
199
+ require "json" unless defined?(JSON)
200
+ JSON.parse(file.content)
201
+ rescue => e
202
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse the given JSON file: #{e.message}"
203
+ end
204
+
205
+ # parse the yaml file content and returns the content
206
+ def content_as_yaml
207
+ require "yaml" unless defined?(YAML)
208
+ YAML.load(file.content)
209
+ rescue => e
210
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse the given YAML file: #{e.message}"
211
+ end
212
+
184
213
  def to_s
185
214
  if file
186
215
  "File #{source_path}"
@@ -189,6 +218,10 @@ module Inspec::Resources
189
218
  end
190
219
  end
191
220
 
221
+ def resource_id
222
+ path
223
+ end
224
+
192
225
  private
193
226
 
194
227
  def file_permission_granted?(access_type, by_usergroup, by_specific_user)
@@ -373,4 +406,67 @@ module Inspec::Resources
373
406
  end
374
407
  end
375
408
  end
409
+
410
+ # Helper class for immutable matcher.
411
+ class ImmutableFlagCheck
412
+ attr_reader :inspec, :file_path
413
+ def initialize(inspec, file)
414
+ @inspec = inspec
415
+ @file_path = file.path
416
+ end
417
+
418
+ def find_utility_or_error(utility_name)
419
+ [
420
+ "/usr/sbin/#{utility_name}",
421
+ "/sbin/#{utility_name}",
422
+ "/usr/bin/#{utility_name}",
423
+ "/bin/#{utility_name}",
424
+ "#{utility_name}",
425
+ ].each do |cmd|
426
+ return cmd if inspec.command(cmd).exist?
427
+ end
428
+
429
+ raise Inspec::Exceptions::ResourceFailed, "Could not find `#{utility_name}`"
430
+ end
431
+ end
432
+
433
+ class LinuxImmutableFlagCheck < ImmutableFlagCheck
434
+ def is_immutable?
435
+ # Check if lsattr is available. In general, all linux system has lsattr & chattr
436
+ # This logic check is valid for immutable flag set with chattr
437
+ utility = find_utility_or_error("lsattr")
438
+ utility_cmd = inspec.command("#{utility} #{file_path}")
439
+
440
+ raise Inspec::Exceptions::ResourceFailed, "Executing #{utility} #{file_path} failed: #{utility_cmd.stderr}" if utility_cmd.exit_status.to_i != 0
441
+
442
+ # General output for lsattr file_name is:
443
+ # ----i---------e----- file_name
444
+ # The fifth char resembles the immutable flag. Total 20 flags are allowed.
445
+ lsattr_info = utility_cmd.stdout.strip.squeeze(" ")
446
+ lsattr_info =~ /^.{4}i.{15} .*/
447
+ end
448
+ end
449
+
450
+ class UnixImmutableFlagCheck < ImmutableFlagCheck
451
+ def is_immutable?
452
+ # Check if chflags is available on the system. Most unix-like system comes with chflags.
453
+ # This logic check is valid for immutable flag set with chflags
454
+ find_utility_or_error("chflags")
455
+
456
+ # In general ls -lO is used to check immutable flag set by chflags
457
+ utility_cmd = inspec.command("ls -lO #{file_path}")
458
+
459
+ # But on some bsd system (eg: freebsd) ls -lo is used instead of ls -lO
460
+ utility_cmd = inspec.command("ls -lo #{file_path}") if utility_cmd.exit_status.to_i != 0
461
+
462
+ raise Inspec::Exceptions::ResourceFailed, "Executing ls -lo #{file_path} and ls -lO #{file_path} failed: #{utility_cmd.stderr}" if utility_cmd.exit_status.to_i != 0
463
+
464
+ # General output for ls -lO file_name is:
465
+ # -rw-r--r-- 1 current_user 1083951318 uchg 0 Apr 6 12:45 file_name
466
+ # The schg flag and the uchg flag represents the immutable flags
467
+ # uchg => user immutable flag, schg => system immutable flag.
468
+ file_info = utility_cmd.stdout.strip.split
469
+ file_info.include?("uchg") || file_info.include?("schg")
470
+ end
471
+ end
376
472
  end
@@ -84,6 +84,10 @@ module Inspec::Resources
84
84
  info = @fsman.info(@partition)
85
85
  info[:name]
86
86
  end
87
+
88
+ def resource_id
89
+ partition
90
+ end
87
91
  end
88
92
 
89
93
  class FsManagement
@@ -76,5 +76,9 @@ module Inspec::Resources
76
76
  def to_s
77
77
  "gem package #{@package_name}"
78
78
  end
79
+
80
+ def resource_id
81
+ "#{@package_name}-#{version}"
82
+ end
79
83
  end
80
84
  end
@@ -145,10 +145,19 @@ module Inspec::Resources
145
145
  true
146
146
  end
147
147
 
148
+ # matcher equivalent to gid property.
149
+ def has_gid?(gid_value)
150
+ gid_value == gid
151
+ end
152
+
148
153
  def to_s
149
154
  "Group #{@group}"
150
155
  end
151
156
 
157
+ def resource_id
158
+ gid ? "#{@group}-#{gid}" : ""
159
+ end
160
+
152
161
  private
153
162
 
154
163
  def flatten_entry(group_info, prop)
@@ -69,6 +69,10 @@ module Inspec::Resources
69
69
  "Grub Config"
70
70
  end
71
71
 
72
+ def resource_id
73
+ @conf_path
74
+ end
75
+
72
76
  private
73
77
 
74
78
  ######################################################################
@@ -113,6 +113,16 @@ module Inspec::Resources
113
113
  resolve.nil? || resolve.empty? ? nil : resolve
114
114
  end
115
115
 
116
+ # returns an array of the ipv4 addresses
117
+ def ipv4_address
118
+ ipaddress.select { |ip| ip.match(Resolv::IPv4::Regex) }
119
+ end
120
+
121
+ # returns an array of the ipv6 addresses
122
+ def ipv6_address
123
+ ipaddress.select { |ip| ip.match(Resolv::IPv6::Regex) }
124
+ end
125
+
116
126
  def to_s
117
127
  resource_name = "Host #{hostname}"
118
128
  resource_name += " port #{port} proto #{protocol}" if port
@@ -120,6 +130,10 @@ module Inspec::Resources
120
130
  resource_name
121
131
  end
122
132
 
133
+ def resource_id
134
+ port ? "#{hostname}-#{port}-#{protocol}" : hostname
135
+ end
136
+
123
137
  private
124
138
 
125
139
  def ping
@@ -296,15 +310,44 @@ module Inspec::Resources
296
310
  end
297
311
 
298
312
  def resolve(hostname)
313
+ addresses = []
314
+ # -Type A is the DNS query for IPv4 server Address.
299
315
  cmd = inspec.command("Resolve-DnsName –Type A #{hostname} | ConvertTo-Json")
300
316
  begin
301
- resolv = JSON.parse(cmd.stdout)
317
+ resolve_ipv4 = JSON.parse(cmd.stdout)
302
318
  rescue JSON::ParserError => _e
303
319
  return nil
304
320
  end
305
321
 
306
- resolv = [resolv] unless resolv.is_a?(Array)
307
- resolv.map { |entry| entry["IPAddress"] }
322
+ resolve_ipv4 = resolve_ipv4.inject(:merge) if resolve_ipv4.is_a?(Array)
323
+
324
+ # Append the ipv4 addresses
325
+ resolve_ipv4.each_value do |ip|
326
+ matched = ip.to_s.chomp.match(Resolv::IPv4::Regex)
327
+ next if matched.nil? || addresses.include?(matched.to_s)
328
+
329
+ addresses << matched.to_s
330
+ end
331
+
332
+ # -Type AAAA is the DNS query for IPv6 server Address.
333
+ cmd = inspec.command("Resolve-DnsName –Type AAAA #{hostname} | ConvertTo-Json")
334
+ begin
335
+ resolve_ipv6 = JSON.parse(cmd.stdout)
336
+ rescue JSON::ParserError => _e
337
+ return nil
338
+ end
339
+
340
+ resolve_ipv6 = resolve_ipv6.inject(:merge) if resolve_ipv6.is_a?(Array)
341
+
342
+ # Append the ipv6 addresses
343
+ resolve_ipv6.each_value do |ip|
344
+ matched = ip.to_s.chomp.match(Resolv::IPv6::Regex)
345
+ next if matched.nil? || addresses.include?(matched.to_s)
346
+
347
+ addresses << matched.to_s
348
+ end
349
+
350
+ addresses
308
351
  end
309
352
  end
310
353
  end
@@ -83,6 +83,10 @@ module Inspec::Resources
83
83
  @response = nil
84
84
  end
85
85
 
86
+ def resource_id
87
+ @url
88
+ end
89
+
86
90
  private
87
91
 
88
92
  def params
@@ -24,6 +24,14 @@ module Inspec::Resources
24
24
  @output = run_command
25
25
  end
26
26
 
27
+ def resource_id
28
+ if inspec.os.platform?("windows")
29
+ "ibmdb2_conf"
30
+ else
31
+ "ibmdb2_conf:DatabaseInstance:#{@db_instance}"
32
+ end
33
+ end
34
+
27
35
  def to_s
28
36
  "IBM Db2 Conf"
29
37
  end
@@ -1,10 +1,11 @@
1
1
  module Inspec::Resources
2
2
  class Lines
3
- attr_reader :output
3
+ attr_reader :output, :exit_status
4
4
 
5
- def initialize(raw, desc)
5
+ def initialize(raw, desc, exit_status)
6
6
  @output = raw
7
7
  @desc = desc
8
+ @exit_status = exit_status
8
9
  end
9
10
 
10
11
  def to_s
@@ -58,7 +59,15 @@ module Inspec::Resources
58
59
  if cmd.exit_status != 0 || out =~ /Can't connect to IBM Db2 / || out.downcase =~ /^error:.*/
59
60
  raise Inspec::Exceptions::ResourceFailed, "IBM Db2 connection error: #{out}"
60
61
  else
61
- Lines.new(cmd.stdout.strip, "IBM Db2 Query: #{q}")
62
+ Lines.new(cmd.stdout.strip, "IBM Db2 Query: #{q}", cmd.exit_status)
63
+ end
64
+ end
65
+
66
+ def resource_id
67
+ if inspec.os.platform?("windows")
68
+ "ibmdb2_session:DatabaseName#{@db_name}"
69
+ else
70
+ "ibmdb2_session:DatabaseInstance:#{@db_instance}:DatabaseName#{@db_name}"
62
71
  end
63
72
  end
64
73
 
@@ -72,6 +72,10 @@ module Inspec::Resources
72
72
  "iis_app '#{@site_name}#{@path}'"
73
73
  end
74
74
 
75
+ def resource_id
76
+ @path
77
+ end
78
+
75
79
  private
76
80
 
77
81
  def iis_app
@@ -80,6 +80,10 @@ module Inspec::Resources
80
80
  "IIS App Pool '#{@pool_name}'"
81
81
  end
82
82
 
83
+ def resource_id
84
+ @pool_name
85
+ end
86
+
83
87
  private
84
88
 
85
89
  def iis_app_pool
@@ -77,6 +77,10 @@ module Inspec::Resources
77
77
  iis_site.nil? ? false : (iis_site[:bindings].include? binding)
78
78
  end
79
79
 
80
+ def resource_id
81
+ @site_name || "IIS Site"
82
+ end
83
+
80
84
  def to_s
81
85
  "iis_site '#{@site_name}'"
82
86
  end
@@ -46,6 +46,10 @@ module Inspec::Resources
46
46
  @params = conf.params
47
47
  end
48
48
 
49
+ def resource_id
50
+ @conf_path || "inetd.conf"
51
+ end
52
+
49
53
  def to_s
50
54
  "inetd.conf"
51
55
  end