Class: Inspec::Rule

Inherits:
Object
  • Object
show all
Includes:
RSpec::Matchers
Defined in:
lib/inspec/rule.rb

Overview

rubocop:disable Metrics/ClassLength

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id, profile_id, _opts, &block) ⇒ Rule

Returns a new instance of Rule.



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

def initialize(id, profile_id, _opts, &block)
  @impact = nil
  @title = nil
  @desc = nil
  @refs = []
  @tags = {}

  # not changeable by the user:
  @__block = block
  @__source_location = __get_block_source_location(&block)
  @__rule_id = id
  @__profile_id = profile_id
  @__checks = []
  @__skip_rule = nil
  @__merge_count = 0

  # evaluate the given definition
  instance_eval(&block) if block_given?
end

Class Method Details

.checks(rule) ⇒ Object



147
148
149
# File 'lib/inspec/rule.rb', line 147

def self.checks(rule)
  rule.instance_variable_get(:@__checks)
end

.merge(dst, src) ⇒ Object



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/inspec/rule.rb', line 175

def self.merge(dst, src)
  if src.id != dst.id
    # TODO: register an error, this case should not happen
    return
  end
  sp = rule_id(src)
  dp = rule_id(dst)
  if sp != dp
    # TODO: register an error, this case should not happen
    return
  end
  # merge all fields
  dst.impact(src.impact) unless src.impact.nil?
  dst.title(src.title)   unless src.title.nil?
  dst.desc(src.desc)     unless src.desc.nil?
  # merge indirect fields
  # checks defined in the source will completely eliminate
  # all checks that were defined in the destination
  sc = checks(src)
  dst.instance_variable_set(:@__checks, sc) unless sc.empty?
  sr = skip_status(src)
  set_skip_rule(dst, sr) unless sr.nil?
  # increment merge count
  dst.instance_variable_set(:@__merge_count, merge_count(dst) + 1)
end

.merge_count(rule) ⇒ Object



159
160
161
# File 'lib/inspec/rule.rb', line 159

def self.merge_count(rule)
  rule.instance_variable_get(:@__merge_count)
end

.prepare_checks(rule) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
# File 'lib/inspec/rule.rb', line 163

def self.prepare_checks(rule)
  msg = skip_status(rule)
  return checks(rule) unless msg
  msg = 'Skipped control due to only_if condition.' if msg == true

  # TODO: we use os as the carrier here, but should consider
  # a separate resource to do skipping
  resource = rule.os
  resource.skip_resource(msg)
  [['describe', [resource], nil]]
end

.profile_id(rule) ⇒ Object



143
144
145
# File 'lib/inspec/rule.rb', line 143

def self.profile_id(rule)
  rule.instance_variable_get(:@__profile_id)
end

.resource_dslObject

rubocop:disable Style/TrivialAccessors



28
29
30
# File 'lib/inspec/rule.rb', line 28

def self.resource_dsl # rubocop:disable Style/TrivialAccessors
  @resource_dsl
end

.rule_id(rule) ⇒ Object



135
136
137
# File 'lib/inspec/rule.rb', line 135

def self.rule_id(rule)
  rule.instance_variable_get(:@__rule_id)
end

.set_rule_id(rule, value) ⇒ Object



139
140
141
# File 'lib/inspec/rule.rb', line 139

def self.set_rule_id(rule, value)
  rule.instance_variable_set(:@__rule_id, value)
end

.set_skip_rule(rule, value) ⇒ Object



155
156
157
# File 'lib/inspec/rule.rb', line 155

def self.set_skip_rule(rule, value)
  rule.instance_variable_set(:@__skip_rule, value)
end

.skip_status(rule) ⇒ Object



151
152
153
# File 'lib/inspec/rule.rb', line 151

def self.skip_status(rule)
  rule.instance_variable_get(:@__skip_rule)
end

.with_resource_dsl(resource_dsl) ⇒ Object

Include any resources from the given resource DSL. The passed resource_dsl will also be included in any Inspec::Expect objects we make.



22
23
24
25
26
# File 'lib/inspec/rule.rb', line 22

def self.with_resource_dsl(resource_dsl)
  include resource_dsl
  @resource_dsl = resource_dsl
  true
end

Instance Method Details

#desc(v = nil) ⇒ Object



71
72
73
74
# File 'lib/inspec/rule.rb', line 71

def desc(v = nil)
  @desc = unindent(v) unless v.nil?
  @desc
end

#describe(*values, &block) ⇒ nil|DescribeBase

Describe will add one or more tests to this control. There is 2 ways of calling it:

describe resource do ... end

or

describe.one do ... end

Parameters:

  • Resource (any)

    to be describe, string, or nil

  • An (Proc)

    optional block containing tests for the described resource

Returns:

  • (nil|DescribeBase)

    if called without arguments, returns DescribeBase



118
119
120
121
122
123
124
125
126
127
# File 'lib/inspec/rule.rb', line 118

def describe(*values, &block)
  if values.empty? && !block_given?
    dsl = self.class.ancestors[1]
    Class.new(DescribeBase) do
      include dsl
    end.new(method(:__add_check))
  else
    __add_check('describe', values, with_dsl(block))
  end
end

#expect(value, &block) ⇒ Object



129
130
131
132
133
# File 'lib/inspec/rule.rb', line 129

def expect(value, &block)
  target = Inspec::Expect.new(value, &with_dsl(block))
  __add_check('expect', [value], target)
  target
end

#id(*_) ⇒ Object



56
57
58
59
# File 'lib/inspec/rule.rb', line 56

def id(*_)
  # never overwrite the ID
  @id
end

#impact(v = nil) ⇒ Object



61
62
63
64
# File 'lib/inspec/rule.rb', line 61

def impact(v = nil)
  @impact = v unless v.nil?
  @impact
end

#only_ifnil

Skip all checks if only_if is false

Parameters:

  • &block (Type)

    returns true if tests are added, false otherwise

Returns:

  • (nil)


101
102
103
104
# File 'lib/inspec/rule.rb', line 101

def only_if
  return unless block_given?
  @__skip_rule ||= !yield
end

#ref(ref = nil, opts = {}) ⇒ Object



76
77
78
79
80
81
82
83
84
# File 'lib/inspec/rule.rb', line 76

def ref(ref = nil, opts = {})
  return @refs if ref.nil? && opts.empty?
  if opts.empty? && ref.is_a?(Hash)
    opts = ref
  else
    opts[:ref] = ref
  end
  @refs.push(opts)
end

#tag(*args) ⇒ Object



86
87
88
89
90
91
92
93
94
95
# File 'lib/inspec/rule.rb', line 86

def tag(*args)
  args.each do |arg|
    if arg.is_a?(Hash)
      @tags.merge!(arg)
    else
      @tags[arg] ||= nil
    end
  end
  @tags
end

#title(v = nil) ⇒ Object



66
67
68
69
# File 'lib/inspec/rule.rb', line 66

def title(v = nil)
  @title = v unless v.nil?
  @title
end

#to_sObject



52
53
54
# File 'lib/inspec/rule.rb', line 52

def to_s
  Inspec::Rule.rule_id(self)
end