summaryrefslogtreecommitdiffhomepage
path: root/ipn
diff options
context:
space:
mode:
authorAdriano Sela Aviles <adriano@tailscale.com>2026-04-03 00:46:35 -0700
committerAdriano Sela Aviles <adriano@tailscale.com>2026-04-10 22:13:12 -0700
commit1f6a4389b6dd64aff6e3fd8f5c6e61495fe00563 (patch)
treeaf23385affa9c8f459bd9aa7f1efbd8d29913ff4 /ipn
parent0e8ae9d60c92ec578bc0ff7c2be0334df6908c8b (diff)
downloadtailscale-adrianosela/visible-services.tar.xz
tailscale-adrianosela/visible-services.zip
tailcfg,types/netmap: visible services in netmapadrianosela/visible-services
ipn/localapi: serve service list over localapi cmd/tailscale: new service list command Updates <FIXME(@adrianosela)>
Diffstat (limited to 'ipn')
-rw-r--r--ipn/localapi/localapi.go15
1 files changed, 15 insertions, 0 deletions
diff --git a/ipn/localapi/localapi.go b/ipn/localapi/localapi.go
index 43942c52f..b06b69b04 100644
--- a/ipn/localapi/localapi.go
+++ b/ipn/localapi/localapi.go
@@ -82,6 +82,7 @@ var handler = map[string]LocalAPIHandler{
"prefs": (*Handler).servePrefs,
"reload-config": (*Handler).reloadConfig,
"reset-auth": (*Handler).serveResetAuth,
+ "services": (*Handler).serveServices,
"set-expiry-sooner": (*Handler).serveSetExpirySooner,
"shutdown": (*Handler).serveShutdown,
"start": (*Handler).serveStart,
@@ -1707,6 +1708,20 @@ func (h *Handler) serveShutdown(w http.ResponseWriter, r *http.Request) {
eventbus.Publish[Shutdown](ec).Publish(Shutdown{})
}
+func (h *Handler) serveServices(w http.ResponseWriter, r *http.Request) {
+ if r.Method != httpm.GET {
+ http.Error(w, "only GET allowed", http.StatusMethodNotAllowed)
+ return
+ }
+ nm := h.b.NetMap()
+ if nm == nil {
+ http.Error(w, "no netmap", http.StatusServiceUnavailable)
+ return
+ }
+ w.Header().Set("Content-Type", "application/json")
+ json.NewEncoder(w).Encode(nm.Services())
+}
+
func (h *Handler) serveGetAppcRouteInfo(w http.ResponseWriter, r *http.Request) {
if !buildfeatures.HasAppConnectors {
http.Error(w, feature.ErrUnavailable.Error(), http.StatusNotImplemented)