controller.go 2.2 KB

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