@ -7,9 +7,14 @@
package monitor
package monitor
import (
import (
"fmt"
"net"
"runtime"
"strings"
"sync"
"sync"
"time"
"time"
"tailscale.com/net/interfaces"
"tailscale.com/types/logger"
"tailscale.com/types/logger"
)
)
@ -99,6 +104,7 @@ func (m *Mon) Close() error {
// the change channel of changes, and stopping when a stop is issued.
// the change channel of changes, and stopping when a stop is issued.
func ( m * Mon ) pump ( ) {
func ( m * Mon ) pump ( ) {
defer m . goroutines . Done ( )
defer m . goroutines . Done ( )
last := interfaceSummary ( )
for {
for {
_ , err := m . om . Receive ( )
_ , err := m . om . Receive ( )
if err != nil {
if err != nil {
@ -113,9 +119,17 @@ func (m *Mon) pump() {
continue
continue
}
}
cur := interfaceSummary ( )
if cur == last {
continue
}
m . logf ( "wgengine/monitor: now %v (was %v)" , cur , last )
last = cur
select {
select {
case m . change <- struct { } { } :
case m . change <- struct { } { } :
default :
case <- m . stop :
return
}
}
}
}
}
}
@ -140,3 +154,17 @@ func (m *Mon) debounce() {
}
}
}
}
}
}
func interfaceSummary ( ) string {
var sb strings . Builder
_ = interfaces . ForeachInterfaceAddress ( func ( ni interfaces . Interface , addr net . IP ) {
if runtime . GOOS == "linux" && strings . HasPrefix ( ni . Name , "tailscale" ) {
// Skip tailscale0, etc on Linux.
return
}
if ni . IsUp ( ) {
fmt . Fprintf ( & sb , "%s=%s " , ni . Name , addr )
}
} )
return strings . TrimSpace ( sb . String ( ) )
}