aboutsummaryrefslogtreecommitdiff
path: root/plugin/forward/health.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/forward/health.go')
-rw-r--r--plugin/forward/health.go106
1 files changed, 0 insertions, 106 deletions
diff --git a/plugin/forward/health.go b/plugin/forward/health.go
deleted file mode 100644
index ec0b48143..000000000
--- a/plugin/forward/health.go
+++ /dev/null
@@ -1,106 +0,0 @@
-package forward
-
-import (
- "crypto/tls"
- "sync/atomic"
- "time"
-
- "github.com/coredns/coredns/plugin/pkg/transport"
-
- "github.com/miekg/dns"
-)
-
-// HealthChecker checks the upstream health.
-type HealthChecker interface {
- Check(*Proxy) error
- SetTLSConfig(*tls.Config)
- SetRecursionDesired(bool)
- GetRecursionDesired() bool
- SetDomain(domain string)
- GetDomain() string
- SetTCPTransport()
-}
-
-// dnsHc is a health checker for a DNS endpoint (DNS, and DoT).
-type dnsHc struct {
- c *dns.Client
- recursionDesired bool
- domain string
-}
-
-var (
- hcReadTimeout = 1 * time.Second
- hcWriteTimeout = 1 * time.Second
-)
-
-// NewHealthChecker returns a new HealthChecker based on transport.
-func NewHealthChecker(trans string, recursionDesired bool, domain string) HealthChecker {
- switch trans {
- case transport.DNS, transport.TLS:
- c := new(dns.Client)
- c.Net = "udp"
- c.ReadTimeout = hcReadTimeout
- c.WriteTimeout = hcWriteTimeout
-
- return &dnsHc{c: c, recursionDesired: recursionDesired, domain: domain}
- }
-
- log.Warningf("No healthchecker for transport %q", trans)
- return nil
-}
-
-func (h *dnsHc) SetTLSConfig(cfg *tls.Config) {
- h.c.Net = "tcp-tls"
- h.c.TLSConfig = cfg
-}
-
-func (h *dnsHc) SetRecursionDesired(recursionDesired bool) {
- h.recursionDesired = recursionDesired
-}
-func (h *dnsHc) GetRecursionDesired() bool {
- return h.recursionDesired
-}
-
-func (h *dnsHc) SetDomain(domain string) {
- h.domain = domain
-}
-func (h *dnsHc) GetDomain() string {
- return h.domain
-}
-
-func (h *dnsHc) SetTCPTransport() {
- h.c.Net = "tcp"
-}
-
-// For HC we send to . IN NS +[no]rec message to the upstream. Dial timeouts and empty
-// replies are considered fails, basically anything else constitutes a healthy upstream.
-
-// Check is used as the up.Func in the up.Probe.
-func (h *dnsHc) Check(p *Proxy) error {
- err := h.send(p.addr)
- if err != nil {
- HealthcheckFailureCount.WithLabelValues(p.addr).Add(1)
- atomic.AddUint32(&p.fails, 1)
- return err
- }
-
- atomic.StoreUint32(&p.fails, 0)
- return nil
-}
-
-func (h *dnsHc) send(addr string) error {
- ping := new(dns.Msg)
- ping.SetQuestion(h.domain, dns.TypeNS)
- ping.MsgHdr.RecursionDesired = h.recursionDesired
-
- m, _, err := h.c.Exchange(ping, addr)
- // If we got a header, we're alright, basically only care about I/O errors 'n stuff.
- if err != nil && m != nil {
- // Silly check, something sane came back.
- if m.Response || m.Opcode == dns.OpcodeQuery {
- err = nil
- }
- }
-
- return err
-}