controller.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package controller
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "strings"
  8. "sync"
  9. "time"
  10. "github.com/gorilla/handlers"
  11. "github.com/gorilla/mux"
  12. "github.com/gravitl/netmaker/logger"
  13. m "github.com/gravitl/netmaker/migrate"
  14. "github.com/gravitl/netmaker/servercfg"
  15. )
  16. // HttpMiddlewares - middleware functions for REST interactions
  17. var HttpMiddlewares = []mux.MiddlewareFunc{
  18. userMiddleWare,
  19. }
  20. // HttpHandlers - handler functions for REST interactions
  21. var HttpHandlers = []interface{}{
  22. nodeHandlers,
  23. userHandlers,
  24. networkHandlers,
  25. dnsHandlers,
  26. fileHandlers,
  27. serverHandlers,
  28. extClientHandlers,
  29. ipHandlers,
  30. loggerHandlers,
  31. hostHandlers,
  32. enrollmentKeyHandlers,
  33. tagHandlers,
  34. legacyHandlers,
  35. }
  36. func HandleRESTRequests(wg *sync.WaitGroup, ctx context.Context) {
  37. defer wg.Done()
  38. r := mux.NewRouter()
  39. // Currently allowed dev origin is all. Should change in prod
  40. // should consider analyzing the allowed methods further
  41. headersOk := handlers.AllowedHeaders(
  42. []string{
  43. "Access-Control-Allow-Origin",
  44. "X-Requested-With",
  45. "Content-Type",
  46. "authorization",
  47. "From-Ui",
  48. },
  49. )
  50. originsOk := handlers.AllowedOrigins(strings.Split(servercfg.GetAllowedOrigin(), ","))
  51. methodsOk := handlers.AllowedMethods(
  52. []string{http.MethodGet, http.MethodPut, http.MethodPost, http.MethodDelete},
  53. )
  54. for _, middleware := range HttpMiddlewares {
  55. r.Use(middleware)
  56. }
  57. for _, handler := range HttpHandlers {
  58. handler.(func(*mux.Router))(r)
  59. }
  60. port := servercfg.GetAPIPort()
  61. srv := &http.Server{
  62. Addr: ":" + port,
  63. Handler: handlers.CORS(originsOk, headersOk, methodsOk)(r),
  64. }
  65. go func() {
  66. err := srv.ListenAndServe()
  67. if err != nil {
  68. logger.Log(0, err.Error())
  69. }
  70. }()
  71. if os.Getenv("MIGRATE_EMQX") == "true" {
  72. logger.Log(0, "migrating emqx...")
  73. time.Sleep(time.Second * 2)
  74. m.MigrateEmqx()
  75. }
  76. logger.Log(0, "REST Server successfully started on port ", port, " (REST)")
  77. // Block main routine until a signal is received
  78. // As long as user doesn't press CTRL+C a message is not passed and our main routine keeps running
  79. <-ctx.Done()
  80. // After receiving CTRL+C Properly stop the server
  81. logger.Log(0, "Stopping the REST server...")
  82. if err := srv.Shutdown(context.TODO()); err != nil {
  83. logger.Log(0, "REST shutdown error occurred -", err.Error())
  84. }
  85. logger.Log(0, "REST Server closed.")
  86. logger.DumpFile(fmt.Sprintf("data/netmaker.log.%s", time.Now().Format(logger.TimeFormatDay)))
  87. }