summaryrefslogtreecommitdiffhomepage
path: root/types/netmap/netmap.go
diff options
context:
space:
mode:
Diffstat (limited to 'types/netmap/netmap.go')
-rw-r--r--types/netmap/netmap.go21
1 files changed, 21 insertions, 0 deletions
diff --git a/types/netmap/netmap.go b/types/netmap/netmap.go
index ac95254da..90ed9b3fc 100644
--- a/types/netmap/netmap.go
+++ b/types/netmap/netmap.go
@@ -146,6 +146,27 @@ func (nm *NetworkMap) GetIPVIPServiceMap() IPServiceMappings {
return res
}
+// Services returns the Services visible (accessible) to this node,
+// decoded from [tailcfg.NodeAttrPrefixServices]+serviceName entries in the
+// self node's CapMap. Returns nil if nm is nil or SelfNode is invalid.
+func (nm *NetworkMap) Services() map[tailcfg.ServiceName]tailcfg.ServiceDetails {
+ if nm == nil || !nm.SelfNode.Valid() {
+ return nil
+ }
+ result := make(map[tailcfg.ServiceName]tailcfg.ServiceDetails)
+ for cap := range nm.SelfNode.CapMap().All() {
+ if !strings.HasPrefix(string(cap), string(tailcfg.NodeAttrPrefixServices)) {
+ continue
+ }
+ svcs, err := tailcfg.UnmarshalNodeCapViewJSON[tailcfg.ServiceDetails](nm.SelfNode.CapMap(), cap)
+ if err != nil || len(svcs) < 1 {
+ continue
+ }
+ result[svcs[0].Name] = svcs[0]
+ }
+ return result
+}
+
// SelfNodeOrZero returns the self node, or a zero value if nm is nil.
func (nm *NetworkMap) SelfNodeOrZero() tailcfg.NodeView {
if nm == nil {