aboutsummaryrefslogtreecommitdiff
path: root/middleware/file/secondary.go
blob: 95c063a9b1ba00bf1b1ce80fd64377046750572d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package file

import (
	"log"

	"github.com/miekg/dns"
)

// TransferIn retrieves the zone from the masters, parses it and sets it live.
func (z *Zone) TransferIn() error {
	if len(z.TransferFrom) == 0 {
		return nil
	}
	t := new(dns.Transfer)
	m := new(dns.Msg)
	m.SetAxfr(z.name)
	/*
	   t.TsigSecret = map[string]string{"axfr.": "so6ZGir4GPAqINNh9U5c3A=="}
	   m.SetTsig("axfr.", dns.HmacMD5, 300, time.Now().Unix())
	*/

	var Err error
Transfer:
	for _, tr := range z.TransferFrom {
		c, err := t.In(m, tr)
		if err != nil {
			log.Printf("[ERROR] failed to setup transfer %s with %s: %v", z.name, z.TransferFrom[0], err)
			Err = err
			continue Transfer
		}
		for env := range c {
			if env.Error != nil {
				log.Printf("[ERROR] failed to parse transfer %s: %v", z.name, env.Error)
				Err = env.Error
				continue Transfer
			}
			for _, rr := range env.RR {
				if rr.Header().Rrtype == dns.TypeSOA {
					z.SOA = rr.(*dns.SOA)
					continue
				}
				if rr.Header().Rrtype == dns.TypeRRSIG {
					if x, ok := rr.(*dns.RRSIG); ok && x.TypeCovered == dns.TypeSOA {
						z.SIG = append(z.SIG, x)
					}
				}
				z.Insert(rr)
			}
		}
	}
	return Err
}

/*

				28800      ; refresh (8 hours)
				7200       ; retry (2 hours)
				604800     ; expire (1 week)
				3600       ; minimum (1 hour)
// Check SOA
// Just check every refresh hours, if fail set to retry until succeeds
// expire is need: to give SERVFAIL.
*/