]> git.ipfire.org Git - dnsbl.git/commitdiff
dnsbl: Support exporting RPZ zone files
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 6 Dec 2025 18:19:54 +0000 (18:19 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 6 Dec 2025 18:19:54 +0000 (18:19 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/dnsbl/lists.py
src/scripts/dnsbl.in

index 023fb40b6e7c164be54f0954bd1a295a53c80cc9..4caa24689f67e2e758179fc35d3e3dc59a1182e9 100644 (file)
@@ -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)
index 57f76e70851920d354ff11733ca43fc9b8c6aaf2..68027b3ed5af1475732fc323dff8e3feb9bb5ae9 100644 (file)
@@ -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)