def get_rulesets(masks=None):
    '''
    Load rulesets from masks list.
    `masks` is a string containing masks separated by semicolon.
    Shell wildcards are allowed.
    Load from `rules` directory by default.
    '''
    from glob import glob
    jsoncomment = re.compile('^\s*//')
    rules_folder = os.path.join(
        os.path.dirname(os.path.abspath(__file__)), 'rules')
    rulesets = []
    if not masks:
        masks = os.path.join(rules_folder, '*')
    for mask in masks.split(';'):
        empty_mask = True
        for rule_file_or_dir in glob(mask):
            empty_mask = False
            if os.path.isdir(rule_file_or_dir):
                rule_files = glob(os.path.join(rule_file_or_dir, '*'))
            else:
                rule_files = (rule_file_or_dir,)
            for rule_file in rule_files:
                try:
                    # remove comments but preserve the same number of lines
                    jsonrule = ''.join(
                        '\n' if jsoncomment.search(line)
                        else line
                        for line
                        in codecs.open(rule_file, encoding='utf-8').readlines()
                    )
                    ruleset_dict = json.loads(jsonrule)
                except ValueError as exc:
                    LOG.error(exc)
                    LOG.error("In file: " + rule_file)
                    continue
                ruleset = RegularExpressionRuleset(ruleset_dict,
                    os.path.relpath(rule_file, rules_folder))
                rulesets.append(ruleset)
        if empty_mask:
            LOG.warn('No files matching "{0}" found'.format(mask))
    return rulesets
Example #2
0
def get_rulesets(masks=None):
    '''
    Load rulesets from masks list.
    `masks` is a string containing masks separated by semicolon.
    Shell wildcards are allowed.
    Load from `rules` directory by default.
    '''
    from glob import glob
    jsoncomment = re.compile('^\s*//')
    rules_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                'rules')
    rulesets = []
    if not masks:
        masks = os.path.join(rules_folder, '*')
    for mask in masks.split(';'):
        empty_mask = True
        for rule_file_or_dir in glob(mask):
            empty_mask = False
            if os.path.isdir(rule_file_or_dir):
                rule_files = glob(os.path.join(rule_file_or_dir, '*'))
            else:
                rule_files = (rule_file_or_dir, )
            for rule_file in rule_files:
                try:
                    # remove comments but preserve the same number of lines
                    jsonrule = ''.join(
                        '\n' if jsoncomment.search(line) else line
                        for line in codecs.open(rule_file,
                                                encoding='utf-8').readlines())
                    ruleset_dict = json.loads(jsonrule)
                except ValueError as exc:
                    LOG.error(exc)
                    LOG.error("In file: " + rule_file)
                    continue
                ruleset = RegularExpressionRuleset(
                    ruleset_dict, os.path.relpath(rule_file, rules_folder))
                rulesets.append(ruleset)
        if empty_mask:
            LOG.warn('No files matching "{0}" found'.format(mask))
    return rulesets