ipn/ipnlocal: fill out PeerAPIURLs in PeerStatus

Updates tailscale/corp#7515

Signed-off-by: Maisem Ali <maisem@tailscale.com>
pull/6374/head
Maisem Ali 2 years ago committed by Maisem Ali
parent 0af61f7c40
commit 5f6d63936f

@ -669,6 +669,16 @@ func (b *LocalBackend) populatePeerStatusLocked(sb *ipnstate.StatusBuilder) {
SSH_HostKeys: p.Hostinfo.SSH_HostKeys().AsSlice(), SSH_HostKeys: p.Hostinfo.SSH_HostKeys().AsSlice(),
} }
peerStatusFromNode(ps, p) peerStatusFromNode(ps, p)
p4, p6 := peerAPIPorts(p)
ip4 := nodeIP(p, netip.Addr.Is4)
ip6 := nodeIP(p, netip.Addr.Is6)
if p4 != 0 && ip4.IsValid() {
ps.PeerAPIURL = append(ps.PeerAPIURL, peerAPIURL(ip4, p4))
}
if p6 != 0 && ip6.IsValid() {
ps.PeerAPIURL = append(ps.PeerAPIURL, peerAPIURL(ip6, p6))
}
sb.AddPeer(p.Key, ps) sb.AddPeer(p.Key, ps)
} }
} }
@ -3660,6 +3670,27 @@ func (b *LocalBackend) registerIncomingFile(inf *incomingFile, active bool) {
} }
} }
func peerAPIPorts(peer *tailcfg.Node) (p4, p6 uint16) {
svcs := peer.Hostinfo.Services()
for i, n := 0, svcs.Len(); i < n; i++ {
s := svcs.At(i)
switch s.Proto {
case tailcfg.PeerAPI4:
p4 = s.Port
case tailcfg.PeerAPI6:
p6 = s.Port
}
}
return
}
func peerAPIURL(ip netip.Addr, port uint16) string {
if port == 0 || !ip.IsValid() {
return ""
}
return fmt.Sprintf("http://%v", netip.AddrPortFrom(ip, port))
}
// peerAPIBase returns the "http://ip:port" URL base to reach peer's peerAPI. // peerAPIBase returns the "http://ip:port" URL base to reach peer's peerAPI.
// It returns the empty string if the peer doesn't support the peerapi // It returns the empty string if the peer doesn't support the peerapi
// or there's no matching address family based on the netmap's own addresses. // or there's no matching address family based on the netmap's own addresses.
@ -3680,29 +3711,15 @@ func peerAPIBase(nm *netmap.NetworkMap, peer *tailcfg.Node) string {
have6 = true have6 = true
} }
} }
var p4, p6 uint16 p4, p6 := peerAPIPorts(peer)
svcs := peer.Hostinfo.Services()
for i, n := 0, svcs.Len(); i < n; i++ {
s := svcs.At(i)
switch s.Proto {
case tailcfg.PeerAPI4:
p4 = s.Port
case tailcfg.PeerAPI6:
p6 = s.Port
}
}
var ipp netip.AddrPort
switch { switch {
case have4 && p4 != 0: case have4 && p4 != 0:
ipp = netip.AddrPortFrom(nodeIP(peer, netip.Addr.Is4), p4) return peerAPIURL(nodeIP(peer, netip.Addr.Is4), p4)
case have6 && p6 != 0: case have6 && p6 != 0:
ipp = netip.AddrPortFrom(nodeIP(peer, netip.Addr.Is6), p6) return peerAPIURL(nodeIP(peer, netip.Addr.Is6), p6)
} }
if !ipp.Addr().IsValid() {
return "" return ""
} }
return fmt.Sprintf("http://%v", ipp)
}
func nodeIP(n *tailcfg.Node, pred func(netip.Addr) bool) netip.Addr { func nodeIP(n *tailcfg.Node, pred func(netip.Addr) bool) netip.Addr {
for _, a := range n.Addresses { for _, a := range n.Addresses {

Loading…
Cancel
Save