// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. package ghttp import ( "context" "github.com/gogf/gf/v2/os/gfile" "strings" "time" "github.com/gogf/gf/v2/os/gproc" "github.com/gogf/gf/v2/os/gtimer" "github.com/gogf/gf/v2/os/gview" ) // utilAdmin is the controller for administration. type utilAdmin struct{} // Index shows the administration page. func (p *utilAdmin) Index(r *Request) { data := map[string]interface{}{ "pid": gproc.Pid(), "path": gfile.SelfPath(), "uri": strings.TrimRight(r.URL.Path, "/"), } buffer, _ := gview.ParseContent(r.Context(), ` GoFrame Web Server Admin

Pid: {{.pid}}

File Path: {{.path}}

Restart

Shutdown

`, data) r.Response.Write(buffer) } // Restart restarts all the servers in the process. func (p *utilAdmin) Restart(r *Request) { var ( ctx = r.Context() err error ) // Custom start binary path when this process exits. path := r.GetQuery("newExeFilePath").String() if path == "" { path = gfile.SelfPath() } if len(path) > 0 { err = RestartAllServer(ctx, path) } else { err = RestartAllServer(ctx) } if err == nil { r.Response.WriteExit("server restarted") } else { r.Response.WriteExit(err.Error()) } } // Shutdown shuts down all the servers. func (p *utilAdmin) Shutdown(r *Request) { gtimer.SetTimeout(time.Second, func() { // It shuts down the server after 1 second, which is not triggered by system signal, // to ensure the response successfully to the client. _ = r.Server.Shutdown() }) r.Response.WriteExit("server shutdown") } // EnableAdmin enables the administration feature for the process. // The optional parameter specifies the URI for the administration page. func (s *Server) EnableAdmin(pattern ...string) { p := "/debug/admin" if len(pattern) > 0 { p = pattern[0] } s.BindObject(p, &utilAdmin{}) } // Shutdown shuts down current server. func (s *Server) Shutdown() error { var ( ctx = context.TODO() ) // Only shut down current servers. // It may have multiple underlying http servers. for _, v := range s.servers { v.close(ctx) } return nil }