From 1178c4757f14436fcca9e8933aaf6c954098c0be Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Sat, 20 Jun 2026 20:12:11 +0800 Subject: [PATCH] feat(cmd): add -R auto-reload flag for periodic config refresh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce -R flag (e.g., -R 30s, -R 1m) that triggers periodic config reload. Combined with -C URL support, this enables centralized fleet management where nodes poll a remote config server. The reload goroutine reuses the existing SIGHUP reloadConfig path: parser.Parse() → loader.Load() → p.run(cfg). When -R is zero (default) behavior is unchanged; SIGHUP still works independently. --- cmd/gost/main.go | 5 ++++- cmd/gost/program.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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 }