Cleanups and allow for multple resovers -- needs testing

This commit is contained in:
Miek Gieben 2011-01-24 11:01:42 +01:00
parent 8a5a288006
commit 986a0d7b78
5 changed files with 48 additions and 29 deletions

View File

@ -29,8 +29,8 @@ func match(m *dns.Msg, d int) (*dns.Msg, bool) {
func send(m *dns.Msg, ok bool) *dns.Msg {
switch ok {
case true, false:
qr <- resolver.Msg{m, nil, nil}
in := <-qr
qr[0] <- resolver.Msg{m, nil, nil}
in := <-qr[0]
return in.Dns
}
return nil

View File

@ -58,13 +58,13 @@ func delay(m *dns.Msg, ok bool) *dns.Msg {
return nil
} else {
fmt.Fprintf(os.Stderr, "Info: Ok: let it through\n")
qr <- resolver.Msg{m, nil, nil}
in := <-qr
qr[0] <- resolver.Msg{m, nil, nil}
in := <-qr[0]
return in.Dns
}
case false:
qr <- resolver.Msg{m, nil, nil}
in := <-qr
qr[0] <- resolver.Msg{m, nil, nil}
in := <-qr[0]
return in.Dns
}
return nil

View File

@ -29,8 +29,8 @@ func match(m *dns.Msg, d int) (*dns.Msg, bool) {
func send(m *dns.Msg, ok bool) *dns.Msg {
switch ok {
case true, false:
qr <- resolver.Msg{m, nil, nil}
in := <-qr
qr[0] <- resolver.Msg{m, nil, nil}
in := <-qr[0]
return in.Dns
}
return nil

View File

@ -62,8 +62,8 @@ func match(m *dns.Msg, d int) (*dns.Msg, bool) {
func send(m *dns.Msg, ok bool) *dns.Msg {
switch ok {
case true, false:
qr <- resolver.Msg{m, nil, nil}
in := <-qr
qr[0] <- resolver.Msg{m, nil, nil}
in := <-qr[0]
return in.Dns
}
return nil

View File

@ -1,5 +1,5 @@
/*
* Funkensturm
* Funkensturm, a versatile DNS proxy
* Miek Gieben <miek@miek.nl> (c) 2011
* GPLv2
*/
@ -15,17 +15,21 @@ import (
"dns/resolver"
"dns/responder"
"os/signal"
"strings"
)
// Setup a responder takes takes care of the incoming queries.
type server responder.Server
// Setup a initial resolver for sending the queries somewhere else.
var qr chan resolver.Msg
var qr []chan resolver.Msg
// The configuration of Funkensturm
var f *Funkensturm
// Verbose flag
var verbose *bool
// Where does the packet come from?
// IN: initial packet received by the Responder
// any modifications here will reflect what kind of
@ -175,37 +179,49 @@ func (s *server) ResponderTCP(c *net.TCPConn, i []byte) {
// nothing is send back
}
var verbose *bool
// split 127.0.0.1:53 into components
// TODO IPv6
func splitAddrPort(s string) (a, p string) {
items := strings.Split(s, ":", 2)
a = items[0]
p = items[1]
return
}
func main() {
var sserver *string = flag.String("sserver", "127.0.0.1", "Set the listener address")
var sport *string = flag.String("sport", "8053", "Set the listener port")
var rserver *string = flag.String("rserver", "127.0.0.1", "Remote server address")
// multiple rservers??
var rport *string = flag.String("rpost", "53", "Remote server port to forward queries to")
verbose = flag.Bool("verbose", false, "Print packet as the flow through") // needs to be global
var sserver *string = flag.String("sserver", "127.0.0.1:8053", "Set the listener address")
var rserver *string = flag.String("rserver", "127.0.0.1:53", "Remote server address(es)")
verbose = flag.Bool("verbose", false, "Print packet as they flow through") // verbose needs to be global
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s\n", os.Args[0])
flag.PrintDefaults()
}
flag.Parse()
resolvers := strings.Split(*rserver, ",", -1)
qr = make([]chan resolver.Msg, len(resolvers))
for i, ra := range resolvers {
addr, port := splitAddrPort(ra)
// TODO error checking
// The resolver(s)
r := new(resolver.Resolver)
r.Servers = []string{addr}
r.Port = port
qr[i] = r.NewQuerier() // connect to global qr
}
f = funkensturm()
ok := f.Setup()
if !ok {
fmt.Fprintf(os.Stderr, "Setup failed")
return
}
// The resolver
r := new(resolver.Resolver)
r.Servers = []string{*rserver}
r.Port = *rport
qr = r.NewQuerier() // connect to global qr
// The responder
addr, port := splitAddrPort(*sserver)
s := new(responder.Server)
s.Address = *sserver
s.Port = *sport
s.Address = addr
s.Port = port
var srv *server
rs := make(chan bool)
go s.NewResponder(srv, rs)
@ -219,8 +235,11 @@ forever:
break forever
}
}
rs <- true // shutdown responder and resolver
qr <- resolver.Msg{}
rs <- true // shutdown responder
<-rs // wait for confirmation
<-qr
// And the resolvers
for _, q := range qr {
q <- resolver.Msg{}
<-q
}
}