Brad Fitzpatrick 9386a101d8 cmd/tailscaled, ipn/localapi, util/eventbus: don't link in regexp when debug is omitted
Saves 442 KB. Lock it with a new min test.

Updates #12614

Change-Id: Ia7bf6f797b6cbf08ea65419ade2f359d390f8e91
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2025-09-30 12:13:17 -07:00

108 lines
2.5 KiB
Go

// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
// debug-demo is a program that serves a bus's debug interface over
// HTTP, then generates some fake traffic from a handful of
// clients. It is an aid to development, to have something to present
// on the debug interfaces while writing them.
package main
import (
"log"
"math/rand/v2"
"net/http"
"net/netip"
"time"
"tailscale.com/feature/buildfeatures"
"tailscale.com/tsweb"
"tailscale.com/types/key"
"tailscale.com/util/eventbus"
)
func main() {
if !buildfeatures.HasDebugEventBus {
log.Fatalf("debug-demo requires the \"debugeventbus\" feature enabled")
}
b := eventbus.New()
c := b.Client("RouteMonitor")
go testPub[RouteAdded](c, 5*time.Second)
go testPub[RouteRemoved](c, 5*time.Second)
c = b.Client("ControlClient")
go testPub[PeerAdded](c, 3*time.Second)
go testPub[PeerRemoved](c, 6*time.Second)
c = b.Client("Portmapper")
go testPub[PortmapAcquired](c, 10*time.Second)
go testPub[PortmapLost](c, 15*time.Second)
go testSub[RouteAdded](c)
c = b.Client("WireguardConfig")
go testSub[PeerAdded](c)
go testSub[PeerRemoved](c)
c = b.Client("Magicsock")
go testPub[PeerPathChanged](c, 5*time.Second)
go testSub[RouteAdded](c)
go testSub[RouteRemoved](c)
go testSub[PortmapAcquired](c)
go testSub[PortmapLost](c)
m := http.NewServeMux()
d := tsweb.Debugger(m)
b.Debugger().RegisterHTTP(d)
m.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/debug/bus", http.StatusFound)
})
log.Printf("Serving debug interface at http://localhost:8185/debug/bus")
http.ListenAndServe(":8185", m)
}
func testPub[T any](c *eventbus.Client, every time.Duration) {
p := eventbus.Publish[T](c)
for {
jitter := time.Duration(rand.N(2000)) * time.Millisecond
time.Sleep(jitter)
var zero T
log.Printf("%s publish: %T", c.Name(), zero)
p.Publish(zero)
time.Sleep(every)
}
}
func testSub[T any](c *eventbus.Client) {
s := eventbus.Subscribe[T](c)
for v := range s.Events() {
log.Printf("%s received: %T", c.Name(), v)
}
}
type RouteAdded struct {
Prefix netip.Prefix
Via netip.Addr
Priority int
}
type RouteRemoved struct {
Prefix netip.Addr
}
type PeerAdded struct {
ID int
Key key.NodePublic
}
type PeerRemoved struct {
ID int
Key key.NodePublic
}
type PortmapAcquired struct {
Endpoint netip.Addr
}
type PortmapLost struct {
Endpoint netip.Addr
}
type PeerPathChanged struct {
ID int
EndpointID int
Quality int
}