Feature: add more command-line options (#656)

add command-line options to override `external-controller`, `secret` and `external-ui` (#531)
This commit is contained in:
Richard Yu 2020-04-27 22:23:09 +08:00 committed by GitHub
parent 51b6b8521b
commit 41a9488cfa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 6 deletions

View file

@ -3,15 +3,40 @@ package hub
import ( import (
"github.com/Dreamacro/clash/hub/executor" "github.com/Dreamacro/clash/hub/executor"
"github.com/Dreamacro/clash/hub/route" "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 // Parse call at the beginning of clash
func Parse() error { func Parse(options ...Option) error {
cfg, err := executor.Parse() cfg, err := executor.Parse()
if err != nil { if err != nil {
return err return err
} }
for _, option := range options {
option(cfg)
}
if cfg.General.ExternalUI != "" { if cfg.General.ExternalUI != "" {
route.SetUIPath(cfg.General.ExternalUI) route.SetUIPath(cfg.General.ExternalUI)
} }

25
main.go
View file

@ -18,18 +18,30 @@ import (
) )
var ( var (
flagset map[string]bool
version bool version bool
testConfig bool testConfig bool
homeDir string homeDir string
configFile string configFile string
externalUI string
externalController string
secret string
) )
func init() { func init() {
flag.StringVar(&homeDir, "d", "", "set configuration directory") flag.StringVar(&homeDir, "d", "", "set configuration directory")
flag.StringVar(&configFile, "f", "", "specify configuration file") 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(&version, "v", false, "show current version of clash")
flag.BoolVar(&testConfig, "t", false, "test configuration and exit") flag.BoolVar(&testConfig, "t", false, "test configuration and exit")
flag.Parse() flag.Parse()
flagset = map[string]bool{}
flag.Visit(func(f *flag.Flag) {
flagset[f.Name] = true
})
} }
func main() { func main() {
@ -71,7 +83,18 @@ func main() {
return 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()) log.Fatalln("Parse config error: %s", err.Error())
} }