Skip to content

Commit 09d9249

Browse files
committed
netcheck stub
1 parent 66313d1 commit 09d9249

File tree

4 files changed

+49
-27
lines changed

4 files changed

+49
-27
lines changed

tailnet/conn.go

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -137,16 +137,16 @@ func NewConn(options *Options) (conn *Conn, err error) {
137137
}
138138

139139
var (
140-
logger = newMultiLogger(options.Logger)
141-
telemetryLogSink *TelemetryStore
140+
logger = newMultiLogger(options.Logger)
141+
telemetryStore *TelemetryStore
142142
)
143143
if options.TelemetrySink != nil {
144144
var err error
145-
telemetryLogSink, err = newTelemetryStore()
145+
telemetryStore, err = newTelemetryStore()
146146
if err != nil {
147147
return nil, xerrors.Errorf("create telemetry log sink: %w", err)
148148
}
149-
logger = logger.appendLogger(slog.Make(telemetryLogSink).Leveled(slog.LevelDebug))
149+
logger = logger.appendLogger(slog.Make(telemetryStore).Leveled(slog.LevelDebug))
150150
}
151151

152152
nodePrivateKey := key.NewNode()
@@ -270,9 +270,13 @@ func NewConn(options *Options) (conn *Conn, err error) {
270270
wireguardEngine.SetStatusCallback(nodeUp.setStatus)
271271
wireguardEngine.SetNetInfoCallback(nodeUp.setNetInfo)
272272
magicConn.SetDERPForcedWebsocketCallback(nodeUp.setDERPForcedWebsocket)
273+
if options.TelemetrySink != nil {
274+
magicConn.SetNetInfoCallback(telemetryStore.setNetInfo)
275+
}
273276

274277
server := &Conn{
275278
id: uuid.New(),
279+
nodeID: nodeID,
276280
closed: make(chan struct{}),
277281
logger: logger,
278282
magicConn: magicConn,
@@ -288,7 +292,7 @@ func NewConn(options *Options) (conn *Conn, err error) {
288292
configMaps: cfgMaps,
289293
nodeUpdater: nodeUp,
290294
telemetrySink: options.TelemetrySink,
291-
telemetryLogs: telemetryLogSink,
295+
telemeteryStore: telemetryStore,
292296
}
293297
defer func() {
294298
if err != nil {
@@ -334,6 +338,7 @@ func IPFromUUID(uid uuid.UUID) netip.Addr {
334338
type Conn struct {
335339
// ID must be unique to this connection
336340
id uuid.UUID
341+
nodeID tailcfg.NodeID
337342
mutex sync.Mutex
338343
closed chan struct{}
339344
logger multiLogger
@@ -351,9 +356,9 @@ type Conn struct {
351356
clientType proto.TelemetryEvent_ClientType
352357

353358
telemetrySink TelemetrySink
354-
// telemetryLogs will be nil if telemetrySink is nil.
355-
telemetryLogs *TelemetryStore
356-
telemetryWg sync.WaitGroup
359+
// telemeteryStore will be nil if telemetrySink is nil.
360+
telemeteryStore *TelemetryStore
361+
telemetryWg sync.WaitGroup
357362

358363
trafficStats *connstats.Statistics
359364
}
@@ -388,8 +393,8 @@ func (c *Conn) SetNodeCallback(callback func(node *Node)) {
388393

389394
// SetDERPMap updates the DERPMap of a connection.
390395
func (c *Conn) SetDERPMap(derpMap *tailcfg.DERPMap) {
391-
if c.configMaps.setDERPMap(derpMap) && c.telemetryLogs != nil {
392-
c.telemetryLogs.updateDerpMap(derpMap)
396+
if c.configMaps.setDERPMap(derpMap) && c.telemeteryStore != nil {
397+
c.telemeteryStore.updateDerpMap(derpMap)
393398
}
394399
}
395400

@@ -729,27 +734,24 @@ func (c *Conn) newTelemetryEvent() (*proto.TelemetryEvent, error) {
729734
if err != nil {
730735
return nil, xerrors.Errorf("marshal uuid to bytes: %w", err)
731736
}
732-
c.nodeUpdater.L.Lock()
733-
node := c.nodeUpdater.nodeLocked()
734-
c.nodeUpdater.L.Unlock()
735737

736-
logs, ips, dm := c.telemetryLogs.getStore()
738+
logs, ips, dm, ni := c.telemeteryStore.getStore()
737739
return &proto.TelemetryEvent{
738-
Id: id,
739-
Time: timestamppb.Now(),
740-
ClientType: c.clientType,
741-
NodeIdSelf: uint64(node.ID),
742-
Logs: logs,
743-
LogIpHashes: ips,
744-
DerpMap: DERPMapToProto(dm),
740+
Id: id,
741+
Time: timestamppb.Now(),
742+
ClientType: c.clientType,
743+
NodeIdSelf: uint64(c.nodeID),
744+
Logs: logs,
745+
LogIpHashes: ips,
746+
DerpMap: DERPMapToProto(dm),
747+
LatestNetcheck: NetInfoToProto(ni),
745748

746749
// TODO:
747750
Application: "",
748751
NodeIdRemote: 0,
749752
P2PEndpoint: &proto.TelemetryEvent_P2PEndpoint{},
750753
ThroughputMbits: &wrapperspb.FloatValue{},
751754
HomeDerp: "",
752-
LatestNetcheck: &proto.Netcheck{},
753755
ConnectionAge: &durationpb.Duration{},
754756
ConnectionSetup: &durationpb.Duration{},
755757
P2PSetup: &durationpb.Duration{},

tailnet/convert.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,13 @@ func DERPNodeFromProto(node *proto.DERPMap_Region_Node) *tailcfg.DERPNode {
270270
CanPort80: node.CanPort_80,
271271
}
272272
}
273+
274+
func NetInfoToProto(netInfo *tailcfg.NetInfo) *proto.Netcheck {
275+
if netInfo == nil {
276+
return nil
277+
}
278+
279+
return &proto.Netcheck{
280+
// TODO:
281+
}
282+
}

tailnet/logger_internal_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestTelemetryStore(t *testing.T) {
2626
logger.Debug(ctx, "line2 fe80")
2727
logger.Debug(ctx, "line3 xxxx::x")
2828

29-
logs, hashes, _ := sink.getStore()
29+
logs, hashes, _, _ := sink.getStore()
3030
require.Len(t, logs, 3)
3131
require.Len(t, hashes, 0)
3232
require.Contains(t, logs[0], "line1")
@@ -117,7 +117,7 @@ func TestTelemetryStore(t *testing.T) {
117117
logger.Debug(ctx, fmt.Sprintf("line2: %s/24", c.ip))
118118
logger.Debug(ctx, fmt.Sprintf("line3: %s foo (%s)", ipWithPort, c.ip))
119119

120-
logs, ips, _ := sink.getStore()
120+
logs, ips, _, _ := sink.getStore()
121121
require.Len(t, logs, 3)
122122
require.Len(t, ips, 1)
123123
for _, log := range logs {
@@ -179,7 +179,7 @@ func TestTelemetryStore(t *testing.T) {
179179
logger.Debug(ctx, "line2 1.2.3.4 asdf")
180180
logger.Debug(ctx, "line3 2001:db8::1 foo")
181181

182-
logs, ips, dm := telemetry.getStore()
182+
logs, ips, dm, _ := telemetry.getStore()
183183
require.Len(t, logs, 3)
184184
require.Len(t, ips, 3)
185185
require.Len(t, dm.Regions[999].Nodes, 1)

tailnet/telemetry.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ type TelemetryStore struct {
101101

102102
cleanDerpMap *tailcfg.DERPMap
103103
derpMapFilter *regexp.Regexp
104+
netInfo *tailcfg.NetInfo
104105
}
105106

106107
var _ slog.Sink = &TelemetryStore{}
@@ -123,10 +124,12 @@ func newTelemetryStore() (*TelemetryStore, error) {
123124
return out, nil
124125
}
125126

126-
func (b *TelemetryStore) getStore() ([]string, map[string]*proto.IPFields, *tailcfg.DERPMap) {
127+
// getStore returns a deep copy of all current telemetry state.
128+
// TODO: Should this return a populated event instead?
129+
func (b *TelemetryStore) getStore() ([]string, map[string]*proto.IPFields, *tailcfg.DERPMap, *tailcfg.NetInfo) {
127130
b.mu.Lock()
128131
defer b.mu.Unlock()
129-
return append([]string{}, b.logs...), b.hashedIPs, b.cleanDerpMap.Clone()
132+
return append([]string{}, b.logs...), b.hashedIPs, b.cleanDerpMap.Clone(), b.netInfo.Clone()
130133
}
131134

132135
// Given a DERPMap, anonymise all IPs and hostnames.
@@ -161,6 +164,13 @@ func (b *TelemetryStore) updateDerpMap(cur *tailcfg.DERPMap) {
161164
b.cleanDerpMap = cleanMap
162165
}
163166

167+
func (b *TelemetryStore) setNetInfo(ni *tailcfg.NetInfo) {
168+
b.mu.Lock()
169+
defer b.mu.Unlock()
170+
// TODO: Scrub PII from NetInfo
171+
b.netInfo = ni
172+
}
173+
164174
// Write implements io.Writer.
165175
func (b *TelemetryStore) Write(p []byte) (n int, err error) {
166176
b.mu.Lock()

0 commit comments

Comments
 (0)