controller.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package controller
  2. import (
  3. "context"
  4. "log"
  5. "net/http"
  6. "os"
  7. "os/signal"
  8. "sync"
  9. "github.com/gorilla/handlers"
  10. "github.com/gorilla/mux"
  11. "github.com/gravitl/netmaker/logic"
  12. "github.com/gravitl/netmaker/servercfg"
  13. )
  14. // HandleRESTRequests - handles the rest requests
  15. func HandleRESTRequests(wg *sync.WaitGroup) {
  16. defer wg.Done()
  17. r := mux.NewRouter()
  18. // Currently allowed dev origin is all. Should change in prod
  19. // should consider analyzing the allowed methods further
  20. headersOk := handlers.AllowedHeaders([]string{"Access-Control-Allow-Origin", "X-Requested-With", "Content-Type", "authorization"})
  21. originsOk := handlers.AllowedOrigins([]string{servercfg.GetAllowedOrigin()})
  22. methodsOk := handlers.AllowedMethods([]string{"GET", "PUT", "POST", "DELETE"})
  23. nodeHandlers(r)
  24. userHandlers(r)
  25. networkHandlers(r)
  26. dnsHandlers(r)
  27. fileHandlers(r)
  28. serverHandlers(r)
  29. extClientHandlers(r)
  30. port := servercfg.GetAPIPort()
  31. srv := &http.Server{Addr: ":" + port, Handler: handlers.CORS(originsOk, headersOk, methodsOk)(r)}
  32. go func() {
  33. err := srv.ListenAndServe()
  34. if err != nil {
  35. log.Println(err)
  36. }
  37. }()
  38. logic.Log("REST Server successfully started on port "+port+" (REST)", 0)
  39. c := make(chan os.Signal)
  40. // Relay os.Interrupt to our channel (os.Interrupt = CTRL+C)
  41. // Ignore other incoming signals
  42. signal.Notify(c, os.Interrupt)
  43. // Block main routine until a signal is received
  44. // As long as user doesn't press CTRL+C a message is not passed and our main routine keeps running
  45. <-c
  46. // After receiving CTRL+C Properly stop the server
  47. logic.Log("Stopping the REST server...", 0)
  48. srv.Shutdown(context.TODO())
  49. logic.Log("REST Server closed.", 0)
  50. }