diff --git a/go.mod b/go.mod index d0d9a7a5..ad983b41 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/IBM/sarama v1.41.2 github.com/OneOfOne/xxhash v1.2.8 github.com/julienschmidt/httprouter v1.3.0 + github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 github.com/karrick/goswarm v1.10.0 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 54c80e1e..20fc9fb5 100644 --- a/go.sum +++ b/go.sum @@ -175,6 +175,8 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/goswarm v1.10.0 h1:hGUt7r6O3bR02whvkW/E4rU6Ei7MekGGlTD5zqAYSHo= github.com/karrick/goswarm v1.10.0/go.mod h1:wqange6Y/RHXs23gBc4nRXPent8RaiFyfl2+otwXj8U= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= diff --git a/main.go b/main.go index 7f0a60ab..f71ee1b3 100644 --- a/main.go +++ b/main.go @@ -44,6 +44,9 @@ import ( "github.com/spf13/viper" "github.com/linkedin/Burrow/core" + + "github.com/fsnotify/fsnotify" + "github.com/kardianos/osext" ) // exitCode wraps a return value for the application @@ -84,6 +87,24 @@ func main() { panic(exitCode{1}) } + // auto reload on config change + viper.WatchConfig() + viper.OnConfigChange(func(e fsnotify.Event) { + fmt.Fprintln(os.Stderr, "Config file changed: ", e.Name) + file, err := osext.Executable() + if err != nil { + fmt.Fprintln(os.Stderr, "Failed retrieving executable name:", err.Error()) + fmt.Fprintln(os.Stderr, "Manual restart is needed") + return + } + err = syscall.Exec(file, os.Args, os.Environ()) + if err != nil { + fmt.Fprintln(os.Stderr, "Failed restarting:", err.Error()) + fmt.Fprintln(os.Stderr, "Manual restart is needed") + return + } + }) + // setup viper to be able to read env variables with a configured prefix viper.SetDefault("general.env-var-prefix", "burrow") envPrefix := viper.GetString("general.env-var-prefix")