admin.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package caddy
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/caddyserver/caddy/v2"
  6. "github.com/dunglas/frankenphp"
  7. "net/http"
  8. )
  9. type FrankenPHPAdmin struct{}
  10. // if the id starts with "admin.api" the module will register AdminRoutes via module.Routes()
  11. func (FrankenPHPAdmin) CaddyModule() caddy.ModuleInfo {
  12. return caddy.ModuleInfo{
  13. ID: "admin.api.frankenphp",
  14. New: func() caddy.Module { return new(FrankenPHPAdmin) },
  15. }
  16. }
  17. // EXPERIMENTAL: These routes are not yet stable and may change in the future.
  18. func (admin FrankenPHPAdmin) Routes() []caddy.AdminRoute {
  19. return []caddy.AdminRoute{
  20. {
  21. Pattern: "/frankenphp/workers/restart",
  22. Handler: caddy.AdminHandlerFunc(admin.restartWorkers),
  23. },
  24. {
  25. Pattern: "/frankenphp/threads",
  26. Handler: caddy.AdminHandlerFunc(admin.threads),
  27. },
  28. }
  29. }
  30. func (admin *FrankenPHPAdmin) restartWorkers(w http.ResponseWriter, r *http.Request) error {
  31. if r.Method != http.MethodPost {
  32. return admin.error(http.StatusMethodNotAllowed, fmt.Errorf("method not allowed"))
  33. }
  34. frankenphp.RestartWorkers()
  35. caddy.Log().Info("workers restarted from admin api")
  36. admin.success(w, "workers restarted successfully\n")
  37. return nil
  38. }
  39. func (admin *FrankenPHPAdmin) threads(w http.ResponseWriter, r *http.Request) error {
  40. debugState := frankenphp.DebugState()
  41. prettyJson, err := json.MarshalIndent(debugState, "", " ")
  42. if err != nil {
  43. return admin.error(http.StatusInternalServerError, err)
  44. }
  45. return admin.success(w, string(prettyJson))
  46. }
  47. func (admin *FrankenPHPAdmin) success(w http.ResponseWriter, message string) error {
  48. w.WriteHeader(http.StatusOK)
  49. _, err := w.Write([]byte(message))
  50. return err
  51. }
  52. func (admin *FrankenPHPAdmin) error(statusCode int, err error) error {
  53. return caddy.APIError{HTTPStatus: statusCode, Err: err}
  54. }