| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | // +build jsonpackage pointimport (	"encoding/json"	"io/ioutil"	"os"	"strings"	"github.com/v2ray/v2ray-core/app/router"	"github.com/v2ray/v2ray-core/common/log"	v2net "github.com/v2ray/v2ray-core/common/net")func (this *Config) UnmarshalJSON(data []byte) error {	type JsonConfig struct {		Port            v2net.Port              `json:"port"` // Port of this Point server.		LogConfig       *LogConfig              `json:"log"`		RouterConfig    *router.Config          `json:"routing"`		InboundConfig   *ConnectionConfig       `json:"inbound"`		OutboundConfig  *ConnectionConfig       `json:"outbound"`		InboundDetours  []*InboundDetourConfig  `json:"inboundDetour"`		OutboundDetours []*OutboundDetourConfig `json:"outboundDetour"`	}	jsonConfig := new(JsonConfig)	if err := json.Unmarshal(data, jsonConfig); err != nil {		return err	}	this.Port = jsonConfig.Port	this.LogConfig = jsonConfig.LogConfig	this.RouterConfig = jsonConfig.RouterConfig	this.InboundConfig = jsonConfig.InboundConfig	this.OutboundConfig = jsonConfig.OutboundConfig	this.InboundDetours = jsonConfig.InboundDetours	this.OutboundDetours = jsonConfig.OutboundDetours	return nil}func (this *ConnectionConfig) UnmarshalJSON(data []byte) error {	type JsonConnectionConfig struct {		Protocol string          `json:"protocol"`		Settings json.RawMessage `json:"settings"`	}	jsonConfig := new(JsonConnectionConfig)	if err := json.Unmarshal(data, jsonConfig); err != nil {		return err	}	this.Protocol = jsonConfig.Protocol	this.Settings = jsonConfig.Settings	return nil}func (this *LogConfig) UnmarshalJSON(data []byte) error {	type JsonLogConfig struct {		AccessLog string `json:"access"`		ErrorLog  string `json:"error"`		LogLevel  string `json:"loglevel"`	}	jsonConfig := new(JsonLogConfig)	if err := json.Unmarshal(data, jsonConfig); err != nil {		return err	}	this.AccessLog = jsonConfig.AccessLog	this.ErrorLog = jsonConfig.ErrorLog	level := strings.ToLower(jsonConfig.LogLevel)	switch level {	case "debug":		this.LogLevel = log.DebugLevel	case "info":		this.LogLevel = log.InfoLevel	case "error":		this.LogLevel = log.ErrorLevel	default:		this.LogLevel = log.WarningLevel	}	return nil}func (this *InboundDetourAllocationConfig) UnmarshalJSON(data []byte) error {	type JsonInboundDetourAllocationConfig struct {		Strategy    string `json:"strategy"`		Concurrency int    `json:"concurrency"`		RefreshSec  int    `json:"refresh"`	}	jsonConfig := new(JsonInboundDetourAllocationConfig)	if err := json.Unmarshal(data, jsonConfig); err != nil {		return err	}	this.Strategy = jsonConfig.Strategy	this.Concurrency = jsonConfig.Concurrency	this.Refresh = jsonConfig.RefreshSec	return nil}func (this *InboundDetourConfig) UnmarshalJSON(data []byte) error {	type JsonInboundDetourConfig struct {		Protocol   string                         `json:"protocol"`		PortRange  *v2net.PortRange               `json:"port"`		Settings   json.RawMessage                `json:"settings"`		Tag        string                         `json:"tag"`		Allocation *InboundDetourAllocationConfig `json:"allocate"`	}	jsonConfig := new(JsonInboundDetourConfig)	if err := json.Unmarshal(data, jsonConfig); err != nil {		return err	}	if jsonConfig.PortRange == nil {		log.Error("Point: Port range not specified in InboundDetour.")		return BadConfiguration	}	this.Protocol = jsonConfig.Protocol	this.PortRange = *jsonConfig.PortRange	this.Settings = jsonConfig.Settings	this.Tag = jsonConfig.Tag	this.Allocation = jsonConfig.Allocation	return nil}func (this *OutboundDetourConfig) UnmarshalJSON(data []byte) error {	type JsonOutboundDetourConfig struct {		Protocol string          `json:"protocol"`		Tag      string          `json:"tag"`		Settings json.RawMessage `json:"settings"`	}	jsonConfig := new(JsonOutboundDetourConfig)	if err := json.Unmarshal(data, jsonConfig); err != nil {		return err	}	this.Protocol = jsonConfig.Protocol	this.Tag = jsonConfig.Tag	this.Settings = jsonConfig.Settings	return nil}func JsonLoadConfig(file string) (*Config, error) {	fixedFile := os.ExpandEnv(file)	rawConfig, err := ioutil.ReadFile(fixedFile)	if err != nil {		log.Error("Failed to read server config file (", file, "): ", file, err)		return nil, err	}	jsonConfig := &Config{}	err = json.Unmarshal(rawConfig, jsonConfig)	if err != nil {		log.Error("Failed to load server config: ", err)		return nil, err	}	return jsonConfig, err}func init() {	configLoader = JsonLoadConfig}
 |