controller.go 2.3 KB

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