summaryrefslogtreecommitdiffhomepage
path: root/ipn
diff options
context:
space:
mode:
authorAndrea Gottardo <andrea@gottardo.me>2024-09-19 15:52:31 -0700
committerAndrea Gottardo <andrea@gottardo.me>2024-09-19 15:52:31 -0700
commit025ceed7354a527594c3c422ab4b9e1558326323 (patch)
treea04166e9b57b05c760e71703a42fe560736d3fa4 /ipn
parent7c02dcf93ad9c29d3732e189a4b445bd3fde1bf7 (diff)
downloadtailscale-angott/dns-cli-stream.tar.xz
tailscale-angott/dns-cli-stream.zip
cli: implement `tailscale dns stream`angott/dns-cli-stream
Updates tailscale/tailscale#13326 This PR adds another subcommand to `tailscale dns`, to stream queries and answers returned by the DNS forwarder as they are handled. Useful for debugging purposes, and is equivalent to setting the `TS_DEBUG_DNS_FORWARD_SEND` envknob and filtering the logs for relevant entries. This also adds a new envknob, `TS_DEBUG_DNS_INCLUDE_NAMES`, which includes the actual hostnames in the log lines (with a huge privacy warning!). This makes it easier to diagnose issues with DNS resolution.
Diffstat (limited to 'ipn')
-rw-r--r--ipn/localapi/localapi.go25
1 files changed, 25 insertions, 0 deletions
diff --git a/ipn/localapi/localapi.go b/ipn/localapi/localapi.go
index ec9d434e7..bf8cba2bc 100644
--- a/ipn/localapi/localapi.go
+++ b/ipn/localapi/localapi.go
@@ -92,6 +92,7 @@ var handler = map[string]localAPIHandler{
"debug-capture": (*Handler).serveDebugCapture,
"debug-derp-region": (*Handler).serveDebugDERPRegion,
"debug-dial-types": (*Handler).serveDebugDialTypes,
+ "debug-envknob": (*Handler).serveDebugEnvKnob,
"debug-log": (*Handler).serveDebugLog,
"debug-packet-filter-matches": (*Handler).serveDebugPacketFilterMatches,
"debug-packet-filter-rules": (*Handler).serveDebugPacketFilterRules,
@@ -584,6 +585,30 @@ func (h *Handler) serveUserMetrics(w http.ResponseWriter, r *http.Request) {
usermetric.Handler(w, r)
}
+// serveDebugEnvKnob allows the remote LocalAPI user to set the value of an envknob.
+func (h *Handler) serveDebugEnvKnob(w http.ResponseWriter, r *http.Request) {
+ if !h.PermitWrite {
+ http.Error(w, "debug-envknob access denied", http.StatusForbidden)
+ return
+ }
+ if r.Method != "POST" {
+ http.Error(w, "POST required", http.StatusMethodNotAllowed)
+ return
+ }
+ if k := r.FormValue("key"); k != "" {
+ if kv := r.FormValue("value"); kv != "" {
+ envknob.Setenv(k, kv)
+ io.WriteString(w, fmt.Sprintf("set %q to %q\n", k, kv))
+ } else {
+ http.Error(w, fmt.Sprintf("missing envknob value for envknob key %q", k), http.StatusBadRequest)
+ return
+ }
+ } else {
+ http.Error(w, "must provide an envknob key", http.StatusBadRequest)
+ return
+ }
+}
+
func (h *Handler) serveDebug(w http.ResponseWriter, r *http.Request) {
if !h.PermitWrite {
http.Error(w, "debug access denied", http.StatusForbidden)