diff --git a/cmd/gost/main.go b/cmd/gost/main.go index 73431c2..b3141e7 100644 --- a/cmd/gost/main.go +++ b/cmd/gost/main.go @@ -11,6 +11,7 @@ import ( "runtime" "strings" "sync" + "time" "github.com/go-gost/core/logger" xlogger "github.com/go-gost/x/logger" @@ -36,6 +37,7 @@ var ( trace bool apiAddr string metricsAddr string + reload time.Duration ) func init() { @@ -87,13 +89,14 @@ func init() { flag.Var(&services, "L", "service list") flag.Var(&nodes, "F", "chain node list") - flag.Var(&cfgFiles, "C", "configuration file(s)") + flag.Var(&cfgFiles, "C", "config file(s), URL(s), or inline JSON") flag.BoolVar(&printVersion, "V", false, "print version") flag.StringVar(&outputFormat, "O", "", "output format, one of yaml|json format") flag.BoolVar(&debug, "D", false, "debug mode") flag.BoolVar(&trace, "DD", false, "trace mode") flag.StringVar(&apiAddr, "api", "", "api service address") flag.StringVar(&metricsAddr, "metrics", "", "metrics service address") + flag.DurationVar(&reload, "R", 0, "auto reload period (e.g. 30s, 1m)") flag.Parse() if printVersion { diff --git a/cmd/gost/program.go b/cmd/gost/program.go index e854ae6..f404b9e 100644 --- a/cmd/gost/program.go +++ b/cmd/gost/program.go @@ -8,6 +8,7 @@ import ( "os/signal" "strings" "syscall" + "time" "github.com/go-gost/core/auth" "github.com/go-gost/core/logger" @@ -193,6 +194,13 @@ func (p *program) reload(ctx context.Context) { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGHUP) + var ticker <-chan time.Time + if reload > 0 { + t := time.NewTicker(reload) + defer t.Stop() + ticker = t.C + } + for { select { case <-c: @@ -202,6 +210,13 @@ func (p *program) reload(ctx context.Context) { logger.Default().Info("config reloaded") } + case <-ticker: + if err := p.reloadConfig(); err != nil { + logger.Default().Errorf("auto reload: %v", err) + } else { + logger.Default().Debug("config auto reloaded") + } + case <-ctx.Done(): return }