From: Michael Tremer Date: Wed, 10 Dec 2025 11:36:50 +0000 (+0000) Subject: exporters: Add an exporter for squidGuard X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8494e3e9e872e11dc26da2cf79a49f216aec8fae;p=dbl.git exporters: Add an exporter for squidGuard Signed-off-by: Michael Tremer --- diff --git a/src/dnsbl/exporters.py b/src/dnsbl/exporters.py index a114430..5cebc6a 100644 --- a/src/dnsbl/exporters.py +++ b/src/dnsbl/exporters.py @@ -23,6 +23,7 @@ import dns.name import dns.rdataclass import dns.zone import io +import tarfile class Exporter(abc.ABC): """ @@ -220,3 +221,42 @@ class RPZExporter(ZoneExporter): """ type = dns.rdatatype.CNAME content = "." + + +class SquidGuardExporter(Exporter): + """ + Export a list in the format that squidguard can process it + """ + def export(self, f): + # Create a tar file + with tarfile.open(fileobj=f, mode="w|gz") as tarball: + # Write the list + self._write_list(tarball, self.list) + + def _write_list(self, tarball, list): + # Create a new + file = tarfile.TarInfo(name="%s/domains" % list.slug) + + # Write the payload to memory + f = io.BytesIO() + + # Create a domain exporter + exporter = DomainsExporter(self.backend, list) + + # Write all domains to the buffer + exporter(f) + + # Assign the list to be owned by nobody + file.uname = file.gname = "nobody" + + # Set the length + file.size = f.tell() + + # Set the mtime + file.mtime = list.updated_at.timestamp() + + # Reset the buffer + f.seek(0) + + # Write the buffer to the tarball + tarball.addfile(file, fileobj=f) diff --git a/src/dnsbl/lists.py b/src/dnsbl/lists.py index 042b81d..7d34c0b 100644 --- a/src/dnsbl/lists.py +++ b/src/dnsbl/lists.py @@ -247,10 +247,11 @@ class List(sqlmodel.SQLModel, database.BackendMixin, table=True): Exports the list """ formats = { - "domains" : exporters.DomainsExporter, - "dnsbl" : exporters.BlocklistExporter, - "hosts" : exporters.HostsExporter, - "rpz" : exporters.RPZExporter, + "domains" : exporters.DomainsExporter, + "dnsbl" : exporters.BlocklistExporter, + "hosts" : exporters.HostsExporter, + "rpz" : exporters.RPZExporter, + "squidguard" : exporters.SquidGuardExporter, } # Fetch the exporter diff --git a/src/scripts/dnsbl.in b/src/scripts/dnsbl.in index ecc5124..522ff72 100644 --- a/src/scripts/dnsbl.in +++ b/src/scripts/dnsbl.in @@ -101,7 +101,8 @@ class CLI(object): export.add_argument("output", type=argparse.FileType("wb"), help=_("The output file")) export.add_argument("--format", default="domains", - choices=("domains", "dnsbl", "hosts", "rpz",), help=_("Output Format")) + choices=("domains", "dnsbl", "hosts", "rpz", "squidguard",), + help=_("Output Format")) export.set_defaults(func=self.__export) # export-all @@ -289,10 +290,11 @@ class CLI(object): Exports all lists """ formats = { - "domains" : "domains.txt", - "dnsbl" : "dnsbl.zone", - "hosts" : "hosts.txt", - "rpz" : "rpz.zone", + "domains" : "domains.txt", + "dnsbl" : "dnsbl.zone", + "hosts" : "hosts.txt", + "rpz" : "rpz.zone", + "squidguard" : "squidguard.tar.gz", } # Ensure the output directory exists