controller.go 2.5 KB

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