{ lib, gnused, stdenv, buildGoModule, fetchFromGitHub, installShellFiles, }: let version = "1.11.1"; externalPlugins = [ { name = "tailscale"; repo = "github.com/damomurf/coredns-tailscale"; version = "750df081a3cc63f325ecfde6c30a974dc0e4bf56"; } ]; attrsToPlugins = attrs: builtins.map ({ name, repo, ... }: "${name}:${repo}") attrs; attrsToSources = attrs: builtins.map ({ repo, version, ... }: "${repo}@${version}") attrs; in buildGoModule { pname = "coredns"; inherit version; src = fetchFromGitHub { owner = "coredns"; repo = "coredns"; rev = "v${version}"; sha256 = "sha256-Mn8hOsODTlnl6PJaevMcyIKkIx/1Lk2HGA7fSSizR20="; }; # vendorHash = lib.fakeHash; vendorHash = "sha256-ba8Krc8FVrylsV0n/3JNRTrL3bP8UJRdKF2fy8SYU3o="; nativeBuildInputs = [ installShellFiles ]; outputs = [ "out" "man" ]; # Override the go-modules fetcher derivation to fetch plugins modBuildPhase = '' for plugin in ${builtins.toString (attrsToPlugins externalPlugins)}; do echo "Adding plugin $plugin" ${gnused}/bin/sed -i "/forward:forward/i$plugin" plugin.cfg done for src in ${builtins.toString (attrsToSources externalPlugins)}; do echo "Retrieving $src" go get $src done go generate go mod tidy 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" \ "SkipZoneExternalCNAMELookupWithProxy" 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 ''; postInstall = '' installManPage man/* ''; }