mirror of
https://github.com/tailscale/tailscale.git
synced 2025-10-03 19:41:34 +02:00
Saves 328 KB (2.5%) off the minimal binary. For IoT devices that don't need MagicDNS (e.g. they don't make outbound connections), this provides a knob to disable all the DNS functionality. Rather than a massive refactor today, this uses constant false values as a deadcode sledgehammer, guided by shotizam to find the largest DNS functions which survived deadcode. A future refactor could make it so that the net/dns/resolver and publicdns packages don't even show up in the import graph (along with their imports) but really it's already pretty good looking with just these consts, so it's not at the top of my list to refactor it more soon. Also do the same in a few places with the ACME (cert) functionality, as I saw those while searching for DNS stuff. Updates #12614 Change-Id: I8e459f595c2fde68ca16503ff61c8ab339871f97 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package resolver
|
|
|
|
import (
|
|
"fmt"
|
|
"html"
|
|
"net/http"
|
|
"strconv"
|
|
"sync"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"tailscale.com/feature/buildfeatures"
|
|
"tailscale.com/health"
|
|
)
|
|
|
|
func init() {
|
|
if !buildfeatures.HasDNS {
|
|
return
|
|
}
|
|
health.RegisterDebugHandler("dnsfwd", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
n, _ := strconv.Atoi(r.FormValue("n"))
|
|
if n <= 0 {
|
|
n = 100
|
|
} else if n > 10000 {
|
|
n = 10000
|
|
}
|
|
fl := fwdLogAtomic.Load()
|
|
if fl == nil || n != len(fl.ent) {
|
|
fl = &fwdLog{ent: make([]fwdLogEntry, n)}
|
|
fwdLogAtomic.Store(fl)
|
|
}
|
|
fl.ServeHTTP(w, r)
|
|
}))
|
|
}
|
|
|
|
var fwdLogAtomic atomic.Pointer[fwdLog]
|
|
|
|
type fwdLog struct {
|
|
mu sync.Mutex
|
|
pos int // ent[pos] is next entry
|
|
ent []fwdLogEntry
|
|
}
|
|
|
|
type fwdLogEntry struct {
|
|
Domain string
|
|
Time time.Time
|
|
}
|
|
|
|
func (fl *fwdLog) addName(name string) {
|
|
if fl == nil {
|
|
return
|
|
}
|
|
fl.mu.Lock()
|
|
defer fl.mu.Unlock()
|
|
if len(fl.ent) == 0 {
|
|
return
|
|
}
|
|
fl.ent[fl.pos] = fwdLogEntry{Domain: name, Time: time.Now()}
|
|
fl.pos++
|
|
if fl.pos == len(fl.ent) {
|
|
fl.pos = 0
|
|
}
|
|
}
|
|
|
|
func (fl *fwdLog) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
fl.mu.Lock()
|
|
defer fl.mu.Unlock()
|
|
|
|
fmt.Fprintf(w, "<html><h1>DNS forwards</h1>")
|
|
now := time.Now()
|
|
for i := range len(fl.ent) {
|
|
ent := fl.ent[(i+fl.pos)%len(fl.ent)]
|
|
if ent.Domain == "" {
|
|
continue
|
|
}
|
|
fmt.Fprintf(w, "%v ago: %v<br>\n", now.Sub(ent.Time).Round(time.Second), html.EscapeString(ent.Domain))
|
|
}
|
|
}
|