inspec 2.2.55 → 2.2.61

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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -8
  3. data/docs/resources/aide_conf.md.erb +10 -0
  4. data/docs/resources/apache.md.erb +10 -0
  5. data/docs/resources/apache_conf.md.erb +10 -0
  6. data/docs/resources/apt.md.erb +10 -0
  7. data/docs/resources/audit_policy.md.erb +10 -0
  8. data/docs/resources/auditd.md.erb +10 -0
  9. data/docs/resources/auditd_conf.md.erb +10 -0
  10. data/docs/resources/aws_cloudtrail_trail.md.erb +10 -0
  11. data/docs/resources/aws_cloudtrail_trails.md.erb +10 -0
  12. data/docs/resources/aws_cloudwatch_alarm.md.erb +10 -0
  13. data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +10 -0
  14. data/docs/resources/aws_config_delivery_channel.md.erb +10 -0
  15. data/docs/resources/aws_config_recorder.md.erb +10 -0
  16. data/docs/resources/aws_ec2_instance.md.erb +10 -0
  17. data/docs/resources/aws_ec2_instances.md.erb +10 -0
  18. data/docs/resources/aws_elb.md.erb +10 -0
  19. data/docs/resources/aws_elbs.md.erb +10 -0
  20. data/docs/resources/aws_flow_log.md.erb +10 -0
  21. data/docs/resources/aws_iam_access_key.md.erb +10 -0
  22. data/docs/resources/aws_iam_access_keys.md.erb +10 -0
  23. data/docs/resources/aws_iam_group.md.erb +10 -0
  24. data/docs/resources/aws_iam_groups.md.erb +10 -0
  25. data/docs/resources/aws_iam_password_policy.md.erb +10 -0
  26. data/docs/resources/aws_iam_policies.md.erb +10 -0
  27. data/docs/resources/aws_iam_policy.md.erb +10 -0
  28. data/docs/resources/aws_iam_role.md.erb +10 -0
  29. data/docs/resources/aws_iam_root_user.md.erb +10 -0
  30. data/docs/resources/aws_iam_user.md.erb +10 -0
  31. data/docs/resources/aws_iam_users.md.erb +10 -0
  32. data/docs/resources/aws_kms_key.md.erb +10 -0
  33. data/docs/resources/aws_kms_keys.md.erb +10 -0
  34. data/docs/resources/aws_rds_instance.md.erb +10 -0
  35. data/docs/resources/aws_route_table.md.erb +10 -0
  36. data/docs/resources/aws_route_tables.md.erb +10 -0
  37. data/docs/resources/aws_s3_bucket.md.erb +10 -0
  38. data/docs/resources/aws_s3_bucket_object.md.erb +10 -0
  39. data/docs/resources/aws_s3_buckets.md.erb +10 -0
  40. data/docs/resources/aws_security_group.md.erb +10 -0
  41. data/docs/resources/aws_security_groups.md.erb +10 -0
  42. data/docs/resources/aws_sns_subscription.md.erb +10 -0
  43. data/docs/resources/aws_sns_topic.md.erb +10 -0
  44. data/docs/resources/aws_sns_topics.md.erb +10 -0
  45. data/docs/resources/aws_subnet.md.erb +10 -0
  46. data/docs/resources/aws_subnets.md.erb +10 -0
  47. data/docs/resources/aws_vpc.md.erb +10 -0
  48. data/docs/resources/aws_vpcs.md.erb +10 -0
  49. data/docs/resources/azure_generic_resource.md.erb +10 -0
  50. data/docs/resources/azure_resource_group.md.erb +10 -0
  51. data/docs/resources/azure_virtual_machine.md.erb +10 -0
  52. data/docs/resources/azure_virtual_machine_data_disk.md.erb +10 -0
  53. data/docs/resources/bash.md.erb +10 -0
  54. data/docs/resources/bond.md.erb +10 -0
  55. data/docs/resources/bridge.md.erb +10 -0
  56. data/docs/resources/bsd_service.md.erb +10 -0
  57. data/docs/resources/chocolatey_package.md.erb +10 -0
  58. data/docs/resources/command.md.erb +10 -0
  59. data/docs/resources/cpan.md.erb +10 -0
  60. data/docs/resources/cran.md.erb +10 -0
  61. data/docs/resources/crontab.md.erb +10 -0
  62. data/docs/resources/csv.md.erb +10 -0
  63. data/docs/resources/dh_params.md.erb +10 -0
  64. data/docs/resources/directory.md.erb +10 -0
  65. data/docs/resources/docker.md.erb +21 -0
  66. data/docs/resources/docker_container.md.erb +10 -0
  67. data/docs/resources/docker_image.md.erb +10 -0
  68. data/docs/resources/docker_plugin.md.erb +80 -0
  69. data/docs/resources/docker_service.md.erb +10 -0
  70. data/docs/resources/elasticsearch.md.erb +10 -0
  71. data/docs/resources/etc_fstab.md.erb +10 -0
  72. data/docs/resources/etc_group.md.erb +10 -0
  73. data/docs/resources/etc_hosts.md.erb +10 -0
  74. data/docs/resources/etc_hosts_allow.md.erb +10 -0
  75. data/docs/resources/etc_hosts_deny.md.erb +10 -0
  76. data/docs/resources/file.md.erb +10 -0
  77. data/docs/resources/filesystem.md.erb +10 -0
  78. data/docs/resources/firewalld.md.erb +10 -0
  79. data/docs/resources/gem.md.erb +10 -0
  80. data/docs/resources/group.md.erb +10 -0
  81. data/docs/resources/grub_conf.md.erb +10 -0
  82. data/docs/resources/host.md.erb +10 -0
  83. data/docs/resources/http.md.erb +10 -0
  84. data/docs/resources/iis_app.md.erb +10 -0
  85. data/docs/resources/iis_site.md.erb +10 -0
  86. data/docs/resources/inetd_conf.md.erb +10 -0
  87. data/docs/resources/ini.md.erb +10 -0
  88. data/docs/resources/interface.md.erb +10 -0
  89. data/docs/resources/iptables.md.erb +10 -0
  90. data/docs/resources/json.md.erb +10 -0
  91. data/docs/resources/kernel_module.md.erb +10 -0
  92. data/docs/resources/kernel_parameter.md.erb +10 -0
  93. data/docs/resources/key_rsa.md.erb +10 -0
  94. data/docs/resources/launchd_service.md.erb +10 -0
  95. data/docs/resources/limits_conf.md.erb +10 -0
  96. data/docs/resources/login_defs.md.erb +10 -0
  97. data/docs/resources/mount.md.erb +10 -0
  98. data/docs/resources/mssql_session.md.erb +10 -0
  99. data/docs/resources/mysql_conf.md.erb +10 -0
  100. data/docs/resources/mysql_session.md.erb +10 -0
  101. data/docs/resources/nginx.md.erb +10 -0
  102. data/docs/resources/nginx_conf.md.erb +10 -0
  103. data/docs/resources/npm.md.erb +10 -0
  104. data/docs/resources/ntp_conf.md.erb +10 -0
  105. data/docs/resources/oneget.md.erb +10 -0
  106. data/docs/resources/oracledb_session.md.erb +10 -0
  107. data/docs/resources/os.md.erb +10 -0
  108. data/docs/resources/os_env.md.erb +10 -0
  109. data/docs/resources/package.md.erb +10 -0
  110. data/docs/resources/packages.md.erb +10 -0
  111. data/docs/resources/parse_config.md.erb +10 -0
  112. data/docs/resources/parse_config_file.md.erb +10 -0
  113. data/docs/resources/passwd.md.erb +10 -0
  114. data/docs/resources/pip.md.erb +10 -0
  115. data/docs/resources/port.md.erb +10 -0
  116. data/docs/resources/postgres_conf.md.erb +10 -0
  117. data/docs/resources/postgres_hba_conf.md.erb +10 -0
  118. data/docs/resources/postgres_ident_conf.md.erb +10 -0
  119. data/docs/resources/postgres_session.md.erb +10 -0
  120. data/docs/resources/powershell.md.erb +10 -0
  121. data/docs/resources/processes.md.erb +10 -0
  122. data/docs/resources/rabbitmq_config.md.erb +10 -0
  123. data/docs/resources/registry_key.md.erb +38 -2
  124. data/docs/resources/runit_service.md.erb +10 -0
  125. data/docs/resources/security_policy.md.erb +10 -0
  126. data/docs/resources/service.md.erb +10 -0
  127. data/docs/resources/shadow.md.erb +10 -0
  128. data/docs/resources/ssh_config.md.erb +10 -0
  129. data/docs/resources/sshd_config.md.erb +10 -0
  130. data/docs/resources/ssl.md.erb +10 -0
  131. data/docs/resources/sys_info.md.erb +10 -0
  132. data/docs/resources/systemd_service.md.erb +10 -0
  133. data/docs/resources/sysv_service.md.erb +10 -0
  134. data/docs/resources/upstart_service.md.erb +10 -0
  135. data/docs/resources/user.md.erb +10 -0
  136. data/docs/resources/users.md.erb +10 -0
  137. data/docs/resources/vbscript.md.erb +10 -0
  138. data/docs/resources/virtualization.md.erb +10 -0
  139. data/docs/resources/windows_feature.md.erb +10 -0
  140. data/docs/resources/windows_hotfix.md.erb +10 -0
  141. data/docs/resources/windows_task.md.erb +10 -0
  142. data/docs/resources/wmi.md.erb +10 -0
  143. data/docs/resources/x509_certificate.md.erb +10 -0
  144. data/docs/resources/xinetd_conf.md.erb +10 -0
  145. data/docs/resources/xml.md.erb +10 -0
  146. data/docs/resources/yaml.md.erb +10 -0
  147. data/docs/resources/yum.md.erb +10 -0
  148. data/docs/resources/zfs_dataset.md.erb +10 -0
  149. data/docs/resources/zfs_pool.md.erb +10 -0
  150. data/lib/inspec/base_cli.rb +2 -2
  151. data/lib/inspec/cli.rb +3 -2
  152. data/lib/inspec/resource.rb +2 -0
  153. data/lib/inspec/runner.rb +2 -4
  154. data/lib/inspec/version.rb +1 -1
  155. data/lib/resource_support/aws.rb +1 -0
  156. data/lib/resources/aws/aws_ecs_cluster.rb +84 -0
  157. data/lib/resources/aws/aws_route_table.rb +3 -3
  158. data/lib/resources/docker.rb +34 -0
  159. data/lib/resources/docker_plugin.rb +63 -0
  160. data/lib/resources/iis_app_pool.rb +116 -0
  161. metadata +6 -2
@@ -67,6 +67,8 @@ module Inspec
67
67
  def self.profile_options
68
68
  option :profiles_path, type: :string,
69
69
  desc: 'Folder which contains referenced profiles.'
70
+ option :vendor_cache, type: :string,
71
+ desc: 'Use the given path for caching dependencies. (default: ~/.inspec/cache)'
70
72
  end
71
73
 
72
74
  def self.exec_options
@@ -83,8 +85,6 @@ module Inspec
83
85
  desc: 'Use colors in output.'
84
86
  option :attrs, type: :array,
85
87
  desc: 'Load attributes file (experimental)'
86
- option :vendor_cache, type: :string,
87
- desc: 'Use the given path for caching dependencies. (default: ~/.inspec/cache)'
88
88
  option :create_lockfile, type: :boolean,
89
89
  desc: 'Write out a lockfile based on this execution (unless one already exists)'
90
90
  option :backend_cache, type: :boolean,
@@ -34,9 +34,9 @@ class Inspec::InspecCLI < Inspec::BaseCLI
34
34
  def json(target)
35
35
  o = opts.dup
36
36
  diagnose(o)
37
- o[:ignore_supports] = true
38
37
  o[:backend] = Inspec::Backend.create(target: 'mock://')
39
38
  o[:check_mode] = true
39
+ o[:vendor_cache] = Inspec::Cache.new(o[:vendor_cache])
40
40
 
41
41
  profile = Inspec::Profile.for_target(target, o)
42
42
  info = profile.info
@@ -67,9 +67,9 @@ class Inspec::InspecCLI < Inspec::BaseCLI
67
67
  def check(path) # rubocop:disable Metrics/AbcSize
68
68
  o = opts.dup
69
69
  diagnose(o)
70
- o[:ignore_supports] = true # we check for integrity only
71
70
  o[:backend] = Inspec::Backend.create(target: 'mock://')
72
71
  o[:check_mode] = true
72
+ o[:vendor_cache] = Inspec::Cache.new(o[:vendor_cache])
73
73
 
74
74
  # run check
75
75
  profile = Inspec::Profile.for_target(path, o)
@@ -140,6 +140,7 @@ class Inspec::InspecCLI < Inspec::BaseCLI
140
140
  o[:logger] = Logger.new(STDOUT)
141
141
  o[:logger].level = get_log_level(o.log_level)
142
142
  o[:backend] = Inspec::Backend.create(target: 'mock://')
143
+ o[:vendor_cache] = Inspec::Cache.new(o[:vendor_cache])
143
144
 
144
145
  profile = Inspec::Profile.for_target(path, o)
145
146
  result = profile.check
@@ -128,6 +128,7 @@ require 'resources/directory'
128
128
  require 'resources/docker'
129
129
  require 'resources/docker_container'
130
130
  require 'resources/docker_image'
131
+ require 'resources/docker_plugin'
131
132
  require 'resources/docker_service'
132
133
  require 'resources/elasticsearch'
133
134
  require 'resources/etc_fstab'
@@ -143,6 +144,7 @@ require 'resources/grub_conf'
143
144
  require 'resources/host'
144
145
  require 'resources/http'
145
146
  require 'resources/iis_app'
147
+ require 'resources/iis_app_pool'
146
148
  require 'resources/iis_site'
147
149
  require 'resources/inetd_conf'
148
150
  require 'resources/interface'
@@ -39,7 +39,6 @@ module Inspec
39
39
  @target_profiles = []
40
40
  @controls = @conf[:controls] || []
41
41
  @depends = @conf[:depends] || []
42
- @ignore_supports = @conf[:ignore_supports]
43
42
  @create_lockfile = @conf[:create_lockfile]
44
43
  @cache = Inspec::Cache.new(@conf[:vendor_cache])
45
44
 
@@ -108,7 +107,8 @@ module Inspec
108
107
  return if @conf['reporter'].nil?
109
108
 
110
109
  @conf['reporter'].each do |reporter|
111
- Inspec::Reporters.render(reporter, run_data)
110
+ result = Inspec::Reporters.render(reporter, run_data)
111
+ raise Inspec::ReporterError, "Error generating reporter '#{reporter[0]}'" if result == false
112
112
  end
113
113
  end
114
114
 
@@ -196,8 +196,6 @@ module Inspec
196
196
  end
197
197
 
198
198
  def supports_profile?(profile)
199
- return true if @ignore_supports
200
-
201
199
  if !profile.supports_runtime?
202
200
  raise 'This profile requires InSpec version '\
203
201
  "#{profile.metadata.inspec_requirement}. You are running "\
@@ -4,5 +4,5 @@
4
4
  # author: Christoph Hartmann
5
5
 
6
6
  module Inspec
7
- VERSION = '2.2.55'
7
+ VERSION = '2.2.61'
8
8
  end
@@ -21,6 +21,7 @@ require 'resources/aws/aws_config_recorder'
21
21
  require 'resources/aws/aws_ec2_instance'
22
22
  require 'resources/aws/aws_flow_log'
23
23
  require 'resources/aws/aws_ec2_instances'
24
+ require 'resources/aws/aws_ecs_cluster'
24
25
  require 'resources/aws/aws_elb'
25
26
  require 'resources/aws/aws_elbs'
26
27
  require 'resources/aws/aws_iam_access_key'
@@ -0,0 +1,84 @@
1
+ class AwsEcsCluster < Inspec.resource(1)
2
+ name 'aws_ecs_cluster'
3
+ desc 'Verifies settings for an ECS cluster'
4
+
5
+ example <<-EOX
6
+ describe aws_ecs_cluster('default') do
7
+ it { should exist }
8
+ end
9
+ EOX
10
+ supports platform: 'aws'
11
+
12
+ include AwsSingularResourceMixin
13
+ attr_reader :cluster_arn, :cluster_name, :status,
14
+ :registered_container_instances_count, :running_tasks_count,
15
+ :pending_tasks_count, :active_services_count, :statistics
16
+
17
+ def to_s
18
+ "AWS ECS cluster #{cluster_name}"
19
+ end
20
+
21
+ private
22
+
23
+ def validate_params(raw_params)
24
+ validated_params = check_resource_param_names(
25
+ raw_params: raw_params,
26
+ allowed_params: [:cluster_name],
27
+ allowed_scalar_name: :cluster_name,
28
+ allowed_scalar_type: String,
29
+ )
30
+
31
+ validated_params
32
+ end
33
+
34
+ def fetch_from_api
35
+ backend = BackendFactory.create(inspec_runner)
36
+ begin
37
+ # Use default cluster if no cluster name is specified
38
+ params = cluster_name.nil? ? {} : { clusters: [cluster_name] }
39
+ clusters = backend.describe_clusters(params).clusters
40
+
41
+ # Cluster name is unique, we either get back one cluster, or none
42
+ if clusters.length == 1
43
+ @exists = true
44
+ unpack_describe_clusters_response(clusters.first)
45
+ else
46
+ @exists = false
47
+ populate_as_missing
48
+ end
49
+ end
50
+ end
51
+
52
+ def unpack_describe_clusters_response(cluster_struct)
53
+ @cluster_arn = cluster_struct.cluster_arn
54
+ @cluster_name = cluster_struct.cluster_name
55
+ @status = cluster_struct.status
56
+ @registered_container_instances_count = cluster_struct.registered_container_instances_count
57
+ @running_tasks_count = cluster_struct.running_tasks_count
58
+ @pending_tasks_count = cluster_struct.pending_tasks_count
59
+ @active_services_count = cluster_struct.active_services_count
60
+ @statistics = cluster_struct.statistics
61
+ end
62
+
63
+ def populate_as_missing
64
+ @cluster_arn = ''
65
+ @cluster_name = ''
66
+ @status = ''
67
+ @registered_container_instances_count = 0
68
+ @running_tasks_count = 0
69
+ @pending_tasks_count = 0
70
+ @active_services_count = 0
71
+ @statistics = []
72
+ end
73
+
74
+ class Backend
75
+ class AwsClientApi < AwsBackendBase
76
+ BackendFactory.set_default_backend(self)
77
+ self.aws_client_class = Aws::ECS::Client
78
+
79
+ def describe_clusters(query = {})
80
+ aws_service_client.describe_clusters(query)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -3,7 +3,7 @@ class AwsRouteTable < Inspec.resource(1)
3
3
  desc 'Verifies settings for an AWS Route Table'
4
4
  example "
5
5
  describe aws_route_table do
6
- its('route_table_id') { should cmp 'rtb-2c60ec44' }
6
+ its('route_table_id') { should cmp 'rtb-05462d2278326a79c' }
7
7
  end
8
8
  "
9
9
  supports platform: 'aws'
@@ -27,10 +27,10 @@ class AwsRouteTable < Inspec.resource(1)
27
27
  )
28
28
 
29
29
  if validated_params.key?(:route_table_id) &&
30
- validated_params[:route_table_id] !~ /^rtb\-[0-9a-f]{8}$/
30
+ validated_params[:route_table_id] !~ /^rtb\-([0-9a-f]{17})|(^rtb\-[0-9a-f]{8})$/
31
31
  raise ArgumentError,
32
32
  'aws_route_table Route Table ID must be in the' \
33
- ' format "rtb-" followed by 8 hexadecimal characters.'
33
+ ' format "rtb-" followed by 8 or 17 hexadecimal characters.'
34
34
  end
35
35
 
36
36
  validated_params
@@ -52,6 +52,20 @@ module Inspec::Resources
52
52
  end
53
53
  end
54
54
 
55
+ class DockerPluginFilter
56
+ filter = FilterTable.create
57
+ filter.add(:ids, field: 'id')
58
+ .add(:names, field: 'name')
59
+ .add(:versions, field: 'version')
60
+ .add(:enabled, field: 'enabled')
61
+ filter.connect(self, :plugins)
62
+
63
+ attr_reader :plugins
64
+ def initialize(plugins)
65
+ @plugins = plugins
66
+ end
67
+ end
68
+
55
69
  class DockerServiceFilter
56
70
  filter = FilterTable.create
57
71
  filter.register_custom_matcher(:exists?) { |x| !x.entries.empty? }
@@ -89,6 +103,10 @@ module Inspec::Resources
89
103
  its('repositories') { should_not include 'inssecure_image' }
90
104
  end
91
105
 
106
+ describe docker.plugins.where { name == 'rexray/ebs' } do
107
+ it { should exist }
108
+ end
109
+
92
110
  describe docker.services do
93
111
  its('images') { should_not include 'inssecure_image' }
94
112
  end
@@ -119,6 +137,10 @@ module Inspec::Resources
119
137
  DockerImageFilter.new(parse_images)
120
138
  end
121
139
 
140
+ def plugins
141
+ DockerPluginFilter.new(parse_plugins)
142
+ end
143
+
122
144
  def services
123
145
  DockerServiceFilter.new(parse_services)
124
146
  end
@@ -226,5 +248,17 @@ module Inspec::Resources
226
248
  warn 'Could not parse `docker images` output'
227
249
  []
228
250
  end
251
+
252
+ def parse_plugins
253
+ plugins = inspec.command('docker plugin ls --format \'{"id": {{json .ID}}, "name": "{{ with split .Name ":"}}{{index . 0}}{{end}}", "version": "{{ with split .Name ":"}}{{index . 1}}{{end}}", "enabled": {{json .Enabled}} }\'').stdout
254
+ c_plugins = []
255
+ plugins.each_line { |entry|
256
+ c_plugins.push(JSON.parse(entry))
257
+ }
258
+ c_plugins
259
+ rescue JSON::ParserError => _e
260
+ warn 'Could not parse `docker plugin ls` output'
261
+ []
262
+ end
229
263
  end
230
264
  end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+
3
+ module Inspec::Resources
4
+ class DockerPlugin < Inspec.resource(1)
5
+ name 'docker_plugin'
6
+ supports platform: 'unix'
7
+ desc 'Retrieves info about docker plugins'
8
+ example "
9
+ describe docker_plugin('rexray/ebs') do
10
+ it { should exist }
11
+ its('id') { should_not eq '0ac30b93ad40' }
12
+ its('version') { should eq '0.11.1' }
13
+ it { should be_enabled }
14
+ end
15
+
16
+ describe docker_plugin('alpine:latest') do
17
+ it { should exist }
18
+ end
19
+
20
+ describe docker_plugin(id: '4a415e366388') do
21
+ it { should exist }
22
+ end
23
+ "
24
+
25
+ def initialize(opts = {})
26
+ # do sanitizion of input values
27
+ o = opts.dup
28
+ o = { name: opts } if opts.is_a?(String)
29
+ @opts = o
30
+ end
31
+
32
+ def exist?
33
+ object_info.entries.size == 1
34
+ end
35
+
36
+ def enabled?
37
+ object_info.enabled[0]
38
+ end
39
+
40
+ def id
41
+ object_info.ids[0] if object_info.entries.size == 1
42
+ end
43
+
44
+ def version
45
+ object_info.versions[0] if object_info.entries.size == 1
46
+ end
47
+
48
+ def to_s
49
+ plugin = @opts[:name] || @opts[:id]
50
+ "Docker plugin #{plugin}"
51
+ end
52
+
53
+ private
54
+
55
+ def object_info
56
+ return @info if defined?(@info)
57
+ opts = @opts
58
+ @info = inspec.docker.plugins.where {
59
+ (name == opts[:name]) || (!id.nil? && !opts[:id].nil? && (id == opts[:id]))
60
+ }
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,116 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+ # check for web applications in IIS
4
+ # Note: this is only supported in windows 2012 and later
5
+
6
+ class IisAppPool < Inspec.resource(1)
7
+ name 'iis_app_pool'
8
+ desc 'Tests IIS application pool configuration on windows.'
9
+ example "
10
+ describe iis_app_pool('DefaultAppPool') do
11
+ it { should exist }
12
+ its('enable32bit') { should cmp 'True' }
13
+ its('runtime_version') { should eq 'v4.0' }
14
+ its('pipeline_mode') { should eq 'Integrated' }
15
+ end
16
+ "
17
+
18
+ def initialize(pool_name)
19
+ @pool_name = pool_name
20
+ @pool_path = "IIS:\\AppPools\\#{@pool_name}"
21
+ @cache = nil
22
+
23
+ # verify that this resource is only supported on Windows
24
+ return skip_resource 'The `iis_app_pool` resource is not supported on your OS.' unless inspec.os.windows?
25
+ end
26
+
27
+ def pool_name
28
+ iis_app_pool[:pool_name]
29
+ end
30
+
31
+ def runtime_version
32
+ iis_app_pool[:version]
33
+ end
34
+
35
+ def enable32bit
36
+ iis_app_pool[:e32b]
37
+ end
38
+
39
+ def pipeline_mode
40
+ iis_app_pool[:mode]
41
+ end
42
+
43
+ def max_processes
44
+ iis_app_pool[:processes]
45
+ end
46
+
47
+ def timeout
48
+ iis_app_pool[:timeout]
49
+ end
50
+
51
+ def timeout_days
52
+ iis_app_pool[:timeout_days]
53
+ end
54
+
55
+ def timeout_hours
56
+ iis_app_pool[:timeout_hours]
57
+ end
58
+
59
+ def timeout_minutes
60
+ iis_app_pool[:timeout_minutes]
61
+ end
62
+
63
+ def timeout_seconds
64
+ iis_app_pool[:timeout_seconds]
65
+ end
66
+
67
+ def user_identity_type
68
+ iis_app_pool[:user_identity_type]
69
+ end
70
+
71
+ def username
72
+ iis_app_pool[:username]
73
+ end
74
+
75
+ def exists?
76
+ !iis_app_pool[:pool_name].empty?
77
+ end
78
+
79
+ def to_s
80
+ "iis_app_pool '#{@pool_name}'"
81
+ end
82
+
83
+ private
84
+
85
+ # I cannot think of a way to shorten this method
86
+ # rubocop:disable Metrics/AbcSize
87
+ def iis_app_pool
88
+ return @cache unless @cache.nil?
89
+
90
+ command = "Import-Module WebAdministration; Get-Item '#{@pool_path}' | Select-Object * | ConvertTo-Json"
91
+ cmd = inspec.command(command)
92
+
93
+ begin
94
+ pool = JSON.parse(cmd.stdout)
95
+ rescue JSON::ParserError => _e
96
+ raise Inspec::Exceptions::ResourceFailed, 'Unable to parse app pool JSON'
97
+ end
98
+
99
+ # map our values to a hash table
100
+ @cache = {
101
+ pool_name: pool['name'],
102
+ version: pool['managedRuntimeVersion'],
103
+ e32b: pool['enable32BitAppOnWin64'],
104
+ mode: pool['managedPipelineMode'],
105
+ processes: pool['processModel']['maxProcesses'],
106
+ timeout: "#{pool['processModel']['idleTimeout']['Hours']}:#{pool['processModel']['idleTimeout']['Minutes']}:#{pool['processModel']['idleTimeout']['Seconds']}",
107
+ timeout_days: pool['processModel']['idleTimeout']['Days'],
108
+ timeout_hours: pool['processModel']['idleTimeout']['Hours'],
109
+ timeout_minutes: pool['processModel']['idleTimeout']['Minutes'],
110
+ timeout_seconds: pool['processModel']['idleTimeout']['Seconds'],
111
+ user_identity_type: pool['processModel']['identityType'],
112
+ username: pool['processModel']['userName'],
113
+ }
114
+ end
115
+ # rubocop:enable Metrics/AbcSize
116
+ end