aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/setup/file.go39
-rw-r--r--core/setup/secondary.go8
-rw-r--r--middleware/file/README.md11
-rw-r--r--server/server.go6
4 files changed, 41 insertions, 23 deletions
diff --git a/core/setup/file.go b/core/setup/file.go
index edcddd30c..f957c230f 100644
--- a/core/setup/file.go
+++ b/core/setup/file.go
@@ -1,6 +1,8 @@
package setup
import (
+ "fmt"
+ "net"
"os"
"github.com/miekg/coredns/middleware"
@@ -68,8 +70,8 @@ func fileParse(c *Controller) (file.Zones, error) {
}
// discard from, here, maybe check and show log when we do?
for _, origin := range origins {
- if t != "" {
- z[origin].TransferTo = append(z[origin].TransferTo, t)
+ if t != nil {
+ z[origin].TransferTo = append(z[origin].TransferTo, t...)
}
}
}
@@ -78,30 +80,41 @@ func fileParse(c *Controller) (file.Zones, error) {
return file.Zones{Z: z, Names: names}, nil
}
-// transfer to [address]
-func parseTransfer(c *Controller) (to, from string, err error) {
+// transfer to [address...]
+func parseTransfer(c *Controller) (tos, froms []string, err error) {
what := c.Val()
if !c.NextArg() {
- return "", "", c.ArgErr()
+ return nil, nil, c.ArgErr()
}
value := c.Val()
switch what {
case "transfer":
if !c.NextArg() {
- return "", "", c.ArgErr()
+ return nil, nil, c.ArgErr()
}
if value == "to" {
- to = c.Val()
- if to != "*" {
- to = middleware.Addr(to).Normalize()
+ tos := c.RemainingArgs()
+ for i, _ := range tos {
+ if x := net.ParseIP(tos[i]); x == nil {
+ return nil, nil, fmt.Errorf("must specify an IP addres: `%s'", tos[i])
+ }
+ if tos[i] != "*" {
+ tos[i] = middleware.Addr(tos[i]).Normalize()
+ }
}
}
if value == "from" {
- from = c.Val()
- if from == "*" {
- // print some kind of error? TODO(miek)
+ froms := c.RemainingArgs()
+ for i, _ := range froms {
+ if x := net.ParseIP(froms[i]); x == nil {
+ return nil, nil, fmt.Errorf("must specify an IP addres: `%s'", froms[i])
+ }
+ if froms[i] != "*" {
+ froms[i] = middleware.Addr(froms[i]).Normalize()
+ } else {
+ return nil, nil, fmt.Errorf("can't use '*' in transfer from")
+ }
}
- from = middleware.Addr(from).Normalize()
}
}
return
diff --git a/core/setup/secondary.go b/core/setup/secondary.go
index e8326fa25..5f1ad3a17 100644
--- a/core/setup/secondary.go
+++ b/core/setup/secondary.go
@@ -57,11 +57,11 @@ func secondaryParse(c *Controller) (file.Zones, error) {
return file.Zones{}, e
}
for _, origin := range origins {
- if t != "" {
- z[origin].TransferTo = append(z[origin].TransferTo, t)
+ if t != nil {
+ z[origin].TransferTo = append(z[origin].TransferTo, t...)
}
- if f != "" {
- z[origin].TransferFrom = append(z[origin].TransferFrom, f)
+ if f != nil {
+ z[origin].TransferFrom = append(z[origin].TransferFrom, f...)
}
}
}
diff --git a/middleware/file/README.md b/middleware/file/README.md
index 36b76a1aa..f0bf58101 100644
--- a/middleware/file/README.md
+++ b/middleware/file/README.md
@@ -18,18 +18,19 @@ file dbfile [zones...]
If you want to round robin A and AAAA responses look at the `loadbalance` middleware.
TSIG key configuration is TODO; directive format for transfer will probably be extended with
-TSIG key information, something like `transfer out [address] key [name] [base64]`
+TSIG key information, something like `transfer out [address...] key [name] [base64]`
~~~
file dbfile [zones... ] {
- transfer out [address...]
- transfer to [address]
+ transfer from [address...]
+ transfer to [address...]
+
}
~~~
* `transfer` enables zone transfers. It may be specified multiples times. *To* or *from* signals
- the direction. Address must be denoted in CIDR notation (127.0.0.1/32 etc.). The special
- wildcard "*" means: the entire internet.
+ the direction. Addresses must be denoted in CIDR notation (127.0.0.1/32 etc.) or just as plain
+ address. The special wildcard "*" means: the entire internet (only valid for 'transfer to').
## Examples
diff --git a/server/server.go b/server/server.go
index c562cb01e..765d42cce 100644
--- a/server/server.go
+++ b/server/server.go
@@ -163,17 +163,20 @@ func (s *Server) Serve(ln ListenerFile) error {
// ListenAndServe starts the server with a new listener. It blocks until the server stops.
func (s *Server) ListenAndServe() error {
err := s.setup()
- defer close(s.startChan)
+ // defer close(s.startChan) // Don't understand why defer wouldn't actually work in this method.
if err != nil {
+ close(s.startChan)
return err
}
l, err := net.Listen("tcp", s.Addr)
if err != nil {
+ close(s.startChan)
return err
}
pc, err := net.ListenPacket("udp", s.Addr)
if err != nil {
+ close(s.startChan)
return err
}
@@ -187,6 +190,7 @@ func (s *Server) ListenAndServe() error {
go func() {
s.server[0].ActivateAndServe()
}()
+ close(s.startChan)
return s.server[1].ActivateAndServe()
}