Class: Inspec::ProfileContext

Inherits:
Object
  • Object
show all
Defined in:
lib/inspec/profile_context.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(profile_id, backend, conf) ⇒ ProfileContext

Returns a new instance of ProfileContext.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/inspec/profile_context.rb', line 23

def initialize(profile_id, backend, conf)
  if backend.nil?
    raise 'ProfileContext is initiated with a backend == nil. ' \
         'This is a backend error which must be fixed upstream.'
  end
  @profile_id = profile_id
  @backend = backend
  @conf = conf.dup
  @profile_name = @conf['profile'].profile_name || @profile_id if @conf['profile']
  @skip_only_if_eval = @conf['check_mode']
  @rules = {}
  @control_subcontexts = []
  @lib_subcontexts = []
  @require_loader = ::Inspec::RequireLoader.new
  Inspec::AttributeRegistry.register_profile_alias(@profile_id, @profile_name) if @profile_id != @profile_name
  @attributes = Inspec::AttributeRegistry.list_attributes_for_profile(@profile_id)
  # A local resource registry that only contains resources defined
  # in the transitive dependency tree of the loaded profile.
  @resource_registry = Inspec::Resource.new_registry
  @library_eval_context = Inspec::LibraryEvalContext.create(@resource_registry, @require_loader)
  @current_load = nil
end

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



21
22
23
# File 'lib/inspec/profile_context.rb', line 21

def attributes
  @attributes
end

#backendObject (readonly)

Returns the value of attribute backend.



21
22
23
# File 'lib/inspec/profile_context.rb', line 21

def backend
  @backend
end

#current_loadObject (readonly)

Returns the value of attribute current_load.



168
169
170
# File 'lib/inspec/profile_context.rb', line 168

def current_load
  @current_load
end

#profile_idObject (readonly)

Returns the value of attribute profile_id.



21
22
23
# File 'lib/inspec/profile_context.rb', line 21

def profile_id
  @profile_id
end

#profile_nameObject (readonly)

Returns the value of attribute profile_name.



21
22
23
# File 'lib/inspec/profile_context.rb', line 21

def profile_name
  @profile_name
end

#resource_registryObject (readonly)

Returns the value of attribute resource_registry.



21
22
23
# File 'lib/inspec/profile_context.rb', line 21

def resource_registry
  @resource_registry
end

#rulesObject

Returns the value of attribute rules.



22
23
24
# File 'lib/inspec/profile_context.rb', line 22

def rules
  @rules
end

Class Method Details

.for_profile(profile, backend, attributes) ⇒ Object



15
16
17
18
19
# File 'lib/inspec/profile_context.rb', line 15

def self.for_profile(profile, backend, attributes)
  new(profile.name, backend, { 'profile' => profile,
                               'attributes' => attributes,
                               'check_mode' => profile.check_mode })
end

Instance Method Details

#add_resources(context) ⇒ Object



107
108
109
110
111
112
# File 'lib/inspec/profile_context.rb', line 107

def add_resources(context)
  @resource_registry.merge!(context.resource_registry)
  control_eval_context.add_resources(context)
  @lib_subcontexts << context
  reload_dsl
end

#add_subcontext(context) ⇒ Object



114
115
116
# File 'lib/inspec/profile_context.rb', line 114

def add_subcontext(context)
  @control_subcontexts << context
end

#all_controlsObject Also known as: all_rules



88
89
90
91
92
# File 'lib/inspec/profile_context.rb', line 88

def all_controls
  ret = @rules.values
  ret += @control_subcontexts.map(&:all_rules).flatten
  ret
end

#control_eval_contextObject



58
59
60
61
62
63
# File 'lib/inspec/profile_context.rb', line 58

def control_eval_context
  @control_eval_context ||= begin
                              ctx = Inspec::ControlEvalContext.create(self, to_resources_dsl)
                              ctx.new(@backend, @conf, dependencies, @require_loader, @skip_only_if_eval)
                            end
end

#dependenciesObject



46
47
48
49
50
51
52
# File 'lib/inspec/profile_context.rb', line 46

def dependencies
  if @conf['profile'].nil?
    {}
  else
    @conf['profile'].locked_dependencies
  end
end

#load_control_file(*args) ⇒ Object Also known as: load



141
142
143
144
145
# File 'lib/inspec/profile_context.rb', line 141

def load_control_file(*args)
  # Set `skip_file` to `false` between file loads to prevent skips from spanning multiple control files
  control_eval_context.skip_file = false
  load_with_context(control_eval_context, *args)
end

#load_libraries(libs) ⇒ Object



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

def load_libraries(libs)
  lib_prefix = 'libraries' + File::SEPARATOR
  autoloads = []

  libs.sort_by! { |l| l[1] } # Sort on source path so load order is deterministic
  libs.each do |content, source, line|
    path = source
    if source.start_with?(lib_prefix)
      path = source.sub(lib_prefix, '')
      autoloads.push(path) if File.dirname(path) == '.'
    end

    @require_loader.add(path, content, source, line)
  end

  # load all files directly that are flat inside the libraries folder
  autoloads.each do |path|
    next unless path.end_with?('.rb')
    load_library_file(*@require_loader.load(path)) unless @require_loader.loaded?(path)
  end
  reload_dsl
end

#load_library_file(*args) ⇒ Object



148
149
150
# File 'lib/inspec/profile_context.rb', line 148

def load_library_file(*args)
  load_with_context(@library_eval_context, *args)
end

#load_with_context(context, content, source = nil, line = nil) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
# File 'lib/inspec/profile_context.rb', line 152

def load_with_context(context, content, source = nil, line = nil)
  Inspec::Log.debug("Loading #{source || '<anonymous content>'} into #{self}")
  @current_load = { file: source }
  if content.is_a? Proc
    context.instance_eval(&content)
  elsif source.nil? && line.nil?
    context.instance_eval(content)
  else
    context.instance_eval(content, source || 'unknown', line || 1)
  end
end

#profile_supports_inspec_version?Boolean

Returns:

  • (Boolean)


75
76
77
78
79
# File 'lib/inspec/profile_context.rb', line 75

def profile_supports_inspec_version?
  return true if @conf['profile'].nil?

  @conf['profile'].supports_runtime?
end

#profile_supports_platform?Boolean

Returns:

  • (Boolean)


69
70
71
72
73
# File 'lib/inspec/profile_context.rb', line 69

def profile_supports_platform?
  return true if @conf['profile'].nil?

  @conf['profile'].supports_platform?
end

#register_attribute(name, options = {}) ⇒ Object



190
191
192
193
194
195
# File 'lib/inspec/profile_context.rb', line 190

def register_attribute(name, options = {})
  # we need to return an attribute object, to allow dermination of default values
  attribute = Inspec::AttributeRegistry.register_attribute(name, @profile_id, options)
  attribute.value = @conf['attributes'][name] unless @conf['attributes'].nil? || @conf['attributes'][name].nil?
  attribute.value
end

#register_rule(r) ⇒ Object



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/inspec/profile_context.rb', line 170

def register_rule(r)
  # get the full ID
  file = if @current_load.nil?
           'unknown'
         else
           @current_load[:file] || 'unknown'
         end
  r.instance_variable_set(:@__file, file)
  r.instance_variable_set(:@__group_title, current_load[:title])

  # add the rule to the registry
  fid = full_id(Inspec::Rule.profile_id(r), Inspec::Rule.rule_id(r))
  existing = @rules[fid]
  if existing.nil?
    @rules[fid] = r
  else
    Inspec::Rule.merge(existing, r)
  end
end

#reload_dslObject



65
66
67
# File 'lib/inspec/profile_context.rb', line 65

def reload_dsl
  @control_eval_context = nil
end

#remove_rule(id) ⇒ Object



81
82
83
84
85
86
# File 'lib/inspec/profile_context.rb', line 81

def remove_rule(id)
  @rules[id] = nil if @rules.key?(id)
  @control_subcontexts.each do |c|
    c.remove_rule(id)
  end
end

#set_header(field, val) ⇒ Object



197
198
199
# File 'lib/inspec/profile_context.rb', line 197

def set_header(field, val)
  @current_load[field] = val
end

#subcontext_by_name(name) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
# File 'lib/inspec/profile_context.rb', line 95

def subcontext_by_name(name)
  found = @lib_subcontexts.find { |c| c.profile_id == name }
  if !found
    @lib_subcontexts.each do |c|
      found = c.subcontext_by_name(name)
      break if found
    end
  end

  found
end

#to_resources_dslObject



54
55
56
# File 'lib/inspec/profile_context.rb', line 54

def to_resources_dsl
  Inspec::Resource.create_dsl(self)
end

#unregister_rule(id) ⇒ Object



164
165
166
# File 'lib/inspec/profile_context.rb', line 164

def unregister_rule(id)
  @rules.delete(full_id(@profile_id, id))
end