Module: Inspec::DSL

Defined in:
lib/inspec/dsl.rb

Overview

copyright: 2015, Dominik Richter license: All rights reserved author: Dominik Richter author: Christoph Hartmann

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.filter_included_controls(context, opts, &block) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/inspec/dsl.rb', line 53

def self.filter_included_controls(context, opts, &block)
  mock = Inspec::Backend.create({ backend: 'mock' })
  include_ctx = Inspec::ProfileContext.new(opts[:profile_id], mock, opts[:conf])
  include_ctx.load(block) if block_given?
  # remove all rules that were not registered
  context.rules.keys.each do |id|
    unless include_ctx.rules[id]
      context.rules[id] = nil
    end
  end
end

.get_reference_profile(id, opts) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/inspec/dsl.rb', line 65

def self.get_reference_profile(id, opts)
  profiles_path = opts['profiles_path'] ||
                  fail('You must supply a --profiles-path to inherit from other profiles.')
  abs_path = File.expand_path(profiles_path.to_s)
  unless File.directory? abs_path
    fail("Cannot find profiles path #{abs_path}")
  end

  id_path = File.join(abs_path, id)
  unless File.directory? id_path
    fail("Cannot find referenced profile #{id} in #{id_path}")
  end

  id_path
end

.load_profile_context(id, profile, opts) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
# File 'lib/inspec/dsl.rb', line 81

def self.load_profile_context(id, profile, opts)
  ctx = Inspec::ProfileContext.new(id, opts[:backend], opts[:conf])
  profile.libraries.each do |path, content|
    ctx.load(content.to_s, path, 1)
    ctx.reload_dsl
  end
  profile.tests.each do |path, content|
    ctx.load(content.to_s, path, 1)
  end
  ctx
end

.load_spec_files_for_profile(bind_context, opts, &block) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/inspec/dsl.rb', line 34

def self.load_spec_files_for_profile(bind_context, opts, &block)
  # get all spec files
  target = get_reference_profile(opts[:profile_id], opts[:conf])
  profile = Inspec::Profile.for_target(target, opts)
  context = load_profile_context(opts[:profile_id], profile, opts)

  # if we don't want all the rules, then just make 1 pass to get all rule_IDs
  # that we want to keep from the original
  filter_included_controls(context, opts, &block) if !opts[:include_all]

  # interpret the block and skip/modify as required
  context.load(block) if block_given?

  # finally register all combined rules
  context.rules.values.each do |control|
    bind_context.register_control(control)
  end
end

.rule_from_check(m, a, b) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/inspec/dsl.rb', line 21

def self.rule_from_check(m, a, b)
  if a.is_a?(Array) && !a.empty? &&
     a[0].respond_to?(:resource_skipped) &&
     !a[0].resource_skipped.nil?
    ::Inspec::Rule.__send__(m, *a) do
      it a[0].resource_skipped
    end
  else
    # execute the method
    ::Inspec::Rule.__send__(m, *a, &b)
  end
end

Instance Method Details

#include_controls(id, &block) ⇒ Object Also known as: include_rules



13
14
15
16
# File 'lib/inspec/dsl.rb', line 13

def include_controls(id, &block)
  opts = { profile_id: id, include_all: true, backend: @backend, conf: @conf }
  ::Inspec::DSL.load_spec_files_for_profile(self, opts, &block)
end

#require_controls(id, &block) ⇒ Object Also known as: require_rules



8
9
10
11
# File 'lib/inspec/dsl.rb', line 8

def require_controls(id, &block)
  opts = { profile_id: id, include_all: false, backend: @backend, conf: @conf }
  ::Inspec::DSL.load_spec_files_for_profile(self, opts, &block)
end