2023-12-01 05:24:12 +00:00
|
|
|
package route
|
|
|
|
|
|
|
|
import (
|
|
|
|
C "github.com/sagernet/sing-box/constant"
|
|
|
|
"github.com/sagernet/sing-box/option"
|
|
|
|
"github.com/sagernet/sing/common"
|
|
|
|
)
|
|
|
|
|
|
|
|
func hasRule(rules []option.Rule, cond func(rule option.DefaultRule) bool) bool {
|
|
|
|
for _, rule := range rules {
|
|
|
|
switch rule.Type {
|
|
|
|
case C.RuleTypeDefault:
|
|
|
|
if cond(rule.DefaultOptions) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
case C.RuleTypeLogical:
|
|
|
|
if hasRule(rule.LogicalOptions.Rules, cond) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func hasDNSRule(rules []option.DNSRule, cond func(rule option.DefaultDNSRule) bool) bool {
|
|
|
|
for _, rule := range rules {
|
|
|
|
switch rule.Type {
|
|
|
|
case C.RuleTypeDefault:
|
|
|
|
if cond(rule.DefaultOptions) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
case C.RuleTypeLogical:
|
|
|
|
if hasDNSRule(rule.LogicalOptions.Rules, cond) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func hasHeadlessRule(rules []option.HeadlessRule, cond func(rule option.DefaultHeadlessRule) bool) bool {
|
|
|
|
for _, rule := range rules {
|
|
|
|
switch rule.Type {
|
|
|
|
case C.RuleTypeDefault:
|
|
|
|
if cond(rule.DefaultOptions) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
case C.RuleTypeLogical:
|
|
|
|
if hasHeadlessRule(rule.LogicalOptions.Rules, cond) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func isGeoIPRule(rule option.DefaultRule) bool {
|
|
|
|
return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode) || len(rule.GeoIP) > 0 && common.Any(rule.GeoIP, notPrivateNode)
|
|
|
|
}
|
|
|
|
|
|
|
|
func isGeoIPDNSRule(rule option.DefaultDNSRule) bool {
|
2024-02-03 09:45:27 +00:00
|
|
|
return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode) || len(rule.GeoIP) > 0 && common.Any(rule.GeoIP, notPrivateNode)
|
2023-12-01 05:24:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func isGeositeRule(rule option.DefaultRule) bool {
|
|
|
|
return len(rule.Geosite) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func isGeositeDNSRule(rule option.DefaultDNSRule) bool {
|
|
|
|
return len(rule.Geosite) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func isProcessRule(rule option.DefaultRule) bool {
|
|
|
|
return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.PackageName) > 0 || len(rule.User) > 0 || len(rule.UserID) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func isProcessDNSRule(rule option.DefaultDNSRule) bool {
|
|
|
|
return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.PackageName) > 0 || len(rule.User) > 0 || len(rule.UserID) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func isProcessHeadlessRule(rule option.DefaultHeadlessRule) bool {
|
|
|
|
return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.PackageName) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func notPrivateNode(code string) bool {
|
|
|
|
return code != "private"
|
|
|
|
}
|
|
|
|
|
|
|
|
func isWIFIRule(rule option.DefaultRule) bool {
|
|
|
|
return len(rule.WIFISSID) > 0 || len(rule.WIFIBSSID) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func isWIFIDNSRule(rule option.DefaultDNSRule) bool {
|
|
|
|
return len(rule.WIFISSID) > 0 || len(rule.WIFIBSSID) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func isWIFIHeadlessRule(rule option.DefaultHeadlessRule) bool {
|
|
|
|
return len(rule.WIFISSID) > 0 || len(rule.WIFIBSSID) > 0
|
|
|
|
}
|
2024-02-03 09:45:27 +00:00
|
|
|
|
|
|
|
func isIPCIDRHeadlessRule(rule option.DefaultHeadlessRule) bool {
|
|
|
|
return len(rule.IPCIDR) > 0 || rule.IPSet != nil
|
|
|
|
}
|