diff --git a/internal/machine/network/peer.go b/internal/machine/network/peer.go index 9c430ce0..c9b55297 100644 --- a/internal/machine/network/peer.go +++ b/internal/machine/network/peer.go @@ -2,6 +2,7 @@ package network import ( "golang.zx2c4.com/wireguard/wgctrl/wgtypes" + "log/slog" "time" ) @@ -20,8 +21,8 @@ type peer struct { status string } -func newPeer(config PeerConfig) peer { - p := peer{ +func newPeer(config PeerConfig) *peer { + p := &peer{ config: config, status: PeerStatusUnknown, } @@ -83,6 +84,7 @@ const peerDownInterval = (180 + 5 + 90) * time.Second // - if we're between (T0) and (T0+endpointConnectionTimeout), and there's no handshake since the endpoint change, // consider the state to be unknown func (p *peer) calculateStatus() { + lastStatus := p.status sinceLastHandshake := time.Since(p.lastHandshakeTime) sinceEndpointChange := time.Since(p.lastEndpointChangeTime) @@ -114,4 +116,7 @@ func (p *peer) calculateStatus() { // No endpoint, so unknown. p.status = PeerStatusUnknown } + if p.status != lastStatus { + slog.Debug("Peer status changed.", "public_key", p.config.PublicKey, "status", p.status) + } } diff --git a/internal/machine/network/wireguard_linux.go b/internal/machine/network/wireguard_linux.go index 9fe8e4df..038774a5 100644 --- a/internal/machine/network/wireguard_linux.go +++ b/internal/machine/network/wireguard_linux.go @@ -14,13 +14,14 @@ import ( "net/netip" "slices" "sync" + "time" "uncloud/internal/secret" ) type WireGuardNetwork struct { link netlink.Link // peers is a map of peers indexed by their public key. - peers map[string]peer + peers map[string]*peer // mu synchronises concurrent network configuration changes. mu sync.Mutex } @@ -32,7 +33,7 @@ func NewWireGuardNetwork() (*WireGuardNetwork, error) { } return &WireGuardNetwork{ link: link, - peers: make(map[string]peer), + peers: make(map[string]*peer), }, nil } @@ -260,8 +261,22 @@ func (n *WireGuardNetwork) updatePeerRoutes() error { } func (n *WireGuardNetwork) Run(ctx context.Context) error { - // TODO: check if the endpoint should be changed for any peers. If so, change it and notify the controller to - // preserve the change in the machine state. - <-ctx.Done() - return nil + ticker := time.NewTicker(1 * time.Second) + for { + select { + case <-ticker.C: + n.mu.Lock() + if err := n.updatePeersFromWireGuard(); err != nil { + slog.Error("Failed to update peers status from WireGuard interface.", + "name", n.link.Attrs().Name, "err", err) + } + n.mu.Unlock() + + // TODO: check if the endpoint should be changed for any peers. If so, change it and notify the controller + // to preserve the change in the machine state. + case <-ctx.Done(): + return nil + } + } + }