diff --git a/securityrules.py b/securityrules.py new file mode 100644 index 0000000000000000000000000000000000000000..732844bade8bbc445b89703c802e4958d22df830_c2VjdXJpdHlydWxlcy5weQ== --- /dev/null +++ b/securityrules.py @@ -0,0 +1,101 @@ +import sys +import os +import re +import argparse + +all_rules = {} + +def rules_exec(seclass, numrule=None, info=False, fo=None, export=None): + global all_rules, args + rules = all_rules[seclass][1] + m = all_rules[seclass][0] + if numrule is None: + for r in rules: + if info: + print getattr(m, r).__name__ + print getattr(m, r).__doc__ + print + else: + getattr(m, r)(fo, export) + else: + for n in numrule: + rname = 'rule%s%02d' % (seclass[-2:], n) + if rname in rules: + if info: + print getattr(m, rname).__name__ + print getattr(m, rname).__doc__ + print + else: + getattr(m, rname)(fo, export) + +class InflateRange(argparse.Action): + def __call__(self, parser, namespace, values, option_string=None): + lst = [] + for string in values: + string = string.replace('(', '') + string = string.replace(')', '') + if '-' in string or ':' in string: + string = string.replace(':', '-') + m = re.match(r'(\d+)(?:-(\d+))?$', string) + # ^ (or use .split('-'). anyway you like.) + if not m: + raise argparse.ArgumentTypeError("'" + string + "' is not a range of number. Expected forms like '0-5' or '2'.") + start = m.group(1) + end = m.group(2) or start + lst.extend(list(range(int(start,10), int(end,10)+1))) + else: + string = string.replace(',', ' ') + for string in string.split(' '): + if string: + lst.append(int(string)) + setattr(namespace, self.dest, lst) + +def load_rules(levels): + global all_rules + mods = [fn[:-3] for fn in os.listdir('./secrules') + if fn.startswith('rule') and fn[-1:].lower() == 'y'] + all_rules = {} + for modn in mods: + m = __import__('secrules.' + modn, globals(), locals(), ['*'], -1) + lst = [m,[]] + for r in dir(m): + if r.startswith('rule'): + if (levels is None or + not hasattr(getattr(m, r), 'rule_level') or + getattr(m, r).rule_level in levels): + lst[1].append(r) + all_rules[modn] = lst + # all_rules[modn] = (m, [r for r in dir(m) if r.startswith('rule')]) + + +def main(): + global args + parser = argparse.ArgumentParser(description='security checker') + parser.add_argument('--output', type=argparse.FileType('w'), dest='fo', + metavar='out-file', help='output file', default=sys.stdout) + parser.add_argument('--class', type=int, dest='seclass', help='security class') + parser.add_argument('--rule', action=InflateRange, nargs='*', dest='numrule', help='rule number') + parser.add_argument('--export', action='store_true', dest='export', + default=False, help='export format') + parser.add_argument('--info', action='store_true', dest='info', + default=False, help='Rules info') + parser.add_argument('--level', action=InflateRange, nargs='*', dest='levels', help='rule levels') + + args = parser.parse_args() + + load_rules(args.levels) + + if args.seclass is None: + if args.numrule is not None: + raise argparse.ArgumentTypeError("missing seclass argument") + lst = all_rules.keys() + lst.sort() + for seclass in lst: +# seclass = 'rules%02d' % args.seclass + rules_exec(seclass, args.numrule, args.info, args.fo, args.export) + else: + seclass = 'rules%02d' % args.seclass + rules_exec(seclass, args.numrule, args.info, args.fo, args.export) + +if __name__ == '__main__': + main()