Add dynamic zone reading

This commit is contained in:
Miek Gieben 2012-08-06 22:33:39 +02:00
parent 26bbfdfde1
commit eaec51df72
5 changed files with 22 additions and 13 deletions

View File

@ -7,3 +7,6 @@
* dynamic updates
* zone transfers
* incremental zone transfers
* configuration
* journal
* ...

View File

@ -22,9 +22,12 @@ func config(w dns.ResponseWriter, req *dns.Msg, c *Config) {
// tsig signed, key = user
// config stuff in Auth section (just as dynamic updates (*hint* *hint*)
// SUBSYSTEM. IN TXT "OPERATION<SPACE>OPTIONS..."
// ZONE. IN TXT "READ origin. /z/bloep" - absolute path in fs
// ZONE. IN TXT "READ origin /z/bloep" - absolute path in fs
// TODO: check tsig
if *l {
log.Printf("fksd: config commmand")
}
for _, rr := range req.Ns {
t, ok := rr.(*dns.RR_TXT)
@ -51,12 +54,14 @@ func configZONE(t *dns.RR_TXT, c *Config) error {
switch strings.ToUpper(sx[0]) {
case "READ":
if *l {
log.Printf("fksd: config: READ %s %s\n", sx[1], sx[2])
log.Printf("fksd: config: READ %s %s\n", dns.Fqdn(sx[1]), sx[2])
}
if e := c.ReadZone(sx[1], sx[2]); e != nil {
if e := c.ReadZone(dns.Fqdn(sx[1]), sx[2]); e != nil {
if *l {
log.Printf("fksd: failed to read %s: %s\n", sx[2], e.Error())
}
return e
}
dns.HandleFunc(sx[1], func(w dns.ResponseWriter, req *dns.Msg) { serve(w, req, c.Zones[sx[1]]) })
return nil
}
return nil

View File

@ -15,19 +15,19 @@ func main() {
flag.Parse()
conf := NewConfig()
go func() {
err := dns.ListenAndServe(":8053", "udp", nil)
err := dns.ListenAndServe(":1053", "udp", nil)
if err != nil {
log.Fatal("fksd: could not start config listener")
log.Fatal("fksd: could not start server listener: %s", err.Error())
}
}()
go func() {
err := dns.ListenAndServe(":5353", "udp", nil)
err := dns.ListenAndServe(":8053", "tcp", nil)
if err != nil {
log.Fatal("fksd: could not start server listener")
log.Fatal("fksd: could not start config listener: %s", err.Error())
}
}()
// Yes, we HIJACK zone. ... not sure on how to make this "private"
dns.HandleFunc("zone.", func(w dns.ResponseWriter, req *dns.Msg) { config(w, req, conf) })
dns.HandleFunc("ZONE.", func(w dns.ResponseWriter, req *dns.Msg) { config(w, req, conf) })
sig := make(chan os.Signal)
forever:

View File

@ -19,10 +19,10 @@ func ednsFromRequest(req, m *dns.Msg) {
func serve(w dns.ResponseWriter, req *dns.Msg, z *dns.Zone) {
if z == nil {
panic("fks: no zone")
panic("fksd: no zone")
}
if *l {
log.Printf("fks: [zone %s] incoming %s %s %d from %s\n", z.Origin, req.Question[0].Name, dns.Rr_str[req.Question[0].Qtype], req.MsgHdr.Id, w.RemoteAddr())
log.Printf("fksd: [zone %s] incoming %s %s %d from %s\n", z.Origin, req.Question[0].Name, dns.Rr_str[req.Question[0].Qtype], req.MsgHdr.Id, w.RemoteAddr())
}
// Ds Handling
// Referral

View File

@ -11,7 +11,7 @@ import (
func (c *Config) ReadZone(origin, file string) error {
z := dns.NewZone(origin)
if z == nil {
return errors.New("fks: failed to open zone file")
return errors.New("fksd: failed to open zone file")
}
f, e := os.Open(file)
if e != nil {
@ -21,9 +21,10 @@ func (c *Config) ReadZone(origin, file string) error {
if rr.Error == nil {
z.Insert(rr.RR)
} else {
log.Printf("fks: failed to parse: %s\n", rr.Error.Error())
log.Printf("fksd: failed to parse: %s\n", rr.Error.Error())
}
}
c.Zones[origin] = z
dns.HandleFunc(origin, func(w dns.ResponseWriter, req *dns.Msg) { serve(w, req, c.Zones[origin]) })
return nil
}