Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package coredns for openSUSE:Factory checked 
in at 2024-11-28 22:42:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/coredns (Old)
 and      /work/SRC/openSUSE:Factory/.coredns.new.28523 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "coredns"

Thu Nov 28 22:42:52 2024 rev:22 rq:1227043 version:1.12.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/coredns/coredns.changes  2024-11-19 
22:24:52.092330948 +0100
+++ /work/SRC/openSUSE:Factory/.coredns.new.28523/coredns.changes       
2024-11-28 22:43:17.539316531 +0100
@@ -1,0 +2,7 @@
+Fri Nov 22 13:44:39 UTC 2024 - andrea.manz...@suse.com
+
+- Update to version 1.12.0:
+  * New multisocket plugin - allows CoreDNS to listen on multiple sockets
+  * bump deps
+
+-------------------------------------------------------------------

Old:
----
  coredns-1.11.4.obscpio
  coredns-1.11.4.tar.gz

New:
----
  coredns-1.12.0.obscpio
  coredns-1.12.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ coredns.spec ++++++
--- /var/tmp/diff_new_pack.8NiyBQ/_old  2024-11-28 22:43:18.739366515 +0100
+++ /var/tmp/diff_new_pack.8NiyBQ/_new  2024-11-28 22:43:18.743366681 +0100
@@ -18,7 +18,7 @@
 
 %define project github.com/coredns/coredns
 Name:           coredns
-Version:        1.11.4
+Version:        1.12.0
 Release:        0
 Summary:        DNS server written in Go
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.8NiyBQ/_old  2024-11-28 22:43:18.791368680 +0100
+++ /var/tmp/diff_new_pack.8NiyBQ/_new  2024-11-28 22:43:18.791368680 +0100
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/coredns/coredns</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v1.11.4</param>
+    <param name="revision">v1.12.0</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="changesgenerate">enable</param>
     <param name="versionrewrite-pattern">v(.*)</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.8NiyBQ/_old  2024-11-28 22:43:18.815369681 +0100
+++ /var/tmp/diff_new_pack.8NiyBQ/_new  2024-11-28 22:43:18.819369847 +0100
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param name="url">https://github.com/coredns/coredns</param>
-              <param 
name="changesrevision">6e11ebddfc13bfca683fcbcae72cc4af6de47dd2</param></service></servicedata>
+              <param 
name="changesrevision">51e11f166ef6c247a78e9e15468647c593b79b9f</param></service></servicedata>
 (No newline at EOF)
 

++++++ coredns-1.11.4.obscpio -> coredns-1.12.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.circleci/config.yml 
new/coredns-1.12.0/.circleci/config.yml
--- old/coredns-1.11.4/.circleci/config.yml     2024-11-13 02:31:15.000000000 
+0100
+++ new/coredns-1.12.0/.circleci/config.yml     2024-11-21 20:27:33.000000000 
+0100
@@ -21,8 +21,8 @@
     image: default
   working_directory: ~/go/src/${CIRCLE_PROJECT_USERNAME}/coredns
   environment:
-    - K8S_VERSION: v1.22.0
-    - KIND_VERSION: v0.11.1
+    - K8S_VERSION: v1.29.4
+    - KIND_VERSION: v0.25.0
     - KUBECONFIG: /home/circleci/.kube/kind-config-kind
 
 setupKubernetes: &setupKubernetes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/codeql-analysis.yml 
new/coredns-1.12.0/.github/workflows/codeql-analysis.yml
--- old/coredns-1.11.4/.github/workflows/codeql-analysis.yml    2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/codeql-analysis.yml    2024-11-21 
20:27:33.000000000 +0100
@@ -30,12 +30,12 @@
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683  # 
v4.2.2
 
       - name: Initialize CodeQL
-        uses: 
github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd  # v3.27.0
+        uses: 
github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # v3.27.4
         with:
           languages: ${{ matrix.language }}
 
       - name: Autobuild
-        uses: 
github/codeql-action/autobuild@662472033e021d55d94146f66f6058822b0b39fd  # 
v3.27.0
+        uses: 
github/codeql-action/autobuild@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # 
v3.27.4
 
       - name: Perform CodeQL Analysis
-        uses: 
github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd  # v3.27.0
+        uses: 
github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # v3.27.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/go.coverage.yml 
new/coredns-1.12.0/.github/workflows/go.coverage.yml
--- old/coredns-1.11.4/.github/workflows/go.coverage.yml        2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/go.coverage.yml        2024-11-21 
20:27:33.000000000 +0100
@@ -31,4 +31,4 @@
           done
 
       - name: Upload coverage to Codecov
-        uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238  
# v4.6.0
+        uses: codecov/codecov-action@5c47607acb93fed5485fdbf7232e8a31425f672a  
# v5.0.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/go.test.yml 
new/coredns-1.12.0/.github/workflows/go.test.yml
--- old/coredns-1.11.4/.github/workflows/go.test.yml    2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/go.test.yml    2024-11-21 
20:27:33.000000000 +0100
@@ -61,7 +61,7 @@
       - name: Install Go
         uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed  # 
v5.1.0
         with:
-          go-version: '~1.21.0'
+          go-version: ${{ env.GO_VERSION }}
         id: go
 
       - name: Build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/golangci-lint.yml 
new/coredns-1.12.0/.github/workflows/golangci-lint.yml
--- old/coredns-1.11.4/.github/workflows/golangci-lint.yml      2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/golangci-lint.yml      2024-11-21 
20:27:33.000000000 +0100
@@ -15,4 +15,4 @@
       - name: golangci-lint
         uses: 
golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8  # v6.1.1
         with:
-          version: v1.60.1
+          version: v1.62.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/release.yml 
new/coredns-1.12.0/.github/workflows/release.yml
--- old/coredns-1.11.4/.github/workflows/release.yml    2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/release.yml    2024-11-21 
20:27:33.000000000 +0100
@@ -45,7 +45,7 @@
           cat release.md
           sha256sum release/*.tgz
       - name: Draft release
-        uses: 
softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8  # v2.0.9
+        uses: 
softprops/action-gh-release@01570a1f39cb168c169c802c3bceb9e93fb10974  # v2.1.0
         with:
           body_path: release.md
           name: v${{ steps.info.outputs.version }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/scorecards.yml 
new/coredns-1.12.0/.github/workflows/scorecards.yml
--- old/coredns-1.11.4/.github/workflows/scorecards.yml 2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/scorecards.yml 2024-11-21 
20:27:33.000000000 +0100
@@ -51,6 +51,6 @@
 
       # Upload the results to GitHub's code scanning dashboard.
       - name: "Upload to code-scanning"
-        uses: 
github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd  # 
v3.27.0
+        uses: 
github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # 
v3.27.4
         with:
           sarif_file: results.sarif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/trivy-scan.yaml 
new/coredns-1.12.0/.github/workflows/trivy-scan.yaml
--- old/coredns-1.11.4/.github/workflows/trivy-scan.yaml        2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/trivy-scan.yaml        2024-11-21 
20:27:33.000000000 +0100
@@ -28,6 +28,6 @@
           output: 'trivy-results.sarif'
 
       - name: Upload Trivy scan results to GitHub Security tab
-        uses: 
github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd  # 
v3.27.0
+        uses: 
github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # 
v3.27.4
         with:
           sarif_file: 'trivy-results.sarif'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.go-version 
new/coredns-1.12.0/.go-version
--- old/coredns-1.11.4/.go-version      2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.go-version      2024-11-21 20:27:33.000000000 +0100
@@ -1 +1 @@
-1.23.2
+1.23.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/CODEOWNERS 
new/coredns-1.12.0/CODEOWNERS
--- old/coredns-1.11.4/CODEOWNERS       2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/CODEOWNERS       2024-11-21 20:27:33.000000000 +0100
@@ -1,9 +1,9 @@
 # 5 steering committee members
-# @chrisohaver, term ends 2024-09-26
-# @johnbelamaric, term ends 2024-09-26
-# @stp-ip, term ends 2024-09-26
-# @superq, term ends 2024-09-26
-# @tantalor93, term ends 2024-09-26
+# @chrisohaver, term ends 2025-11-21
+# @johnbelamaric, term ends 2025-11-21
+# @stp-ip, term ends 2025-11-21
+# @superq, term ends 2025-11-21
+# @tantalor93, term ends 2025-11-21
 
 *                       @bradbeam @chrisohaver @dilyevsky @jameshartig 
@greenpau @isolus @johnbelamaric @miekg @pmoroney @rajansandeep @stp-ip @superq 
@yongtang @Tantalor93
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/GOVERNANCE.md 
new/coredns-1.12.0/GOVERNANCE.md
--- old/coredns-1.11.4/GOVERNANCE.md    2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/GOVERNANCE.md    2024-11-21 20:27:33.000000000 +0100
@@ -5,7 +5,7 @@
 The CoreDNS community adheres to the following principles:
 
 - Open: CoreDNS is open source, advertised on [our 
website](https://coredns.io/community).
-- Welcoming and respectful: See [Code of Conduct](CODE-OF-CONDUCT.md).
+- Welcoming and respectful: See [Code of Conduct](.github/CODE_OF_CONDUCT.md).
 - Transparent and accessible: Changes to the CoreDNS organization, CoreDNS 
code repositories, and CNCF related activities (e.g. level, involvement, etc) 
are done in public.
 - Merit: Ideas and contributions are accepted according to their technical 
merit and alignment with
   project objectives, scope, and design principles.
@@ -53,7 +53,7 @@
 step down.
 
 The CoreDNS organization will never forcefully remove a current Maintainer, 
unless a maintainer
-fails to meet the principles of CoreDNS community, or adhere to the [Code of 
Conduct](CODE-OF-CONDUCT.md).
+fails to meet the principles of CoreDNS community, or adhere to the [Code of 
Conduct](.github/CODE_OF_CONDUCT.md).
 
 ## Changes in Project Steering Committee Membership
 
@@ -145,7 +145,7 @@
 
 ## Code of Conduct
 
-The [CoreDNS Code of Conduct](CODE-OF-CONDUCT.md) is aligned with the CNCF 
Code of Conduct.
+The [CoreDNS Code of Conduct](.github/CODE_OF_CONDUCT.md) is aligned with the 
CNCF Code of Conduct.
 
 ## Credits
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/core/dnsserver/config.go 
new/coredns-1.12.0/core/dnsserver/config.go
--- old/coredns-1.11.4/core/dnsserver/config.go 2024-11-13 02:31:15.000000000 
+0100
+++ new/coredns-1.12.0/core/dnsserver/config.go 2024-11-21 20:27:33.000000000 
+0100
@@ -24,6 +24,10 @@
        // The port to listen on.
        Port string
 
+       // The number of servers that will listen on one port.
+       // By default, one server will be running.
+       NumSockets int
+
        // Root points to a base directory we find user defined "things".
        // First consumer is the file plugin to looks for zone files in this 
place.
        Root string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/core/dnsserver/register.go 
new/coredns-1.12.0/core/dnsserver/register.go
--- old/coredns-1.11.4/core/dnsserver/register.go       2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/core/dnsserver/register.go       2024-11-21 
20:27:33.000000000 +0100
@@ -134,69 +134,23 @@
 
 // MakeServers uses the newly-created siteConfigs to create and return a list 
of server instances.
 func (h *dnsContext) MakeServers() ([]caddy.Server, error) {
-       // Copy the Plugin, ListenHosts and Debug from first config in the block
-       // to all other config in the same block . Doing this results in zones
-       // sharing the same plugin instances and settings as other zones in
-       // the same block.
-       for _, c := range h.configs {
-               c.Plugin = c.firstConfigInBlock.Plugin
-               c.ListenHosts = c.firstConfigInBlock.ListenHosts
-               c.Debug = c.firstConfigInBlock.Debug
-               c.Stacktrace = c.firstConfigInBlock.Stacktrace
-
-               // Fork TLSConfig for each encrypted connection
-               c.TLSConfig = c.firstConfigInBlock.TLSConfig.Clone()
-               c.ReadTimeout = c.firstConfigInBlock.ReadTimeout
-               c.WriteTimeout = c.firstConfigInBlock.WriteTimeout
-               c.IdleTimeout = c.firstConfigInBlock.IdleTimeout
-               c.TsigSecret = c.firstConfigInBlock.TsigSecret
-       }
+       // Copy parameters from first config in the block to all other config 
in the same block
+       propagateConfigParams(h.configs)
 
        // we must map (group) each config to a bind address
        groups, err := groupConfigsByListenAddr(h.configs)
        if err != nil {
                return nil, err
        }
+
        // then we create a server for each group
        var servers []caddy.Server
        for addr, group := range groups {
-               // switch on addr
-               switch tr, _ := parse.Transport(addr); tr {
-               case transport.DNS:
-                       s, err := NewServer(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
-
-               case transport.TLS:
-                       s, err := NewServerTLS(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
-
-               case transport.QUIC:
-                       s, err := NewServerQUIC(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
-
-               case transport.GRPC:
-                       s, err := NewServergRPC(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
-
-               case transport.HTTPS:
-                       s, err := NewServerHTTPS(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
+               serversForGroup, err := makeServersForGroup(addr, group)
+               if err != nil {
+                       return nil, err
                }
+               servers = append(servers, serversForGroup...)
        }
 
        // For each server config, check for View Filter plugins
@@ -299,6 +253,27 @@
        return nil
 }
 
+// propagateConfigParams copies the necessary parameters from first config in 
the block
+// to all other config in the same block. Doing this results in zones
+// sharing the same plugin instances and settings as other zones in
+// the same block.
+func propagateConfigParams(configs []*Config) {
+       for _, c := range configs {
+               c.Plugin = c.firstConfigInBlock.Plugin
+               c.ListenHosts = c.firstConfigInBlock.ListenHosts
+               c.Debug = c.firstConfigInBlock.Debug
+               c.Stacktrace = c.firstConfigInBlock.Stacktrace
+               c.NumSockets = c.firstConfigInBlock.NumSockets
+
+               // Fork TLSConfig for each encrypted connection
+               c.TLSConfig = c.firstConfigInBlock.TLSConfig.Clone()
+               c.ReadTimeout = c.firstConfigInBlock.ReadTimeout
+               c.WriteTimeout = c.firstConfigInBlock.WriteTimeout
+               c.IdleTimeout = c.firstConfigInBlock.IdleTimeout
+               c.TsigSecret = c.firstConfigInBlock.TsigSecret
+       }
+}
+
 // groupConfigsByListenAddr groups site configs by their listen
 // (bind) address, so sites that use the same listener can be served
 // on the same server instance. The return value maps the listen
@@ -320,6 +295,63 @@
        return groups, nil
 }
 
+// makeServersForGroup creates servers for a specific transport and group.
+// It creates as many servers as specified in the NumSockets configuration.
+// If the NumSockets param is not specified, one server is created by default.
+func makeServersForGroup(addr string, group []*Config) ([]caddy.Server, error) 
{
+       // that is impossible, but better to check
+       if len(group) == 0 {
+               return nil, fmt.Errorf("no configs for group defined")
+       }
+       // create one server by default if no NumSockets specified
+       numSockets := 1
+       if group[0].NumSockets > 0 {
+               numSockets = group[0].NumSockets
+       }
+
+       var servers []caddy.Server
+       for range numSockets {
+               // switch on addr
+               switch tr, _ := parse.Transport(addr); tr {
+               case transport.DNS:
+                       s, err := NewServer(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+
+               case transport.TLS:
+                       s, err := NewServerTLS(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+
+               case transport.QUIC:
+                       s, err := NewServerQUIC(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+
+               case transport.GRPC:
+                       s, err := NewServergRPC(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+
+               case transport.HTTPS:
+                       s, err := NewServerHTTPS(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+               }
+       }
+       return servers, nil
+}
+
 // DefaultPort is the default port.
 const DefaultPort = transport.Port
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/core/dnsserver/zdirectives.go 
new/coredns-1.12.0/core/dnsserver/zdirectives.go
--- old/coredns-1.11.4/core/dnsserver/zdirectives.go    2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/core/dnsserver/zdirectives.go    2024-11-21 
20:27:33.000000000 +0100
@@ -16,6 +16,7 @@
        "cancel",
        "tls",
        "timeouts",
+       "multisocket",
        "reload",
        "nsid",
        "bufsize",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/core/plugin/zplugin.go 
new/coredns-1.12.0/core/plugin/zplugin.go
--- old/coredns-1.11.4/core/plugin/zplugin.go   2024-11-13 02:31:15.000000000 
+0100
+++ new/coredns-1.12.0/core/plugin/zplugin.go   2024-11-21 20:27:33.000000000 
+0100
@@ -39,6 +39,7 @@
        _ "github.com/coredns/coredns/plugin/metadata"
        _ "github.com/coredns/coredns/plugin/metrics"
        _ "github.com/coredns/coredns/plugin/minimal"
+       _ "github.com/coredns/coredns/plugin/multisocket"
        _ "github.com/coredns/coredns/plugin/nsid"
        _ "github.com/coredns/coredns/plugin/pprof"
        _ "github.com/coredns/coredns/plugin/ready"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/coremain/run.go 
new/coredns-1.12.0/coremain/run.go
--- old/coredns-1.11.4/coremain/run.go  2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/coremain/run.go  2024-11-21 20:27:33.000000000 +0100
@@ -12,6 +12,8 @@
 
        "github.com/coredns/caddy"
        "github.com/coredns/coredns/core/dnsserver"
+
+       "go.uber.org/automaxprocs/maxprocs"
 )
 
 func init() {
@@ -56,6 +58,11 @@
                os.Exit(0)
        }
 
+       _, err := maxprocs.Set(maxprocs.Logger(log.Printf))
+       if err != nil {
+               log.Println("[WARNING] Failed to set GOMAXPROCS:", err)
+       }
+
        // Get Corefile input
        corefile, err := caddy.LoadCaddyfile(serverType)
        if err != nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/coremain/version.go 
new/coredns-1.12.0/coremain/version.go
--- old/coredns-1.11.4/coremain/version.go      2024-11-13 02:31:15.000000000 
+0100
+++ new/coredns-1.12.0/coremain/version.go      2024-11-21 20:27:33.000000000 
+0100
@@ -2,7 +2,7 @@
 
 // Various CoreDNS constants.
 const (
-       CoreVersion = "1.11.4"
+       CoreVersion = "1.12.0"
        CoreName    = "CoreDNS"
        serverType  = "dns"
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/go.mod new/coredns-1.12.0/go.mod
--- old/coredns-1.11.4/go.mod   2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/go.mod   2024-11-21 20:27:33.000000000 +0100
@@ -1,6 +1,6 @@
 module github.com/coredns/coredns
 
-go 1.22.0
+go 1.22.7
 
 toolchain go1.23.0
 
@@ -10,9 +10,9 @@
        github.com/Azure/go-autorest/autorest/azure/auth v0.5.13
        github.com/apparentlymart/go-cidr v1.1.0
        github.com/aws/aws-sdk-go v1.55.5
-       github.com/aws/aws-sdk-go-v2/config v1.27.39
-       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3
-       github.com/coredns/caddy v1.1.1
+       github.com/aws/aws-sdk-go-v2/config v1.28.5
+       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.5
+       github.com/coredns/caddy v1.1.2-0.20241029205200-8de985351a98
        github.com/dnstap/golang-dnstap v0.4.0
        github.com/expr-lang/expr v1.16.9
        github.com/farsightsec/golang-framestream v0.3.0
@@ -29,13 +29,14 @@
        github.com/prometheus/client_model v0.6.1
        github.com/prometheus/common v0.60.1
        github.com/quic-go/quic-go v0.48.1
-       go.etcd.io/etcd/api/v3 v3.5.16
-       go.etcd.io/etcd/client/v3 v3.5.16
-       golang.org/x/crypto v0.28.0
-       golang.org/x/sys v0.26.0
-       google.golang.org/api v0.201.0
-       google.golang.org/grpc v1.67.1
-       google.golang.org/protobuf v1.35.1
+       go.etcd.io/etcd/api/v3 v3.5.17
+       go.etcd.io/etcd/client/v3 v3.5.17
+       go.uber.org/automaxprocs v1.6.0
+       golang.org/x/crypto v0.29.0
+       golang.org/x/sys v0.27.0
+       google.golang.org/api v0.206.0
+       google.golang.org/grpc v1.68.0
+       google.golang.org/protobuf v1.35.2
        gopkg.in/DataDog/dd-trace-go.v1 v1.69.1
        k8s.io/api v0.31.2
        k8s.io/apimachinery v0.31.2
@@ -44,8 +45,8 @@
 )
 
 require (
-       cloud.google.com/go/auth v0.9.8 // indirect
-       cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
+       cloud.google.com/go/auth v0.10.2 // indirect
+       cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect
        cloud.google.com/go/compute/metadata v0.5.2 // indirect
        github.com/Azure/go-autorest v14.2.0+incompatible // indirect
        github.com/Azure/go-autorest/autorest/adal v0.9.22 // indirect
@@ -62,18 +63,18 @@
        github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect
        github.com/DataDog/sketches-go v1.4.5 // indirect
        github.com/Microsoft/go-winio v0.6.1 // indirect
-       github.com/aws/aws-sdk-go-v2 v1.31.0 // indirect
-       github.com/aws/aws-sdk-go-v2/credentials v1.17.37 // indirect
-       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect
+       github.com/aws/aws-sdk-go-v2 v1.32.5 // indirect
+       github.com/aws/aws-sdk-go-v2/credentials v1.17.46 // indirect
+       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 // indirect
        github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 
// indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 // indirect
-       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 // indirect
-       github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 // indirect
-       github.com/aws/smithy-go v1.21.0 // indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 
// indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 // 
indirect
+       github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 // indirect
+       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 // indirect
+       github.com/aws/smithy-go v1.22.1 // indirect
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
        github.com/coreos/go-semver v0.3.0 // indirect
@@ -103,7 +104,7 @@
        github.com/google/s2a-go v0.1.8 // indirect
        github.com/google/uuid v1.6.0 // indirect
        github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
-       github.com/googleapis/gax-go/v2 v2.13.0 // indirect
+       github.com/googleapis/gax-go/v2 v2.14.0 // indirect
        github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 // indirect
        github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect
        github.com/hashicorp/go-sockaddr v1.0.2 // indirect
@@ -130,7 +131,7 @@
        github.com/spf13/pflag v1.0.5 // indirect
        github.com/tinylib/msgp v1.2.1 // indirect
        github.com/x448/float16 v0.8.4 // indirect
-       go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect
+       go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect
        go.opencensus.io v0.24.0 // indirect
        go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 
// indirect
        go.opentelemetry.io/otel v1.29.0 // indirect
@@ -142,16 +143,16 @@
        go.uber.org/zap v1.17.0 // indirect
        golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
        golang.org/x/mod v0.18.0 // indirect
-       golang.org/x/net v0.30.0 // indirect
-       golang.org/x/oauth2 v0.23.0 // indirect
-       golang.org/x/sync v0.8.0 // indirect
-       golang.org/x/term v0.25.0 // indirect
-       golang.org/x/text v0.19.0 // indirect
-       golang.org/x/time v0.7.0 // indirect
+       golang.org/x/net v0.31.0 // indirect
+       golang.org/x/oauth2 v0.24.0 // indirect
+       golang.org/x/sync v0.9.0 // indirect
+       golang.org/x/term v0.26.0 // indirect
+       golang.org/x/text v0.20.0 // indirect
+       golang.org/x/time v0.8.0 // indirect
        golang.org/x/tools v0.22.0 // indirect
        golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
-       google.golang.org/genproto/googleapis/api 
v0.0.0-20240930140551-af27646dc61f // indirect
-       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241007155032-5fefd90f89a9 // indirect
+       google.golang.org/genproto/googleapis/api 
v0.0.0-20241104194629-dd2ea8efbc28 // indirect
+       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241104194629-dd2ea8efbc28 // indirect
        gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
        gopkg.in/inf.v0 v0.9.1 // indirect
        gopkg.in/yaml.v2 v2.4.0 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/go.sum new/coredns-1.12.0/go.sum
--- old/coredns-1.11.4/go.sum   2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/go.sum   2024-11-21 20:27:33.000000000 +0100
@@ -1,8 +1,8 @@
 cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go/auth v0.9.8 h1:+CSJ0Gw9iVeSENVCKJoLHhdUykDgXSc4Qn+gu2BRtR8=
-cloud.google.com/go/auth v0.9.8/go.mod 
h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
-cloud.google.com/go/auth/oauth2adapt v0.2.4 
h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
-cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod 
h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
+cloud.google.com/go/auth v0.10.2 
h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo=
+cloud.google.com/go/auth v0.10.2/go.mod 
h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
+cloud.google.com/go/auth/oauth2adapt v0.2.5 
h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk=
+cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod 
h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
 cloud.google.com/go/compute/metadata v0.5.2 
h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
 cloud.google.com/go/compute/metadata v0.5.2/go.mod 
h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
 github.com/Azure/azure-sdk-for-go v68.0.0+incompatible 
h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
@@ -55,34 +55,34 @@
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod 
h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/aws/aws-sdk-go v1.55.5 
h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
 github.com/aws/aws-sdk-go v1.55.5/go.mod 
h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
-github.com/aws/aws-sdk-go-v2 v1.31.0 
h1:3V05LbxTSItI5kUqNwhJrrrY1BAXxXt0sN0l72QmG5U=
-github.com/aws/aws-sdk-go-v2 v1.31.0/go.mod 
h1:ztolYtaEUtdpf9Wftr31CJfLVjOnD/CVRkKOOYgF8hA=
-github.com/aws/aws-sdk-go-v2/config v1.27.39 
h1:FCylu78eTGzW1ynHcongXK9YHtoXD5AiiUqq3YfJYjU=
-github.com/aws/aws-sdk-go-v2/config v1.27.39/go.mod 
h1:wczj2hbyskP4LjMKBEZwPRO1shXY+GsQleab+ZXT2ik=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.37 
h1:G2aOH01yW8X373JK419THj5QVqu9vKEwxSEsGxihoW0=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.37/go.mod 
h1:0ecCjlb7htYCptRD45lXJ6aJDQac6D2NlKGpZqyTG6A=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 
h1:C/d03NAmh8C4BZXhuRNboF/DqhBkBCeDiJDcaqIT5pA=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14/go.mod 
h1:7I0Ju7p9mCIdlrfS+JCgqcYD0VXz/N4yozsox+0o078=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 
h1:kYQ3H1u0ANr9KEKlGs/jTLrBFPo8P8NaH/w7A01NeeM=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18/go.mod 
h1:r506HmK5JDUh9+Mw4CfGJGSSoqIiLCndAuqXuhbv67Y=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 
h1:Z7IdFUONvTcvS7YuhtVxN99v2cCoHRXOS4mTr0B/pUc=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18/go.mod 
h1:DkKMmksZVVyat+Y+r1dEOgJEfUeA7UngIHWeKsi0yNc=
+github.com/aws/aws-sdk-go-v2 v1.32.5 
h1:U8vdWJuY7ruAkzaOdD7guwJjD06YSKmnKCJs7s3IkIo=
+github.com/aws/aws-sdk-go-v2 v1.32.5/go.mod 
h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
+github.com/aws/aws-sdk-go-v2/config v1.28.5 
h1:Za41twdCXbuyyWv9LndXxZZv3QhTG1DinqlFsSuvtI0=
+github.com/aws/aws-sdk-go-v2/config v1.28.5/go.mod 
h1:4VsPbHP8JdcdUDmbTVgNL/8w9SqOkM5jyY8ljIxLO3o=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.46 
h1:AU7RcriIo2lXjUfHFnFKYsLCwgbz1E7Mm95ieIRDNUg=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.46/go.mod 
h1:1FmYyLGL08KQXQ6mcTlifyFXfJVCNJTVGuQP4m0d/UA=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 
h1:sDSXIrlsFSFJtWKLQS4PUWRvrT580rrnuLydJrCQ/yA=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20/go.mod 
h1:WZ/c+w0ofps+/OUqMwWgnfrgzZH1DZO1RIkktICsqnY=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 
h1:4usbeaes3yJnCFC7kfeyhkdkPtoRYPa/hTmCqMpKpLI=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24/go.mod 
h1:5CI1JemjVwde8m2WG3cz23qHKPOxbpkq0HaoreEgLIY=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 
h1:N1zsICrQglfzaBnrfM0Ys00860C+QFwu6u/5+LomP+o=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24/go.mod 
h1:dCn9HbJ8+K31i8IQ8EWmWj0EiIk0+vKiHNMxTTYveAg=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 
h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod 
h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 
h1:QFASJGfT8wMXtuP3D5CRmMjARHv9ZmzFUMJznHDOY3w=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5/go.mod 
h1:QdZ3OmoIjSX+8D1OPAzPxDfjXASbBMDsz9qvtyIhtik=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 
h1:Xbwbmk44URTiHNx6PNo0ujDE6ERlsCKJD3u1zfnzAPg=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20/go.mod 
h1:oAfOFzUB14ltPZj1rWwRc3d/6OgD76R8KlvU3EqM9Fg=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3 
h1:W2M3kQSuN1+FXgV2wMv1JMWPxw/37wBN87QHYDuTV0Y=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3/go.mod 
h1:WyLS5qwXHtjKAONYZq/4ewdd+hcVsa3LBu77Ow5uj3k=
-github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 
h1:rs4JCczF805+FDv2tRhZ1NU0RB2H6ryAvsWPanAr72Y=
-github.com/aws/aws-sdk-go-v2/service/sso v1.23.3/go.mod 
h1:XRlMvmad0ZNL+75C5FYdMvbbLkd6qiqz6foR1nA1PXY=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 
h1:S7EPdMVZod8BGKQQPTBK+FcX9g7bKR7c4+HxWqHP7Vg=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3/go.mod 
h1:FnvDM4sfa+isJ3kDXIzAB9GAwVSzFzSy97uZ3IsHo4E=
-github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 
h1:VzudTFrDCIDakXtemR7l6Qzt2+JYsVqo2MxBPt5k8T8=
-github.com/aws/aws-sdk-go-v2/service/sts v1.31.3/go.mod 
h1:yMWe0F+XG0DkRZK5ODZhG7BEFYhLXi2dqGsv6tX0cgI=
-github.com/aws/smithy-go v1.21.0 
h1:H7L8dtDRk0P1Qm6y0ji7MCYMQObJ5R9CRpyPhRUkLYA=
-github.com/aws/smithy-go v1.21.0/go.mod 
h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 
h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod 
h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 
h1:wtpJ4zcwrSbwhECWQoI/g6WM9zqCcSpHDJIWSbMLOu4=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5/go.mod 
h1:qu/W9HXQbbQ4+1+JcZp0ZNPV31ym537ZJN+fiS7Ti8E=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.5 
h1:gqj99GNYzuY0jMekToqvOW1VaSupY0Qn0oj1JGSolpE=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.5/go.mod 
h1:FTCjaQxTVVQqLQ4ktBsLNZPnJ9pVLkJ6F0qVwtALaxk=
+github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 
h1:3zu537oLmsPfDMyjnUS2g+F2vITgy5pB74tHI+JBNoM=
+github.com/aws/aws-sdk-go-v2/service/sso v1.24.6/go.mod 
h1:WJSZH2ZvepM6t6jwu4w/Z45Eoi75lPN7DcydSRtJg6Y=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 
h1:K0OQAsDywb0ltlFrZm0JHPY3yZp/S9OaoLU33S7vPS8=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5/go.mod 
h1:ORITg+fyuMoeiQFiVGoqB3OydVTLkClw/ljbblMq6Cc=
+github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 
h1:6SZUVRQNvExYlMLbHdlKB48x0fLbc2iVROyaNEwBHbU=
+github.com/aws/aws-sdk-go-v2/service/sts v1.33.1/go.mod 
h1:GqWyYCwLXnlUB1lOAXQyNSPqPLQJvmo8J0DWBzp9mtg=
+github.com/aws/smithy-go v1.22.1 
h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
+github.com/aws/smithy-go v1.22.1/go.mod 
h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod 
h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bgentry/speakeasy v0.1.0/go.mod 
h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
@@ -92,8 +92,8 @@
 github.com/cespare/xxhash/v2 v2.3.0/go.mod 
h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod 
h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0=
-github.com/coredns/caddy v1.1.1/go.mod 
h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
+github.com/coredns/caddy v1.1.2-0.20241029205200-8de985351a98 
h1:c+Epklw9xk6BZ1OFBPWLA2PcL8QalKvl3if8CP9x8uw=
+github.com/coredns/caddy v1.1.2-0.20241029205200-8de985351a98/go.mod 
h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
 github.com/coreos/go-semver v0.3.0 
h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
 github.com/coreos/go-semver v0.3.0/go.mod 
h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd/v22 v22.3.2 
h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
@@ -196,8 +196,8 @@
 github.com/google/uuid v1.6.0/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/enterprise-certificate-proxy v0.3.4 
h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
 github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod 
h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
-github.com/googleapis/gax-go/v2 v2.13.0 
h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
-github.com/googleapis/gax-go/v2 v2.13.0/go.mod 
h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
+github.com/googleapis/gax-go/v2 v2.14.0 
h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
+github.com/googleapis/gax-go/v2 v2.14.0/go.mod 
h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
 github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 
h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
 github.com/grpc-ecosystem/grpc-opentracing 
v0.0.0-20180507213350-8e809c8a8645/go.mod 
h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
 github.com/hashicorp/errwrap v1.0.0/go.mod 
h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -288,6 +288,8 @@
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 
h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod 
h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prashantv/gostub v1.1.0 
h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod 
h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
 github.com/prometheus/client_golang v1.20.5 
h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
 github.com/prometheus/client_golang v1.20.5/go.mod 
h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -336,12 +338,12 @@
 github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0=
-go.etcd.io/etcd/api/v3 v3.5.16/go.mod 
h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28=
-go.etcd.io/etcd/client/pkg/v3 v3.5.16 
h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q=
-go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod 
h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E=
-go.etcd.io/etcd/client/v3 v3.5.16 
h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE=
-go.etcd.io/etcd/client/v3 v3.5.16/go.mod 
h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50=
+go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w=
+go.etcd.io/etcd/api/v3 v3.5.17/go.mod 
h1:d1hvkRuXkts6PmaYk2Vrgqbv7H4ADfAKhyJqHNLJCB4=
+go.etcd.io/etcd/client/pkg/v3 v3.5.17 
h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOUKKVw=
+go.etcd.io/etcd/client/pkg/v3 v3.5.17/go.mod 
h1:4DqK1TKacp/86nJk4FLQqo6Mn2vvQFBmruW3pP14H/w=
+go.etcd.io/etcd/client/v3 v3.5.17 
h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY=
+go.etcd.io/etcd/client/v3 v3.5.17/go.mod 
h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo=
 go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
 go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 
h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
@@ -356,6 +358,8 @@
 go.uber.org/atomic v1.9.0/go.mod 
h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
 go.uber.org/atomic v1.11.0/go.mod 
h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
+go.uber.org/automaxprocs v1.6.0/go.mod 
h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod 
h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
@@ -371,8 +375,8 @@
 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod 
h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.6.0/go.mod 
h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
 golang.org/x/crypto v0.17.0/go.mod 
h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod 
h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
+golang.org/x/crypto v0.29.0/go.mod 
h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 
h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod 
h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
@@ -403,11 +407,11 @@
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
-golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
+golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
+golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
-golang.org/x/oauth2 v0.23.0/go.mod 
h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
+golang.org/x/oauth2 v0.24.0/go.mod 
h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -417,8 +421,8 @@
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
+golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -438,15 +442,15 @@
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
+golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.15.0/go.mod 
h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod 
h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
+golang.org/x/term v0.26.0/go.mod 
h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -454,10 +458,10 @@
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.14.0/go.mod 
h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod 
h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
-golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
-golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
+golang.org/x/text v0.20.0/go.mod 
h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
+golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
+golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod 
h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -478,24 +482,24 @@
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 
h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod 
h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
-google.golang.org/api v0.201.0 h1:+7AD9JNM3tREtawRMu8sOjSbb8VYcYXJG/2eEOmfDu0=
-google.golang.org/api v0.201.0/go.mod 
h1:HVY0FCHVs89xIW9fzf/pBvOEm+OolHa86G/txFezyq4=
+google.golang.org/api v0.206.0 h1:A27GClesCSheW5P2BymVHjpEeQ2XHH8DI8Srs2HI2L8=
+google.golang.org/api v0.206.0/go.mod 
h1:BtB8bfjTYIrai3d8UyvPmV9REGgox7coh+ZRwm0b+W8=
 google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod 
h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod 
h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod 
h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f 
h1:jTm13A2itBi3La6yTGqn8bVSrc3ZZ1r8ENHlIXBfnRA=
-google.golang.org/genproto/googleapis/api 
v0.0.0-20240930140551-af27646dc61f/go.mod 
h1:CLGoBuH1VHxAUXVPP8FfPwPEVJB6lz3URE5mY2SuayE=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 
h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc=
-google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241007155032-5fefd90f89a9/go.mod 
h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
+google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 
h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g=
+google.golang.org/genproto/googleapis/api 
v0.0.0-20241104194629-dd2ea8efbc28/go.mod 
h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 
h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE=
+google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241104194629-dd2ea8efbc28/go.mod 
h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
 google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.23.0/go.mod 
h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.25.1/go.mod 
h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.27.0/go.mod 
h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.33.2/go.mod 
h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
-google.golang.org/grpc v1.67.1/go.mod 
h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
+google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0=
+google.golang.org/grpc v1.68.0/go.mod 
h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod 
h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -505,8 +509,8 @@
 google.golang.org/protobuf v1.23.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.25.0/go.mod 
h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.35.1 
h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod 
h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.35.2 
h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod 
h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 gopkg.in/DataDog/dd-trace-go.v1 v1.69.1 
h1:grTElrPaCfxUsrJjyPLHlVPbmlKVzWMxVdcBrGZSzEk=
 gopkg.in/DataDog/dd-trace-go.v1 v1.69.1/go.mod 
h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/notes/coredns-1.12.0.md 
new/coredns-1.12.0/notes/coredns-1.12.0.md
--- old/coredns-1.11.4/notes/coredns-1.12.0.md  1970-01-01 01:00:00.000000000 
+0100
+++ new/coredns-1.12.0/notes/coredns-1.12.0.md  2024-11-21 20:27:33.000000000 
+0100
@@ -0,0 +1,17 @@
+
+This release adds some new features.  Of note:
+* New multisocket plugin - allows CoreDNS to listen on multiple sockets
+* New automaxprocs plugin - automatically sets GOMAXPROCS to the number of CPUs
+
+## Brought to You By
+
+Ben Kochie,
+Chris O'Haver,
+Emmanuel Ferdman,
+Viktor
+
+
+## Noteworthy Changes
+
+* plugin/multisocket (https://github.com/coredns/coredns/pull/6882)
+* plugin/automaxprocs (https://github.com/coredns/coredns/pull/6948)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/plugin/multisocket/README.md 
new/coredns-1.12.0/plugin/multisocket/README.md
--- old/coredns-1.11.4/plugin/multisocket/README.md     1970-01-01 
01:00:00.000000000 +0100
+++ new/coredns-1.12.0/plugin/multisocket/README.md     2024-11-21 
20:27:33.000000000 +0100
@@ -0,0 +1,68 @@
+# multisocket
+
+## Name
+
+*multisocket* - allows to start multiple servers that will listen on one port.
+
+## Description
+
+With *multisocket*, you can define the number of servers that will listen on 
the same port. The SO_REUSEPORT socket 
+option allows to open multiple listening sockets at the same address and port. 
In this case, kernel distributes incoming 
+connections between sockets.
+
+Enabling this option allows to start multiple servers, which increases the 
throughput of CoreDNS in environments with a 
+large number of CPU cores.
+
+## Syntax
+
+~~~
+multisocket [NUM_SOCKETS]
+~~~
+
+* **NUM_SOCKETS** - the number of servers that will listen on one port. 
Default value is equal to GOMAXPROCS.
+
+## Examples
+
+Start 5 TCP/UDP servers on the same port.
+
+~~~ corefile
+. {
+       multisocket 5
+       forward . /etc/resolv.conf
+}
+~~~
+
+Do not define `NUM_SOCKETS`, in this case it will take a value equal to 
GOMAXPROCS.
+
+~~~ corefile
+. {
+       multisocket
+       forward . /etc/resolv.conf
+}
+~~~
+
+## Recommendations
+
+The tests of the `multisocket` plugin, which were conducted for `NUM_SOCKETS` 
from 1 to 10, did not reveal any side 
+effects or performance degradation.
+
+This means that the `multisocket` plugin can be used with a default value that 
is equal to GOMAXPROCS.
+
+However, to achieve the best results, it is recommended to consider the 
specific environment and plugins used in 
+CoreDNS. To determine the optimal configuration, it is advisable to conduct 
performance tests with different 
+`NUM_SOCKETS`, measuring Queries Per Second (QPS) and system load.
+
+If conducting such tests is difficult, follow these recommendations:
+1. Determine the maximum CPU consumption of CoreDNS server without 
`multisocket` plugin. Estimate how much CPU CoreDNS
+   actually consumes in specific environment under maximum load.
+2. Align `NUM_SOCKETS` with the estimated CPU usage and CPU limits or system's 
available resources.
+   Examples:
+   - If CoreDNS consumes 4 CPUs and 8 CPUs are available, set `NUM_SOCKETS` to 
2.
+   - If CoreDNS consumes 8 CPUs and 64 CPUs are available, set `NUM_SOCKETS` 
to 8.
+
+## Limitations
+
+The SO_REUSEPORT socket option is not available for some operating systems. It 
is available since Linux Kernel 3.9 and 
+not available for Windows at all.
+
+Using this plugin with a system that does not support SO_REUSEPORT will cause 
an `address already in use` error.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/plugin/multisocket/multisocket.go 
new/coredns-1.12.0/plugin/multisocket/multisocket.go
--- old/coredns-1.11.4/plugin/multisocket/multisocket.go        1970-01-01 
01:00:00.000000000 +0100
+++ new/coredns-1.12.0/plugin/multisocket/multisocket.go        2024-11-21 
20:27:33.000000000 +0100
@@ -0,0 +1,51 @@
+package multisocket
+
+import (
+       "fmt"
+       "runtime"
+       "strconv"
+
+       "github.com/coredns/caddy"
+       "github.com/coredns/coredns/core/dnsserver"
+       "github.com/coredns/coredns/plugin"
+)
+
+const pluginName = "multisocket"
+
+func init() { plugin.Register(pluginName, setup) }
+
+func setup(c *caddy.Controller) error {
+       err := parseNumSockets(c)
+       if err != nil {
+               return plugin.Error(pluginName, err)
+       }
+       return nil
+}
+
+func parseNumSockets(c *caddy.Controller) error {
+       config := dnsserver.GetConfig(c)
+       c.Next() // "multisocket"
+
+       args := c.RemainingArgs()
+
+       if len(args) > 1 || c.Next() {
+               return c.ArgErr()
+       }
+
+       if len(args) == 0 {
+               // Nothing specified; use default that is equal to GOMAXPROCS.
+               config.NumSockets = runtime.GOMAXPROCS(0)
+               return nil
+       }
+
+       numSockets, err := strconv.Atoi(args[0])
+       if err != nil {
+               return fmt.Errorf("invalid num sockets: %w", err)
+       }
+       if numSockets < 1 {
+               return fmt.Errorf("num sockets can not be zero or negative: 
%d", numSockets)
+       }
+       config.NumSockets = numSockets
+
+       return nil
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/coredns-1.11.4/plugin/multisocket/multisocket_test.go 
new/coredns-1.12.0/plugin/multisocket/multisocket_test.go
--- old/coredns-1.11.4/plugin/multisocket/multisocket_test.go   1970-01-01 
01:00:00.000000000 +0100
+++ new/coredns-1.12.0/plugin/multisocket/multisocket_test.go   2024-11-21 
20:27:33.000000000 +0100
@@ -0,0 +1,55 @@
+package multisocket
+
+import (
+       "runtime"
+       "strings"
+       "testing"
+
+       "github.com/coredns/caddy"
+       "github.com/coredns/coredns/core/dnsserver"
+)
+
+func TestMultisocket(t *testing.T) {
+       tests := []struct {
+               input              string
+               shouldErr          bool
+               expectedNumSockets int
+               expectedErrContent string // substring from the expected error. 
Empty for positive cases.
+       }{
+               // positive
+               {`multisocket`, false, runtime.GOMAXPROCS(0), ""},
+               {`multisocket 2`, false, 2, ""},
+               {` multisocket 1`, false, 1, ""},
+               {`multisocket text`, true, 0, "invalid num sockets"},
+               {`multisocket 0`, true, 0, "num sockets can not be zero or 
negative"},
+               {`multisocket -1`, true, 0, "num sockets can not be zero or 
negative"},
+               {`multisocket 2 2`, true, 0, "Wrong argument count or 
unexpected line ending after '2'"},
+               {`multisocket 2 {
+                       block
+               }`, true, 0, "Unexpected token '{', expecting argument"},
+       }
+
+       for i, test := range tests {
+               c := caddy.NewTestController("dns", test.input)
+               err := setup(c)
+               cfg := dnsserver.GetConfig(c)
+
+               if test.shouldErr && err == nil {
+                       t.Errorf("Test %d: Expected error but found %s for 
input %s", i, err, test.input)
+               }
+
+               if err != nil {
+                       if !test.shouldErr {
+                               t.Errorf("Test %d: Expected no error but found 
one for input %s. Error was: %v", i, test.input, err)
+                       }
+
+                       if !strings.Contains(err.Error(), 
test.expectedErrContent) {
+                               t.Errorf("Test %d: Expected error to contain: 
%v, found error: %v, input: %s", i, test.expectedErrContent, err, test.input)
+                       }
+               }
+
+               if cfg.NumSockets != test.expectedNumSockets {
+                       t.Errorf("Test %d: Expected num sockets to be %d, found 
%d", i, test.expectedNumSockets, cfg.NumSockets)
+               }
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/plugin.cfg 
new/coredns-1.12.0/plugin.cfg
--- old/coredns-1.11.4/plugin.cfg       2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/plugin.cfg       2024-11-21 20:27:33.000000000 +0100
@@ -25,6 +25,7 @@
 cancel:cancel
 tls:tls
 timeouts:timeouts
+multisocket:multisocket
 reload:reload
 nsid:nsid
 bufsize:bufsize
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/test/multisocket_test.go 
new/coredns-1.12.0/test/multisocket_test.go
--- old/coredns-1.11.4/test/multisocket_test.go 1970-01-01 01:00:00.000000000 
+0100
+++ new/coredns-1.12.0/test/multisocket_test.go 2024-11-21 20:27:33.000000000 
+0100
@@ -0,0 +1,169 @@
+package test
+
+import (
+       "fmt"
+       "net"
+       "testing"
+
+       "github.com/miekg/dns"
+)
+
+// These tests need a fixed port, because :0 selects a random port for each 
socket, but we need all sockets to be on
+// the same port.
+
+func TestMultisocket(t *testing.T) {
+       tests := []struct {
+               name            string
+               corefile        string
+               expectedServers int
+               expectedErr     string
+               expectedPort    string
+       }{
+               {
+                       name: "no multisocket",
+                       corefile: `.:5054 {
+                       }`,
+                       expectedServers: 1,
+                       expectedPort:    "5054",
+               },
+               {
+                       name: "multisocket 1",
+                       corefile: `.:5055 {
+                               multisocket 1
+                       }`,
+                       expectedServers: 1,
+                       expectedPort:    "5055",
+               },
+               {
+                       name: "multisocket 2",
+                       corefile: `.:5056 {
+                               multisocket 2
+                       }`,
+                       expectedServers: 2,
+                       expectedPort:    "5056",
+               },
+               {
+                       name: "multisocket 100",
+                       corefile: `.:5057 {
+                               multisocket 100
+                       }`,
+                       expectedServers: 100,
+                       expectedPort:    "5057",
+               },
+       }
+
+       for _, test := range tests {
+               t.Run(test.name, func(t *testing.T) {
+                       s, err := CoreDNSServer(test.corefile)
+                       defer s.Stop()
+                       if err != nil {
+                               t.Fatalf("Could not get CoreDNS serving 
instance: %s", err)
+                       }
+                       // check number of servers
+                       if len(s.Servers()) != test.expectedServers {
+                               t.Fatalf("Expected %d servers, got %d", 
test.expectedServers, len(s.Servers()))
+                       }
+
+                       // check that ports are the same
+                       for _, listener := range s.Servers() {
+                               if listener.Addr().String() != 
listener.LocalAddr().String() {
+                                       t.Fatalf("Expected tcp address %s to be 
on the same port as udp address %s",
+                                               listener.LocalAddr().String(), 
listener.Addr().String())
+                               }
+                               _, port, err := 
net.SplitHostPort(listener.Addr().String())
+                               if err != nil {
+                                       t.Fatalf("Could not get port from 
listener addr: %s", err)
+                               }
+                               if port != test.expectedPort {
+                                       t.Fatalf("Expected port %s, got %s", 
test.expectedPort, port)
+                               }
+                       }
+               })
+       }
+}
+
+func TestMultisocket_Restart(t *testing.T) {
+       tests := []struct {
+               name             string
+               numSocketsBefore int
+               numSocketsAfter  int
+       }{
+               {
+                       name:             "increase",
+                       numSocketsBefore: 1,
+                       numSocketsAfter:  2,
+               },
+               {
+                       name:             "decrease",
+                       numSocketsBefore: 2,
+                       numSocketsAfter:  1,
+               },
+               {
+                       name:             "no changes",
+                       numSocketsBefore: 2,
+                       numSocketsAfter:  2,
+               },
+       }
+
+       for _, test := range tests {
+               t.Run(test.name, func(t *testing.T) {
+                       corefile := `.:5058 {
+                               multisocket %d
+                       }`
+                       srv, err := CoreDNSServer(fmt.Sprintf(corefile, 
test.numSocketsBefore))
+                       if err != nil {
+                               t.Fatalf("Could not get CoreDNS serving 
instance: %s", err)
+                       }
+                       if test.numSocketsBefore != len(srv.Servers()) {
+                               t.Fatalf("Expected %d servers, got %d", 
test.numSocketsBefore, len(srv.Servers()))
+                       }
+
+                       newSrv, err := 
srv.Restart(NewInput(fmt.Sprintf(corefile, test.numSocketsAfter)))
+                       if err != nil {
+                               t.Fatalf("Could not get CoreDNS serving 
instance: %s", err)
+                       }
+                       if test.numSocketsAfter != len(newSrv.Servers()) {
+                               t.Fatalf("Expected %d servers, got %d", 
test.numSocketsAfter, len(newSrv.Servers()))
+                       }
+                       newSrv.Stop()
+               })
+       }
+}
+
+// Just check that server with multisocket works
+func TestMultisocket_WhoAmI(t *testing.T) {
+       corefile := `.:5059 {
+               multisocket
+               whoami
+       }`
+       s, udp, tcp, err := CoreDNSServerAndPorts(corefile)
+       if err != nil {
+               t.Fatalf("Could not get CoreDNS serving instance: %s", err)
+       }
+       defer s.Stop()
+
+       m := new(dns.Msg)
+       m.SetQuestion("whoami.example.org.", dns.TypeA)
+
+       // check udp
+       cl := dns.Client{Net: "udp"}
+       udpResp, err := dns.Exchange(m, udp)
+       if err != nil {
+               t.Fatalf("Expected to receive reply, but didn't: %v", err)
+       }
+       // check tcp
+       cl.Net = "tcp"
+       tcpResp, _, err := cl.Exchange(m, tcp)
+       if err != nil {
+               t.Fatalf("Expected to receive reply, but didn't: %v", err)
+       }
+
+       for _, resp := range []*dns.Msg{udpResp, tcpResp} {
+               if resp.Rcode != dns.RcodeSuccess {
+                       t.Fatalf("Expected RcodeSuccess, got %v", resp.Rcode)
+               }
+               if len(resp.Extra) != 2 {
+                       t.Errorf("Expected 2 RRs in additional section, got 
%d", len(resp.Extra))
+               }
+       }
+}

++++++ coredns-1.11.4.tar.gz -> coredns-1.12.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.circleci/config.yml 
new/coredns-1.12.0/.circleci/config.yml
--- old/coredns-1.11.4/.circleci/config.yml     2024-11-13 02:31:15.000000000 
+0100
+++ new/coredns-1.12.0/.circleci/config.yml     2024-11-21 20:27:33.000000000 
+0100
@@ -21,8 +21,8 @@
     image: default
   working_directory: ~/go/src/${CIRCLE_PROJECT_USERNAME}/coredns
   environment:
-    - K8S_VERSION: v1.22.0
-    - KIND_VERSION: v0.11.1
+    - K8S_VERSION: v1.29.4
+    - KIND_VERSION: v0.25.0
     - KUBECONFIG: /home/circleci/.kube/kind-config-kind
 
 setupKubernetes: &setupKubernetes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/codeql-analysis.yml 
new/coredns-1.12.0/.github/workflows/codeql-analysis.yml
--- old/coredns-1.11.4/.github/workflows/codeql-analysis.yml    2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/codeql-analysis.yml    2024-11-21 
20:27:33.000000000 +0100
@@ -30,12 +30,12 @@
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683  # 
v4.2.2
 
       - name: Initialize CodeQL
-        uses: 
github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd  # v3.27.0
+        uses: 
github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # v3.27.4
         with:
           languages: ${{ matrix.language }}
 
       - name: Autobuild
-        uses: 
github/codeql-action/autobuild@662472033e021d55d94146f66f6058822b0b39fd  # 
v3.27.0
+        uses: 
github/codeql-action/autobuild@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # 
v3.27.4
 
       - name: Perform CodeQL Analysis
-        uses: 
github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd  # v3.27.0
+        uses: 
github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # v3.27.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/go.coverage.yml 
new/coredns-1.12.0/.github/workflows/go.coverage.yml
--- old/coredns-1.11.4/.github/workflows/go.coverage.yml        2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/go.coverage.yml        2024-11-21 
20:27:33.000000000 +0100
@@ -31,4 +31,4 @@
           done
 
       - name: Upload coverage to Codecov
-        uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238  
# v4.6.0
+        uses: codecov/codecov-action@5c47607acb93fed5485fdbf7232e8a31425f672a  
# v5.0.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/go.test.yml 
new/coredns-1.12.0/.github/workflows/go.test.yml
--- old/coredns-1.11.4/.github/workflows/go.test.yml    2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/go.test.yml    2024-11-21 
20:27:33.000000000 +0100
@@ -61,7 +61,7 @@
       - name: Install Go
         uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed  # 
v5.1.0
         with:
-          go-version: '~1.21.0'
+          go-version: ${{ env.GO_VERSION }}
         id: go
 
       - name: Build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/golangci-lint.yml 
new/coredns-1.12.0/.github/workflows/golangci-lint.yml
--- old/coredns-1.11.4/.github/workflows/golangci-lint.yml      2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/golangci-lint.yml      2024-11-21 
20:27:33.000000000 +0100
@@ -15,4 +15,4 @@
       - name: golangci-lint
         uses: 
golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8  # v6.1.1
         with:
-          version: v1.60.1
+          version: v1.62.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/release.yml 
new/coredns-1.12.0/.github/workflows/release.yml
--- old/coredns-1.11.4/.github/workflows/release.yml    2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/release.yml    2024-11-21 
20:27:33.000000000 +0100
@@ -45,7 +45,7 @@
           cat release.md
           sha256sum release/*.tgz
       - name: Draft release
-        uses: 
softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8  # v2.0.9
+        uses: 
softprops/action-gh-release@01570a1f39cb168c169c802c3bceb9e93fb10974  # v2.1.0
         with:
           body_path: release.md
           name: v${{ steps.info.outputs.version }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/scorecards.yml 
new/coredns-1.12.0/.github/workflows/scorecards.yml
--- old/coredns-1.11.4/.github/workflows/scorecards.yml 2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/scorecards.yml 2024-11-21 
20:27:33.000000000 +0100
@@ -51,6 +51,6 @@
 
       # Upload the results to GitHub's code scanning dashboard.
       - name: "Upload to code-scanning"
-        uses: 
github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd  # 
v3.27.0
+        uses: 
github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # 
v3.27.4
         with:
           sarif_file: results.sarif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.github/workflows/trivy-scan.yaml 
new/coredns-1.12.0/.github/workflows/trivy-scan.yaml
--- old/coredns-1.11.4/.github/workflows/trivy-scan.yaml        2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.github/workflows/trivy-scan.yaml        2024-11-21 
20:27:33.000000000 +0100
@@ -28,6 +28,6 @@
           output: 'trivy-results.sarif'
 
       - name: Upload Trivy scan results to GitHub Security tab
-        uses: 
github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd  # 
v3.27.0
+        uses: 
github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f  # 
v3.27.4
         with:
           sarif_file: 'trivy-results.sarif'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/.go-version 
new/coredns-1.12.0/.go-version
--- old/coredns-1.11.4/.go-version      2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/.go-version      2024-11-21 20:27:33.000000000 +0100
@@ -1 +1 @@
-1.23.2
+1.23.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/CODEOWNERS 
new/coredns-1.12.0/CODEOWNERS
--- old/coredns-1.11.4/CODEOWNERS       2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/CODEOWNERS       2024-11-21 20:27:33.000000000 +0100
@@ -1,9 +1,9 @@
 # 5 steering committee members
-# @chrisohaver, term ends 2024-09-26
-# @johnbelamaric, term ends 2024-09-26
-# @stp-ip, term ends 2024-09-26
-# @superq, term ends 2024-09-26
-# @tantalor93, term ends 2024-09-26
+# @chrisohaver, term ends 2025-11-21
+# @johnbelamaric, term ends 2025-11-21
+# @stp-ip, term ends 2025-11-21
+# @superq, term ends 2025-11-21
+# @tantalor93, term ends 2025-11-21
 
 *                       @bradbeam @chrisohaver @dilyevsky @jameshartig 
@greenpau @isolus @johnbelamaric @miekg @pmoroney @rajansandeep @stp-ip @superq 
@yongtang @Tantalor93
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/GOVERNANCE.md 
new/coredns-1.12.0/GOVERNANCE.md
--- old/coredns-1.11.4/GOVERNANCE.md    2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/GOVERNANCE.md    2024-11-21 20:27:33.000000000 +0100
@@ -5,7 +5,7 @@
 The CoreDNS community adheres to the following principles:
 
 - Open: CoreDNS is open source, advertised on [our 
website](https://coredns.io/community).
-- Welcoming and respectful: See [Code of Conduct](CODE-OF-CONDUCT.md).
+- Welcoming and respectful: See [Code of Conduct](.github/CODE_OF_CONDUCT.md).
 - Transparent and accessible: Changes to the CoreDNS organization, CoreDNS 
code repositories, and CNCF related activities (e.g. level, involvement, etc) 
are done in public.
 - Merit: Ideas and contributions are accepted according to their technical 
merit and alignment with
   project objectives, scope, and design principles.
@@ -53,7 +53,7 @@
 step down.
 
 The CoreDNS organization will never forcefully remove a current Maintainer, 
unless a maintainer
-fails to meet the principles of CoreDNS community, or adhere to the [Code of 
Conduct](CODE-OF-CONDUCT.md).
+fails to meet the principles of CoreDNS community, or adhere to the [Code of 
Conduct](.github/CODE_OF_CONDUCT.md).
 
 ## Changes in Project Steering Committee Membership
 
@@ -145,7 +145,7 @@
 
 ## Code of Conduct
 
-The [CoreDNS Code of Conduct](CODE-OF-CONDUCT.md) is aligned with the CNCF 
Code of Conduct.
+The [CoreDNS Code of Conduct](.github/CODE_OF_CONDUCT.md) is aligned with the 
CNCF Code of Conduct.
 
 ## Credits
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/core/dnsserver/config.go 
new/coredns-1.12.0/core/dnsserver/config.go
--- old/coredns-1.11.4/core/dnsserver/config.go 2024-11-13 02:31:15.000000000 
+0100
+++ new/coredns-1.12.0/core/dnsserver/config.go 2024-11-21 20:27:33.000000000 
+0100
@@ -24,6 +24,10 @@
        // The port to listen on.
        Port string
 
+       // The number of servers that will listen on one port.
+       // By default, one server will be running.
+       NumSockets int
+
        // Root points to a base directory we find user defined "things".
        // First consumer is the file plugin to looks for zone files in this 
place.
        Root string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/core/dnsserver/register.go 
new/coredns-1.12.0/core/dnsserver/register.go
--- old/coredns-1.11.4/core/dnsserver/register.go       2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/core/dnsserver/register.go       2024-11-21 
20:27:33.000000000 +0100
@@ -134,69 +134,23 @@
 
 // MakeServers uses the newly-created siteConfigs to create and return a list 
of server instances.
 func (h *dnsContext) MakeServers() ([]caddy.Server, error) {
-       // Copy the Plugin, ListenHosts and Debug from first config in the block
-       // to all other config in the same block . Doing this results in zones
-       // sharing the same plugin instances and settings as other zones in
-       // the same block.
-       for _, c := range h.configs {
-               c.Plugin = c.firstConfigInBlock.Plugin
-               c.ListenHosts = c.firstConfigInBlock.ListenHosts
-               c.Debug = c.firstConfigInBlock.Debug
-               c.Stacktrace = c.firstConfigInBlock.Stacktrace
-
-               // Fork TLSConfig for each encrypted connection
-               c.TLSConfig = c.firstConfigInBlock.TLSConfig.Clone()
-               c.ReadTimeout = c.firstConfigInBlock.ReadTimeout
-               c.WriteTimeout = c.firstConfigInBlock.WriteTimeout
-               c.IdleTimeout = c.firstConfigInBlock.IdleTimeout
-               c.TsigSecret = c.firstConfigInBlock.TsigSecret
-       }
+       // Copy parameters from first config in the block to all other config 
in the same block
+       propagateConfigParams(h.configs)
 
        // we must map (group) each config to a bind address
        groups, err := groupConfigsByListenAddr(h.configs)
        if err != nil {
                return nil, err
        }
+
        // then we create a server for each group
        var servers []caddy.Server
        for addr, group := range groups {
-               // switch on addr
-               switch tr, _ := parse.Transport(addr); tr {
-               case transport.DNS:
-                       s, err := NewServer(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
-
-               case transport.TLS:
-                       s, err := NewServerTLS(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
-
-               case transport.QUIC:
-                       s, err := NewServerQUIC(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
-
-               case transport.GRPC:
-                       s, err := NewServergRPC(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
-
-               case transport.HTTPS:
-                       s, err := NewServerHTTPS(addr, group)
-                       if err != nil {
-                               return nil, err
-                       }
-                       servers = append(servers, s)
+               serversForGroup, err := makeServersForGroup(addr, group)
+               if err != nil {
+                       return nil, err
                }
+               servers = append(servers, serversForGroup...)
        }
 
        // For each server config, check for View Filter plugins
@@ -299,6 +253,27 @@
        return nil
 }
 
+// propagateConfigParams copies the necessary parameters from first config in 
the block
+// to all other config in the same block. Doing this results in zones
+// sharing the same plugin instances and settings as other zones in
+// the same block.
+func propagateConfigParams(configs []*Config) {
+       for _, c := range configs {
+               c.Plugin = c.firstConfigInBlock.Plugin
+               c.ListenHosts = c.firstConfigInBlock.ListenHosts
+               c.Debug = c.firstConfigInBlock.Debug
+               c.Stacktrace = c.firstConfigInBlock.Stacktrace
+               c.NumSockets = c.firstConfigInBlock.NumSockets
+
+               // Fork TLSConfig for each encrypted connection
+               c.TLSConfig = c.firstConfigInBlock.TLSConfig.Clone()
+               c.ReadTimeout = c.firstConfigInBlock.ReadTimeout
+               c.WriteTimeout = c.firstConfigInBlock.WriteTimeout
+               c.IdleTimeout = c.firstConfigInBlock.IdleTimeout
+               c.TsigSecret = c.firstConfigInBlock.TsigSecret
+       }
+}
+
 // groupConfigsByListenAddr groups site configs by their listen
 // (bind) address, so sites that use the same listener can be served
 // on the same server instance. The return value maps the listen
@@ -320,6 +295,63 @@
        return groups, nil
 }
 
+// makeServersForGroup creates servers for a specific transport and group.
+// It creates as many servers as specified in the NumSockets configuration.
+// If the NumSockets param is not specified, one server is created by default.
+func makeServersForGroup(addr string, group []*Config) ([]caddy.Server, error) 
{
+       // that is impossible, but better to check
+       if len(group) == 0 {
+               return nil, fmt.Errorf("no configs for group defined")
+       }
+       // create one server by default if no NumSockets specified
+       numSockets := 1
+       if group[0].NumSockets > 0 {
+               numSockets = group[0].NumSockets
+       }
+
+       var servers []caddy.Server
+       for range numSockets {
+               // switch on addr
+               switch tr, _ := parse.Transport(addr); tr {
+               case transport.DNS:
+                       s, err := NewServer(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+
+               case transport.TLS:
+                       s, err := NewServerTLS(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+
+               case transport.QUIC:
+                       s, err := NewServerQUIC(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+
+               case transport.GRPC:
+                       s, err := NewServergRPC(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+
+               case transport.HTTPS:
+                       s, err := NewServerHTTPS(addr, group)
+                       if err != nil {
+                               return nil, err
+                       }
+                       servers = append(servers, s)
+               }
+       }
+       return servers, nil
+}
+
 // DefaultPort is the default port.
 const DefaultPort = transport.Port
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/core/dnsserver/zdirectives.go 
new/coredns-1.12.0/core/dnsserver/zdirectives.go
--- old/coredns-1.11.4/core/dnsserver/zdirectives.go    2024-11-13 
02:31:15.000000000 +0100
+++ new/coredns-1.12.0/core/dnsserver/zdirectives.go    2024-11-21 
20:27:33.000000000 +0100
@@ -16,6 +16,7 @@
        "cancel",
        "tls",
        "timeouts",
+       "multisocket",
        "reload",
        "nsid",
        "bufsize",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/core/plugin/zplugin.go 
new/coredns-1.12.0/core/plugin/zplugin.go
--- old/coredns-1.11.4/core/plugin/zplugin.go   2024-11-13 02:31:15.000000000 
+0100
+++ new/coredns-1.12.0/core/plugin/zplugin.go   2024-11-21 20:27:33.000000000 
+0100
@@ -39,6 +39,7 @@
        _ "github.com/coredns/coredns/plugin/metadata"
        _ "github.com/coredns/coredns/plugin/metrics"
        _ "github.com/coredns/coredns/plugin/minimal"
+       _ "github.com/coredns/coredns/plugin/multisocket"
        _ "github.com/coredns/coredns/plugin/nsid"
        _ "github.com/coredns/coredns/plugin/pprof"
        _ "github.com/coredns/coredns/plugin/ready"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/coremain/run.go 
new/coredns-1.12.0/coremain/run.go
--- old/coredns-1.11.4/coremain/run.go  2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/coremain/run.go  2024-11-21 20:27:33.000000000 +0100
@@ -12,6 +12,8 @@
 
        "github.com/coredns/caddy"
        "github.com/coredns/coredns/core/dnsserver"
+
+       "go.uber.org/automaxprocs/maxprocs"
 )
 
 func init() {
@@ -56,6 +58,11 @@
                os.Exit(0)
        }
 
+       _, err := maxprocs.Set(maxprocs.Logger(log.Printf))
+       if err != nil {
+               log.Println("[WARNING] Failed to set GOMAXPROCS:", err)
+       }
+
        // Get Corefile input
        corefile, err := caddy.LoadCaddyfile(serverType)
        if err != nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/coremain/version.go 
new/coredns-1.12.0/coremain/version.go
--- old/coredns-1.11.4/coremain/version.go      2024-11-13 02:31:15.000000000 
+0100
+++ new/coredns-1.12.0/coremain/version.go      2024-11-21 20:27:33.000000000 
+0100
@@ -2,7 +2,7 @@
 
 // Various CoreDNS constants.
 const (
-       CoreVersion = "1.11.4"
+       CoreVersion = "1.12.0"
        CoreName    = "CoreDNS"
        serverType  = "dns"
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/go.mod new/coredns-1.12.0/go.mod
--- old/coredns-1.11.4/go.mod   2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/go.mod   2024-11-21 20:27:33.000000000 +0100
@@ -1,6 +1,6 @@
 module github.com/coredns/coredns
 
-go 1.22.0
+go 1.22.7
 
 toolchain go1.23.0
 
@@ -10,9 +10,9 @@
        github.com/Azure/go-autorest/autorest/azure/auth v0.5.13
        github.com/apparentlymart/go-cidr v1.1.0
        github.com/aws/aws-sdk-go v1.55.5
-       github.com/aws/aws-sdk-go-v2/config v1.27.39
-       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3
-       github.com/coredns/caddy v1.1.1
+       github.com/aws/aws-sdk-go-v2/config v1.28.5
+       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.5
+       github.com/coredns/caddy v1.1.2-0.20241029205200-8de985351a98
        github.com/dnstap/golang-dnstap v0.4.0
        github.com/expr-lang/expr v1.16.9
        github.com/farsightsec/golang-framestream v0.3.0
@@ -29,13 +29,14 @@
        github.com/prometheus/client_model v0.6.1
        github.com/prometheus/common v0.60.1
        github.com/quic-go/quic-go v0.48.1
-       go.etcd.io/etcd/api/v3 v3.5.16
-       go.etcd.io/etcd/client/v3 v3.5.16
-       golang.org/x/crypto v0.28.0
-       golang.org/x/sys v0.26.0
-       google.golang.org/api v0.201.0
-       google.golang.org/grpc v1.67.1
-       google.golang.org/protobuf v1.35.1
+       go.etcd.io/etcd/api/v3 v3.5.17
+       go.etcd.io/etcd/client/v3 v3.5.17
+       go.uber.org/automaxprocs v1.6.0
+       golang.org/x/crypto v0.29.0
+       golang.org/x/sys v0.27.0
+       google.golang.org/api v0.206.0
+       google.golang.org/grpc v1.68.0
+       google.golang.org/protobuf v1.35.2
        gopkg.in/DataDog/dd-trace-go.v1 v1.69.1
        k8s.io/api v0.31.2
        k8s.io/apimachinery v0.31.2
@@ -44,8 +45,8 @@
 )
 
 require (
-       cloud.google.com/go/auth v0.9.8 // indirect
-       cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
+       cloud.google.com/go/auth v0.10.2 // indirect
+       cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect
        cloud.google.com/go/compute/metadata v0.5.2 // indirect
        github.com/Azure/go-autorest v14.2.0+incompatible // indirect
        github.com/Azure/go-autorest/autorest/adal v0.9.22 // indirect
@@ -62,18 +63,18 @@
        github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect
        github.com/DataDog/sketches-go v1.4.5 // indirect
        github.com/Microsoft/go-winio v0.6.1 // indirect
-       github.com/aws/aws-sdk-go-v2 v1.31.0 // indirect
-       github.com/aws/aws-sdk-go-v2/credentials v1.17.37 // indirect
-       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect
+       github.com/aws/aws-sdk-go-v2 v1.32.5 // indirect
+       github.com/aws/aws-sdk-go-v2/credentials v1.17.46 // indirect
+       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 // indirect
        github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 
// indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 // indirect
-       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 // indirect
-       github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 // indirect
-       github.com/aws/smithy-go v1.21.0 // indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 
// indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 // 
indirect
+       github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 // indirect
+       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 // indirect
+       github.com/aws/smithy-go v1.22.1 // indirect
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
        github.com/coreos/go-semver v0.3.0 // indirect
@@ -103,7 +104,7 @@
        github.com/google/s2a-go v0.1.8 // indirect
        github.com/google/uuid v1.6.0 // indirect
        github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
-       github.com/googleapis/gax-go/v2 v2.13.0 // indirect
+       github.com/googleapis/gax-go/v2 v2.14.0 // indirect
        github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 // indirect
        github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect
        github.com/hashicorp/go-sockaddr v1.0.2 // indirect
@@ -130,7 +131,7 @@
        github.com/spf13/pflag v1.0.5 // indirect
        github.com/tinylib/msgp v1.2.1 // indirect
        github.com/x448/float16 v0.8.4 // indirect
-       go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect
+       go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect
        go.opencensus.io v0.24.0 // indirect
        go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 
// indirect
        go.opentelemetry.io/otel v1.29.0 // indirect
@@ -142,16 +143,16 @@
        go.uber.org/zap v1.17.0 // indirect
        golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
        golang.org/x/mod v0.18.0 // indirect
-       golang.org/x/net v0.30.0 // indirect
-       golang.org/x/oauth2 v0.23.0 // indirect
-       golang.org/x/sync v0.8.0 // indirect
-       golang.org/x/term v0.25.0 // indirect
-       golang.org/x/text v0.19.0 // indirect
-       golang.org/x/time v0.7.0 // indirect
+       golang.org/x/net v0.31.0 // indirect
+       golang.org/x/oauth2 v0.24.0 // indirect
+       golang.org/x/sync v0.9.0 // indirect
+       golang.org/x/term v0.26.0 // indirect
+       golang.org/x/text v0.20.0 // indirect
+       golang.org/x/time v0.8.0 // indirect
        golang.org/x/tools v0.22.0 // indirect
        golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
-       google.golang.org/genproto/googleapis/api 
v0.0.0-20240930140551-af27646dc61f // indirect
-       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241007155032-5fefd90f89a9 // indirect
+       google.golang.org/genproto/googleapis/api 
v0.0.0-20241104194629-dd2ea8efbc28 // indirect
+       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241104194629-dd2ea8efbc28 // indirect
        gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
        gopkg.in/inf.v0 v0.9.1 // indirect
        gopkg.in/yaml.v2 v2.4.0 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/go.sum new/coredns-1.12.0/go.sum
--- old/coredns-1.11.4/go.sum   2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/go.sum   2024-11-21 20:27:33.000000000 +0100
@@ -1,8 +1,8 @@
 cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go/auth v0.9.8 h1:+CSJ0Gw9iVeSENVCKJoLHhdUykDgXSc4Qn+gu2BRtR8=
-cloud.google.com/go/auth v0.9.8/go.mod 
h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
-cloud.google.com/go/auth/oauth2adapt v0.2.4 
h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
-cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod 
h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
+cloud.google.com/go/auth v0.10.2 
h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo=
+cloud.google.com/go/auth v0.10.2/go.mod 
h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
+cloud.google.com/go/auth/oauth2adapt v0.2.5 
h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk=
+cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod 
h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
 cloud.google.com/go/compute/metadata v0.5.2 
h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
 cloud.google.com/go/compute/metadata v0.5.2/go.mod 
h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
 github.com/Azure/azure-sdk-for-go v68.0.0+incompatible 
h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
@@ -55,34 +55,34 @@
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod 
h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/aws/aws-sdk-go v1.55.5 
h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
 github.com/aws/aws-sdk-go v1.55.5/go.mod 
h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
-github.com/aws/aws-sdk-go-v2 v1.31.0 
h1:3V05LbxTSItI5kUqNwhJrrrY1BAXxXt0sN0l72QmG5U=
-github.com/aws/aws-sdk-go-v2 v1.31.0/go.mod 
h1:ztolYtaEUtdpf9Wftr31CJfLVjOnD/CVRkKOOYgF8hA=
-github.com/aws/aws-sdk-go-v2/config v1.27.39 
h1:FCylu78eTGzW1ynHcongXK9YHtoXD5AiiUqq3YfJYjU=
-github.com/aws/aws-sdk-go-v2/config v1.27.39/go.mod 
h1:wczj2hbyskP4LjMKBEZwPRO1shXY+GsQleab+ZXT2ik=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.37 
h1:G2aOH01yW8X373JK419THj5QVqu9vKEwxSEsGxihoW0=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.37/go.mod 
h1:0ecCjlb7htYCptRD45lXJ6aJDQac6D2NlKGpZqyTG6A=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 
h1:C/d03NAmh8C4BZXhuRNboF/DqhBkBCeDiJDcaqIT5pA=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14/go.mod 
h1:7I0Ju7p9mCIdlrfS+JCgqcYD0VXz/N4yozsox+0o078=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 
h1:kYQ3H1u0ANr9KEKlGs/jTLrBFPo8P8NaH/w7A01NeeM=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18/go.mod 
h1:r506HmK5JDUh9+Mw4CfGJGSSoqIiLCndAuqXuhbv67Y=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 
h1:Z7IdFUONvTcvS7YuhtVxN99v2cCoHRXOS4mTr0B/pUc=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18/go.mod 
h1:DkKMmksZVVyat+Y+r1dEOgJEfUeA7UngIHWeKsi0yNc=
+github.com/aws/aws-sdk-go-v2 v1.32.5 
h1:U8vdWJuY7ruAkzaOdD7guwJjD06YSKmnKCJs7s3IkIo=
+github.com/aws/aws-sdk-go-v2 v1.32.5/go.mod 
h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
+github.com/aws/aws-sdk-go-v2/config v1.28.5 
h1:Za41twdCXbuyyWv9LndXxZZv3QhTG1DinqlFsSuvtI0=
+github.com/aws/aws-sdk-go-v2/config v1.28.5/go.mod 
h1:4VsPbHP8JdcdUDmbTVgNL/8w9SqOkM5jyY8ljIxLO3o=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.46 
h1:AU7RcriIo2lXjUfHFnFKYsLCwgbz1E7Mm95ieIRDNUg=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.46/go.mod 
h1:1FmYyLGL08KQXQ6mcTlifyFXfJVCNJTVGuQP4m0d/UA=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 
h1:sDSXIrlsFSFJtWKLQS4PUWRvrT580rrnuLydJrCQ/yA=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20/go.mod 
h1:WZ/c+w0ofps+/OUqMwWgnfrgzZH1DZO1RIkktICsqnY=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 
h1:4usbeaes3yJnCFC7kfeyhkdkPtoRYPa/hTmCqMpKpLI=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24/go.mod 
h1:5CI1JemjVwde8m2WG3cz23qHKPOxbpkq0HaoreEgLIY=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 
h1:N1zsICrQglfzaBnrfM0Ys00860C+QFwu6u/5+LomP+o=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24/go.mod 
h1:dCn9HbJ8+K31i8IQ8EWmWj0EiIk0+vKiHNMxTTYveAg=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 
h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod 
h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 
h1:QFASJGfT8wMXtuP3D5CRmMjARHv9ZmzFUMJznHDOY3w=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5/go.mod 
h1:QdZ3OmoIjSX+8D1OPAzPxDfjXASbBMDsz9qvtyIhtik=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 
h1:Xbwbmk44URTiHNx6PNo0ujDE6ERlsCKJD3u1zfnzAPg=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20/go.mod 
h1:oAfOFzUB14ltPZj1rWwRc3d/6OgD76R8KlvU3EqM9Fg=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3 
h1:W2M3kQSuN1+FXgV2wMv1JMWPxw/37wBN87QHYDuTV0Y=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3/go.mod 
h1:WyLS5qwXHtjKAONYZq/4ewdd+hcVsa3LBu77Ow5uj3k=
-github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 
h1:rs4JCczF805+FDv2tRhZ1NU0RB2H6ryAvsWPanAr72Y=
-github.com/aws/aws-sdk-go-v2/service/sso v1.23.3/go.mod 
h1:XRlMvmad0ZNL+75C5FYdMvbbLkd6qiqz6foR1nA1PXY=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 
h1:S7EPdMVZod8BGKQQPTBK+FcX9g7bKR7c4+HxWqHP7Vg=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3/go.mod 
h1:FnvDM4sfa+isJ3kDXIzAB9GAwVSzFzSy97uZ3IsHo4E=
-github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 
h1:VzudTFrDCIDakXtemR7l6Qzt2+JYsVqo2MxBPt5k8T8=
-github.com/aws/aws-sdk-go-v2/service/sts v1.31.3/go.mod 
h1:yMWe0F+XG0DkRZK5ODZhG7BEFYhLXi2dqGsv6tX0cgI=
-github.com/aws/smithy-go v1.21.0 
h1:H7L8dtDRk0P1Qm6y0ji7MCYMQObJ5R9CRpyPhRUkLYA=
-github.com/aws/smithy-go v1.21.0/go.mod 
h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 
h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod 
h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 
h1:wtpJ4zcwrSbwhECWQoI/g6WM9zqCcSpHDJIWSbMLOu4=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5/go.mod 
h1:qu/W9HXQbbQ4+1+JcZp0ZNPV31ym537ZJN+fiS7Ti8E=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.5 
h1:gqj99GNYzuY0jMekToqvOW1VaSupY0Qn0oj1JGSolpE=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.5/go.mod 
h1:FTCjaQxTVVQqLQ4ktBsLNZPnJ9pVLkJ6F0qVwtALaxk=
+github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 
h1:3zu537oLmsPfDMyjnUS2g+F2vITgy5pB74tHI+JBNoM=
+github.com/aws/aws-sdk-go-v2/service/sso v1.24.6/go.mod 
h1:WJSZH2ZvepM6t6jwu4w/Z45Eoi75lPN7DcydSRtJg6Y=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 
h1:K0OQAsDywb0ltlFrZm0JHPY3yZp/S9OaoLU33S7vPS8=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5/go.mod 
h1:ORITg+fyuMoeiQFiVGoqB3OydVTLkClw/ljbblMq6Cc=
+github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 
h1:6SZUVRQNvExYlMLbHdlKB48x0fLbc2iVROyaNEwBHbU=
+github.com/aws/aws-sdk-go-v2/service/sts v1.33.1/go.mod 
h1:GqWyYCwLXnlUB1lOAXQyNSPqPLQJvmo8J0DWBzp9mtg=
+github.com/aws/smithy-go v1.22.1 
h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
+github.com/aws/smithy-go v1.22.1/go.mod 
h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod 
h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bgentry/speakeasy v0.1.0/go.mod 
h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
@@ -92,8 +92,8 @@
 github.com/cespare/xxhash/v2 v2.3.0/go.mod 
h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod 
h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0=
-github.com/coredns/caddy v1.1.1/go.mod 
h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
+github.com/coredns/caddy v1.1.2-0.20241029205200-8de985351a98 
h1:c+Epklw9xk6BZ1OFBPWLA2PcL8QalKvl3if8CP9x8uw=
+github.com/coredns/caddy v1.1.2-0.20241029205200-8de985351a98/go.mod 
h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
 github.com/coreos/go-semver v0.3.0 
h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
 github.com/coreos/go-semver v0.3.0/go.mod 
h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd/v22 v22.3.2 
h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
@@ -196,8 +196,8 @@
 github.com/google/uuid v1.6.0/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/enterprise-certificate-proxy v0.3.4 
h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
 github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod 
h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
-github.com/googleapis/gax-go/v2 v2.13.0 
h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
-github.com/googleapis/gax-go/v2 v2.13.0/go.mod 
h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
+github.com/googleapis/gax-go/v2 v2.14.0 
h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
+github.com/googleapis/gax-go/v2 v2.14.0/go.mod 
h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
 github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 
h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
 github.com/grpc-ecosystem/grpc-opentracing 
v0.0.0-20180507213350-8e809c8a8645/go.mod 
h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
 github.com/hashicorp/errwrap v1.0.0/go.mod 
h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -288,6 +288,8 @@
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 
h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod 
h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prashantv/gostub v1.1.0 
h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod 
h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
 github.com/prometheus/client_golang v1.20.5 
h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
 github.com/prometheus/client_golang v1.20.5/go.mod 
h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -336,12 +338,12 @@
 github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0=
-go.etcd.io/etcd/api/v3 v3.5.16/go.mod 
h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28=
-go.etcd.io/etcd/client/pkg/v3 v3.5.16 
h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q=
-go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod 
h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E=
-go.etcd.io/etcd/client/v3 v3.5.16 
h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE=
-go.etcd.io/etcd/client/v3 v3.5.16/go.mod 
h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50=
+go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w=
+go.etcd.io/etcd/api/v3 v3.5.17/go.mod 
h1:d1hvkRuXkts6PmaYk2Vrgqbv7H4ADfAKhyJqHNLJCB4=
+go.etcd.io/etcd/client/pkg/v3 v3.5.17 
h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOUKKVw=
+go.etcd.io/etcd/client/pkg/v3 v3.5.17/go.mod 
h1:4DqK1TKacp/86nJk4FLQqo6Mn2vvQFBmruW3pP14H/w=
+go.etcd.io/etcd/client/v3 v3.5.17 
h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY=
+go.etcd.io/etcd/client/v3 v3.5.17/go.mod 
h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo=
 go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
 go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 
h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
@@ -356,6 +358,8 @@
 go.uber.org/atomic v1.9.0/go.mod 
h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
 go.uber.org/atomic v1.11.0/go.mod 
h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
+go.uber.org/automaxprocs v1.6.0/go.mod 
h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod 
h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
@@ -371,8 +375,8 @@
 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod 
h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.6.0/go.mod 
h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
 golang.org/x/crypto v0.17.0/go.mod 
h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod 
h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
+golang.org/x/crypto v0.29.0/go.mod 
h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 
h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod 
h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
@@ -403,11 +407,11 @@
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
-golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
+golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
+golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
-golang.org/x/oauth2 v0.23.0/go.mod 
h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
+golang.org/x/oauth2 v0.24.0/go.mod 
h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -417,8 +421,8 @@
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
+golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -438,15 +442,15 @@
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
+golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.15.0/go.mod 
h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod 
h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
+golang.org/x/term v0.26.0/go.mod 
h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -454,10 +458,10 @@
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.14.0/go.mod 
h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod 
h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
-golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
-golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
+golang.org/x/text v0.20.0/go.mod 
h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
+golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
+golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod 
h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -478,24 +482,24 @@
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 
h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod 
h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
-google.golang.org/api v0.201.0 h1:+7AD9JNM3tREtawRMu8sOjSbb8VYcYXJG/2eEOmfDu0=
-google.golang.org/api v0.201.0/go.mod 
h1:HVY0FCHVs89xIW9fzf/pBvOEm+OolHa86G/txFezyq4=
+google.golang.org/api v0.206.0 h1:A27GClesCSheW5P2BymVHjpEeQ2XHH8DI8Srs2HI2L8=
+google.golang.org/api v0.206.0/go.mod 
h1:BtB8bfjTYIrai3d8UyvPmV9REGgox7coh+ZRwm0b+W8=
 google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod 
h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod 
h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod 
h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f 
h1:jTm13A2itBi3La6yTGqn8bVSrc3ZZ1r8ENHlIXBfnRA=
-google.golang.org/genproto/googleapis/api 
v0.0.0-20240930140551-af27646dc61f/go.mod 
h1:CLGoBuH1VHxAUXVPP8FfPwPEVJB6lz3URE5mY2SuayE=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 
h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc=
-google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241007155032-5fefd90f89a9/go.mod 
h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
+google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 
h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g=
+google.golang.org/genproto/googleapis/api 
v0.0.0-20241104194629-dd2ea8efbc28/go.mod 
h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 
h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE=
+google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241104194629-dd2ea8efbc28/go.mod 
h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
 google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.23.0/go.mod 
h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.25.1/go.mod 
h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.27.0/go.mod 
h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.33.2/go.mod 
h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
-google.golang.org/grpc v1.67.1/go.mod 
h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
+google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0=
+google.golang.org/grpc v1.68.0/go.mod 
h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod 
h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -505,8 +509,8 @@
 google.golang.org/protobuf v1.23.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.25.0/go.mod 
h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.35.1 
h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod 
h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.35.2 
h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod 
h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 gopkg.in/DataDog/dd-trace-go.v1 v1.69.1 
h1:grTElrPaCfxUsrJjyPLHlVPbmlKVzWMxVdcBrGZSzEk=
 gopkg.in/DataDog/dd-trace-go.v1 v1.69.1/go.mod 
h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/notes/coredns-1.12.0.md 
new/coredns-1.12.0/notes/coredns-1.12.0.md
--- old/coredns-1.11.4/notes/coredns-1.12.0.md  1970-01-01 01:00:00.000000000 
+0100
+++ new/coredns-1.12.0/notes/coredns-1.12.0.md  2024-11-21 20:27:33.000000000 
+0100
@@ -0,0 +1,17 @@
+
+This release adds some new features.  Of note:
+* New multisocket plugin - allows CoreDNS to listen on multiple sockets
+* New automaxprocs plugin - automatically sets GOMAXPROCS to the number of CPUs
+
+## Brought to You By
+
+Ben Kochie,
+Chris O'Haver,
+Emmanuel Ferdman,
+Viktor
+
+
+## Noteworthy Changes
+
+* plugin/multisocket (https://github.com/coredns/coredns/pull/6882)
+* plugin/automaxprocs (https://github.com/coredns/coredns/pull/6948)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/plugin/multisocket/README.md 
new/coredns-1.12.0/plugin/multisocket/README.md
--- old/coredns-1.11.4/plugin/multisocket/README.md     1970-01-01 
01:00:00.000000000 +0100
+++ new/coredns-1.12.0/plugin/multisocket/README.md     2024-11-21 
20:27:33.000000000 +0100
@@ -0,0 +1,68 @@
+# multisocket
+
+## Name
+
+*multisocket* - allows to start multiple servers that will listen on one port.
+
+## Description
+
+With *multisocket*, you can define the number of servers that will listen on 
the same port. The SO_REUSEPORT socket 
+option allows to open multiple listening sockets at the same address and port. 
In this case, kernel distributes incoming 
+connections between sockets.
+
+Enabling this option allows to start multiple servers, which increases the 
throughput of CoreDNS in environments with a 
+large number of CPU cores.
+
+## Syntax
+
+~~~
+multisocket [NUM_SOCKETS]
+~~~
+
+* **NUM_SOCKETS** - the number of servers that will listen on one port. 
Default value is equal to GOMAXPROCS.
+
+## Examples
+
+Start 5 TCP/UDP servers on the same port.
+
+~~~ corefile
+. {
+       multisocket 5
+       forward . /etc/resolv.conf
+}
+~~~
+
+Do not define `NUM_SOCKETS`, in this case it will take a value equal to 
GOMAXPROCS.
+
+~~~ corefile
+. {
+       multisocket
+       forward . /etc/resolv.conf
+}
+~~~
+
+## Recommendations
+
+The tests of the `multisocket` plugin, which were conducted for `NUM_SOCKETS` 
from 1 to 10, did not reveal any side 
+effects or performance degradation.
+
+This means that the `multisocket` plugin can be used with a default value that 
is equal to GOMAXPROCS.
+
+However, to achieve the best results, it is recommended to consider the 
specific environment and plugins used in 
+CoreDNS. To determine the optimal configuration, it is advisable to conduct 
performance tests with different 
+`NUM_SOCKETS`, measuring Queries Per Second (QPS) and system load.
+
+If conducting such tests is difficult, follow these recommendations:
+1. Determine the maximum CPU consumption of CoreDNS server without 
`multisocket` plugin. Estimate how much CPU CoreDNS
+   actually consumes in specific environment under maximum load.
+2. Align `NUM_SOCKETS` with the estimated CPU usage and CPU limits or system's 
available resources.
+   Examples:
+   - If CoreDNS consumes 4 CPUs and 8 CPUs are available, set `NUM_SOCKETS` to 
2.
+   - If CoreDNS consumes 8 CPUs and 64 CPUs are available, set `NUM_SOCKETS` 
to 8.
+
+## Limitations
+
+The SO_REUSEPORT socket option is not available for some operating systems. It 
is available since Linux Kernel 3.9 and 
+not available for Windows at all.
+
+Using this plugin with a system that does not support SO_REUSEPORT will cause 
an `address already in use` error.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/plugin/multisocket/multisocket.go 
new/coredns-1.12.0/plugin/multisocket/multisocket.go
--- old/coredns-1.11.4/plugin/multisocket/multisocket.go        1970-01-01 
01:00:00.000000000 +0100
+++ new/coredns-1.12.0/plugin/multisocket/multisocket.go        2024-11-21 
20:27:33.000000000 +0100
@@ -0,0 +1,51 @@
+package multisocket
+
+import (
+       "fmt"
+       "runtime"
+       "strconv"
+
+       "github.com/coredns/caddy"
+       "github.com/coredns/coredns/core/dnsserver"
+       "github.com/coredns/coredns/plugin"
+)
+
+const pluginName = "multisocket"
+
+func init() { plugin.Register(pluginName, setup) }
+
+func setup(c *caddy.Controller) error {
+       err := parseNumSockets(c)
+       if err != nil {
+               return plugin.Error(pluginName, err)
+       }
+       return nil
+}
+
+func parseNumSockets(c *caddy.Controller) error {
+       config := dnsserver.GetConfig(c)
+       c.Next() // "multisocket"
+
+       args := c.RemainingArgs()
+
+       if len(args) > 1 || c.Next() {
+               return c.ArgErr()
+       }
+
+       if len(args) == 0 {
+               // Nothing specified; use default that is equal to GOMAXPROCS.
+               config.NumSockets = runtime.GOMAXPROCS(0)
+               return nil
+       }
+
+       numSockets, err := strconv.Atoi(args[0])
+       if err != nil {
+               return fmt.Errorf("invalid num sockets: %w", err)
+       }
+       if numSockets < 1 {
+               return fmt.Errorf("num sockets can not be zero or negative: 
%d", numSockets)
+       }
+       config.NumSockets = numSockets
+
+       return nil
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/coredns-1.11.4/plugin/multisocket/multisocket_test.go 
new/coredns-1.12.0/plugin/multisocket/multisocket_test.go
--- old/coredns-1.11.4/plugin/multisocket/multisocket_test.go   1970-01-01 
01:00:00.000000000 +0100
+++ new/coredns-1.12.0/plugin/multisocket/multisocket_test.go   2024-11-21 
20:27:33.000000000 +0100
@@ -0,0 +1,55 @@
+package multisocket
+
+import (
+       "runtime"
+       "strings"
+       "testing"
+
+       "github.com/coredns/caddy"
+       "github.com/coredns/coredns/core/dnsserver"
+)
+
+func TestMultisocket(t *testing.T) {
+       tests := []struct {
+               input              string
+               shouldErr          bool
+               expectedNumSockets int
+               expectedErrContent string // substring from the expected error. 
Empty for positive cases.
+       }{
+               // positive
+               {`multisocket`, false, runtime.GOMAXPROCS(0), ""},
+               {`multisocket 2`, false, 2, ""},
+               {` multisocket 1`, false, 1, ""},
+               {`multisocket text`, true, 0, "invalid num sockets"},
+               {`multisocket 0`, true, 0, "num sockets can not be zero or 
negative"},
+               {`multisocket -1`, true, 0, "num sockets can not be zero or 
negative"},
+               {`multisocket 2 2`, true, 0, "Wrong argument count or 
unexpected line ending after '2'"},
+               {`multisocket 2 {
+                       block
+               }`, true, 0, "Unexpected token '{', expecting argument"},
+       }
+
+       for i, test := range tests {
+               c := caddy.NewTestController("dns", test.input)
+               err := setup(c)
+               cfg := dnsserver.GetConfig(c)
+
+               if test.shouldErr && err == nil {
+                       t.Errorf("Test %d: Expected error but found %s for 
input %s", i, err, test.input)
+               }
+
+               if err != nil {
+                       if !test.shouldErr {
+                               t.Errorf("Test %d: Expected no error but found 
one for input %s. Error was: %v", i, test.input, err)
+                       }
+
+                       if !strings.Contains(err.Error(), 
test.expectedErrContent) {
+                               t.Errorf("Test %d: Expected error to contain: 
%v, found error: %v, input: %s", i, test.expectedErrContent, err, test.input)
+                       }
+               }
+
+               if cfg.NumSockets != test.expectedNumSockets {
+                       t.Errorf("Test %d: Expected num sockets to be %d, found 
%d", i, test.expectedNumSockets, cfg.NumSockets)
+               }
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/plugin.cfg 
new/coredns-1.12.0/plugin.cfg
--- old/coredns-1.11.4/plugin.cfg       2024-11-13 02:31:15.000000000 +0100
+++ new/coredns-1.12.0/plugin.cfg       2024-11-21 20:27:33.000000000 +0100
@@ -25,6 +25,7 @@
 cancel:cancel
 tls:tls
 timeouts:timeouts
+multisocket:multisocket
 reload:reload
 nsid:nsid
 bufsize:bufsize
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coredns-1.11.4/test/multisocket_test.go 
new/coredns-1.12.0/test/multisocket_test.go
--- old/coredns-1.11.4/test/multisocket_test.go 1970-01-01 01:00:00.000000000 
+0100
+++ new/coredns-1.12.0/test/multisocket_test.go 2024-11-21 20:27:33.000000000 
+0100
@@ -0,0 +1,169 @@
+package test
+
+import (
+       "fmt"
+       "net"
+       "testing"
+
+       "github.com/miekg/dns"
+)
+
+// These tests need a fixed port, because :0 selects a random port for each 
socket, but we need all sockets to be on
+// the same port.
+
+func TestMultisocket(t *testing.T) {
+       tests := []struct {
+               name            string
+               corefile        string
+               expectedServers int
+               expectedErr     string
+               expectedPort    string
+       }{
+               {
+                       name: "no multisocket",
+                       corefile: `.:5054 {
+                       }`,
+                       expectedServers: 1,
+                       expectedPort:    "5054",
+               },
+               {
+                       name: "multisocket 1",
+                       corefile: `.:5055 {
+                               multisocket 1
+                       }`,
+                       expectedServers: 1,
+                       expectedPort:    "5055",
+               },
+               {
+                       name: "multisocket 2",
+                       corefile: `.:5056 {
+                               multisocket 2
+                       }`,
+                       expectedServers: 2,
+                       expectedPort:    "5056",
+               },
+               {
+                       name: "multisocket 100",
+                       corefile: `.:5057 {
+                               multisocket 100
+                       }`,
+                       expectedServers: 100,
+                       expectedPort:    "5057",
+               },
+       }
+
+       for _, test := range tests {
+               t.Run(test.name, func(t *testing.T) {
+                       s, err := CoreDNSServer(test.corefile)
+                       defer s.Stop()
+                       if err != nil {
+                               t.Fatalf("Could not get CoreDNS serving 
instance: %s", err)
+                       }
+                       // check number of servers
+                       if len(s.Servers()) != test.expectedServers {
+                               t.Fatalf("Expected %d servers, got %d", 
test.expectedServers, len(s.Servers()))
+                       }
+
+                       // check that ports are the same
+                       for _, listener := range s.Servers() {
+                               if listener.Addr().String() != 
listener.LocalAddr().String() {
+                                       t.Fatalf("Expected tcp address %s to be 
on the same port as udp address %s",
+                                               listener.LocalAddr().String(), 
listener.Addr().String())
+                               }
+                               _, port, err := 
net.SplitHostPort(listener.Addr().String())
+                               if err != nil {
+                                       t.Fatalf("Could not get port from 
listener addr: %s", err)
+                               }
+                               if port != test.expectedPort {
+                                       t.Fatalf("Expected port %s, got %s", 
test.expectedPort, port)
+                               }
+                       }
+               })
+       }
+}
+
+func TestMultisocket_Restart(t *testing.T) {
+       tests := []struct {
+               name             string
+               numSocketsBefore int
+               numSocketsAfter  int
+       }{
+               {
+                       name:             "increase",
+                       numSocketsBefore: 1,
+                       numSocketsAfter:  2,
+               },
+               {
+                       name:             "decrease",
+                       numSocketsBefore: 2,
+                       numSocketsAfter:  1,
+               },
+               {
+                       name:             "no changes",
+                       numSocketsBefore: 2,
+                       numSocketsAfter:  2,
+               },
+       }
+
+       for _, test := range tests {
+               t.Run(test.name, func(t *testing.T) {
+                       corefile := `.:5058 {
+                               multisocket %d
+                       }`
+                       srv, err := CoreDNSServer(fmt.Sprintf(corefile, 
test.numSocketsBefore))
+                       if err != nil {
+                               t.Fatalf("Could not get CoreDNS serving 
instance: %s", err)
+                       }
+                       if test.numSocketsBefore != len(srv.Servers()) {
+                               t.Fatalf("Expected %d servers, got %d", 
test.numSocketsBefore, len(srv.Servers()))
+                       }
+
+                       newSrv, err := 
srv.Restart(NewInput(fmt.Sprintf(corefile, test.numSocketsAfter)))
+                       if err != nil {
+                               t.Fatalf("Could not get CoreDNS serving 
instance: %s", err)
+                       }
+                       if test.numSocketsAfter != len(newSrv.Servers()) {
+                               t.Fatalf("Expected %d servers, got %d", 
test.numSocketsAfter, len(newSrv.Servers()))
+                       }
+                       newSrv.Stop()
+               })
+       }
+}
+
+// Just check that server with multisocket works
+func TestMultisocket_WhoAmI(t *testing.T) {
+       corefile := `.:5059 {
+               multisocket
+               whoami
+       }`
+       s, udp, tcp, err := CoreDNSServerAndPorts(corefile)
+       if err != nil {
+               t.Fatalf("Could not get CoreDNS serving instance: %s", err)
+       }
+       defer s.Stop()
+
+       m := new(dns.Msg)
+       m.SetQuestion("whoami.example.org.", dns.TypeA)
+
+       // check udp
+       cl := dns.Client{Net: "udp"}
+       udpResp, err := dns.Exchange(m, udp)
+       if err != nil {
+               t.Fatalf("Expected to receive reply, but didn't: %v", err)
+       }
+       // check tcp
+       cl.Net = "tcp"
+       tcpResp, _, err := cl.Exchange(m, tcp)
+       if err != nil {
+               t.Fatalf("Expected to receive reply, but didn't: %v", err)
+       }
+
+       for _, resp := range []*dns.Msg{udpResp, tcpResp} {
+               if resp.Rcode != dns.RcodeSuccess {
+                       t.Fatalf("Expected RcodeSuccess, got %v", resp.Rcode)
+               }
+               if len(resp.Extra) != 2 {
+                       t.Errorf("Expected 2 RRs in additional section, got 
%d", len(resp.Extra))
+               }
+       }
+}

++++++ coredns.obsinfo ++++++
--- /var/tmp/diff_new_pack.8NiyBQ/_old  2024-11-28 22:43:19.419394839 +0100
+++ /var/tmp/diff_new_pack.8NiyBQ/_new  2024-11-28 22:43:19.423395005 +0100
@@ -1,5 +1,5 @@
 name: coredns
-version: 1.11.4
-mtime: 1731461475
-commit: 6e11ebddfc13bfca683fcbcae72cc4af6de47dd2
+version: 1.12.0
+mtime: 1732217253
+commit: 51e11f166ef6c247a78e9e15468647c593b79b9f
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/coredns/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.coredns.new.28523/vendor.tar.gz differ: char 5, 
line 1

Reply via email to