92 lines
2.5 KiB
Python
Executable file
92 lines
2.5 KiB
Python
Executable file
#!/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)
|