eulaurarien/export.py

92 lines
2.5 KiB
Python
Raw Normal View History

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