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"