def test_parse_rule(rulefile, expectation): rules = WhisperRules() rulefile = Path(rule_path(rulefile)) rule_id, rule = load_yaml_from_file(rulefile).popitem() with expectation: parsed_rule = rules.parse_rule(rule_id, rule) assert parsed_rule["message"] == rule["message"]
def load_rules_from_file(self, rulefile: Path): if not rulefile.exists(): raise FileNotFoundError( f"Rule file {rulefile.as_posix()} not found") rules = load_yaml_from_file(rulefile) for rule_id, rule in rules.items(): self.load_rule(rule_id, rule)
def test_load_rule(dups, expectation): rules = WhisperRules() rulefile = Path(rule_path("valid.yml")) rule_id, rule = load_yaml_from_file(rulefile).popitem() with expectation: for _ in range(dups): rules.load_rule(rule_id, rule) assert rule_id in rules.rules assert rules.rules[rule_id] == rule
def test_load_rules(rulefile, expectation): rules = WhisperRules(rule_path("empty.yml")) rulefile = rule_path(rulefile) ruleyaml = load_yaml_from_file(Path(rulefile)) with expectation: rules.load_rules(rulefile) assert len(rules.rules) == len(ruleyaml) for rule_id in ruleyaml.keys(): assert rule_id in rules.rules
def load_config(configfile, src="."): configfile = Path(configfile) if not configfile.exists(): debug(f"{configfile} does not exist") raise FileNotFoundError if not configfile.is_file(): debug(f"{configfile} is not a file") raise TypeError config = load_yaml_from_file(configfile) # Ensure minimal expected config structure try: if "exclude" not in config: config["exclude"] = {"files": [], "keys": [], "values": []} else: for idx in ["files", "keys", "values"]: if idx not in config["exclude"]: config["exclude"][idx] = [] if "include" not in config: config["include"] = {"files": ["**/*"]} elif "files" not in config["include"]: config["include"]["files"] = ["**/*"] except Exception: debug(f"{configfile} is not valid") raise NameError # Glob excluded files exfiles = [] for fileglob in config["exclude"]["files"]: for filepath in Path(src).glob(fileglob): exfiles.append(filepath) config["exclude"]["files"] = exfiles # Compile regex from excluded keys and values for param in ["keys", "values"]: excluded = [] for item in config["exclude"][param]: excluded.append(re.compile(item, flags=re.IGNORECASE)) config["exclude"][param] = excluded # Optional: rules if "rules" not in config: config["rules"] = {} return config
def test_load_rules_from_dict(rulefile, rules_added): rules = WhisperRules() rules_len = len(rules.rules) custom_rules = load_yaml_from_file(Path(rule_path(rulefile))) rules.load_rules_from_dict(custom_rules) assert len(rules.rules) == rules_len + rules_added
def test_load_yaml_from_file(rulefile, expected_count): rulefile = Path(rule_path(rulefile)) assert len(load_yaml_from_file(rulefile)) == expected_count