From: Michael Tremer Date: Sat, 6 Dec 2025 18:19:54 +0000 (+0000) Subject: dnsbl: Support exporting RPZ zone files X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3bd5a42fde72cf9804ab5278aeb072479c5070d;p=dnsbl.git dnsbl: Support exporting RPZ zone files Signed-off-by: Michael Tremer --- diff --git a/src/dnsbl/lists.py b/src/dnsbl/lists.py index 023fb40..4caa246 100644 --- a/src/dnsbl/lists.py +++ b/src/dnsbl/lists.py @@ -19,6 +19,7 @@ ############################################################################### import datetime +import functools import logging import sqlmodel import typing @@ -136,6 +137,10 @@ class List(sqlmodel.SQLModel, database.BackendMixin, table=True): # Updated At updated_at : datetime.datetime | None + @functools.cached_property + def zone(self): + return "%s.dnsbl.ipfire.org." % self.slug + @property def domains(self): """ @@ -200,7 +205,7 @@ class List(sqlmodel.SQLModel, database.BackendMixin, table=True): # Export! - def export(self, f, format): + def export(self, f, format, ttl=60, rpz_action="."): """ Exports the list """ @@ -209,5 +214,26 @@ class List(sqlmodel.SQLModel, database.BackendMixin, table=True): for domain in self.domains: f.write("%s\n" % domain) + # Write a RPZ zone file + elif format == "rpz": + # Write the SOA + f.write("%s\n" % " ".join(( + self.zone, + "%s" % ttl, + "IN", + "SOA", + "master.lwldns.net.", + "hostmaster.ipfire.org.", + self.updated_at.strftime("%s"), + "3600", + "600", + "3600000", + "%s" % ttl, + ))) + + # Write all domains + for domain in self.domains: + f.write("%s.%s %s IN CNAME %s\n" % (domain, self.zone, ttl, rpz_action)) + else: raise ValueError("Unknown output format: %s" % format) diff --git a/src/scripts/dnsbl.in b/src/scripts/dnsbl.in index 57f76e7..68027b3 100644 --- a/src/scripts/dnsbl.in +++ b/src/scripts/dnsbl.in @@ -96,7 +96,7 @@ class CLI(object): # export export = subparsers.add_parser("export", help=_("Exports a list")) export.add_argument("list", help=_("The name of the list")) - export.add_argument("--format", default="domains", choices=("domains",), + export.add_argument("--format", default="domains", choices=("domains", "rpz",), help=_("Output Format")) export.set_defaults(func=self.__export)