diff --git a/hscontrol/policy/matcher/matcher.go b/hscontrol/policy/matcher/matcher.go index ec07d19c..d246d5e2 100644 --- a/hscontrol/policy/matcher/matcher.go +++ b/hscontrol/policy/matcher/matcher.go @@ -2,6 +2,7 @@ package matcher import ( "net/netip" + "strings" "slices" @@ -15,6 +16,21 @@ type Match struct { dests *netipx.IPSet } +func (m Match) DebugString() string { + var sb strings.Builder + + sb.WriteString("Match:\n") + sb.WriteString(" Sources:\n") + for _, prefix := range m.srcs.Prefixes() { + sb.WriteString(" " + prefix.String() + "\n") + } + sb.WriteString(" Destinations:\n") + for _, prefix := range m.dests.Prefixes() { + sb.WriteString(" " + prefix.String() + "\n") + } + return sb.String() +} + func MatchesFromFilterRules(rules []tailcfg.FilterRule) []Match { matches := make([]Match, 0, len(rules)) for _, rule := range rules { diff --git a/hscontrol/policy/v2/policy.go b/hscontrol/policy/v2/policy.go index 5d7f7db1..4dec2bd4 100644 --- a/hscontrol/policy/v2/policy.go +++ b/hscontrol/policy/v2/policy.go @@ -297,6 +297,14 @@ func (pm *PolicyManager) DebugString() string { } } + sb.WriteString("\n\n") + sb.WriteString("Matchers:\n") + sb.WriteString("an internal structure used to filter nodes and routes\n") + for _, match := range pm.matchers { + sb.WriteString(match.DebugString()) + sb.WriteString("\n") + } + sb.WriteString("\n\n") sb.WriteString(pm.nodes.DebugString()) diff --git a/hscontrol/types/node.go b/hscontrol/types/node.go index 76770160..572e38b7 100644 --- a/hscontrol/types/node.go +++ b/hscontrol/types/node.go @@ -583,6 +583,7 @@ func (node Node) DebugString() string { fmt.Fprintf(&sb, "\tTags: %v\n", node.Tags()) fmt.Fprintf(&sb, "\tIPs: %v\n", node.IPs()) fmt.Fprintf(&sb, "\tApprovedRoutes: %v\n", node.ApprovedRoutes) + fmt.Fprintf(&sb, "\tAnnouncedRoutes: %v\n", node.AnnouncedRoutes()) fmt.Fprintf(&sb, "\tSubnetRoutes: %v\n", node.SubnetRoutes()) sb.WriteString("\n") return sb.String()