main.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at https://mozilla.org/MPL/2.0/.
  5. */
  6. package main
  7. import (
  8. "context"
  9. "log"
  10. "net/http"
  11. "os"
  12. "os/signal"
  13. "strconv"
  14. "time"
  15. "golang.org/x/sys/unix"
  16. )
  17. func main() {
  18. ctx, cancel := context.WithCancel(context.Background())
  19. srv := NewServer(ctx)
  20. // Catch signals
  21. cleanup := make(chan struct{})
  22. go func() {
  23. sig := make(chan os.Signal, 1)
  24. signal.Notify(sig, unix.SIGINT, unix.SIGTERM)
  25. Loop:
  26. for {
  27. select {
  28. case <-sig:
  29. log.Println("caught signal; canceling operations...")
  30. cancel()
  31. log.Println("shutting down...")
  32. if err := srv.Shutdown(); err != nil {
  33. log.Printf("shutdown: %v", err)
  34. }
  35. break Loop
  36. case <-ctx.Done():
  37. log.Println("received server done")
  38. break Loop
  39. case <-time.After(100 * time.Millisecond):
  40. // do nothing; just throttle cpu
  41. }
  42. }
  43. close(cleanup)
  44. }()
  45. listenPort := 4140
  46. if len(os.Args) == 2 {
  47. if port, err := strconv.Atoi(os.Args[1]); err == nil {
  48. if 1 <= port && port <= 65535 {
  49. listenPort = port
  50. }
  51. }
  52. }
  53. err := srv.ListenAndServe(listenPort)
  54. if err != http.ErrServerClosed {
  55. log.Printf("server error: %v", err)
  56. }
  57. cancel()
  58. <-cleanup
  59. log.Println("cleanup complete")
  60. }