Class: Inspec::ProfileContext
- Inherits:
-
Object
- Object
- Inspec::ProfileContext
- Defined in:
- lib/inspec/profile_context.rb
Instance Attribute Summary collapse
-
#backend ⇒ Object
readonly
Returns the value of attribute backend.
-
#current_load ⇒ Object
readonly
Returns the value of attribute current_load.
-
#profile_id ⇒ Object
readonly
Returns the value of attribute profile_id.
-
#profile_name ⇒ Object
readonly
Returns the value of attribute profile_name.
-
#resource_registry ⇒ Object
readonly
Returns the value of attribute resource_registry.
-
#rules ⇒ Object
Returns the value of attribute rules.
Class Method Summary collapse
Instance Method Summary collapse
- #add_resources(context) ⇒ Object
- #add_subcontext(context) ⇒ Object
- #all_controls ⇒ Object (also: #all_rules)
- #attributes ⇒ Object
- #control_eval_context ⇒ Object
- #dependencies ⇒ Object
-
#initialize(profile_id, backend, conf) ⇒ ProfileContext
constructor
A new instance of ProfileContext.
- #load_control_file(*args) ⇒ Object (also: #load)
- #load_libraries(libs) ⇒ Object
- #load_library_file(*args) ⇒ Object
- #load_with_context(context, content, source = nil, line = nil) ⇒ Object
- #profile_supports_inspec_version? ⇒ Boolean
- #profile_supports_platform? ⇒ Boolean
- #register_rule(r) ⇒ Object
- #reload_dsl ⇒ Object
- #remove_rule(id) ⇒ Object
- #set_header(field, val) ⇒ Object
- #subcontext_by_name(name) ⇒ Object
- #to_resources_dsl ⇒ Object
- #unregister_rule(id) ⇒ Object
Constructor Details
#initialize(profile_id, backend, conf) ⇒ ProfileContext
Returns a new instance of ProfileContext.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/inspec/profile_context.rb', line 18 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 |
Instance Attribute Details
#backend ⇒ Object (readonly)
Returns the value of attribute backend.
16 17 18 |
# File 'lib/inspec/profile_context.rb', line 16 def backend @backend end |
#current_load ⇒ Object (readonly)
Returns the value of attribute current_load.
169 170 171 |
# File 'lib/inspec/profile_context.rb', line 169 def current_load @current_load end |
#profile_id ⇒ Object (readonly)
Returns the value of attribute profile_id.
16 17 18 |
# File 'lib/inspec/profile_context.rb', line 16 def profile_id @profile_id end |
#profile_name ⇒ Object (readonly)
Returns the value of attribute profile_name.
16 17 18 |
# File 'lib/inspec/profile_context.rb', line 16 def profile_name @profile_name end |
#resource_registry ⇒ Object (readonly)
Returns the value of attribute resource_registry.
16 17 18 |
# File 'lib/inspec/profile_context.rb', line 16 def resource_registry @resource_registry end |
#rules ⇒ Object
Returns the value of attribute rules.
17 18 19 |
# File 'lib/inspec/profile_context.rb', line 17 def rules @rules end |
Class Method Details
.for_profile(profile, backend) ⇒ Object
12 13 14 |
# 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 |
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_controls ⇒ Object 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 |
#attributes ⇒ Object
42 43 44 |
# File 'lib/inspec/profile_context.rb', line 42 def attributes Inspec::AttributeRegistry.list_attributes_for_profile(@profile_id) end |
#control_eval_context ⇒ Object
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 |
#dependencies ⇒ Object
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
142 143 144 145 146 |
# File 'lib/inspec/profile_context.rb', line 142 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 140 |
# 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
149 150 151 |
# File 'lib/inspec/profile_context.rb', line 149 def load_library_file(*args) load_with_context(@library_eval_context, *args) end |
#load_with_context(context, content, source = nil, line = nil) ⇒ Object
153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/inspec/profile_context.rb', line 153 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
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
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_rule(r) ⇒ Object
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'lib/inspec/profile_context.rb', line 171 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 ⇒ Object
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
191 192 193 |
# File 'lib/inspec/profile_context.rb', line 191 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 } unless found @lib_subcontexts.each do |c| found = c.subcontext_by_name(name) break if found end end found end |
#to_resources_dsl ⇒ Object
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
165 166 167 |
# File 'lib/inspec/profile_context.rb', line 165 def unregister_rule(id) @rules.delete(full_id(@profile_id, id)) end |