Browse Source

Merge route options to route actions

世界 11 months ago
parent
commit
c098f282b1
3 changed files with 45 additions and 56 deletions
  1. 0 10
      experimental/deprecated/constants.go
  2. 9 34
      option/rule_action.go
  3. 36 12
      route/rule/rule_action.go

+ 0 - 10
experimental/deprecated/constants.go

@@ -104,15 +104,6 @@ var OptionInboundOptions = Note{
 	MigrationLink:     "https://sing-box.sagernet.org/migration/#migrate-legacy-special-outbounds-to-rule-actions",
 }
 
-var OptionLegacyDNSRouteOptions = Note{
-	Name:              "legacy-dns-route-options",
-	Description:       "legacy dns route options",
-	DeprecatedVersion: "1.11.0",
-	ScheduledVersion:  "1.12.0",
-	EnvName:           "LEGACY_DNS_ROUTE_OPTIONS",
-	MigrationLink:     "https://sing-box.sagernet.org/migration/#migrate-legacy-dns-route-options-to-rule-actions",
-}
-
 var Options = []Note{
 	OptionBadMatchSource,
 	OptionGEOIP,
@@ -120,5 +111,4 @@ var Options = []Note{
 	OptionTUNAddressX,
 	OptionSpecialOutbounds,
 	OptionInboundOptions,
-	OptionLegacyDNSRouteOptions,
 }

+ 9 - 34
option/rule_action.go

@@ -7,8 +7,7 @@ import (
 	"time"
 
 	C "github.com/sagernet/sing-box/constant"
-	"github.com/sagernet/sing-box/experimental/deprecated"
-	dns "github.com/sagernet/sing-dns"
+	"github.com/sagernet/sing-dns"
 	E "github.com/sagernet/sing/common/exceptions"
 	"github.com/sagernet/sing/common/json"
 	"github.com/sagernet/sing/common/json/badjson"
@@ -137,18 +136,10 @@ func (r *DNSRuleAction) UnmarshalJSONContext(ctx context.Context, data []byte) e
 	return badjson.UnmarshallExcludedContext(ctx, data, (*_DNSRuleAction)(r), v)
 }
 
-type _RouteActionOptions struct {
-	Outbound string `json:"outbound,omitempty"`
-}
-
-type RouteActionOptions _RouteActionOptions
-
-func (r *RouteActionOptions) UnmarshalJSON(data []byte) error {
-	err := json.Unmarshal(data, (*_RouteActionOptions)(r))
-	if err != nil {
-		return err
-	}
-	return nil
+type RouteActionOptions struct {
+	Outbound                  string `json:"outbound,omitempty"`
+	UDPDisableDomainUnmapping bool   `json:"udp_disable_domain_unmapping,omitempty"`
+	UDPConnect                bool   `json:"udp_connect,omitempty"`
 }
 
 type _RouteOptionsActionOptions struct {
@@ -169,29 +160,13 @@ func (r *RouteOptionsActionOptions) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-type _DNSRouteActionOptions struct {
-	Server string `json:"server,omitempty"`
-	// Deprecated: Use DNSRouteOptionsActionOptions instead.
-	DisableCache bool `json:"disable_cache,omitempty"`
-	// Deprecated: Use DNSRouteOptionsActionOptions instead.
-	RewriteTTL *uint32 `json:"rewrite_ttl,omitempty"`
-	// Deprecated: Use DNSRouteOptionsActionOptions instead.
+type DNSRouteActionOptions struct {
+	Server       string                `json:"server,omitempty"`
+	DisableCache bool                  `json:"disable_cache,omitempty"`
+	RewriteTTL   *uint32               `json:"rewrite_ttl,omitempty"`
 	ClientSubnet *badoption.Prefixable `json:"client_subnet,omitempty"`
 }
 
-type DNSRouteActionOptions _DNSRouteActionOptions
-
-func (r *DNSRouteActionOptions) UnmarshalJSONContext(ctx context.Context, data []byte) error {
-	err := json.Unmarshal(data, (*_DNSRouteActionOptions)(r))
-	if err != nil {
-		return err
-	}
-	if r.DisableCache || r.RewriteTTL != nil || r.ClientSubnet != nil {
-		deprecated.Report(ctx, deprecated.OptionLegacyDNSRouteOptions)
-	}
-	return nil
-}
-
 type _DNSRouteOptionsActionOptions struct {
 	DisableCache bool                  `json:"disable_cache,omitempty"`
 	RewriteTTL   *uint32               `json:"rewrite_ttl,omitempty"`

+ 36 - 12
route/rule/rule_action.go

@@ -29,6 +29,10 @@ func NewRuleAction(ctx context.Context, logger logger.ContextLogger, action opti
 	case C.RuleActionTypeRoute:
 		return &RuleActionRoute{
 			Outbound: action.RouteOptions.Outbound,
+			RuleActionRouteOptions: RuleActionRouteOptions{
+				UDPDisableDomainUnmapping: action.RouteOptions.UDPDisableDomainUnmapping,
+				UDPConnect:                action.RouteOptions.UDPConnect,
+			},
 		}, nil
 	case C.RuleActionTypeRouteOptions:
 		return &RuleActionRouteOptions{
@@ -85,10 +89,12 @@ func NewDNSRuleAction(logger logger.ContextLogger, action option.DNSRuleAction)
 		return nil
 	case C.RuleActionTypeRoute:
 		return &RuleActionDNSRoute{
-			Server:       action.RouteOptions.Server,
-			DisableCache: action.RouteOptions.DisableCache,
-			RewriteTTL:   action.RouteOptions.RewriteTTL,
-			ClientSubnet: netip.Prefix(common.PtrValueOrDefault(action.RouteOptions.ClientSubnet)),
+			Server: action.RouteOptions.Server,
+			RuleActionDNSRouteOptions: RuleActionDNSRouteOptions{
+				DisableCache: action.RouteOptions.DisableCache,
+				RewriteTTL:   action.RouteOptions.RewriteTTL,
+				ClientSubnet: netip.Prefix(common.PtrValueOrDefault(action.RouteOptions.ClientSubnet)),
+			},
 		}
 	case C.RuleActionTypeRouteOptions:
 		return &RuleActionDNSRouteOptions{
@@ -109,6 +115,7 @@ func NewDNSRuleAction(logger logger.ContextLogger, action option.DNSRuleAction)
 
 type RuleActionRoute struct {
 	Outbound string
+	RuleActionRouteOptions
 }
 
 func (r *RuleActionRoute) Type() string {
@@ -116,7 +123,15 @@ func (r *RuleActionRoute) Type() string {
 }
 
 func (r *RuleActionRoute) String() string {
-	return F.ToString("route(", r.Outbound, ")")
+	var descriptions []string
+	descriptions = append(descriptions, r.Outbound)
+	if r.UDPDisableDomainUnmapping {
+		descriptions = append(descriptions, "udp-disable-domain-unmapping")
+	}
+	if r.UDPConnect {
+		descriptions = append(descriptions, "udp-connect")
+	}
+	return F.ToString("route(", strings.Join(descriptions, ","), ")")
 }
 
 type RuleActionRouteOptions struct {
@@ -140,10 +155,8 @@ func (r *RuleActionRouteOptions) String() string {
 }
 
 type RuleActionDNSRoute struct {
-	Server       string
-	DisableCache bool
-	RewriteTTL   *uint32
-	ClientSubnet netip.Prefix
+	Server string
+	RuleActionDNSRouteOptions
 }
 
 func (r *RuleActionDNSRoute) Type() string {
@@ -151,7 +164,18 @@ func (r *RuleActionDNSRoute) Type() string {
 }
 
 func (r *RuleActionDNSRoute) String() string {
-	return F.ToString("route(", r.Server, ")")
+	var descriptions []string
+	descriptions = append(descriptions, r.Server)
+	if r.DisableCache {
+		descriptions = append(descriptions, "disable-cache")
+	}
+	if r.RewriteTTL != nil {
+		descriptions = append(descriptions, F.ToString("rewrite-ttl=", *r.RewriteTTL))
+	}
+	if r.ClientSubnet.IsValid() {
+		descriptions = append(descriptions, F.ToString("client-subnet=", r.ClientSubnet))
+	}
+	return F.ToString("route(", strings.Join(descriptions, ","), ")")
 }
 
 type RuleActionDNSRouteOptions struct {
@@ -170,10 +194,10 @@ func (r *RuleActionDNSRouteOptions) String() string {
 		descriptions = append(descriptions, "disable-cache")
 	}
 	if r.RewriteTTL != nil {
-		descriptions = append(descriptions, F.ToString("rewrite-ttl(", *r.RewriteTTL, ")"))
+		descriptions = append(descriptions, F.ToString("rewrite-ttl=", *r.RewriteTTL))
 	}
 	if r.ClientSubnet.IsValid() {
-		descriptions = append(descriptions, F.ToString("client-subnet(", r.ClientSubnet, ")"))
+		descriptions = append(descriptions, F.ToString("client-subnet=", r.ClientSubnet))
 	}
 	return F.ToString("route-options(", strings.Join(descriptions, ","), ")")
 }