| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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 {
- return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode) || len(rule.GeoIP) > 0 && common.Any(rule.GeoIP, notPrivateNode)
- }
- 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
- }
- func isIPCIDRHeadlessRule(rule option.DefaultHeadlessRule) bool {
- return len(rule.IPCIDR) > 0 || rule.IPSet != nil
- }
|