1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-11-17 09:56:18 -05:00
v2fly/shell/point/config_json.go

211 lines
6.0 KiB
Go
Raw Normal View History

2016-01-17 15:43:10 -05:00
// +build json
package point
import (
"encoding/json"
2016-05-29 10:37:52 -04:00
"errors"
2016-01-17 15:43:10 -05:00
"io/ioutil"
"os"
"strings"
2016-05-16 03:25:34 -04:00
"github.com/v2ray/v2ray-core/app/dns"
2016-01-17 15:43:10 -05:00
"github.com/v2ray/v2ray-core/app/router"
"github.com/v2ray/v2ray-core/common/log"
v2net "github.com/v2ray/v2ray-core/common/net"
2016-06-01 19:49:25 -04:00
"github.com/v2ray/v2ray-core/transport"
2016-01-17 15:43:10 -05:00
)
const (
DefaultRefreshMinute = int(9999)
)
2016-01-17 15:43:10 -05:00
func (this *Config) UnmarshalJSON(data []byte) error {
type JsonConfig struct {
Port v2net.Port `json:"port"` // Port of this Point server.
2016-05-29 10:37:52 -04:00
ListenOn *v2net.AddressJson `json:"listen"`
2016-01-17 15:43:10 -05:00
LogConfig *LogConfig `json:"log"`
RouterConfig *router.Config `json:"routing"`
2016-05-16 03:25:34 -04:00
DNSConfig *dns.Config `json:"dns"`
2016-01-17 15:43:10 -05:00
InboundConfig *ConnectionConfig `json:"inbound"`
OutboundConfig *ConnectionConfig `json:"outbound"`
InboundDetours []*InboundDetourConfig `json:"inboundDetour"`
OutboundDetours []*OutboundDetourConfig `json:"outboundDetour"`
2016-06-01 19:49:25 -04:00
Transport *transport.Config `json:"transport"`
2016-01-17 15:43:10 -05:00
}
jsonConfig := new(JsonConfig)
if err := json.Unmarshal(data, jsonConfig); err != nil {
return err
}
this.Port = jsonConfig.Port
2016-05-29 10:37:52 -04:00
this.ListenOn = v2net.AnyIP
if jsonConfig.ListenOn != nil {
if jsonConfig.ListenOn.Address.IsDomain() {
return errors.New("Point: Unable to listen on domain address: " + jsonConfig.ListenOn.Address.Domain())
}
this.ListenOn = jsonConfig.ListenOn.Address
}
2016-01-17 15:43:10 -05:00
this.LogConfig = jsonConfig.LogConfig
this.RouterConfig = jsonConfig.RouterConfig
this.InboundConfig = jsonConfig.InboundConfig
this.OutboundConfig = jsonConfig.OutboundConfig
this.InboundDetours = jsonConfig.InboundDetours
this.OutboundDetours = jsonConfig.OutboundDetours
2016-05-16 12:05:01 -04:00
if jsonConfig.DNSConfig == nil {
jsonConfig.DNSConfig = &dns.Config{
NameServers: []v2net.Destination{
v2net.UDPDestination(v2net.DomainAddress("localhost"), v2net.Port(53)),
},
}
}
2016-05-16 03:25:34 -04:00
this.DNSConfig = jsonConfig.DNSConfig
2016-06-01 19:49:25 -04:00
this.TransportConfig = jsonConfig.Transport
2016-01-17 15:43:10 -05:00
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
2016-04-29 05:36:27 -04:00
case "none":
this.LogLevel = log.NoneLevel
2016-01-17 15:43:10 -05:00
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"`
2016-01-17 15:43:10 -05:00
}
jsonConfig := new(JsonInboundDetourAllocationConfig)
if err := json.Unmarshal(data, jsonConfig); err != nil {
return err
}
this.Strategy = jsonConfig.Strategy
this.Concurrency = jsonConfig.Concurrency
this.Refresh = jsonConfig.RefreshMin
2016-02-04 05:43:04 -05:00
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
}
2016-01-17 15:43:10 -05:00
return nil
}
func (this *InboundDetourConfig) UnmarshalJSON(data []byte) error {
type JsonInboundDetourConfig struct {
Protocol string `json:"protocol"`
PortRange *v2net.PortRange `json:"port"`
2016-05-29 10:37:52 -04:00
ListenOn *v2net.AddressJson `json:"listen"`
2016-01-17 15:43:10 -05:00
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.")
2016-01-30 06:23:56 -05:00
return ErrorBadConfiguration
2016-01-17 15:43:10 -05:00
}
2016-05-29 10:37:52 -04:00
this.ListenOn = v2net.AnyIP
if jsonConfig.ListenOn != nil {
if jsonConfig.ListenOn.Address.IsDomain() {
return errors.New("Point: Unable to listen on domain address: " + jsonConfig.ListenOn.Address.Domain())
}
this.ListenOn = jsonConfig.ListenOn.Address
}
2016-01-17 15:43:10 -05:00
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,
}
}
2016-01-17 15:43:10 -05:00
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 {
2016-01-18 06:24:33 -05:00
log.Error("Failed to read server config file (", file, "): ", file, err)
2016-01-17 15:43:10 -05:00
return nil, err
}
jsonConfig := &Config{}
err = json.Unmarshal(rawConfig, jsonConfig)
if err != nil {
2016-01-18 06:24:33 -05:00
log.Error("Failed to load server config: ", err)
2016-01-17 15:43:10 -05:00
return nil, err
}
return jsonConfig, err
}
func init() {
configLoader = JsonLoadConfig
}