Skip to content

Commit 63c3c06

Browse files
skip tracking for pro users and unit tests
1 parent 810d6b2 commit 63c3c06

File tree

6 files changed

+162
-39
lines changed

6 files changed

+162
-39
lines changed

cmd/cmd_run.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"gopkg.in/ini.v1"
2020

2121
"github.com/getlantern/lantern-box/tracker/clientcontext"
22+
"github.com/getlantern/lantern-box/tracker/datacap"
2223
)
2324

2425
func init() {
@@ -27,6 +28,7 @@ func init() {
2728
runCmd.Flags().String("geo-city-url", "https://lanterngeo.lantern.io/GeoLite2-City.mmdb.tar.gz", "URL for downloading GeoLite2-City database")
2829
runCmd.Flags().String("city-database-name", "GeoLite2-City.mmdb", "Filename for storing GeoLite2-City database")
2930
runCmd.Flags().String("telemetry-endpoint", "telemetry.iantem.io:443", "Telemetry endpoint for OpenTelemetry exporter")
31+
runCmd.Flags().String("datacap-url", "", "Datacap server URL")
3032
}
3133

3234
var runCmd = &cobra.Command{
@@ -37,7 +39,11 @@ var runCmd = &cobra.Command{
3739
if err != nil {
3840
return fmt.Errorf("get config flag: %w", err)
3941
}
40-
return run(path)
42+
datacapURL, err := cmd.Flags().GetString("datacap-url")
43+
if err != nil {
44+
return fmt.Errorf("get datacap-url flag: %w", err)
45+
}
46+
return run(path, datacapURL)
4147
},
4248
}
4349

@@ -66,7 +72,7 @@ func readConfig(path string) (option.Options, error) {
6672
return options, nil
6773
}
6874

69-
func create(configPath string) (*box.Box, context.CancelFunc, error) {
75+
func create(configPath string, datacapURL string) (*box.Box, context.CancelFunc, error) {
7076
options, err := readConfig(configPath)
7177
if err != nil {
7278
return nil, nil, fmt.Errorf("read config: %w", err)
@@ -88,6 +94,18 @@ func create(configPath string) (*box.Box, context.CancelFunc, error) {
8894
}, log.NewNOPFactory().NewLogger("tracker"))
8995
instance.Router().AppendTracker(tracker)
9096

97+
if datacapURL != "" {
98+
datacapTracker, err := datacap.NewDatacapTracker(datacap.Options{
99+
URL: datacapURL,
100+
}, log.NewNOPFactory().NewLogger("datacap-tracker"))
101+
if err != nil {
102+
return nil, nil, fmt.Errorf("create datacap tracker: %w", err)
103+
}
104+
instance.Router().AppendTracker(datacapTracker)
105+
} else {
106+
log.Warn("Datacap URL not provided, datacap tracking disabled")
107+
}
108+
91109
osSignals := make(chan os.Signal, 1)
92110
signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
93111
defer func() {
@@ -121,13 +139,13 @@ func closeMonitor(ctx context.Context) {
121139
log.Fatal("sing-box did not close!")
122140
}
123141

124-
func run(configPath string) error {
142+
func run(configPath string, datacapURL string) error {
125143
log.Info("build info: version , commit ", version, commit)
126144
osSignals := make(chan os.Signal, 1)
127145
signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
128146
defer signal.Stop(osSignals)
129147
for {
130-
instance, cancel, err := create(configPath)
148+
instance, cancel, err := create(configPath, datacapURL)
131149
if err != nil {
132150
return err
133151
}

tracker/datacap/conn.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"sync/atomic"
88
"time"
99

10+
"github.com/getlantern/lantern-box/tracker/clientcontext"
1011
"github.com/sagernet/sing-box/log"
1112
)
1213

@@ -40,7 +41,7 @@ type Conn struct {
4041
client *Client
4142
logger log.ContextLogger
4243

43-
clientInfo *ClientInfo
44+
clientInfo *clientcontext.ClientInfo
4445

4546
// Atomic counters for thread-safe tracking
4647
bytesSent atomic.Int64
@@ -61,7 +62,7 @@ type ConnConfig struct {
6162
Conn net.Conn
6263
Client *Client
6364
Logger log.ContextLogger
64-
ClientInfo *ClientInfo
65+
ClientInfo *clientcontext.ClientInfo
6566
ReportInterval time.Duration
6667
EnableThrottling bool
6768
ThrottleSpeed int64

tracker/datacap/integration_test.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"testing"
1212
"time"
1313

14+
"github.com/getlantern/lantern-box/tracker/clientcontext"
1415
"github.com/sagernet/sing-box/log"
1516
)
1617

@@ -122,7 +123,7 @@ func TestDataCapEndToEndNoThrottling(t *testing.T) {
122123
config := ConnConfig{
123124
Conn: mockConn,
124125
Client: client,
125-
ClientInfo: &ClientInfo{
126+
ClientInfo: &clientcontext.ClientInfo{
126127
DeviceID: "test-device",
127128
CountryCode: "US",
128129
Platform: "android",
@@ -220,7 +221,7 @@ func TestDataCapEndToEndWithThrottling(t *testing.T) {
220221
config := ConnConfig{
221222
Conn: mockConn,
222223
Client: client,
223-
ClientInfo: &ClientInfo{
224+
ClientInfo: &clientcontext.ClientInfo{
224225
DeviceID: "test-device",
225226
CountryCode: "US",
226227
Platform: "android",
@@ -312,7 +313,7 @@ func TestDataCapThrottleSpeedAdjustment(t *testing.T) {
312313
config := ConnConfig{
313314
Conn: mockConn,
314315
Client: nil, // No client needed for this test
315-
ClientInfo: &ClientInfo{
316+
ClientInfo: &clientcontext.ClientInfo{
316317
DeviceID: "test-device",
317318
},
318319
Logger: noopLogger,
@@ -372,7 +373,7 @@ func TestDataCapPeriodicReporting(t *testing.T) {
372373
config := ConnConfig{
373374
Conn: mockConn,
374375
Client: client,
375-
ClientInfo: &ClientInfo{
376+
ClientInfo: &clientcontext.ClientInfo{
376377
DeviceID: "test-device",
377378
CountryCode: "US",
378379
Platform: "android",
@@ -446,7 +447,7 @@ func TestDataCapFinalReportOnClose(t *testing.T) {
446447
config := ConnConfig{
447448
Conn: mockConn,
448449
Client: client,
449-
ClientInfo: &ClientInfo{
450+
ClientInfo: &clientcontext.ClientInfo{
450451
DeviceID: "test-device-final",
451452
CountryCode: "US",
452453
Platform: "ios",
@@ -503,7 +504,7 @@ func TestDataCapSidecarUnreachable(t *testing.T) {
503504
config := ConnConfig{
504505
Conn: mockConn,
505506
Client: client,
506-
ClientInfo: &ClientInfo{
507+
ClientInfo: &clientcontext.ClientInfo{
507508
DeviceID: "test-device",
508509
},
509510
Logger: noopLogger,
@@ -555,7 +556,7 @@ func TestDataCapSidecarReturnsError(t *testing.T) {
555556
config := ConnConfig{
556557
Conn: mockConn,
557558
Client: client,
558-
ClientInfo: &ClientInfo{
559+
ClientInfo: &clientcontext.ClientInfo{
559560
DeviceID: "test-device",
560561
},
561562
Logger: noopLogger,
@@ -586,7 +587,7 @@ func TestDataCapNilClient(t *testing.T) {
586587
config := ConnConfig{
587588
Conn: mockConn,
588589
Client: nil, // Datacap disabled
589-
ClientInfo: &ClientInfo{
590+
ClientInfo: &clientcontext.ClientInfo{
590591
DeviceID: "test-device",
591592
},
592593
Logger: noopLogger,
@@ -634,7 +635,7 @@ func TestDataCapZeroBytes(t *testing.T) {
634635
config := ConnConfig{
635636
Conn: mockConn,
636637
Client: client,
637-
ClientInfo: &ClientInfo{
638+
ClientInfo: &clientcontext.ClientInfo{
638639
DeviceID: "test-device",
639640
},
640641
Logger: noopLogger,
@@ -671,7 +672,7 @@ func TestDataCapConcurrentReadWrite(t *testing.T) {
671672
config := ConnConfig{
672673
Conn: mockConn,
673674
Client: client,
674-
ClientInfo: &ClientInfo{
675+
ClientInfo: &clientcontext.ClientInfo{
675676
DeviceID: "test-device",
676677
},
677678
Logger: noopLogger,
@@ -747,7 +748,7 @@ func TestDataCapMultipleClose(t *testing.T) {
747748
config := ConnConfig{
748749
Conn: mockConn,
749750
Client: client,
750-
ClientInfo: &ClientInfo{
751+
ClientInfo: &clientcontext.ClientInfo{
751752
DeviceID: "test-device",
752753
},
753754
Logger: noopLogger,
@@ -786,7 +787,7 @@ func TestDataCapThrottleDisableAfterEnable(t *testing.T) {
786787
config := ConnConfig{
787788
Conn: mockConn,
788789
Client: nil,
789-
ClientInfo: &ClientInfo{
790+
ClientInfo: &clientcontext.ClientInfo{
790791
DeviceID: "test-device",
791792
},
792793
Logger: noopLogger,
@@ -846,7 +847,7 @@ func TestDataCapEmptyDeviceID(t *testing.T) {
846847
config := ConnConfig{
847848
Conn: mockConn,
848849
Client: client,
849-
ClientInfo: &ClientInfo{
850+
ClientInfo: &clientcontext.ClientInfo{
850851
DeviceID: "", // Empty device ID
851852
},
852853
Logger: noopLogger,
@@ -891,7 +892,7 @@ func TestDataCapLargeDataTransfer(t *testing.T) {
891892
config := ConnConfig{
892893
Conn: mockConn,
893894
Client: client,
894-
ClientInfo: &ClientInfo{
895+
ClientInfo: &clientcontext.ClientInfo{
895896
DeviceID: "test-device",
896897
},
897898
Logger: noopLogger,
@@ -946,7 +947,7 @@ func TestDataCapRapidOpenClose(t *testing.T) {
946947
config := ConnConfig{
947948
Conn: mockConn,
948949
Client: client,
949-
ClientInfo: &ClientInfo{
950+
ClientInfo: &clientcontext.ClientInfo{
950951
DeviceID: "test-device",
951952
},
952953
Logger: noopLogger,
@@ -999,7 +1000,7 @@ func TestDataCapStatusCheckAfterReport(t *testing.T) {
9991000
config := ConnConfig{
10001001
Conn: mockConn,
10011002
Client: client,
1002-
ClientInfo: &ClientInfo{
1003+
ClientInfo: &clientcontext.ClientInfo{
10031004
DeviceID: "test-device",
10041005
},
10051006
Logger: noopLogger,
@@ -1055,7 +1056,7 @@ func TestDataCapDifferentPlatforms(t *testing.T) {
10551056
config := ConnConfig{
10561057
Conn: mockConn,
10571058
Client: client,
1058-
ClientInfo: &ClientInfo{
1059+
ClientInfo: &clientcontext.ClientInfo{
10591060
DeviceID: "test-device",
10601061
Platform: platform,
10611062
},
@@ -1110,7 +1111,7 @@ func TestDataCapCountryCodeVariations(t *testing.T) {
11101111
config := ConnConfig{
11111112
Conn: mockConn,
11121113
Client: client,
1113-
ClientInfo: &ClientInfo{
1114+
ClientInfo: &clientcontext.ClientInfo{
11141115
DeviceID: "test-device",
11151116
CountryCode: code,
11161117
},
@@ -1150,7 +1151,7 @@ func TestDataCapReadWriteErrors(t *testing.T) {
11501151
config := ConnConfig{
11511152
Conn: mockConn,
11521153
Client: client,
1153-
ClientInfo: &ClientInfo{
1154+
ClientInfo: &clientcontext.ClientInfo{
11541155
DeviceID: "test-device",
11551156
},
11561157
Logger: noopLogger,
@@ -1201,7 +1202,7 @@ func TestDataCapContextCancellation(t *testing.T) {
12011202
config := ConnConfig{
12021203
Conn: mockConn,
12031204
Client: client,
1204-
ClientInfo: &ClientInfo{
1205+
ClientInfo: &clientcontext.ClientInfo{
12051206
DeviceID: "test-device",
12061207
},
12071208
Logger: noopLogger,

tracker/datacap/packet_conn.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"sync/atomic"
77
"time"
88

9+
"github.com/getlantern/lantern-box/tracker/clientcontext"
910
"github.com/sagernet/sing-box/log"
1011
"github.com/sagernet/sing/common/buf"
1112
M "github.com/sagernet/sing/common/metadata"
@@ -20,7 +21,7 @@ type PacketConn struct {
2021
client *Client
2122
logger log.ContextLogger
2223

23-
clientInfo *ClientInfo
24+
clientInfo *clientcontext.ClientInfo
2425

2526
// Atomic counters for thread-safe tracking
2627
bytesSent atomic.Int64
@@ -42,7 +43,7 @@ type PacketConnConfig struct {
4243
Conn N.PacketConn
4344
Client *Client
4445
Logger log.ContextLogger
45-
ClientInfo *ClientInfo
46+
ClientInfo *clientcontext.ClientInfo
4647
ReportInterval time.Duration
4748
EnableThrottling bool
4849
ThrottleSpeed int64

tracker/datacap/tracker.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"net"
66
"time"
77

8+
"github.com/getlantern/lantern-box/tracker/clientcontext"
89
"github.com/sagernet/sing-box/adapter"
910
"github.com/sagernet/sing-box/log"
1011
E "github.com/sagernet/sing/common/exceptions"
@@ -14,15 +15,6 @@ import (
1415

1516
var _ (adapter.ConnectionTracker) = (*DatacapTracker)(nil)
1617

17-
// placeholder until the contect tracker pr is merged
18-
type ClientInfo struct {
19-
DeviceID string
20-
Platform string
21-
IsPro bool
22-
CountryCode string
23-
Version string
24-
}
25-
2618
type DatacapTracker struct {
2719
client *Client
2820
logger log.ContextLogger
@@ -70,11 +62,14 @@ func NewDatacapTracker(options Options, logger log.ContextLogger) (*DatacapTrack
7062
}
7163

7264
func (t *DatacapTracker) RoutedConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext, matchedRule adapter.Rule, matchOutbound adapter.Outbound) net.Conn {
73-
info := service.PtrFromContext[ClientInfo](ctx)
65+
info := service.PtrFromContext[clientcontext.ClientInfo](ctx)
7466
if info == nil {
7567
t.logger.Warn("ClientInfo not found in context")
7668
return conn
7769
}
70+
if info.IsPro {
71+
return conn
72+
}
7873
return NewConn(ConnConfig{
7974
Conn: conn,
8075
Client: t.client,
@@ -86,11 +81,14 @@ func (t *DatacapTracker) RoutedConnection(ctx context.Context, conn net.Conn, me
8681
})
8782
}
8883
func (t *DatacapTracker) RoutedPacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext, matchedRule adapter.Rule, matchOutbound adapter.Outbound) N.PacketConn {
89-
info := service.PtrFromContext[ClientInfo](ctx)
84+
info := service.PtrFromContext[clientcontext.ClientInfo](ctx)
9085
if info == nil {
9186
t.logger.Warn("ClientInfo not found in context")
9287
return conn
9388
}
89+
if info.IsPro {
90+
return conn
91+
}
9492
return NewPacketConn(PacketConnConfig{
9593
Conn: conn,
9694
Client: t.client,

0 commit comments

Comments
 (0)