2015-06-07 15:09:02 +00:00
|
|
|
# encoding: utf-8
|
|
|
|
# copyright: 2015, Dominik Richter
|
|
|
|
# license: All rights reserved
|
|
|
|
|
2015-06-19 18:11:26 +00:00
|
|
|
module Vulcano
|
2015-09-25 17:14:32 +00:00
|
|
|
class Rule
|
|
|
|
def initialize(id, _opts, &block)
|
|
|
|
@id = id
|
|
|
|
@impact = nil
|
|
|
|
@__code = ''
|
|
|
|
@__block = block
|
|
|
|
@title = nil
|
|
|
|
@desc = nil
|
|
|
|
# not changeable by the user:
|
|
|
|
@profile_id = nil
|
|
|
|
@checks = []
|
|
|
|
# evaluate the given definition
|
|
|
|
instance_eval(&block) if block_given?
|
2015-06-19 18:11:26 +00:00
|
|
|
end
|
|
|
|
|
2015-09-25 17:14:32 +00:00
|
|
|
def id(*_)
|
|
|
|
# never overwrite the ID
|
|
|
|
@id
|
2015-06-19 18:11:26 +00:00
|
|
|
end
|
|
|
|
|
2015-09-25 17:14:32 +00:00
|
|
|
def impact(v = nil)
|
|
|
|
@impact = v unless v.nil?
|
|
|
|
@impact
|
2015-08-12 19:03:41 +00:00
|
|
|
end
|
2015-06-18 15:32:40 +00:00
|
|
|
|
2015-09-25 17:14:32 +00:00
|
|
|
def title(v = nil)
|
|
|
|
@title = v unless v.nil?
|
|
|
|
@title
|
2015-06-19 19:43:04 +00:00
|
|
|
end
|
2015-06-19 19:17:56 +00:00
|
|
|
|
2015-09-25 17:14:32 +00:00
|
|
|
def desc(v = nil)
|
|
|
|
@desc = v unless v.nil?
|
|
|
|
@desc
|
2015-06-19 22:00:53 +00:00
|
|
|
end
|
2015-06-19 20:18:54 +00:00
|
|
|
|
2015-09-25 17:14:32 +00:00
|
|
|
def describe(sth, &block)
|
|
|
|
@checks.push(['describe', [sth], block])
|
2015-06-19 22:00:53 +00:00
|
|
|
end
|
|
|
|
|
2015-09-25 17:14:32 +00:00
|
|
|
def self.merge(dst, src)
|
|
|
|
if src.id != dst.id
|
|
|
|
# TODO: register an error, this case should not happen
|
|
|
|
return
|
|
|
|
end
|
|
|
|
sp = src.instance_variable_get(:@profile_id)
|
|
|
|
dp = dst.instance_variable_get(:@profile_id)
|
|
|
|
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 = src.instance_variable_get(:@checks)
|
|
|
|
unless sc.nil? || sc.empty?
|
|
|
|
dst.instance_variable_set(:@checks, sc)
|
|
|
|
end
|
2015-06-19 22:00:53 +00:00
|
|
|
end
|
|
|
|
|
2015-09-25 17:14:32 +00:00
|
|
|
# Get the full id consisting of profile id + rule id
|
|
|
|
# for the rule. If the rule's profile id is empty,
|
|
|
|
# the given profile_id will be used instead and also
|
|
|
|
# set for the rule.
|
|
|
|
def self.full_id(profile_id, rule)
|
|
|
|
if rule.is_a?(String) or rule.nil?
|
|
|
|
rid = rule
|
2015-06-19 22:00:53 +00:00
|
|
|
else
|
2015-09-25 17:14:32 +00:00
|
|
|
# As the profile context is exclusively pulled with a
|
|
|
|
# profile ID, attach it to the rule if necessary.
|
|
|
|
rid = rule.instance_variable_get(:@id)
|
|
|
|
if rid.nil?
|
|
|
|
# TODO: Message about skipping this rule
|
|
|
|
# due to missing ID
|
|
|
|
return nil
|
|
|
|
end
|
2015-06-19 22:00:53 +00:00
|
|
|
end
|
2015-09-25 17:14:32 +00:00
|
|
|
pid = rule.instance_variable_get(:@profile_id)
|
|
|
|
if pid.nil?
|
|
|
|
rule.instance_variable_set(:@profile_id, profile_id)
|
|
|
|
pid = profile_id
|
2015-06-19 18:11:26 +00:00
|
|
|
end
|
2015-09-25 17:14:32 +00:00
|
|
|
if pid.nil? or pid.empty?
|
|
|
|
return rid
|
|
|
|
else
|
|
|
|
return "#{pid}/#{rid}"
|
2015-06-20 00:21:08 +00:00
|
|
|
end
|
2015-06-18 15:32:40 +00:00
|
|
|
end
|
|
|
|
end
|
2015-06-19 18:11:26 +00:00
|
|
|
end
|