summaryrefslogtreecommitdiffstats
path: root/peekaboo/ruleset/engine.py
diff options
context:
space:
mode:
Diffstat (limited to 'peekaboo/ruleset/engine.py')
-rw-r--r--peekaboo/ruleset/engine.py52
1 files changed, 42 insertions, 10 deletions
diff --git a/peekaboo/ruleset/engine.py b/peekaboo/ruleset/engine.py
index 86b95e8..376cc08 100644
--- a/peekaboo/ruleset/engine.py
+++ b/peekaboo/ruleset/engine.py
@@ -28,7 +28,8 @@ import logging
from peekaboo.ruleset import Result, RuleResult
from peekaboo.ruleset.rules import *
from peekaboo.toolbox.peekabooyar import ContainsPeekabooYarRule
-from peekaboo.exceptions import PeekabooAnalysisDeferred
+from peekaboo.exceptions import PeekabooAnalysisDeferred, \
+ PeekabooConfigException, PeekabooRulesetConfigError
logger = logging.getLogger(__name__)
@@ -54,19 +55,51 @@ class RulesetEngine(object):
FinalRule
]
- def __init__(self, sample, ruleset_config, db_con):
- self.sample = sample
+ def __init__(self, ruleset_config, db_con):
self.config = ruleset_config
self.db_con = db_con
# create a lookup table from rule name to class
- self.rules = {}
+ self.rule_classes = {}
for known_rule in self.known_rules:
- self.rules[known_rule.rule_name] = known_rule
+ self.rule_classes[known_rule.rule_name] = known_rule
- def run(self):
- for rule in self.config.rule_config('rules').get('rule'):
- result = self.__exec_rule(self.sample, self.rules[rule])
+ try:
+ self.enabled_rules = self.config.getlist('rules', 'rule')
+ except PeekabooConfigException as error:
+ raise PeekabooRulesetConfigError(
+ 'Ruleset configuration error: %s' % error)
+
+ self.validate_rule_config()
+
+ def validate_rule_config(self):
+ """ Validate the rule configuration in various ways.
+
+ @returns: None
+ @raises PeekabooRulesetConfigError: if configuration errors are found
+ """
+ if not self.enabled_rules:
+ raise PeekabooRulesetConfigError(
+ 'No enabled rules found, check ruleset config.')
+
+ # check if unknown rules are enabled
+ known_rule_names = self.rule_classes.keys()
+ unknown_rules = set(self.enabled_rules) - set(known_rule_names)
+ if unknown_rules:
+ raise PeekabooRulesetConfigError(
+ 'Unknown rule(s) enabled: %s' % ', '.join(unknown_rules))
+
+ config_sections = []
+ for rule in self.enabled_rules:
+ # not passing database connection. Needs revisiting if a rule
+ # ever wants to retrieve configuration from the database. For
+ # now at least rule constructor and get_config() need to be
+ # able to cope without it.
+ rule = self.rule_classes[rule](self.config)
+
+ def run(self, sample):
+ for rule in self.enabled_rules:
+ result = self.__exec_rule(sample, self.rule_classes[rule])
if not result.further_analysis:
return
@@ -80,8 +113,7 @@ class RulesetEngine(object):
logger.debug("Processing rule '%s' for %s" % (rule_name, sample))
try:
- rule_config = self.config.rule_config(rule_name)
- rule = rule_class(config=rule_config, db_con=self.db_con)
+ rule = rule_class(config=self.config, db_con=self.db_con)
result = rule.evaluate(sample)
sample.add_rule_result(result)
except PeekabooAnalysisDeferred: