#!/usr/bin/env python3 import database import argparse import sys if __name__ == '__main__': # Parsing arguments parser = argparse.ArgumentParser( description="Export the hostnames rules stored " "in the Database as plain text") parser.add_argument( '-o', '--output', type=argparse.FileType('w'), default=sys.stdout, help="Output file, one rule per line") parser.add_argument( '-f', '--first-party', action='store_true', help="Only output rules issued from first-party sources") parser.add_argument( '-e', '--end-chain', action='store_true', help="Only output rules that are not referenced by any other") parser.add_argument( '-r', '--rules', action='store_true', help="Output all kinds of rules, not just hostnames") parser.add_argument( '-b', '--base-rules', action='store_true', help="Output base rules " "(the ones added by ./feed_rules.py) " "(implies --rules)") parser.add_argument( '-d', '--no-dupplicates', action='store_true', help="Do not output rules that already match a zone/network rule " "(e.g. dummy.example.com when there's a zone example.com rule)") parser.add_argument( '-x', '--explain', action='store_true', help="Show the chain of rules leading to one " "(and the number of references they have)") parser.add_argument( '-c', '--count', action='store_true', help="Show the number of rules per type instead of listing them") args = parser.parse_args() DB = database.Database() if args.count: assert not args.explain print(DB.count_records( first_party_only=args.first_party, end_chain_only=args.end_chain, no_dupplicates=args.no_dupplicates, rules_only=args.base_rules, hostnames_only=not (args.rules or args.base_rules), )) else: for domain in DB.list_records( first_party_only=args.first_party, end_chain_only=args.end_chain, no_dupplicates=args.no_dupplicates, rules_only=args.base_rules, hostnames_only=not (args.rules or args.base_rules), explain=args.explain, ): print(domain, file=args.output)