process.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package config
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "strings"
  7. "time"
  8. "github.com/Dreamacro/clash/log"
  9. "github.com/dlclark/regexp2"
  10. "cfa/app"
  11. "cfa/common"
  12. "github.com/Dreamacro/clash/config"
  13. "github.com/Dreamacro/clash/dns"
  14. )
  15. const (
  16. defaultHealthCheckUrl = "https://www.gstatic.com/generate_204"
  17. defaultHealthCheckInterval = time.Hour
  18. )
  19. var processors = []processor{
  20. patchOverride,
  21. patchGeneral,
  22. patchProfile,
  23. patchDns,
  24. patchProviders,
  25. patchProxyGroup,
  26. validConfig,
  27. }
  28. type processor func(cfg *config.RawConfig, profileDir string) error
  29. func patchOverride(cfg *config.RawConfig, _ string) error {
  30. if err := json.NewDecoder(strings.NewReader(ReadOverride(OverrideSlotPersist))).Decode(cfg); err != nil {
  31. log.Warnln("Apply persist override: %s", err.Error())
  32. }
  33. if err := json.NewDecoder(strings.NewReader(ReadOverride(OverrideSlotSession))).Decode(cfg); err != nil {
  34. log.Warnln("Apply session override: %s", err.Error())
  35. }
  36. return nil
  37. }
  38. func patchGeneral(cfg *config.RawConfig, _ string) error {
  39. cfg.Interface = ""
  40. cfg.ExternalUI = ""
  41. cfg.ExternalController = ""
  42. return nil
  43. }
  44. func patchProfile(cfg *config.RawConfig, _ string) error {
  45. cfg.Profile.StoreSelected = false
  46. return nil
  47. }
  48. func patchDns(cfg *config.RawConfig, _ string) error {
  49. if !cfg.DNS.Enable {
  50. cfg.DNS.Enable = true
  51. cfg.DNS.IPv6 = false
  52. cfg.DNS.NameServer = defaultNameServers
  53. cfg.DNS.Fallback = defaultFallback
  54. cfg.DNS.FallbackFilter.GeoIP = false
  55. cfg.DNS.FallbackFilter.IPCIDR = localNetwork
  56. cfg.DNS.EnhancedMode = dns.MAPPING
  57. cfg.DNS.FakeIPRange = "198.18.0.0/16"
  58. cfg.DNS.DefaultNameserver = defaultNameServers
  59. cfg.DNS.FakeIPFilter = defaultFakeIPFilter
  60. cfg.ClashForAndroid.AppendSystemDNS = true
  61. }
  62. if cfg.ClashForAndroid.AppendSystemDNS {
  63. cfg.DNS.NameServer = append(cfg.DNS.NameServer, app.SystemDns()...)
  64. }
  65. return nil
  66. }
  67. func patchProviders(cfg *config.RawConfig, profileDir string) error {
  68. forEachProviders(cfg, func(index int, total int, key string, provider map[string]interface{}) {
  69. if path, ok := provider["path"].(string); ok {
  70. provider["path"] = profileDir + "/providers/" + common.ResolveAsRoot(path)
  71. }
  72. })
  73. return nil
  74. }
  75. func patchProxyGroup(cfg *config.RawConfig, _ string) error {
  76. for _, g := range cfg.ProxyGroup {
  77. if _, exist := g["url"]; !exist {
  78. g["url"] = defaultHealthCheckUrl
  79. }
  80. if _, exist := g["interval"]; !exist {
  81. g["interval"] = int(defaultHealthCheckInterval.Seconds())
  82. }
  83. }
  84. return nil
  85. }
  86. func validConfig(cfg *config.RawConfig, _ string) error {
  87. if len(cfg.Proxy) == 0 && len(cfg.ProxyProvider) == 0 {
  88. return errors.New("profile does not contain `proxies` or `proxy-providers`")
  89. }
  90. if _, err := regexp2.Compile(cfg.ClashForAndroid.UiSubtitlePattern, 0); err != nil {
  91. return fmt.Errorf("compile ui-subtitle-pattern: %s", err.Error())
  92. }
  93. return nil
  94. }
  95. func process(cfg *config.RawConfig, profileDir string) error {
  96. for _, p := range processors {
  97. if err := p(cfg, profileDir); err != nil {
  98. return err
  99. }
  100. }
  101. return nil
  102. }