Exemple #1
0
class ComplexRules(ScannerPlugin):
    """ """
    def __init__(self,config,section=None):
        ScannerPlugin.__init__(self,config,section)
        self.logger=self._logger()
        self.requiredvars={
            'filename':{
                'default':'/etc/postomaat/complexrules.cf',
                'description':'File containing rules',
            },
        }
        self.ruleparser=ComplexRuleParser()
        self.filereloader=FileList()
        
    def examine(self,suspect):        
        if not PYPARSING_AVAILABLE:
            return DUNNO,''
        
        filename=self.config.get(self.section,'filename').strip()
        if not os.path.exists(filename):
            self.logger.error("Rulefile %s does not exist"%filename)
            return DUNNO,''
        self.filereloader.filename=filename
        newcontent=self.filereloader._reload_if_necessary()
        if newcontent:
            self.ruleparser.clear_rules()
            reloadok=self.ruleparser.rules_from_list(self.filereloader.content)
            numrules=len(self.ruleparser.rules)
            if reloadok:
                okmsg="all rules ok"
            else:
                okmsg="some rules failed to load"
            self.logger.info("Rule reload complete, %s rules now active, (%s)"%(numrules,okmsg))
        
        retaction,retmessage=self.ruleparser.apply(suspect.values)
        return retaction,retmessage

    def lint(self):
        if not PYPARSING_AVAILABLE:
            print("pyparsing is not installed, can not use complex rules")
            return False

        if RE2_AVAILABLE:
            print("Using re2(google) library")

        if not self.checkConfig():
            print('Error checking config')
            return False

        filename=self.config.get(self.section,'filename').strip()
        if not os.path.exists(filename):
            print("Rulefile %s does not exist"%filename)
            return False
        
        self.filereloader.filename=filename
        newcontent=self.filereloader._reload_if_necessary()
        assert newcontent
        
        self.ruleparser.clear_rules()
        ok= self.ruleparser.rules_from_list(self.filereloader.content)
        rulecount=len(self.ruleparser.rules)
        print("%s rules ok"%(rulecount))
        return ok

                        
    def __str__(self):
        return "Complex Rules"