Explorar el Código

Propagate DCOverrides

tags/v2.1.9^2
9seconds hace 2 meses
padre
commit
836a481026

+ 1
- 0
go.mod Ver fichero

@@ -29,6 +29,7 @@ require (
29 29
 
30 30
 require (
31 31
 	github.com/gotd/td v0.139.0
32
+	github.com/pelletier/go-toml/v2 v2.2.4
32 33
 	github.com/txthinking/socks5 v0.0.0-20251011041537-5c31f201a10e
33 34
 	github.com/yl2chen/cidranger v1.0.2
34 35
 )

+ 2
- 0
go.sum Ver fichero

@@ -88,6 +88,8 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR
88 88
 github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
89 89
 github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
90 90
 github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
91
+github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
92
+github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
91 93
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
92 94
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
93 95
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=

+ 9
- 0
internal/cli/run_proxy.go Ver fichero

@@ -240,6 +240,14 @@ func runProxy(conf *config.Config, version string) error { //nolint: funlen
240 240
 		return fmt.Errorf("cannot build ip allowlist: %w", err)
241 241
 	}
242 242
 
243
+	dcOverrides := map[int][]string{}
244
+	for _, override := range conf.DCOverrides {
245
+		dcid := override.DC.Get()
246
+		for _, addr := range override.IPs {
247
+			dcOverrides[dcid] = append(dcOverrides[dcid], addr.Get(""))
248
+		}
249
+	}
250
+
243 251
 	opts := mtglib.ProxyOpts{
244 252
 		Logger:          logger,
245 253
 		Network:         ntw,
@@ -254,6 +262,7 @@ func runProxy(conf *config.Config, version string) error { //nolint: funlen
254 262
 
255 263
 		AllowFallbackOnUnknownDC: conf.AllowFallbackOnUnknownDC.Get(false),
256 264
 		TolerateTimeSkewness:     conf.TolerateTimeSkewness.Value,
265
+		DCOverrides:              dcOverrides,
257 266
 	}
258 267
 
259 268
 	proxy, err := mtglib.NewProxy(opts)

+ 4
- 0
internal/config/config.go Ver fichero

@@ -64,6 +64,10 @@ type Config struct {
64 64
 			MetricPrefix TypeMetricPrefix `json:"metricPrefix"`
65 65
 		} `json:"prometheus"`
66 66
 	} `json:"stats"`
67
+	DCOverrides []struct {
68
+		DC  TypeDC
69
+		IPs []TypeHostPort `json:"ips"`
70
+	} `json:"dc_overrides"`
67 71
 }
68 72
 
69 73
 func (c *Config) Validate() error {

+ 5
- 1
internal/config/parse.go Ver fichero

@@ -5,7 +5,7 @@ import (
5 5
 	"encoding/json"
6 6
 	"fmt"
7 7
 
8
-	"github.com/pelletier/go-toml"
8
+	"github.com/pelletier/go-toml/v2"
9 9
 )
10 10
 
11 11
 type tomlConfig struct {
@@ -59,6 +59,10 @@ type tomlConfig struct {
59 59
 			MetricPrefix string `toml:"metric-prefix" json:"metricPrefix,omitempty"`
60 60
 		} `toml:"prometheus" json:"prometheus,omitempty"`
61 61
 	} `toml:"stats" json:"stats,omitempty"`
62
+	DCOverrides []struct {
63
+		DC  int      `toml:"dc" json:"dc"`
64
+		IPs []string `toml:"ips" json:"ips"`
65
+	}
62 66
 }
63 67
 
64 68
 func Parse(rawData []byte) (*Config, error) {

+ 41
- 0
internal/config/type_dc.go Ver fichero

@@ -0,0 +1,41 @@
1
+package config
2
+
3
+import (
4
+	"fmt"
5
+	"strconv"
6
+)
7
+
8
+type TypeDC struct {
9
+	Value int
10
+}
11
+
12
+func (t *TypeDC) Set(value string) error {
13
+	parsed, err := strconv.ParseInt(value, 10, 16)
14
+	if err != nil {
15
+		return fmt.Errorf("cannot parse dc: %w", err)
16
+	}
17
+
18
+	if parsed < 0 {
19
+		parsed = -parsed
20
+	}
21
+
22
+	t.Value = int(parsed)
23
+
24
+	return nil
25
+}
26
+
27
+func (t *TypeDC) UnmarshalText(data []byte) error {
28
+	return t.Set(string(data))
29
+}
30
+
31
+func (t TypeDC) MarshalText() ([]byte, error) {
32
+	return []byte(t.String()), nil
33
+}
34
+
35
+func (t TypeDC) String() string {
36
+	return strconv.Itoa(t.Value)
37
+}
38
+
39
+func (t TypeDC) Get() int {
40
+	return t.Value
41
+}

+ 95
- 0
internal/config/type_dc_test.go Ver fichero

@@ -0,0 +1,95 @@
1
+package config_test
2
+
3
+import (
4
+	"encoding/json"
5
+	"testing"
6
+
7
+	"github.com/9seconds/mtg/v2/internal/config"
8
+	"github.com/stretchr/testify/assert"
9
+	"github.com/stretchr/testify/suite"
10
+)
11
+
12
+type typeDCTestStruct struct {
13
+	Value config.TypeDC `json:"value"`
14
+}
15
+
16
+type TypeDCTestSuite struct {
17
+	suite.Suite
18
+}
19
+
20
+func (suite *TypeDCTestSuite) TestUnmarshalFail() {
21
+	testData := []string{
22
+		"-1s",
23
+		"1202002020202",
24
+		"xxx",
25
+		"-11111111111111",
26
+		"",
27
+	}
28
+
29
+	for _, v := range testData {
30
+		data, err := json.Marshal(map[string]string{
31
+			"value": v,
32
+		})
33
+		suite.NoError(err)
34
+
35
+		suite.T().Run(v, func(t *testing.T) {
36
+			assert.Error(t, json.Unmarshal(data, &typeDCTestStruct{}))
37
+		})
38
+	}
39
+}
40
+
41
+func (suite *TypeDCTestSuite) TestUnmarshalOk() {
42
+	testData := map[string]int{
43
+		"1":   1,
44
+		"-1":  1,
45
+		"203": 203,
46
+	}
47
+
48
+	for value, expected := range testData {
49
+		data, err := json.Marshal(map[string]string{
50
+			"value": value,
51
+		})
52
+		suite.NoError(err)
53
+
54
+		suite.T().Run(value, func(t *testing.T) {
55
+			testStruct := &typeDCTestStruct{}
56
+
57
+			assert.NoError(t, json.Unmarshal(data, testStruct))
58
+			assert.Equal(t, expected, testStruct.Value.Value)
59
+			assert.Equal(t, expected, testStruct.Value.Get())
60
+		})
61
+	}
62
+}
63
+
64
+func (suite *TypeDCTestSuite) TestMarshalOk() {
65
+	testData := map[string]string{
66
+		"1":   "1",
67
+		"203": "203",
68
+	}
69
+
70
+	for k, v := range testData {
71
+		value := k
72
+		expected := v
73
+
74
+		suite.T().Run(value, func(t *testing.T) {
75
+			testStruct := &typeDCTestStruct{}
76
+
77
+			assert.NoError(t, testStruct.Value.Set(value))
78
+
79
+			data, err := json.Marshal(testStruct)
80
+			assert.NoError(t, err)
81
+
82
+			expectedJSON, err := json.Marshal(map[string]string{
83
+				"value": expected,
84
+			})
85
+			assert.NoError(t, err)
86
+
87
+			assert.JSONEq(t, string(expectedJSON), string(data))
88
+		})
89
+	}
90
+}
91
+
92
+func TestTypeDC(t *testing.T) {
93
+	t.Parallel()
94
+	suite.Run(t, &TypeDCTestSuite{})
95
+}

+ 1
- 5
mtglib/proxy.go Ver fichero

@@ -302,11 +302,7 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
302 302
 
303 303
 	logger := opts.getLogger("proxy")
304 304
 
305
-	tg, err := dc.New(
306
-		logger.Named("telegram"),
307
-		opts.getPreferIP(),
308
-		map[int][]string{},
309
-	) // TODO: propagate value
305
+	tg, err := dc.New(logger.Named("telegram"), opts.getPreferIP(), opts.DCOverrides)
310 306
 	if err != nil {
311 307
 		return nil, fmt.Errorf("cannot build telegram dc fetcher: %w", err)
312 308
 	}

+ 6
- 0
mtglib/proxy_opts.go Ver fichero

@@ -113,6 +113,12 @@ type ProxyOpts struct {
113 113
 	//
114 114
 	// OBSOLETE and DEPRECATED. Ignored.
115 115
 	UseTestDCs bool
116
+
117
+	// DCOverrides defines a set of IP addresses that should be used
118
+	// with a higher priority to those that are calculated somehow by mtg.
119
+	//
120
+	// This is an optional setting
121
+	DCOverrides map[int][]string
116 122
 }
117 123
 
118 124
 func (p ProxyOpts) valid() error {

Loading…
Cancelar
Guardar