Skip to content

Commit 2c10d34

Browse files
committed
netcheck stub
1 parent 09f375b commit 2c10d34

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy