github.com/chenbh/concourse/v6@v6.4.2/worker/workercmd/dns.go (about)

     1  package workercmd
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/miekg/dns"
     7  )
     8  
     9  type DNSConfig struct {
    10  	Enable bool `long:"enable" description:"Enable proxy DNS server."`
    11  }
    12  
    13  func (config DNSConfig) Server() (*dns.Server, error) {
    14  	resolvConf, err := dns.ClientConfigFromFile("/etc/resolv.conf")
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  
    19  	var client dns.Client
    20  	mux := dns.NewServeMux()
    21  	mux.HandleFunc(".", func(w dns.ResponseWriter, r *dns.Msg) {
    22  		for _, server := range resolvConf.Servers {
    23  			response, _, err := client.Exchange(r, fmt.Sprintf("%s:%s", server, resolvConf.Port))
    24  			if err == nil {
    25  				response.Compress = true
    26  				_ = w.WriteMsg(response)
    27  				break
    28  			}
    29  		}
    30  
    31  		if err != nil {
    32  			var m *dns.Msg
    33  			m.SetRcode(r, dns.RcodeRefused)
    34  			_ = w.WriteMsg(m)
    35  		}
    36  	})
    37  
    38  	return &dns.Server{
    39  		Addr:    ":53",
    40  		Net:     "udp",
    41  		Handler: mux,
    42  	}, nil
    43  }