|
|
@@ -5,9 +5,9 @@ import (
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
|
|
|
+ "v2ray.com/core/app/log"
|
|
|
"v2ray.com/core/app/router"
|
|
|
"v2ray.com/core/common/errors"
|
|
|
- "v2ray.com/core/app/log"
|
|
|
v2net "v2ray.com/core/common/net"
|
|
|
"v2ray.com/core/tools/geoip"
|
|
|
|
|
|
@@ -25,7 +25,7 @@ type RouterConfig struct {
|
|
|
|
|
|
func (v *RouterConfig) Build() (*router.Config, error) {
|
|
|
if v.Settings == nil {
|
|
|
- return nil, errors.New("Router settings is not specified.")
|
|
|
+ return nil, errors.New("Config: Router settings is not specified.")
|
|
|
}
|
|
|
config := new(router.Config)
|
|
|
|
|
|
@@ -39,7 +39,10 @@ func (v *RouterConfig) Build() (*router.Config, error) {
|
|
|
config.DomainStrategy = router.Config_IpIfNonMatch
|
|
|
}
|
|
|
for idx, rawRule := range settings.RuleList {
|
|
|
- rule := ParseRule(rawRule)
|
|
|
+ rule, err := ParseRule(rawRule)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
config.Rule[idx] = rule
|
|
|
}
|
|
|
return config, nil
|
|
|
@@ -50,7 +53,7 @@ type RouterRule struct {
|
|
|
OutboundTag string `json:"outboundTag"`
|
|
|
}
|
|
|
|
|
|
-func parseIP(s string) *router.CIDR {
|
|
|
+func parseIP(s string) (*router.CIDR, error) {
|
|
|
var addr, mask string
|
|
|
i := strings.Index(s, "/")
|
|
|
if i < 0 {
|
|
|
@@ -66,38 +69,35 @@ func parseIP(s string) *router.CIDR {
|
|
|
if len(mask) > 0 {
|
|
|
bits64, err := strconv.ParseUint(mask, 10, 32)
|
|
|
if err != nil {
|
|
|
- return nil
|
|
|
+ return nil, errors.Base(err).Message("Config: invalid network mask for router: ", mask)
|
|
|
}
|
|
|
bits = uint32(bits64)
|
|
|
}
|
|
|
if bits > 32 {
|
|
|
- log.Warning("Router: invalid network mask: ", bits)
|
|
|
- return nil
|
|
|
+ return nil, errors.New("Config: invalid network mask for router: ", bits)
|
|
|
}
|
|
|
return &router.CIDR{
|
|
|
Ip: []byte(ip.IP()),
|
|
|
Prefix: bits,
|
|
|
- }
|
|
|
+ }, nil
|
|
|
case v2net.AddressFamilyIPv6:
|
|
|
bits := uint32(128)
|
|
|
if len(mask) > 0 {
|
|
|
bits64, err := strconv.ParseUint(mask, 10, 32)
|
|
|
if err != nil {
|
|
|
- return nil
|
|
|
+ return nil, errors.Base(err).Message("Config: invalid network mask for router: ", mask)
|
|
|
}
|
|
|
bits = uint32(bits64)
|
|
|
}
|
|
|
if bits > 128 {
|
|
|
- log.Warning("Router: invalid network mask: ", bits)
|
|
|
- return nil
|
|
|
+ return nil, errors.New("Config: invalid network mask for router: ", bits)
|
|
|
}
|
|
|
return &router.CIDR{
|
|
|
Ip: []byte(ip.IP()),
|
|
|
Prefix: bits,
|
|
|
- }
|
|
|
+ }, nil
|
|
|
default:
|
|
|
- log.Warning("Router: unsupported address: ", s)
|
|
|
- return nil
|
|
|
+ return nil, errors.New("Config: unsupported address for router: ", s)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -137,10 +137,11 @@ func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) {
|
|
|
|
|
|
if rawFieldRule.IP != nil {
|
|
|
for _, ip := range *rawFieldRule.IP {
|
|
|
- ipRule := parseIP(ip)
|
|
|
- if ipRule != nil {
|
|
|
- rule.Cidr = append(rule.Cidr, ipRule)
|
|
|
+ ipRule, err := parseIP(ip)
|
|
|
+ if err != nil {
|
|
|
+ return nil, errors.Base(err).Message("Config: invalid IP: ", ip)
|
|
|
}
|
|
|
+ rule.Cidr = append(rule.Cidr, ipRule)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -154,10 +155,11 @@ func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) {
|
|
|
|
|
|
if rawFieldRule.SourceIP != nil {
|
|
|
for _, ip := range *rawFieldRule.SourceIP {
|
|
|
- ipRule := parseIP(ip)
|
|
|
- if ipRule != nil {
|
|
|
- rule.SourceCidr = append(rule.SourceCidr, ipRule)
|
|
|
+ ipRule, err := parseIP(ip)
|
|
|
+ if err != nil {
|
|
|
+ return nil, errors.Base(err).Message("Config: invalid IP: ", ip)
|
|
|
}
|
|
|
+ rule.SourceCidr = append(rule.SourceCidr, ipRule)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -176,52 +178,45 @@ func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) {
|
|
|
return rule, nil
|
|
|
}
|
|
|
|
|
|
-func ParseRule(msg json.RawMessage) *router.RoutingRule {
|
|
|
+func ParseRule(msg json.RawMessage) (*router.RoutingRule, error) {
|
|
|
rawRule := new(RouterRule)
|
|
|
err := json.Unmarshal(msg, rawRule)
|
|
|
if err != nil {
|
|
|
- log.Error("Router: Invalid router rule: ", err)
|
|
|
- return nil
|
|
|
+ return nil, errors.Base(err).Message("Config: Invalid router rule.")
|
|
|
}
|
|
|
if rawRule.Type == "field" {
|
|
|
-
|
|
|
fieldrule, err := parseFieldRule(msg)
|
|
|
if err != nil {
|
|
|
- log.Error("Invalid field rule: ", err)
|
|
|
- return nil
|
|
|
+ return nil, errors.Base(err).Message("Config: Invalid field rule.")
|
|
|
}
|
|
|
- return fieldrule
|
|
|
+ return fieldrule, nil
|
|
|
}
|
|
|
if rawRule.Type == "chinaip" {
|
|
|
chinaiprule, err := parseChinaIPRule(msg)
|
|
|
if err != nil {
|
|
|
- log.Error("Router: Invalid chinaip rule: ", err)
|
|
|
- return nil
|
|
|
+ return nil, errors.Base(err).Message("Config: Invalid chinaip rule.")
|
|
|
}
|
|
|
- return chinaiprule
|
|
|
+ return chinaiprule, nil
|
|
|
}
|
|
|
if rawRule.Type == "chinasites" {
|
|
|
chinasitesrule, err := parseChinaSitesRule(msg)
|
|
|
if err != nil {
|
|
|
- log.Error("Invalid chinasites rule: ", err)
|
|
|
- return nil
|
|
|
+ return nil, errors.Base(err).Message("Config: Invalid chinasites rule.")
|
|
|
}
|
|
|
- return chinasitesrule
|
|
|
+ return chinasitesrule, nil
|
|
|
}
|
|
|
- log.Error("Unknown router rule type: ", rawRule.Type)
|
|
|
- return nil
|
|
|
+ return nil, errors.New("Config: Unknown router rule type: ", rawRule.Type)
|
|
|
}
|
|
|
|
|
|
func parseChinaIPRule(data []byte) (*router.RoutingRule, error) {
|
|
|
rawRule := new(RouterRule)
|
|
|
err := json.Unmarshal(data, rawRule)
|
|
|
if err != nil {
|
|
|
- log.Error("Router: Invalid router rule: ", err)
|
|
|
- return nil, err
|
|
|
+ return nil, errors.Base(err).Message("Config: Invalid router rule.")
|
|
|
}
|
|
|
var chinaIPs geoip.CountryIPRange
|
|
|
if err := proto.Unmarshal(geoip.ChinaIPs, &chinaIPs); err != nil {
|
|
|
- return nil, err
|
|
|
+ return nil, errors.Base(err).Message("Config: Invalid china ips.")
|
|
|
}
|
|
|
return &router.RoutingRule{
|
|
|
Tag: rawRule.OutboundTag,
|