Browse Source

add V4 json support for observer tag config

Shelikhoo 4 years ago
parent
commit
2dc539cc70
3 changed files with 68 additions and 0 deletions
  1. 47 0
      infra/conf/observatory.go
  2. 12 0
      infra/conf/router_strategy.go
  3. 9 0
      infra/conf/v2ray.go

+ 47 - 0
infra/conf/observatory.go

@@ -1,8 +1,11 @@
 package conf
 
 import (
+	"encoding/json"
 	"github.com/golang/protobuf/proto"
 	"github.com/v2fly/v2ray-core/v4/app/observatory/burst"
+	"github.com/v2fly/v2ray-core/v4/app/observatory/multiObservatory"
+	"github.com/v2fly/v2ray-core/v4/common/serial"
 
 	"github.com/v2fly/v2ray-core/v4/app/observatory"
 	"github.com/v2fly/v2ray-core/v4/infra/conf/cfgcommon/duration"
@@ -31,3 +34,47 @@ func (b BurstObservatoryConfig) Build() (proto.Message, error) {
 		return nil, err
 	}
 }
+
+type MultiObservatoryItem struct {
+	MemberType string          `json:"type"`
+	Tag        string          `json:"tag"`
+	Value      json.RawMessage `json:"settings"`
+}
+
+type MultiObservatoryConfig struct {
+	Observers []MultiObservatoryItem `json:"observers"`
+}
+
+func (o *MultiObservatoryConfig) Build() (proto.Message, error) {
+	ret := &multiObservatory.Config{}
+	for _, v := range o.Observers {
+		switch v.MemberType {
+		case "burst":
+			var burstObservatoryConfig BurstObservatoryConfig
+			err := json.Unmarshal(v.Value, &burstObservatoryConfig)
+			if err != nil {
+				return nil, err
+			}
+			burstObservatoryConfigPb, err := burstObservatoryConfig.Build()
+			if err != nil {
+				return nil, err
+			}
+			ret.Holders.Features[v.Tag] = serial.ToTypedMessage(burstObservatoryConfigPb)
+			break
+		case "default":
+			fallthrough
+		default:
+			var observatoryConfig ObservatoryConfig
+			err := json.Unmarshal(v.Value, &observatoryConfig)
+			if err != nil {
+				return nil, err
+			}
+			observatoryConfigPb, err := observatoryConfig.Build()
+			if err != nil {
+				return nil, err
+			}
+			ret.Holders.Features[v.Tag] = serial.ToTypedMessage(observatoryConfigPb)
+		}
+	}
+	return ret, nil
+}

+ 12 - 0
infra/conf/router_strategy.go

@@ -17,6 +17,7 @@ var (
 	strategyConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{
 		strategyRandom:    func() interface{} { return new(strategyEmptyConfig) },
 		strategyLeastLoad: func() interface{} { return new(strategyLeastLoadConfig) },
+		strategyLeastPing: func() interface{} { return new(strategyLeastPingConfig) },
 	}, "type", "settings")
 )
 
@@ -38,6 +39,8 @@ type strategyLeastLoadConfig struct {
 	MaxRTT Duration `json:"maxRTT,omitempty"`
 	// acceptable failure rate
 	Tolerance float64 `json:"tolerance,omitempty"`
+
+	ObserverTag string `json:"observerTag,omitempty"`
 }
 
 // healthCheckSettings holds settings for health Checker
@@ -64,6 +67,7 @@ func (v *strategyLeastLoadConfig) Build() (proto.Message, error) {
 	config := &router.StrategyLeastLoadConfig{}
 	config.Costs = v.Costs
 	config.Tolerance = float32(v.Tolerance)
+	config.ObserverTag = v.ObserverTag
 	if config.Tolerance < 0 {
 		config.Tolerance = 0
 	}
@@ -87,3 +91,11 @@ func (v *strategyLeastLoadConfig) Build() (proto.Message, error) {
 	}
 	return config, nil
 }
+
+type strategyLeastPingConfig struct {
+	ObserverTag string `json:"observerTag,omitempty"`
+}
+
+func (s strategyLeastPingConfig) Build() (proto.Message, error) {
+	return &router.StrategyLeastPingConfig{ObserverTag: s.ObserverTag}, nil
+}

+ 9 - 0
infra/conf/v2ray.go

@@ -352,6 +352,7 @@ type Config struct {
 	BrowserForwarder *BrowserForwarderConfig `json:"browserForwarder"`
 	Observatory      *ObservatoryConfig      `json:"observatory"`
 	BurstObservatory *BurstObservatoryConfig `json:"burstObservatory"`
+	MultiObservatory *MultiObservatoryConfig `json:"multiObservatory"`
 
 	Services map[string]*json.RawMessage `json:"services"`
 }
@@ -500,6 +501,14 @@ func (c *Config) Build() (*core.Config, error) {
 		config.App = append(config.App, serial.ToTypedMessage(r))
 	}
 
+	if c.MultiObservatory != nil {
+		r, err := c.MultiObservatory.Build()
+		if err != nil {
+			return nil, err
+		}
+		config.App = append(config.App, serial.ToTypedMessage(r))
+	}
+
 	// Load Additional Services that do not have a json translator
 
 	if msg, err := c.BuildServices(c.Services); err != nil {