class Inspec::ProfileContext

Attributes

backend[R]
current_load[R]
library_eval_context[R]
profile_id[R]
profile_name[R]
resource_registry[R]
rules[RW]

Public Class Methods

for_profile(profile, backend) click to toggle source
# File lib/inspec/profile_context.rb, line 12
def self.for_profile(profile, backend)
  new(profile.name, backend, { "profile" => profile, "check_mode" => profile.check_mode })
end
new(profile_id, backend, conf) click to toggle source
# File lib/inspec/profile_context.rb, line 19
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.key?("profile") ? @conf["profile"].profile_name : @profile_id
  @skip_only_if_eval = @conf["check_mode"]
  @rules = {}
  @control_subcontexts = []
  @lib_subcontexts = []
  @require_loader = ::Inspec::RequireLoader.new
  Inspec::InputRegistry.register_profile_alias(@profile_id, @profile_name) if @profile_id != @profile_name
  # TODO: consider polling input source plugins; this is a bulk fetch opportunity

  # 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

Public Instance Methods

add_resources(context) click to toggle source
# File lib/inspec/profile_context.rb, line 112
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) click to toggle source
# File lib/inspec/profile_context.rb, line 119
def add_subcontext(context)
  @control_subcontexts << context
end
all_controls() click to toggle source
# File lib/inspec/profile_context.rb, line 93
def all_controls
  ret = @rules.values.compact
  ret += @control_subcontexts.map(&:all_rules).flatten
  ret
end
Also aliased as: all_rules
all_rules()
Alias for: all_controls
attributes() click to toggle source
# File lib/inspec/profile_context.rb, line 43
def attributes
  Inspec::AttributeRegistry.list_attributes_for_profile(@profile_id)
end
control_eval_context() click to toggle source
# File lib/inspec/profile_context.rb, line 59
def control_eval_context
  @control_eval_context ||=
    Inspec::ControlEvalContext.new(self,
                                   to_resources_dsl,
                                   @backend,
                                   @conf,
                                   dependencies,
                                   @require_loader,
                                   @skip_only_if_eval)
end
dependencies() click to toggle source
# File lib/inspec/profile_context.rb, line 47
def dependencies
  if @conf["profile"].nil?
    {}
  else
    @conf["profile"].locked_dependencies
  end
end
load(*args)
Alias for: load_control_file
load_control_file(*args) click to toggle source
# File lib/inspec/profile_context.rb, line 151
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
Also aliased as: load
load_libraries(libs) click to toggle source
# File lib/inspec/profile_context.rb, line 123
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|
    next unless source.end_with?(".rb")

    path = source
    if source.start_with?(lib_prefix)
      path = source.sub(lib_prefix, "")
      no_subdir = File.dirname(path) == "."

      autoloads.push(path) if no_subdir
    end

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

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

  reload_dsl
end
load_library_file(*args) click to toggle source
# File lib/inspec/profile_context.rb, line 158
def load_library_file(*args)
  load_with_context(@library_eval_context, *args)
end
load_with_context(context, content, source = nil, line = nil) click to toggle source
# File lib/inspec/profile_context.rb, line 162
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?() click to toggle source
# File lib/inspec/profile_context.rb, line 80
def profile_supports_inspec_version?
  return true if @conf["profile"].nil?

  @conf["profile"].supports_runtime?
end
profile_supports_platform?() click to toggle source
# File lib/inspec/profile_context.rb, line 74
def profile_supports_platform?
  return true if @conf["profile"].nil?

  @conf["profile"].supports_platform?
end
register_rule(r) click to toggle source
# File lib/inspec/profile_context.rb, line 183
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_dsl() click to toggle source
# File lib/inspec/profile_context.rb, line 70
def reload_dsl
  @control_eval_context = nil
end
remove_rule(id) click to toggle source
# File lib/inspec/profile_context.rb, line 86
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) click to toggle source
# File lib/inspec/profile_context.rb, line 203
def set_header(field, val)
  @current_load[field] = val
end
subcontext_by_name(name) click to toggle source
# File lib/inspec/profile_context.rb, line 100
def subcontext_by_name(name)
  found = @lib_subcontexts.find { |c| c.profile_id == name }
  unless found
    @lib_subcontexts.each do |c|
      found = c.subcontext_by_name(name)
      break if found
    end
  end

  found
end
to_resources_dsl() click to toggle source
# File lib/inspec/profile_context.rb, line 55
def to_resources_dsl
  DomainSpecificLunacy.create_dsl(self)
end
unregister_rule(id) click to toggle source
# File lib/inspec/profile_context.rb, line 174
def unregister_rule(id)
  @rules.delete(full_id(@profile_id, id))
  @control_subcontexts.each do |c|
    c.unregister_rule(id)
  end
end

Private Instance Methods

full_id(pid, rid) click to toggle source
# File lib/inspec/profile_context.rb, line 209
def full_id(pid, rid)
  return rid.to_s if pid.to_s.empty?

  pid.to_s + "/" + rid.to_s
end