Class: Inspec::Config

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Plugin::V2::FilterPredicates
Defined in:
lib/inspec/config.rb

Defined Under Namespace

Classes: Defaults

Constant Summary collapse

GENERIC_CREDENTIALS =

These are options that apply to any transport

%w{
  backend
  logger
  sudo
  sudo_password
  sudo_command
  sudo_options
  shell
  shell_options
  shell_command
}.freeze
AUDIT_LOG_OPTIONS =
%w{
  audit_log_location
  enable_audit_log
  audit_log_app_name
}.freeze
KNOWN_VERSIONS =
[
  "1.1",
  "1.2",
].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Plugin::V2::FilterPredicates

#inspec_plugin_name?, #train_plugin_name?, #valid_plugin_name?

Constructor Details

#initialize(cli_opts = {}, cfg_io = nil, command_name = nil) ⇒ Config

This gets called when the first config is created.



62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/inspec/config.rb', line 62

def initialize(cli_opts = {}, cfg_io = nil, command_name = nil)
  @command_name = command_name || (ARGV.empty? ? nil : ARGV[0].to_sym)
  @defaults = Defaults.for_command(@command_name)
  @plugin_cfg = {}

  @cli_opts = cli_opts.dup
  cfg_io = resolve_cfg_io(@cli_opts, cfg_io)
  @cfg_file_contents = read_cfg_file_io(cfg_io)

  @merged_options = merge_options
  @final_options = finalize_options
  self.class.cached = self
end

Instance Attribute Details

#final_optionsObject (readonly)

Returns the value of attribute final_options.



44
45
46
# File 'lib/inspec/config.rb', line 44

def final_options
  @final_options
end

Class Method Details

.__resetObject

clear the cached config



165
166
167
# File 'lib/inspec/config.rb', line 165

def self.__reset
  @cached_config = nil
end

.cachedObject

Use this to get a cached version of the config. This prevents you from being required to pass it around everywhere.



53
54
55
# File 'lib/inspec/config.rb', line 53

def self.cached
  @cached_config ||= {}
end

.cached=(cfg) ⇒ Object



57
58
59
# File 'lib/inspec/config.rb', line 57

def self.cached=(cfg)
  @cached_config ||= cfg
end

.mock(opts = {}) ⇒ Object

This makes it easy to make a config with a mock backend.



47
48
49
# File 'lib/inspec/config.rb', line 47

def self.mock(opts = {})
  Inspec::Config.new({ backend: :mock }.merge(opts), StringIO.new("{}"))
end

Instance Method Details

#allow_unsigned_profiles?Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/inspec/config.rb', line 90

def allow_unsigned_profiles?
  self["allow_unsigned_profiles"] || ENV["CHEF_ALLOW_UNSIGNED_PROFILES"]
end

#diagnoseObject



76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/inspec/config.rb', line 76

def diagnose
  return unless self[:diagnose]

  puts "InSpec version: #{Inspec::VERSION}"
  puts "Train version: #{Train::VERSION}"
  puts "Command line configuration:"
  pp @cli_opts
  puts "JSON configuration file:"
  pp @cfg_file_contents
  puts "Merged configuration:"
  pp @merged_options
  puts
end

#fetch_plugin_config(plugin_name) ⇒ Object

———————————————————————–#

Handling Plugin Data

———————————————————————–#



147
148
149
# File 'lib/inspec/config.rb', line 147

def fetch_plugin_config(plugin_name)
  Thor::CoreExt::HashWithIndifferentAccess.new(@plugin_cfg[plugin_name] || {})
end

#merge_plugin_config(plugin_name, additional_plugin_config) ⇒ Object



157
158
159
160
161
162
# File 'lib/inspec/config.rb', line 157

def merge_plugin_config(plugin_name, additional_plugin_config)
  plugin_name = plugin_name.to_s unless plugin_name.is_a? String

  @plugin_cfg[plugin_name] = {} if @plugin_cfg[plugin_name].nil?
  @plugin_cfg[plugin_name].merge!(additional_plugin_config)
end

#set_plugin_config(plugin_name, plugin_config) ⇒ Object



151
152
153
154
155
# File 'lib/inspec/config.rb', line 151

def set_plugin_config(plugin_name, plugin_config)
  plugin_name = plugin_name.to_s unless plugin_name.is_a? String

  @plugin_cfg[plugin_name] = plugin_config
end

#telemetry_optionsHash

return all telemetry options from config

Returns:



96
97
98
# File 'lib/inspec/config.rb', line 96

def telemetry_options
  final_options.select { |key, _| key.include?("telemetry") }
end

#unpack_train_credentialsObject

Returns a Hash with Symbol keys as follows:

backend: machine name of the Train transport needed
If present, any of the GENERIC_CREDENTIALS.
All other keys are specific to the backend.

The credentials are gleaned from:

* the Train transport defaults. Train handles this on transport creation,
    so this method doesn't load defaults.
* individual InSpec CLI options (which in many cases may have the
    transport name prefixed, which is stripped before being added
    to the creds hash)
* the --target CLI option, which is interpreted:
   - as a transport://credset format, which looks up the creds in
     the config file in the credentials section
   - as an arbitrary URI, which is parsed by Train.unpack_target_from_uri


120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/inspec/config.rb', line 120

def unpack_train_credentials
  # Internally, use indifferent access while we build the creds
  credentials = Thor::CoreExt::HashWithIndifferentAccess.new({})
  # Helper methods prefixed with _utc_ (Unpack Train Credentials)

  credentials.merge!(_utc_generic_credentials)

  # Only runs this block when preview flag CHEF_PREVIEW_AUDIT_LOGGING is set
  Inspec.with_feature("inspec-audit-logging") {
    credentials.merge!(_utc_merge_audit_log_options)
  }
  _utc_determine_backend(credentials)
  transport_name = credentials[:backend].to_s

  _utc_merge_credset(credentials, transport_name)
  _utc_merge_transport_options(credentials, transport_name)

  # Convert to all-Symbol keys
  credentials.each_with_object({}) do |(option, value), creds|
    creds[option.to_sym] = value
    creds
  end
end