@@ -5,13 +5,15 @@ import (
5
5
"context"
6
6
"core/state"
7
7
"errors"
8
+ "fmt"
8
9
"github.com/metacubex/mihomo/constant/features"
9
10
"github.com/metacubex/mihomo/hub/route"
10
- "math "
11
+ "github.com/samber/lo "
11
12
"os"
12
13
"os/exec"
13
14
"path/filepath"
14
15
"runtime"
16
+ "strings"
15
17
"sync"
16
18
"syscall"
17
19
"time"
@@ -155,6 +157,14 @@ func getRawConfigWithId(id string) *config.RawConfig {
155
157
continue
156
158
}
157
159
mapping ["path" ] = filepath .Join (getProfileProvidersPath (id ), value )
160
+ if configParams .TestURL != nil {
161
+ hc := mapping ["health-check" ].(map [string ]any )
162
+ if hc != nil {
163
+ if hc ["url" ] != nil {
164
+ hc ["url" ] = * configParams .TestURL
165
+ }
166
+ }
167
+ }
158
168
}
159
169
for _ , mapping := range prof .RuleProvider {
160
170
value , exist := mapping ["path" ].(string )
@@ -212,16 +222,16 @@ func sideUpdateExternalProvider(p cp.Provider, bytes []byte) error {
212
222
switch p .(type ) {
213
223
case * provider.ProxySetProvider :
214
224
psp := p .(* provider.ProxySetProvider )
215
- elm , same , err := psp .SideUpdate (bytes )
216
- if err == nil && ! same {
217
- psp . OnUpdate ( elm )
225
+ _ , _ , err := psp .SideUpdate (bytes )
226
+ if err == nil {
227
+ return err
218
228
}
219
229
return nil
220
230
case rp.RuleSetProvider :
221
231
rsp := p .(* rp.RuleSetProvider )
222
- elm , same , err := rsp .SideUpdate (bytes )
223
- if err == nil && ! same {
224
- rsp . OnUpdate ( elm )
232
+ _ , _ , err := rsp .SideUpdate (bytes )
233
+ if err == nil {
234
+ return err
225
235
}
226
236
return nil
227
237
default :
@@ -387,6 +397,37 @@ func genHosts(hosts, patchHosts map[string]any) {
387
397
}
388
398
}
389
399
400
+ func trimArr (arr []string ) (r []string ) {
401
+ for _ , e := range arr {
402
+ r = append (r , strings .Trim (e , " " ))
403
+ }
404
+ return
405
+ }
406
+
407
+ var ips = []string {"ipinfo.io" , "ipapi.co" , "api.ip.sb" , "ipwho.is" }
408
+
409
+ func overrideRules (rules * []string ) {
410
+ var target = ""
411
+ for _ , line := range * rules {
412
+ rule := trimArr (strings .Split (line , "," ))
413
+ l := len (rule )
414
+ if l != 2 {
415
+ return
416
+ }
417
+ if strings .ToUpper (rule [0 ]) == "MATCH" {
418
+ target = rule [1 ]
419
+ break
420
+ }
421
+ }
422
+ if target == "" {
423
+ return
424
+ }
425
+ var rulesExt = lo .Map (ips , func (ip string , index int ) string {
426
+ return fmt .Sprintf ("DOMAIN %s %s" , ip , target )
427
+ })
428
+ * rules = append (rulesExt , * rules ... )
429
+ }
430
+
390
431
func overwriteConfig (targetConfig * config.RawConfig , patchConfig config.RawConfig ) {
391
432
targetConfig .ExternalController = patchConfig .ExternalController
392
433
targetConfig .ExternalUI = ""
@@ -425,6 +466,7 @@ func overwriteConfig(targetConfig *config.RawConfig, patchConfig config.RawConfi
425
466
targetConfig .DNS .Enable = true
426
467
}
427
468
}
469
+ overrideRules (& targetConfig .Rule )
428
470
//if runtime.GOOS == "android" {
429
471
// targetConfig.DNS.NameServer = append(targetConfig.DNS.NameServer, "dhcp://"+dns.SystemDNSPlaceholder)
430
472
//} else if runtime.GOOS == "windows" {
@@ -437,9 +479,8 @@ func overwriteConfig(targetConfig *config.RawConfig, patchConfig config.RawConfi
437
479
//}
438
480
}
439
481
440
- func patchConfig (general * config.General , controller * config.Controller ) {
482
+ func patchConfig (general * config.General , controller * config.Controller , tls * config. TLS ) {
441
483
log .Infoln ("[Apply] patch" )
442
- route .ReStartServer (controller .ExternalController )
443
484
tunnel .SetSniffing (general .Sniffing )
444
485
tunnel .SetFindProcessMode (general .FindProcessMode )
445
486
dialer .SetTcpConcurrent (general .TCPConcurrent )
@@ -448,6 +489,22 @@ func patchConfig(general *config.General, controller *config.Controller) {
448
489
tunnel .SetMode (general .Mode )
449
490
log .SetLevel (general .LogLevel )
450
491
resolver .DisableIPv6 = ! general .IPv6
492
+
493
+ route .ReCreateServer (& route.Config {
494
+ Addr : controller .ExternalController ,
495
+ TLSAddr : controller .ExternalControllerTLS ,
496
+ UnixAddr : controller .ExternalControllerUnix ,
497
+ PipeAddr : controller .ExternalControllerPipe ,
498
+ Secret : controller .Secret ,
499
+ Certificate : tls .Certificate ,
500
+ PrivateKey : tls .PrivateKey ,
501
+ DohServer : controller .ExternalDohServer ,
502
+ IsDebug : false ,
503
+ Cors : route.Cors {
504
+ AllowOrigins : controller .Cors .AllowOrigins ,
505
+ AllowPrivateNetwork : controller .Cors .AllowPrivateNetwork ,
506
+ },
507
+ })
451
508
}
452
509
453
510
var isRunning = false
@@ -460,6 +517,7 @@ func updateListeners(general *config.General, listeners map[string]constant.Inbo
460
517
}
461
518
runLock .Lock ()
462
519
defer runLock .Unlock ()
520
+ stopListeners ()
463
521
listener .PatchInboundListeners (listeners , tunnel .Tunnel , true )
464
522
listener .SetAllowLan (general .AllowLan )
465
523
inbound .SetSkipAuthPrefixes (general .SkipAuthPrefixes )
@@ -483,27 +541,6 @@ func stopListeners() {
483
541
listener .StopListener ()
484
542
}
485
543
486
- func hcCompatibleProvider (proxyProviders map [string ]cp.ProxyProvider ) {
487
- wg := sync.WaitGroup {}
488
- ch := make (chan struct {}, math .MaxInt )
489
- for _ , proxyProvider := range proxyProviders {
490
- proxyProvider := proxyProvider
491
- if proxyProvider .VehicleType () == cp .Compatible {
492
- log .Infoln ("Start initial Compatible provider %s" , proxyProvider .Name ())
493
- wg .Add (1 )
494
- ch <- struct {}{}
495
- go func () {
496
- defer func () { <- ch ; wg .Done () }()
497
- if err := proxyProvider .Initial (); err != nil {
498
- log .Errorln ("initial Compatible provider %s error: %v" , proxyProvider .Name (), err )
499
- }
500
- }()
501
- }
502
-
503
- }
504
-
505
- }
506
-
507
544
func patchSelectGroup () {
508
545
mapping := configParams .SelectedMap
509
546
if mapping == nil {
@@ -535,17 +572,14 @@ func applyConfig() error {
535
572
cfg , _ = config .ParseRawConfig (config .DefaultRawConfig ())
536
573
}
537
574
if configParams .IsPatch {
538
- patchConfig (cfg .General , cfg .Controller )
575
+ patchConfig (cfg .General , cfg .Controller , cfg . TLS )
539
576
} else {
540
577
closeConnections ()
541
578
runtime .GC ()
542
- hub .UltraApplyConfig (cfg )
579
+ hub .ApplyConfig (cfg )
543
580
patchSelectGroup ()
544
581
}
545
582
updateListeners (cfg .General , cfg .Listeners )
546
- if isRunning {
547
- hcCompatibleProvider (cfg .Providers )
548
- }
549
583
externalProviders = getExternalProvidersRaw ()
550
584
return err
551
585
}
0 commit comments