]> git.ipfire.org Git - dbl.git/commitdiff
exporters: Add an exporter for squidGuard
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 10 Dec 2025 11:36:50 +0000 (11:36 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 10 Dec 2025 11:36:50 +0000 (11:36 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/dnsbl/exporters.py
src/dnsbl/lists.py
src/scripts/dnsbl.in

index a11443086ea47f52a27078020881eb4fe39f8cfd..5cebc6ad92835ca4f70e498ee36dc132ee0a50ad 100644 (file)
@@ -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)
index 042b81d37c90d943ff954a1841926b0c9b421232..7d34c0b487065b09d258df8fe6c5faa5466987d1 100644 (file)
@@ -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
index ecc512459faff83eb5466e1c6b2af1434fb87663..522ff72e1d7c9c5404a4603fdedd8746e2f01561 100644 (file)
@@ -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