diff options
author | Toby Allen <tobyallen@toflidium.com> | 2019-07-20 17:48:46 +0100 |
---|---|---|
committer | Matt Holt <mholt@users.noreply.github.com> | 2019-07-20 10:48:46 -0600 |
commit | d98f2faef960f549c973d747d2e7c484d6e845c7 (patch) | |
tree | 142bc82f1797c6024c7b2e0e4b5c31d35c3e2da7 | |
parent | b855e661700fa8f9176f29c3c5b1cebd4cc09351 (diff) |
Add /stop endpoint to admin (#2671)
* Add stop command to admin. Exit after stop.
* Return error on incorrect http Method and provide better logging.
* reuse stopAndCleanup function for all graceful stops
-rw-r--r-- | admin.go | 26 | ||||
-rw-r--r-- | sigtrap.go | 8 |
2 files changed, 26 insertions, 8 deletions
@@ -24,10 +24,12 @@ import ( "net" "net/http" "net/http/pprof" + "os" "strings" "sync" "time" + "github.com/mholt/certmagic" "github.com/rs/cors" ) @@ -83,6 +85,7 @@ func StartAdmin(initialConfigJSON []byte) error { mux := http.NewServeMux() mux.HandleFunc("/load", handleLoadConfig) + mux.HandleFunc("/stop", handleStop) ///// BEGIN PPROF STUFF (TODO: Temporary) ///// mux.HandleFunc("/debug/pprof/", pprof.Index) @@ -149,7 +152,7 @@ type AdminRoute struct { func handleLoadConfig(w http.ResponseWriter, r *http.Request) { r.Close = true - if r.Method != "POST" { + if r.Method != http.MethodPost { http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) return } @@ -167,6 +170,27 @@ func handleLoadConfig(w http.ResponseWriter, r *http.Request) { } } +func handleStop(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + return + } + log.Println("[ADMIN] Initiating shutdown") + if err := stopAndCleanup(); err != nil { + log.Printf("[ADMIN][ERROR] stopping: %v \n", err) + } + log.Println("[ADMIN] Exiting") + os.Exit(0) +} + +func stopAndCleanup() error { + if err := Stop(); err != nil { + return err + } + certmagic.CleanUpOwnLocks() + return nil +} + // Load loads and starts a configuration. func Load(r io.Reader) error { buf := bufPool.Get().(*bytes.Buffer) @@ -18,8 +18,6 @@ import ( "log" "os" "os/signal" - - "github.com/mholt/certmagic" ) // TrapSignals create signal/interrupt handlers as best it can for the @@ -57,16 +55,12 @@ func trapSignalsCrossPlatform() { func gracefulStop(sigName string) { exitCode := ExitCodeSuccess - // first stop all the apps - err := Stop() + err := stopAndCleanup() if err != nil { log.Printf("[ERROR] %s stop: %v", sigName, err) exitCode = ExitCodeFailedQuit } - // always, always, always try to clean up locks - certmagic.CleanUpOwnLocks() - log.Printf("[INFO] %s: Shutdown done", sigName) os.Exit(exitCode) } |