controller.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package controller
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "os/signal"
  8. "sync"
  9. "time"
  10. "github.com/gorilla/handlers"
  11. "github.com/gorilla/mux"
  12. "github.com/gravitl/netmaker/logger"
  13. "github.com/gravitl/netmaker/servercfg"
  14. )
  15. // HttpHandlers - handler functions for REST interactions
  16. var HttpHandlers = []interface{}{
  17. nodeHandlers,
  18. userHandlers,
  19. networkHandlers,
  20. dnsHandlers,
  21. fileHandlers,
  22. serverHandlers,
  23. extClientHandlers,
  24. ipHandlers,
  25. metricHandlers,
  26. loggerHandlers,
  27. userGroupsHandlers,
  28. networkUsersHandlers,
  29. }
  30. // HandleRESTRequests - handles the rest requests
  31. func HandleRESTRequests(wg *sync.WaitGroup) {
  32. defer wg.Done()
  33. r := mux.NewRouter()
  34. // Currently allowed dev origin is all. Should change in prod
  35. // should consider analyzing the allowed methods further
  36. headersOk := handlers.AllowedHeaders([]string{"Access-Control-Allow-Origin", "X-Requested-With", "Content-Type", "authorization"})
  37. originsOk := handlers.AllowedOrigins([]string{servercfg.GetAllowedOrigin()})
  38. methodsOk := handlers.AllowedMethods([]string{"GET", "PUT", "POST", "DELETE"})
  39. for _, handler := range HttpHandlers {
  40. handler.(func(*mux.Router))(r)
  41. }
  42. port := servercfg.GetAPIPort()
  43. srv := &http.Server{Addr: ":" + port, Handler: handlers.CORS(originsOk, headersOk, methodsOk)(r)}
  44. go func() {
  45. err := srv.ListenAndServe()
  46. if err != nil {
  47. logger.Log(0, err.Error())
  48. }
  49. }()
  50. logger.Log(0, "REST Server successfully started on port ", port, " (REST)")
  51. // Relay os.Interrupt to our channel (os.Interrupt = CTRL+C)
  52. // Ignore other incoming signals
  53. ctx, stop := signal.NotifyContext(context.TODO(), os.Interrupt)
  54. defer stop()
  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. logger.Log(0, "REST Server closed.")
  61. logger.DumpFile(fmt.Sprintf("data/netmaker.log.%s", time.Now().Format(logger.TimeFormatDay)))
  62. srv.Shutdown(context.TODO())
  63. }