From 41a9488cfad4be2b7ae70c293857b18f8f40252f Mon Sep 17 00:00:00 2001 From: Richard Yu Date: Mon, 27 Apr 2020 22:23:09 +0800 Subject: [PATCH] Feature: add more command-line options (#656) add command-line options to override `external-controller`, `secret` and `external-ui` (#531) --- hub/hub.go | 27 ++++++++++++++++++++++++++- main.go | 33 ++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/hub/hub.go b/hub/hub.go index d15fa364..b7cdea27 100644 --- a/hub/hub.go +++ b/hub/hub.go @@ -3,15 +3,40 @@ package hub import ( "github.com/Dreamacro/clash/hub/executor" "github.com/Dreamacro/clash/hub/route" + "github.com/Dreamacro/clash/config" ) +type Option func(*config.Config) + +func WithExternalUI(externalUI string) Option { + return func(cfg *config.Config) { + cfg.General.ExternalUI = externalUI + } +} + +func WithExternalController(externalController string) Option { + return func(cfg *config.Config) { + cfg.General.ExternalController = externalController + } +} + +func WithSecret(secret string) Option { + return func(cfg *config.Config) { + cfg.General.Secret = secret + } +} + // Parse call at the beginning of clash -func Parse() error { +func Parse(options ...Option) error { cfg, err := executor.Parse() if err != nil { return err } + for _, option := range options { + option(cfg) + } + if cfg.General.ExternalUI != "" { route.SetUIPath(cfg.General.ExternalUI) } diff --git a/main.go b/main.go index ec705b6e..28229bfb 100644 --- a/main.go +++ b/main.go @@ -18,18 +18,30 @@ import ( ) var ( - version bool - testConfig bool - homeDir string - configFile string + flagset map[string]bool + version bool + testConfig bool + homeDir string + configFile string + externalUI string + externalController string + secret string ) func init() { flag.StringVar(&homeDir, "d", "", "set configuration directory") flag.StringVar(&configFile, "f", "", "specify configuration file") + flag.StringVar(&externalUI, "ext-ui", "", "override external ui directory") + flag.StringVar(&externalController, "ext-ctl", "", "override external controller address") + flag.StringVar(&secret, "secret", "", "override secret for RESTful API") flag.BoolVar(&version, "v", false, "show current version of clash") flag.BoolVar(&testConfig, "t", false, "test configuration and exit") flag.Parse() + + flagset = map[string]bool{} + flag.Visit(func(f *flag.Flag) { + flagset[f.Name] = true + }) } func main() { @@ -71,7 +83,18 @@ func main() { return } - if err := hub.Parse(); err != nil { + var options []hub.Option + if flagset["ext-ui"] { + options = append(options, hub.WithExternalUI(externalUI)) + } + if flagset["ext-ctl"] { + options = append(options, hub.WithExternalController(externalController)) + } + if flagset["secret"] { + options = append(options, hub.WithSecret(secret)) + } + + if err := hub.Parse(options...); err != nil { log.Fatalln("Parse config error: %s", err.Error()) }