inspec-core 4.41.20 → 4.46.13
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.
- checksums.yaml +4 -4
- data/etc/deprecations.json +1 -1
- data/lib/inspec/cli.rb +2 -1
- data/lib/inspec/control_eval_context.rb +40 -39
- data/lib/inspec/dsl.rb +18 -3
- data/lib/inspec/resources/chrony_conf.rb +55 -0
- data/lib/inspec/resources/csv.rb +26 -3
- data/lib/inspec/resources/ibmdb2_conf.rb +57 -0
- data/lib/inspec/resources/ibmdb2_session.rb +69 -0
- data/lib/inspec/resources/mssql_sys_conf.rb +48 -0
- data/lib/inspec/resources/opa.rb +4 -1
- data/lib/inspec/resources/oracle.rb +66 -0
- data/lib/inspec/resources/oracledb_conf.rb +40 -0
- data/lib/inspec/resources/oracledb_listener_conf.rb +123 -0
- data/lib/inspec/resources/postgres_session.rb +15 -4
- data/lib/inspec/resources/service.rb +1 -1
- data/lib/inspec/resources/sybase_conf.rb +37 -0
- data/lib/inspec/resources/sybase_session.rb +111 -0
- data/lib/inspec/resources.rb +6 -0
- data/lib/inspec/run_data/profile.rb +0 -2
- data/lib/inspec/version.rb +1 -1
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cc013914b6503c547eeb5fbba13ce8398cf039236b82a0422339a8b7d178649
|
4
|
+
data.tar.gz: bb763eb39cb82fa264417d15147769d9d4b3fe1dff34ac40351712a35c6dbcb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 492c4bbde3afe3c8be2d7640bb5e6a04f973a762aa2b541231dc61a3862d2d4d3248a49ff9b149ca66fa07eba83e1cd61260185a61fb073ba6a3cc9b542ac04f
|
7
|
+
data.tar.gz: 89b55b1c8d8da24e1266bf6e19f688d284b88b18ec36c97f3f088c6f0422ac6ae6b0ddcab867bcb174ae789fc8e5bb334ed40cfd49adb26c7c3eb401c3164123
|
data/etc/deprecations.json
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
"groups": {
|
5
5
|
"attrs_value_replaces_default": {
|
6
6
|
"action": "warn",
|
7
|
-
"prefix": "The 'default' option for
|
7
|
+
"prefix": "The 'default' option for inputs is being replaced by 'value' - please use it instead."
|
8
8
|
},
|
9
9
|
"attrs_dsl": {
|
10
10
|
"action": "ignore",
|
data/lib/inspec/cli.rb
CHANGED
@@ -93,7 +93,8 @@ class Inspec::InspecCLI < Inspec::BaseCLI
|
|
93
93
|
end
|
94
94
|
|
95
95
|
desc "check PATH", "verify all tests at the specified PATH"
|
96
|
-
option :format, type: :string
|
96
|
+
option :format, type: :string,
|
97
|
+
desc: "The output format to use doc (default), json. If valid format is not provided then it will use the default."
|
97
98
|
profile_options
|
98
99
|
def check(path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
99
100
|
o = config
|
@@ -18,6 +18,7 @@ module Inspec
|
|
18
18
|
attr_accessor :skip_file
|
19
19
|
attr_accessor :profile_context
|
20
20
|
attr_accessor :resources_dsl
|
21
|
+
attr_accessor :conf
|
21
22
|
|
22
23
|
def initialize(profile_context, resources_dsl, backend, conf, dependencies, require_loader, skip_only_if_eval)
|
23
24
|
@profile_context = profile_context
|
@@ -189,29 +190,24 @@ module Inspec
|
|
189
190
|
@skip_file = true
|
190
191
|
end
|
191
192
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
if
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
193
|
+
# Check if the given control exist in the --tags option
|
194
|
+
def tag_exist_in_control_tags?(tag_ids)
|
195
|
+
tag_option_matches_with_list = false
|
196
|
+
if !tag_ids.empty? && !tag_ids.nil? && profile_tag_config_exist?
|
197
|
+
tag_option_matches_with_list = !(tag_ids & @conf["profile"].include_tags_list).empty?
|
198
|
+
unless tag_option_matches_with_list
|
199
|
+
@conf["profile"].include_tags_list.any? do |inclusion|
|
200
|
+
# Try to see if the inclusion is a regex, and if it matches
|
201
|
+
if inclusion.is_a?(Regexp)
|
202
|
+
tag_ids.each do |id|
|
203
|
+
tag_option_matches_with_list = (inclusion =~ id)
|
204
|
+
break if tag_option_matches_with_list
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
200
209
|
end
|
201
|
-
|
202
|
-
|
203
|
-
# Returns true if configuration hash is not empty and it contains the list of controls is not empty
|
204
|
-
def profile_config_exist?
|
205
|
-
!@conf.empty? && @conf.key?("profile") && !@conf["profile"].include_controls_list.empty?
|
206
|
-
end
|
207
|
-
|
208
|
-
def profile_tag_config_exist?
|
209
|
-
!@conf.empty? && @conf.key?("profile") && !@conf["profile"].include_tags_list.empty?
|
210
|
-
end
|
211
|
-
|
212
|
-
# Returns true if configuration hash is empty or configuration hash does not have the list of controls that needs to be included
|
213
|
-
def controls_list_empty?
|
214
|
-
!@conf.empty? && @conf.key?("profile") && @conf["profile"].include_controls_list.empty? || @conf.empty?
|
210
|
+
tag_option_matches_with_list
|
215
211
|
end
|
216
212
|
|
217
213
|
def tags_list_empty?
|
@@ -230,24 +226,29 @@ module Inspec
|
|
230
226
|
id_exist_in_list
|
231
227
|
end
|
232
228
|
|
233
|
-
#
|
234
|
-
def
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
229
|
+
# Returns true if configuration hash is empty or configuration hash does not have the list of controls that needs to be included
|
230
|
+
def controls_list_empty?
|
231
|
+
!@conf.empty? && @conf.key?("profile") && @conf["profile"].include_controls_list.empty? || @conf.empty?
|
232
|
+
end
|
233
|
+
|
234
|
+
private
|
235
|
+
|
236
|
+
def block_location(block, alternate_caller)
|
237
|
+
if block.nil?
|
238
|
+
alternate_caller[/^(.+:\d+):in .+$/, 1] || "unknown"
|
239
|
+
else
|
240
|
+
path, line = block.source_location
|
241
|
+
"#{File.basename(path)}:#{line}"
|
249
242
|
end
|
250
|
-
|
243
|
+
end
|
244
|
+
|
245
|
+
# Returns true if configuration hash is not empty and it contains the list of controls is not empty
|
246
|
+
def profile_config_exist?
|
247
|
+
!@conf.empty? && @conf.key?("profile") && !@conf["profile"].include_controls_list.empty?
|
248
|
+
end
|
249
|
+
|
250
|
+
def profile_tag_config_exist?
|
251
|
+
!@conf.empty? && @conf.key?("profile") && !@conf["profile"].include_tags_list.empty?
|
251
252
|
end
|
252
253
|
end
|
253
254
|
end
|
data/lib/inspec/dsl.rb
CHANGED
@@ -93,23 +93,38 @@ module Inspec::DSL
|
|
93
93
|
context = dep_entry.profile.runner_context
|
94
94
|
# if we don't want all the rules, then just make 1 pass to get all rule_IDs
|
95
95
|
# that we want to keep from the original
|
96
|
-
|
96
|
+
if !opts[:include_all] || !(opts[:conf]["profile"].include_tags_list.empty?) || !opts[:conf]["profile"].include_controls_list.empty?
|
97
|
+
filter_included_controls(context, dep_entry.profile, opts, &block)
|
98
|
+
end
|
97
99
|
# interpret the block and skip/modify as required
|
98
100
|
context.load(block) if block_given?
|
99
101
|
bind_context.add_subcontext(context)
|
100
102
|
end
|
101
103
|
|
102
|
-
def self.filter_included_controls(context, profile, &block)
|
104
|
+
def self.filter_included_controls(context, profile, opts, &block)
|
103
105
|
mock = Inspec::Backend.create(Inspec::Config.mock)
|
104
106
|
include_ctx = Inspec::ProfileContext.for_profile(profile, mock)
|
105
107
|
include_ctx.load(block) if block_given?
|
108
|
+
include_ctx.control_eval_context.conf = opts[:conf]
|
109
|
+
control_eval_ctx = include_ctx.control_eval_context
|
106
110
|
# remove all rules that were not registered
|
107
111
|
context.all_rules.each do |r|
|
108
112
|
id = Inspec::Rule.rule_id(r)
|
109
113
|
fid = Inspec::Rule.profile_id(r) + "/" + id
|
110
|
-
|
114
|
+
if !opts[:include_all] && !(include_ctx.rules[id] || include_ctx.rules[fid])
|
111
115
|
context.remove_rule(fid)
|
112
116
|
end
|
117
|
+
|
118
|
+
unless control_eval_ctx.controls_list_empty?
|
119
|
+
# filter the dependent profile controls which are not in the --controls options list
|
120
|
+
context.remove_rule(fid) unless control_eval_ctx.control_exist_in_controls_list?(id)
|
121
|
+
end
|
122
|
+
|
123
|
+
unless control_eval_ctx.tags_list_empty?
|
124
|
+
# filter included controls using --tags
|
125
|
+
tag_ids = control_eval_ctx.control_tags(r)
|
126
|
+
context.remove_rule(fid) unless control_eval_ctx.tag_exist_in_control_tags?(tag_ids)
|
127
|
+
end
|
113
128
|
end
|
114
129
|
end
|
115
130
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# chrony_conf
|
2
|
+
|
3
|
+
require "inspec/utils/simpleconfig"
|
4
|
+
require "inspec/utils/file_reader"
|
5
|
+
|
6
|
+
module Inspec::Resources
|
7
|
+
class ChronyConf < Inspec.resource(1)
|
8
|
+
name "chrony_conf"
|
9
|
+
supports platform: "unix"
|
10
|
+
desc "Use the chrony_conf InSpec audit resource to test the synchronization settings defined in the chrony.conf file. This file is typically located at /etc/chrony.conf."
|
11
|
+
example <<~EXAMPLE
|
12
|
+
describe chrony_conf do
|
13
|
+
its('server') { should_not cmp nil }
|
14
|
+
its('restrict') { should include '-4 default kod notrap nomodify nopeer noquery' }
|
15
|
+
its('pool') { should include 'pool.ntp.org iburst' }
|
16
|
+
its('driftfile') { should cmp '/var/lib/ntp/drift' }
|
17
|
+
its('allow') { should cmp nil }
|
18
|
+
its('keyfile') { should cmp '/etc/chrony.keys' }
|
19
|
+
end
|
20
|
+
EXAMPLE
|
21
|
+
|
22
|
+
include FileReader
|
23
|
+
|
24
|
+
def initialize(path = nil)
|
25
|
+
@conf_path = path || "/etc/chrony.conf"
|
26
|
+
@content = read_file_content(@conf_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(name)
|
30
|
+
param = read_params[name.to_s]
|
31
|
+
# extract first value if we have only one value in array
|
32
|
+
return param[0] if param.is_a?(Array) && (param.length == 1)
|
33
|
+
|
34
|
+
param
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
"chrony.conf"
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def read_params
|
44
|
+
return @params if defined?(@params)
|
45
|
+
|
46
|
+
# parse the file
|
47
|
+
conf = SimpleConfig.new(
|
48
|
+
@content,
|
49
|
+
assignment_regex: /^\s*(\S+)\s+(.*)\s*$/,
|
50
|
+
multiple_values: true
|
51
|
+
)
|
52
|
+
@params = conf.params
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/inspec/resources/csv.rb
CHANGED
@@ -11,14 +11,28 @@ module Inspec::Resources
|
|
11
11
|
describe csv('example.csv') do
|
12
12
|
its('name') { should eq(['John', 'Alice']) }
|
13
13
|
end
|
14
|
+
|
15
|
+
describe csv('example.csv', false).params do
|
16
|
+
its[[0]] { should eq (['name', 'col1', 'col2']) }
|
17
|
+
emd
|
14
18
|
EXAMPLE
|
15
19
|
|
20
|
+
def initialize(path, headers = true)
|
21
|
+
@headers = headers
|
22
|
+
super(path)
|
23
|
+
end
|
24
|
+
|
16
25
|
# override the parse method from JsonConfig
|
17
26
|
# Assuming a header row of name,col1,col2, it will output an array of hashes like so:
|
18
27
|
# [
|
19
28
|
# { 'name' => 'row1', 'col1' => 'value1', 'col2' => 'value2' },
|
20
29
|
# { 'name' => 'row2', 'col1' => 'value3', 'col2' => 'value4' }
|
21
30
|
# ]
|
31
|
+
# When headers is set to false it will return data as array of array
|
32
|
+
# [
|
33
|
+
# ['name', col1', 'col2'],
|
34
|
+
# ['row2', 'value3', 'value4']
|
35
|
+
# ]
|
22
36
|
def parse(content)
|
23
37
|
require "csv" unless defined?(CSV)
|
24
38
|
|
@@ -28,10 +42,14 @@ module Inspec::Resources
|
|
28
42
|
end
|
29
43
|
|
30
44
|
# implicit conversion of values
|
31
|
-
csv = CSV.new(content, headers:
|
45
|
+
csv = CSV.new(content, headers: @headers, converters: %i{all blank_to_nil})
|
32
46
|
|
33
47
|
# convert to hash
|
34
|
-
|
48
|
+
if @headers
|
49
|
+
csv.to_a.map(&:to_hash)
|
50
|
+
else
|
51
|
+
csv.to_a
|
52
|
+
end
|
35
53
|
rescue => e
|
36
54
|
raise Inspec::Exceptions::ResourceFailed, "Unable to parse CSV: #{e.message}"
|
37
55
|
end
|
@@ -42,7 +60,12 @@ module Inspec::Resources
|
|
42
60
|
# #value method from JsonConfig (which uses ObjectTraverser.extract_value)
|
43
61
|
# doesn't make sense here.
|
44
62
|
def value(key)
|
45
|
-
@
|
63
|
+
if @headers
|
64
|
+
@params.map { |x| x[key.first.to_s] }.compact
|
65
|
+
else
|
66
|
+
# when headers is set to false send the array as it is.
|
67
|
+
@params
|
68
|
+
end
|
46
69
|
end
|
47
70
|
|
48
71
|
private
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Inspec::Resources
|
2
|
+
class Ibmdb2Conf < Inspec.resource(1)
|
3
|
+
name "ibmdb2_conf"
|
4
|
+
|
5
|
+
supports platform: "unix"
|
6
|
+
supports platform: "windows"
|
7
|
+
|
8
|
+
desc "Use the ibmdb2_conf InSpec audit resource to test the configuration values of IBM Db2 database."
|
9
|
+
example <<~EXAMPLE
|
10
|
+
describe ibmdb2_conf(db2_executable_file_path: "path_to_db2_binary", db_instance: "db2inst1") do
|
11
|
+
its("output") { should_not be_empty }
|
12
|
+
its("output") { should include("Audit buffer size (4KB) (AUDIT_BUF_SZ) = 0")}
|
13
|
+
end
|
14
|
+
EXAMPLE
|
15
|
+
|
16
|
+
attr_reader :output
|
17
|
+
|
18
|
+
def initialize(opts = {})
|
19
|
+
if inspec.os.platform?("unix")
|
20
|
+
@db2_executable_file_path = opts[:db2_executable_file_path]
|
21
|
+
@db_instance = opts[:db_instance]
|
22
|
+
raise Inspec::Exceptions::ResourceFailed, "Can't connect to IBM DB2 without db2_executable_file_path, db_instance options provided." if @db2_executable_file_path.nil? || @db_instance.nil?
|
23
|
+
end
|
24
|
+
@output = run_command
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
"IBM Db2 Conf"
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def run_command
|
34
|
+
# attach to the db2 instance and get the configuration
|
35
|
+
if inspec.os.platform?("unix")
|
36
|
+
cmd = inspec.command("#{@db2_executable_file_path} attach to #{@db_instance}\; #{@db2_executable_file_path} get database manager configuration")
|
37
|
+
out = cmd.stdout + "\n" + cmd.stderr
|
38
|
+
|
39
|
+
# check if following specific error is there. Sourcing the db2profile to resolve the error.
|
40
|
+
if cmd.exit_status != 0 && out =~ /SQL10007N Message "-1390" could not be retrieved. Reason code: "3"/
|
41
|
+
cmd = inspec.command(". ~/sqllib/db2profile\; #{@db2_executable_file_path} attach to #{@db_instance}\; #{@db2_executable_file_path} get database manager configuration")
|
42
|
+
out = cmd.stdout + "\n" + cmd.stderr
|
43
|
+
end
|
44
|
+
elsif inspec.os.platform?("windows")
|
45
|
+
# set-item command set the powershell to run the db2 commands.
|
46
|
+
cmd = inspec.command("set-item -path env:DB2CLP -value \"**$$**\"\; db2 get database manager configuration")
|
47
|
+
out = cmd.stdout + "\n" + cmd.stderr
|
48
|
+
end
|
49
|
+
|
50
|
+
if cmd.exit_status != 0 || out =~ /Can't connect to IBM Db2 server/ || out.downcase =~ /^error:.*/
|
51
|
+
raise Inspec::Exceptions::ResourceFailed, "IBM Db2 query with error: #{out}"
|
52
|
+
else
|
53
|
+
cmd.stdout.gsub(/\n|\r/, ",").split(",").reject { |n| n.nil? || n.empty? }.map { |n| n.strip.gsub!(/\s+/, " ") }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Inspec::Resources
|
2
|
+
class Lines
|
3
|
+
attr_reader :output
|
4
|
+
|
5
|
+
def initialize(raw, desc)
|
6
|
+
@output = raw
|
7
|
+
@desc = desc
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
@desc
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Ibmdb2Session < Inspec.resource(1)
|
16
|
+
name "ibmdb2_session"
|
17
|
+
|
18
|
+
supports platform: "unix"
|
19
|
+
supports platform: "windows"
|
20
|
+
|
21
|
+
desc "Use the ibmdb2_session InSpec audit resource to test SQL commands run against a IBM Db2 database."
|
22
|
+
example <<~EXAMPLE
|
23
|
+
describe ibmdb2_session(db2_executable_file_path: "path_to_db2_binary", db_instance: "db2inst1", db_name: "sample").query('list database directory') do
|
24
|
+
its('output') { should_not match(/sample/) }
|
25
|
+
end
|
26
|
+
EXAMPLE
|
27
|
+
|
28
|
+
def initialize(opts = {})
|
29
|
+
@db_name = opts[:db_name]
|
30
|
+
if inspec.os.platform?("unix")
|
31
|
+
@db2_executable_file_path = opts[:db2_executable_file_path]
|
32
|
+
@db_instance = opts[:db_instance]
|
33
|
+
raise Inspec::Exceptions::ResourceFailed, "Can't run IBM DB2 queries without db2_executable_file_path, db_instance, db_name options provided." if @db2_executable_file_path.nil? || @db_instance.nil? || @db_name.nil?
|
34
|
+
elsif inspec.os.platform?("windows")
|
35
|
+
raise Inspec::Exceptions::ResourceFailed, "Can't run IBM DB2 queries without db_name option provided." if @db_name.nil?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def query(q)
|
40
|
+
raise Inspec::Exceptions::ResourceFailed, "#{resource_exception_message}" if resource_failed?
|
41
|
+
|
42
|
+
if inspec.os.platform?("unix")
|
43
|
+
# connect to the db and query on the database
|
44
|
+
cmd = inspec.command("#{@db2_executable_file_path} attach to #{@db_instance}\; #{@db2_executable_file_path} connect to #{@db_name}\; #{@db2_executable_file_path} #{q}\;")
|
45
|
+
out = cmd.stdout + "\n" + cmd.stderr
|
46
|
+
|
47
|
+
# check if following specific error is there. Sourcing the db2profile to resolve the error.
|
48
|
+
if cmd.exit_status != 0 && out =~ /SQL10007N Message "-1390" could not be retrieved. Reason code: "3"/
|
49
|
+
cmd = inspec.command(". ~/sqllib/db2profile\; #{@db2_executable_file_path} attach to #{@db_instance}\; #{@db2_executable_file_path} connect to #{@db_name}\; #{@db2_executable_file_path} #{q}\;")
|
50
|
+
out = cmd.stdout + "\n" + cmd.stderr
|
51
|
+
end
|
52
|
+
elsif inspec.os.platform?("windows")
|
53
|
+
# set-item command set the powershell to run the db2 commands.
|
54
|
+
cmd = inspec.command("set-item -path env:DB2CLP -value \"**$$**\"\; db2 connect to #{@db_name}\; db2 #{q}\;")
|
55
|
+
out = cmd.stdout + "\n" + cmd.stderr
|
56
|
+
end
|
57
|
+
|
58
|
+
if cmd.exit_status != 0 || out =~ /Can't connect to IBM Db2 / || out.downcase =~ /^error:.*/
|
59
|
+
raise Inspec::Exceptions::ResourceFailed, "IBM Db2 connection error: #{out}"
|
60
|
+
else
|
61
|
+
Lines.new(cmd.stdout.strip, "IBM Db2 Query: #{q}")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_s
|
66
|
+
"IBM Db2 Session"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "inspec/resources/mssql_session"
|
2
|
+
|
3
|
+
module Inspec::Resources
|
4
|
+
class MssqlSysConf < Inspec.resource(1)
|
5
|
+
name "mssql_sys_conf"
|
6
|
+
supports platform: "windows"
|
7
|
+
supports platform: "debian"
|
8
|
+
supports platform: "redhat"
|
9
|
+
supports platform: "suse"
|
10
|
+
|
11
|
+
desc "Use the mssql_sys_conf InSpec audit resource to test the database system configurations for Mssql DB"
|
12
|
+
example <<~EXAMPLE
|
13
|
+
describe mssql_sys_conf("clr_enabled", user: 'USER', password: 'PASSWORD') do
|
14
|
+
its("value_in_use") { should cmp "0" }
|
15
|
+
its("value_configured") { should cmp "0" }
|
16
|
+
end
|
17
|
+
EXAMPLE
|
18
|
+
|
19
|
+
attr_reader :mssql_session, :sql_query
|
20
|
+
|
21
|
+
def initialize(conf_param_name, opts = {})
|
22
|
+
opts[:username] ||= "SA"
|
23
|
+
@mssql_session = inspec.mssql_session(opts)
|
24
|
+
setting = conf_param_name.to_s.gsub("_", " ").split.map(&:capitalize).join(" ")
|
25
|
+
determine_system_configurations(setting)
|
26
|
+
end
|
27
|
+
|
28
|
+
def value_in_use
|
29
|
+
sql_query.row(0).column("value_in_use").value
|
30
|
+
end
|
31
|
+
|
32
|
+
def value_configured
|
33
|
+
sql_query.row(0).column("value_configured").value
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_s
|
37
|
+
"MsSql DB Configuration"
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def determine_system_configurations(setting)
|
43
|
+
@sql_query = mssql_session.query("SELECT name, CAST(value as int) as value_configured, CAST(value_in_use as int) as value_in_use FROM sys.configurations WHERE name = '#{setting}'")
|
44
|
+
rescue => e
|
45
|
+
raise Inspec::Exceptions::ResourceFailed, "Errors fetching database system configurations for Mssql database: #{e}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/inspec/resources/opa.rb
CHANGED
@@ -6,12 +6,15 @@ module Inspec::Resources
|
|
6
6
|
supports platform: "unix"
|
7
7
|
supports platform: "windows"
|
8
8
|
|
9
|
-
attr_reader :result
|
10
9
|
def initialize(content)
|
11
10
|
@content = content
|
12
11
|
super({ content: @content })
|
13
12
|
end
|
14
13
|
|
14
|
+
def result
|
15
|
+
@content == {} || @content["result"].empty? ? nil : @content
|
16
|
+
end
|
17
|
+
|
15
18
|
private
|
16
19
|
|
17
20
|
def parse(content)
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "inspec/resources/powershell"
|
2
|
+
|
3
|
+
module Inspec::Resources
|
4
|
+
class Oracle < Inspec.resource(1)
|
5
|
+
name "oracle"
|
6
|
+
supports platform: "unix"
|
7
|
+
supports platform: "windows"
|
8
|
+
|
9
|
+
desc "The 'oracle' resource is a helper for the 'oracledb_listener_conf'"
|
10
|
+
|
11
|
+
attr_reader :conf_path
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
case inspec.os[:family]
|
15
|
+
when "debian", "redhat", "linux", "suse"
|
16
|
+
determine_conf_dir_and_path_in_linux
|
17
|
+
when "windows"
|
18
|
+
determine_conf_dir_and_path_in_windows
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
"OracleDB"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def determine_conf_dir_and_path_in_linux
|
29
|
+
oracle_home = inspec.os_env("ORACLE_HOME").content
|
30
|
+
|
31
|
+
if oracle_home.nil? || oracle_home.empty?
|
32
|
+
warn "$ORACLE_HOME env value not set in the system"
|
33
|
+
nil
|
34
|
+
else
|
35
|
+
conf_path = "#{oracle_home}/network/admin/listener.ora"
|
36
|
+
if !inspec.file(conf_path).exist?
|
37
|
+
warn "No oracle listener settings found in $ORACLE_HOME/network/admin directory"
|
38
|
+
nil
|
39
|
+
else
|
40
|
+
@conf_path = conf_path
|
41
|
+
end
|
42
|
+
end
|
43
|
+
rescue => e
|
44
|
+
fail_resource "Errors reading listener settings: #{e}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def determine_conf_dir_and_path_in_windows
|
48
|
+
oracle_home = inspec.os_env("ORACLE_HOME").content
|
49
|
+
|
50
|
+
if oracle_home.nil? || oracle_home.empty?
|
51
|
+
warn "ORACLE_HOME env value not set in the system"
|
52
|
+
nil
|
53
|
+
else
|
54
|
+
conf_path = "#{oracle_home}\\network\\admin\\listener.ora"
|
55
|
+
if !inspec.file(conf_path).exist?
|
56
|
+
warn "No oracle listener settings found in ORACLE_HOME\\network\\admin directory"
|
57
|
+
nil
|
58
|
+
else
|
59
|
+
@conf_path = conf_path
|
60
|
+
end
|
61
|
+
end
|
62
|
+
rescue => e
|
63
|
+
fail_resource "Errors reading listener settings: #{e}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "inspec/resources/oracledb_session"
|
2
|
+
|
3
|
+
module Inspec::Resources
|
4
|
+
class OracledbConf < Inspec.resource(1)
|
5
|
+
name "oracledb_conf"
|
6
|
+
supports platform: "unix"
|
7
|
+
supports platform: "windows"
|
8
|
+
desc "Use the oracledb_conf InSpec audit resource to test the database settings for Oracle DB"
|
9
|
+
example <<~EXAMPLE
|
10
|
+
describe oracledb_conf(user: 'USER', password: 'PASSWORD') do
|
11
|
+
its("audit_sys_operations") { should cmp "true" }
|
12
|
+
its("sql92_security") { should cmp "true" }
|
13
|
+
end
|
14
|
+
EXAMPLE
|
15
|
+
|
16
|
+
attr_reader :oracledb_session
|
17
|
+
|
18
|
+
def initialize(opts = {})
|
19
|
+
@oracledb_session = inspec.oracledb_session(opts)
|
20
|
+
end
|
21
|
+
|
22
|
+
def method_missing(name)
|
23
|
+
setting = name.to_s.upcase
|
24
|
+
determine_database_setting(setting)
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
"Oracle DB Configuration"
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def determine_database_setting(setting)
|
34
|
+
sql_query = oracledb_session.query("SELECT UPPER(VALUE) AS UPPER_VALUE FROM V$SYSTEM_PARAMETER WHERE UPPER(NAME) = '#{setting}'")
|
35
|
+
sql_query.row(0).column("UPPER_VALUE").value
|
36
|
+
rescue => e
|
37
|
+
raise Inspec::Exceptions::ResourceFailed, "Errors fetching database settings for Oracle database: #{e}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require "inspec/utils/object_traversal"
|
2
|
+
require "inspec/utils/simpleconfig"
|
3
|
+
require "inspec/utils/find_files"
|
4
|
+
require "inspec/utils/file_reader"
|
5
|
+
require "inspec/resources/oracle"
|
6
|
+
|
7
|
+
module Inspec::Resources
|
8
|
+
class OracledbListenerConf < Inspec.resource(1)
|
9
|
+
name "oracledb_listener_conf"
|
10
|
+
supports platform: "unix"
|
11
|
+
supports platform: "windows"
|
12
|
+
desc "Use the oracledb_listener_conf InSpec audit resource to test the listener settings for Oracle DB"
|
13
|
+
example <<~EXAMPLE
|
14
|
+
describe oracledb_listener_conf do
|
15
|
+
its('DEFAULT_SERVICE_LISTENER') { should eq 'XE' }
|
16
|
+
end
|
17
|
+
EXAMPLE
|
18
|
+
|
19
|
+
include FindFiles
|
20
|
+
include FileReader
|
21
|
+
include ObjectTraverser
|
22
|
+
|
23
|
+
def initialize(conf_path = nil)
|
24
|
+
oracle = nil
|
25
|
+
if conf_path.nil?
|
26
|
+
oracle = inspec.oracle
|
27
|
+
@conf_path = oracle.conf_path
|
28
|
+
else
|
29
|
+
@conf_path = conf_path
|
30
|
+
end
|
31
|
+
|
32
|
+
if oracle && oracle.resource_failed?
|
33
|
+
raise oracle.resource_exception_message
|
34
|
+
elsif @conf_path.nil?
|
35
|
+
return skip_resource "Oracle Listener conf path is not set"
|
36
|
+
end
|
37
|
+
|
38
|
+
@conf_dir = File.expand_path(File.dirname(@conf_path))
|
39
|
+
@files_contents = {}
|
40
|
+
@content = nil
|
41
|
+
@params = nil
|
42
|
+
read_content
|
43
|
+
end
|
44
|
+
|
45
|
+
def content
|
46
|
+
@content ||= read_content
|
47
|
+
end
|
48
|
+
|
49
|
+
def params(*opts)
|
50
|
+
@params || read_content
|
51
|
+
res = @params
|
52
|
+
opts.each do |opt|
|
53
|
+
res = res[opt] unless res.nil?
|
54
|
+
end
|
55
|
+
res
|
56
|
+
end
|
57
|
+
|
58
|
+
def value(key)
|
59
|
+
extract_value(key, @params)
|
60
|
+
end
|
61
|
+
|
62
|
+
def method_missing(*keys)
|
63
|
+
keys.shift if keys.is_a?(Array) && keys[0] == :[]
|
64
|
+
param = value(keys)
|
65
|
+
return nil if param.nil?
|
66
|
+
# extract first value if we have only one value in array
|
67
|
+
return param[0] if param.length == 1
|
68
|
+
|
69
|
+
param
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_s
|
73
|
+
"Oracle Listener Configuration"
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def read_content
|
79
|
+
@content = ""
|
80
|
+
@params = {}
|
81
|
+
|
82
|
+
to_read = [@conf_path]
|
83
|
+
until to_read.empty?
|
84
|
+
base_dir = File.dirname(to_read[0])
|
85
|
+
raw_conf = read_file(to_read[0])
|
86
|
+
@content += raw_conf
|
87
|
+
|
88
|
+
opts = {
|
89
|
+
assignment_regex: /^\s*([^=]*?)\s*=\s*[']?\s*(.*?)\s*[']?\s*$/,
|
90
|
+
}
|
91
|
+
params = SimpleConfig.new(raw_conf, opts).params
|
92
|
+
@params.merge!(params)
|
93
|
+
|
94
|
+
to_read = to_read.drop(1)
|
95
|
+
# see if there is more config files to include
|
96
|
+
|
97
|
+
to_read += include_files(params, base_dir).find_all do |fp|
|
98
|
+
not @files_contents.key? fp
|
99
|
+
end
|
100
|
+
end
|
101
|
+
@content
|
102
|
+
end
|
103
|
+
|
104
|
+
def include_files(params, base_dir)
|
105
|
+
include_files = Array(params["include"]) || []
|
106
|
+
include_files += Array(params["include_if_exists"]) || []
|
107
|
+
include_files.map! do |f|
|
108
|
+
Pathname.new(f).absolute? ? f : File.join(base_dir, f)
|
109
|
+
end
|
110
|
+
|
111
|
+
dirs = Array(params["include_dir"]) || []
|
112
|
+
dirs.each do |dir|
|
113
|
+
dir = File.join(base_dir, dir) if dir[0] != "/"
|
114
|
+
include_files += find_files(dir, depth: 1, type: "file")
|
115
|
+
end
|
116
|
+
include_files
|
117
|
+
end
|
118
|
+
|
119
|
+
def read_file(path)
|
120
|
+
@files_contents[path] ||= read_file_content(path)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -40,11 +40,12 @@ module Inspec::Resources
|
|
40
40
|
end
|
41
41
|
EXAMPLE
|
42
42
|
|
43
|
-
def initialize(user, pass, host = nil, port = nil)
|
43
|
+
def initialize(user, pass, host = nil, port = nil, socket_path = nil)
|
44
44
|
@user = user || "postgres"
|
45
45
|
@pass = pass
|
46
46
|
@host = host || "localhost"
|
47
47
|
@port = port || 5432
|
48
|
+
@socket_path = socket_path
|
48
49
|
raise Inspec::Exceptions::ResourceFailed, "Can't run PostgreSQL SQL checks without authentication." if @user.nil? || @pass.nil?
|
49
50
|
end
|
50
51
|
|
@@ -69,10 +70,20 @@ module Inspec::Resources
|
|
69
70
|
|
70
71
|
def create_psql_cmd(query, db = [])
|
71
72
|
dbs = db.map { |x| "#{x}" }.join(" ")
|
72
|
-
|
73
|
-
|
73
|
+
|
74
|
+
if @socket_path && !inspec.os.windows?
|
75
|
+
# Socket path and empty host in the connection string establishes socket connection
|
76
|
+
# Socket connection only enabled for non-windows platforms
|
77
|
+
# Windows does not support unix domain sockets
|
78
|
+
"psql -d postgresql://#{@user}:#{@pass}@/#{dbs}?host=#{@socket_path} -A -t -w -c #{escaped_query(query)}"
|
74
79
|
else
|
75
|
-
|
80
|
+
# Host in connection string establishes tcp/ip connection
|
81
|
+
if inspec.os.windows?
|
82
|
+
warn "Socket based connection not supported in windows, connecting using host" if @socket_path
|
83
|
+
"psql -d postgresql://#{@user}:#{@pass}@#{@host}:#{@port}/#{dbs} -A -t -w -c \"#{query}\""
|
84
|
+
else
|
85
|
+
"psql -d postgresql://#{@user}:#{@pass}@#{@host}:#{@port}/#{dbs} -A -t -w -c #{escaped_query(query)}"
|
86
|
+
end
|
76
87
|
end
|
77
88
|
end
|
78
89
|
end
|
@@ -141,7 +141,7 @@ module Inspec::Resources
|
|
141
141
|
elsif version > 0
|
142
142
|
SysV.new(inspec, service_ctl || "/usr/sbin/service")
|
143
143
|
end
|
144
|
-
when "redhat", "fedora", "centos", "oracle", "cloudlinux", "scientific"
|
144
|
+
when "redhat", "fedora", "centos", "oracle", "cloudlinux", "scientific", "rocky", "almalinux"
|
145
145
|
version = os[:release].to_i
|
146
146
|
|
147
147
|
systemd = ((platform != "fedora" && version >= 7) ||
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "inspec/resources/sybase_session"
|
2
|
+
|
3
|
+
module Inspec::Resources
|
4
|
+
class SybaseConf < Inspec.resource(1)
|
5
|
+
name "sybase_conf"
|
6
|
+
supports platform: "unix"
|
7
|
+
# supports platform: "windows" # TODO
|
8
|
+
desc "Use the sybase_conf InSpec resource to test Sybase config settings"
|
9
|
+
example <<~EXAMPLE
|
10
|
+
describe sybase_conf("max memory", password: 'password', server: 'SYBASE') do
|
11
|
+
its("run_value") { should cmp 180224 }
|
12
|
+
end
|
13
|
+
EXAMPLE
|
14
|
+
|
15
|
+
attr_reader :conf_param, :sql_query
|
16
|
+
def initialize(conf_param_name, opts = {})
|
17
|
+
@conf_param = conf_param_name
|
18
|
+
opts[:username] ||= "sa"
|
19
|
+
opts[:database] ||= "master"
|
20
|
+
sql_session = inspec.sybase_session(opts)
|
21
|
+
@sql_query = sql_session.query("sp_configure \"#{conf_param}\"")
|
22
|
+
end
|
23
|
+
|
24
|
+
def run_value
|
25
|
+
sql_query.row(0).column("Run Value").value
|
26
|
+
end
|
27
|
+
|
28
|
+
def config_value
|
29
|
+
sql_query.row(0).column("Config Value").value
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
"Sybase Conf #{conf_param}"
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require "inspec/resources/command"
|
2
|
+
require "inspec/utils/database_helpers"
|
3
|
+
require "hashie/mash"
|
4
|
+
require "csv" unless defined?(CSV)
|
5
|
+
require "tempfile" unless defined?(Tempfile)
|
6
|
+
|
7
|
+
module Inspec::Resources
|
8
|
+
# STABILITY: Experimental
|
9
|
+
# This resource needs further testing and refinement
|
10
|
+
#
|
11
|
+
class SybaseSession < Inspec.resource(1)
|
12
|
+
name "sybase_session"
|
13
|
+
supports platform: "unix"
|
14
|
+
# supports platform: "windows" # TODO
|
15
|
+
desc "Use the sybase_session InSpec resource to test commands against an Sybase database"
|
16
|
+
example <<~EXAMPLE
|
17
|
+
sql = sybase_session(username: 'my_user', password: 'password', server: 'SYBASE', database: 'pubs2')
|
18
|
+
describe sql.query(\"SELECT * FROM authors\").row(0).column('au_lname') do
|
19
|
+
its('value') { should eq 'Smith' }
|
20
|
+
end
|
21
|
+
EXAMPLE
|
22
|
+
|
23
|
+
# TODO: allow to set -I interfaces file
|
24
|
+
# TODO: allow to customize -s column separator
|
25
|
+
attr_reader :bin, :col_sep, :database, :password, :server, :sybase_home, :username
|
26
|
+
|
27
|
+
def initialize(opts = {})
|
28
|
+
@username = opts[:username]
|
29
|
+
@password = opts[:password]
|
30
|
+
@database = opts[:database]
|
31
|
+
@server = opts[:server]
|
32
|
+
@sybase_home = opts[:sybase_home] || "/opt/sap"
|
33
|
+
@bin = opts[:bin] || "isql"
|
34
|
+
@col_sep = "|"
|
35
|
+
|
36
|
+
fail_resource "Can't run Sybase checks without authentication" unless username && password
|
37
|
+
fail_resource "You must provide a server name for the session" unless server
|
38
|
+
fail_resource "You must provide a database name for the session" unless database
|
39
|
+
fail_resource "Cannot find #{bin} CLI tool" unless inspec.command(bin).exist?
|
40
|
+
end
|
41
|
+
|
42
|
+
def query(sql)
|
43
|
+
# We must write the SQl to a temp file on the remote target
|
44
|
+
# try to get a temp path
|
45
|
+
sql_file_path = upload_sql_file(sql)
|
46
|
+
|
47
|
+
# isql reuires that we have a matching locale set, but does not support C.UTF-8. en_US.UTF-8 is the least evil.
|
48
|
+
command = "LANG=en_US.UTF-8 SYBASE=#{sybase_home} #{bin} -s\"#{col_sep}\" -w80000 -S #{server} -U #{username} -D #{database} -P \"#{password}\" < #{sql_file_path}"
|
49
|
+
isql_cmd = inspec.command(command)
|
50
|
+
|
51
|
+
# Check for isql errors
|
52
|
+
res = isql_cmd.exit_status
|
53
|
+
raise Inspec::Exceptions::ResourceFailed.new("isql exited with code #{res} and stderr '#{isql_cmd.stderr}', stdout '#{isql_cmd.stdout}'") unless res == 0
|
54
|
+
# isql is ill-behaved, and returns 0 on error
|
55
|
+
raise Inspec::Exceptions::ResourceFailed.new("isql exited with error '#{isql_cmd.stderr}', stdout '#{isql_cmd.stdout}'") unless isql_cmd.stderr == ""
|
56
|
+
# check stdout for error messages when stderr is empty "Msg 102, Level 15, State 181:\nServer 'SYBASE', Line 1:\nIncorrect syntax near '.'.\n"
|
57
|
+
raise Inspec::Exceptions::ResourceFailed.new("isql exited with error #{isql_cmd.stdout}") if isql_cmd.stdout.match?(/Msg\s\d+,\sLevel\s\d+,\sState\s\d+/)
|
58
|
+
|
59
|
+
# Clean up temporary file
|
60
|
+
rm_cmd = inspec.command("rm #{sql_file_path}")
|
61
|
+
res = rm_cmd.exit_status # TODO: handle
|
62
|
+
raise Inspec::Exceptions::ResourceFailed.new("Unable to delete temproary SQL input file at #{sql_file_path}: #{rm_cmd.stderr}") unless res == 0
|
63
|
+
|
64
|
+
DatabaseHelper::SQLQueryResult.new(isql_cmd, parse_csv_result(isql_cmd.stdout))
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_s
|
68
|
+
"Sybase Session"
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def parse_csv_result(stdout)
|
74
|
+
output = stdout.gsub(/\r/, "").strip
|
75
|
+
lines = output.lines
|
76
|
+
# Remove second row (all dashes) and last 2 rows (blank and summary lines)
|
77
|
+
trimmed_output = ([lines[0]] << lines.slice(2..-3)).join("")
|
78
|
+
header_converter = Proc.new do |header|
|
79
|
+
# This is here to suppress a warning from Hashie::Mash when it encounters a
|
80
|
+
# header column that ends up with the name "default", which happens when using the
|
81
|
+
# sybase_conf resource. It does mean that aly query whose output field includes the name
|
82
|
+
# Default (exactly) will get renamed to default_value, but that seems unlikely.
|
83
|
+
if header.match?(/^Default\s+$/)
|
84
|
+
"default_value"
|
85
|
+
else
|
86
|
+
header.downcase.strip
|
87
|
+
end
|
88
|
+
end
|
89
|
+
field_converter = ->(field) { field&.strip }
|
90
|
+
CSV.parse(trimmed_output, headers: true, header_converters: header_converter, converters: field_converter, col_sep: col_sep).map { |row| Hashie::Mash.new(row.to_h) }
|
91
|
+
end
|
92
|
+
|
93
|
+
def upload_sql_file(sql)
|
94
|
+
remote_temp_dir = "/tmp"
|
95
|
+
remote_file_path = nil
|
96
|
+
local_temp_file = Tempfile.new(["sybase", ".sql"])
|
97
|
+
begin
|
98
|
+
local_temp_file.write("#{sql}\n")
|
99
|
+
local_temp_file.write("go\n")
|
100
|
+
local_temp_file.flush
|
101
|
+
filename = File.basename(local_temp_file.path)
|
102
|
+
remote_file_path = "#{remote_temp_dir}/#{filename}"
|
103
|
+
inspec.backend.upload([local_temp_file.path], remote_temp_dir)
|
104
|
+
ensure
|
105
|
+
local_temp_file.close
|
106
|
+
local_temp_file.unlink
|
107
|
+
end
|
108
|
+
remote_file_path
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/lib/inspec/resources.rb
CHANGED
@@ -58,6 +58,8 @@ require "inspec/resources/groups"
|
|
58
58
|
require "inspec/resources/grub_conf"
|
59
59
|
require "inspec/resources/host"
|
60
60
|
require "inspec/resources/http"
|
61
|
+
require "inspec/resources/ibmdb2_conf"
|
62
|
+
require "inspec/resources/ibmdb2_session"
|
61
63
|
require "inspec/resources/iis_app"
|
62
64
|
require "inspec/resources/iis_app_pool"
|
63
65
|
require "inspec/resources/iis_site"
|
@@ -76,6 +78,7 @@ require "inspec/resources/mongodb_conf"
|
|
76
78
|
require "inspec/resources/mongodb_session"
|
77
79
|
require "inspec/resources/mount"
|
78
80
|
require "inspec/resources/mssql_session"
|
81
|
+
require "inspec/resources/mssql_sys_conf"
|
79
82
|
require "inspec/resources/mysql"
|
80
83
|
require "inspec/resources/mysql_conf"
|
81
84
|
require "inspec/resources/mysql_session"
|
@@ -84,6 +87,9 @@ require "inspec/resources/nginx_conf"
|
|
84
87
|
require "inspec/resources/npm"
|
85
88
|
require "inspec/resources/ntp_conf"
|
86
89
|
require "inspec/resources/oneget"
|
90
|
+
require "inspec/resources/oracle"
|
91
|
+
require "inspec/resources/oracledb_conf"
|
92
|
+
require "inspec/resources/oracledb_listener_conf"
|
87
93
|
require "inspec/resources/opa_cli"
|
88
94
|
require "inspec/resources/opa_api"
|
89
95
|
require "inspec/resources/oracledb_session"
|
@@ -49,7 +49,6 @@ module Inspec
|
|
49
49
|
end
|
50
50
|
|
51
51
|
class Profile
|
52
|
-
# Good candidate for keyword_init, but that is not in 2.4
|
53
52
|
Dependency = Struct.new(
|
54
53
|
:name, :path, :status, :status_message, :git, :url, :compliance, :supermarket, :branch, :tag, :commit, :version, :relative_path
|
55
54
|
) do
|
@@ -71,7 +70,6 @@ module Inspec
|
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
74
|
-
# Good candidate for keyword_init, but that is not in 2.4
|
75
73
|
Group = Struct.new(
|
76
74
|
:title, :controls, :id
|
77
75
|
) do
|
data/lib/inspec/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inspec-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.46.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chef InSpec Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef-telemetry
|
@@ -506,6 +506,7 @@ files:
|
|
506
506
|
- lib/inspec/resources/bridge.rb
|
507
507
|
- lib/inspec/resources/bsd_service.rb
|
508
508
|
- lib/inspec/resources/chocolatey_package.rb
|
509
|
+
- lib/inspec/resources/chrony_conf.rb
|
509
510
|
- lib/inspec/resources/command.rb
|
510
511
|
- lib/inspec/resources/cpan.rb
|
511
512
|
- lib/inspec/resources/cran.rb
|
@@ -535,6 +536,8 @@ files:
|
|
535
536
|
- lib/inspec/resources/grub_conf.rb
|
536
537
|
- lib/inspec/resources/host.rb
|
537
538
|
- lib/inspec/resources/http.rb
|
539
|
+
- lib/inspec/resources/ibmdb2_conf.rb
|
540
|
+
- lib/inspec/resources/ibmdb2_session.rb
|
538
541
|
- lib/inspec/resources/iis_app.rb
|
539
542
|
- lib/inspec/resources/iis_app_pool.rb
|
540
543
|
- lib/inspec/resources/iis_site.rb
|
@@ -559,6 +562,7 @@ files:
|
|
559
562
|
- lib/inspec/resources/mongodb_session.rb
|
560
563
|
- lib/inspec/resources/mount.rb
|
561
564
|
- lib/inspec/resources/mssql_session.rb
|
565
|
+
- lib/inspec/resources/mssql_sys_conf.rb
|
562
566
|
- lib/inspec/resources/mysql.rb
|
563
567
|
- lib/inspec/resources/mysql_conf.rb
|
564
568
|
- lib/inspec/resources/mysql_session.rb
|
@@ -571,6 +575,9 @@ files:
|
|
571
575
|
- lib/inspec/resources/opa.rb
|
572
576
|
- lib/inspec/resources/opa_api.rb
|
573
577
|
- lib/inspec/resources/opa_cli.rb
|
578
|
+
- lib/inspec/resources/oracle.rb
|
579
|
+
- lib/inspec/resources/oracledb_conf.rb
|
580
|
+
- lib/inspec/resources/oracledb_listener_conf.rb
|
574
581
|
- lib/inspec/resources/oracledb_session.rb
|
575
582
|
- lib/inspec/resources/os.rb
|
576
583
|
- lib/inspec/resources/os_env.rb
|
@@ -604,6 +611,8 @@ files:
|
|
604
611
|
- lib/inspec/resources/ssh_config.rb
|
605
612
|
- lib/inspec/resources/sshd_config.rb
|
606
613
|
- lib/inspec/resources/ssl.rb
|
614
|
+
- lib/inspec/resources/sybase_conf.rb
|
615
|
+
- lib/inspec/resources/sybase_session.rb
|
607
616
|
- lib/inspec/resources/sys_info.rb
|
608
617
|
- lib/inspec/resources/systemd_service.rb
|
609
618
|
- lib/inspec/resources/sysv_service.rb
|