12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- package route
- import (
- "fmt"
- "net/http"
- "os"
- "os/exec"
- "runtime"
- "syscall"
- "github.com/metacubex/mihomo/hub/executor"
- "github.com/metacubex/mihomo/log"
- "github.com/go-chi/chi/v5"
- "github.com/go-chi/render"
- )
- func restartRouter() http.Handler {
- r := chi.NewRouter()
- r.Post("/", restart)
- return r
- }
- func restart(w http.ResponseWriter, r *http.Request) {
-
- execPath, err := os.Executable()
- if err != nil {
- render.Status(r, http.StatusInternalServerError)
- render.JSON(w, r, newError(fmt.Sprintf("getting path: %s", err)))
- return
- }
- render.JSON(w, r, render.M{"status": "ok"})
- if f, ok := w.(http.Flusher); ok {
- f.Flush()
- }
-
-
-
-
- go restartExecutable(execPath)
- }
- func restartExecutable(execPath string) {
- var err error
- executor.Shutdown()
- if runtime.GOOS == "windows" {
- cmd := exec.Command(execPath, os.Args[1:]...)
- log.Infoln("restarting: %q %q", execPath, os.Args[1:])
- cmd.Stdin = os.Stdin
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- err = cmd.Start()
- if err != nil {
- log.Fatalln("restarting: %s", err)
- }
- os.Exit(0)
- }
- log.Infoln("restarting: %q %q", execPath, os.Args[1:])
- err = syscall.Exec(execPath, os.Args, os.Environ())
- if err != nil {
- log.Fatalln("restarting: %s", err)
- }
- }
|