router_rule.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package route
  2. import (
  3. C "github.com/sagernet/sing-box/constant"
  4. "github.com/sagernet/sing-box/option"
  5. "github.com/sagernet/sing/common"
  6. )
  7. func hasRule(rules []option.Rule, cond func(rule option.DefaultRule) bool) bool {
  8. for _, rule := range rules {
  9. switch rule.Type {
  10. case C.RuleTypeDefault:
  11. if cond(rule.DefaultOptions) {
  12. return true
  13. }
  14. case C.RuleTypeLogical:
  15. if hasRule(rule.LogicalOptions.Rules, cond) {
  16. return true
  17. }
  18. }
  19. }
  20. return false
  21. }
  22. func hasDNSRule(rules []option.DNSRule, cond func(rule option.DefaultDNSRule) bool) bool {
  23. for _, rule := range rules {
  24. switch rule.Type {
  25. case C.RuleTypeDefault:
  26. if cond(rule.DefaultOptions) {
  27. return true
  28. }
  29. case C.RuleTypeLogical:
  30. if hasDNSRule(rule.LogicalOptions.Rules, cond) {
  31. return true
  32. }
  33. }
  34. }
  35. return false
  36. }
  37. func hasHeadlessRule(rules []option.HeadlessRule, cond func(rule option.DefaultHeadlessRule) bool) bool {
  38. for _, rule := range rules {
  39. switch rule.Type {
  40. case C.RuleTypeDefault:
  41. if cond(rule.DefaultOptions) {
  42. return true
  43. }
  44. case C.RuleTypeLogical:
  45. if hasHeadlessRule(rule.LogicalOptions.Rules, cond) {
  46. return true
  47. }
  48. }
  49. }
  50. return false
  51. }
  52. func isGeoIPRule(rule option.DefaultRule) bool {
  53. return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode) || len(rule.GeoIP) > 0 && common.Any(rule.GeoIP, notPrivateNode)
  54. }
  55. func isGeoIPDNSRule(rule option.DefaultDNSRule) bool {
  56. return len(rule.SourceGeoIP) > 0 && common.Any(rule.SourceGeoIP, notPrivateNode) || len(rule.GeoIP) > 0 && common.Any(rule.GeoIP, notPrivateNode)
  57. }
  58. func isGeositeRule(rule option.DefaultRule) bool {
  59. return len(rule.Geosite) > 0
  60. }
  61. func isGeositeDNSRule(rule option.DefaultDNSRule) bool {
  62. return len(rule.Geosite) > 0
  63. }
  64. func isProcessRule(rule option.DefaultRule) bool {
  65. return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.PackageName) > 0 || len(rule.User) > 0 || len(rule.UserID) > 0
  66. }
  67. func isProcessDNSRule(rule option.DefaultDNSRule) bool {
  68. return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.PackageName) > 0 || len(rule.User) > 0 || len(rule.UserID) > 0
  69. }
  70. func isProcessHeadlessRule(rule option.DefaultHeadlessRule) bool {
  71. return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.PackageName) > 0
  72. }
  73. func notPrivateNode(code string) bool {
  74. return code != "private"
  75. }
  76. func isWIFIRule(rule option.DefaultRule) bool {
  77. return len(rule.WIFISSID) > 0 || len(rule.WIFIBSSID) > 0
  78. }
  79. func isWIFIDNSRule(rule option.DefaultDNSRule) bool {
  80. return len(rule.WIFISSID) > 0 || len(rule.WIFIBSSID) > 0
  81. }
  82. func isWIFIHeadlessRule(rule option.DefaultHeadlessRule) bool {
  83. return len(rule.WIFISSID) > 0 || len(rule.WIFIBSSID) > 0
  84. }
  85. func isIPCIDRHeadlessRule(rule option.DefaultHeadlessRule) bool {
  86. return len(rule.IPCIDR) > 0 || rule.IPSet != nil
  87. }