Bail out on failure when starting up

Don't silently hide failures, barf on startup. Also add more integration
tests that should catch some of these things.
This commit is contained in:
Miek Gieben 2016-04-27 10:48:22 +00:00
parent efd5135ee3
commit 7a8d943bcc
4 changed files with 91 additions and 9 deletions

View file

@ -1,7 +1,7 @@
package setup package setup
import ( import (
"path" "strings"
"github.com/miekg/coredns/middleware" "github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/dnssec" "github.com/miekg/coredns/middleware/dnssec"
@ -35,8 +35,7 @@ func dnssecParse(c *Controller) ([]string, []*dnssec.DNSKEY, error) {
for c.NextBlock() { for c.NextBlock() {
k, e := keyParse(c) k, e := keyParse(c)
if e != nil { if e != nil {
// TODO(miek): Log and drop or something? stop startup? return nil, nil, e
continue
} }
keys = append(keys, k...) keys = append(keys, k...)
} }
@ -61,11 +60,13 @@ func keyParse(c *Controller) ([]*dnssec.DNSKEY, error) {
if value == "file" { if value == "file" {
ks := c.RemainingArgs() ks := c.RemainingArgs()
for _, k := range ks { for _, k := range ks {
// Kmiek.nl.+013+26205.key, handle .private or without extension: Kmiek.nl.+013+26205
ext := path.Ext(k) // TODO(miek): test things like .key
base := k base := k
if len(ext) > 0 { // Kmiek.nl.+013+26205.key, handle .private or without extension: Kmiek.nl.+013+26205
base = k[:len(k)-len(ext)] if strings.HasSuffix(k, ".key") {
base = k[:len(k)-4]
}
if strings.HasSuffix(k, ".private") {
base = k[:len(k)-8]
} }
k, err := dnssec.ParseKeyFile(base+".key", base+".private") k, err := dnssec.ParseKeyFile(base+".key", base+".private")
if err != nil { if err != nil {

View file

@ -54,7 +54,8 @@ func fileParse(c *Controller) (file.Zones, error) {
reader, err := os.Open(fileName) reader, err := os.Open(fileName)
if err != nil { if err != nil {
continue // bail out
return file.Zones{}, err
} }
for i, _ := range origins { for i, _ := range origins {
@ -62,6 +63,8 @@ func fileParse(c *Controller) (file.Zones, error) {
zone, err := file.Parse(reader, origins[i], fileName) zone, err := file.Parse(reader, origins[i], fileName)
if err == nil { if err == nil {
z[origins[i]] = zone z[origins[i]] = zone
} else {
return file.Zones{}, err
} }
names = append(names, origins[i]) names = append(names, origins[i])
} }

View file

@ -74,7 +74,7 @@ func (d Dnssec) Sign(state middleware.State, zone string, now time.Time) *dns.Ms
for _, r := range rrSets(req.Extra) { for _, r := range rrSets(req.Extra) {
ttl := r[0].Header().Ttl ttl := r[0].Header().Ttl
if sigs, err := d.sign(r, zone, ttl, incep, expir); err == nil { if sigs, err := d.sign(r, zone, ttl, incep, expir); err == nil {
req.Extra = append(req.Extra, sigs...) req.Extra = append(sigs, req.Extra...) // prepend to leave OPT alone
} }
} }
return req return req

View file

@ -0,0 +1,78 @@
package test
import (
"io/ioutil"
"log"
"os"
"testing"
"github.com/miekg/coredns/middleware/test"
"github.com/miekg/dns"
)
func TestLookupBalanceRewriteCacheDnssec(t *testing.T) {
name, rm, err := test.TempFile(t, ".", exampleOrg)
if err != nil {
t.Fatalf("failed to created zone: %s", err)
}
defer rm()
rm1 := createKeyFile(t)
defer rm1()
corefile := `example.org:0 {
file ` + name + `
rewrite ANY HINFO
dnssec {
key file ` + base + `
}
loadbalance
}
`
ex, _, udp, err := Server(t, corefile)
if err != nil {
t.Errorf("Could get server to start: %s", err)
return
}
defer ex.Stop()
log.SetOutput(ioutil.Discard)
c := new(dns.Client)
m := new(dns.Msg)
m.SetQuestion("example.org.", dns.TypeA)
m.SetEdns0(4096, true)
res, _, err := c.Exchange(m, udp)
if err != nil {
t.Fatalf("Could not send query: %s", err)
}
sig := 0
for _, a := range res.Answer {
if a.Header().Rrtype == dns.TypeRRSIG {
sig++
}
}
if sig == 0 {
t.Errorf("expected RRSIGs, got none")
t.Logf("%v\n", res)
}
}
func createKeyFile(t *testing.T) func() {
ioutil.WriteFile(base+".key",
[]byte(`example.org. IN DNSKEY 256 3 13 tDyI0uEIDO4SjhTJh1AVTFBLpKhY3He5BdAlKztewiZ7GecWj94DOodg ovpN73+oJs+UfZ+p9zOSN5usGAlHrw==`),
0644)
ioutil.WriteFile(base+".private",
[]byte(`Private-key-format: v1.3
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: HPmldSNfrkj/aDdUMFwuk/lgzaC5KIsVEG3uoYvF4pQ=
Created: 20160426083115
Publish: 20160426083115
Activate: 20160426083115`),
0644)
return func() {
os.Remove(base + ".key")
os.Remove(base + ".private")
}
}
const base = "Kexample.org.+013+44563"