| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 | 
							- // +build json
 
- package point
 
- import (
 
- 	"encoding/json"
 
- 	"errors"
 
- 	"io/ioutil"
 
- 	"os"
 
- 	"strings"
 
- 	"github.com/v2ray/v2ray-core/app/dns"
 
- 	"github.com/v2ray/v2ray-core/app/router"
 
- 	"github.com/v2ray/v2ray-core/common"
 
- 	"github.com/v2ray/v2ray-core/common/log"
 
- 	v2net "github.com/v2ray/v2ray-core/common/net"
 
- 	"github.com/v2ray/v2ray-core/transport"
 
- 	"github.com/v2ray/v2ray-core/transport/internet"
 
- )
 
- const (
 
- 	DefaultRefreshMinute = int(9999)
 
- )
 
- 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"`
 
- 		DNSConfig       *dns.Config               `json:"dns"`
 
- 		InboundConfig   *InboundConnectionConfig  `json:"inbound"`
 
- 		OutboundConfig  *OutboundConnectionConfig `json:"outbound"`
 
- 		InboundDetours  []*InboundDetourConfig    `json:"inboundDetour"`
 
- 		OutboundDetours []*OutboundDetourConfig   `json:"outboundDetour"`
 
- 		Transport       *transport.Config         `json:"transport"`
 
- 	}
 
- 	jsonConfig := new(JsonConfig)
 
- 	if err := json.Unmarshal(data, jsonConfig); err != nil {
 
- 		return errors.New("Point: Failed to parse config: " + err.Error())
 
- 	}
 
- 	this.Port = jsonConfig.Port
 
- 	this.LogConfig = jsonConfig.LogConfig
 
- 	this.RouterConfig = jsonConfig.RouterConfig
 
- 	if jsonConfig.InboundConfig == nil {
 
- 		return errors.New("Point: Inbound config is not specified.")
 
- 	}
 
- 	this.InboundConfig = jsonConfig.InboundConfig
 
- 	if jsonConfig.OutboundConfig == nil {
 
- 		return errors.New("Point: Outbound config is not specified.")
 
- 	}
 
- 	this.OutboundConfig = jsonConfig.OutboundConfig
 
- 	this.InboundDetours = jsonConfig.InboundDetours
 
- 	this.OutboundDetours = jsonConfig.OutboundDetours
 
- 	if jsonConfig.DNSConfig == nil {
 
- 		jsonConfig.DNSConfig = &dns.Config{
 
- 			NameServers: []v2net.Destination{
 
- 				v2net.UDPDestination(v2net.DomainAddress("localhost"), v2net.Port(53)),
 
- 			},
 
- 		}
 
- 	}
 
- 	this.DNSConfig = jsonConfig.DNSConfig
 
- 	this.TransportConfig = jsonConfig.Transport
 
- 	return nil
 
- }
 
- func (this *InboundConnectionConfig) UnmarshalJSON(data []byte) error {
 
- 	type JsonConfig struct {
 
- 		Port          uint16                   `json:"port"`
 
- 		Listen        *v2net.AddressJson       `json:"listen"`
 
- 		Protocol      string                   `json:"protocol"`
 
- 		StreamSetting *internet.StreamSettings `json:"streamSettings"`
 
- 		Settings      json.RawMessage          `json:"settings"`
 
- 		AllowPassive  bool                     `json:"allowPassive"`
 
- 	}
 
- 	jsonConfig := new(JsonConfig)
 
- 	if err := json.Unmarshal(data, jsonConfig); err != nil {
 
- 		return errors.New("Point: Failed to parse inbound config: " + err.Error())
 
- 	}
 
- 	this.Port = v2net.Port(jsonConfig.Port)
 
- 	this.ListenOn = v2net.AnyIP
 
- 	if jsonConfig.Listen != nil {
 
- 		if jsonConfig.Listen.Address.Family().IsDomain() {
 
- 			return errors.New("Point: Unable to listen on domain address: " + jsonConfig.Listen.Address.Domain())
 
- 		}
 
- 		this.ListenOn = jsonConfig.Listen.Address
 
- 	}
 
- 	if jsonConfig.StreamSetting != nil {
 
- 		this.StreamSettings = jsonConfig.StreamSetting
 
- 	}
 
- 	this.Protocol = jsonConfig.Protocol
 
- 	this.Settings = jsonConfig.Settings
 
- 	this.AllowPassiveConnection = jsonConfig.AllowPassive
 
- 	return nil
 
- }
 
- func (this *OutboundConnectionConfig) UnmarshalJSON(data []byte) error {
 
- 	type JsonConnectionConfig struct {
 
- 		Protocol      string                   `json:"protocol"`
 
- 		SendThrough   *v2net.AddressJson       `json:"sendThrough"`
 
- 		StreamSetting *internet.StreamSettings `json:"streamSettings"`
 
- 		Settings      json.RawMessage          `json:"settings"`
 
- 	}
 
- 	jsonConfig := new(JsonConnectionConfig)
 
- 	if err := json.Unmarshal(data, jsonConfig); err != nil {
 
- 		return errors.New("Point: Failed to parse outbound config: " + err.Error())
 
- 	}
 
- 	this.Protocol = jsonConfig.Protocol
 
- 	this.Settings = jsonConfig.Settings
 
- 	if jsonConfig.SendThrough != nil {
 
- 		address := jsonConfig.SendThrough.Address
 
- 		if address.Family().IsDomain() {
 
- 			return errors.New("Point: Unable to send through: " + address.String())
 
- 		}
 
- 		this.SendThrough = address
 
- 	}
 
- 	if jsonConfig.StreamSetting != nil {
 
- 		this.StreamSettings = jsonConfig.StreamSetting
 
- 	}
 
- 	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 errors.New("Point: Failed to parse log config: " + err.Error())
 
- 	}
 
- 	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
 
- 	case "none":
 
- 		this.LogLevel = log.NoneLevel
 
- 	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"`
 
- 		RefreshMin  int    `json:"refresh"`
 
- 	}
 
- 	jsonConfig := new(JsonInboundDetourAllocationConfig)
 
- 	if err := json.Unmarshal(data, jsonConfig); err != nil {
 
- 		return errors.New("Point: Failed to parse inbound detour allocation config: " + err.Error())
 
- 	}
 
- 	this.Strategy = jsonConfig.Strategy
 
- 	this.Concurrency = jsonConfig.Concurrency
 
- 	this.Refresh = jsonConfig.RefreshMin
 
- 	if this.Strategy == AllocationStrategyRandom {
 
- 		if this.Refresh == 0 {
 
- 			this.Refresh = 5
 
- 		}
 
- 		if this.Concurrency == 0 {
 
- 			this.Concurrency = 3
 
- 		}
 
- 	}
 
- 	if this.Refresh == 0 {
 
- 		this.Refresh = DefaultRefreshMinute
 
- 	}
 
- 	return nil
 
- }
 
- func (this *InboundDetourConfig) UnmarshalJSON(data []byte) error {
 
- 	type JsonInboundDetourConfig struct {
 
- 		Protocol      string                         `json:"protocol"`
 
- 		PortRange     *v2net.PortRange               `json:"port"`
 
- 		ListenOn      *v2net.AddressJson             `json:"listen"`
 
- 		Settings      json.RawMessage                `json:"settings"`
 
- 		Tag           string                         `json:"tag"`
 
- 		Allocation    *InboundDetourAllocationConfig `json:"allocate"`
 
- 		StreamSetting *internet.StreamSettings       `json:"streamSettings"`
 
- 		AllowPassive  bool                           `json:"allowPassive"`
 
- 	}
 
- 	jsonConfig := new(JsonInboundDetourConfig)
 
- 	if err := json.Unmarshal(data, jsonConfig); err != nil {
 
- 		return errors.New("Point: Failed to parse inbound detour config: " + err.Error())
 
- 	}
 
- 	if jsonConfig.PortRange == nil {
 
- 		log.Error("Point: Port range not specified in InboundDetour.")
 
- 		return common.ErrBadConfiguration
 
- 	}
 
- 	this.ListenOn = v2net.AnyIP
 
- 	if jsonConfig.ListenOn != nil {
 
- 		if jsonConfig.ListenOn.Address.Family().IsDomain() {
 
- 			return errors.New("Point: Unable to listen on domain address: " + jsonConfig.ListenOn.Address.Domain())
 
- 		}
 
- 		this.ListenOn = jsonConfig.ListenOn.Address
 
- 	}
 
- 	this.Protocol = jsonConfig.Protocol
 
- 	this.PortRange = *jsonConfig.PortRange
 
- 	this.Settings = jsonConfig.Settings
 
- 	this.Tag = jsonConfig.Tag
 
- 	this.Allocation = jsonConfig.Allocation
 
- 	if this.Allocation == nil {
 
- 		this.Allocation = &InboundDetourAllocationConfig{
 
- 			Strategy: AllocationStrategyAlways,
 
- 			Refresh:  DefaultRefreshMinute,
 
- 		}
 
- 	}
 
- 	if jsonConfig.StreamSetting != nil {
 
- 		this.StreamSettings = jsonConfig.StreamSetting
 
- 	}
 
- 	this.AllowPassiveConnection = jsonConfig.AllowPassive
 
- 	return nil
 
- }
 
- func (this *OutboundDetourConfig) UnmarshalJSON(data []byte) error {
 
- 	type JsonOutboundDetourConfig struct {
 
- 		Protocol      string                   `json:"protocol"`
 
- 		SendThrough   *v2net.AddressJson       `json:"sendThrough"`
 
- 		Tag           string                   `json:"tag"`
 
- 		Settings      json.RawMessage          `json:"settings"`
 
- 		StreamSetting *internet.StreamSettings `json:"streamSettings"`
 
- 	}
 
- 	jsonConfig := new(JsonOutboundDetourConfig)
 
- 	if err := json.Unmarshal(data, jsonConfig); err != nil {
 
- 		return errors.New("Point: Failed to parse outbound detour config: " + err.Error())
 
- 	}
 
- 	this.Protocol = jsonConfig.Protocol
 
- 	this.Tag = jsonConfig.Tag
 
- 	this.Settings = jsonConfig.Settings
 
- 	if jsonConfig.SendThrough != nil {
 
- 		address := jsonConfig.SendThrough.Address
 
- 		if address.Family().IsDomain() {
 
- 			return errors.New("Point: Unable to send through: " + address.String())
 
- 		}
 
- 		this.SendThrough = address
 
- 	}
 
- 	if jsonConfig.StreamSetting != nil {
 
- 		this.StreamSettings = jsonConfig.StreamSetting
 
- 	}
 
- 	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
 
- }
 
 
  |