mirror of https://github.com/caddyserver/caddy.git
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
This commit is contained in:
parent
b855e66170
commit
d98f2faef9
26
admin.go
26
admin.go
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue