|
|
|
|
@ -7,6 +7,7 @@ package ipnserver |
|
|
|
|
import ( |
|
|
|
|
"bufio" |
|
|
|
|
"context" |
|
|
|
|
"encoding/json" |
|
|
|
|
"errors" |
|
|
|
|
"fmt" |
|
|
|
|
"io" |
|
|
|
|
@ -32,6 +33,7 @@ import ( |
|
|
|
|
"tailscale.com/net/netstat" |
|
|
|
|
"tailscale.com/safesocket" |
|
|
|
|
"tailscale.com/smallzstd" |
|
|
|
|
"tailscale.com/tailcfg" |
|
|
|
|
"tailscale.com/types/logger" |
|
|
|
|
"tailscale.com/util/pidowner" |
|
|
|
|
"tailscale.com/util/systemd" |
|
|
|
|
@ -620,6 +622,7 @@ func Run(ctx context.Context, logf logger.Logf, logid string, getEngine func() ( |
|
|
|
|
opts.DebugMux.HandleFunc("/debug/ipn", func(w http.ResponseWriter, r *http.Request) { |
|
|
|
|
serveHTMLStatus(w, b) |
|
|
|
|
}) |
|
|
|
|
opts.DebugMux.Handle("/whois", whoIsHandler{b}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
server.b = b |
|
|
|
|
@ -883,3 +886,40 @@ func peerPid(entries []netstat.Entry, la, ra netaddr.IPPort) int { |
|
|
|
|
} |
|
|
|
|
return 0 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// whoIsHandler is the debug server's /debug?ip=$IP HTTP handler.
|
|
|
|
|
type whoIsHandler struct { |
|
|
|
|
b *ipn.LocalBackend |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (h whoIsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
|
|
|
|
b := h.b |
|
|
|
|
var ip netaddr.IP |
|
|
|
|
if v := r.FormValue("ip"); v != "" { |
|
|
|
|
var err error |
|
|
|
|
ip, err = netaddr.ParseIP(r.FormValue("ip")) |
|
|
|
|
if err != nil { |
|
|
|
|
http.Error(w, "invalid 'ip' parameter", 400) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
http.Error(w, "missing 'ip' parameter", 400) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
n, u, ok := b.WhoIs(ip) |
|
|
|
|
if !ok { |
|
|
|
|
http.Error(w, "no match for IP", 404) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
res := &tailcfg.WhoIsResponse{ |
|
|
|
|
Node: n, |
|
|
|
|
UserProfile: &u, |
|
|
|
|
} |
|
|
|
|
j, err := json.MarshalIndent(res, "", "\t") |
|
|
|
|
if err != nil { |
|
|
|
|
http.Error(w, "JSON encoding error", 500) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
w.Header().Set("Content-Type", "application/json") |
|
|
|
|
w.Write(j) |
|
|
|
|
} |
|
|
|
|
|