87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
// Copyright 2015 ISRG. All rights reserved
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/letsencrypt/boulder/Godeps/_workspace/src/github.com/miekg/dns"
|
|
)
|
|
|
|
func dnsHandler(w dns.ResponseWriter, r *dns.Msg) {
|
|
defer w.Close()
|
|
m := new(dns.Msg)
|
|
m.SetReply(r)
|
|
m.Compress = false
|
|
|
|
// Normally this test DNS server will return 127.0.0.1 for everything.
|
|
// However, in some situations (for instance Docker), it's useful to return a
|
|
// different hardcoded host. You can do so by setting the FAKE_DNS environment
|
|
// variable.
|
|
fakeDNS := os.Getenv("FAKE_DNS")
|
|
if fakeDNS == "" {
|
|
fakeDNS = "127.0.0.1"
|
|
}
|
|
for _, q := range r.Question {
|
|
fmt.Printf("dns-srv: Query -- [%s] %s\n", q.Name, dns.TypeToString[q.Qtype])
|
|
switch q.Qtype {
|
|
case dns.TypeA:
|
|
record := new(dns.A)
|
|
record.Hdr = dns.RR_Header{
|
|
Name: q.Name,
|
|
Rrtype: dns.TypeA,
|
|
Class: dns.ClassINET,
|
|
Ttl: 0,
|
|
}
|
|
record.A = net.ParseIP(fakeDNS)
|
|
|
|
m.Answer = append(m.Answer, record)
|
|
case dns.TypeMX:
|
|
record := new(dns.MX)
|
|
record.Hdr = dns.RR_Header{
|
|
Name: q.Name,
|
|
Rrtype: dns.TypeMX,
|
|
Class: dns.ClassINET,
|
|
Ttl: 0,
|
|
}
|
|
record.Mx = "mail." + q.Name
|
|
record.Preference = 10
|
|
|
|
m.Answer = append(m.Answer, record)
|
|
}
|
|
}
|
|
|
|
w.WriteMsg(m)
|
|
return
|
|
}
|
|
|
|
func serveTestResolver() {
|
|
dns.HandleFunc(".", dnsHandler)
|
|
server := &dns.Server{
|
|
Addr: "127.0.0.1:8053",
|
|
Net: "udp",
|
|
ReadTimeout: time.Millisecond,
|
|
WriteTimeout: time.Millisecond,
|
|
}
|
|
go func() {
|
|
err := server.ListenAndServe()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
}()
|
|
}
|
|
|
|
func main() {
|
|
fmt.Println("dns-srv: Starting test DNS server")
|
|
serveTestResolver()
|
|
forever := make(chan bool, 1)
|
|
<-forever
|
|
}
|