make it a real simple nameserver
This commit is contained in:
parent
7c85603f8f
commit
97c847ab1c
|
@ -3,11 +3,15 @@ package main
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"dns"
|
"dns"
|
||||||
|
"net"
|
||||||
"fmt"
|
"fmt"
|
||||||
"flag"
|
"flag"
|
||||||
"json"
|
"os/signal"
|
||||||
|
// "json"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var counter int
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// var zone *string = flag.String("zone", "", "The zone to serve")
|
// var zone *string = flag.String("zone", "", "The zone to serve")
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
|
@ -32,11 +36,95 @@ func main() {
|
||||||
t.Txt = "Een antwoord"
|
t.Txt = "Een antwoord"
|
||||||
m.Answer[0] = t
|
m.Answer[0] = t
|
||||||
|
|
||||||
json, err := json.Marshal(m)
|
errchan := make(chan os.Error)
|
||||||
if err != nil {
|
go udp("127.0.0.1:8054", errchan)
|
||||||
fmt.Printf("Err: %s", err.String())
|
go tcp("127.0.0.1:8054", errchan)
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
fmt.Printf("%v", string(json))
|
|
||||||
|
|
||||||
|
forever:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case e := <-errchan:
|
||||||
|
fmt.Printf("Error received, stopping: %s\n", e.String())
|
||||||
|
break forever
|
||||||
|
case <-signal.Incoming:
|
||||||
|
fmt.Printf("Signal received, stopping\n")
|
||||||
|
break forever
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(errchan)
|
||||||
|
fmt.Printf("Queries answered: %d\n", counter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tcp(addr string, e chan os.Error) {
|
||||||
|
a, err := net.ResolveTCPAddr(addr)
|
||||||
|
if err != nil {
|
||||||
|
e <- err
|
||||||
|
}
|
||||||
|
l, err := net.ListenTCP("tcp", a)
|
||||||
|
if err != nil {
|
||||||
|
e <- err
|
||||||
|
}
|
||||||
|
err = dns.ServeTCP(l, replyTCP)
|
||||||
|
e <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func udp(addr string, e chan os.Error) {
|
||||||
|
a, err := net.ResolveUDPAddr(addr)
|
||||||
|
if err != nil {
|
||||||
|
e <- err
|
||||||
|
}
|
||||||
|
l, err := net.ListenUDP("udp", a)
|
||||||
|
if err != nil {
|
||||||
|
e <- err
|
||||||
|
}
|
||||||
|
err = dns.ServeUDP(l, replyUDP)
|
||||||
|
e <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func createpkg(id uint16, tcp bool, remove net.Addr) []byte {
|
||||||
|
m := new(dns.Msg)
|
||||||
|
m.MsgHdr.Id = id
|
||||||
|
m.MsgHdr.Authoritative = true
|
||||||
|
m.MsgHdr.AuthenticatedData = false
|
||||||
|
m.MsgHdr.RecursionAvailable = true
|
||||||
|
m.MsgHdr.Response = true
|
||||||
|
m.MsgHdr.Opcode = dns.OpcodeQuery
|
||||||
|
m.MsgHdr.Rcode = dns.RcodeSuccess
|
||||||
|
m.Question = make([]dns.Question, 1)
|
||||||
|
m.Question[0] = dns.Question{"miek.nl.", dns.TypeTXT, dns.ClassINET}
|
||||||
|
m.Answer = make([]dns.RR, 1)
|
||||||
|
t := new(dns.RR_TXT)
|
||||||
|
t.Hdr = dns.RR_Header{Name: "miek.nl.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600}
|
||||||
|
if tcp {
|
||||||
|
t.Txt = "Dit is iets anders TCP"
|
||||||
|
} else {
|
||||||
|
t.Txt = "Dit is iets anders UDP"
|
||||||
|
}
|
||||||
|
m.Answer[0] = t
|
||||||
|
out, _ := m.Pack()
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func replyUDP(c *net.UDPConn, a net.Addr, in *dns.Msg) {
|
||||||
|
if in.MsgHdr.Response == true {
|
||||||
|
// Uh... answering to an response??
|
||||||
|
// dont think so
|
||||||
|
return
|
||||||
|
}
|
||||||
|
out := createpkg(in.MsgHdr.Id, false, a)
|
||||||
|
dns.SendUDP(out, c, a)
|
||||||
|
counter++
|
||||||
|
}
|
||||||
|
|
||||||
|
func replyTCP(c *net.TCPConn, a net.Addr, in *dns.Msg) {
|
||||||
|
if in.MsgHdr.Response == true {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
out := createpkg(in.MsgHdr.Id, true, a)
|
||||||
|
dns.SendTCP(out, c, a)
|
||||||
|
counter++
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue