github.com/metacubex/mihomo@v1.18.5/hub/hub.go (about)

     1  package hub
     2  
     3  import (
     4  	"github.com/metacubex/mihomo/config"
     5  	"github.com/metacubex/mihomo/hub/executor"
     6  	"github.com/metacubex/mihomo/hub/route"
     7  	"github.com/metacubex/mihomo/log"
     8  )
     9  
    10  type Option func(*config.Config)
    11  
    12  func WithExternalUI(externalUI string) Option {
    13  	return func(cfg *config.Config) {
    14  		cfg.General.ExternalUI = externalUI
    15  	}
    16  }
    17  
    18  func WithExternalController(externalController string) Option {
    19  	return func(cfg *config.Config) {
    20  		cfg.General.ExternalController = externalController
    21  	}
    22  }
    23  
    24  func WithExternalControllerUnix(externalControllerUnix string) Option {
    25  	return func(cfg *config.Config) {
    26  		cfg.General.ExternalControllerUnix = externalControllerUnix
    27  	}
    28  }
    29  
    30  func WithSecret(secret string) Option {
    31  	return func(cfg *config.Config) {
    32  		cfg.General.Secret = secret
    33  	}
    34  }
    35  
    36  // Parse call at the beginning of mihomo
    37  func Parse(options ...Option) error {
    38  	cfg, err := executor.Parse()
    39  	if err != nil {
    40  		return err
    41  	}
    42  
    43  	for _, option := range options {
    44  		option(cfg)
    45  	}
    46  
    47  	if cfg.General.ExternalUI != "" {
    48  		route.SetUIPath(cfg.General.ExternalUI)
    49  	}
    50  
    51  	if cfg.General.ExternalController != "" {
    52  		go route.Start(cfg.General.ExternalController, cfg.General.ExternalControllerTLS,
    53  			cfg.General.Secret, cfg.TLS.Certificate, cfg.TLS.PrivateKey, cfg.General.LogLevel == log.DEBUG)
    54  	}
    55  
    56  	if cfg.General.ExternalControllerUnix != "" {
    57  		go route.StartUnix(cfg.General.ExternalControllerUnix, cfg.General.LogLevel == log.DEBUG)
    58  	}
    59  
    60  	executor.ApplyConfig(cfg, true)
    61  	return nil
    62  }