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
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_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