about summary refs log tree commit diff
path: root/pkgs/servers/dns
diff options
context:
space:
mode:
authorBrendan Taylor <bct@diffeq.com>2023-09-22 14:08:33 -0600
committerBjørn Forsman <bjorn.forsman@gmail.com>2023-09-27 23:35:47 +0200
commit95e66809debf42dbe1e4935fd31c8c275914d2eb (patch)
treea9c37125d00035cf4f32a7f816057d4e1ac58060 /pkgs/servers/dns
parent5266b96d2ea595b56d9fb18f272ced93ceaac313 (diff)
downloadnixlib-95e66809debf42dbe1e4935fd31c8c275914d2eb.tar
nixlib-95e66809debf42dbe1e4935fd31c8c275914d2eb.tar.gz
nixlib-95e66809debf42dbe1e4935fd31c8c275914d2eb.tar.bz2
nixlib-95e66809debf42dbe1e4935fd31c8c275914d2eb.tar.lz
nixlib-95e66809debf42dbe1e4935fd31c8c275914d2eb.tar.xz
nixlib-95e66809debf42dbe1e4935fd31c8c275914d2eb.tar.zst
nixlib-95e66809debf42dbe1e4935fd31c8c275914d2eb.zip
coredns: allow adding external plugins
Solves https://github.com/NixOS/nixpkgs/issues/146603

CoreDNS has support for plugins that are added at compile time. This
exposes an argument `externalPlugins` that will build coredns with
the specified plugins.

Example:
```
coredns-fanout = pkgs.coredns.override {
  externalPlugins = [
    {name = "fanout"; repo = "github.com/networkservicemesh/fanout"; version = "v1.9.1";}
  ];
  vendorHash = "<SRI hash>";
};
```
Diffstat (limited to 'pkgs/servers/dns')
-rw-r--r--pkgs/servers/dns/coredns/default.nix36
1 files changed, 34 insertions, 2 deletions
diff --git a/pkgs/servers/dns/coredns/default.nix b/pkgs/servers/dns/coredns/default.nix
index 8c340e444737..2dcfc538be45 100644
--- a/pkgs/servers/dns/coredns/default.nix
+++ b/pkgs/servers/dns/coredns/default.nix
@@ -3,9 +3,16 @@
 , buildGoModule
 , fetchFromGitHub
 , installShellFiles
+, externalPlugins ? []
+, vendorHash ? "sha256-TvIswNQ7DL/MtYmMSxXf+VqKHcmzZVZwohOCvRWxBkY="
 }:
 
-buildGoModule rec {
+let
+  attrsToPlugins = attrs:
+    builtins.map ({name, repo, version}: "${name}:${repo}") attrs;
+  attrsToSources = attrs:
+    builtins.map ({name, repo, version}: "${repo}@${version}") attrs;
+in buildGoModule rec {
   pname = "coredns";
   version = "1.11.0";
 
@@ -16,12 +23,32 @@ buildGoModule rec {
     sha256 = "sha256-Mn8hOsODTlnl6PJaevMcyIKkIx/1Lk2HGA7fSSizR20=";
   };
 
-  vendorHash = "sha256-9LFwrG6RxZaCLxrNabdnq++U5Aw+d2w90Zqt/wszNTY=";
+  inherit vendorHash;
 
   nativeBuildInputs = [ installShellFiles ];
 
   outputs = [ "out" "man" ];
 
+  # Override the go-modules fetcher derivation to fetch plugins
+  modBuildPhase = ''
+    for plugin in ${builtins.toString (attrsToPlugins externalPlugins)}; do echo $plugin >> plugin.cfg; done
+    for src in ${builtins.toString (attrsToSources externalPlugins)}; do go get $src; done
+    go generate
+    go mod vendor
+  '';
+
+  modInstallPhase = ''
+    mv -t vendor go.mod go.sum plugin.cfg
+    cp -r --reflink=auto vendor "$out"
+  '';
+
+  preBuild = ''
+    chmod -R u+w vendor
+    mv -t . vendor/go.{mod,sum} vendor/plugin.cfg
+
+    go generate
+  '';
+
   postPatch = ''
     substituteInPlace test/file_cname_proxy_test.go \
       --replace "TestZoneExternalCNAMELookupWithProxy" \
@@ -29,6 +56,11 @@ buildGoModule rec {
 
     substituteInPlace test/readme_test.go \
       --replace "TestReadme" "SkipReadme"
+
+    # this test fails if any external plugins were imported.
+    # it's a lint rather than a test of functionality, so it's safe to disable.
+    substituteInPlace test/presubmit_test.go \
+      --replace "TestImportOrdering" "SkipImportOrdering"
   '' + lib.optionalString stdenv.isDarwin ''
     # loopback interface is lo0 on macos
     sed -E -i 's/\blo\b/lo0/' plugin/bind/setup_test.go